搭建客户拜访表的开发环境
1、客户关系拜访表是该系统的用户和客户之间的关系建立表
用户可以拜访多个客户
客户也可以被多个用户拜访
所以:用户和客户之间应该是多对多的关系,那么客户拜访表就是用户和客户直接的中间表
正常的情况下,在用户和客户中添加set集合,在映射的配置文件中配置<set>标签即可
但是现在客户拜访中间表中存在其他的字段,默认的情况下,中间表只能维护外键,而不能维护其他的字段,所以需要把多对多拆开成多个一对多
2、用户与客户拜访表是一对多的关系
3、客户与客户拜访表是一对多的关系
4、创建客户拜访表的实体类和映射配置文件
5、编写客户拜访的Action等类和完成配置
Action编写@Controller(value="visitAction")
@Scope(value="prototype")
Service编写@Service(value="visitService")
@Transactional
Dao编写@Repository(value="visitDao")
重点是Dao中注入SessionFactory对象
@Resource(name="sessionFactory")
public void set2SessionFactory(SessionFactory sessionFactory){
//关键,调用父类的方法
super.setSessionFactory(sessionFactory);
}
客户拜访列表查询功能
1、查询我的客户拜访记录
登录的用户,点击客户拜访列表,查询该用户下的所有的拜访记录
通过用户的主键查询该用户下的所有的拜访记录
新增客户拜访记录功能
1、点击新增客户拜访功能菜单,跳转到新增页面,输入信息,保存数据
从HttpSession中获取到用户的信息,设置到拜访记录中,保存到数据库中
按条件查询客户信息列表功能
添加开始和结束日期的选项
$(function(){
//给beginDate和endDate绑定日期控件的方法
$('#beginDate').datepick({dateFormat: 'yy-mm-dd'});
$('#endDate').datepick({dateFormat: 'yy-mm-dd'});
});
<TD>选择日期:</TD>
<TD>
<INPUT class=textbox id="beginDate" style="WIDTH: 80px" maxLength=50 name="beginDate">
至
<INPUT class=textbox id="endDate" style="WIDTH: 80px" maxLength=50 name="endDate">
</TD>
客户来源统计
统计客户的来源,即该来源下有多少个客户
SQL语句:SELECT d.dict_item_name,COUNT(*) FROM cst_customer c,base_dict d WHERE d.dict_id = c.cust_source GROUP BY d.dict_id;
HQL语句:String hql= "select c.source.dict_item_name,count(*) from Customer c inner join c.source group by c.source";
用户登录的拦截器
拦截器的功能实现
1、功能:如果用户没有登录,不能操作后台的功能
2、代码
public class UserInterceptor extends MethodFilterInterceptor{
private static final long serialVersionUID = -6298831508261295982L;
/**
* 拦截目标Action的方法
*/
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//获取session
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
if(user == null){
return "login";
}
//执行下一个拦截器
return invocation.invoke();
}
}
3、配置
<interceptors>
<interceptor name="userInterceptor" class="my.web.interceptor.UserInterceptor"></interceptor>
</interceptors>
<!-- login,regist,checkCode 方法不拦截 -->
<interceptor-ref name="userInterceptor">
<param name="excludeMethods">login,regist,checkCode</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
@Controller(value="visitAction")
@Scope(value="prototype")
public class VisitAction extends BaseAction implements ModelDriven<Visit>{
private static final long serialVersionUID = 466690322690214519L;
private Visit visit = new Visit();
public Visit getModel() {
return visit;
}
@Resource(name="visitService")
private VisitService visitService;
private String beginDate;
private String endDate;
public void setBeginDate(String beginDate) {
this.beginDate = beginDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
/**
* 分页的查询
* 查询客户的拜访记录,根据用户的主键查询
* select * from sale_visit where visit_user_id = ?
*/
public String findByPage(){
//先获取当前登录的用户
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
//判断
if(user == null){
return LOGIN;
}
//查询该用户下所有的拜访记录
DetachedCriteria criteria = DetachedCriteria.forClass(Visit.class);
//拼接查询的条件
if(beginDate !=null && !beginDate.trim().isEmpty()){
criteria.add(Restrictions.ge("visit_time",beginDate));
}
//select * from xx where visit_time >=? and visit_time <=?
if(endDate !=null && !endDate.trim().isEmpty()){
criteria.add(Restrictions.le("visit_time",endDate));
}
//添加查询的条件
criteria.add(Restrictions.eq("user.user_id", user.getUser_id()));
//分页查询
PageBean<Visit> page = visitService.findByPage(this.getPageCode(),this.getPageSize(),criteria);
this.setVs("page", page);
return "page";
}
/**
* 保存拜访记录
* @return
*/
public String save(){
//把用户获取到,设置到当前的拜访记录中,再保存
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
//判断
if(user == null){
return LOGIN;
}
//设置
visit.setUser(user);
//保存数据
visitService.save(visit);
return "save";
}
}
@Repository(value="visitDao")
public class VisitDaoImpl extends BaseDaoImpl<Visit> implements VisitDao {
/*//注入sessionFactory
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;*/
/* 很麻烦 因为 base不能用了
* @
private HibernateTemplate hibernateTemplate;*/
@Resource(name="sessionFactory")
public void set2SessionFactory(SessionFactory sessionFactory){
//关键,调用父类的方法
super.setSessionFactory(sessionFactory);
}
}
@Service(value="visitService")
@Transactional
public class VisitServiceImpl implements VisitService{
@Resource(name="visitDao")
private VisitDao visitDao;
/**
* 用户拦截器,判断用户是否已经登录,如果登录,执行下一个拦截器
* 如果没有登录,返回到登录页面(不能对所有的请求都拦截,login和regist方法不能拦截)
* 继承指定拦截器
* @author Administrator
*
*/
public class UserInterceptor extends MethodFilterInterceptor{
private static final long serialVersionUID = -6298831508261295982L;
/**
* 拦截目标Action的方法
*/
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//获取session
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
if(user == null){
return "login";
}
//执行下一个拦截器
return invocation.invoke();
}
}
<!-- 引入默认的拦截器 -->
<interceptor-ref name="defaultStack">
<!-- 设置单个上传文件的大小 -->
<param name="fileUpload.maximumSize">2097152</param>
<!-- 决定上传文件的类型 -->
<param name="fileUpload.allowedExtensions">.jpg,.txt</param>
</interceptor-ref>
</action>
<!-- 配置客户的模块 -->
<action name="user_*" class="userAction" method="{1}">
<result name="loginOK" type="redirect">/index.jsp</result>
<!-- login,regist,checkCode 方法不拦截 -->
<interceptor-ref name="userInterceptor">
<param name="excludeMethods">login,regist,checkCode</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<!-- 字典模块 -->
<action name="dict_*" class="dictAction" method="{1}">
<interceptor-ref name="userInterceptor"/>
<interceptor-ref name="defaultStack"/>
</action>
<!-- 联系人模块 -->
<action name="linkman_*" class="linkmanAction" method="{1}">
<result name="page">/jsp/linkman/list.jsp</result>
<interceptor-ref name="userInterceptor"/>
<interceptor-ref name="defaultStack"/>
</action>