目录:
(1)导入市场活动需求分析
(2)crm演示文件上传
(3)crm演示使用apache-poi解析excel文件
(4)crm设计导入市场活动
(5)crm实现导入市场活动Controller
(6)crm实现导入市场活动Controller
(7)crm实现导入市场活动前台页面
(8)crm优化导入市场活动
(9)下面做查看市场活动明细:
(10) crm实现市场活动明细查询备注信息Mapper层和Serevice层controller层
(11)crm实现查看市场活动明细前台页面
(12)crm添加市场活动备注实现Mapper层和Service层
(13)crm添加市场活动备注实现controller层
(1)导入市场活动需求分析
需求:它是导出的逆过程。
用户在市场活动主页面,点击"导入"按钮,弹出导入市场活动的模态窗口;
用户在导入市场活动的模态窗口选择要上传的文件,点击"导入"按钮,完成导入市场活动的功能.
*只支持.xls
*文件大小不超过5MB
*导入成功之后,提示成功导入记录条数,关闭模态窗口,刷新市场活动列表,显示第一页数据,保持每页显示条数不变
*导入失败,提示信息,模态窗口不关闭,列表也不刷新
(2)crm演示文件上传
先准备一个小例子:先创建一个fileuploadtest.jsp:
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%
- String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
- %>
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>演示文件上传</title>
- </head>
- <body>
- <!--
- 文件上传的表单三个条件:
- 1.表单组件标签必须用:<input type="file">
- <input type="text|password|radio|checkbox|hidden|button|submit|reset|file">
- <select>,<textarea>等
- 2.请求方式只能用:post
- get:参数通过请求头提交到后台,参数放在URL后边;只能向后台提交文本数据;对参数长度有限制;数据不安全;效率高
- post:参数通过请求体提交到后台;既能能提交文件数据,又能够提交二进制数据;理论上对参数长度没有限制;相对安全;效率相对较低
- 3.表单的编码格式只能用:multipart/form-data
- 根据HTTP协议的规定,浏览器每次向后台提交参数,都会对参数进行统一编码;默认采用的编码格式是urlencoded,这种编码格式只能对文本数据进行编码;
- 浏览器每次向后台提交参数,都会首先把所有的参数转换成字符串,然后对这些数据统一进行urlencoded编码;
- 文件上传的表单编码格式只能用multipart/form-data:enctype="multipart/form-data"
- -->
- <form action="workbench/activity/fileUpload.do" method="post" enctype="multipart/form-data">
- <input type="file" name="myFile"><br>
- <input type="text" name="userName"><br>
- <input type="submit" value="提交">
- </form>
- </body>
- </html>
controller不新建了,在ActivityController写就行了:
- //测试文件上传
- @RequestMapping("/workbench/activity/fileUpload.do")
- public @ResponseBody Object fileUpload(String userName, MultipartFile myFile) throws Exception{
- //把文本数据打印到控制台
- System.out.println("userName="+userName);
- //把文件在服务指定的目录中生成一个同样的文件
- String originalFilename=myFile.getOriginalFilename();//获取文件名
- File file=new File("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\",originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建
- myFile.transferTo(file);
-
- //返回响应信息
- ReturnObject returnObject=new ReturnObject();
- returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
- returnObject.setMessage("上传成功");
- return returnObject;
- }
在springmvc配置文件中配置文件上传解析器:
- <!-- 配置文件上传解析器 id:必须是multipartResolver-->
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
- <property name="maxUploadSize" value="#{1024*1024*80}"/>
- <property name="defaultEncoding" value="utf-8"/>
- </bean>
运行项目:需要先登录一下,在访问文件上传页面:
选择上传文件:
点击提交:
(3)crm演示使用apache-poi解析excel文件
ParseExcelTest:
创建测试类:
- package com.bjpowernode.crm.poi;
-
- import com.bjpowernode.crm.commons.utils.HSSFUtils;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
- import java.io.FileInputStream;
- import java.io.InputStream;
-
- /**
- * 使用apache-poi解析excel文件
- */
- public class ParseExcelTest {
- public static void main(String[] args) throws Exception{
- //根据excel文件生成HSSFWorkbook对象,封装了excel文件的所有信息
- InputStream is=new FileInputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\activityList.xls");
- HSSFWorkbook wb=new HSSFWorkbook(is);
- //根据wb获取HSSFSheet对象,封装了一页的所有信息
- HSSFSheet sheet=wb.getSheetAt(0);//页的下标,下标从0开始,依次增加
- //根据sheet获取HSSFRow对象,封装了一行的所有信息
- HSSFRow row=null;
- HSSFCell cell=null;
- for(int i=0;i<=sheet.getLastRowNum();i++) {//sheet.getLastRowNum():最后一行的下标
- row=sheet.getRow(i);//行的下标,下标从0开始,依次增加
-
- for(int j=0;j<row.getLastCellNum();j++) {//row.getLastCellNum():最后一列的下标+1
- //根据row获取HSSFCell对象,封装了一列的所有信息
- cell=row.getCell(j);//列的下标,下标从0开始,依次增加
-
- //获取列中的数据
- System.out.print(HSSFUtils.getCellValueForStr(cell)+" ");;
- }
-
- //每一行中所有列都打完,打印一个换行
- System.out.println();
- }
- }
- }
创建工具类:用来解析列的的属性类型,并获取属性值:
创建工具类HSSFUtils:
- package com.bjpowernode.crm.commons.utils;
-
- import org.apache.poi.hssf.usermodel.HSSFCell;
-
- /**
- * 关于excel文件操作的工具类
- */
- public class HSSFUtils {
- /**
- * 从指定的HSSFCell对象中获取列的值
- * @return
- */
- public static String getCellValueForStr(HSSFCell cell){
- String ret="";
- if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
- ret=cell.getStringCellValue();
- }else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
- ret=cell.getNumericCellValue()+"";
- }else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
- ret=cell.getBooleanCellValue()+"";
- }else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){
- ret=cell.getCellFormula();
- }else{
- ret="";
- }
-
- return ret;
- }
- }
运行ParseExcelTest类:
(4)crm设计导入市场活动
在ActivityMapper接口中:
在AcvtivityMapper.xml中:
- <!--批量保存创建的市场活动-->
- <insert id="insertActivityByList" parameterType="com.bjpowernode.crm.workbench.domain.Activity">
- insert into tbl_activity(id, owner, name, start_date, end_date, cost, description, create_time, create_by)
- values
- <foreach collection="list" item="obj" separator=",">
- (#{obj.id},#{obj.owner},#{obj.name},#{obj.startDate},#{obj.endDate},#{obj.cost},#{obj.description},#{obj.createTime},#{obj.createBy})
- </foreach>
- </insert>
在ActivitySertvice接口:
实现类:
(6)crm实现导入市场活动Controller
唯一id工具类:
- package com.bjpowernode.crm.commons.utils;
-
- import java.util.UUID;
-
- public class UUIDUtils {
- /**
- * 回去uuid的值
- * @return
- */
- public static String getUUID(){
- return UUID.randomUUID().toString().replaceAll("-","");
- }
- }
时间格式化工具类
- package com.bjpowernode.crm.commons.utils;
-
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
- /**
- * 对Date类型数据进行处理的工具类
- */
- public class DateUtils {
- /**
- * 对指定的date对象进行格式化: yyyy-MM-dd HH:mm:ss
- * @param date
- * @return
- */
- public static String formateDateTime(Date date){
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String dateStr=sdf.format(date);
- return dateStr;
- }
-
- /**
- * 对指定的date对象进行格式化: yyyy-MM-dd
- * @param date
- * @return
- */
- public static String formateDate(Date date){
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
- String dateStr=sdf.format(date);
- return dateStr;
- }
-
- /**
- * 对指定的date对象进行格式化: HH:mm:ss
- * @param date
- * @return
- */
- public static String formateTime(Date date){
- SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
- String dateStr=sdf.format(date);
- return dateStr;
- }
- }
在ActivityController:添加请求
- //导入市场活动请求
- @RequestMapping("/workbench/activity/importActivity.do")
- public @ResponseBody Object importActivity(MultipartFile activityFile,String userName,HttpSession session){
- System.out.println("userName="+userName);
- User user=(User) session.getAttribute(Contants.SESSION_USER);
- ReturnObject returnObject=new ReturnObject();
- try {
- //把excel文件写到磁盘目录中
- String originalFilename = activityFile.getOriginalFilename();
- File file = new File("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\", originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建
- activityFile.transferTo(file);
-
- //解析excel文件,获取文件中的数据,并且封装成activityList
- //根据excel文件生成HSSFWorkbook对象,封装了excel文件的所有信息
- InputStream is=new FileInputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\"+originalFilename);
-
-
- HSSFWorkbook wb=new HSSFWorkbook(is);
- //根据wb获取HSSFSheet对象,封装了一页的所有信息
- HSSFSheet sheet=wb.getSheetAt(0);//页的下标,下标从0开始,依次增加
- //根据sheet获取HSSFRow对象,封装了一行的所有信息
- HSSFRow row=null;
- HSSFCell cell=null;
- Activity activity=null;
- List<Activity> activityList=new ArrayList<>();
- for(int i=1;i<=sheet.getLastRowNum();i++) {//sheet.getLastRowNum():最后一行的下标
- row=sheet.getRow(i);//行的下标,下标从0开始,依次增加
- activity=new Activity();
- activity.setId(UUIDUtils.getUUID());
- activity.setOwner(user.getId());
- activity.setCreateTime(DateUtils.formateDateTime(new Date()));
- activity.setCreateBy(user.getId());
-
- for(int j=0;j
- //根据row获取HSSFCell对象,封装了一列的所有信息
- cell=row.getCell(j);//列的下标,下标从0开始,依次增加
-
- //获取列中的数据 调用工具类HSSFUtils
- String cellValue= HSSFUtils.getCellValueForStr(cell);
- if(j==0){
- activity.setName(cellValue);
- }else if(j==1){
- activity.setStartDate(cellValue);
- }else if(j==2){
- activity.setEndDate(cellValue);
- }else if(j==3){
- activity.setCost(cellValue);
- }else if(j==4){
- activity.setDescription(cellValue);
- }
- }
-
- //每一行中所有列都封装完成之后,把activity保存到list中
- activityList.add(activity);
- }
-
- //调用service层方法,保存市场活动
- int ret=activityService.saveCreateActivityByList(activityList);
-
- returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
- returnObject.setRetData(ret);//返回数据
- }catch (Exception e){
- e.printStackTrace();
- returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
- returnObject.setMessage("系统忙,请稍后重试....");
- }
-
- return returnObject;
- }
(6)crm实现导入市场活动前台页面
在市场活动index.jsp:
文件上传ajax需要设置的参数:
processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
contentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
- //给"批量导出"按钮添加单击事件
- $("#exportActivityAllBtn").click(function () {
- //发送同步请求
- window.location.href="workbench/activity/exportAllActivitys.do";
- });
-
- //给"导入"按钮添加单击事件
- $("#importActivityBtn").click(function () {
- //收集参数
- var activityFileName=$("#activityFile").val();
- var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLocaleLowerCase();//xls,XLS,Xls,xLs,....
- if(suffix!="xls"){
- alert("只支持xls文件");
- return;
- }
-
- //获取文件
- var activityFile=$("#activityFile")[0].files[0];
- if(activityFile.size>5*1024*1024){
- alert("文件大小不超过5MB");
- return;
- }
-
- //FormData是ajax提供的接口,可以模拟键值对向后台提交参数;
- //FormData最大的优势是不但能提交文本数据,还能提交二进制数据
- var formData=new FormData();
- formData.append("activityFile",activityFile);
- formData.append("userName","张三");
-
- //发送请求
- $.ajax({
- url:'workbench/activity/importActivity.do',
- data:formData,
- processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
- contentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
- type:'post',
- dataType:'json',
- success:function (data) {
- if(data.code=="1"){
- //提示成功导入记录条数
- alert("成功导入"+data.retData+"条记录");
- //关闭模态窗口
- $("#importActivityModal").modal("hide");
- //刷新市场活动列表,显示第一页数据,保持每页显示条数不变
- queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));
- }else{
- //提示信息
- alert(data.message);
- //模态窗口不关闭
- $("#importActivityModal").modal("show");
- }
- }
- });
- });
- });
我们上传的文件格式都是跟客户约束好的:
点击上传表数据:
选择文件:
点击导入:
(8)crm优化导入市场活动
这一行 代码效率是非常低的,它把内存中的数据写到磁盘上 ,这一过程效率是低的
File file = new File("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\", originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建
activityFile.transferTo(file);
下面的代码效率也低,它需要把磁盘上的数据,读 到内存
InputStream is=new FileInputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\"+originalFilename);
HSSFWorkbook wb=new HSSFWorkbook(is);
让他直接从内存读到内存,不进行读磁盘了,更改代码:ActivityController中的代码:
- //导入市场活动请求
- @RequestMapping("/workbench/activity/importActivity.do")
- public @ResponseBody Object importActivity(MultipartFile activityFile,String userName,HttpSession session){
- System.out.println("userName="+userName);
- User user=(User) session.getAttribute(Contants.SESSION_USER);
- ReturnObject returnObject=new ReturnObject();
- try {
- //把excel文件写到磁盘目录中
- /*String originalFilename = activityFile.getOriginalFilename();
- File file = new File("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\", originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建
- activityFile.transferTo(file);*/
-
- //解析excel文件,获取文件中的数据,并且封装成activityList
- //根据excel文件生成HSSFWorkbook对象,封装了excel文件的所有信息
- //InputStream is=new FileInputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\"+originalFilename);
-
- InputStream is=activityFile.getInputStream();
- HSSFWorkbook wb=new HSSFWorkbook(is);
- //根据wb获取HSSFSheet对象,封装了一页的所有信息
- HSSFSheet sheet=wb.getSheetAt(0);//页的下标,下标从0开始,依次增加
- //根据sheet获取HSSFRow对象,封装了一行的所有信息
- HSSFRow row=null;
- HSSFCell cell=null;
- Activity activity=null;
- List<Activity> activityList=new ArrayList<>();
- for(int i=1;i<=sheet.getLastRowNum();i++) {//sheet.getLastRowNum():最后一行的下标
- row=sheet.getRow(i);//行的下标,下标从0开始,依次增加
- activity=new Activity();
- activity.setId(UUIDUtils.getUUID());
- activity.setOwner(user.getId());
- activity.setCreateTime(DateUtils.formateDateTime(new Date()));
- activity.setCreateBy(user.getId());
-
- for(int j=0;j
- //根据row获取HSSFCell对象,封装了一列的所有信息
- cell=row.getCell(j);//列的下标,下标从0开始,依次增加
-
- //获取列中的数据 调用工具类HSSFUtils
- String cellValue= HSSFUtils.getCellValueForStr(cell);
- if(j==0){
- activity.setName(cellValue);
- }else if(j==1){
- activity.setStartDate(cellValue);
- }else if(j==2){
- activity.setEndDate(cellValue);
- }else if(j==3){
- activity.setCost(cellValue);
- }else if(j==4){
- activity.setDescription(cellValue);
- }
- }
-
- //每一行中所有列都封装完成之后,把activity保存到list中
- activityList.add(activity);
- }
-
- //调用service层方法,保存市场活动
- int ret=activityService.saveCreateActivityByList(activityList);
-
- returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
- returnObject.setRetData(ret);//返回数据
- }catch (Exception e){
- e.printStackTrace();
- returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
- returnObject.setMessage("系统忙,请稍后重试....");
- }
-
- return returnObject;
- }
重新运行项目:更改导入内容:
(9)下面做查看市场活动明细:
点击某个市场活动跳到详细的市场活动的页面:
需求:
用户在市场活动主页面,点击市场活动名称超级链接,跳转到明细页面,完成查看市场活动明细的功能.
*在市场活动明细页面,展示:
-市场活动的基本信息
-该市场活动下所有的备注信息
在ActivityMapper接口中添加方法:
ActivityMapper.xml:中写sql语句:
-
- <select id="selectActivityForDetailById" parameterType="string" resultMap="BaseResultMap">
- select a.id,u1.name as owner,a.name,a.start_date,a.end_date,a.cost,a.description,a.create_time,u2.name as create_by,
- a.edit_time,u3.name as edit_by
- from tbl_activity a
- join tbl_user u1 on a.owner=u1.id
- join tbl_user u2 on a.create_by=u2.id
- left join tbl_user u3 on a.edit_by=u3.id
- where a.id=#{id}
- select>
在ActivitySeervice接口中添加:
实现类:
(10) crm实现市场活动明细查询备注信息Mapper层和Serevice层controller层
通过Mybatis逆向工程生成市场活动备注 对应的Mapper等代码:
修改Mybatis逆向工程的配置文件,只修改注释表的信息
运行:就生成了响应的代码, 生成备注的实体类:ActivityRemmark、备注的ActivityRemarkMapper接口、ActivityRemarkMappe.xml备注的配置文件
在ActivityRemarkMappe接口里添加一个方法:
- /**
- * 根据activityId查询该市场活动下所有备注的明细信息
- * @param activityId
- * @return
- */
- List
selectActivityRemarkForDetailByActivityId(String activityId);
在ActivityRemarkMappe.xml中写sql语句:
-
- select ar.id,ar.note_content,ar.create_time,u1.name as create_by,ar.edit_time,u2.name as edit_by,ar.edit_flag
- from tbl_activity_remark ar
- join tbl_user u1 on ar.create_by=u1.id
- left join tbl_user u2 on ar.edit_by=u2.id
- where ar.activity_id=#{activityId}
- order by ar.create_time asc
-
创建ActivityRemarkService接口
- package com.bjpowernode.crm.workbench.service;
-
- import com.bjpowernode.crm.workbench.domain.ActivityRemark;
-
- import java.util.List;
-
- public interface ActivityRemarkService {
- //根据activityId查询该市场活动下所有备注的明细信息
- List
queryActivityRemarkForDetailByActivityId(String activityId); -
-
- }
实现类:
- package com.bjpowernode.crm.workbench.service.impl;
-
- import com.bjpowernode.crm.workbench.domain.ActivityRemark;
- import com.bjpowernode.crm.workbench.mapper.ActivityRemarkMapper;
- import com.bjpowernode.crm.workbench.service.ActivityRemarkService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- @Service("activityRemarkService")
- public class ActivityRemarkServiceImpl implements ActivityRemarkService {
-
- @Autowired
- private ActivityRemarkMapper activityRemarkMapper;
-
- @Override
- public List
queryActivityRemarkForDetailByActivityId(String activityId) { - return activityRemarkMapper.selectActivityRemarkForDetailByActivityId(activityId);
- }
-
-
- }
ActivityController:
- //根据activityId查询该市场活动和所有备注的明细信息请求
- @RequestMapping("/workbench/activity/detailActivity.do")
- public String detailActivity(String id,HttpServletRequest request){
- //调用service层方法,查询数据
- Activity activity=activityService.queryActivityForDetailById(id);
- //查看备注信息
- List<ActivityRemark> remarkList=activityRemarkService.queryActivityRemarkForDetailByActivityId(id);
- //把数据保存到request中
- request.setAttribute("activity",activity);
- request.setAttribute("remarkList",remarkList);
- //请求转发
- return "workbench/activity/detail";
- }
把detail.html改为detail.jsp:
修改从作用域获取数据:
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <%
- String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
- %>
- <head>
-
"<%=basePath%>"> - "UTF-8">
-
- <link href="jquery/bootstrap_3.3.0/css/bootstrap.min.css" type="text/css" rel="stylesheet" />
-
-
-
-
-
-
- "modal fade" id="editRemarkModal" role="dialog">
- <%-- 备注的id --%>
- type="hidden" id="remarkId">
- "modal-dialog" role="document" style="width: 40%;">
- "modal-content">
- "modal-header">
-
- "true">×
-
-
"modal-title" id="myModalLabel">修改备注
-
- "modal-body">
-
- type="hidden" id="edit-id">
- "form-group">
-
- "col-sm-10" style="width: 81%;">
-
-
-
-
-
- "modal-footer">
-
-
-
-
-
-
-
-
- "position: relative; top: 35px; left: 10px;">
-
- "position: relative; left: 40px; top: -30px;">
- "page-header">
-
市场活动-${activity.name} ${activity.startDate} ~ ${activity.endDate}
-
-
-
-
- "position: relative; top: -70px;">
- "position: relative; left: 40px; height: 30px;">
- "width: 300px; color: gray;">所有者
- "width: 300px;position: relative; left: 200px; top: -20px;">${activity.owner}
- "width: 300px;position: relative; left: 450px; top: -40px; color: gray;">名称
- "width: 300px;position: relative; left: 650px; top: -60px;">${activity.name}
- "height: 1px; width: 400px; background: #D5D5D5; position: relative; top: -60px;">
- "height: 1px; width: 400px; background: #D5D5D5; position: relative; top: -60px; left: 450px;">
-
-
- "position: relative; left: 40px; height: 30px; top: 10px;">
- "width: 300px; color: gray;">开始日期
- "width: 300px;position: relative; left: 200px; top: -20px;">${activity.startDate}
- "width: 300px;position: relative; left: 450px; top: -40px; color: gray;">结束日期
- "width: 300px;position: relative; left: 650px; top: -60px;">${activity.endDate}
- "height: 1px; width: 400px; background: #D5D5D5; position: relative; top: -60px;">
- "height: 1px; width: 400px; background: #D5D5D5; position: relative; top: -60px; left: 450px;">
-
- "position: relative; left: 40px; height: 30px; top: 20px;">
- "width: 300px; color: gray;">成本
- "width: 300px;position: relative; left: 200px; top: -20px;">${activity.cost}
- "height: 1px; width: 400px; background: #D5D5D5; position: relative; top: -20px;">
-
- "position: relative; left: 40px; height: 30px; top: 30px;">
- "width: 300px; color: gray;">创建者
- "width: 500px;position: relative; left: 200px; top: -20px;">${activity.createBy} "font-size: 10px; color: gray;">${activity.createTime}
- "height: 1px; width: 550px; background: #D5D5D5; position: relative; top: -20px;">
-
- "position: relative; left: 40px; height: 30px; top: 40px;">
- "width: 300px; color: gray;">修改者
- "width: 500px;position: relative; left: 200px; top: -20px;">${activity.editBy} "font-size: 10px; color: gray;">${activity.editTime}
- "height: 1px; width: 550px; background: #D5D5D5; position: relative; top: -20px;">
-
- "position: relative; left: 40px; height: 30px; top: 50px;">
- "width: 300px; color: gray;">描述
- "width: 630px;position: relative; left: 200px; top: -20px;">
-
- ${activity.description}
-
-
- "height: 1px; width: 850px; background: #D5D5D5; position: relative; top: -20px;">
-
-
- id="remarkDivList" style="position: relative; top: 30px; left: 40px;">
- "page-header">
-
备注
-
-
-
-
"${remarkList}" var="remark"> - id="div_${remark.id}" class="remarkDiv" style="height: 60px;">
- "${remark.createBy}" src="image/user-thumbnail.png" style="width: 30px; height:30px;">
- "position: relative; top: -40px; left: 40px;" >
-
${remark.noteContent}
- "gray">市场活动 "gray">- ${activity.name} "color: gray;"> ${remark.editFlag=='1'?remark.editTime:remark.createTime} 由${remark.editFlag=='1'?remark.editBy:remark.createBy}${remark.editFlag=='1'?'修改':'创建'}
- "position: relative; left: 500px; top: -30px; height: 30px; width: 100px; display: none;">
-
-
-
-
-
-
- <%--"remarkDiv" style="height: 60px;">
- "zhangsan" src="image/user-thumbnail.png" style="width: 30px; height:30px;">
- "position: relative; top: -40px; left: 40px;" >
-
哎呦!
- "gray">市场活动 "gray">- 发传单 "color: gray;"> 2017-01-22 10:10:10 由zhangsan
- "position: relative; left: 500px; top: -30px; height: 30px; width: 100px; display: none;">
-
-
-
- --%>
-
-
- <%--"remarkDiv" style="height: 60px;">
- "zhangsan" src="image/user-thumbnail.png" style="width: 30px; height:30px;">
- "position: relative; top: -40px; left: 40px;" >
-
呵呵!
- "gray">市场活动 "gray">- 发传单 "color: gray;"> 2017-01-22 10:20:10 由zhangsan
- "position: relative; left: 500px; top: -30px; height: 30px; width: 100px; display: none;">
-
-
-
- --%>
-
- id="remarkDiv" style="background-color: #E6E6E6; width: 870px; height: 90px;">
-
-
-
id="cancelAndSaveBtn" style="position: relative;left: 737px; top: 10px; display: none;">
-
-
-
-
-
- "height: 200px;">