# CRM-Project **Repository Path**: yxxxyx/crm-project ## Basic Information - **Project Name**: CRM-Project - **Description**: 基于SSM的CRM项目 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-03-01 - **Last Updated**: 2024-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, SSM, jsp, Spring, Spring-MVC ## README # CRM-Project ## 介绍 简单的基于SSM的CRM项目 开发环境:IDEA JDK版本:1.8 项目管理工具:Maven Web服务器:Tomcat9.0.56 数据库管理系统:Mysql8.0.28 涉及到的技术: Spring,SpringMVC,Mybatis,JSP,jQuery,ajax,bootstrap等 ## 2022/03/01第一次提交 开发环境的搭建,跳转到登录页面的实现; ## 2022/03/02第二次提交 mybatis逆向工程crm-mybatis-generator的搭建,生成登录模块对应类User、UserMapper和配置文件UserMapper.xml 重置了mysql的依赖版本,第一版是5.1.43,更新成为了8.0.28,因为当前使用数据库为8.0.16版本; 8点几的版本相对于5点几版本内部有一些修改,在使用逆向工程时会报错,所以最好的方法就是直接修改mysql依赖,修改数据库版本太麻烦; ## 2022/03/03第三次提交 - 完善“登录模块”:service层、controller层 - 实现“登录界面”的所有需求功能 - 登录后系统首页的跳转 - 登录前端页面的完善(表单信息接收、表单验证) - DateUtils工具类编写、Constants常量类的编写、ReturnObject封装信息类的编写 - 修改了一些小问题 - 存在问题:登录界面记住密码功能不安全,且记住密码中cookie存活时间逻辑上有问题:每次登录如果默认勾选记住密码则每次cookie存活时间都会重新更新 ## 2022/03/04第四次提交 - 解决了cookie存活时间的问题:增加了一个判断是否存在账号和密码cookie的判断条件 - 增加了一些常量 - 增加了“安全退出”功能:清空cookie,销毁session,跳转到首页 ## 2022/03/05第五次提交 - 增加了“登录验证”功能:通过springMVC的拦截器实现(LoginInterceptor) - 增加了“我的资料”内容的动态显示 - 增加了显示“工作台”页面 - 增加了显示“市场活动”页面(动态页面) - 增加了UUID工具类用来生成32位表主键字段 - 实现“创建市场活动”部分需求 对表tbl_activity增加数据的操作,及相应前端界面的完善:数据获取、表单验证等; 但是创建市场活动中日期未完善,需要设置成为日历模式供用户选择;刷新市场活动列未完成,后期分页做完后实现该功能 - 补充了一下注释 - 疑问:login.jsp登录时提交改成了get请求,为什么最初使用的是post请求?解:get请求会留下缓存,每次修改前端界面都需要清楚缓存,不方便 - 存在问题:login功能切换登录账号后之前账号的相应cookie未清空,导致新用户登录时无法记住密码,即无法创建该新用户的cookie; ## 2022/03/06第六次提交 - 解决了无法创建新用户cookie的问题: 问题原因是“记住密码”勾选后是否是新用户的判断条件是通过cookie的name值来判断的,当一个新用户需要记住密码时,由于用户cookie的name值都相同 (loginAct和loginPwd), 将不会新建cookie对象,就无法实现记住密码的功能;所以要通过cookie的value值判断(账号和密码), 但是不同用户的账号和密码可能会出现重复,那么就需要找用户间不会重复的信息,那就是id值; 用户唯一标识是id,所以额外创建一个用户id的cookie,通过该id判断当前用户是不是新用户,就可以实现是否是新用户的判断了; - 解决以上问题时代码出现多处重复,所以封装了一个cookie工具类,并补充了部分常量 - “创建市场活动”部分输入时间方式改成了日历模式供用户选择,到此完成了“创建市场活动”需求 - “查询市场活动”功能: - 完成了分页查询的首页面数据查询功能,分页并未实现 - 完成了通过条件查询市场活动首页面的功能,分页并未实现 - 刷新市场活动列完成 - 后期目标:继续完善市场活动分页查询功能 ## 2022/03/07第七次提交 - 完成了”查询市场活动“的所有需求(分页已完成),并补充了部分界面操作和显示,方便操作; 分页通过bootstrap的分页插件:bs_pagination完成,为了界面显示修改了该插件源码的部分内容 今天主要写的是前端部分,测试了当前的所有功能,并没有出现问题,接下来将开始“删除市场活动需求”; ## 2022/03/08第八次提交 - 先完成了“全选市场活动”的功能(前端),因为删除市场活动功能要依靠该功能; - “删除市场活动”功能所有代码都已经完成,中间出了个小问题,搞了几个小时... 具体就是批量删除获取的id前后有个空格,导致id不正确无法删除; 根本原因就是在之前动态查询市场活动的函数中,在写入市场活动时给checkbox的value赋值市场活动的id, 但是粗心赋值时前后各多了一个空格,这导致后期批量删除时由于id前后有空格无法从数据库中找到该id,sql执行失败; ## 2022/03/10第九次提交 - 完成了“修改市场活动”功能,总结了部分知识点,找到了之前“删除市场活动”出现bug的根本原因,已经在相应位置补充注释; 目前状态处在一个了解如何使用阶段,但是对代码的设计处于一种微妙的懵懂中,这个阶段多总结后面会在框架使用上更上一层楼; ## 2022/03/11第十次提交 - 完成了“批量导出市场活动”功能 - 完成了“选择导出市场活动”功能 - 抽取了该两项功能共同点封装了工具类(实现excel文件导出用到了apache-poi插件) ## 2022/03/12第十一次提交 - 完成了“导入市场活动”的功能 - 完善了工具类、配置文件等 (同样使用了apache-poi插件,导入功能需要按照规定模板导入,所以自己额外添加了下载导入模板的功能) ## 2022/03/13第十二次提交 - 完成了“查看市场活动明细”的功能 - 初步完成了自己补充功能:“注册”功能,但是前端的表单验证并未完成,后端已经全部完成 ## 2022/03/14第十三次提交 - 完成了“增加市场活动备注”功能(一个问题:添加后新追加的备注没有删除和修改的标志,刷新后才有,没有找到问题) - 完成了“注册”功能的信息验证功能,界面体验有待改进; ## 2022/03/15第十四次提交 - 完成了“删除市场活动备注”功能 - 找到了昨天的问题原因:添加后新追加的备注没有删除和修改的标志,是因为动态加载后界面上不是动态生成的元素, 所以给删除和修改的标志添加事件时该元素还没有生成,给动态生成的元素添加事件的方法是:使用jquery的on函数就可以解决问题; - 简单总结一下:这里的备注动态显示页面上的方法可以和市场活动显动态显示到界面的方法不一样,可以对比学习 ## 2022/03/16第十五次提交 - 完成了“修改市场活动备注”功能 - 至此市场活动部分已经全部完成,不同的地方有着不同的解决方法,只是一味的记代码是没有太大用处的, 需要理解对一个需求功能的整个分析的流程,对流程每一步的操作能够了然于胸,这样才能在不同的情况下写出合适的代码; 其实底层的操作就是增删改查,唯一的难点就在于后端和前端的交互上,尤其是前端数据的获取,适当的添加一些隐藏标签可能 更利于前端页面数据的获取;同时也要能分析出何时发同步请求,何时发异步请求,这些都是需要慢慢体会的; ## 2022/03/17第十六次提交 - 完成了”查询线索“功能 - 完成了”创建线索”功能(公司座机号码的正则表达式再找找,了解了解相应的规则) 这两个功能和市场活动的功能几乎一样,所以不过多介绍,区别就是参数多点,sql难写点,就一句话: 只要有思路了,写代码是分分钟的事 - 完成这俩功能时回顾了一些基本的功能:分页查询,复选框的选择,日历的设置 ## 2022/03/18第十七次提交 - 发现“创建线索”功能的一个小bug:如果只填写必填的三个选项创建的市场活动无法查询出来 原因是查询sql语句的问题:在连接查询中的“称呼”“状态”“来源”用的内连接,因为这三者可以为空,所以内连接查询不出来对应数据,改成左外连接即可; - 完成了“删除线索”功能 - 完成了“修改线索”功能 - 完成了“查看线索明细”的基本信息,下一步要操作一个新的表,怕误操作,先push一次; - 完成了“查看线索明细”的备注信息,至此“查看线索明细”功能完成 - 完成了“增加线索备注”功能 - 明日任务:完成“删除线索备注”“修改线索备注”功能,开始学习新的功能;还有不要忘了添加一个delete语句:删除线索时删除对应的所有线索备注 ## 2022/03/19第十八次提交 - 完成了“删除线索备注”功能 - 完成了“修改线索备注”功能 至此线索和市场活动重复功能部分都已经完成; - 补充了线索线索明细中显示市绑定的场活动功能; ## 2022/03/20第十九次提交 - 完成了”线索关联市场活动“功能 - 完成了”解除线索关联市场活动“功能 - 小感悟:所有操作都是增删改查,学习别人项目也是一样, 想要搞懂一个功能就从sql语句学习(前提要对表关系理解),然后关注controller和前端的交互方式即可理解整个流程 ## 2022/03/21第二十次提交 - 开始进行”线索转行功能“,当前只完成了跳转线索转换界面和其中动态数据的查询,并完成了市场活动源的查询; - 之前的删除市场活动以及删除线索中同时删除相关备注有问题:应该把删除市场活动/线索和删除备注的sql放在同一个 service中执行,出现问题还可以进行事务回滚,之后修改该问题; ## 2022/03/23第二十一次提交 - “线索转换”功能完成了不创建交易情况下的转换,但是客户的页面没有写后端逻辑,所以只能从数据库中查看信息(插入信息存在问题: 信息无法插入,提交显示成功,但是数据库中不显示数据,初步怀疑是事务没有提交的问题) - 明日计划:客户页面基本显示等功能,修改一下删除市场活动和删除线索的功能,将sql合成一个方法;同时删除线索 时应该同时删除该线索关联的市场活动,所以需要再添加一个sql; ## 2022/03/24第二十二次提交 ### mac提交 - 解决了线索转化中插入信息的问题,原因就是粗心大意写错了插入的sql语句,虽然sql能执行成功但是无法插入数据,这也是一个很重的教训: 写sql时一定要小心再小心,同样在调错时可以在数据库中直接执行自己的sql,可以快速排除定位sql是否错误; - 补充了前端页面保存备注的取消按钮清空文本域的功能 - 发现了一个小问题:线索转换中的取消按钮返回有问题,回到详情界面后返回线索菜单需要点两次返回;(已解决) - 修改了删除市场活动和删除线索的功能,将sql都写在了线索的service中的对应方法之中 ### windows提交 - 继续完善“线索转换”功能: - 把线索中有关个人的信息转换到联系人表中 - 把线索的备注信息转换到客户备注表中一份 - 把线索的备注信息转换到联系人备注表中一份 - 明日计划:继续完成“线索转换”功能,完善客户页面以及联系人页面 ## 2022/03/25第二十三次提交 - 完成了客户页面的数据显示以及分页查询、全选实现 其中在实现条件查询客户时遇到了一个问题之前没有遇到过:通过查询按钮查询数据时所发的ajax请求前端页面显示“已取消”,说明没有执行 成功,后端逻辑没有问题,通过检查和搜集资料发现是因为查询按钮type是表单的submit,而我又给该按钮添加了click单击事件,所以 单击查询按钮时,form action与绑定于button上的click事件会同时触发,form action将表单内容以search的形式追加至当前url上, url变更后会导致页面重新加载,而这正是导致post请求在执行后就被终止的原因;所以只需要把查询的submit改成button即可; 且以后使用ajax的时候,尽量不要在form内使用button进行提交,因为在url变更后,会对当前正在执行的ajax进求进行中止操作,中止后该请求的状态码将为canceled - 完成了“创建客户”功能 - 修改了座机电话的正则表达式 - 完成了”修改客户“功能 - 完成了”删除客户“功能 - 完成了”显示客户详情页面“部分功能(显示备注;其中的交易和联系人没有找到关系表,先不确定是否需要完成,先跳过) - 删除客户需补充:删除所有对应备注的sql - 发现线索转换过程中线索备注转为客户备注时出现的问题:原因是客户备注customer_id字段设置时设置成了线索id,应该设置客户id,已更正 - 下次计划:完成客户详情页面的备注功能(增删改),编辑删除先忽略;继续完成线索转换功能 ## 2022/03/27第二十四次提交 * - 完成了“线索转换”的全部内容 - 完成客户详情页面的备注功能(增删改),编辑删除功能重复,已取消 - 对于“关联交易”和“关联联系人”这两种功能,由于数据库中没有找到客户表对应的关系表,所以先忽略不做 至此“客户”模块已经全部完成 - 下次计划:开始进行“联系人”模块的实现 ## 2022/03/31第二十五次提交 - 完成了联系人页面的数据显示以及分页查询、全选实现 - 完成了“创建联系人”功能 - 遗留问题:创建联系人时的客户名称部分需要自动补全或创建,没有想到实现方法;(已解决) - 下次计划:联系人界面的修改、删除、详情功能 ## 2022/04/01第二十六次提交 * - 完成了“修改联系人”功能 - 完成了“删除联系人”功能(只是单纯删除联系人信息,对应联系人的备注等信息未删除) - 完成了“查看联系人详情”页面基本跳转(存在前端页面问题:详细信息下划线排版乱,职位处没有下划线) - 下次计划:联系人详情界面备注功能(增删改查) ## 2022/04/02第二十七次提交 - 完成了联系人详情界面备注功能(增删改查) - 尝试部署项目到服务器,在注册登录ip出现问题,ip是服务器内网ip,解决方法: 将注册和登录ip验证中获取ip的方式都改成了request.getRemoteAddr()方法,就可以获取当前登录本机的ip - 下次计划:完成联系人关联市场活动功能 ## 2022/04/06第二十八次提交 * - 完成了联系人关联市场活动功能 - 完成了联系人解除关联市场活动功能 - 补全了删除联系人功能 - 联系人模块所有功能完成,除了关联交易,因为缺少对应关系表和前端界面,后期可以补充 ## 2022/04/09第二十九次提交 - 完成了交易界面的显示 - 完成了创建交易界面显示,其中完成了“市场活动源”和“联系人名称”的模糊查询, “阶段”和“可能性”通过possibility.properties配置文件的匹配 - “修改联系人备注”功能之前没有完善,补充了最后的步骤 - 下次计划:完成“创建交易”功能(尤其是学习其中“客户名称”的查询和创建,这也是第二十五次提交遗留下来的问题) ## 2022/04/14第三十次提交 * - 基本完成了“创建交易”功能,但是发现问题:创建功能使用前提是客户名称不能出现重复的,因为在保存客户时会通过客户名称查询一条客户, 如果客户名称重复,那么就会查到多条数据,而sql只能返回一条,sql报错,无法保存;所以考虑是不是要在客户处加一个重复客户判断; 取消按钮没有完善,创建交易表单验证没有完成; - 补充了“创建联系人时的客户名称部分需要自动补全或创建”部分内容,并未完成 - 下次任务:完成以上未完成内容,想一下创建交易问题的解决办法 ## 2022/04/15第三十一次提交 - 解决了问题:创建联系人时的客户名称部分需要自动补全或创建,包括修改部分的自动补全创建 - 修改了bug:交易和联系人列表的条件查询时有些条件无法执行,sql问题,已修改; - 完成了“创建交易”的所有功能,并对saveCreateTransaction保存交易函数的实现类进行了修改,相对之前操作更简单 - 完成了“修改交易”的所有功能 - 补充:“创建交易”和“修改交易”的参数表单验证没有完成,这个不难,下次完成; - 下次任务:“删除交易”功能完成 ## 2022/04/16第三十二次提交 - “创建交易”和“修改交易”的参数表单验证完成 - 完成了“删除交易”功能,详情界面完成后补充删除代码 - 下次任务:“详情界面”开始完善 ## 2022/04/17第三十三次提交 - 完成了“交易详情界面”的所有功能,至此交易的所有功能已经完成 - 修改了部分界面前端参数,复制时粘错了 - 下次任务:“交易统计图表” 功能开始进行 ## 2022/04/17第三十四提交 - 完成了统计图表中的四个图表 - 增加了404界面 - 基础功能已经完成,其余页面没有前端页面未完成,整个项目学习也可以结束了, 总体感觉项目整体没有太多技术难点,都是基础的crud操作,可以用来作为复习ssm或者适合刚学习完ssm练手的项目; 以后如果有机会可以增加其他功能;目前测试没有什么bug,只有一个之前遗留问题:客户一但出现重名的,那么针对 创建交易时使用该客户就会无法判断到底是哪一个客户,会报异常,所以创建客户尽量避免重名客户存在;其实修改也很简单, 只需要在保存时通过客户姓名判断该客户是否存在即可;判断需要注意:线索转换会创建客户、修改客户也可以修改客户用户名,这些地方都需要判断;