CRM客户管理系统

CRM项目的核心业务:

1)CRM项目的简介:Customer Relationship Management 客户关系管理系统
    企业级应用,传统应用;给销售或者贸易型公司使用,在市场,销售,服务等各个环节中维护客户关系,
    CRM项目的宗旨:增加新客户,留住老客户,把已有客户转化为忠诚客户。
  2)CRM是一类项目,我们的CRM是给一个大型的进出口贸易公司来使用的,做大宗商品的进出口贸易;商品是受国家管制的。
  3)CRM项目的核心业务:
    系统管理功能:不是直接处理业务数据,为了保证业务管理的功能正常安全运行而设计的功能。
                用户登录,安全退出,登录验证等
		  	    给超级管理员,开发和运维人员使用。
    业务管理功能:处理业务数据
                 市场活动:市场部,设计市场活动营销活动
		  	     线索:销售部(初级销售),增加线索
		         客户和联系人:销售部(高级销售),有效地区分和跟踪客户和联系人.
                 交易:销售部(高级销售),更好地区分和统计交易的各个阶段。
		         售后回访:客服部,妥善安排售后回访。主动提醒。
                 统计图表:管理层,统计交易表中各个阶段数据量。

1. 首页功能

在这里插入图片描述

2. 用户登录

在这里插入图片描述

1,同步请求和异步请求的区别:
  同步请求:浏览器窗口发出的请求,响应信息返回到浏览器窗口,所以会进行全局刷新。
  异步请求:ajax发出的请求,响应信息返回到ajax的回调函数,既可以进行全局刷新,也可以进行局部刷新。

  小结:如果需要进行全局刷新,推荐使用同步请求,当然也可以使用异步请求;
        如果需要进行局部刷新,只能使用异步请求;
	如果既可能进行全局刷新,也可能进行局部刷新,也是只能使用异步请求。

2,mybatis逆向工程:
  1)简介:根据表生成mapper层三部分代码:实体类,mapper接口,映射文件。
  2)使用mybatis逆向工程:
    a)创建工程:crm-mybatis-generator
    b)添加插件:
      <!--myBatis逆向工程插件-->
    <plugin>
	<groupId>org.mybatis.generator</groupId>
	<artifactId>mybatis-generator-maven-plugin</artifactId>
	<version>1.3.2</version>
	<configuration>
	    <verbose>true</verbose>
	    <overwrite>true</overwrite>
	</configuration>
    </plugin>
   c)添加配置文件:
     数据库连接信息
     代码保存的目录
     表的信息
   d)运行mybatis的逆向工程,根据指定表生成java代码,保存到指定的目录中。

3,使用jquery获取指定元素的指定属性的值:
  选择器.attr("属性名");//用来获取那些值不是true/false的属性的值.
  选择器.prop("属性名");//用来获取值是true/false的属性的值.例如:checked,selected,readonly,disabled等。
1,把控制层(controller)代码中处理好的数据传递到视图层(jsp),使用作用域传递:
   pageContext:用来在同一个页面的不同标签之间传递数据。
   request:在同一个请求过程中间传递数据。
   session: 同一个浏览器窗口的不同请求之间传递数据。
   application:所有用户共享的数据,并且长久频繁使用的数据。

   <c:aaaa>
   <c:bbbb>

2,jquery事件函数的用法:
   选择器.click(function(){//给指定的元素添加事件
      //js代码
   });

   选择器.click();//在指定的元素上模拟发生一次事件

3,记住密码:
   访问:login.jsp---->后台:.html:如果上次记住密码,自动填上账号和密码;否则,不填。
                             如何判断上次是否记住密码?`
			     --上次登录成功,判断是否需要记住密码:如果需要记住密码,则往浏览器写cookie;否则,删除cookie。
			                     而且cookie的值必须是该用户的loginAct和loginPwd
			     --下次登录时,判断该用户有没有cookie:如果有,则自动填写账号和密码;否则,不写。
			                     而且填写的是cookie的值.
                  ----->浏览器显示
  获取cookie:
  1,使用java代码获取cookie:
    Cookie[] cs=request.getCookies();
    for(Cookie c:cs){
	if(c.getName().equals("loginAct")){
	    String loginAct=c.getValue();
	}else if(c.getName().equals("loginPwd")){
	    String loginPwd=c.getValue();
	}
    }
  2,使用EL表达式获取cookie:
    ${cookie.loginAct.value}
    ${cookie.loginPwd.value}

3. 安全退出

在这里插入图片描述

4. 登录验证

1,登录验证:

   1)过滤器:
     a)implements Filter{
         --init
	 	 --doFilter
		 --destroy
       }
     b)配置过滤器:web.xml
   2)拦截器:
     a)提供拦截器类:implements HandlerInterceptor{
			  --pre
			  --post
			  --after
                     }
     b)配置拦截器:springmvc.xml

5. 创建市场活动

2,页面切割技术:
  1)<frameset><frame><frameset>:用来切割页面.
                <frameset cols="20%,60%,20%" rows="10%,80%,10%">
    <frame>:显示页面.
                <frame src="url">

		<frameset cols="20%,60%,20%">
			<frame src="url1" name="f1">
			<frame src="url2" name="f2">
			<frame src="url3" name="f3">
		</frameset>

             每一个<frame>标签就是一个独立的浏览器窗口。

	     <a href="url" target="f3">test</a>
  2)<div><iframe><div>:切割页面。
            <div style="height:10%;width=20%">
			<iframe>:显示页面。
            	<div style="height:10%;width=20%">
			<iframe href="url">
	 </div>
3,创建市场活动:
  
  模态窗口:模拟的窗口,本质上是<div>,通过设置z-index大小来实现的;
            初始时,z-index初始参数是<0,所以不显示;
	    	需要显示时,z-index值设置成>0即可。

	   		bootstrap来控制z-index的大小。
  控制模态窗口的显示与隐藏:
            1)方式一:通过标签的属性data-toggle="modal" data-target="模态窗口的id"
	    	2)方式二:通过js函数控制:
	          选择器(选中div).modal("show");//显示选中的模态窗口
		      选择器(选中div).modal("hide");//关闭选中的模态窗口
            3)方式三:通过标签的属性data-dismiss=""
		      点击添加了data-dismiss=""属性的标签,自动关闭该标签所在的模态窗口。
  模态窗口的意义:
            window.open("url","_blank");
	    模态窗口本质上就是原来页面中的一个<div>,只有一个页面;所有的操作都是在同一个页面中完成。
	    
	    
日历插件:bootstrap-datetimepicker
    前端插件使用步骤:
    1)引入开发包:.js,.css
    	下载开发包,拷贝到项目webapp目录下
    	把开发包引入到jsp文件中:<link><script>
 	2)创建容器:<input type="text"><div>
 	3)当容器加载完成之后,对容器调用工具函数.
     

在这里插入图片描述

6.查询市场活动

在这里插入图片描述

7.删除市场活动

1,在页面中给元素添加事件语法:
  1)使用元素的事件属性:onxxxx="f()"
  2)使用jquery对象:选择器.xxxx(function(){
                        //js代码
						//this
                    });
       *只能给固有元素添加事件
	   固有元素:当调用事件函数给元素添加事件时,如果元素已经生成,则这些元素叫做固有元素;
       动态生成的元素:当调用事件函数给元素添加事件时,如果元素还没有生成,后来生成的元素叫做动态生成的元素。
  3)使用jquery的on函数:父选择器.on("事件类型",子选择器,function(){
                              //js代码
			      			  //this
                        });

       父元素:必须是固有元素,可以直接父元素,也可以是间接父元素.
	   		 原则固有父元素范围越小越好.
	   事件类型:跟事件属性和事件函数一一对应。
	   子选择器:目标元素,跟父选择器构成一个父子选择器
	   *不但能给固有元素添加事件,还能够给动态生成的元素添加事件。

2,js中截取字符串:
  str.substr(startIndex,length);//从下标为startIndex的字符开始截取,截取length个字符
  str.substring(startIndex,endIndex)//从下标为startIndex的字符开始截取,截取到下标是endIndex的字符
  var str="beijing";
  str.substr(2,3);//iji
  str.substring(2,3);//ij

3,ajax向后台发送请求时,可以通过data提交参数,data的数据格式有三种格式:
  1)data:{
       k1:v1,
       k2:v2,
       ....
    }
    *劣势:只能向后台提交一个参数名对应一个参数值的数据,
           不能向后台提交一个参数名对应多个参数值的数据。
	   只能向后台提交字符串数据
     优势:操作简单
  2)data:k1=v1&k2:v2&....
    *优势:不但能够向后台提交一个参数名对应一个参数值的数据,
           还能向后台提交一个参数名对应多个参数值的数据。
     劣势:操作麻烦
           只能向后台提交字符串数据
  3)data:FormData对象
     优势:不但能提交字符串数据,
            还能提交二进制数据
     劣势:操作更复杂

在这里插入图片描述

8.修改市场活动

在这里插入图片描述

9. 批量导出市场活动

1,封装参数:
   1)如果做查询条件,或者参数之间不是属于一个实体类对象,封装成map
   2)如果做写数据,并且参数本来就是属于一个实体类对象,封装成实体类对象.

2,使用jquery获取或者设置指定元素的value属性值:
   获取:选择器.val();
   设置:选择器.val(属性值);

3,导出市场活动:
   1)"批量导出"按钮添加单击事件,发送导出请求
   2)查询所有的市场活动
   3)创建一个excel文件,并且把市场活动写到excel文件中
   4)把生成的excel文件输出到浏览器(文件下载)

      技术准备:
       1)使用java生成excel文件:iText,apache-poi

     关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,
	 程序员通过操作这些类达到操作办公文档目的。
	 
	 文件---------HSSFWorkbook
	 页-----------HSSFSheet
	 行-----------HSSFRow
     列-----------HSSFCell
	 样式---------HSSFCellStyle

	 使用apache-poi生成excel:
	     a)添加依赖:
	            <dependency>
		      <groupId>org.apache.poi</groupId>
		      <artifactId>poi</artifactId>
		      <version>3.15</version>
		    </dependency>
	     b)使用封装类生成excel文件:
	       
       2)文件下载:
         filedownloadtest.jsp
	 ActivityController
	     |->fileDownload()

	 *所有文件下载的请求只能发送同步请求。

在这里插入图片描述

10.导入市场活动

1,导入市场活动:
  
  1)把用户计算机上的excel文件上传到服务器(文件上传)
  2)使用java解析excel文件,获取excel文件中的数据
  3)把解析出来的数据添加数据库中
  4)返回响应信息

  技术准备:
      1)文件上传:
        fileuploadtest.jsp
	ActivityController
	        |->fileUpload()
      2)使用java解析excel文件:iText,apache-poi
        
	关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,
	                            程序员通过操作这些类达到操作办公文档目的。
	 文件---------HSSFWorkbook
	 页-----------HSSFSheet
	 行-----------HSSFRow
     列-----------HSSFCell
        

 2.文件上传的表单三个条件:
    1.表单组件标签必须用:<input type="file">
      <input type="text|password|radio|checkbox|hidden|button|submit|reset|file">
                      <select>,<textarea>2.请求方式只能用:post
      get:参数通过请求头提交到后台,参数放在URL后边;只能向后台提交文本数据;对参数长度有限制;数据不安全;效率高
      post:参数通过请求体提交到后台;既能能提交文件数据,又能够提交二进制数据;理论上对参数长度没有限制;相对安全;效率相对较低
    3.表单的编码格式只能用:multipart/form-data
      根据HTTP协议的规定,浏览器每次向后台提交参数,都会对参数进行统一编码;默认采用的编码格式是urlencoded,这种编码格式只能对文本数据进行编码;
      浏览器每次向后台提交参数,都会首先把所有的参数转换成字符串,然后对这些数据统一进行urlencoded编码;
      文件上传的表单编码格式只能用multipart/form-data:enctype="multipart/form-data"

在这里插入图片描述

11.查看市场活动明细

1,使用标签保存数据,以便在需要的时候能够获取到这些数据:
   
   给标签添加属性:
       如果是表单组件标签,优先使用value属性,只有value不方便使用时,使用自定义属性;
       如果不是表单组件标签,不推荐使用value,推荐使用自定义属性。

   获取属性值时:
       如果获取表单组件标签的value属性值:dom对象.value
                                         jquery对象.val()
       如果自定义的属性,不管是什么标签,只能用:jquery对象.attr("属性名");

       <a style="text-decoration: none; cursor: pointer;" onclick="">ii测试03_2</a>

       window.location.href='workbench/activity/detailActivity.do?id=74f60cc6f64c452fbf02c1aaa3b7e2fb

在这里插入图片描述

12.添加市场活动备注

1,添加市场活动备注:

  jsp的运行原理:
  xxx.jsp:1)、tocmat中运行:
              把xxx.jsp翻译成一个servlet,
	      运行servlet,运行的结果是一个html网页
	      把html网页输出到浏览器
	     2)、html网页在浏览器上运行:
	      先从上到下加载html网页到浏览器,在加载过程中,运行前端代码
	      当页面都加载完成,再执行入口函数.

2,把页面片段显示在动态显示在页面中:
  选择器.html(htmlStr):覆盖显示在标签的内部
  选择器.text(htmlStr):覆盖显示在标签的内部
  选择器.append(htmlStr):追加显示在指定标签的内部的后边
   <div id="myDiv">
      aaaaaaaaa
      bbbbbbbbb
   </div>
   var htmlStr="<p>ccccccccc</p>";
    $("#myDiv").append(htmlStr);
    <div id="myDiv">
      aaaaaaaaa
      bbbbbbbbb
      <p>ccccccccc</p>
   </div>
  选择器.after(htmlStr):追加显示在指定标签的外部的后边
   <div id="myDiv">
      aaaaaaaaa
      bbbbbbbbb
   </div>
   var htmlStr="<p>ccccccccc</p>";
    $("#myDiv").after(htmlStr);
    <div id="myDiv">
      aaaaaaaaa
      bbbbbbbbb
   </div>
   <p>ccccccccc</p>
   选择器.before(htmlStr):追加显示在指定标签的外部的前边
   <div id="myDiv">
      aaaaaaaaa
      bbbbbbbbb
   </div>
   var htmlStr="<p>ccccccccc</p>";
    $("#myDiv").before(htmlStr);
    <p>ccccccccc</p>
    <div id="myDiv">
      aaaaaaaaa
      bbbbbbbbb
   </div>
   
3,给元素扩展属性:html页面是可扩展的标记语言,可以给指定的标签任意扩展属性,只要属性名符合标识符的命名规则即可。
  两个目的:
      1)使用标签保存数据:
        如果是表单组件标签,优先使用value属性,只有value不方便使用时,使用自定义属性;
        如果不是表单组件标签,不推荐使用value,推荐使用自定义属性。
      2)定位标签:
        优先考虑id属性,其次考虑name属性,只有id和name属性都不方便使用时,才考虑使用自定义属性。

在这里插入图片描述

13.删除市场活动备注

在这里插入图片描述

14.修改市场活动备注

在这里插入图片描述

15.创建线索

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值