目录:
(1)crm删除市场备注活动
(2)crm实现删除市场活动备注实现M,apper层和Service层
(3)crm修改市场活动备注实现
(4)crm实现保存修改市场活动备注前台页面
(5)crm线索实现
(6)crm线索和市场活动之间的关联关系 查看线索明细
(1)crm删除市场备注活动
用户在市场活动明细页面,点击"删除"市场活动备注的图标,完成删除市场活动备注的功能.
*删除成功之后,刷新备注列表
*删除失败,提示信息,备注列表不刷新
(2)crm实现删除市场活动备注实现
在ActivityRemarkMapper接口中添加:
在ActivityRemarkMapper.xml中添加:sql:
<!--根据id删除市场活动备注-->
<delete id="deleteActivityRemarkById" parameterType="string">
delete from tbl_activity_remark where id=#{id}
</delete>
在ActivityRemarkService接口:添加根据id删除市场活动备注
实现类:
在ActivityRemarkController中添加:
//根据id删除市场活动备注
@RequestMapping("/workbench/activity/deleteActivityRemarkById.do")
public @ResponseBody Object deleteActivityRemarkById(String id){
ReturnObject returnObject= new ReturnObject();
try {
//调用service层方法,删除备注
int ret = activityRemarkService.deleteActivityRemarkById(id);
if(ret>0){
returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
}else{
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
}catch (Exception e){
e.printStackTrace();
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
return returnObject;
}
给detail.jsp页面给修改删除a 连接加name属性:
js代码:
//给所有的"删除"图标添加单击事件 使用on这个点击事件
$("#remarkDivList").on("click","a[name='deleteA']",function () {
//收集参数
var id=$(this).attr("remarkId");//获取自定义属性的id
//发送请求
$.ajax({
url:'workbench/activity/deleteActivityRemarkById.do',
data:{
id:id
},
type:'post',
dataType:'json',
success:function (data) {
if(data.code=="1"){
//刷新备注列表 动态删除,而不是不去数据库查询
$("#div_"+id).remove();
}else{
//提示信息
alert(data.message);
}
}
});
});
先添加几条备注:
删除刚添加的备注:
(3)crm修改市场活动备注实现
需求:
用户在市场活动明细页面,点击"修改"市场活动备注的图标,弹出修改市场活动备注的模态窗口;
用户在修改市场活动备注的模态窗口,填写表单,点击"更新"按钮,完成修改市场活动备注的功能.
*备注内容不能为空
*修改成功之后,关闭模态窗口,刷新备注列表
*修改失败,提示信息,模态窗口不关闭,列表也不刷新
给修改图标添加事件:
//给所有市场活动备注后边的"修改"图标添加单击事件
$("#remarkDivList").on("click","a[name='editA']",function () {
//获取备注的id和noteContent
var id=$(this).attr("remarkId"); //获取自定义属性的id
var noteCotent=$("#div_"+id+" h5").text();// div下的子元素 h5 需要加一个空格
//把备注的id和noteContent写到修改备注的模态窗口中
$("#edit-id").val(id);//给隐藏域写入数据
$("#edit-noteContent").val(noteCotent);
//弹出修改市场活动备注的模态窗口
$("#editRemarkModal").modal("show");
});
<!-- 修改市场活动备注的模态窗口 -->
<div class="modal fade" id="editRemarkModal" role="dialog">
<%-- 备注的id --%>
<input type="hidden" id="remarkId">
<div class="modal-dialog" role="document" style="width: 40%;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="myModalLabel">修改备注</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" role="form">
<input type="hidden" id="edit-id">
<div class="form-group">
<label for="edit-noteContent" class="col-sm-2 control-label">内容</label>
<div class="col-sm-10" style="width: 81%;">
<textarea class="form-control" rows="3" id="edit-noteContent"></textarea>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary" id="updateRemarkBtn">更新</button>
</div>
</div>
</div>
</div>
点击修改按钮:
在ActivityRemarkMapper接口:
在ActivityRemarkMapper.xml中添加:
<!--保存修改的市场活动备注-->
<update id="updateActivityRemark" parameterType="com.bjpowernode.crm.workbench.domain.ActivityRemark">
update tbl_activity_remark
set note_content=#{noteContent},edit_time=#{editTime},edit_by=#{editBy},edit_flag=#{editFlag}
where id=#{id}
</update>
在ActivityRemarkSertvice接口:添加方法
实现类:
controller:
//保存修改的市场活动备注
@RequestMapping("/workbench/activity/saveEditActivityRemark.do")
public @ResponseBody Object saveEditActivityRemark(ActivityRemark remark,HttpSession session){
User user=(User) session.getAttribute(Contants.SESSION_USER);
//封装参数
remark.setEditTime(DateUtils.formateDateTime(new Date()));
remark.setEditBy(user.getId());
remark.setEditFlag(Contants.REMARK_EDIT_FLAG_YES_EDITED);
ReturnObject returnObject=new ReturnObject();
try {
//调用service层方法,保存修改的市场活动备注
int ret = activityRemarkService.saveEditActivityRemark(remark);
if(ret>0){
returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
returnObject.setRetData(remark);
}else{
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
}catch (Exception e){
e.printStackTrace();
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
return returnObject;
}
(4)crm实现保存修改市场活动备注前台页面
detail.jsp:添加js事件:
//给“更新”按钮添加单击事件
$("#updateRemarkBtn").click(function () {
//收集参数
var id=$("#edit-id").val();
var noteContent=$.trim($("#edit-noteContent").val());
//表单验证
if(noteContent==""){
alert("备注内容不能为空");
return;
}
//发送请求
$.ajax({
url:'workbench/activity/saveEditActivityRemark.do',
data:{
id:id,
noteContent:noteContent
},
type:'post',
dataType:'json',
success:function (data) {
if(data.code=="1"){
//关闭模态窗口
$("#editRemarkModal").modal("hide");
//刷新备注列表
$("#div_"+data.retData.id+" h5").text(data.retData.noteContent);// div下的子元素 h5 需要加一个空格
$("#div_"+data.retData.id+" small").text(" "+data.retData.editTime+" 由${sessionScope.sessionUser.name}修改");
}else{
//提示信息
alert(data.message);
//模态窗口不关闭
$("#editRemarkModal").modal("show");
}
}
});
});
修改备注:
成功修改:
(5)crm线索实现
主要完成一下的功能
2,创建线索:表分析
tbl_dic_type code 存储下拉列表的类型的,每一个下拉列表在tbl_dic_type对应一条记录,主键值都是各自的编码,有含义的字段做主键,在程序如果需要用到这些主键值,可以直接使用。
tbl_dic_value type_code 存储每一个下拉列表中的选项值,通过type_code区分选项值属于哪一个下拉列表
queryDicValueByTypeCode("type")
通过Mybatis逆向工程生成DicValueMapper等代码:
修改生成代码的目录:
运行Mybatis逆向工程:生成代码:DicValueMapper接口,DicValueMappe.xml,实体类DicValue
在DivValueMapper接口添加:根据typeCode查询数据字典值的方法
DivValueMapper.xml中:添加sql语句:
<!--根据typeCode查询数据字典值 <include refid="Base_Column_List"/>:使用sql语句片段-->
<select id="selectDicValueByTypeCode" parameterType="string" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tbl_dic_value
where type_code=#{typeCode}
order by order_no asc
</select>
创建DicValueService接口和实现类。
package com.bjpowernode.crm.settings.service;
import com.bjpowernode.crm.settings.domain.DicValue;
import java.util.List;
public interface DicValueService {
//根据typeCode查询数据字典值
List<DicValue> queryDicValueByTypeCode(String typeCode);
}
实现类:
package com.bjpowernode.crm.settings.service.impl;
import com.bjpowernode.crm.settings.domain.DicValue;
import com.bjpowernode.crm.settings.mapper.DicValueMapper;
import com.bjpowernode.crm.settings.service.DicValueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("dicValueService")
public class DicValueServiceImpl implements DicValueService {
@Autowired
private DicValueMapper dicValueMapper;
//根据typeCode查询数据字典值
@Override
public List<DicValue> queryDicValueByTypeCode(String typeCode) {
return dicValueMapper.selectDicValueByTypeCode(typeCode);
}
}
创建ClueController:
package com.bjpowernode.crm.workbench.web.controller;
import com.bjpowernode.crm.commons.contants.Contants;
import com.bjpowernode.crm.commons.domain.ReturnObject;
import com.bjpowernode.crm.commons.utils.DateUtils;
import com.bjpowernode.crm.commons.utils.UUIDUtils;
import com.bjpowernode.crm.settings.domain.DicValue;
import com.bjpowernode.crm.settings.domain.User;
import com.bjpowernode.crm.settings.service.DicValueService;
import com.bjpowernode.crm.settings.service.UserService;
import com.bjpowernode.crm.workbench.domain.Activity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;
@Controller
public class ClueController {
@Autowired
private UserService userService;
@Autowired
private DicValueService dicValueService;
//根据typeCode查询数据字典值
@RequestMapping("/workbench/clue/index.do")
public String index(HttpServletRequest request){
//调用service层方法,查询动态数据
List<User> userList=userService.queryAllUsers();//查询用户
List<DicValue> appellationList=dicValueService.queryDicValueByTypeCode("appellation");//查询称呼
List<DicValue> clueStateList=dicValueService.queryDicValueByTypeCode("clueState");//查询线索状态
List<DicValue> sourceList=dicValueService.queryDicValueByTypeCode("source");//查询线索来源
//把数据保存到request中
request.setAttribute("userList",userList);
request.setAttribute("appellationList",appellationList);
request.setAttribute("clueStateList",clueStateList);
request.setAttribute("sourceList",sourceList);
//请求转发
return "workbench/clue/index";
}
}
修改称index.jsp:
在添加线索模态窗口修改:
通过EL和JSTL遍历数据:
线索:
称呼:
线索状态:
线索来源:
修改线索模态窗口也进行以上的设置
主页面也要修改动态获取数据:
在业务主页面修改超链接,点击线索,跳转到线索页面:
运行项目:
点击线索 :
线索来源是动态的从数据库查询来的:
添加线索里面的数据也是动态的:
通过MyBatis逆向工程生成线索的相关代码:
修改来配置文件修改生成代码的位置:
打开线索表:
运行逆向工程
生成代码:ClueMapper接口,ClueMapper.xml文件、实体类Clue
在ClueMapper添加方法:保存线索:
ClueMapper.xml:添加sql:
<!--保存创建的线索-->
<insert id="insertClue" parameterType="com.bjpowernode.crm.workbench.domain.Clue">
insert into tbl_clue(id, fullname, appellation, owner, company, job, email, phone, website, mphone, state,source, create_by, create_time, description, contact_summary,next_contact_time, address)
values (#{id},#{ fullname},#{ appellation},#{ owner},#{ company},#{ job},#{ email},#{ phone},#{ website},#{ mphone},#{ state},#{source},#{ createBy},#{ createTime},#{ description},#{ contactSummary},#{nextContactTime},#{ address})
</insert>
在ClueService接口添加方法:
package com.bjpowernode.crm.workbench.service;
import com.bjpowernode.crm.workbench.domain.Clue;
import java.util.Map;
public interface ClueService {
//保存创建的线索
int saveCreateClue(Clue clue);
}
实现类:
在ClueController中添加请求:
//保存创建的线索
@RequestMapping("/workbench/clue/saveCreateClue.do")
public @ResponseBody Object saveCreateClue(Clue clue, HttpSession session){
User user=(User)session.getAttribute(Contants.SESSION_USER);
//自己封装封装参数
clue.setId(UUIDUtils.getUUID());
clue.setCreateTime(DateUtils.formateDateTime(new Date()));
clue.setCreateBy(user.getId());
ReturnObject returnObject=new ReturnObject();
try {
//调用service层方法,保存创建的线索
int ret = clueService.saveCreateClue(clue);
if(ret>0){
returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
}else{
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
}catch (Exception e){
e.printStackTrace();
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
return returnObject;
}
在线索主页detail.js页面创建线索的模态窗口,给保存按钮添加点击事件:
先添加一个id属性
//给"保存"按钮添加单击事件
$("#saveCreateClueBtn").click(function () {
//收集参数
var fullname =$.trim($("#create-fullname").val());
var appellation =$("#create-appellation").val();
var owner =$("#create-owner").val();
var company =$.trim($("#create-company").val());
var job =$.trim($("#create-job").val());
var email =$.trim($("#create-email").val());
var phone =$.trim($("#create-phone").val());
var website =$.trim($("#create-website").val());
var mphone =$.trim($("#create-mphone").val());
var state =$("#create-state").val();
var source =$("#create-source").val();
var description =$.trim($("#create-description").val());
var contactSummary =$.trim($("#create-contactSummary").val());
var nextContactTime=$.trim($("#create-nextContactTime").val());
var address =$.trim($("#create-address").val());
//表单验证(作业)
//带*非空
//正则表达式验证
//发送请求
$.ajax({
url:'workbench/clue/saveCreateClue.do',
data:{
fullname :fullname ,
appellation :appellation ,
owner :owner ,
company :company ,
job :job ,
email :email ,
phone :phone ,
website :website ,
mphone :mphone ,
state :state ,
source :source ,
description :description ,
contactSummary :contactSummary ,
nextContactTime:nextContactTime,
address :address
},
type:'post',
dataType:'json',
success:function (data) {
if(data.code=="1"){
//关闭模态窗口
$("#createClueModal").modal("hide");
//刷新线索列表,显示第一页数据,保持每页显示条数不变(作业)
}else{
//提示信息
alert(data.message);
//模态窗口不关闭
$("#createClueModal").modal("show");
}
}
});
});
//给"创建"按钮添加单击事件
$("#createClueBtn").click(function () {
//初始化工作
$("#createClueForm")[0].reset();
//弹出模态窗口
$("#createClueModal").modal("show");
});
点击保存:
(6)crm线索和市场活动之间的关联关系 查看线索明细
查询线索明细流程:
首先在线索Mapper添加方法:ClueMapper:
ClueMapper.xml中添加sql语句:
<!--通过id查询线索详情-->
<select id="selectClueForDetailById" parameterType="string" resultMap="BaseResultMap">
select cl.id,cl.fullname,dicv1.value as appellation,u1.name as owner,cl.company,cl.job,cl.email,cl.phone,
cl.website,cl.mphone,dicv2.value as state,dicv3.value as source,u2.name as create_by,cl.create_time,
u3.name as edit_by,cl.edit_time,cl.description,cl.contact_summary,cl.next_contact_time,cl.address
from tbl_clue cl
left join tbl_dic_value dicv1 on cl.appellation=dicv1.id
left join tbl_dic_value dicv2 on cl.state=dicv2.id
left join tbl_dic_value dicv3 on cl.source=dicv3.id
join tbl_user u1 on cl.owner=u1.id
join tbl_user u2 on cl.create_by=u2.id
left join tbl_user u3 on cl.edit_by=u3.id
where cl.id = #{id,jdbcType=CHAR}
</select>
在ClueService接口添加:
实现类:
使用MyBatis逆向工程生成线索备注Mapper、线索备注实体类代码:
修改配置文件修改生成的表:
运行:就生成了线索备注的实体类ClueMark、ClueRemarkMapper接口、ClueRemarkMapper.xml
在 ClueRemarkMapper接口:添加
ClueRemarkMapper.xm中添加sql语句:
<!--根据线索id查询该线索的所有备注详细信息-->
<select id="selectClueRemarkForDetailByClueId" parameterType="string" resultMap="BaseResultMap">
select cr.id,cr.note_content,u1.name as create_by,cr.create_time,u2.name as edit_by,cr.edit_time,cr.edit_flag
from tbl_clue_remark cr
join tbl_user u1 on cr.create_by=u1.id
left join tbl_user u2 on cr.edit_by=u2.id
where cr.clue_id=#{clueId}
</select>
创建ClueRemarkService接口:
package com.bjpowernode.crm.workbench.service;
import com.bjpowernode.crm.workbench.domain.ClueRemark;
import java.util.List;
public interface ClueRemarkService {
//根据线索id查询该线索下的所有备注详细信息
List<ClueRemark> queryClueRemarkForDetailByClueId(String clueId);
}
实现类:
在市场活动的Mapper:ActivityMapper:加一个方法:
ActivityMapper.xml:添加sql语句
<!--根据clueId查询该线索相关联的市场活动的明细信息-->
<select id="selectActivityForDetailByClueId" parameterType="string" resultMap="BaseResultMap">
select a.id,a.name,a.start_date,a.end_date,u.name as owner
from tbl_activity a
join tbl_user u on a.owner=u.id
join tbl_clue_activity_relation car on car.activity_id=a.id
where car.clue_id=#{clueId}
</select>
在ActivityService接口:添加方法
//根据clueId查询该线索相关联的市场活动的明细信息
List<Activity> queryActivityForDetailByClueId(String clueId);
实现类:
//根据clueId查询该线索相关联的市场活动的明细信息
@Override
public List<Activity> queryActivityForDetailByClueId(String clueId) {
return activityMapper.selectActivityForDetailByClueId(clueId);
}
在ClueControoler:添加:
//线索请求页面的跳转请求
@RequestMapping("/workbench/clue/detailClue.do")
public String detailClue(String id,HttpServletRequest request){
//调用service层方法,查询数据
Clue clue=clueService.queryClueForDetailById(id);
List<ClueRemark> remarkList=clueRemarkService.queryClueRemarkForDetailByClueId(id);
List<Activity> activityList=activityService.queryActivityForDetailByClueId(id);
//把数据保存到request中
request.setAttribute("clue",clue);
request.setAttribute("remarkList",remarkList);
request.setAttribute("activityList",activityList);
//请求转发
return "workbench/clue/detail";
}
把修改线索下的详细页面为detial.jsp
修改页面代码:
从作用域获取数据:
注释备注,进行动态获取:
注释写死的市场活动,动态获取:
运行项目:
点击张三博士: