CRM综合练习:用户模块登录功能
用户模块:登录功能代码实现
修改登录页面
<FORM id=form1 name=form1 action="${ pageContext.request.contextPath }/user_login.action" method=post target="_parent">
编写Action中login方法
- UserAction.java
/**
* 用户登录的方法:login
*/
public String login(){
//调用业务层查询用户:
User existUser = userService.login(user);
if(existUser == null){
//登录失败
//添加错误信息
this.addActionError("用户名或密码错误!");
return LOGIN;
}else{
//登陆成功
// ServletActionContext.getRequest().getSession().setAttribute("existUser", existUser);
ActionContext.getContext().getSession().put("existUser", existUser);
return SUCCESS;
}
}
编写Service实现类
@Override
//业务层用户登陆的方法
public User login(User user) {
user.setUser_password(MD5Utils.md5(user.getUser_password()));
//调用DAO
return userDao.login(user);
}
编写DAO实现类
@Override
//DAO中根据用户名和密码进行查询的方法:
public User login(User user) {
List<User> list = (List<User>) this.getHibernateTemplate().find("from User where user_code=? and user_password = ?", user.getUser_code(),user.getUser_password());
if(list.size() > 0){
return list.get(0);
}
return null;
}
配置页面的跳转
struts.xml
<package name="crm" extends="struts-default" namespace="/">
<action name="user_*" class="userAction" method="{1}">
<result name="login">/login.jsp</result>
<result name="success" type="redirect">/index.jsp</result>
</action>
</package>
在页面中显示数据
- 在登录成功的页面上显示用户的信息
top.jsp
当前用户:<s:property value="#session.existUser.user_name"/>
- 在失败的页面上显示错误信息
login.jsp
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:actionerror/>
CRM综合练习:客户管理
客户管理:准备工作
创建表
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
创建实体和映射
- 创建实体
- 创建映射
创建Action
创建Service
创建DAO
配置Action、Service、DAO
跳转到添加页面
修改左侧菜单页面
编写Action中的saveUI的方法
配置Action的跳转
测试跳转
引入数据字典
什么是数据字典
数据字典用来规范某些地方具体值和数据
创建数据字典表
CREATE TABLE `base_dict` (
`dict_id` varchar(32) NOT NULL COMMENT '数据字典id(主键)',
`dict_type_code` varchar(10) NOT NULL COMMENT '数据字典类别代码',
`dict_type_name` varchar(64) NOT NULL COMMENT '数据字典类别名称',
`dict_item_name` varchar(64) NOT NULL COMMENT '数据字典项目名称',
`dict_item_code` varchar(10) DEFAULT NULL COMMENT '数据字典项目(可为空)',
`dict_sort` int(10) DEFAULT NULL COMMENT '排序字段',
`dict_enable` char(1) NOT NULL COMMENT '1:使用 0:停用',
`dict_memo` varchar(64) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`dict_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `base_dict`(`dict_id`,`dict_type_code`,`dict_type_name`,`dict_item_name`,`dict_item_code`,`dict_sort`,`dict_enable`,`dict_memo`) values ('1','001','客户行业','教育培训 ',NULL,1,'1',NULL),('10','003','公司性质','民企',NULL,3,'1',NULL),('12','004','年营业额','1-10万',NULL,1,'1',NULL),('13','004','年营业额','10-20万',NULL,2,'1',NULL),('14','004','年营业额','20-50万',NULL,3,'1',NULL),('15','004','年营业额','50-100万',NULL,4,'1',NULL),('16','004','年营业额','100-500万',NULL,5,'1',NULL),('17','004','年营业额','500-1000万',NULL,6,'1',NULL),('18','005','客户状态','基础客户',NULL,1,'1',NULL),('19','005','客户状态','潜在客户',NULL,2,'1',NULL),('2','001','客户行业','电子商务',NULL,2,'1',NULL),('20','005','客户状态','成功客户',NULL,3,'1',NULL),('21','005','客户状态','无效客户',NULL,4,'1',NULL),('22','006','客户级别','普通客户',NULL,1,'1',NULL),('23','006','客户级别','VIP客户',NULL,2,'1',NULL),('24','007','商机状态','意向客户',NULL,1,'1',NULL),('25','007','商机状态','初步沟通',NULL,2,'1',NULL),('26','007','商机状态','深度沟通',NULL,3,'1',NULL),('27','007','商机状态','签订合同',NULL,4,'1',NULL),('3','001','客户行业','对外贸易',NULL,3,'1',NULL),('30','008','商机类型','新业务',NULL,1,'1',NULL),('31','008','商机类型','现有业务',NULL,2,'1',NULL),('32','009','商机来源','电话营销',NULL,1,'1',NULL),('33','009','商机来源','网络营销',NULL,2,'1',NULL),('34','009','商机来源','推广活动',NULL,3,'1',NULL),('4','001','客户行业','酒店旅游',NULL,4,'1',NULL),('5','001','客户行业','房地产',NULL,5,'1',NULL),('6','002','客户信息来源','电话营销',NULL,1,'1',NULL),('7','002','客户信息来源','网络营销',NULL,2,'1',NULL),('8','003','公司性质','合资',NULL,1,'1',NULL),('9','003','公司性质','国企',NULL,2,'1',NULL);
客户表和字典表的关系分析
创建字典的实体和映射
- 创建实体
- 创建映射
修改字典和客户的关系映射
- 修改了客户的实体
- 修改客户的映射
将映射文件交给Spring
在添加页面上异步加载字典数据
创建字典的Action、Service、DAO
- 编写DAO
- 编写Service
- 编写Action
将字典类交给Spring
引入jquery的js(在添加页面上)
编写异步加载的方法
<script type="text/javascript">
$(function(){
// 页面加载函数就会执行:
// 页面加载,异步查询字典数据:
// 加载客户来源
$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"002"},function(data){
// 遍历json的数据:
$(data).each(function(i,n){
$("#cust_source").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
});
},"json");
});
</script>
编写Action
- 引jar包
package com.lele.crm.web.action;
import java.io.IOException;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import com.lele.crm.domain.BaseDict;
import com.lele.crm.service.BaseDictService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import net.sf.json.JSONArray;
import net.sf.json.JsonConfig;
/**
* 字典的Action的类
* @author lele
*
*/
public class BaseDictAction extends ActionSupport implements ModelDriven<BaseDict> {
//模型驱动使用的对象
private BaseDict baseDict = new BaseDict();
@Override
public BaseDict getModel() {
return baseDict;
}
//注入Service
private BaseDictService baseDictService;
public void setBaseDictService(BaseDictService baseDictService) {
this.baseDictService = baseDictService;
}
/**
* 根据类型名称查询字典的方法:findByTypeCode
* @throws IOException
*/
public String findByTypeCode() throws IOException{
System.out.println("BaseDictAction中的findByTypeCode方法执行了...");
//调用业务层查询:
List<BaseDict> list = baseDictService.findByTypeCode(baseDict.getDict_type_code());
//将list转成JSON。----jsonlib fastjson
/**
* JSONConfig:转JSON的配置对象
* JSONArray :将数组和list集合转成JSON
* JSONObject:将数组和Map集合转成JSON
*/
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes(new String[]{"dict_sort","dict_enable","dict_memo"});
JSONArray jsonArray = JSONArray.fromObject(list,jsonConfig);
System.out.println(jsonArray.toString());
//将JSON打印到页面
ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
ServletActionContext.getResponse().getWriter().println(jsonArray.toString());
return NONE;
}
}
编写Service
public class BaseDictServiceImpl implements BaseDictService {
//注入DAO
private BaseDictDao baseDictDao;
public void setBaseDictDao(BaseDictDao baseDictDao) {
this.baseDictDao = baseDictDao;
}
@Override
public List<BaseDict> findByTypeCode(String dict_type_code) {
return baseDictDao.findByTypeCode(dict_type_code);
}
}
编写DAO
public class BaseDictDaoImpl extends HibernateDaoSupport implements BaseDictDao {
@Override
//根据类型编码查询字典数据
public List<BaseDict> findByTypeCode(String dict_type_code) {
return (List<BaseDict>) this.getHibernateTemplate().find("from BaseDict where dict_type_code = ?", dict_type_code);
}
}
加载其他字典项数据
<script type="text/javascript">
$(function(){
// 页面加载函数就会执行:
// 页面加载,异步查询字典数据:
// 加载客户来源
$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"002"},function(data){
// 遍历json的数据:
$(data).each(function(i,n){
$("#cust_source").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
});
},"json");
$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"006"},function(data){
// 遍历json的数据:
$(data).each(function(i,n){
$("#cust_level").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
});
},"json");
$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"001"},function(data){
// 遍历json的数据:
$(data).each(function(i,n){
$("#cust_industry").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
});
},"json");
});
</script>
保存数据到数据库中
修改添加页面
- 修改表单项名称
编写Action
编写Service
编写DAO
添加事务
CRM综合练习:客户管理分页查询客户
查询客户(分页)
修改menu.jsp
编写Action中findAll的方法
public String findAll(){
//接收参数:分页参数
//最好使用DetachedCriteria对象(条件查询--带分页)
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
//调用业务层查询
PageBean<Customer> pageBean = customerService.findByPage(detachedCriteria,currPage,pageSize);
ActionContext.getContext().getValueStack().push(pageBean);
return "findAll";
}
编写Service
//业务层分页查询客户的方法
public PageBean<Customer> findByPage(DetachedCriteria detachedCriteria, Integer currPage,Integer pageSize) {
PageBean<Customer> pageBean = new PageBean<Customer>();
//封装当前页面
pageBean.setCurrPage(currPage);
//封装每页显示的记录数:
pageBean.setPageSize(pageSize);
//封装总记录数
//调用DAO
Integer totalCount = customerDao.findCount(detachedCriteria);
pageBean.setTotalCount(totalCount);
//封装总页数
Double tc = totalCount.doubleValue();
Double num = Math.ceil(tc/pageSize);
pageBean.setTotalPage(num.intValue());
//封装每页显示的数据的集合
Integer begin = (currPage - 1) * pageSize;
List<Customer> list = customerDao.findByPage(detachedCriteria,begin,pageSize);
pageBean.setList(list);
return pageBean;
}
编写DAO
//DAO中带条件统计个数
public Integer findCount(DetachedCriteria detachedCriteria) {
//select count(*) from xxx where 条件;
detachedCriteria.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
if(list.size()>0){
return list.get(0).intValue();
}
return null;
}
@Override
//DAO中分页查询客户的方法
public List<Customer> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
detachedCriteria.setProjection(null);
return (List<Customer>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
}
配置页面跳转
在list.jsp中显示数据(分页显示)
<DIV
style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right">
共[<B><s:property value="totalCount"/></B>]条记录,[<B><s:property value="totalPage"/></B>]页
,每页显示
<select name="pageSize" onchange="to_page()">
<option value="3" <s:if test="pageSize == 3">selected</s:if>>3</option>
<option value="5" <s:if test="pageSize == 5">selected</s:if>>5</option>
<option value="10" <s:if test="pageSize == 10">selected</s:if>>10</option>
</select>
条
<s:if test="currPage != 1">
[<A href="javascript:to_page(1)">首页</A>]
[<A href="javascript:to_page(<s:property value="currPage-1"/>)">前一页</A>]
</s:if>
<B>
<s:iterator var="i" begin="1" end="totalPage">
<s:if test="#i == currPage">
<s:property value="#i"/>
</s:if>
<s:else>
<a href="javascript:to_page(<s:property value="#i"/>)"><s:property value="#i"/></a>
</s:else>
</s:iterator>
</B>
<s:if test="currPage != totalPage">
[<A href="javascript:to_page(<s:property value="currPage+1"/>)">后一页</A>]
[<A href="javascript:to_page(<s:property value="totalPage"/>)">尾页</A>]
</s:if>
到
<input type="text" size="3" id="page" name="currPage" />
页
<input type="button" value="Go" onclick="to_page()"/>
</DIV>