营销管理模块总结
1. Maven
依赖管理,自动构建。
依赖管理:pom.xml中添加各种jar包的依赖。
自动构建:install安装,自动的编译,测试,安装到本地仓库。
SSM整合:
spring + mybatis
父子级容器问题,spring容器父容器扫描service,springmvc子容器扫描controller
扫描service
-
管理数据源 dbcp连接池管理数据源
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="10"/>
<property name="maxIdle" value="5"/>
</bean>
-
管理SqlSessionFactory
<!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置mybatis核心配置文件 -->
<property name="configLocation" value="classpath:conf.xml"/>
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--数据库方言-->
<prop key="helperDialect">mysql</prop>
<!--分页合理化-->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
-
提供了包扫描器,扫描mapper接口所在的包,自动生成代理对象,加载同一包下的mapper.xml文件
<!-- Mapper代理的方式开发方式二,扫描包方式配置代理
扫描mapper接口并生成代理对象同时自动加载mapper.xml文件
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置Mapper接口 -->
<property name="basePackage" value="com.galaxy.crm.mapper"/>
</bean>
-
spring帮mybatis管理了事务
<!--管理式事务管理-->
<bean id="myHibTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
4.1 注解形式
<!--开启注解型事务管理-->
<tx:annotation-driven transaction-manager="myHibTransactionManager"/>
4.2 xml方式(自定义)
//xml方式配置事务管理
//定义切面
<tx:advice id="txMangener" transaction-manager="myHibTransactionManager">
<!--限定方法的命名规则-->
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*" propagation="NOT_SUPPORTED" read-only="true"/>
<tx:method name="update*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="mycut" expression="execution(* com.galaxy.crm.service.impl.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txMangener" pointcut-ref="mycut"></aop:advisor>
</aop:config>
3.web.xml中
3.1 添加监听器 监听tomcat启动状态,加载spring配置文件
<!--1.加载application.xml文件
1.1配置监听器
1.2配置全局初始化参数
-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
3.2 添加springMVC的中央控制器,并设置开启tomcat自动启动,加载springmvc配置文件,设置dispatcherServlet处理所有请求,静态资源被拦截了
<!--
2.加载springmvc.xml
2.1配置DispatcherServlet
-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--
/会拦截所有的请求(包含静态资源),一旦是静态资源,是没有对应的处理器处理的,所以就是404
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
3.3添加utf-8编码过滤器,解决post请求接收中文乱码
<!-- 配置字符集过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!--拦截所有的URL请求 -->
</filter-mapping>
3.4 添加方法过滤器,让springMVC能接收put,delete请求,处理restful请求风格
<!--配置PUT和 DELETE请求过滤器-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.springMVC.xml中
-
扫描controller
-
配置处理器映射器及处理器适配器(如果不配置,@ResponseBody无效)
-
配置视图解析器
-
使用默认的servlet处理未映射的资源,放行静态资源
<!--扫描@controller注解-->
<context:component-scan base-package="com.galaxy.crm.controller" />
<mvc:annotation-driven></mvc:annotation-driven>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
<!--使用默认的servlet来处理映射不到的请求
放行静态资源
-->
<mvc:default-servlet-handler/>
5.Conf.xml
因为本身conf.xml中的配置都被spring管理了,所以在这只配置别名即可
<configuration>
<typeAliases>
<package name="com.galaxy.crm.bean"></package>
</typeAliases>
</configuration>
登陆:
在用户登陆成功后,在main.jsp页面中发送ajax请求。根据用户角色不同,登陆成功后显示不同的树状结构。
RBAC思想设计数据库
通过t_user -->t_sysRight 四表关联,查询用户对应的所有权限
前台:使用easyUI-lay进行布局,左侧使用ztree加载后台返回的简单json数据
easyUI单页面无刷新,里面的组件都是自动发送ajax请求与后台交互,局部刷新页面
销售机会管理/客户开发计划分页:
因为datagrid组件会自动计算分页,通过pageNation分页条。所以我们只需要返回datagrid规定格式的json即可自动完成分页。{“total”:总条数,”rows”:分页数据集合}
所以后台封装了DatagridResult用户于datagrid组件进行交互
借助了pageHelper分页插件完成了分页查询功能
销售机会管理
saleChance/list/0 devResult=0 检索所有未开发的机会
客户开发计划
saleChance/list/1 state=1 检索已分配的机会
又因为都有查询条件
所以后台使用tsaleChance对象接收前台的查询条件参数,后台通过自定义mapper,动态sql的方式完成了查询工作
销售机会管理的增删改查:
插入:
弹出层:easyui-dialog
下拉框:easyui-combobox
文本验证框: easyui-validatebox
数字验证框:easyui-numberbox
表单:easyui-form
先处理combobox发送的url,检索所有的客户经理显示到下拉列表中
输入内容后,点击提交
调用$(“#form”).form(“submit”,{
onSubmit:提交前校验 function(){
Return true/false
}
Success:function(data){根据data局部刷新页面(关闭对话框dialog,调用datagrid(“reload”)刷新成最新数据显示)}
})
修改:
点击修改按钮,会调用$(“form”).form(“load”,row);根据选中的行,回显数据。无须通过后台查询
如果修改了的是没有分配的机会,给他分配了一个客户经理
后台直接把state=1设好就行
删除:
可以删除一条或多条,前台通过js拼接ids字符串如1,2,3,4,5
后台将字符串变List<Interger>格式,调用逆向工程的andIdIn(list)创建条件删除数据
删除完成后,同样刷新datagrid显示最新数据
客户开发计划增删改查:
查询
客户开发计划
saleChance/list/1 state=1 检索已分配的机会
点击开发按钮,新增选项卡并且请求?saleChanceId=xx
在新增的选项卡中,通过${param.saleChanceId}取到对应的参数
在页面中,ajax发送了两个请求,一个是findById根据id检索销售机会,一个是GET cusDevPlan/33根据33外键检索所有的销售计划
增删改:
Restful风格发送请求,后台处理,根据前台请求成功的回调函数,决定返回的内容
增改:
返回数据库最新的数据
在逆向工程的insert方法中添加了查询主键,插入后将id主键返回给参数,
Controller直接将参数通过自定义的json转换,转换日期为规定格式字符串响应给前台。
fastJson技术。
删:
只能单条删除,后台接到delete方式的请求,根据id删除数据,返回{success:true/false}
开发成功/中止开发
接收请求,修改devResult为接收的参数,返回{success:true/false},前台openTab(),closeTab()将当前选项卡关闭,并重新打开一个客户开发计划的选项卡来查看最新的数据。
大家的总结文档:需要详细的实现代码
Ajax异步请求
同步请求,异步请求
一车道 多车道
同步请求:返回一整个jsp页面 交互比较复杂 ,用户体验差
异步请求:返回json数据 前台在请求成功的回调中通过js修改dom节点。 即使请求没有处理完,不妨碍页面元素加载的,但是就是显示的内容没有及时的修改。增加了用户体验。
前台发送ajax的形式:
\1. 自己发
$.ajax({
data:
Type:
Url:
Success:function(data){局部刷新}
})
$.get() 发送ajax的get请求
$.post() 发送ajax的post请求
$.load() 异步加载服务器资源的时候使用
后台处理:
后台响应json数据即可,具体json是啥,分析前台的success回调中如何处理的逻辑来决定json的格式
能转换json:
\1. @ResponseBody 返回对象自动转换json
\2. 自定义转换 fastJson,通过response.getWriter().print(json字符串)
\2. 用前端框架控件发
Datagrid form combobox......
200 请求成功
500 服务器内部错误 后台控制台会报错
404 资源为找到 1.请求处理了但是返回的内容不能找到跳转的路径2.请求没接收到(断点调试)
405 请求方式不匹配 检查前后台请求方式处理方式是否一致
400 参数不能正常映射 1.检查参数名称2.检查参数类型(String--->Date 后台加入@DateTimeFormat注解)