招生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

五,项目总结


相关文章
|
26天前
|
搜索推荐
实现CRM与ERP系统无缝集成,优化客户关系管理
在当今竞争激烈的市场环境中,企业要想保持领先地位,必须高效地管理客户关系并优化内部资源。CRM(客户关系管理)系统与ERP(企业资源规划)系统的无缝集成,为企业提供了一种强大的工具,以实现这一目标
48 2
|
1月前
|
监控 搜索推荐 数据管理
crm客户管理系统来帮助企业管理和提高运营效率
crm系统帮助企业简化销售流程,提高工作效率。CRM 客户管理系统确实能够在多个方面帮助企业管理和提高运营效率,具体表现如下:
26 3
|
2月前
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的客户关系管理(CRM)
【7月更文挑战第25天】 ERP系统中的客户关系管理(CRM)
124 3
|
1月前
|
数据挖掘 BI API
简单了解CRM与SaaS系统
本文介绍了CRM(客户关系管理系统)和SaaS(软件即服务)的概念、应用场景、两者之间的关系以及CRM接口的作用和设置流程,强调了SaaS模式为CRM系统提供了灵活、便捷、经济高效的使用方式,以及CRM接口在数据集成、自动化流程、功能扩展和数据分析方面的重要性。
41 0
|
2月前
|
存储 Python
在计算机管理系统工程中,我们利用计算机技术来构建、优化和管理各种系统,如企业资源规划(ERP)、客户关系管理(CRM)等。
。在计算机管理系统工程中,我们利用计算机技术来构建、优化和管理各种系统,如企业资源规划(ERP)、客户关系管理(CRM)等。
|
2月前
|
数据采集 存储 搜索推荐
CRM客户系统全解析:定义与企业应用
Zoho CRM是一个集成客户数据、销售流程、市场活动和客户服务的平台,助力企业提升效率和竞争力。它支持销售管理、客户细分及个性化营销,改善客户体验。系统在销售预测、客户档案管理和市场营销策略制定上发挥作用。然而,挑战包括系统集成、数据质量、员工培训和用户接纳。企业需克服这些挑战以确保CRM的有效运营。
46 2
|
2月前
|
供应链 搜索推荐 数据安全/隐私保护
本土化CRM系统推荐,企业CRM选型必看
在激烈竞争市场中,高效获客与深度运营现有客户至关重要,CRM系统成为企业数字化转型的关键。本文推荐五款优秀国产CRM系统助力企业发展:1、销售易CRM 2、简道云CRM 3、金蝶CRM 4、纷享销客CRM 5、销帮帮CRM
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的高校科研机构管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的高校科研机构管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
31 0
|
2月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的招生宣传管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的招生宣传管理系统附带文章源码部署视频讲解等
13 0
|
2月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的艺体培训机构业务管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的艺体培训机构业务管理系统附带文章源码部署视频讲解等
12 0