日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CRM第六天:客户拜访管理,权限配置,验证码实现

發布時間:2024/3/24 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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">&nbsp;</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第六天:客户拜访管理,权限配置,验证码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。