招生CRM系统|基于Springboot实现培训机构招生CRM管理系统

news/2024/4/28 19:49:55/文章来源:https://blog.csdn.net/whirlwind526/article/details/128054148

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-GX-044

一,项目简介

基于前后端分离开发的模式实现一个培训机构的小型CRM管理系统,主要实现根据不同的身份角色来进行不同的管理操作,主要完成的功能有,用户管理、咨询师管理、签到管理、学生跟踪信息管理、学生信息管理等相关功能模块。

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7+Redis

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:springboot+mybatis

前台开发技术:html+jquery  直接部署在nginx下运行

三,系统展示

管理员登陆

 

角色管理

 

权限设置

用户管理

角色设置

咨询经理登陆

学生信息管理

 

查询签到信息

咨询师管理

签到管理

网络咨询师管理

咨询师登陆系统

管理自己咨询的学生

完善学生信息

 

学生咨询回访问记录

 

四,核心代码展示

vpackage com.ysd.crm_managerssystem.controller;import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ysd.crm_managerssystem.entity.Askers;
import com.ysd.crm_managerssystem.entity.Students;
import com.ysd.crm_managerssystem.entity.Userchecks;
import com.ysd.crm_managerssystem.service.IAskersService;
import com.ysd.crm_managerssystem.service.IStudentsService;
import com.ysd.crm_managerssystem.util.ExcelUtil;
import com.ysd.crm_managerssystem.util.Result;
import com.ysd.crm_managerssystem.util.UserUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import org.springframework.stereotype.Controller;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;/*** <p>* 前端控制器* </p>** @author* @since 2020-05-12*/
@RestController
@RequestMapping("/crm_managerssystem/askers")
public class AskersController {@Autowiredprivate IAskersService service;@Autowiredprivate IStudentsService studentsService;/*** 查询咨询师** @param askerName* @param page* @param limit* @return*/@GetMapping("/query")public Object queryUserChecks(@RequestParam(required = false) String askerName, Integer page, Integer limit) {Map<String, Object> result = new HashMap<String, Object>();QueryWrapper<Askers> queryWrapper = new QueryWrapper<Askers>().like(!StringUtils.isEmpty(askerName), "asker_name", askerName).and(i -> i.eq("change_state", 1));IPage<Askers> find = service.page(new Page<Askers>(page, limit), queryWrapper);if (find != null) {result.put("msg", "ok");result.put("data", find.getRecords());result.put("count", find.getTotal());result.put("code", 0);return result;} else {result.put("msg", "no");result.put("code", 1);return result;}}/*** 查询网络咨询师** @param askerName* @param page* @param limit* @return*/@GetMapping("/wangLuo")public Result queryUserChecksWangLuo(@RequestParam(required = false) String askerName, Integer page, Integer limit) {try {QueryWrapper<Askers> queryWrapper = new QueryWrapper<Askers>().like(!StringUtils.isEmpty(askerName), "asker_name", askerName).and(i -> i.eq("change_state", 2));IPage<Askers> find = service.page(new Page<Askers>(page, limit), queryWrapper);return Result.successToPage("ok", find.getRecords(), find.getTotal());} catch (Exception e) {return Result.success("查询网络咨询师失败");}}/*** 添加咨询师、网络咨询师** @param askers* @return*/@PostMappingpublic Result addAsker(@RequestBody Askers askers) {try {service.save(askers);return Result.success("ok");} catch (Exception e) {e.printStackTrace();return Result.success("添加失败");}}/*** 编辑咨询师、网络咨询师信息** @param askers* @return*/@PutMappingpublic Object updateAsker(@RequestBody Askers askers) {try {service.updateById(askers);return Result.success("ok");} catch (Exception e) {e.printStackTrace();return Result.success("更新失败");}}/*** 根据id回显咨询师、网络咨询师信息** @param id* @return*/@GetMapping("/{id}")public Result findOne(@PathVariable Integer id) {return Result.success("ok", service.getById(id));}/*** 根据id删除单个咨询师、网络咨询师信息** @param id* @return*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) {try {service.removeById(id);return Result.success("ok");} catch (Exception e) {e.printStackTrace();return Result.success("删除失败");}}/*** 根据id批量删除咨询师、网络咨询师信息** @param ids* @return*/@DeleteMappingpublic Result delete(@RequestParam("ids[]") Integer[] ids) {try {service.removeByIds(Arrays.asList(ids));return Result.success("ok");} catch (Exception e) {e.printStackTrace();return Result.success("删除失败");}}@RequestMapping("/export")public void export(HttpServletResponse response) {String filename = "asker.xlsx";response.setHeader("Content-Disposition", "attachment;filename=" + filename);try {OutputStream out = response.getOutputStream();List<List<Object>> rows = new ArrayList<>();List<Object> head = Arrays.asList("姓名", "状态", "入职时间", "角色", "公司名称");rows.add(head);List<Askers> all = service.getAll();for (Askers askers : all) {List<Object> columns = new ArrayList<>();columns.add(askers.getAskerName());columns.add(askers.getCheckState());columns.add(askers.getCheckIntime());columns.add(askers.getRoleName());columns.add(askers.getBakcontent());rows.add(columns);}ExcelUtil.export("asker", rows, out);out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}@RequestMapping("/export1")public void export1(HttpServletResponse response) {String filename = "asker1.xlsx";response.setHeader("Content-Disposition", "attachment;filename=" + filename);try {OutputStream out = response.getOutputStream();List<List<Object>> rows = new ArrayList<>();List<Object> head = Arrays.asList("姓名", "状态", "入职时间", "角色", "公司名称");rows.add(head);List<Askers> all = service.getAll1();for (Askers askers : all) {List<Object> columns = new ArrayList<>();columns.add(askers.getAskerName());columns.add(askers.getCheckState());columns.add(askers.getCheckIntime());columns.add(askers.getRoleName());columns.add(askers.getBakcontent());rows.add(columns);}ExcelUtil.export("asker1", rows, out);out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}static List<Askers> askersList = new ArrayList<Askers>();private static Random random = new Random();Long select1 = null;/*** 根据权重随机生成wuyong* @return*/
//    @PutMapping
//    @ResponseBodypublic void quanZhong() {List<Askers> wight = service.getWight();for (int i = 0; i < wight.size(); i++) {Long askerId = wight.get(i).getAskerId();Integer weight = wight.get(i).getWeight();Askers askers = new Askers(askerId, weight);askersList.add(askers);}Integer weightSum = 0;for (Askers wc : askersList) {weightSum += wc.getWeight();}if (weightSum <= 0) {System.err.println("Error: weightSum=" + weightSum.toString());return;}Integer n = random.nextInt(weightSum); // n in [0, weightSum)Integer m = 0;for (Askers wc : askersList) {if (m <= n && n < m + wc.getWeight()) {select1 = wc.getAskerId();System.out.println("This Random Category is " + select1);break;}m += wc.getWeight();}
//        try {
//            //根据id
//            boolean b = studentsService.updateById(a.setAskerId(select1));
//            return Result.success("ok", b);
//        } catch (Exception e) {
//            return Result.success("分配失败");
//        }}Boolean check=true;@RequestMapping("/boolean")public Result bool(Boolean c){check=c;return Result.success("ok");}/*** 根据权重随机生成咨询师* @param students* @return*/@PutMapping("/wight")public Result OpenWight(@RequestBody Students students) {List<Askers> wight = service.getWight();for (int i = 0; i < wight.size(); i++) {Long askerId = wight.get(i).getAskerId();Integer weight = wight.get(i).getWeight();Askers askers = new Askers(askerId, weight);askersList.add(askers);}Integer weightSum = 0;for (Askers wc : askersList) {weightSum += wc.getWeight();}if (weightSum <= 0) {System.err.println("Error: weightSum=" + weightSum.toString());return Result.success("权重<0");}Integer n = random.nextInt(weightSum); // n in [0, weightSum)Integer m = 0;for (Askers wc : askersList) {if (m <= n && n < m + wc.getWeight()) {select1 = wc.getAskerId();System.out.println("This Random Category is " + select1);break;}m += wc.getWeight();}
//        AskersController controller = new AskersController();
//        controller.quanZhong();if (check == true) {students.setAskerId(select1);Askers byId = service.getById(select1);students.setZixunName(byId.getAskerName());students.setShifoufengpei("已分配");studentsService.updateById(students);return Result.success("ok");}if (check == false){Long aLong = new Long(2);studentsService.updateById(students.setAskerId(aLong));return Result.success("ok");}return Result.success("失败");}//消息推送@GetMapping("student")public Result student(Students students,Integer page,Integer limit){try {
//            Long aLong = new Long(2);Long gg=UserUtil.getId();QueryWrapper<Students> queryWrapper = new QueryWrapper<Students>().eq("askerId", gg);
//                    .like(!StringUtils.isEmpty(askerName), "asker_name", askerName).and(i -> i.eq("change_state", 2));IPage<Students> find = studentsService.page(new Page<Students>(page, limit), queryWrapper);return Result.successToPage("ok", find.getRecords(), find.getTotal());}catch (Exception e){e.printStackTrace();return Result.success("查询失败");}}//咨询师数据下拉框@RequestMapping("asker")public Object asker(){Map<String, Object> result = new HashMap<String, Object>();try {List<Askers> all = service.getAll();result.put("code",0);result.put("data",all);return result;}catch (Exception e){e.printStackTrace();return Result.success("no");}}}

package com.ysd.crm_managerssystem.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ysd.crm_managerssystem.entity.Students;
import com.ysd.crm_managerssystem.entity.Users;
import com.ysd.crm_managerssystem.service.IStudentsService;
import com.ysd.crm_managerssystem.util.LayuiUtils;
import com.ysd.crm_managerssystem.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@RestController
@RequestMapping("crm_managerssystem/askstudents")
public class AskStudentsController {@Autowiredprivate IStudentsService studentsService;/*** 分页查询* 每个咨询师只查出分配给自己的学生* @param limit* @param page* @return*/@GetMapping("/page")public Object pageStudents(HttpServletRequest httpServletRequest, @RequestParam(required = false) String stuName, @RequestParam(required = false) String stuStatus, Integer limit, Integer page) {/*** 从session中取出登录用户* 根据登录用户角色只查出分配给自己的学生*/HttpSession session = httpServletRequest.getSession();Users user = (Users)session.getAttribute("user");if(user==null){return LayuiUtils.error1("登录身份过期,请返回登录页重新登录");}QueryWrapper<Students> queryWrapper = new QueryWrapper<Students>()//students_zi_xun_name用来表示咨询师的userID.eq("zixun_name",user.getUserId()).eq(!StringUtils.isEmpty(stuStatus),"stu_status",stuStatus)//条件查询.like(!StringUtils.isEmpty(stuName), "students_name", stuName);IPage<Students> find = studentsService.page(new Page<Students>(page, limit), queryWrapper);return Result.successToPage("ok", find.getRecords(), find.getTotal());}@GetMapping("/{id}")public Result findOne(@PathVariable Integer id) {return Result.success("ok", studentsService.getById(id));}/*** 删除* @param id* @return*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){try {studentsService.removeById(id);return Result.success("ok");} catch (Exception e) {e.printStackTrace();return Result.success("删除失败");}}/*** 修改* @param students* @return*/@PutMappingpublic Result update(@RequestBody Students students){try {studentsService.updateById(students);return Result.success("ok");} catch (Exception e) {e.printStackTrace();return Result.success("更新失败");}}
}

五,项目总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_37246.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb开发之——多表查询(21)

一 概述 多表查询—简介多表查询—内连接&外连接多表查询—子查询 二 多表查询—简介 2.1 概念 多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。 2.2 SQL数据准备 DROP TABLE IF EXISTS emp; DROP TABLE IF EXISTS dept; # 创建部门表 CREATE TABLE de…

UE5笔记【九】蓝图BluePrint;

新建一个第三视角游戏。然后打开关卡蓝图。 长得跟材料编辑器一样。 这里是我们创建Node和新功能的地方。 首先我们新建一个游戏开始的地方。右键&#xff1a;Begin搜索。 我们需要打印一行字&#xff1a;欢迎来到游戏世界。我们需要添加一个打印文本的结点&#xff1a;PrintT…

FilterListenerAjax的介绍

目录 一、Filter 1、Filter概述 2、过滤器链 二、Listener 三、Ajax 1、基本介绍 2、快速入门案例 3、axios 4、JSON 一、Filter 1、Filter概述 ▶ 过滤器 Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请…

论文阅读: Disentangled lmage Colorization via Global Anchors

Disentangled lmage Colorization via Global Anchors发表于SIGGRAPH ASIA 2022&#xff0c;是一篇基于深度学习的图像彩色化的工作&#xff0c;简单介绍一下。之前曾分享过一篇彩色化的经典论文&#xff1a;经典论文回顾: Colorization using Optimization。 作者认为图像彩色…

Spring Cloud OpenFeign - 日志配置

项目源码地址&#xff1a;https://download.csdn.net/download/weixin_42950079/87168704 OpenFeign 有 4 种日志级别&#xff1a; NONE: 不记录任何日志&#xff0c;是OpenFeign默认日志级别&#xff08;性能最佳&#xff0c;适用于生产环境&#xff09;。BASIC: 仅记录请求方…

【机器学习入门项目10例】(八):贝叶斯网络-拼写检查器

💥 项目专栏:【机器学习入门项目10例】 文章目录 一、贝叶斯网络-拼写检查器二、数据集介绍三、导包四、读取数据集五、构建拼写检查器5.1 分词操作5.2 计算词频5.3 计算概率5.4 调用入口5.5 贝叶斯网络模型类六、模型测试一、贝叶斯网络-拼写检查器 1)建立一个足够大的文本…

让学前端不再害怕英语单词(四)

|| 欢迎关注csdn前端领域博主: 前端小王hs || email: 337674757qq.com || 前端交流群&#xff1a; 598778642前三章直通车↓↓↓ 让学前端不再害怕英语单词&#xff08;一&#xff09; 让学前端不再害怕英语单词&#xff08;二&#xff09; 让学前端不再害怕英语单词&#xff0…

Java - 利用Nacos做一个动态开关配置功能

Java - 利用Nacos做一个动态开关配置功能前言一. Nacos配置类编写二. 测试三. 展望前言 我公司里有一个Config配置功能&#xff08;我相信这是很普遍的一个功能&#xff09;。简单来说就是&#xff1a; 将相关的键值对放到这个Config配置系统里面。代码里通过这个Config配置系…

【C++中预处理语句 include、define、if】

1.预处理阶段 预处理阶段&#xff0c;在实际发生编译之前就根据对应的预处理语句进行操作&#xff0c;等到预处理阶段完成之后才进行编译阶段 。 2.预处理语句 预处理语句主要有include、define、if 和 program。利用 # 进行标记 2.1 include语句 include语句就是将所包含的…

【点云处理】点云法向量估计及其加速(4)

上篇文章【点云处理】点云法向量估计及其加速(3)介绍了如何使用pcl提供的gpu版本法向量计算接口对点云发向量计算进行加速。不足之处在于点云k近邻查找依然比较耗时&#xff0c;成为影响整体计算性能的瓶颈。这篇文章就如何优化点云K近邻查找效率进行实验。上一篇文章的示例代码…

想要精通算法和SQL的成长之路 - 无重叠区间

想要精通算法和SQL的成长之路 - 无重叠区间前言一. 无重叠区间前言 想要精通算法和SQL的成长之路 - 系列导航 一. 无重叠区间 原题链接 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互…

谷粒学苑_第十天

第十天 视频删除 后端 相关sdk在阿里云视频点播文档的服务端SDK–>Java SDK–>媒资管理–>删除视频 复制前面的InitObject到utils里 删除的方法 DeleteMapping("{id}")public R removeAliyunVideo(PathVariable String id){try{DefaultAcsClient defau…

1000套web前端期末大作业 HTML+CSS+JavaScript网页设计实例 企业网站制作【建议收藏】

一、1000套HTML期末学生结课大作业作品(HTMLCSSJS) 这8年来做了1000多套(HTMLCSSJS)网页设计的学生期末大作业&#xff0c;都是给学生定制的都符合学校或者学生考试期末作业的水平&#xff0c;都是divcss框架原创代码写的&#xff0c;有的有js&#xff0c;有的视频音乐flash的…

Mongodb操作基础 分片

Mongodb分片 MongoDB分片是MongoDB支持的另一种集群形式&#xff0c;它可以满足MongoDB数据量呈爆发式增长的需求。当MongoDB存储海量的数据时&#xff0c;一台机器可能无法满足数据存储的需求&#xff0c;也可能无法提供可接受的读写吞吐量&#xff0c;这时&#xff0c;我们就…

【算法】2022第五届“传智杯”全国大学生计算机大赛(练习赛)

【参考&#xff1a;第五届“传智杯”全国大学生计算机大赛&#xff08;练习赛&#xff09; - 洛谷 | 计算机科学教育新生态】 练习赛满分程序&#xff08;多语言&#xff09;&#xff1a;https://www.luogu.com.cn/paste/fi60s4yu CPU一秒大概运行 10810^8108 次&#xff0c;…

ASEMI肖特基二极管MBR40200PT参数,MBR40200PT规格

编辑-Z ASEMI肖特基二极管MBR40200PT参数&#xff1a; 型号&#xff1a;MBR40200PT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;40A 峰值正向浪涌电流&#xff08;IFSM&#xff0…

imx6ull pro BSP 工具链

BSP&#xff0c;Board Support Package&#xff0c;指板级支持包&#xff0c;是构建嵌入式操作系统所 需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链 (Toolchain)。 每种开发板的 BSP 都不一样&#xff0c;并且这些源码都非常庞大。我们把这些源码都 放在…

自动化运维CICD

目录 概述 为什么持续集成和发布可以提高效率 如何实现 1、在linux服务器安装部署代码仓库 2、安装jenkins 使用shell脚本实现CICD 使用pipeline实现CICD 使用Blue Ocean实现CICD 概述 持续集成&#xff08;Continuous Integration&#xff0c;CI)和持续发布&#xff0…

二、进程管理(四)经典同步互斥问题

目录 4.1生产者-消费者问题 4.1.1单类生产者-单类消费者问题 4.1.2多类生产者-多类消费者问题 4.1.3吸烟者问题 4.2读者-写者问题 4.3哲学家进餐问题 分析进程同步和互斥问题的三步&#xff1a; 关系分析&#xff1a;分析问题中的同步&#xff08;前驱关系&#xff09;、…

【网络】tcpdump、Wireshark 案例超详细介绍

文章目录网络分层应用层找到服务器的 IP查接口、对象的耗时删除指定网站的Cookie表示层、会话层tcpdump、wireshard传输层telnet: 路径可达性测试nc: 路径可达性测试netstat&#xff1a;查看当前连接状态iftop&#xff1a;查看当前连接的传输速率netstat -s: 查看丢包和乱序的统…