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

简介: 基于前后端分离开发的模式实现一个培训机构的小型CRM管理系统,主要实现根据不同的身份角色来进行不同的管理操作,主要完成的功能有,用户管理、咨询师管理、签到管理、学生跟踪信息管理、学生信息管理等相关功能模块。作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师。主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助。数据库:Mysql: mysql5.7+Redis。语言环境:Java: jdk1.8。项目编号:BS-GX-044。

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

文末获取源码

项目编号:BS-GX-044

一,项目简介

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

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7+Redis

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:springboot+mybatis

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

三,系统展示

管理员登陆

image.gif编辑

角色管理

image.gif编辑

权限设置

用户管理

image.gif编辑

角色设置

image.gif编辑

咨询经理登陆

学生信息管理

image.gif编辑

查询签到信息

image.gif编辑

咨询师管理

image.gif编辑

签到管理

image.gif编辑

网络咨询师管理

image.gif编辑

咨询师登陆系统

管理自己咨询的学生

image.gif编辑

完善学生信息

学生咨询回访问记录

image.gif编辑

四,核心代码展示

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 {
    @Autowired
    private IAskersService service;
    @Autowired
    private 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
     */
    @PostMapping
    public Result addAsker(@RequestBody Askers askers) {
        try {
            service.save(askers);
            return Result.success("ok");
        } catch (Exception e) {
            e.printStackTrace();
            return Result.success("添加失败");
        }
    }
    /**
     * 编辑咨询师、网络咨询师信息
     *
     * @param askers
     * @return
     */
    @PutMapping
    public 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
     */
    @DeleteMapping
    public 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
//    @ResponseBody
    public 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");
        }
    }
}

image.gif

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 {
    @Autowired
    private 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
     */
    @PutMapping
    public Result update(@RequestBody Students students){
        try {
            studentsService.updateById(students);
            return Result.success("ok");
        } catch (Exception e) {
            e.printStackTrace();
            return Result.success("更新失败");
        }
    }
}

image.gif

五,项目总结


相关文章
|
3月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
3月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。
|
3月前
|
JavaScript Java 关系型数据库
基于springboot的高校运动会系统
本系统基于Spring Boot、Vue与MySQL,实现高校运动会报名、赛程安排及成绩管理的全流程信息化,提升组织效率,杜绝信息错漏与冒名顶替,推动体育赛事智能化发展。
|
3月前
|
JavaScript 安全 Java
基于springboot的大学生兼职系统
本课题针对大学生兼职信息不对称、权益难保障等问题,研究基于Spring Boot、Vue、MySQL等技术的兼职系统,旨在构建安全、高效、功能完善的平台,提升大学生就业竞争力与兼职质量。
|
3月前
|
JavaScript Java 关系型数据库
基于springboot的美食城服务管理系统
本系统基于Spring Boot、Java、Vue和MySQL技术,构建集消费者服务、商家管理与后台监管于一体的美食城综合管理平台,提升运营效率与用户体验。
|
3月前
|
Java 关系型数据库 MySQL
基于springboot的网咖网吧管理系统
本文探讨了基于Java、MySQL和SpringBoot的网吧管理系统的设计与实现。随着信息化发展,传统管理方式难以满足需求,而该系统通过先进技术提升管理效率、保障数据安全、降低运营成本,具有重要意义。
|
3月前
|
JavaScript Java 关系型数据库
基于springboot的摄影师分享交流社区系统
本系统基于Spring Boot与Vue构建摄影师分享交流平台,旨在打造专业社区,支持作品展示、技术交流与合作互动。采用Java、MySQL等成熟技术,提升摄影爱好者创作水平,推动行业发展。
|
3月前
|
JavaScript 搜索推荐 Java
基于SpringBoot的社区老年食堂系统
针对老龄化社会饮食难题,智慧社区老年食堂系统应运而生。融合Spring Boot、Vue、Java与MySQL技术,实现餐饮服务智能化、个性化,提升老年人生活质量与幸福感,推动社区养老服务升级。
|
3月前
|
JavaScript 搜索推荐 Java
基于springboot的民宿预定管理系统
本研究针对民宿市场管理效率低、信息化程度不足等问题,设计并实现基于Spring Boot、Vue和MySQL的民宿预订管理系统。系统提升预订效率与用户体验,助力行业数字化转型。