CRM第六天:客户拜访管理,权限配置,验证码实现
目錄
1.CRM客戶關系管理系統:客戶拜訪記錄
1.1需求概述
1.2準備工作
1.2.1創建表
1.2.2創建實體和映射
1.2.3創建相關類,并交給Spring管理
1.3客戶拜訪記錄列表顯示
1.3.1修改left.jsp的提交路徑
1.3.2編寫action
1.3.3編寫service
1.3.4編寫顯示頁面
1.4客戶拜訪記錄列表顯示
1.4.1編寫action
1.4.2編寫service
1.4.3編寫保存頁面
2.權限管理
2.1編寫一個類繼承攔截器類
2.2配置攔截器
3驗證碼
3.1編寫工具類
3.2編寫action
3.3編寫頁面
?
1.CRM客戶關系管理系統:客戶拜訪記錄
1.1需求概述
一個系統的用戶(公司業務員),業務員需要對客戶進行拜訪,對拜訪的過程進行記錄。業務員(用戶)和客戶(客戶)之間關系(需要具體業務具體分析:一對多—公司產品比較單一,只允許一個業務員對應多個客戶。多對多—大公司有不同的產品,不同產品下有不同業務員都可以接觸到同一個客戶,一個客戶可以對應多個業務員)。大部分情況創建成多對多。
1.2準備工作
1.2.1創建表
CREATE TABLE `sale_visit` (`visit_id` varchar(32) NOT NULL,`visit_cust_id` bigint(32) DEFAULT NULL COMMENT '客戶id',`visit_user_id` bigint(32) DEFAULT NULL COMMENT '負責人id',`visit_time` datetime DEFAULT NULL COMMENT '拜訪時間',`visit_addr` varchar(128) DEFAULT NULL COMMENT '拜訪地點',`visit_detail` varchar(256) DEFAULT NULL COMMENT '拜訪詳情',`visit_nexttime` date DEFAULT NULL COMMENT '下次拜訪時間',PRIMARY KEY (`visit_id`),KEY `FK_sale_visit_cust_id` (`visit_cust_id`),KEY `FK_sale_visit_user_id` (`visit_user_id`),CONSTRAINT `FK_sale_visit_cust_id` FOREIGN KEY (`visit_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,CONSTRAINT `FK_sale_visit_user_id` FOREIGN KEY (`visit_user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=InnoDB DEFAULT CHARSET=utf8;1.2.2創建實體和映射
實體:
package com.albertyy.crm.entity;import java.sql.Date;import java.sql.Timestamp;/*** ?? ??? 項目名稱:CRM?? 類名稱:SaleVisit?? 類描述:?客戶拜訪實體類? 創建人:yangyangyang??* 創建時間:2019年1月1日 下午4:32:53?? 修改人:yangyangyang?? 修改時間:2019年1月1日 下午4:32:53??* 修改備注:?? @version??? ???*/public class SaleVisit {private String visit_id;private Timestamp visit_time;private String visit_addr;private String visit_detail;private Date visit_nexttime;// 拜訪記錄關聯的客戶對象private Customer customer;// 拜訪記錄關聯的用戶對象private User user;public String getVisit_id() {return visit_id;}public void setVisit_id(String visit_id) {this.visit_id = visit_id;}public Timestamp getVisit_time() {return visit_time;}public void setVisit_time(Timestamp visit_time) {this.visit_time = visit_time;}public String getVisit_addr() {return visit_addr;}public void setVisit_addr(String visit_addr) {this.visit_addr = visit_addr;}public String getVisit_detail() {return visit_detail;}public void setVisit_detail(String visit_detail) {this.visit_detail = visit_detail;}public Date getVisit_nexttime() {return visit_nexttime;}public void setVisit_nexttime(Date visit_nexttime) {this.visit_nexttime = visit_nexttime;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}映射:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.albertyy.crm.entity.SaleVisit" table="sale_visit"><id name="visit_id" column="visit_id"><generator class="uuid"/></id><property name="visit_time" column="visit_time"/><property name="visit_addr" column="visit_addr"/><property name="visit_detail" column="visit_detail"/><property name="visit_nexttime" column="visit_nexttime"/><!-- 配置與客戶的關聯關系 --><many-to-one name="customer" class="com.albertyy.crm.entity.Customer" column="visit_cust_id" /><!-- 配置與用戶的關聯關系 --><many-to-one name="user" class="com.albertyy.crm.entity.User" column="visit_user_id" /></class></hibernate-mapping>1.2.3創建相關類,并交給Spring管理
?
<!-- ======配置客戶拜訪的相關類======= --><!-- 配置Action --><bean id="saleVisitAction" class="com.albertyy.crm.web.action.SaleVisitAction" scope="prototype"><property name="saleVisitService" ref="saleVisitService"/><property name="customerService" ref="customerService"/><property name="userService" ref="userService"/></bean><!-- 配置Service --><bean id="saleVisitService" class="com.albertyy.crm.serviceImpl.SaleVisitServiceImpl"><property name="saleVisitDao" ref="saleVisitDao"/></bean><!-- 配置DAO --><bean id="saleVisitDao" class="com.albertyy.crm.daoImpl.SaleVisitDaoImpl"><property name="sessionFactory" ref="sessionFactory"/></bean>1.3客戶拜訪記錄列表顯示
1.3.1修改left.jsp的提交路徑
<h3>客戶拜訪管理</h3><ul><li><ahref="${pageContext.request.contextPath }/saleVisit_saveUI.action">新增客戶拜訪</a></li><li><ahref="${pageContext.request.contextPath }/saleVisit_findAll.action">客戶拜訪列表</a></li></ul>1.3.2編寫action
// 分頁查詢客戶拜訪記錄的方法public String findAll() {// 創建離線條件查詢對象DetachedCriteria detachedCriteria = DetachedCriteria.forClass(SaleVisit.class);// 設置條件PageBean<SaleVisit> pageBean = saleVisitService.findByPage(detachedCriteria, page, pageSize);ActionContext.getContext().getValueStack().push(pageBean);return "findAll";}1.3.3編寫service
//客戶拜訪分頁查詢業務層方法@Overridepublic PageBean<SaleVisit> findByPage(DetachedCriteria detachedCriteria, Integer page, Integer pageSize) {PageBean<SaleVisit> pageBean=new PageBean<SaleVisit>();pageBean.setPage(page);pageBean.setPageSize(pageSize);int totalCount=saleVisitDao.findCount(detachedCriteria);pageBean.setTotalCount(totalCount);double tc=totalCount;Double num=Math.ceil(tc/pageSize);pageBean.setTotalPage(num.intValue());Integer begin=(page-1)*pageSize;List<SaleVisit> list=saleVisitDao.findByPage(detachedCriteria, begin, pageSize);pageBean.setList(list);return pageBean;}?
1.3.4編寫顯示頁面
<div class="main" style="overflow-y: auto"><div class="container"><form name="customerForm"action="${pageContext.request.contextPath }/saleVisit_findAll.action"method="post"><div id="search_bar" class="mt10"><div class="box"><div class="box_border"><div class="box_top"><b class="pl15">搜索</b></div><div class="box_center pt10 pb10"><table class="form_table" cellspacing="0" cellpadding="0"border="0"><tbody><tr><td>拜訪時間從:</td><td><input type="date" name="visit_time"value="<s:date name="visit_time" format="yyyy-MM-dd"/>"class="input-text lh25" size="10"></td><td>到:</td><td><input type="date" name="visit_endtime"value="<s:date name="visit_endtime" format="yyyy-MM-dd"/>"class="input-text lh25" size="10"></td><td><input type="submit" name="button"class="btn btn82 btn_search" value="查詢"></td></tr></tbody></table></div></div></div></div><div id="table" class="mt10"><div class="box span10 oh"><table width="100%" border="0" cellpadding="0" cellspacing="0"class="list_table"><tr><th width="100">客戶名稱</th><th width="100">負責人名稱</th><th width="100">拜訪時間</th><th width="100">拜訪地點</th><th width="100">拜訪詳情</th><th width="100">下次拜訪時間</th><th width="150">操作</th></tr><s:iterator value="list"><tr class="tr"><td><s:property value="customer.cust_name" /></td><td><s:property value="user.user_name" /></td><td><s:date name="visit_time" format="yyyy-MM-dd"/></td><td><s:property value="visit_addr" /></td><td><div style="height: 30px; overflow-y: auto;"><s:property value="visit_detail" /></div></td><td><s:date name="visit_nexttime" format="yyyy-MM-dd"/></td><td><input type="button" name="button"class="btn btn82 btn_add" id="modifyBtn"onclick="toUpdate('<s:property value="lkm_id"/>')" value="修改"><input type="button" name="button" class="btn btn82 btn_del"onclick="toDelete('<s:property value="lkm_id"/>')" value="刪除"></td></tr></s:iterator></table><div class="page mt10"><div class="pagination"><ul><li class="disabled"><span> 共<s:propertyvalue="totalCount" />條記錄, 共 <s:property value="totalPage" />頁</span></li><li><span> 每頁顯示記錄數: <select name="pageSize"onchange="to_page()"><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><option value="20" <s:if test="pageSize==20">selected</s:if>>20條</option></select></span></li><s:if test="page!=1"><li><a href="javascript:to_page(1)">首頁</a></li><li><ahref="javascript:to_page(<s:property value="page-1" />)">上一頁</a></li></s:if><s:iterator var="i" begin="1" end="totalPage"><s:if test="#i==page"><li class="active"><span><s:property value="#i" /></span></li></s:if><s:else><li><ahref="javascript:to_page(<s:property value="#i" />)"><s:propertyvalue="#i" /></a></li></s:else></s:iterator><s:if test="page!=totalPage"><li><ahref="javascript:to_page(<s:property value="page+1" />)">下一頁</a></li><li><ahref="javascript:to_page(<s:property value="totalPage" />)">末頁</a></li></s:if><li>到第 <input class="input-text lh25" type="text"id="page" name="page" size="2" height="10px" />頁 <inputclass="ext_btn" type="button" value="GO" onclick="to_page()" /></li></ul></div></div></form></div></div>1.4客戶拜訪記錄列表顯示
1.4.1編寫action
?
// 跳轉到添加頁面的方法public String saveUI() {// 查詢客戶和負責人List<Customer> customerlist = customerService.findAll();List<User> userlist = userService.findAll();ActionContext.getContext().getValueStack().set("customerlist", customerlist);ActionContext.getContext().getValueStack().set("userlist", userlist);return "saveUI";}// 保存拜訪記錄public String save() {saleVisitService.save(saleVisit);// 跳轉到列表頁面findAll();return "saveSuccess";}配置action:<!-- 客戶拜訪Action --><action name="saleVisit_*" class="saleVisitAction" method="{1}"><result name="findAll">/salevisit/list.jsp</result><result name="saveUI">/salevisit/add.jsp</result><result name="saveSuccess">/salevisit/list.jsp</result></action>1.4.2編寫service
//保存客戶拜訪記錄@Overridepublic void save(SaleVisit saleVisit) {saleVisitDao.save(saleVisit);}1.4.3編寫保存頁面
?
<div class="main" style="overflow-y: auto"><div class="container"><div class="main_top"><div id="forms" class="mt10"><div class="box"><div class="box_border"><div class="box_top"><b class="pl15">新增客戶拜訪</b></div><div class="box_center"><formaction="${pageContext.request.contextPath }/saleVisit_save.action"method="post" class="jqtransform"><table class="form_table pt15 pb15" width="100%" border="0"cellpadding="0" cellspacing="0"><tr><td class="td_right">客戶名稱:</td><td class=""><span class="fl"><div class="select_border"><div class="select_containers "><select name="customer.cust_id" id="cust_source"class="select"><option value="">-請選擇-</option><s:iterator value="customerlist"><option value='<s:property value="cust_id"/>'><s:propertyvalue="cust_name" /></option></s:iterator></select></div></div></span></td></tr><tr><td class="td_right">負責人名稱:</td><td class=""><span class="fl"><div class="select_border"><div class="select_containers "><select name="user.user_id" id="cust_source"class="select"><option value="">-請選擇-</option><s:iterator value="userlist"><option value='<s:property value="user_id"/>'><s:propertyvalue="user_name" /></option></s:iterator></select></div></div></span></td></tr><tr><td class="td_right">拜訪時間:</td><td class=""><input type="date" name="visit_time"class="input-text lh30" ></td></tr><tr><td class="td_right">拜訪地點:</td><td class=""><input type="text" name="visit_addr"class="input-text lh30" ></td></tr><tr><td class="td_right">拜訪詳情:</td><td class=""><textarea name="visit_detail" id="" cols="30" rows="10"class="textarea" style="width: 362px; height: 93px;"></textarea></td></tr><tr><td class="td_right">下次拜訪時間:</td><td class=""><input type="date" name="visit_nexttime"class="input-text lh30" ></td></tr><tr><td class="td_right"> </td><td class=""><input type="submit" name="button"class="btn btn82 btn_save2" value="保存"> <inputtype="reset" name="button" class="btn btn82 btn_res"value="重置"></td></tr></table></form></div></div></div></div></div></div></div>?
2.權限管理
2.1編寫一個類繼承攔截器類
?
package com.albertyy.crm.web.intercept;import org.apache.struts2.ServletActionContext;import com.albertyy.crm.entity.User;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/** 攔截器類*/public class PrivilegeInterceptor extends MethodFilterInterceptor {/****/private static final long serialVersionUID = 1L;@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception {//判斷session中是否有登陸用戶User loginUser=(User) ServletActionContext.getRequest().getSession().getAttribute("loginuser");if(loginUser==null){//跳轉到登陸頁面ActionSupport actionSupport=(ActionSupport) invocation.getAction();actionSupport.addActionError("您還沒有登陸,請登陸!");return actionSupport.LOGIN;}else{//已經登陸return invocation.invoke();}}}2.2配置攔截器
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><!-- 配置Struts2的常量 --><constant name="struts.action.extension" value="action" /><!-- 配置Struts2中一個表單中上傳文件總大小10M --><constant name="struts.multipart.maxSize" value="10485760"></constant><!-- 配置Action --><package name="crm" extends="struts-default" namespace="/"><!-- 定義攔截器 --><interceptors><interceptor name="privilegeInterceptor"class="com.albertyy.crm.web.intercept.PrivilegeInterceptor"></interceptor></interceptors><!-- 全局結果 --><global-results><result name="login">/login.jsp</result></global-results><!-- 用戶 --><action name="user_*" class="userAction" method="{1}"><result name="exitSuccess">/login.jsp</result><result name="success" type="redirect">/index.jsp</result><result name="register" >/register.jsp</result></action><!-- 客戶管理Action --><action name="customer_*" class="customerAction" method="{1}"><result name="saveUI">/customer/add.jsp</result><result name="findAll">/customer/list.jsp</result><result name="deleteSuccess" type="redirect">/customer_findAll.action</result><result name="updateSuccess" type="redirect">/customer_findAll.action</result><result name="input">/customer/add.jsp</result><interceptor-ref name="privilegeInterceptor"></interceptor-ref><!-- 配置文件上傳攔截器 --><interceptor-ref name="defaultStack"><param name="fileUpload.maximumSize">5242880</param><param name="fileUpload.allowedExtensions">.jpg,.bmp,.png,.txt,.gif</param></interceptor-ref></action><!-- 字典管理Action --><action name="baseDict_*" class="baseDictAction" method="{1}"><interceptor-ref name="privilegeInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></action><!-- 聯系人管理Action --><action name="linkMan_*" class="linkManAction" method="{1}"><result name="findAll">/linkman/list.jsp</result><result name="saveUI">/linkman/add.jsp</result><result name="saveSuccess">/linkman/list.jsp</result><result name="deleteSuccess">/linkman/list.jsp</result><result name="updateSuccess" type="redirect">/linkMan_findAll.action</result><interceptor-ref name="privilegeInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></action><!-- 客戶拜訪Action --><action name="saleVisit_*" class="saleVisitAction" method="{1}"><result name="findAll">/salevisit/list.jsp</result><result name="saveUI">/salevisit/add.jsp</result><result name="saveSuccess">/salevisit/list.jsp</result><interceptor-ref name="privilegeInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></action></package></struts>?
3驗證碼
3.1編寫工具類
編寫工具類SecurityCode:
package com.albertyy.crm.utils;import java.util.Arrays;/**??*???* 項目名稱:CRM??* 類名稱:SecurityCode??* 類描述:??生成驗證碼字符串* 創建人:yangyangyang??* 創建時間:2019年1月4日 下午5:07:27??* 修改人:yangyangyang??* 修改時間:2019年1月4日 下午5:07:27??* 修改備注:??* @version???*???*/public class SecurityCode {/*** 驗證碼難度級別,Simple只包含數字,Medium包含數字和小寫英文,Hard包含數字和大小寫英文*/public enum SecurityCodeLevel {Simple,Medium,Hard};/*** 產生默認驗證碼,4位中等難度* @return? String 驗證碼*/public static String getSecurityCode(){return getSecurityCode(4,SecurityCodeLevel.Medium,false);}/*** 產生長度和難度任意的驗證碼* @param length? 長度* @param level?? 難度級別* @param isCanRepeat? 是否能夠出現重復的字符,如果為true,則可能出現 5578這樣包含兩個5,如果為false,則不可能出現這種情況* @return? String 驗證碼*/public static String getSecurityCode(int length,SecurityCodeLevel level,boolean isCanRepeat){//隨機抽取len個字符int len=length;//字符集合(除去易混淆的數字0、數字1、字母l、字母o、字母O)char[] codes={'1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'};//根據不同的難度截取字符數組if(level==SecurityCodeLevel.Simple){codes=Arrays.copyOfRange(codes, 0,9);}else if(level==SecurityCodeLevel.Medium){codes=Arrays.copyOfRange(codes, 0,33);}//字符集合長度int n=codes.length;//拋出運行時異常if(len>n&&isCanRepeat==false){throw new RuntimeException(String.format("調用SecurityCode.getSecurityCode(%1$s,%2$s,%3$s)出現異常," +"當isCanRepeat為%3$s時,傳入參數%1$s不能大于%4$s",len,level,isCanRepeat,n));}//存放抽取出來的字符char[] result=new char[len];//判斷能否出現重復的字符if(isCanRepeat){for(int i=0;i<result.length;i++){//索引 0 and n-1int r=(int)(Math.random()*n);//將result中的第i個元素設置為codes[r]存放的數值result[i]=codes[r];}}else{for(int i=0;i<result.length;i++){//索引 0 and n-1int r=(int)(Math.random()*n);//將result中的第i個元素設置為codes[r]存放的數值result[i]=codes[r];//必須確保不會再次抽取到那個字符,因為所有抽取的字符必須不相同。//因此,這里用數組中的最后一個字符改寫codes[r],并將n減1codes[r]=codes[n-1];n--;}}return String.valueOf(result);}}編寫工具類SecurityImage:
package com.albertyy.crm.utils;/**??*???* 項目名稱:CRM??* 類名稱:SecurityImage??* 類描述:?生成驗證碼圖片?* 創建人:yangyangyang??* 創建時間:2019年1月4日 下午5:09:18??* 修改人:yangyangyang??* 修改時間:2019年1月4日 下午5:09:18??* 修改備注:??* @version???*???*/import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.Random;import com.sun.image.codec.jpeg.ImageFormatException;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;/*** 工具類,生成驗證碼圖片* @version 1.0 2012/08/21* @author dongliyang**/public class SecurityImage {/*** 生成驗證碼圖片* @param securityCode?? 驗證碼字符* @return? BufferedImage? 圖片*/public static BufferedImage createImage(String securityCode){//驗證碼長度int codeLength=securityCode.length();//字體大小int fSize = 15;int fWidth = fSize + 1;//圖片寬度int width = codeLength * fWidth + 6 ;//圖片高度int height = fSize * 2 + 1;//圖片BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g=image.createGraphics();//設置背景色g.setColor(Color.WHITE);//填充背景g.fillRect(0, 0, width, height);//設置邊框顏色g.setColor(Color.LIGHT_GRAY);//邊框字體樣式g.setFont(new Font("Arial", Font.BOLD, height - 2));//繪制邊框g.drawRect(0, 0, width - 1, height -1);//繪制噪點Random rand = new Random();//設置噪點顏色g.setColor(Color.LIGHT_GRAY);for(int i = 0;i < codeLength * 6;i++){int x = rand.nextInt(width);int y = rand.nextInt(height);//繪制1*1大小的矩形g.drawRect(x, y, 1, 1);}//繪制驗證碼int codeY = height - 10;?//設置字體顏色和樣式g.setColor(new Color(19,148,246));g.setFont(new Font("Georgia", Font.BOLD, fSize));for(int i = 0; i < codeLength;i++){g.drawString(String.valueOf(securityCode.charAt(i)), i * 16 + 5, codeY);}//關閉資源g.dispose();return image;}/*** 返回驗證碼圖片的流格式* @param securityCode? 驗證碼* @return ByteArrayInputStream 圖片流*/public static ByteArrayInputStream getImageAsInputStream(String securityCode){BufferedImage image = createImage(securityCode);return convertImageToStream(image);}/*** 將BufferedImage轉換成ByteArrayInputStream* @param image? 圖片* @return ByteArrayInputStream 流*/private static ByteArrayInputStream convertImageToStream(BufferedImage image){ByteArrayInputStream inputStream = null;ByteArrayOutputStream bos = new ByteArrayOutputStream();JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos);try {jpeg.encode(image);byte[] bts = bos.toByteArray();inputStream = new ByteArrayInputStream(bts);} catch (ImageFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return inputStream;}}3.2編寫action
package com.albertyy.crm.web.action;import java.io.ByteArrayInputStream;import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.albertyy.crm.utils.SecurityCode;import com.albertyy.crm.utils.SecurityCode.SecurityCodeLevel;import com.albertyy.crm.utils.SecurityImage;import com.opensymphony.xwork2.ActionSupport;/**??*???* 項目名稱:CRM??* 類名稱:SecurityCodeImageAction??* 類描述:??驗證碼* 創建人:yangyangyang??* 創建時間:2019年1月4日 下午5:35:21??* 修改人:yangyangyang??* 修改時間:2019年1月4日 下午5:35:21??* 修改備注:??* @version???*???*/@SuppressWarnings("serial")public class SecurityCodeImageAction extends ActionSupport implements SessionAware{//Struts2中Map類型的sessionprivate Map<String, Object> session;//圖片流private ByteArrayInputStream imageStream;public ByteArrayInputStream getImageStream() {return imageStream;}public void setImageStream(ByteArrayInputStream imageStream) {this.imageStream = imageStream;}public String execute() throws Exception {//如果開啟Hard模式,可以不區分大小寫String securityCode = SecurityCode.getSecurityCode(4,SecurityCodeLevel.Hard, false).toLowerCase();//獲取默認難度和長度的驗證碼//String securityCode = SecurityCode.getSecurityCode();imageStream = SecurityImage.getImageAsInputStream(securityCode);//放入session中session.put("SESSION_SECURITY_CODE", securityCode);return SUCCESS;}public void setSession(Map<String, Object> session) {this.session = session;}}配置文件:
<!-- 驗證碼action --><action name="SecurityCodeImageAction" class="com.albertyy.crm.web.action.SecurityCodeImageAction"><result name="success" type="stream"><param name="contentType">image/jpeg</param><param name="inputName">imageStream</param><param name="bufferSize">2048</param></result></action>?
3.3編寫頁面
Html:
<a href="###"><img id="Verify" src="${pageContext.request.contextPath}/SecurityCodeImageAction.action"? alt="看不清換一張" width="80" height="40"></a>Js:
<script type="text/javascript">window.onload=function(){var verifyObj = document.getElementById("Verify");verifyObj.onclick=function(){this.src="SecurityCodeImageAction.action?timestamp="+new Date().getTime();};}</script>?
本項目基本的功能已經實現,由于只是練手,后邊的小功能不在實現,如有需要可以自己實現。
源碼已經上傳,地址為:https://github.com/AlbertYang666/CRM
演示地址:http://www.albertyy.com/CRM/
?
?
?
總結
以上是生活随笔為你收集整理的CRM第六天:客户拜访管理,权限配置,验证码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑白极简毕业答辩通用PPT模板
- 下一篇: 工业级百兆8口交换机HY5700-450