基于javaweb的crm客户关系管理系统(java+springboot+echarts+freemarker+layui+mysql)
基于javaweb的crm客戶關(guān)系管理系統(tǒng)(java+springboot+echarts+freemarker+layui+mysql)
運行環(huán)境
Java≥8、MySQL≥5.7
開發(fā)工具
eclipse/idea/myeclipse/sts等均可配置運行
適用
課程設(shè)計,大作業(yè),畢業(yè)設(shè)計,項目練習,學習演示等
功能說明
基于javaweb+SpringBoot的crm客戶關(guān)系管理系統(tǒng)(java+SpringBoot+ECharts+Freemarker+Layui+maven+mysql)
CRM智能辦公
項目介紹
本應用是一個客戶關(guān)系管理系統(tǒng),主要包括五大模塊,分別是營銷管理,客戶管理,服務(wù)管理,統(tǒng)計報表和系統(tǒng)管理,為客戶關(guān)系管理提供簡單的數(shù)據(jù)管理與分析
技術(shù)選型方面,該項目是一個SpringBoot的單體應用,項目使用SpringBoot2框架快速開發(fā),數(shù)據(jù)訪問層使用Mybatis框架,頁面渲染引擎使用Freemarker,頁面樣式使用Layui,日志方面選用的是logback,統(tǒng)計報表部分使用的是ECharts,數(shù)據(jù)庫使用的Mysql 8.0版本;
安裝教程
在mysql(默認為mysql8)中創(chuàng)建名為crm的數(shù)據(jù)庫,并執(zhí)行源碼根目錄的crm.sql腳本生成數(shù)據(jù)庫表以及數(shù)據(jù) 2. ?將項目源碼導入idea中,指定項目的jdk版本為jdk8或以上,并標記為maven項目,下載所需依賴 3. ?修改application.yml中針對于數(shù)據(jù)庫的配置(主要是數(shù)據(jù)庫名和數(shù)據(jù)庫密碼) 4. ?修改logback.xml中,第4行,日志文件的存儲地址,改為自己的路徑;
啟動項目測試是否正常,默認啟動地址首頁為http://localhost:1212/crm,默認數(shù)據(jù)庫中的管理員為admin,密碼為123456,可在登錄系統(tǒng)之后自行修改用戶密碼
用戶管理控制層:
/**
- @author yy
*/
@Controller
@RequestMapping(“/user”)
public class UserController {
@Autowired
IUserService userService;
@Autowired
IRoleService roleService;
@Autowired
RedisUtil redisUtil;
@Autowired
MailUtil mailUtil;
Logger logger = LoggerFactory.getLogger(UserController.class);
/**
-
描述:查找用戶
-
@param page
-
@param limit
-
@param user
-
@return
*/
@Operation(name=“查找用戶”)
@RequiresPermissions(“1001”)
@RequestMapping(“/findUser”)
@ResponseBody
public Map<String, Object> findUser(Integer page,Integer limit, User user){
Map<String, Object> map = new HashMap<String,Object>(16);
//創(chuàng)建用戶模板類
UserExample userExample = new UserExample();
//創(chuàng)建查詢準則
Criteria criteria = userExample.createCriteria();
if(page == null || page <= 0) {
page = 1;
if(limit == null || limit <= 0) {
limit = 10;
//判斷user類的條件是否為空
if(user.getRealName() != null) {
criteria.andRealNameLike(“%”+user.getRealName()+“%”);
if(user.getRoleId() != null) {
logger.info(“獲得到的角色編號為:” + user.getRoleId());
criteria.andRoleIdEqualTo(user.getRoleId());
if(user.getAccount() != null) {
criteria.andAccountLike(“%”+user.getAccount()+“%”);
Long offset = new Long((page - 1) * limit);
Long count = userService.countByExample(userExample);
userExample.setLimit(limit);
userExample.setOffset(offset);
List list = userService.findByExample(userExample);
logger.info(list.toString());
map.put(“data”, list);
map.put(“code”, 0);
map.put(“msg”, “success”);
map.put(“count”, count);
return map;
/**
-
描述:根據(jù)編號查找用戶
-
@author wanghaoyu
-
@version 1.0
-
@param id
-
@return
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“根據(jù)編號查找用戶”)
@RequiresAuthentication
@RequestMapping(“/findUserById”)
@ResponseBody
public Map<String, Object> findUserById(Integer id){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
String msg = “”;
User user = userService.findById(id);
if(user != null){
user.setPassword(null);
user.setSalt(null);
success = true;
}else{
msg = “讀取用戶數(shù)據(jù)出錯,請稍后再試!”;
map.put(“success”, success);
map.put(“user”, user);
map.put(“msg”,msg);
map.put(“code”, 0);
return map;
/**
-
描述:根據(jù)用戶ID刪除用戶
-
@author wanghaoyu
-
@version 1.0
-
@param id 用戶編號
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“刪除用戶”)
@RequiresPermissions(“1004”)
@RequestMapping(“/deleteUser”)
@ResponseBody
public Map<String, Object> deleteUser(Integer id){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
//刪除成功
if(userService.deleteById(id) == true) {
success = true;
map.put(“success”, success);
map.put(“code”, 0);
return map;
/**
-
描述:編輯用戶
-
@author wanghaoyu
-
@version 1.0
-
@param user 要編輯的用戶信息
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“修改用戶”)
@RequiresPermissions(value={“1002”,“13002”}, logical=Logical.OR)
@RequestMapping(“/editUser”)
@ResponseBody
public Map<String, Object> editUser(User user){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
String msg = “”;
//修改成功
if(userService.edit(user) == true) {
success = true;
msg = “修改成功!”;
}else {
msg = “修改失敗!”;
map.put(“success”, success);
map.put(“msg”, msg);
map.put(“code”, 0);
return map;
/**
-
描述:添加用戶
-
@author wanghaoyu
-
@version 1.0
-
@param user 要添加的用戶信息
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“添加用戶”)
@RequiresPermissions(“1003”)
@RequestMapping(“/addUser”)
@ResponseBody
public Map<String, Object> addUser(User user){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
//設(shè)置user的初始密碼為123456
user.setPassword(“123456”);
//添加
if(userService.save(user) == true) {
success = true;
map.put(“success”, success);
map.put(“code”, 0);
return map;
/**
-
描述:查找所有的角色
-
@author wanghaoyu
-
@version 1.0
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“后臺查找角色列表”)
@RequiresAuthentication
@RequestMapping(“/findRoles”)
@ResponseBody
public Map<String, Object> findRoles(){
Map<String, Object> map = new HashMap<String, Object>(16);
List roles = roleService.selectByRoleExample(new RoleExample());
map.put(“success”, true);
map.put(“l(fā)ist”, roles);
logger.info(roles.toString());
return map;
/**
-
描述:查找除當前登錄的客戶經(jīng)理外的所有的客戶經(jīng)理
-
@author wanghaoyu
-
@version 1.0
-
@param request
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“后臺查找其他客戶經(jīng)理角色”)
@RequiresAuthentication
@RequestMapping(“/findOthersManager”)
@ResponseBody
public Map<String, Object> findOthersManager(HttpServletRequest request){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
//獲取當前登錄用戶
User user = (User)request.getSession().getAttribute(“user”);
//創(chuàng)建用戶模塊
UserExample userExample = new UserExample();
//創(chuàng)建查詢準則
Criteria criteria = userExample.createCriteria();
//如果當前用戶為客戶經(jīng)理
if(user.getRoleId() == 1) {
criteria.andIdNotEqualTo(user.getId());
criteria.andRoleIdEqualTo(1);
List users = userService.findByExample(userExample);
success = true;
map.put(“success”, success);
map.put(“l(fā)ist”, users);
map.put(“code”, 0);
return map;
/**
-
描述:檢查用戶賬號是否可用
-
@author wanghaoyu
-
@version 1.0
-
@param account
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“檢查用戶賬號”)
@RequestMapping(“/checkUserAccount”)
@ResponseBody
public Map<String, Object> checkUserAccount(String account){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
//沒有找到該賬號名,說明賬號可用
if(userService.findByAccount(account) == null) {
success = true;
map.put(“success”, success);
map.put(“code”, 0);
return map;
/**
-
描述:檢查用戶郵箱是否可用
-
@author wanghaoyu
-
@version 1.0
-
@param email
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“檢查用戶郵箱”)
@RequestMapping(“/checkUserEmail”)
@ResponseBody
public Map<String, Object> checkUserEmail(String email){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
//沒有找到該賬號名,說明郵箱可用
if(userService.findByEmail(email) == null) {
success = true;
map.put(“success”, success);
map.put(“code”, 0);
return map;
/**
-
描述:根據(jù)session域里面的用戶編號查找當前登錄的用戶
-
@author wanghaoyu
-
@version 1.0
-
@param id
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“查找當前登錄的用戶”)
@RequiresPermissions(“13001”)
@RequestMapping(“/findCurrentUser”)
@ResponseBody
public Map<String, Object> findCurrentUser(Integer id){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
String msg = “”;
//根據(jù)ID查找用戶
User user = userService.findById(id);
if(user != null){
user.setPassword(null);
user.setSalt(null);
success = true;
msg = “查找成功!”;
}else{
success = false;
msg = “查找失敗!”;
map.put(“success”, success);
map.put(“code”,0);
map.put(“data”, user);
map.put(“msg”, msg);
return map;
/**
-
描述:用戶修改密碼
-
@author wanghaoyu
-
@version 1.0
-
@param user
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“修改用戶密碼”)
@RequiresPermissions(“14001”)
@RequestMapping(“/editUserPasswd”)
@ResponseBody
public Map<String, Object> editUserPasswd(User user,String oldPassword){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
String msg = “”;
if(userService.editPasswd(user,oldPassword)) {
success = true;
msg = “修改成功!”;
}else {
success = false;
msg = “修改失敗!”;
map.put(“success”, success);
map.put(“msg”, msg);
map.put(“code”, 0);
return map;
/**
-
描述:獲取忘記密碼時的驗證碼
-
@author wanghaoyu
-
@version 1.0
-
@param email
-
@return
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“獲取找回密碼所需的驗證碼”)
@RequestMapping(“/getForgotPasswdCode”)
@ResponseBody
public Map<String, Object> getForgotPasswdCode(String email){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
String msg = “”;
if(userService.findByEmail(email) == null){
//找不到該郵箱的賬號
msg = “不存在的賬號!”;
}else{
try {
//生成長度為4的隨機數(shù)字
String code = RandomStringUtil.getRandomCode(4, 0);
//存到redis緩存中,有效時間為5分鐘
//先刪除原來已存在的驗證碼
redisUtil.remove(email);
redisUtil.set(email, code, 300L);
//發(fā)送郵件
mailUtil.send(email, “找回密碼”, “驗證碼:” + code + “(驗證碼有效期為5分鐘)”);
success = true;
msg = “發(fā)送驗證碼成功!”;
} catch (Exception e) {
e.printStackTrace();
msg = “獲取驗證碼失敗!”;
map.put(“success”, success);
map.put(“code”, 0);
map.put(“msg”, msg);
return map;
/**
-
描述: 重設(shè)密碼
-
@author wanghaoyu
-
@version 1.0
-
@param email
-
@return
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“重設(shè)密碼”)
@RequestMapping(“/resetPasswd”)
@ResponseBody
public Map<String, Object> resetPasswd(String email, String code, String password){
Map<String, Object> map = new HashMap<String, Object>(16);
boolean success = false;
String msg = “”;
try {
//先根據(jù)郵箱獲取相應用戶的信息
User user = userService.findByEmail(email);
if(user == null){
msg = “不存在的賬號!”;
}else{
//從redis緩存中獲取驗證碼
if(redisUtil.exists(email)){
String redisCode = (String) redisUtil.get(email);
if(redisCode.equals(code)){
//驗證碼正確,修改密碼
User editUser = new User();
editUser.setId(user.getId());
editUser.setPassword(password);
if(userService.edit(editUser)){
msg = “修改成功!”;
success = true;
}else{
msg = “修改失敗!”;
}else{
msg = “驗證碼錯誤!”;
}else{
msg = “驗證碼已過期,請重新獲取!”;
} catch (Exception e) {
e.printStackTrace();
msg = “服務(wù)器出了小差,請稍等…”;
map.put(“success”, success);
map.put(“code”, 0);
map.put(“msg”, msg);
return map;
客戶管理控制層:
/**
- @author yy
*/
@Controller
@RequestMapping(“customer”)
public class CustomerController {
@Autowired
private ICustomerService customerService;
private User user = null;
/**
-
@author huangwanzong
-
@date 2018年7月6日
*/
private User getUser(HttpServletRequest request) {
HttpSession session = request.getSession();
user = (User)session.getAttribute(“user”);
return user;
/**
-
描述:分頁查詢客戶
-
@author huangwanzong
-
@date 2018/07/06
-
@version 1.0
-
@param page 可選參數(shù),查詢的頁數(shù),默認值 1
-
@param limit 可選參數(shù),分頁的大小,默認值 10
-
@param customer 可選參數(shù),查詢的條件
-
@param findtype 可選參數(shù),該參數(shù)值為 all 時不執(zhí)行分頁查詢,返回全部符合條件的客戶
-
@param request
-
@return Map<String,Object>
-
@since 1.8
*/
@RequiresPermissions(“5001”)
@Operation(name=“分頁查詢客戶”)
@RequestMapping(“l(fā)ist”)
@ResponseBody
public Map<String, Object> listCustomer(Integer page,Integer limit,Customer customer,String findtype,HttpServletRequest request){
Map<String, Object> map = new HashMap<String,Object>(16);
//獲取用戶
user = this.getUser(request);
//檢驗用戶正確性
if(user == null || user.getId() == null) {
map.put(“code”, -1);
map.put(“msg”, “用戶不存在,無法執(zhí)行操作.”);
return map;
CustomerExample example = new CustomerExample();
Criteria criteria = example.createCriteria();
//設(shè)置分頁參數(shù)
if(page == null || page <= 0) {
page = 1;
if(limit == null || limit <= 0) {
limit = 10;
String all = “all”;
if(!all.equals(findtype)) {
example.setLimit(limit);
Long offset = new Long((page-1)*limit);
example.setOffset(offset);
//設(shè)置管理者ID
criteria.andManagerIdEqualTo(user.getId());
//只查詢未刪除的客戶
criteria.andDeleteStatusEqualTo(0);
System.out.println(customer);
//檢測屬性是否存在,存在則進行條件查詢
if(customer != null) {
if(customer.getName() != null) {
criteria.andNameLike(“%” + customer.getName() + “%”);
if(customer.getType() != null && !“”.equals(customer.getType())) {
criteria.andTypeEqualTo(customer.getType());
if(customer.getStatus() != null && !“”.equals(customer.getStatus())) {
criteria.andStatusEqualTo(customer.getStatus());
if(customer.getSource() != null && !“”.equals(customer.getSource())) {
criteria.andSourceEqualTo(customer.getSource());
if(customer.getLevel() != null && !“”.equals(customer.getLevel())) {
criteria.andLevelEqualTo(customer.getLevel());
if(customer.getCredit() != null && !“”.equals(customer.getCredit())) {
criteria.andCreditEqualTo(customer.getCredit());
if(customer.getMaturity() != null && !“”.equals(customer.getMaturity())) {
criteria.andMaturityEqualTo(customer.getMaturity());
Long count = customerService.countByCustomerExample(example);
List customers = customerService.selectByCustomerExample(example);
map.put(“data”, customers);
map.put(“count”, count);
map.put(“code”, 0);
return map;
/**
-
描述:添加一個客戶
-
@author huangwanzong
-
@date 2018/07/17
-
@version 1.0
-
@param customer 客戶信息
-
@param linkman 聯(lián)系人信息
-
@param customerName 客戶名稱
-
@param linkmanName 聯(lián)系人名稱
-
@param customerLevel 客戶等級
-
@param request
-
@return Map<String,Object>
-
@since 1.8
*/
@RequiresPermissions(“5002”)
@Operation(name=“添加客戶”)
@RequestMapping(“add”)
@ResponseBody
public Map<String, Object> addCustomer(Customer customer,Linkman linkman,String customerName,String linkmanName,String customerLevel,HttpServletRequest request){
Map<String, Object> map = new HashMap<String,Object>(16);
this.getUser(request);
//檢測是否存在customer對象
if(customer == null || linkman == null) {
map.put(“msg”, “參數(shù)為空”);
map.put(“success”, false);
return map;
//檢測客戶名是否存在
if(customerName == null || “”.equals(customerName)) {
map.put(“msg”, “用戶名稱參數(shù)不能為空”);
map.put(“success”, false);
return map;
//檢測聯(lián)系人姓名是否存在
if(linkmanName == null || “”.equals(linkmanName)) {
map.put(“msg”, “聯(lián)系人名稱參數(shù)不能為空”);
map.put(“success”, false);
return map;
//客戶所屬者默認為創(chuàng)建者
customer.setManagerId(user.getId());
//設(shè)置創(chuàng)建者id
customer.setCreater(user.getId());
//設(shè)置創(chuàng)建時間
customer.setCreateTime(LocalDateTime.now());
//設(shè)置客戶名稱
customer.setName(customerName);
//設(shè)置客戶等級
customer.setLevel(customerLevel);
//設(shè)置未刪除
customer.setDeleteStatus(0);
//設(shè)置聯(lián)系人名稱
linkman.setName(linkmanName);
//進行數(shù)據(jù)插入
if(customerService.insertSelective(customer,linkman)) {
map.put(“msg”, “添加成功”);
map.put(“success”, true);
}else {
map.put(“msg”, “添加失敗”);
map.put(“success”, false);
return map;
@RequiresPermissions(“7009”)
@Operation(name=“檢測客戶名稱是否存在”)
@RequestMapping(“checkname”)
@ResponseBody
public boolean checkCustomerName(String name){
CustomerExample example = new CustomerExample();
example.createCriteria().andNameEqualTo(name);
List list = customerService.selectByCustomerExample(example);
if(list.size()>0) {
return true;
return false;
@RequiresPermissions(“5003”)
@Operation(name=“更新客戶信息”)
@RequestMapping(“update”)
@ResponseBody
public Map<String, Object> updateCustomer(Customer customer){
Map<String, Object> map = new HashMap<String,Object>(16);
if(customerService.updateCustomerByPrimaryKeySelective(customer)) {
map.put(“msg”, “更新成功”);
map.put(“success”, true);
}else {
map.put(“msg”, “更新失敗”);
map.put(“success”, false);
return map;
@RequiresPermissions(“5004”)
@Operation(name=“刪除客戶”)
@RequestMapping(“delete”)
@ResponseBody
public Map<String, Object> deleteCustomer(int[] ids){
Map<String, Object> map = new HashMap<String,Object>(16);
List success = new ArrayList();
List fail = new ArrayList();
for(int id : ids) {
if(customerService.deleteByPrimaryKey(id)) {
success.add(id);
}else {
fail.add(id);
map.put(“msg”, “刪除完成”);
map.put(“status”, true);
map.put(“success”, success);
map.put(“fail”, fail);
return map;
@RequiresPermissions(“7010”)
@Operation(name=“id查找客戶”)
@RequestMapping(“find”)
@ResponseBody
public Map<String, Object> findCustomer(Integer id){
Map<String, Object> map = new HashMap<String,Object>(16);
Customer customer = null;
if(id == null) {
map.put(“msg”, “非法操作”);
map.put(“success”, false);
return map;
customer = customerService.selectCustomerByPrimaryKey(id);
if(customer != null) {
map.put(“msg”, “查找成功”);
map.put(“success”, true);
map.put(“data”, customer);
}else {
map.put(“msg”, “查找失敗”);
map.put(“success”, false);
return map;
登錄管理控制層:
/**
- @author yy
*/
@Controller
@RequestMapping(“/user”)
public class LoginController {
@Autowired
private IUserService userService;
private Logger logger = LoggerFactory.getLogger(LoginController.class);
/**
-
描述:登陸
-
@author wanghaoyu
-
@version 1.0
-
@param user 用戶
-
@param verifyCode 驗證碼
-
@param request 請求
-
@return Map<String,Object> map封裝要返回到前端的信息
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“登陸”)
@RequestMapping(“/login”)
@ResponseBody
public Map<String, Object> login(User user, String verifyCode,
HttpServletRequest request){
Map<String, Object> maps = new HashMap<String, Object>(16);
//1. 驗證驗證碼
if(verifyCode == null || “”.equals(verifyCode) ) {
maps.put(“code”, 200);
maps.put(“msg”, “請輸入驗證碼”);
return maps;
verifyCode = verifyCode.toLowerCase();
String sessionCode = (String) request.getSession().getAttribute(“verifyCode”);
if( sessionCode == null || “”.equals(sessionCode)){
maps.put(“code”, 200);
maps.put(“msg”, “驗證碼獲取失敗! 請刷新頁面!”);
return maps;
sessionCode = sessionCode.toLowerCase();
if(!sessionCode.equals(verifyCode)) {
maps.put(“code”, 200);
maps.put(“msg”, “驗證碼不正確!”);
return maps;
//2.判斷用戶賬號密碼
Subject subject = SecurityUtils.getSubject();
System.err.println(“==============================” +subject.isAuthenticated());
//判斷用戶是否已經(jīng)登陸
if(!subject.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken(user.getAccount(),user.getPassword());
try {
subject.login(token);
//驗證成功
//登陸成功后的用戶賬號信息
String account = (String)subject.getPrincipal();
//根據(jù)用戶賬號,查詢用戶,并保存到session域中
User loginUser = userService.findByAccount(account);
LocalDateTime now = LocalDateTime.now();
//如果上次登陸的時間為空,則說明這次是首次登陸,前臺應該跳轉(zhuǎn)到修改密碼界面
if(loginUser.getLastLoginTime() == null) {
maps.put(“firstLogin”, true);
//修改最后一次登錄的時間,并保存到數(shù)據(jù)庫
loginUser.setLastLoginTime(now);
loginUser.setPassword(null);
//新創(chuàng)建對象用來更新user的最后一次登錄時間
User updateUser = new User();
updateUser.setId(loginUser.getId());
updateUser.setLastLoginTime(now);
userService.edit(updateUser);
request.getSession().setAttribute(“user”, loginUser);
logger.info(“登陸的用戶信息:” + loginUser.toString());
request.getSession().setAttribute(“user”, loginUser);
maps.put(“code”, 0);
//賬號被鎖定
} catch(LockedAccountException e){
maps.put(“code”,200);
maps.put(“msg”,“賬號已被鎖定,請聯(lián)系管理員進行處理!”);
//不存在的賬號
} catch(UnknownAccountException e) {
maps.put(“code”,200);
maps.put(“msg”,“賬號或密碼錯誤!”);
//密碼錯誤
} catch(IncorrectCredentialsException e) {
maps.put(“code”,200);
maps.put(“msg”,“賬號或密碼錯誤!”);
}catch (Exception e) {
e.printStackTrace();
maps.put(“code”, 200);
maps.put(“msg”, “系統(tǒng)出了小差,請稍等…”);
}else {
maps.put(“code”, 0);
return maps;
/**
-
描述:
-
@author wanghaoyu
-
@version 1.0
-
@param request request請求
-
@return ModelAndView
-
@exception Nothing
-
@since 1.8
*/
@Operation(name=“注銷”)
@RequestMapping(“/logout”)
public ModelAndView logout(HttpServletRequest request) {
ModelAndView view = new ModelAndView();
//獲取shiro中的用戶
Subject subject = SecurityUtils.getSubject();
//獲取用戶賬號信息
String account = (String) subject.getPrincipal();
if(account != null) {
//登出
subject.logout();
//同時刪除session中的用戶信息
request.getSession().removeAttribute(“user”);
request.getSession().invalidate();
//重定向到登陸頁面
view.setViewName(“redirect:/pages/login.jsp”);
return view;
角色管理控制層:
/**
- @author yy
*/
@Controller
@RequestMapping(“/role”)
public class RoleController {
Logger logger = LoggerFactory.getLogger(RoleController.class);
@Autowired
IRoleService roleService;
@Autowired
IRolePermissionService rolePermissionService;
@Autowired
IPermissionService permissionService;
@Autowired
RedisUtil redisUtil;
/**
-
描述:分頁加條件查詢Role
-
@author wanghaoyu
-
@version 1.0
-
@param page
-
@param limit
-
@param role
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name = “查詢職位”)
@RequiresPermissions(“4001”)
@RequestMapping(“/findRoles”)
@ResponseBody
public Map<String, Object> findRoles(Integer page, Integer limit, Role role) {
Map<String, Object> map = new HashMap<String, Object>(16);
// 創(chuàng)建角色模板類
RoleExample roleExample = new RoleExample();
// 創(chuàng)建查詢準則
Criteria criteria = roleExample.createCriteria();
// 判斷role中的條件
if (role.getName() != null) {
criteria.andNameLike(“%” + role.getName() + “%”);
// 分頁數(shù)據(jù)合法性判斷
if (page == null || page <= 0) {
page = 1;
if (limit == null || limit <= 0) {
limit = 10;
// 偏移值,即從第幾條數(shù)據(jù)開始查
Long offset = new Long((page - 1) * limit);
// 數(shù)據(jù)總條數(shù)
Long count = roleService.countByRoleExample(roleExample);
roleExample.setOffset(offset);
roleExample.setLimit(limit);
List roles = roleService.selectByRoleExample(roleExample);
logger.info(roles.toString());
// 封裝數(shù)據(jù),返回到前臺
map.put(“data”, roles);
map.put(“code”, 0);
map.put(“msg”, “success”);
map.put(“count”, count);
return map;
/**
-
描述:根據(jù)職位編號刪除職位
-
@author wanghaoyu
-
@version 1.0
-
@param id
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name = “刪除職位”)
@RequiresPermissions(“4004”)
@RequestMapping(“/deleteRole”)
@ResponseBody
public Map<String, Object> deleteRole(Integer id) {
Map<String, Object> map = new HashMap<String, Object>(16);
// 用于判斷返回給前臺的結(jié)果
boolean success = false;
// 刪除結(jié)果判斷
if (roleService.deleteRoleByPrimaryKey(id)) {
success = true;
map.put(“success”, success);
map.put(“code”, 0);
return map;
/**
-
描述:編輯職位
-
@author wanghaoyu
-
@version 1.0
-
@param role
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name = “編輯職位”)
@RequiresPermissions(“4002”)
@RequestMapping(“/editRole”)
@ResponseBody
public Map<String, Object> editRole(Role role) {
Map<String, Object> map = new HashMap<String, Object>(16);
// 用于判斷返回給前臺的結(jié)果
boolean success = false;
if (roleService.updateRoleByPrimaryKey(role)) {
success = true;
map.put(“success”, success);
map.put(“code”, 0);
return map;
/**
-
描述:添加職位
-
@author wanghaoyu
-
@version 1.0
-
@param role
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name = “添加職位”)
@RequiresPermissions(“4003”)
@RequestMapping(“/addRole”)
@ResponseBody
public Map<String, Object> addRole(Role role) {
Map<String, Object> map = new HashMap<String, Object>(16);
// 用于判斷返回給前臺的結(jié)果
boolean success = false;
if (roleService.insertRole(role)) {
success = true;
map.put(“success”, success);
map.put(“code”, 0);
return map;
/**
-
描述:查詢角色所擁有的權(quán)限id
-
@author huangqingwen
-
@version 1.0
-
@param rolePermission
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name = “查詢角色所擁有的權(quán)限id”)
@RequiresAuthentication
@RequestMapping(“/findRolePermissionId”)
@ResponseBody
public Map<String, Object> findRolePermissionId(RolePermission rolePermission) {
Map<String, Object> maps = new HashMap<String, Object>(16);
// 1. 獲取該角色id下的所有權(quán)限id
RolePermissionExample example = new RolePermissionExample();
example.createCriteria().andRoleIdEqualTo(rolePermission.getRoleId());
List list = rolePermissionService.selectByRolePermissionExample(example);
maps.put(“result”, list);
return maps;
/**
-
描述:分配權(quán)限給特定的角色
-
@author huangqingwen
-
@version 1.0
-
@param permissionId,
- roleId
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@Operation(name = “分配權(quán)限”)
@RequiresPermissions(“4005”)
@RequestMapping(“allotPermission”)
@ResponseBody
public Map<String, Object> allotPermission(HttpServletRequest request, @RequestParam(value = “permissionIds[]”, defaultValue=“”) Integer[] permissionIds,
@RequestParam(value = “roleId”) Integer roleId) {
Map<String, Object> maps = new HashMap<String, Object>(16);
//從session中獲取用戶角色
//User user = (User)request.getSession().getAttribute(“user”);
int result = rolePermissionService.allotPermission(permissionIds, roleId);
//權(quán)限發(fā)生改變,刪除權(quán)限相關(guān)的緩存
//刪除相應角色菜單的緩存
redisUtil.remove(“roleMenu-”+roleId);
//刪除權(quán)限相關(guān)的緩存
redisUtil.remove(“rolePermission-”+roleId);
if (permissionIds.length > 0) {
if (result == permissionIds.length) {
maps.put(“code”, 0);
} else {
maps.put(“code”, 200);
maps.put(“msg”, “分配失敗!”);
return maps;
maps.put(“code”, 0);
return maps;
/**
-
描述:獲取用戶角色的權(quán)限菜單
-
@author huangqingwen
-
@version 1.0
-
@param request
-
@return Map<String,Object>
-
@exception Nothing
-
@since 1.8
*/
@SuppressWarnings(“unchecked”)
@Operation(name=“獲取用戶角色的權(quán)限菜單”)
@RequiresAuthentication
@RequestMapping(“/getRolePermissionMenu”)
@ResponseBody
public Map<String, Object> getRolePermissionMenu(HttpServletRequest request){
Map<String, Object> maps = new HashMap<String, Object>(16);
//從session中獲取用戶角色
User user = (User)request.getSession().getAttribute(“user”);
List userPermissions = null;
logger.info(user.toString());
//先從redis緩存中查找角色權(quán)限菜單
String roleMenu = “roleMenu-”;
if(redisUtil.exists(roleMenu+user.getRoleId())) {
userPermissions = (List) redisUtil.get(“roleMenu-”+user.getRoleId());
}else {
//如果沒有在緩存中找到,則從數(shù)據(jù)庫中查找
//獲取權(quán)限樹
List permissions = permissionService.selectTreePermission();
//查詢該用戶的角色所擁有的權(quán)限id
RolePermissionExample rolePermissionExample = new RolePermissionExample();
rolePermissionExample.createCriteria().andRoleIdEqualTo(user.getRoleId());
List rolePermissions = rolePermissionService.selectByRolePermissionExample(rolePermissionExample);
//將用戶的權(quán)限id放到數(shù)組中
int size = rolePermissions.size();
Integer[] array = new Integer[size];
for(int i = 0 ; i < size ; i ++ ) {
array[i] = rolePermissions.get(i).getPermissionId();
//過濾用戶的權(quán)限
userPermissions = getUserPermission(permissions, array);
//把查找到的數(shù)據(jù)存入到redis緩存中
redisUtil.set(“roleMenu-”+user.getRoleId(), userPermissions, 1800L);
maps.put(“permission”, userPermissions);
maps.put(“code”, 0);
return maps;
/**
-
過濾用戶的菜單
-
@param permissions
-
@param array
-
@return
-
@author huangqingwen
*/
public List getUserPermission(List permissions, Integer[] array){
if(permissions == null) {
return null;
for(int i=permissions.size()-1; i>=0; i–) {
Permission permission = permissions.get(i);
boolean flag = false;
for (Integer a : array) {
if(permission.getId().equals(a)) {
flag = true;
permission.setChildPermission(getUserPermission(permission.getChildPermission(), array));
//把類型為功能的permission也移除掉
if(flag == false || permission.getType().equals(1)) {
permissions.remove(i);
return permissions;
總結(jié)
以上是生活随笔為你收集整理的基于javaweb的crm客户关系管理系统(java+springboot+echarts+freemarker+layui+mysql)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于标识牌的一些简单介绍
- 下一篇: linux cmake编译源码,linu