CRM客户关系管理系统开发第十八讲——实现客户拜访记录管理模块中保存客户拜访记录的功能
跳轉(zhuǎn)到客戶拜訪記錄添加頁面
要想實(shí)現(xiàn)客戶拜訪記錄管理模塊中的保存客戶拜訪記錄的功能,首要前提就是點(diǎn)擊新增客戶拜訪超鏈接之后要能跳轉(zhuǎn)到客戶拜訪記錄添加頁面。前面我們都做完兩個(gè)模塊了,做到這一點(diǎn)還不是依葫蘆畫瓢、分分鐘的事!
在左側(cè)的菜單頁面(menu.jsp)中修改提交路徑
編寫SaleVisitAction中的saveUI方法
首先,在SaleVisitAction類中編寫一個(gè)如下的saveUI方法。
/** 跳轉(zhuǎn)到拜訪記錄添加頁面的方法*/ public String saveUI() {return "saveUI"; }該方法寫的特別簡(jiǎn)單,就返回了一個(gè)字符串。我把該方法寫的如此簡(jiǎn)單,也是有一定原因的。試想,在點(diǎn)擊新增客戶拜訪超鏈接跳轉(zhuǎn)到客戶拜訪記錄添加頁面之后,所拜訪的客戶以及業(yè)務(wù)員名稱下拉列表中的數(shù)據(jù)要能立馬加載出來。
那么問題來了,所拜訪的客戶以及業(yè)務(wù)員名稱下拉列表中的數(shù)據(jù)從何而來呢?傳統(tǒng)的方式是在Action的方法里面編寫代碼,從客戶表以及用戶表中查詢到那些需要的數(shù)據(jù),然后在客戶拜訪記錄添加頁面上用下拉列表給展示出來,注意這是同步查詢。除了這種辦法之外,還有沒有其他辦法呢?其實(shí)還有一種辦法,我們可以異步去查詢客戶表以及用戶表中的數(shù)據(jù),就是在客戶拜訪記錄添加頁面跳轉(zhuǎn)過來以后,在加載這個(gè)頁面時(shí),就異步去查詢客戶表以及用戶表中的數(shù)據(jù),然后給它加載到相應(yīng)的下拉列表上。很顯然,在這里,我采用的是異步查詢這種方式。
然后,我們還得在Struts2配置文件中(即struts.xml)對(duì)SaleVisitAction進(jìn)行如下的配置,即配置頁面的跳轉(zhuǎn)。
哎呀!我們還沒有這個(gè)客戶拜訪記錄添加頁面啊!那咋辦?沒有就創(chuàng)建一個(gè)唄!
創(chuàng)建客戶拜訪記錄添加頁面
復(fù)制一份聯(lián)系人添加頁面(add.jsp),將其存放到WebContent/jsp/salevisit目錄下,以此作為客戶拜訪記錄添加頁面,并且,咱還要對(duì)該頁面做一個(gè)比較大的修改,先改成下面這樣。
此時(shí),發(fā)布我們的項(xiàng)目到Tomcat服務(wù)器并啟動(dòng),然后訪問該項(xiàng)目的首頁,點(diǎn)擊新增客戶拜訪超鏈接之后就能跳轉(zhuǎn)到客戶拜訪記錄添加頁面了。
編寫代碼實(shí)現(xiàn)保存客戶拜訪記錄的功能
現(xiàn)在終于要寫代碼實(shí)現(xiàn)保存客戶拜訪記錄的功能了!在這之前,我們還要在客戶拜訪記錄添加頁面上異步加載所拜訪客戶以及業(yè)務(wù)員名稱對(duì)應(yīng)的下拉列表中所需數(shù)據(jù)。
在客戶拜訪記錄添加頁面上異步加載數(shù)據(jù)
首先,在客戶拜訪記錄添加頁面上引入jQuery的JS庫文件。然后,在其中編寫異步加載所拜訪客戶以及業(yè)務(wù)員名稱對(duì)應(yīng)的下拉列表中所需數(shù)據(jù)的方法。
接著,就要分別加載所拜訪客戶以及業(yè)務(wù)員名稱對(duì)應(yīng)的下拉列表中所需數(shù)據(jù)了。
異步加載所拜訪客戶對(duì)應(yīng)的下拉列表中的所需數(shù)據(jù)
首先,在CustomerAction類中編寫一個(gè)如下的findAllCustomer方法。
public String findAllCustomer() throws IOException {List<Customer> list = customerService.findAll();//將List集合轉(zhuǎn)成JSONJsonConfig jsonConfig = new JsonConfig();jsonConfig.setExcludes(new String[]{"linkMans", "baseDictSource", "baseDictIndustry", "baseDictLevel"});//轉(zhuǎn)成JSONJSONArray jsonArray = JSONArray.fromObject(list, jsonConfig);ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");ServletActionContext.getResponse().getWriter().println(jsonArray.toString());return NONE; }在編寫以上方法時(shí),一定要注意一點(diǎn),那就是在List集合轉(zhuǎn)JSON數(shù)組時(shí),Customer實(shí)體類中的linkMans這個(gè)屬性不要給轉(zhuǎn)了。如果你轉(zhuǎn)了的話,那么就特別容易弄出死循環(huán)!什么情況下會(huì)出現(xiàn)死循環(huán)呢?假設(shè)現(xiàn)在我們查詢出了所有客戶,接著是不是要把所有客戶的信息給遍歷出來啊!但客戶實(shí)體類里面有一個(gè)聯(lián)系人的集合,json-lib也會(huì)把這個(gè)聯(lián)系人的集合給轉(zhuǎn)成JSON數(shù)組,與此同時(shí),聯(lián)系人實(shí)體類里面又有客戶對(duì)象,json-lib又會(huì)把聯(lián)系人實(shí)體類里面的客戶對(duì)象給轉(zhuǎn)成JSON格式的數(shù)據(jù),客戶實(shí)體類里面又有一個(gè)聯(lián)系人的集合…,如此循環(huán)往復(fù),就出現(xiàn)了死循環(huán)這種情況。所以,不管啥東東在轉(zhuǎn)JSON格式的數(shù)據(jù)時(shí),一定要把一些沒有必要的屬性給它去掉,要不然,很容易出現(xiàn)死循環(huán)這種情況!!!
然后,在CustomerService接口中添加一個(gè)查詢所有客戶的方法聲明,如下:
接著,在以上接口的一個(gè)實(shí)現(xiàn)類(CustomerServiceImpl.java)中實(shí)現(xiàn)查詢所有客戶的方法。
//業(yè)務(wù)層查詢所有客戶的方法 @Override public List<Customer> findAll() {return customerDao.findAll(); }緊接著,發(fā)布我們的項(xiàng)目到Tomcat服務(wù)器并啟動(dòng),然后訪問該項(xiàng)目的首頁,點(diǎn)擊新增客戶拜訪超鏈接跳轉(zhuǎn)到客戶拜訪記錄添加頁面之后,在所拜訪客戶對(duì)應(yīng)的下拉列表中就能看到所有的客戶了。
異步加載業(yè)務(wù)員名稱對(duì)應(yīng)的下拉列表中的所需數(shù)據(jù)
首先,在UserAction類中編寫一個(gè)如下的findAllUser方法。
public String findAllUser() throws IOException {List<User> list = userService.findAll();JSONArray jsonArray = JSONArray.fromObject(list);ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");ServletActionContext.getResponse().getWriter().println(jsonArray.toString());return NONE; }然后,在UserService接口中添加一個(gè)查詢所有用戶的方法聲明,如下:
package com.meimeixia.crm.service;import java.util.List;import com.meimeixia.crm.domain.User;/*** 用戶管理的業(yè)務(wù)層的接口* @author liayun**/ public interface UserService {void regist(User user);User login(User user);List<User> findAll();}接著,在以上接口的一個(gè)實(shí)現(xiàn)類(UserServiceImpl.java)中實(shí)現(xiàn)查詢所有用戶的方法。
@Override public List<User> findAll() {return userDao.findAll(); }緊接著,發(fā)布我們的項(xiàng)目到Tomcat服務(wù)器并啟動(dòng),然后訪問該項(xiàng)目的首頁,點(diǎn)擊新增客戶拜訪超鏈接跳轉(zhuǎn)到客戶拜訪記錄添加頁面之后,在業(yè)務(wù)員名稱對(duì)應(yīng)的下拉列表中就能看到所有的用戶了。
在客戶拜訪記錄添加頁面上添加一個(gè)日期插件
在客戶拜訪記錄添加頁面中填寫客戶拜訪記錄相關(guān)的信息時(shí),我們要在拜訪時(shí)間以及下次拜訪時(shí)間對(duì)應(yīng)的文本框中輸入準(zhǔn)確的時(shí)間,這可不能讓我們自己手動(dòng)瞎輸入,應(yīng)該彈出一個(gè)日歷小窗口,讓我們選擇對(duì)應(yīng)的時(shí)間,就像下面這樣。
如果想要實(shí)現(xiàn)這樣的效果,那么需要在客戶拜訪記錄添加頁面上添加一個(gè)日期插件。這樣的日期插件可以從網(wǎng)上隨便下載一個(gè),筆者也在這里提供了一個(gè),如有需要可以從CRM客戶關(guān)系管理系統(tǒng)開發(fā)第一講中提供的百度網(wǎng)盤連接地址進(jìn)行下載,需要說明一點(diǎn)的是,這里是以筆者提供的日期插件為例進(jìn)行演示的。
那么問題來了,這樣的日期插件該怎樣使用呢?首先,將下載下來的日期插件中的jquery目錄復(fù)制到CRM項(xiàng)目下的WebContent目錄中。
然后,在客戶拜訪記錄添加頁面中導(dǎo)入日期插件所需要的樣式文件和js文件。
接著,給拜訪時(shí)間以及下次拜訪時(shí)間對(duì)應(yīng)的文本框添加一個(gè)id屬性,除此之外,還應(yīng)將文本框的readonly屬性置為true,因?yàn)檫@樣一來該文本框就變成只讀的了,用戶一旦在文本框中輸入了某個(gè)值,就不能隨意對(duì)其進(jìn)行修改了。
- 拜訪時(shí)間對(duì)應(yīng)的文本框應(yīng)修改為:
- 下次拜訪時(shí)間對(duì)應(yīng)的文本框應(yīng)修改為:
最后,在客戶拜訪記錄添加頁面中編寫如下一段js代碼,就能在頁面中使用日期插件了。
修改客戶拜訪記錄添加頁面中的表單提交路徑
編寫SaleVisitAction中的save方法
首先,在SaleVisitAction類中編寫如下的一個(gè)保存客戶拜訪記錄的save方法。
/** 保存客戶拜訪記錄的方法*/ public String save() {//調(diào)用業(yè)務(wù)層saleVisitService.save(saleVisit);return "saveSuccess"; }然后,我們還得在Struts2配置文件中(即struts.xml)對(duì)SaleVisitAction進(jìn)行如下的配置,即保存客戶拜訪記錄成功后,直接重定向到客戶拜訪記錄列表展示頁面中。
編寫service層
首先,在SaleVisitService接口中添加一個(gè)保存客戶拜訪記錄的方法聲明,如下:
package com.meimeixia.crm.service;import org.hibernate.criterion.DetachedCriteria;import com.meimeixia.crm.domain.PageBean; import com.meimeixia.crm.domain.SaleVisit;/*** 客戶拜訪記錄的業(yè)務(wù)層的接口* @author liayun**/ public interface SaleVisitService {PageBean<SaleVisit> findByPage(DetachedCriteria detachedCriteria, Integer currentPage, Integer pageSize);void save(SaleVisit saleVisit);}然后,在以上接口的一個(gè)實(shí)現(xiàn)類(SaleVisitServiceImpl.java)中實(shí)現(xiàn)保存客戶拜訪記錄的方法。
@Override public void save(SaleVisit saleVisit) {saleVisitDao.save(saleVisit); }添加事務(wù)
這里一定得記得要在業(yè)務(wù)層中的實(shí)現(xiàn)類(SaleVisitServiceImpl)上添加@Transactional注解。
至此,保存客戶拜訪記錄的功能,我們就已經(jīng)實(shí)現(xiàn)了,至于測(cè)試的話,我就不再這里測(cè)試了(偷懶了),反正是好使的!
總結(jié)
以上是生活随笔為你收集整理的CRM客户关系管理系统开发第十八讲——实现客户拜访记录管理模块中保存客户拜访记录的功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Medical physics】放射治
- 下一篇: web api 数独 求解代码 使用穷举