Java 初识CRM之项目思路解析
CRM项目
一、登录模块全程思路分析
登录模块:
1、对用户名和密码的校验,并存储在cookie中,方便后期的免登录操作。
2、对用户基本信息的修改,通过获取表单用户修改的数据,进行Ajax请求,对修改之后id对应用户进行数据库信息修改
3、修改密码,获取用户输入的表单数据,进行service层校验,判断原密码,新密码确认密码,最后对数据库用户密码进行修改
4、每次修改信息后会自动清楚cookie内的数据,退出重新登录
5、service层会调用很多工具类提供便洁业务处理
⭐核心代码
controller层UserController.java
@Controller @RequestMapping("user") public class UserController extends BaseController { @Autowired UserService userService; //修改密码页面跳转 @RequestMapping("toPasswordPage") public String updatePwd(){ return "user/password"; } //登录 @RequestMapping("login") @ResponseBody public ResultInfo login(User user){ ResultInfo result=new ResultInfo(); try{ //捕获异常 UserModel userModel=userService.userLogin(user.getUserName(),user.getUserPwd()); //登录成功 result.setCode(200); result.setMsg("登录成功~"); result.setResult(userModel); }catch (ParamsException ex){ ex.printStackTrace(); result.setCode(ex.getCode()); result.setMsg(ex.getMsg()); }catch (Exception e){ e.printStackTrace(); result.setCode(500); result.setMsg("操作失败~"); } return result; } /*修改密码*/ @PostMapping("updatePwd") @ResponseBody public ResultInfo updatePwd(HttpServletRequest req,String oldPwd,String newPwd,String againPwd){ ResultInfo result=new ResultInfo(); //获取cookie获取用户ID int userId=LoginUserUtil.releaseUserIdFromCookie(req); userService.updatePwd(userId,oldPwd,newPwd,againPwd); return result; } }
Service层UserService.java
@Service public class UserService extends BaseService<User,Integer> { @Resource UserMapper userMapper; /*用户登录*/ public UserModel userLogin(String userName,String userPwd){ //判断用户名和密码是否为空 checkNull(userName,userPwd); //检查是否已经存在 User user=userMapper.selectByuserName(userName); AssertUtil.isTrue(user==null,"用户名不存在!"); //检查密码 checkPwd(userPwd,user.getUserPwd()); return buildInfo(user); } //设置返回信息 private UserModel buildInfo(User user) { UserModel um=new UserModel(); um.setUserName(user.getUserName()); um.setUserId(UserIDBase64.encoderUserID(user.getId()));//对ID加密 um.setTrueName(user.getTrueName()); return um; } //密码验证 private void checkPwd(String userPwd, String userPwd1) { String enPwd=Md5Util.encode(userPwd); AssertUtil.isTrue(!enPwd.equals(userPwd1),"密码不正确!"); } //判断是否为空 private void checkNull(String userName,String userPwd){ //判断用户名和密码是否为空 AssertUtil.isTrue(StringUtils.isBlank(userName),"用户名不能为空!"); AssertUtil.isTrue(StringUtils.isBlank(userPwd),"用户密码不能为空!"); } /*修改密码*/ public void updatePwd(int userId,String oldPwd,String newPwd,String againPwd){ //通过id获取用户 System.out.println(userId); User user=userMapper.selectByPrimaryKey(userId); System.out.println(user); //检验并修改密码 isOkForPwd(user,oldPwd,newPwd,againPwd); //修改密码 user.setUserPwd(Md5Util.encode(newPwd)); //修改数据库内容 AssertUtil.isTrue(userMapper.updateByPrimaryKeySelective(user)<1,"操作失败"); } //检验密码 private void isOkForPwd(User user, String oldPwd, String newPwd, String againPwd) { //判断用户是否为空 AssertUtil.isTrue(user==null,"用户未登录或不存在!"); //原密码是否为空 AssertUtil.isTrue(StringUtils.isBlank(oldPwd),"原密码不能为空!"); //新密码判断是否为空 AssertUtil.isTrue(StringUtils.isBlank(newPwd),"新密码不能为空!"); //对原密码判断是否正确 AssertUtil.isTrue(!(user.getUserPwd().equals(Md5Util.encode(oldPwd))),"原密码不正确!"); //对新密码和原密码进行判断 AssertUtil.isTrue(oldPwd.equals(newPwd),"原密码和新密码不能一致!"); //对再次输入判断是否为空 AssertUtil.isTrue(StringUtils.isBlank(againPwd),"二次验证密码不能为空!"); //判断新密码与二次输入 AssertUtil.isTrue(!(newPwd.equals(againPwd)),"新密码与第二次输入不一致!"); } }
全局异常具体代码:GlobalExceptionResolver.java
@Component public class GlobalExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex) { //登录异常处理 if(ex instanceof NoLoginException){ // 如果捕获的是未登录异常,则重定向到登录页面 ModelAndView mv = new ModelAndView("redirect:/index"); return mv; } //实例化ModelandView 异常则跳转error ModelAndView mv=new ModelAndView("error"); mv.addObject("code",400); mv.addObject("msg","系统异常~"); if(handler instanceof HandlerMethod){ //则返回页面 HandlerMethod hm=(HandlerMethod) handler; //通过反射获取注解@responseBody对象 ResponseBody resquestBody=hm.getMethod().getDeclaredAnnotation(ResponseBody.class); //判断是否被注解 if(resquestBody==null){ //返回页面 if(ex instanceof ParamsException){ ParamsException param=(ParamsException) ex; //设置 mv.addObject("code",param.getCode()); mv.addObject("msg",param.getMsg()); } }else{ //返回json ResultInfo result=new ResultInfo(); result.setCode(300); result.setMsg("系统异常~"); //异常处理 if(ex instanceof ParamsException){ ParamsException param=(ParamsException) ex; //设置 result.setCode(param.getCode()); result.setMsg(param.getMsg()); // 设置响应类型和编码格式 (响应JSON格式) resp.setContentType("application/json;charset=utf-8"); //通过数据流写出 PrintWriter out= null; try { out = resp.getWriter(); out.write(JSON.toJSONString(result)); out.flush(); } catch (IOException e) { e.printStackTrace(); }finally { if(out!=null){ out.close(); } } return null; } } } return mv; } }
拦截器NoLoginInterceptor.java
public class NoLoginInterceptor extends HandlerInterceptorAdapter { @Resource UserService userService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //根据cookie中id值登录拦截 //获取cookie用户id Integer userId = LoginUserUtil.releaseUserIdFromCookie(request); if(userId==null || userService.selectByPrimaryKey(userId)==null){ throw new NoLoginException("未登录异常~"); } return true; } }
dao层与mappers映射层直接生成,其余静态页面和素材略....(详情代码看上传资源)
二、营销模块全程思路分析
营销模块:
1、主要进行营销机会的添加、删除、编辑
2、首先通过静态页面的监听,判断执行什么操作
2.1、点击添加:对应js调用addorupdata()方法-->open开启规定好大小的页面,
跳转controller下addorupdata(Integer id,Model model)方法进行判断是
否有id,无则直接转发静态资源页面addorupdata.ftl页面,此时open的小页面便
有一个空的表单页面了。
2.2、点击修改:对js调用addorupdata(id)方法-->open开启规定好大小的页面,
带id转发至controller层addorupdata(Integer id,Model model)方法判断
id是否有值,有则存入对应id的User对象于model中,转发至addorupdata.ftl页
面,此时open的小页面便是一个有内容的表单。
2.3、点击删除:js文件会直接调用deletesale(data),直接获取要删除对象的id,
多个这返回拼接一个ids=1&ids=2&ids=3发送Ajax请求至controller层调用delete(Integer[] ids)
方法对其进行处理。
3、其次,判断什么操作之后,便会弹出对应窗口addorupdata.ftl,此时对应js对其监听是否提交
3.1、点击提交,则会判断表单提交数据中是否含有id值,有则发送Ajax请求至controller层
调用updata(User user)方法对其进行修改。
3.2、点击提交,id无值,则发送Ajax请求至controller层调用add(User user)方法对其进行添加
4、删除这里直接写一个批量删除即可,无序打开小窗口,直接Ajax请求,调用controller层的delete方法进行处理
其余模块的逻辑,于营销模块思路一致,不做更多概述~,源码直接看上传资源
⭐核心代码
SaleChanceController.java
@Controller @RequestMapping("sale_chance") public class SaleChanceController extends BaseController { @Autowired private SaleChanceService saleChanceService; @Autowired private UserService userService; //营销机会页面跳转 @RequestMapping("index") public String toSale(){ return "/saleChance/sale_chance"; } //添加和修改页面 @RequestMapping("addOrUpdateDialog") public String addorUpdata(Integer id, Model model){ //如果id有值 if(id!=null){ //通过ID获取对象 SaleChance saleChance=saleChanceService.selectByPrimaryKey(id); model.addAttribute("saleChance",saleChance); } return "saleChance/add_update"; } @RequestMapping("list") @ResponseBody public Map<String,Object> manyPage(SaleChanceQuery query){ return saleChanceService.manyPage(query); } /*添加商机*/ @RequestMapping("save") @ResponseBody public ResultInfo save(HttpServletRequest req, SaleChance saleChance){ //获取cookie中的id int id= LoginUserUtil.releaseUserIdFromCookie(req); //通过id创建者 String createName=userService.selectByPrimaryKey(id).getTrueName(); //设置创建者 saleChance.setCreateMan(createName); //添加 saleChanceService.addSaleChance(saleChance); return success("添加成功"); } /*修改营销机会*/ @RequestMapping("updata") @ResponseBody public ResultInfo updata(SaleChance saleChance){ saleChanceService.updataSale(saleChance); return success("修改成功"); } /*批量删除*/ @RequestMapping("dels") @ResponseBody public ResultInfo delete(Integer[] ids){ System.out.println(Arrays.toString(ids)); saleChanceService.deleteall(ids); return success("删除成功~"); } }
SaleChanceService.java
@Service public class SaleChanceService extends BaseService<SaleChance,Integer> { @Resource private SaleChanceMapper saleChanceMapper; /*//分页显示*/ public Map<String,Object> manyPage(SaleChanceQuery query){ Map<String, Object> map = new HashMap<>(); //设置分页 PageHelper.startPage(query.getPage(), query.getLimit()); //对数据进行分页 PageInfo<SaleChance> pageInfo = new PageInfo<>(saleChanceMapper.selectByParams(query)); map.put("code",0); map.put("msg", "success"); map.put("count", pageInfo.getTotal()); map.put("data", pageInfo.getList()); return map; } /* //添加商机*/ @Transactional(propagation = Propagation.REQUIRED) public void addSaleChance(SaleChance saleChance){ //判断客户名称,机会来源,联系人,联系电话, checkInfo(saleChance.getCustomerName(),saleChance.getChanceSource(),saleChance.getLinkMan(),saleChance.getLinkPhone()); //state状态是否分配 0 未分配 1已经分配 if(StringUtils.isBlank(saleChance.getAssignMan())){ saleChance.setDevResult(0); saleChance.setState(0); } if(StringUtils.isNotBlank(saleChance.getAssignMan())){ saleChance.setDevResult(1); saleChance.setState(1); saleChance.setAssignTime(new Date()); } //设置默认值 saleChance.setCreateDate(new Date()); saleChance.setUpdateDate(new Date()); saleChance.setIsValid(1); //判断插入是否成功 AssertUtil.isTrue(insertSelective(saleChance)<1,"添加失败!"); } /* //修改商机*/ @Transactional(propagation = Propagation.REQUIRED) public void updataSale(SaleChance saleChance){ //通过id判断是否存在 SaleChance sc=selectByPrimaryKey(saleChance.getId()); AssertUtil.isTrue(sc==null,"更新商机不存在!"); //基础判断 checkInfo(saleChance.getCustomerName(),saleChance.getChanceSource(),saleChance.getLinkMan(),saleChance.getLinkPhone()); //是否分配] //原营销机会未分配,改为已经分配 if(StringUtils.isBlank(sc.getAssignMan()) && saleChance.getAssignMan()!=null){ sc.setState(1); sc.setDevResult(1); sc.setAssignTime(new Date()); } //原营销机会已经分配,改为未分配 if(StringUtils.isNotBlank(sc.getAssignMan()) && StringUtils.isBlank(sc.getAssignMan())){ sc.setState(0); sc.setDevResult(0); sc.setAssignTime(null); sc.setAssignMan(""); } //插入 AssertUtil.isTrue(updateByPrimaryKeySelective(saleChance)<1,"添加失败!"); } /*批量删除*/ @Transactional(propagation = Propagation.REQUIRED) public void deleteall(Integer[] ids){ //判断是否为空 AssertUtil.isTrue((ids==null || ids.length==0),"删除的ID不存在!"); System.out.println(Arrays.toString(ids)); //删除是否成功 AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids) < 0,"删除失败~~~"); } //校验 private void checkInfo(String customerName, String chanceSource, String linkMan, String linkPhone) { AssertUtil.isTrue(StringUtils.isBlank(customerName), "用户名称不能为空!"); AssertUtil.isTrue(StringUtils.isBlank(chanceSource),"机会来源不能为空!"); AssertUtil.isTrue(StringUtils.isBlank(linkMan),"联系人不能为空!"); AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"联系电话不能为空!"); AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"电话号码不合法!"); } }
总结
以上两个模块基本就是这个项目的全部思路,后面的模块思路与介绍的这两个模块思路一致,源码已上传~,1024程序员节日快乐!!🎈🎈🎈🎈
到此这篇关于Java 初识CRM之项目思路解析的文章就介绍到这了,更多相关Java CRM项目思路内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring boot2X Consul如何使用Feign实现服务调用
这篇文章主要介绍了spring boot2X Consul如何使用Feign实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-12-12动态修改spring aop 切面信息提升自动日志输出框架效率
这篇文章主要为大家介绍了动态修改spring aop切面信息提升自动日志输出框架效率,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-07-07Java多线程之scheduledThreadPool的方法解析
这篇文章主要介绍了Java多线程之scheduledThreadPool的方法解析,queue是DelayedWorkQueue,但通过后面的分析可以知道,最大线程数是不起作用的,最多会起核心线程数的数量,需要的朋友可以参考下2023-12-12
最新评论