huangxiao пре 1 месец
родитељ
комит
850c268daa

Разлика између датотеке није приказан због своје велике величине
+ 17 - 0
doc/backup.json


+ 247 - 0
src/main/java/net/mingsoft/tf/action/MessageAction.java

@@ -0,0 +1,247 @@
+package net.mingsoft.tf.action;
+
+import java.util.List;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import cn.hutool.core.util.ObjectUtil;
+import java.util.*;
+
+import net.mingsoft.base.entity.ResultData;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+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 org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import java.util.stream.Collectors;
+
+import org.springframework.web.bind.annotation.*;
+import net.mingsoft.tf.biz.IMessageBiz;
+import net.mingsoft.tf.entity.MessageEntity;
+import net.mingsoft.base.entity.BaseEntity;
+import net.mingsoft.basic.util.BasicUtil;
+import net.mingsoft.basic.util.StringUtil;
+import net.mingsoft.basic.bean.EUListBean;
+import net.mingsoft.basic.annotation.LogAnn;
+import net.mingsoft.basic.constant.e.BusinessTypeEnum;
+import org.apache.commons.lang3.StringUtils;
+
+
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+
+/**
+* 留言管理控制层
+* @author 阿白
+* 创建日期:2025年12月13日 下午2:14:43<br/>
+* 历史修订:<br/>
+*/
+@Tag(name = "后台-留言接口")
+@Controller("tfMessageAction")
+@RequestMapping("/${ms.manager.path}/tf/message")
+public class MessageAction extends net.mingsoft.tf.action.BaseAction{
+
+
+    /**
+    * 注入留言业务层
+    */
+    @Autowired
+    private IMessageBiz messageBiz;
+
+    /**
+    * 返回主界面index
+    */
+    @Hidden
+    @GetMapping("/index")
+    public String index() {
+        return "/tf/message/index";
+    }
+
+
+    /**
+    * 返回编辑界面message的form
+    */
+    @Hidden
+    @GetMapping("/form")
+    public String form() {
+        return "/tf/message/form";
+    }
+
+
+    /**
+    * 查询留言列表
+    * @param message 留言实体
+    */
+    @Operation(summary = "查询留言列表接口")
+    @Parameters({
+        @Parameter(name = "messageName", description = "姓名", in = ParameterIn.QUERY),
+        @Parameter(name = "messageCompany", description = "公司", in = ParameterIn.QUERY),
+        @Parameter(name = "messageEmail", description = "邮箱", in = ParameterIn.QUERY),
+        @Parameter(name = "messageTel", description = "电话", in = ParameterIn.QUERY),
+        @Parameter(name = "messageType", description = "咨询类型", in = ParameterIn.QUERY),
+        @Parameter(name = "messageContent", description = "内容", in = ParameterIn.QUERY),
+    })
+    @RequestMapping(value ="/list",method = {RequestMethod.GET,RequestMethod.POST})
+    @ResponseBody
+    @RequiresPermissions("tf:message:view")
+    public ResultData list(@ModelAttribute @Parameter(hidden = true) MessageEntity message) {
+        BasicUtil.startPage();
+        List messageList = null;
+        if ( message.getSqlWhere() != null){
+            messageList = messageBiz.query(message);
+        } else {
+            LambdaQueryWrapper<MessageEntity> wrapper = new LambdaQueryWrapper<>(message).orderByDesc(MessageEntity::getCreateDate);
+            messageList = messageBiz.list(wrapper);
+        }
+        return ResultData.build().success(new EUListBean(messageList,(int)BasicUtil.endPage(messageList).getTotal()));
+    }
+
+
+    /**
+    * 获取留言
+    * @param message 留言实体
+    */
+    @Operation(summary = "获取留言列表接口")
+    @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY)
+    @GetMapping("/get")
+    @ResponseBody
+    @RequiresPermissions("tf:message:view")
+    public ResultData get(@ModelAttribute @Parameter(hidden = true) MessageEntity message) {
+        if (StringUtils.isBlank(message.getId())) {
+            return ResultData.build().error(getResString("err.error",this.getResString("id")));
+        }
+        MessageEntity _message = (MessageEntity)messageBiz.getById(message.getId());
+        return ResultData.build().success(_message);
+    }
+
+
+    /**
+    * 保存留言
+    * @param message 留言实体
+    */
+    @Operation(summary = "保存留言列表接口")
+    @Parameters({
+        @Parameter(name = "messageName", description = "姓名", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageCompany", description = "公司", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageEmail", description = "邮箱", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageTel", description = "电话", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageType", description = "咨询类型", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageContent", description = "内容", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/save")
+    @ResponseBody
+    @LogAnn(title = "保存留言", businessType = BusinessTypeEnum.INSERT)
+    @RequiresPermissions("tf:message:save")
+    public ResultData save(@ModelAttribute @Parameter(hidden = true) MessageEntity message) {
+
+        if (  StringUtils.isNotBlank(message.getMessageName()) && !StringUtil.checkLength(message.getMessageName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.name"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageCompany()) && !StringUtil.checkLength(message.getMessageCompany()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.company"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageEmail()) && !StringUtil.checkLength(message.getMessageEmail()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.email"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageTel()) && !StringUtil.checkLength(message.getMessageTel()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.tel"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageType()) && !StringUtil.checkLength(message.getMessageType()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.type"), "0", "255"));
+        }
+        messageBiz.save(message);
+        return ResultData.build().success(message);
+    }
+
+    /**
+    *  删除留言
+    *
+    * @param messages 留言实体
+    */
+    @Operation(summary = "批量删除留言列表接口")
+    @PostMapping("/delete")
+    @ResponseBody
+    @LogAnn(title = "删除留言", businessType = BusinessTypeEnum.DELETE)
+    @RequiresPermissions("tf:message:del")
+    public ResultData delete(@RequestBody List<MessageEntity> messages) {
+        List<String> ids = (List)messages.stream().map((p) -> {return p.getId();}).collect(Collectors.toList());
+        return this.messageBiz.removeByIds(ids) ? ResultData.build().success() : ResultData.build().error(this.getResString("err.error", new String[]{this.getResString("id")}));
+    }
+
+    /**
+    *	更新留言列表
+    *
+    * @param message 留言实体
+    */
+    @Operation(summary = "更新留言列表接口")
+    @Parameters({
+        @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY),
+        @Parameter(name = "messageName", description = "姓名", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageCompany", description = "公司", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageEmail", description = "邮箱", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageTel", description = "电话", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageType", description = "咨询类型", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "messageContent", description = "内容", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/update")
+    @ResponseBody
+    @LogAnn(title = "更新留言", businessType = BusinessTypeEnum.UPDATE)
+    @RequiresPermissions("tf:message:update")
+    public ResultData update(@ModelAttribute @Parameter(hidden = true) MessageEntity message) {
+        //先查询数据是否存在
+        MessageEntity _message = (MessageEntity)messageBiz.getById(message.getId());
+        if(_message == null) {
+            return ResultData.build().error(getResString("err.not.exist",message.getId() ));
+        }
+
+        if (  StringUtils.isNotBlank(message.getMessageName()) && !StringUtil.checkLength(message.getMessageName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.name"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageCompany()) && !StringUtil.checkLength(message.getMessageCompany()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.company"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageEmail()) && !StringUtil.checkLength(message.getMessageEmail()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.email"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageTel()) && !StringUtil.checkLength(message.getMessageTel()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.tel"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(message.getMessageType()) && !StringUtil.checkLength(message.getMessageType()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("message.type"), "0", "255"));
+        }
+        messageBiz.updateById(message);
+        return ResultData.build().success(message);
+    }
+
+    @GetMapping("verify")
+    @ResponseBody
+    public ResultData verify(String fieldName, String fieldValue, String id,String idName) {
+        boolean verify = false;
+        if (StringUtils.isBlank(id)) {
+            verify = super.validated("MESSAGE",fieldName,fieldValue);
+        } else {
+            verify = super.validated("MESSAGE",fieldName,fieldValue,id,idName);
+        }
+        if (verify) {
+            return ResultData.build().success(false);
+        }else {
+            return ResultData.build().success(true);
+        }
+    }
+
+}

+ 16 - 0
src/main/java/net/mingsoft/tf/biz/IMessageBiz.java

@@ -0,0 +1,16 @@
+package net.mingsoft.tf.biz;
+
+import net.mingsoft.base.biz.IBaseBiz;
+import net.mingsoft.tf.entity.MessageEntity;
+
+
+/**
+ * 留言业务
+ * @author 阿白
+ * 创建日期:2025年12月13日 下午2:14:43<br/>
+ * 历史修订:<br/>
+ */
+public interface IMessageBiz extends IBaseBiz<MessageEntity> {
+
+
+}

+ 34 - 0
src/main/java/net/mingsoft/tf/biz/impl/MessageBizImpl.java

@@ -0,0 +1,34 @@
+package net.mingsoft.tf.biz.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import net.mingsoft.base.biz.impl.BaseBizImpl;
+import net.mingsoft.base.dao.IBaseDao;
+import java.util.*;
+import net.mingsoft.tf.entity.MessageEntity;
+import net.mingsoft.tf.biz.IMessageBiz;
+import net.mingsoft.tf.dao.IMessageDao;
+
+/**
+* 留言管理持久化层
+* @author 阿白
+* 创建日期:2025年12月13日 下午2:14:43<br/>
+* 历史修订:<br/>
+*/
+@Service("tfmessageBizImpl")
+public class MessageBizImpl extends BaseBizImpl<IMessageDao,MessageEntity> implements IMessageBiz {
+
+
+    @Autowired
+    private IMessageDao messageDao;
+
+
+    @Override
+    protected IBaseDao getDao() {
+        // TODO Auto-generated method stub
+        return messageDao;
+    }
+
+
+
+}

+ 14 - 0
src/main/java/net/mingsoft/tf/dao/IMessageDao.java

@@ -0,0 +1,14 @@
+package net.mingsoft.tf.dao;
+
+import net.mingsoft.base.dao.IBaseDao;
+import java.util.*;
+import net.mingsoft.tf.entity.MessageEntity;
+
+/**
+ * 留言持久层
+ * @author 阿白
+ * 创建日期:2025年12月13日 下午2:14:43<br/>
+ * 历史修订:<br/>
+ */
+public interface IMessageDao extends IBaseDao<MessageEntity> {
+}

+ 23 - 0
src/main/java/net/mingsoft/tf/dao/IMessageDao.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="net.mingsoft.tf.dao.IMessageDao">
+
+	<resultMap id="resultMap" type="net.mingsoft.tf.entity.MessageEntity">
+				<result column="MESSAGE_NAME" property="messageName" /><!--姓名 -->
+				<result column="MESSAGE_COMPANY" property="messageCompany" /><!--公司 -->
+				<result column="MESSAGE_EMAIL" property="messageEmail" /><!--邮箱 -->
+				<result column="MESSAGE_TEL" property="messageTel" /><!--电话 -->
+				<result column="MESSAGE_TYPE" property="messageType" /><!--咨询类型 -->
+				<result column="MESSAGE_CONTENT" property="messageContent" /><!--内容 -->
+	</resultMap>
+
+	<select id="query" resultMap="resultMap">
+		SELECT * FROM MDIY_FORM_MESSAGE
+		<where>
+			DEL=0
+			<include refid="net.mingsoft.base.dao.IBaseDao.sqlWhere"></include>
+		</where>
+		 ORDER BY ID DESC
+	</select>
+
+</mapper>

+ 140 - 0
src/main/java/net/mingsoft/tf/entity/MessageEntity.java

@@ -0,0 +1,140 @@
+package net.mingsoft.tf.entity;
+
+
+import org.springframework.format.annotation.DateTimeFormat;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import net.mingsoft.base.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.SqlCondition;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+
+import java.util.Date;
+/**
+* 留言实体
+* @author 阿白
+* 创建日期:2025年12月13日 下午2:14:43<br/>
+* 历史修订:<br/>
+*/
+@TableName("MDIY_FORM_MESSAGE")
+public class MessageEntity extends BaseEntity {
+
+private static final long serialVersionUID = 1765606483812L;
+
+    /**
+    * 姓名
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String messageName;
+    /**
+    * 公司
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String messageCompany;
+    /**
+    * 邮箱
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String messageEmail;
+    /**
+    * 电话
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String messageTel;
+    /**
+    * 咨询类型
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String messageType;
+    /**
+    * 内容
+    */
+    
+    private String messageContent;
+
+
+    /**
+    * 设置姓名
+    */
+    public void setMessageName(String messageName) {
+        this.messageName = messageName;
+    }
+
+    /**
+    * 获取姓名
+    */
+    public String getMessageName() {
+        return this.messageName;
+    }
+    /**
+    * 设置公司
+    */
+    public void setMessageCompany(String messageCompany) {
+        this.messageCompany = messageCompany;
+    }
+
+    /**
+    * 获取公司
+    */
+    public String getMessageCompany() {
+        return this.messageCompany;
+    }
+    /**
+    * 设置邮箱
+    */
+    public void setMessageEmail(String messageEmail) {
+        this.messageEmail = messageEmail;
+    }
+
+    /**
+    * 获取邮箱
+    */
+    public String getMessageEmail() {
+        return this.messageEmail;
+    }
+    /**
+    * 设置电话
+    */
+    public void setMessageTel(String messageTel) {
+        this.messageTel = messageTel;
+    }
+
+    /**
+    * 获取电话
+    */
+    public String getMessageTel() {
+        return this.messageTel;
+    }
+    /**
+    * 设置咨询类型
+    */
+    public void setMessageType(String messageType) {
+        this.messageType = messageType;
+    }
+
+    /**
+    * 获取咨询类型
+    */
+    public String getMessageType() {
+        return this.messageType;
+    }
+    /**
+    * 设置内容
+    */
+    public void setMessageContent(String messageContent) {
+        this.messageContent = messageContent;
+    }
+
+    /**
+    * 获取内容
+    */
+    public String getMessageContent() {
+        return this.messageContent;
+    }
+
+
+}

+ 6 - 0
src/main/java/net/mingsoft/tf/resources/resources_en_US.properties

@@ -64,3 +64,9 @@ submission.tel=submission tel
 submission.email=submission email
 submission.file=submission file
 recruitment.id=recruitment id
+message.name=message name
+message.company=message company
+message.email=message email
+message.tel=message tel
+message.type=message type
+message.content=message content

+ 6 - 0
src/main/java/net/mingsoft/tf/resources/resources_zh_CN.properties

@@ -64,3 +64,9 @@ submission.tel=\u8054\u7cfb\u7535\u8bdd
 submission.email=\u90ae\u4ef6
 submission.file=\u9644\u4ef6
 recruitment.id=\u62db\u8058ID
+message.name=\u59d3\u540d
+message.company=\u516c\u53f8
+message.email=\u90ae\u7bb1
+message.tel=\u7535\u8bdd
+message.type=\u54a8\u8be2\u7c7b\u578b
+message.content=\u5185\u5bb9

+ 237 - 0
src/main/webapp/WEB-INF/manager/tf/message/form.ftl

@@ -0,0 +1,237 @@
+    <!DOCTYPE html>
+    <html>
+
+    <head>
+        <title>留言</title>
+            <#include "../../include/head-file.ftl">
+
+    </head>
+
+    <body>
+    <div id="form" v-cloak>
+        <el-header class="ms-header ms-tr" height="50px">
+            <el-button type="primary" class="iconfont icon-baocun" size="default" @click="save()" :loading="saveDisabled">保存</el-button>
+            <el-button size="default" class="iconfont icon-fanhui" plain @click="back()">返回</el-button>
+        </el-header>
+        <el-main class="ms-container" v-loading="loading">
+            <el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="right" size="default">
+
+                        <el-row
+                                :gutter="0"
+                                justify="start" align="top">
+                                <el-col :span=12>
+            <!--姓名-->
+
+	        <el-form-item  label="姓名" prop="messageName">
+	            <el-input
+                        v-model="form.messageName"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入姓名">
+                </el-input>
+	        </el-form-item>   
+                                </el-col>
+                                <el-col :span=12>
+            <!--公司-->
+
+	        <el-form-item  label="公司" prop="messageCompany">
+	            <el-input
+                        v-model="form.messageCompany"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入公司">
+                </el-input>
+	        </el-form-item>   
+                                </el-col>
+                        </el-row>
+                        <el-row
+                                :gutter="0"
+                                justify="start" align="top">
+                                <el-col :span=12>
+            <!--邮箱-->
+
+	        <el-form-item  label="邮箱" prop="messageEmail">
+	            <el-input
+                        v-model="form.messageEmail"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入邮箱">
+                </el-input>
+	        </el-form-item>   
+                                </el-col>
+                                <el-col :span=12>
+            <!--电话-->
+
+	        <el-form-item  label="电话" prop="messageTel">
+	            <el-input
+                        v-model="form.messageTel"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入电话">
+                </el-input>
+	        </el-form-item>   
+                                </el-col>
+                        </el-row>
+                        <el-row
+                                :gutter="0"
+                                justify="start" align="top">
+                                <el-col :span=12>
+            <!--咨询类型-->
+
+	        <el-form-item  label="咨询类型" prop="messageType">
+	            <el-input
+                        v-model="form.messageType"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入咨询类型">
+                </el-input>
+	        </el-form-item>   
+                                </el-col>
+                                <el-col :span=12>
+                                </el-col>
+                        </el-row>
+        <!--内容-->	
+	        <el-form-item  label="内容" prop="messageContent">
+	            <el-input
+                        type="textarea" :rows="5"
+                        :disabled="false"
+                        v-model="form.messageContent"
+                        :style="{width: '100%'}"
+                        placeholder="请输入内容">
+                </el-input>
+	        </el-form-item>
+	   
+            </el-form>
+        </el-main>
+    </div>
+    </body>
+
+    </html>
+
+<script>
+    var formVue = new _Vue({
+        el: '#form',
+
+        data:function() {
+            return {
+                loading:false,
+                saveDisabled: false,
+                //表单数据
+                form: {
+                    // 姓名
+                    messageName:'',
+                    // 公司
+                    messageCompany:'',
+                    // 邮箱
+                    messageEmail:'',
+                    // 电话
+                    messageTel:'',
+                    // 咨询类型
+                    messageType:'',
+                    // 内容 
+                    messageContent:'',
+
+                },
+                rules:{
+                        // 姓名
+                        messageName: [{"min":0,"max":255,"message":"姓名长度必须为0-255"}],
+                        // 公司
+                        messageCompany: [{"min":0,"max":255,"message":"公司长度必须为0-255"}],
+                        // 邮箱
+                        messageEmail: [{"type":"email","message":"邮箱格式不正确"},{"min":0,"max":255,"message":"邮箱长度必须为0-255"}],
+                        // 电话
+                        messageTel: [{"min":0,"max":255,"message":"电话长度必须为0-255"}],
+                        // 咨询类型
+                        messageType: [{"min":0,"max":255,"message":"咨询类型长度必须为0-255"}],
+
+                },
+
+            }
+        },
+        watch:{
+
+        },
+        components:{
+        },
+        computed:{
+        },
+        methods: {
+
+            back: function (){
+                ms.util.openSystemUrl("/tf/message/index.do",true);
+            },
+
+            save:function() {
+                var that = this;
+                var url = ms.manager + "/tf/message/save.do"
+                if (that.form.id > 0) {
+                    url = ms.manager + "/tf/message/update.do";
+                }
+
+                this.$refs.form.validate(function(valid) {
+                    if (valid) {
+                        that.saveDisabled = true;
+                        var form = JSON.parse(JSON.stringify(that.form));
+                        ms.http.post(url, form).then(function (res) {
+                            if (res.result) {
+                                that.$notify({
+                                    title: "成功",
+                                    message: "保存成功",
+                                    type: 'success'
+                                });
+                                ms.util.openSystemUrl("/tf/message/index.do",that.form.id > 0);
+                            } else {
+                                that.$notify({
+                                    title: "错误",
+                                    message: res.msg,
+                                    type: 'warning'
+                                });
+                            }
+
+                            that.saveDisabled = false;
+                        }).catch(function (err) {
+                            console.log(err);
+                            that.saveDisabled = false;
+                        });
+                    } else {
+                        return false;
+                    }
+                })
+            },
+
+            //获取当前留言
+            get:function(id) {
+                var that = this;
+                this.loading = true
+                ms.http.get(ms.manager + "/tf/message/get.do", {"id":id}).then(function (res) {
+                    that.loading = false
+                    if(res.result&&res.data) {
+                                                                                               
+                        that.form = res.data;
+                    }
+                });
+            },
+        },
+        created:function() {
+            var that = this;
+
+            this.form.id = ms.util.getParameter("id");
+            if (this.form.id) {
+                this.get(this.form.id);
+            }
+        }
+    });
+
+</script>
+    <style scoped>
+    </style>

+ 345 - 0
src/main/webapp/WEB-INF/manager/tf/message/index.ftl

@@ -0,0 +1,345 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>留言</title>
+        <#include "../../include/head-file.ftl">
+</head>
+<body>
+<div id="index" class="ms-index" v-cloak>
+        <el-header class="ms-header" height="50px">
+        <el-col :span=12>
+            <@shiro.hasPermission name="tf:message:save">
+                <el-button type="primary" class="el-icon-plus" size="default" @click="save()">新增</el-button>
+
+            </@shiro.hasPermission>
+            <@shiro.hasPermission name="tf:message:del">
+                <el-button type="danger" class="el-icon-delete" size="default" @click="del(selectionList)"  :disabled="!selectionList.length">删除</el-button>
+            </@shiro.hasPermission>
+        </el-col>
+        </el-header>
+        <div class="ms-search">
+            <el-row>
+                <el-form :model="form"  ref="searchForm"  label-width="120px" size="default">
+                        <el-row>
+                                        <el-col :span=8>
+            <!--姓名-->
+
+	        <el-form-item  label="姓名" prop="messageName">
+	            <el-input
+                        v-model="form.messageName"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入姓名">
+                </el-input>
+	        </el-form-item>   
+                                        </el-col>
+                                        <el-col :span=8>
+            <!--公司-->
+
+	        <el-form-item  label="公司" prop="messageCompany">
+	            <el-input
+                        v-model="form.messageCompany"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入公司">
+                </el-input>
+	        </el-form-item>   
+                                        </el-col>
+                                        <el-col :span=8>
+            <!--咨询类型-->
+
+	        <el-form-item  label="咨询类型" prop="messageType">
+	            <el-input
+                        v-model="form.messageType"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入咨询类型">
+                </el-input>
+	        </el-form-item>   
+                                        </el-col>
+                        </el-row>
+                        <el-row>
+                                <el-col :span=24 style="display: flex;justify-content: end;padding-right: 10px;">
+                                    <el-button type="primary" class="el-icon-search" size="default" @click="currentPage=1;list(true)">搜索</el-button>
+                                    <el-button @click="rest" class="el-icon-refresh" size="default">重置</el-button>
+                                    <ms-search ref="search" @search="search" :search-json="searchJson" :search-key="historyKey"></ms-search>
+                                </el-col>
+                        </el-row>
+                </el-form>
+            </el-row>
+        </div>
+    <el-main class="ms-container">
+        <el-table class="ms-table-pagination" v-loading="loading" ref="multipleTable" border :data="dataList" tooltip-effect="dark" @selection-change="handleSelectionChange">
+                <template #empty>
+                    {{emptyText}}
+                </template>
+                    <el-table-column type="selection" width="40" :selectable="isChecked"></el-table-column>
+                            <el-table-column label="姓名"   align="left" prop="messageName">
+                            </el-table-column>
+                            <el-table-column label="公司"   align="left" prop="messageCompany">
+                            </el-table-column>
+                            <el-table-column label="邮箱"   align="left" prop="messageEmail">
+                            </el-table-column>
+                            <el-table-column label="电话"   align="left" prop="messageTel">
+                            </el-table-column>
+                            <el-table-column label="咨询类型"   align="left" prop="messageType">
+                            </el-table-column>
+                    <el-table-column  min-width="180" align="center" label="创建时间" prop="createDate"></el-table-column>
+                    <el-table-column label="操作"  width="180" align="center" fixed="right">
+                            <template #default="scope">
+                                <@shiro.hasPermission name="tf:message:update">
+                                    <el-link type="primary" :underline="false" @click="save(scope.row.id)">编辑</el-link>
+                                </@shiro.hasPermission>
+                            <@shiro.hasPermission name="tf:message:del">
+                                <el-link type="primary" :underline="false" @click="del([scope.row])" v-if="scope.row.del!=3">删除</el-link>
+                            </@shiro.hasPermission>
+                </template>
+                </el-table-column>
+            </el-table>
+                <el-pagination
+                        background
+                        :page-sizes="[10,20,30,40,50,100]"
+                        layout="total, sizes, prev, pager, next, jumper"
+                        :current-page="currentPage"
+                        :page-size="pageSize"
+                        :total="total"
+                        class="ms-pagination"
+                        @current-change='currentChange'
+                        @size-change="sizeChange">
+                </el-pagination>
+    </el-main>
+</div>
+
+</body>
+
+</html>
+<script>
+    var indexVue = new _Vue({
+        el: '#index',
+		provide() {
+			return {
+				searchParent: this //筛选使用
+			};
+		},
+        data:function() {
+            return {
+				        searchJson:[
+    {
+    "isSearch": "true",
+    "action": "and",
+    "field": "MESSAGE_NAME",
+    "el": "eq",
+    "model": "messageName",
+    "name": "姓名",
+    "type": "input"
+    },
+    {
+    "isSearch": "true",
+    "action": "and",
+    "field": "MESSAGE_COMPANY",
+    "el": "eq",
+    "model": "messageCompany",
+    "name": "公司",
+    "type": "input"
+    },
+    {
+    "isSearch": "",
+    "action": "and",
+    "field": "MESSAGE_EMAIL",
+    "el": "eq",
+    "model": "messageEmail",
+    "name": "邮箱",
+    "type": "input"
+    },
+    {
+    "isSearch": "",
+    "action": "and",
+    "field": "MESSAGE_TEL",
+    "el": "eq",
+    "model": "messageTel",
+    "name": "电话",
+    "type": "input"
+    },
+    {
+    "isSearch": "true",
+    "action": "and",
+    "field": "MESSAGE_TYPE",
+    "el": "eq",
+    "model": "messageType",
+    "name": "咨询类型",
+    "type": "input"
+    },
+                ],
+                dataList: [], //留言列表
+                selectionList:[],//留言列表选中
+                total: 0, //总记录数量
+                pageSize: 10, //页面数量
+                currentPage:1, //初始页
+                manager: ms.manager,
+                loading: true,//加载状态
+                emptyText:'',//提示文字
+                //搜索表单
+                form:{
+                    sqlWhere:null
+                },
+                //历史记录参数
+                historyKey: "tf_message_history"
+            }
+        },
+        watch:{
+
+        },
+        methods:{
+            isChecked: function(row) {
+                if(row.del == 3) {
+                    return false;
+                }
+                return true;
+            },
+            //查询列表
+            list: function(isSearch) {
+                var that = this;
+                var data = {}; //搜索参数
+                that.loading = true;
+                var page={
+                    pageNo: that.currentPage,
+                    pageSize : that.pageSize
+                }
+                var form = JSON.parse(JSON.stringify(that.form))
+
+
+                if(isSearch) {
+                    //删除空字符串
+                    for (var key in form){
+                        if(form[key] === undefined || form[key] === null){
+                            delete  form[key]
+                        }
+                    }
+                    form.sqlWhere ? data = Object.assign({}, {sqlWhere: form.sqlWhere}, page) : data = Object.assign({}, form, page)
+                } else {
+                    data = page;
+                }
+                sessionStorage.setItem(that.historyKey,JSON.stringify({form: form, page: page}));
+                ms.http.post(ms.manager+"/tf/message/list.do",data).then(
+                    function(res) {
+                        if (!res.result||res.data.total <= 0) {
+                            that.emptyText ="暂无数据"
+                            that.dataList = [];
+                            that.total = 0;
+                        } else {
+                            that.emptyText = '';
+                            that.total = res.data.total;
+                            that.dataList = res.data.rows;
+                        }
+                        that.loading = false;
+                    }).catch(function(err) {
+                    that.loading = false;
+                    console.log(err);
+                });
+
+            },
+            //留言列表选中
+            handleSelectionChange:function(val){
+                this.selectionList = val;
+            },
+            //删除
+            del: function(row){
+                var that = this;
+                that.$confirm("此操作将永久删除所选内容, 是否继续", "提示", {
+                    confirmButtonText: "确认",
+                    cancelButtonText: "取消",
+                    type: 'warning'
+                }).then(function() {
+                    ms.http.post(ms.manager+"/tf/message/delete.do", row.length?row:[row],{
+                        headers: {
+                            'Content-Type': 'application/json'
+                        }
+                    }).then(
+                        function(res){
+                            if (res.result) {
+                                that.$notify({
+                                    title:'成功',
+                                    type: 'success',
+                                    message:"删除成功"
+                                });
+                                //删除成功,刷新列表
+                                that.list();
+                            }else {
+                                that.$notify({
+                                    title: "错误",
+                                    message: res.msg,
+                                    type: 'warning'
+                                });
+                            }
+                        });
+                }).catch(function(err) {
+                    //删除如果用户取消会抛出异常,所以需要catch一下
+                    console.log(err)
+                });
+            },
+            //新增
+            save:function(id){
+                if(id){
+                    ms.util.openSystemUrl("/tf/message/form.do?id="+id);
+                }else {
+                    ms.util.openSystemUrl("/tf/message/form.do");
+                }
+            },
+
+            //pageSize改变时会触发
+            sizeChange:function(pagesize) {
+                this.loading = true;
+                this.pageSize = pagesize;
+                this.list(true);
+            },
+            //currentPage改变时会触发
+            currentChange:function(currentPage) {
+                this.loading = true;
+                this.currentPage = currentPage;
+                this.list(true);
+            },
+            search:function(data){
+                this.form.sqlWhere = JSON.stringify(data);
+                this.list(true);
+            },
+            //重置表单
+            rest:function(){
+                this.currentPage = 1;
+                this.form = {
+                    sqlWhere:null
+                };
+                this.$refs.searchForm.resetFields();
+                this.list(true);
+            },
+
+        },
+        mounted:function(){
+            var that = this;
+
+            //如果存在历史参数,恢复页面结果
+            if(sessionStorage.getItem(this.historyKey) && ms.util.getParameter("isBack") == 'true') {
+                var _history = JSON.parse(sessionStorage.getItem(this.historyKey))
+                this.form = _history.form;
+                this.total = parseInt(_history.total);
+                this.currentPage = parseInt(_history.page.pageNo);
+                this.pageSize = parseInt(_history.page.pageSize);
+            }
+
+            this.list(true);
+        },
+		created:function(){
+			var that = this;
+        }
+    })
+</script>
+    <style scoped>
+        #index .ms-container {
+            height: calc(100vh - 141px);
+        }
+    </style>

+ 24 - 0
src/main/webapp/static/locale/lang/message/en_US.js

@@ -0,0 +1,24 @@
+var en_US ={
+    form:{
+                gridNtyzm:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+        gridVkaro:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+        gridGlunn:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+        messageContent:{
+            text:'内容',
+            placeholder:'请输入内容',
+            help:'',
+        },
+    }
+}

+ 25 - 0
src/main/webapp/static/locale/lang/message/zh_CN.js

@@ -0,0 +1,25 @@
+
+var zh_CN ={
+    form:{
+                gridNtyzm:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+        gridVkaro:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+        gridGlunn:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+        messageContent:{
+            text:'内容',
+            placeholder:'请输入内容',
+            help:'',
+        },
+    }
+}

Неке датотеке нису приказане због велике количине промена