CRM_2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CRM_2相关的知识,希望对你有一定的参考价值。

使用SVN

步骤一:创建空文件夹,并创建crm仓库,同时创建目录规范

 技术分享

步骤二:配置权限

技术分享

  svnserve.conf

 技术分享

技术分享

技术分享

  passwd

 技术分享

authz

 技术分享

步骤三:在myeclipse 创建 svn 资源库路径

 技术分享

技术分享

步骤四:将项目分析到svn

 技术分享

步骤五:查看项目日志记录

  项目右键/team/显示资源历史记录

 技术分享

配置信息

  svnserve.conf

 技术分享

  authz

 技术分享

员工编辑

先查询

用户浏览器修改

提交表单,进行更新

2.1 标签的回显

如果文本框,通过name从值栈的栈顶开始获得数据,如果获得将回显。

如果checkboxradioselect 本身需要有数据,通过name从值栈获得数据,如果与提供数据一致,将回显。

2.1.1 编辑前:通过id查询

2.1.1.1 staff dao

@Override

public CrmStaff findById(String staffId) {

return this.getHibernateTemplate().get(CrmStaff.class, staffId);

}

 

2.1.1.2 staff service

@Override

public CrmStaff findById(String staffId) {

return this.staffDao.findById(staffId);

}

 

2.1.1.3 action

/**

 * 编辑前操作

 * @return

 */

public String editUI(){

//1 通过id查询员工

CrmStaff findStaff = this.staffService.findById(staff.getStaffId());

ActionContext.getContext().getValueStack().push(findStaff);

 

2.1.2 jsp普通数据回显

<td>登录名:</td>

    <td><s:textfield name="loginName"></s:textfield></td>

    <td>密码:</td>

    <td><s:password name="loginPwd" showPassword="true"></s:password> </td>

 

2.1.3 部门回显

2.1.3.1 department dao

public class DepartmentDaoImpl extends HibernateDaoSupport implements DepartmentDao {

 

@Override

public List<CrmDepartment> findAll() {

return this.getHibernateTemplate().find("from CrmDepartment");

}

 

 

2.1.3.2 department service

public class DepartmentServiceImpl implements DepartmentService {

 

private DepartmentDao departmentDao;

public void setDepartmentDao(DepartmentDao departmentDao) {

this.departmentDao = departmentDao;

}

@Override

public List<CrmDepartment> findAll() {

return departmentDao.findAll();

}

 

}

 

2.1.3.3 spring配置

每一个模块单独使用xml,注意:applicationContext.xml import

 技术分享

<!-- 部门配置项:daoservice -->

 

<bean id="departmentDao" class="com.itheima.crm.department.dao.impl.DepartmentDaoImpl">

<property name="sessionFactory" ref="sessionFactory"></property>

</bean>

 

<bean id="departmentService" class="com.itheima.crm.department.service.impl.DepartmentServiceImpl">

<property name="departmentDao" ref="departmentDao"></property>

</bean>

 

 

2.1.3.4 action

/**

 * 编辑前操作

 * @return

 */

public String editUI(){

//1 通过id查询员工

CrmStaff findStaff = this.staffService.findById(staff.getStaffId());

ActionContext.getContext().getValueStack().push(findStaff);

 

//2 查询所有部门

List<CrmDepartment> allDepartment = departmentService.findAll();

// * jsp页面通过“key”获得

ActionContext.getContext().getValueStack().set("allDepartment",allDepartment);

 

return "editUI";

}

 

2.1.3.5 jsp显示

l listKey listValue  获得当前列表项使用javabean某一个属性的值

l name ,通过name从值栈获得数据,如果listKey确定的数据一致,将回显

 

<s:select list="allDepartment" name="post.department.depId"

listKey="depId" listValue="depName"

headerKey="" headerValue="------------"

>

</s:select>

 

2.1.4 职务的回显

当前员工的职务,所属的部门,此部门下的所有职务 post.department.postSet

<s:select list="post != null ? post.department.postSet : {}" name="post.postId"

listKey="postId" listValue="postName"

headerKey="" headerValue="------------"

></s:select>

 

2.2 ajax二级联动

2.2.1 分析

 技术分享

2.2.2 查询职务

2.2.2.1 dao

public class PostDaoImpl extends HibernateDaoSupport implements PostDao {

@Override

public List<CrmPost> findAll(CrmDepartment department) {

return this.getHibernateTemplate().find("from CrmPost where department = ?", department);

}

}

 

2.2.2.2 service

public class PostServiceImpl implements PostService {

private PostDao postDao;

public void setPostDao(PostDao postDao) {

this.postDao = postDao;

}

@Override

public List<CrmPost> findAll(CrmDepartment department) {

return postDao.findAll(department);

}

}

 

2.2.2.3 spring配置

<!-- 部门配置项:daoservice -->

<bean id="postDao" class="com.itheima.crm.post.dao.impl.PostDaoImpl">

<property name="sessionFactory" ref="sessionFactory"></property>

</bean>

 

<bean id="postService" class="com.itheima.crm.post.service.impl.PostServiceImpl">

<property name="postDao" ref="postDao"></property>

</bean>

 

2.2.2.4 action

公共

public class PostAction extends ActionSupport implements ModelDriven<CrmPost> {

//封装数据

private CrmPost post = new CrmPost();

@Override

public CrmPost getModel() {

return post;

}

// service

private PostService postService;

public void setPostService(PostService postService) {

this.postService = postService;

}

///////////////////////////////////////////////

 

功能:需要排除关联对象,响应的中文乱码

/**

 * ajax 通过部门 ,查询所有的职务

 * @return

 * @throws IOException

 */

public String findAllWithDepartment() throws IOException{

//1 查询

List<CrmPost> allPost = this.postService.findAll(post.getDepartment());

 

//2 java对象 转换 json数据

 

//2.1 排除不需要数据

JsonConfig jsonConfig = new JsonConfig();

jsonConfig.setExcludes(new String[]{"department","staffSet"});

//2.2 转换

String jsonData = JSONArray.fromObject(allPost,jsonConfig).toString();

 

//3 json数据发送给浏览器

//3.1 响应中文乱码

ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");

//3.2 发送

ServletActionContext.getResponse().getWriter().print(jsonData);

 

return "none";

}

 

2.2.2.5 struts配置

<!-- 员工配置 -->

<package name="pos" namespace="/" extends="common">

<action name="postAction_*" class="com.itheima.crm.post.web.action.PostAction" method="{1}">

</action>

</package>

 

 

 

 

 

 

2.2.3 json数据生成

将采用json-lib 工具生成

导入jar包:(注意:重复)

 

l api使用:

JavaBean Map JSONObject.fromObject(...).toString();

List ArrayJSONArray.fromObject(...).toString();

 

2.2.4 发送 ajax 请求

l /ee19_crm/WebRoot/WEB-INF/pages/staff/editStaff.jsp

步骤:

1.获得当前选中部门

2.发送ajax查询职务(获得引擎、设置回调、开发连接、发送请求)

3.获得数据后,将数据添加到职务的select标签中。

 

 

<script type="text/javascript">

function showPost(obj){

//1 获得选中部门

var depId = obj.value;

//2 发送ajax,通过部门查询职务

//2.1 获得引擎

var xmlhttp=null;

if (window.XMLHttpRequest){// code for all new browsers

  xmlhttp=new XMLHttpRequest();

} else if (window.ActiveXObject) {// code for IE5 and IE6

  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

 

//2.2 设置回调函数

xmlhttp.onreadystatechange = function(){

//请求完成,正常响应

if(xmlhttp.readyState == 4 && xmlhttp.status == 200){

//3 获得数据,并展示 ,手动ajax 获得 json数据 字符串

var textData = xmlhttp.responseText;

//3.1 将字符串 手动 转换 json对象

var jsonData = eval("("+textData+")");

 

// 获得select对象

var postSelectElement = document.getElementById("postSelectId");

postSelectElement.innerHTML = "<option value=‘‘>------------</option>";

 

//3.2 遍历

for(var i = 0 ; i < jsonData.length ; i++){

var postObj = jsonData[i];

// 获得职务id

var postId = postObj.postId;

// 获得职务名称

var postName = postObj.postName;

 

//3.3 将数显示到select标签

postSelectElement.innerHTML += "<option value=‘"+postId+"‘>"+postName+"</option>";

}

 

}

};

//2.3 创建连接

var url = "${pageContext.request.contextPath}/postAction_findAllWithDepartment?department.depId=" + depId;

xmlhttp.open("GET", url);

//2.4 发送请求

xmlhttp.send(null);

}

</script>

 

 

 

2.3 更新功能

2.3.1 完善表单

填写表单提交位置,添加隐藏字段

<s:form namespace="/" action="staffAction_edit">

<%--隐藏域,存放用户id --%>

<s:hidden name="staffId" value="%{staffId}"></s:hidden>

 

添加javascript click事件,提交表单

<a href="javascript:void(0)" onclick="document.forms[0].submit()">

        <img src="${pageContext.request.contextPath}/images/button/save.gif" />

       </a>

 

2.3.2 修改action

/**

 * 编辑

 * @return

 */

public String edit(){

this.staffService.updateStaff(staff);

return "edit";

}

 

2.3.3 编写service

采用 hibernate的 快照 和一级缓存

public void updateStaff(CrmStaff staff) {

/* 1 方法1:判断密码是否32长度,

 * * 如果是,密码没有修改,之前(加密后的)

 * * 如果不是,密码已经修改了,之后(需要加密)

 */

 

/* 2 方式2:不更新密码

 * * dao.update(staff),默认更新所有的数据

 * * CrmStaff.hbm.xml 配置密码不参加更新 , <property name="loginPwd" update="false"></property>

 */

 

/* 3 方法3:先通过id查询,比较密码是否一致

 * * 如果不一致,对密码进行MD5加密

 * * 将出OID之外的数据,全部设置

 * * 原因:一级缓存被修改了,与快照不一致,默认情况下,当提交,自动执行update语句。

 */

CrmStaff findStaff = staffDao.findById(staff.getStaffId());

if(! findStaff.getLoginPwd().equals(staff.getLoginPwd())){

findStaff.setLoginPwd(MyStringUtils.getMD5Value(staff.getLoginPwd()));

}

findStaff.setLoginName(staff.getLoginName());

findStaff.setStaffName(staff.getStaffName());

findStaff.setGender(staff.getGender());

findStaff.setOnDutyDate(staff.getOnDutyDate());

findStaff.setPost(staff.getPost());

 

}

 

2.3.4 struts配置

<!-- 6 编辑成功

* 重定向可以注入详细配置

* 默认使用

<result name="success" type="redirectAction">staffAction_home</result>

actionName进行注入

-->

<result name="edit" type="redirectAction">

<param name="namespace">/</param>

<param name="actionName">staffAction_findAll</param>

</result>

 

 

课程类别

3.1 查询所有

1.dao

2.service

3.spring

4.action class

5.struts

6.jsp

 

 

3.2 条件查询

3.2.1 分析

 

3.2.2 jsp表单

   执行的都是findAll()查询

 

<s:form namespace="/" action="courseTypeAction_findAll">

<table width="88%" border="0" class="emp_table" style="width:80%;">

  <tr>

    <td width="10%">课程类别:</td>

    <td><s:textfield name="courseName" size="30"></s:textfield></td>

  </tr>

  <tr>

    <td >课程简介:</td>

    <td ><s:textfield name="remark" size="30" ></s:textfield></td>

  </tr>

  <tr>  

    <td >总学时:</td>

    <td >

     <s:textfield name="totalStart" size="12"></s:textfield>  

     至  

     <s:textfield name="totalEnd" size="12"></s:textfield>

    </td>

 

 

3.2.3 修改POCrmCourseType

//查询条件 -- 一般查询条件都是字符串

//1 总学时

private String totalStart;

private String totalEnd;

//2课程费用

private String courseCostStart;

private String courseCostEnd;

 

 

3.2.4 action获得条件

/**

 * 查询所有

 * @return

 */

public String findAll(){

/*1简单查询

List<CrmCourseType> allCourseType = this.courseTypeService.findAll();

// * 查询结果存在值栈 , jsp 通过“#key”获得

ActionContext.getContext().put("allCourseType", allCourseType);

*/

 

/*2 条件查询

 */

List<CrmCourseType> allCourseType = this.courseTypeService.findAll(courseType);

ActionContext.getContext().put("allCourseType", allCourseType);

 

return "findAll";

}

 

3.2.5 service拼凑条件

使用StringBuilder 拼凑字符串,所有的条件格式“ and 属性 运算符 ?

toString 转成字符串

使用List拼凑实际参数,使用List特性:重复、有序

toArray 转成数组

l commons-lang3 提供 StringUtils工具类  

 

@Override

public List<CrmCourseType> findAll(CrmCourseType courseType) {

//1.1 拼凑查询条件

StringBuilder builder = new StringBuilder();

//1.2 拼凑实际参数 , 可以重复,顺序 --> List

List<Object> paramsList = new ArrayList<Object>();

 

//2 过滤条件

// 2.1 课程类别

if(StringUtils.isNotBlank(courseType.getCourseName())){

builder.append(" and courseName like ?");

paramsList.add("%"+courseType.getCourseName()+"%");

}

// 2.2 课程简介

if(StringUtils.isNotBlank(courseType.getRemark())){

builder.append(" and remark like ?");

paramsList.add("%"+courseType.getRemark()+"%");

}

// 2.3 总学时:

if(StringUtils.isNotBlank(courseType.getTotalStart())){

builder.append(" and total >= ?");

paramsList.add(Integer.parseInt(courseType.getTotalStart()));

}

if(StringUtils.isNotBlank(courseType.getTotalEnd())){

builder.append(" and total <= ?");

paramsList.add(Integer.parseInt(courseType.getTotalEnd()));

}

// 2.4课程费用

if(StringUtils.isNotBlank(courseType.getCourseCostStart())){

builder.append(" and courseCost >= ?");

paramsList.add(Double.parseDouble(courseType.getCourseCostStart()));

}

if(StringUtils.isNotBlank(courseType.getCourseCostEnd())){

builder.append(" and courseCost <= ?");

paramsList.add(Double.parseDouble(courseType.getCourseCostEnd()));

}

 

 

 

//3 使用

// 条件 , 格式:" and ..? and ..."

String condition = builder.toString();

// 实际参数

Object[] params = paramsList.toArray();

 

return courseTypeDao.findAll(condition, params);

}

 

 

 

 

3.2.6 dao查询

l service拼凑查询条件,dao直接使用,通过where 1=1 产生一个恒定条件

@Override

public List<CrmCourseType> findAll(String condition, Object[] params) {

String hql = "from CrmCourseType where 1=1 " + condition;

return this.getHibernateTemplate().find(hql , params);

}

 

 

3.3 分页查询

 

 

 

 

 

 

 

3.4 课程类别添加或编辑

1.dao hibernate 提供 saveOrUpdate()

代理主键 uuid

如果没有OID,值为null,底层执行save() ,及insert语句

如果有OID,有值,底层执行update(),及update语句。

查询详情

2.service  需要事务管理器 (addupdatedeletefind

addOrEdit

3.action

addOrEditUI 显示jsp

如果是更新,需要通过id查询详情  findById()

addOrEdit

直接保存或更新,注意:如果更新需要传递id

4.jsp

添加,直接显示jsp页面

编辑,传递id值,通过id查询,显示jsp页面

 

 

3.4.1 dao

编辑需要查询

添加和编辑直接执行saveOrUpdate

@Override

public CrmCourseType findById(String courseTypeId) {

return this.getHibernateTemplate().get(CrmCourseType.class, courseTypeId);

}

 

@Override

public void saveOrUpdate(CrmCourseType courseType) {

this.getHibernateTemplate().saveOrUpdate(courseType);

}

 

 

3.4.2 service

@Override

public CrmCourseType findById(String courseTypeId) {

return this.courseTypeDao.findById(courseTypeId);

}

@Override

public void addOrEdit(CrmCourseType courseType) {

this.courseTypeDao.saveOrUpdate(courseType);

}

 

3.4.3 action

添加需要显示jsp,不进行查询

更新需要显示jsp,进行查询,使用id进行区分。

/**

 * 添加或编辑显示jsp页面

 * @return

 */

public String addOrEditUI(){

//如果有id就是编辑,编辑需要查询详情

if(StringUtils.isNotBlank(this.courseType.getCourseTypeId())){

//将查询的详情压入到栈顶,方便标签自动的回显

CrmCourseType findCourseType = this.courseTypeService.findById(this.courseType.getCourseTypeId());

ActionContext.getContext().getValueStack().push(findCourseType);

}

 

return "addOrEditUI";

}

 

/**

 * 添加或编辑 功能

 * @return

 */

public String addOrEdit(){

this.courseTypeService.addOrEdit(courseType);

return "addOrEdit";

}

 

3.4.4 jsp页面

使用标签进行回显

提供隐藏字段进行更新,添加不需要

 

 

<s:form namespace="/" action="courseTypeAction_addOrEdit">

<%--隐藏域 ,如果有值,及更新时才显示--%>

<s:if test="courseTypeId != null">

<s:hidden name="courseTypeId" value="%{courseTypeId}"></s:hidden>

</s:if>

<table width="88%" border="0" class="emp_table" style="width:80%;">

  <tr>

    <td width="10%">课程类别:</td>

    <td width="20%"><s:textfield name="courseName"></s:textfield></td>

    <td width="8%">总学时:</td>

    <td width="62%"><s:textfield name="total"></s:textfield></td>

  </tr>

  <tr>

    <td>课程费用:</td>

    <td><s:textfield name="courseCost"></s:textfield></td>

    <td></td>

    <td></td>

  </tr>

  <tr>

    <td>课程简介:</td>

    <td> </td>

    <td> </td>

    <td> </td>

  </tr>

  <tr>

    <td colspan="4">

     <s:textarea name="remark" cols="60" rows="10" ></s:textarea>

    </td>

  </tr>

</table>

</s:form>

 

 

 

要求

 

以上是关于CRM_2的主要内容,如果未能解决你的问题,请参考以下文章

crm 权限设计

CRM之菜单管理

CRM-kingadmin开发设计

BIEE12_根据显示指标展示不同报表

CRM项目实战-动态model form 增加自定义样式

CRM手记-8 | Django