소스 검색

收藏和入场二维码

huangxiao 3 주 전
부모
커밋
5486d289ff
23개의 변경된 파일1390개의 추가작업 그리고 10개의 파일을 삭제
  1. 220 0
      src/main/java/net/mingsoft/tf/action/CollectionAction.java
  2. 21 0
      src/main/java/net/mingsoft/tf/biz/ICollectionBiz.java
  3. 25 0
      src/main/java/net/mingsoft/tf/biz/IGateService.java
  4. 49 0
      src/main/java/net/mingsoft/tf/biz/impl/CollectionBizImpl.java
  5. 55 0
      src/main/java/net/mingsoft/tf/biz/impl/GateServiceImpl.java
  6. 14 0
      src/main/java/net/mingsoft/tf/dao/ICollectionDao.java
  7. 20 0
      src/main/java/net/mingsoft/tf/dao/ICollectionDao.xml
  8. 86 0
      src/main/java/net/mingsoft/tf/entity/CollectionEntity.java
  9. 3 0
      src/main/java/net/mingsoft/tf/resources/resources_en_US.properties
  10. 3 0
      src/main/java/net/mingsoft/tf/resources/resources_zh_CN.properties
  11. 4 0
      src/main/java/net/mingsoft/tf/www/EnterpriseProductsAction.java
  12. 184 8
      src/main/java/net/mingsoft/tf/wx/ExhibitorAction.java
  13. 79 0
      src/main/java/net/mingsoft/tf/wx/gate/GateAction.java
  14. 9 0
      src/main/java/net/mingsoft/tf/wx/gate/GateOnlineRequest.java
  15. 25 0
      src/main/java/net/mingsoft/tf/wx/gate/GateOnlineResponse.java
  16. 13 0
      src/main/java/net/mingsoft/tf/wx/gate/GateResults.java
  17. 12 0
      src/main/java/net/mingsoft/tf/wx/gate/TicketCheckRequest.java
  18. 21 0
      src/main/java/net/mingsoft/tf/wx/gate/TicketCheckResponse.java
  19. 2 2
      src/main/resources/application.yml
  20. 188 0
      src/main/webapp/WEB-INF/manager/tf/collection/form.ftl
  21. 318 0
      src/main/webapp/WEB-INF/manager/tf/collection/index.ftl
  22. 19 0
      src/main/webapp/static/locale/lang/collection/en_US.js
  23. 20 0
      src/main/webapp/static/locale/lang/collection/zh_CN.js

+ 220 - 0
src/main/java/net/mingsoft/tf/action/CollectionAction.java

@@ -0,0 +1,220 @@
+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.ICollectionBiz;
+import net.mingsoft.tf.entity.CollectionEntity;
+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 阿白
+* 创建日期:2026年1月14日 上午11:42:34<br/>
+* 历史修订:<br/>
+*/
+@Tag(name = "后台-收藏接口")
+@Controller("tfCollectionAction")
+@RequestMapping("/${ms.manager.path}/tf/collection")
+public class CollectionAction extends net.mingsoft.tf.action.BaseAction{
+
+
+    /**
+    * 注入收藏业务层
+    */
+    @Autowired
+    private ICollectionBiz collectionBiz;
+
+    /**
+    * 返回主界面index
+    */
+    @Hidden
+    @GetMapping("/index")
+    public String index() {
+        return "/tf/collection/index";
+    }
+
+
+    /**
+    * 返回编辑界面collection的form
+    */
+    @Hidden
+    @GetMapping("/form")
+    public String form() {
+        return "/tf/collection/form";
+    }
+
+
+    /**
+    * 查询收藏列表
+    * @param collection 收藏实体
+    */
+    @Operation(summary = "查询收藏列表接口")
+    @Parameters({
+        @Parameter(name = "collectionUser", description = "用户", in = ParameterIn.QUERY),
+        @Parameter(name = "collectionType", description = "类型", in = ParameterIn.QUERY),
+        @Parameter(name = "collectionValue", description = "值", in = ParameterIn.QUERY),
+    })
+    @RequestMapping(value ="/list",method = {RequestMethod.GET,RequestMethod.POST})
+    @ResponseBody
+    @RequiresPermissions("tf:collection:view")
+    public ResultData list(@ModelAttribute @Parameter(hidden = true) CollectionEntity collection) {
+        BasicUtil.startPage();
+        List collectionList = null;
+        if ( collection.getSqlWhere() != null){
+            collectionList = collectionBiz.query(collection);
+        } else {
+            LambdaQueryWrapper<CollectionEntity> wrapper = new LambdaQueryWrapper<>(collection).orderByDesc(CollectionEntity::getCreateDate);
+            collectionList = collectionBiz.list(wrapper);
+        }
+        return ResultData.build().success(new EUListBean(collectionList,(int)BasicUtil.endPage(collectionList).getTotal()));
+    }
+
+
+    /**
+    * 获取收藏
+    * @param collection 收藏实体
+    */
+    @Operation(summary = "获取收藏列表接口")
+    @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY)
+    @GetMapping("/get")
+    @ResponseBody
+    @RequiresPermissions("tf:collection:view")
+    public ResultData get(@ModelAttribute @Parameter(hidden = true) CollectionEntity collection) {
+        if (StringUtils.isBlank(collection.getId())) {
+            return ResultData.build().error(getResString("err.error",this.getResString("id")));
+        }
+        CollectionEntity _collection = (CollectionEntity)collectionBiz.getById(collection.getId());
+        return ResultData.build().success(_collection);
+    }
+
+
+    /**
+    * 保存收藏
+    * @param collection 收藏实体
+    */
+    @Operation(summary = "保存收藏列表接口")
+    @Parameters({
+        @Parameter(name = "collectionUser", description = "用户", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "collectionType", description = "类型", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "collectionValue", description = "值", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/save")
+    @ResponseBody
+    @LogAnn(title = "保存收藏", businessType = BusinessTypeEnum.INSERT)
+    @RequiresPermissions("tf:collection:save")
+    public ResultData save(@ModelAttribute @Parameter(hidden = true) CollectionEntity collection) {
+
+        if (  StringUtils.isNotBlank(collection.getCollectionUser()) && !StringUtil.checkLength(collection.getCollectionUser()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("collection.user"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(collection.getCollectionValue()) && !StringUtil.checkLength(collection.getCollectionValue()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("collection.value"), "0", "255"));
+        }
+        collectionBiz.save(collection);
+        return ResultData.build().success(collection);
+    }
+
+    /**
+    *  删除收藏
+    *
+    * @param collections 收藏实体
+    */
+    @Operation(summary = "批量删除收藏列表接口")
+    @PostMapping("/delete")
+    @ResponseBody
+    @LogAnn(title = "删除收藏", businessType = BusinessTypeEnum.DELETE)
+    @RequiresPermissions("tf:collection:del")
+    public ResultData delete(@RequestBody List<CollectionEntity> collections) {
+        List<String> ids = (List)collections.stream().map((p) -> {return p.getId();}).collect(Collectors.toList());
+        return this.collectionBiz.removeByIds(ids) ? ResultData.build().success() : ResultData.build().error(this.getResString("err.error", new String[]{this.getResString("id")}));
+    }
+
+    /**
+    *	更新收藏列表
+    *
+    * @param collection 收藏实体
+    */
+    @Operation(summary = "更新收藏列表接口")
+    @Parameters({
+        @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY),
+        @Parameter(name = "collectionUser", description = "用户", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "collectionType", description = "类型", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "collectionValue", description = "值", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/update")
+    @ResponseBody
+    @LogAnn(title = "更新收藏", businessType = BusinessTypeEnum.UPDATE)
+    @RequiresPermissions("tf:collection:update")
+    public ResultData update(@ModelAttribute @Parameter(hidden = true) CollectionEntity collection) {
+        //先查询数据是否存在
+        CollectionEntity _collection = (CollectionEntity)collectionBiz.getById(collection.getId());
+        if(_collection == null) {
+            return ResultData.build().error(getResString("err.not.exist",collection.getId() ));
+        }
+
+        if (  StringUtils.isNotBlank(collection.getCollectionUser()) && !StringUtil.checkLength(collection.getCollectionUser()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("collection.user"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(collection.getCollectionValue()) && !StringUtil.checkLength(collection.getCollectionValue()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("collection.value"), "0", "255"));
+        }
+        collectionBiz.updateById(collection);
+        return ResultData.build().success(collection);
+    }
+
+    @GetMapping("verify")
+    @ResponseBody
+    public ResultData verify(String fieldName, String fieldValue, String id,String idName) {
+        boolean verify = false;
+        if (StringUtils.isBlank(id)) {
+            verify = super.validated("COLLECTION",fieldName,fieldValue);
+        } else {
+            verify = super.validated("COLLECTION",fieldName,fieldValue,id,idName);
+        }
+        if (verify) {
+            return ResultData.build().success(false);
+        }else {
+            return ResultData.build().success(true);
+        }
+    }
+
+}

+ 21 - 0
src/main/java/net/mingsoft/tf/biz/ICollectionBiz.java

@@ -0,0 +1,21 @@
+package net.mingsoft.tf.biz;
+
+import net.mingsoft.base.biz.IBaseBiz;
+import net.mingsoft.tf.entity.CollectionEntity;
+
+
+/**
+ * 收藏业务
+ *
+ * @author 阿白
+ * 创建日期:2026年1月14日 上午11:38:24<br/>
+ * 历史修订:<br/>
+ */
+public interface ICollectionBiz extends IBaseBiz<CollectionEntity> {
+    /**
+     * 检查是否收藏过
+     */
+    boolean check(String user, Integer type, String id);
+
+    boolean delete(String user, Integer type, String id);
+}

+ 25 - 0
src/main/java/net/mingsoft/tf/biz/IGateService.java

@@ -0,0 +1,25 @@
+package net.mingsoft.tf.biz;
+
+
+/**
+ * 闸机服务
+ *
+ * @author hosea
+ * @date 2026-01-14
+ */
+public interface IGateService {
+    /**
+     * 失效用户所有入场码
+     */
+    void failureCode(String user);
+
+    /**
+     * 生成入场码
+     */
+    String createCode(String user);
+
+    /**
+     * 检查入场码,通过之后自动失效
+     */
+    boolean checkCode(String code);
+}

+ 49 - 0
src/main/java/net/mingsoft/tf/biz/impl/CollectionBizImpl.java

@@ -0,0 +1,49 @@
+package net.mingsoft.tf.biz.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import net.mingsoft.base.biz.impl.BaseBizImpl;
+import net.mingsoft.base.dao.IBaseDao;
+import net.mingsoft.tf.biz.ICollectionBiz;
+import net.mingsoft.tf.dao.ICollectionDao;
+import net.mingsoft.tf.entity.CollectionEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 收藏管理持久化层
+ *
+ * @author 阿白
+ * 创建日期:2026年1月14日 上午11:38:24<br/>
+ * 历史修订:<br/>
+ */
+@Service("tfcollectionBizImpl")
+public class CollectionBizImpl extends BaseBizImpl<ICollectionDao, CollectionEntity> implements ICollectionBiz {
+
+
+    @Autowired
+    private ICollectionDao collectionDao;
+
+
+    @Override
+    protected IBaseDao getDao() {
+        // TODO Auto-generated method stub
+        return collectionDao;
+    }
+
+    @Override
+    public boolean check(String user, Integer type, String id) {
+        return count(new LambdaQueryWrapper<>(CollectionEntity.class)
+                .eq(CollectionEntity::getCollectionUser, user)
+                .eq(CollectionEntity::getCollectionType, type)
+                .eq(CollectionEntity::getCollectionValue, id)) > 0;
+
+    }
+
+    @Override
+    public boolean delete(String user, Integer type, String id) {
+        return collectionDao.delete(new LambdaQueryWrapper<>(CollectionEntity.class)
+                .eq(CollectionEntity::getCollectionUser, user)
+                .eq(CollectionEntity::getCollectionType, type)
+                .eq(CollectionEntity::getCollectionValue, id)) > 0;
+    }
+}

+ 55 - 0
src/main/java/net/mingsoft/tf/biz/impl/GateServiceImpl.java

@@ -0,0 +1,55 @@
+package net.mingsoft.tf.biz.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
+import cn.hutool.crypto.symmetric.SymmetricCrypto;
+import net.mingsoft.tf.biz.IExhibitionBiz;
+import net.mingsoft.tf.biz.IGateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Map;
+
+@Service
+public class GateServiceImpl implements IGateService {
+    /**
+     * 最大生存时间,30分钟
+     */
+    private static final long MAX_SURVIVAL_TIME = 30 * 60 * 1000;
+    /**
+     * 加解密
+     */
+    private static final SymmetricCrypto AES = SecureUtil.aes(SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue(), "8^3&9#07&98@hih5".getBytes()).getEncoded());
+    @Autowired
+    private IExhibitionBiz biz;
+
+    @Override
+    public void failureCode(String user) {
+        // TODO 可能有个定时器,每天清一下数据就可以了
+
+        biz.execute("DELETE FROM entry_code WHERE user='" + user + "'");
+    }
+
+    @Override
+    public String createCode(String user) {
+        Date date = new Date();
+        String code = AES.encryptBase64(user + ":" + date.getTime());
+        biz.execute("INSERT INTO entry_code (code, user, available, time) VALUES ('" + code + "', '" + user + "', 1, '" + DateUtil.format(date, "yyyy-MM-dd HH:mm:ss") + "')");
+        return code;
+    }
+
+    @Override
+    public boolean checkCode(String code) {
+        String[] sp = AES.decryptStr(code).split(":");
+        String user = sp[0];
+        if (Long.parseLong(sp[1]) + MAX_SURVIVAL_TIME < System.currentTimeMillis()) {
+            // 已经超时了
+            return false;
+        }
+        // 如果有删除条数,表示有数据,那就是有效
+        // 如果无删除条数,表示无数据,那就是无效,意味着这个码,已经用过,或主动失效
+        return biz.delete("entry_code", Map.of("code", code)) > 0;
+    }
+}

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

@@ -0,0 +1,14 @@
+package net.mingsoft.tf.dao;
+
+import net.mingsoft.base.dao.IBaseDao;
+import java.util.*;
+import net.mingsoft.tf.entity.CollectionEntity;
+
+/**
+ * 收藏持久层
+ * @author 阿白
+ * 创建日期:2026年1月14日 上午11:38:24<br/>
+ * 历史修订:<br/>
+ */
+public interface ICollectionDao extends IBaseDao<CollectionEntity> {
+}

+ 20 - 0
src/main/java/net/mingsoft/tf/dao/ICollectionDao.xml

@@ -0,0 +1,20 @@
+<?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.ICollectionDao">
+
+	<resultMap id="resultMap" type="net.mingsoft.tf.entity.CollectionEntity">
+				<result column="COLLECTION_USER" property="collectionUser" /><!--用户 -->
+				<result column="COLLECTION_TYPE" property="collectionType" /><!--类型 -->
+				<result column="COLLECTION_VALUE" property="collectionValue" /><!--值 -->
+	</resultMap>
+
+	<select id="query" resultMap="resultMap">
+		SELECT * FROM MDIY_FORM_COLLECTION
+		<where>
+			DEL=0
+			<include refid="net.mingsoft.base.dao.IBaseDao.sqlWhere"></include>
+		</where>
+		 ORDER BY ID DESC
+	</select>
+
+</mapper>

+ 86 - 0
src/main/java/net/mingsoft/tf/entity/CollectionEntity.java

@@ -0,0 +1,86 @@
+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 阿白
+* 创建日期:2026年1月14日 上午11:42:34<br/>
+* 历史修订:<br/>
+*/
+@TableName("MDIY_FORM_COLLECTION")
+public class CollectionEntity extends BaseEntity {
+
+private static final long serialVersionUID = 1768362154722L;
+
+    /**
+    * 用户
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String collectionUser;
+    /**
+    * 类型
+    */
+    
+    private String collectionType;
+    /**
+    * 值
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String collectionValue;
+
+
+    /**
+    * 设置用户
+    */
+    public void setCollectionUser(String collectionUser) {
+        this.collectionUser = collectionUser;
+    }
+
+    /**
+    * 获取用户
+    */
+    public String getCollectionUser() {
+        return this.collectionUser;
+    }
+    /**
+    * 设置类型
+    */
+    public void setCollectionType(String collectionType) {
+        this.collectionType = collectionType;
+    }
+
+    /**
+    * 获取类型
+    */
+    public String getCollectionType() {
+        return this.collectionType;
+    }
+    /**
+    * 设置值
+    */
+    public void setCollectionValue(String collectionValue) {
+        this.collectionValue = collectionValue;
+    }
+
+    /**
+    * 获取值
+    */
+    public String getCollectionValue() {
+        return this.collectionValue;
+    }
+
+
+}

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

@@ -1,3 +1,6 @@
+collection.user=collection user
+collection.type=collection type
+collection.value=collection value
 announcement.title=announcement title
 announcement.type=announcement type
 announcement.time=announcement time

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

@@ -1,3 +1,6 @@
+collection.user=\u7528\u6237
+collection.type=\u7c7b\u578b
+collection.value=\u503c
 announcement.title=\u516c\u544a\u6807\u9898
 announcement.type=\u516c\u544a\u7c7b\u578b
 announcement.time=\u53d1\u5e03\u65f6\u95f4

+ 4 - 0
src/main/java/net/mingsoft/tf/www/EnterpriseProductsAction.java

@@ -1,6 +1,7 @@
 package net.mingsoft.tf.www;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -57,6 +58,9 @@ public class EnterpriseProductsAction {
         BasicUtil.startPage();
         LambdaQueryWrapper<EnterpriseProductsEntity> wrapper = new LambdaQueryWrapper<>(enterpriseProducts).orderByDesc(EnterpriseProductsEntity::getCreateDate);
         List<EnterpriseProductsEntity> enterpriseProductsList = enterpriseProductsBiz.list(wrapper);
+        if (CollUtil.isEmpty(enterpriseProductsList)) {
+            return ResultData.build().success(new EUListBean(enterpriseProductsList, (int) BasicUtil.endPage(enterpriseProductsList).getTotal()));
+        }
         // 2. 批量查询关联企业信息
         Map<String, EnterpriseEntity> enterpriseMap = enterpriseBiz.listByIds(
                 enterpriseProductsList.stream().map(EnterpriseProductsEntity::getProductEnterpriseId).collect(Collectors.toList())

+ 184 - 8
src/main/java/net/mingsoft/tf/wx/ExhibitorAction.java

@@ -1,6 +1,10 @@
 package net.mingsoft.tf.wx;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.CaseInsensitiveMap;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
@@ -9,27 +13,35 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import net.mingsoft.base.entity.ResultData;
+import net.mingsoft.basic.bean.EUListBean;
 import net.mingsoft.basic.bean.UploadConfigBean;
+import net.mingsoft.basic.util.BasicUtil;
+import net.mingsoft.mdiy.biz.IModelBiz;
+import net.mingsoft.mdiy.biz.IModelDataBiz;
+import net.mingsoft.mdiy.entity.ModelEntity;
 import net.mingsoft.people.action.BaseAction;
 import net.mingsoft.people.action.people.FileAction;
+import net.mingsoft.people.biz.IPeopleBiz;
+import net.mingsoft.people.entity.PeopleEntity;
 import net.mingsoft.people.util.PeopleUtil;
 import net.mingsoft.tf.biz.*;
 import net.mingsoft.tf.biz.impl.ExhibitorBizImpl;
-import net.mingsoft.tf.entity.ExhibitionEntity;
-import net.mingsoft.tf.entity.ExhibitorEntity;
+import net.mingsoft.tf.entity.*;
+import net.mingsoft.tf.www.dto.EnterpriseProductsListResponse;
 import net.mingsoft.tf.wx.dto.ExhibitorInfoResponse;
 import net.mingsoft.tf.wx.dto.ExhibitorQueryResponse;
+import net.mingsoft.tf.wx.dto.WxRegisterRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.ExtendedModelMap;
+import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Tag(name = "微信-展商")
@@ -37,6 +49,8 @@ import java.util.stream.Collectors;
 @Controller
 public class ExhibitorAction extends BaseAction {
     @Autowired
+    private IPeopleBiz peopleBiz;
+    @Autowired
     private FileAction fileAction;
     @Autowired
     private net.mingsoft.tf.action.ExhibitorAction exhibitorAction;
@@ -50,6 +64,72 @@ public class ExhibitorAction extends BaseAction {
     private IPeopleExhibitorBiz peopleExhibitorBiz;
     @Autowired
     private IBoothBiz boothBiz;
+    @Autowired
+    private IModelDataBiz modelDataBiz;
+    @Autowired
+    private IModelBiz modelBiz;
+    @Autowired
+    private ICollectionBiz collectionBiz;
+    @Autowired
+    private IEnterpriseProductsBiz enterpriseProductsBiz;
+    @Autowired
+    private IDesignBiz designBiz;
+    @Autowired
+    private IGateService gateService;
+
+    @Operation(summary = "微信-用户注册")
+    @Parameters({
+//            @Parameter(name = "peopleName", description = "openid", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "puIcon", description = "微信头像", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "puNickname", description = "微信昵称", required = true, in = ParameterIn.QUERY),
+//            @Parameter(name = "puRealName", description = "真实姓名", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "peoplePhone", description = "手机号", required = true, in = ParameterIn.QUERY),
+//            @Parameter(name = "puCard", description = "身份证", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "puLevel", description = "身份类型-编码", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "puLevelName", description = "身份类型-名称", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "companyName", description = "公司名称", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "position", description = "职位", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "invitationCode", description = "展商邀请码", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "channel", description = "了解渠道", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "purpose", description = "参观目的", required = true, in = ParameterIn.QUERY),
+    })
+    @PostMapping(value = "/edit")
+    @ResponseBody
+    public ResultData update(@RequestBody WxRegisterRequest people, String modelId, HttpServletRequest request, HttpServletResponse response) {
+        PeopleEntity user = peopleBiz.getEntityByUserName(PeopleUtil.getPeopleBean().getPeopleName());
+        if (user == null) {
+            return ResultData.build().error("用户不存在");
+        }
+        people.setPeopleName(null);
+        people.setPuRealName(null);
+        people.setPuCard(null);
+        String linkId = user.getId();
+        people.setId(linkId);
+        people.setPeopleId(linkId);
+        peopleBiz.updatePeople(people);
+        ModelMap modelData = new ExtendedModelMap();
+        modelData.put("companyName", people.getCompanyName());
+        modelData.put("position", people.getPosition());
+        modelData.put("channel", people.getChannel());
+        modelData.put("purpose", people.getPurpose());
+        modelData.put("linkId", linkId);
+        ModelEntity model = modelBiz.getById(modelId);
+        String id = this.modelBiz.queryForList(StrUtil.format("select id from {} where link_id = ?", model.getModelTableName()), people.getId())
+                .stream()
+                .map(map -> map.get("id").toString())
+                .findFirst()
+                .orElse(null);
+        if (id == null) {
+            // 保存扩展表数据
+            modelDataBiz.spliceInsertSql(model, new CaseInsensitiveMap<>(modelData));
+        } else {
+            modelData.put("id", id);
+            // 修改扩展表数据
+            modelDataBiz.spliceUpdateSql(model, new CaseInsensitiveMap<>(modelData));
+        }
+        return ResultData.build().success();
+    }
+
 
     @Operation(summary = "微信-关联邀请关系")
     @Parameters({
@@ -91,8 +171,10 @@ public class ExhibitorAction extends BaseAction {
     @GetMapping(value = "/qrcode")
     @ResponseBody
     public ResultData qrcode() {
-        // TODO 生成入场二维码
-        return null;
+        String user = PeopleUtil.getPeopleBean().getPeopleId();
+        gateService.failureCode(user);
+        // TODO 转图片base64
+        return ResultData.build().success(gateService.createCode(user));
     }
 
     @Operation(summary = "微信-展商-上传LOGO")
@@ -179,4 +261,98 @@ public class ExhibitorAction extends BaseAction {
                 .map(ResultData.build()::success)
                 .orElseGet(ResultData.build()::success);
     }
+
+    /**
+     * 收藏
+     */
+    @GetMapping(value = "/collection/save")
+    @ResponseBody
+    public ResultData collectionSave(Integer type, String id, Boolean check) {
+        String user = PeopleUtil.getPeopleBean().getPeopleId();
+        boolean c = collectionBiz.check(user, type, id);
+        if (check != null && !check) {
+            if (!c) {
+                // 不存在,才保存
+                CollectionEntity collectionEntity = new CollectionEntity();
+                collectionEntity.setCollectionUser(user);
+                collectionEntity.setCollectionType(type.toString());
+                collectionEntity.setCollectionValue(id);
+                collectionEntity.setCreateDate(new Date());
+                collectionBiz.save(collectionEntity);
+            }
+            return ResultData.build().success();
+        } else {
+            return ResultData.build().success(c);
+        }
+    }
+
+    /**
+     * 收藏
+     */
+    @GetMapping(value = "/collection/delete")
+    @ResponseBody
+    public ResultData collectionDelete(Integer type, String id, Boolean check) {
+        String user = PeopleUtil.getPeopleBean().getPeopleId();
+        collectionBiz.delete(user, type, id);
+        return ResultData.build().success();
+    }
+
+    /**
+     * 查收藏
+     */
+    @GetMapping(value = "/collection/list")
+    @ResponseBody
+    public ResultData collectionList(Integer type) {
+        String user = PeopleUtil.getPeopleBean().getPeopleId();
+        String sql = "select COLLECTION_VALUE from MDIY_FORM_COLLECTION where COLLECTION_USER=" + user + " and COLLECTION_TYPE=" + type;
+        switch (type) {
+            case 1 -> {
+                // 公司
+                BasicUtil.startPage();
+                LambdaQueryWrapper<EnterpriseEntity> wrapper = new LambdaQueryWrapper<>(EnterpriseEntity.class);
+                wrapper.inSql(EnterpriseEntity::getId, sql);
+                wrapper = wrapper.orderByDesc(EnterpriseEntity::getCreateDate);
+                List<EnterpriseEntity> enterpriseList = enterpriseBiz.list(wrapper);
+                return ResultData.build().success(new EUListBean(enterpriseList, (int) BasicUtil.endPage(enterpriseList).getTotal()));
+            }
+            case 2 -> {
+                // 产品
+                BasicUtil.startPage();
+                LambdaQueryWrapper<EnterpriseProductsEntity> wrapper = new LambdaQueryWrapper<>(EnterpriseProductsEntity.class).orderByDesc(EnterpriseProductsEntity::getCreateDate);
+                wrapper.inSql(EnterpriseProductsEntity::getId, sql);
+                List<EnterpriseProductsEntity> enterpriseProductsList = enterpriseProductsBiz.list(wrapper);
+                if (CollUtil.isEmpty(enterpriseProductsList)) {
+                    return ResultData.build().success(new EUListBean(enterpriseProductsList, (int) BasicUtil.endPage(enterpriseProductsList).getTotal()));
+                }
+                // 2. 批量查询关联企业信息
+                Map<String, EnterpriseEntity> enterpriseMap = enterpriseBiz.listByIds(
+                        enterpriseProductsList.stream().map(EnterpriseProductsEntity::getProductEnterpriseId).collect(Collectors.toList())
+                ).stream().collect(Collectors.toMap(EnterpriseEntity::getId, Function.identity()));
+                // 3. 组合数据到Response对象
+                List<EnterpriseProductsListResponse> responses = enterpriseProductsList.stream().map(p -> {
+                    EnterpriseProductsListResponse res = new EnterpriseProductsListResponse();
+                    BeanUtil.copyProperties(p, res);
+                    EnterpriseEntity e = enterpriseMap.get(p.getProductEnterpriseId());
+                    if (e != null) {
+                        res.setEnterpriseName(e.getEnterpriseName());
+                        res.setEnterpriseLogo(e.getEnterpriseLogo());
+                    }
+                    return res;
+                }).collect(Collectors.toList());
+                return ResultData.build().success(new EUListBean(responses, (int) BasicUtil.endPage(enterpriseProductsList).getTotal()));
+            }
+            case 3 -> {
+                // 设计
+                BasicUtil.startPage();
+                LambdaQueryWrapper<DesignEntity> wrapper = new LambdaQueryWrapper<>(DesignEntity.class);
+                wrapper.inSql(DesignEntity::getId, sql);
+                wrapper = wrapper.orderByDesc(DesignEntity::getCreateDate);
+                List<DesignEntity> list = designBiz.list(wrapper);
+                return ResultData.build().success(new EUListBean(list, (int) BasicUtil.endPage(list).getTotal()));
+            }
+            default -> {
+                return ResultData.build().error("未知类型 " + type);
+            }
+        }
+    }
 }

+ 79 - 0
src/main/java/net/mingsoft/tf/wx/gate/GateAction.java

@@ -0,0 +1,79 @@
+package net.mingsoft.tf.wx.gate;
+
+import lombok.extern.slf4j.Slf4j;
+import net.mingsoft.tf.biz.IGateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * 闸机控制
+ *
+ * @author hosea
+ * @date 2026-01-14
+ */
+@Slf4j
+@Controller
+@RequestMapping("/gate")
+public class GateAction {
+    @Autowired
+    private IGateService gateService;
+
+    /**
+     * 心跳
+     */
+    @ResponseBody
+    @GetMapping(value = "/heartbeat/{deviceNumber}")
+    public GateResults<String> heartbeat(@PathVariable("deviceNumber") String deviceNumber) {
+        String message = "heartbeat " + deviceNumber;
+        log.info(message);
+        return GateResults.<String>builder()
+                .Code(200)
+                .Message(message)
+                .Data(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
+                .build();
+    }
+
+    /**
+     * 上线
+     */
+    @ResponseBody
+    @PostMapping(value = "/online")
+    public GateResults<GateOnlineResponse> online(@RequestBody GateOnlineRequest request) {
+        String message = "online " + request.toString();
+        log.info(message);
+        return GateResults.<GateOnlineResponse>builder()
+                .Code(200)
+                .Message(message)
+                .Data(GateOnlineResponse.builder().build())
+                .build();
+    }
+
+    /**
+     * 闸机核销验票接口
+     */
+    @ResponseBody
+    @PostMapping(value = "/ticketCheck")
+    public GateResults<TicketCheckResponse> ticketCheck(@RequestBody TicketCheckRequest request) {
+        String message = "ticketCheck " + request.toString();
+        log.info(message);
+        if (gateService.checkCode(request.getTicketCode())) {
+            // TODO 保存入场总数
+        }
+        return GateResults.<TicketCheckResponse>builder()
+                .Code(200)
+                .Message(message)
+                .Data(TicketCheckResponse.builder().build())
+                .build();
+    }
+
+    /**
+     * 闸机身份证核销接口
+     */
+    @PostMapping(value = "/identityCardCheck")
+    public void identityCardCheck() {
+    }
+}

+ 9 - 0
src/main/java/net/mingsoft/tf/wx/gate/GateOnlineRequest.java

@@ -0,0 +1,9 @@
+package net.mingsoft.tf.wx.gate;
+
+import lombok.Data;
+
+@Data
+public class GateOnlineRequest {
+    private String deviceNumber;
+    private String deviceType;
+}

+ 25 - 0
src/main/java/net/mingsoft/tf/wx/gate/GateOnlineResponse.java

@@ -0,0 +1,25 @@
+package net.mingsoft.tf.wx.gate;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Builder
+public class GateOnlineResponse {
+    private Integer companyId;
+    private Integer scenicId;
+    private Integer deviceId;
+    private String deviceName;
+    private String deviceNumber;
+    private Integer deviceType;
+    private Integer enterOut;
+    private String backdropImg;
+    private String advertVideoUrl;
+    private String mainTitle;
+    private String subTitle;
+    private Integer checkMode;
+    private String secretKey;
+    private List<String> loopImgList;
+}

+ 13 - 0
src/main/java/net/mingsoft/tf/wx/gate/GateResults.java

@@ -0,0 +1,13 @@
+package net.mingsoft.tf.wx.gate;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class GateResults<T> {
+    private Integer Code;
+    private String Message;
+    private T Data;
+
+}

+ 12 - 0
src/main/java/net/mingsoft/tf/wx/gate/TicketCheckRequest.java

@@ -0,0 +1,12 @@
+package net.mingsoft.tf.wx.gate;
+
+import lombok.Data;
+
+@Data
+public class TicketCheckRequest {
+    private Integer companyID;
+    private Integer scenicID;
+    private String deviceID;
+    private String deviceNumber;
+    private String ticketCode;
+}

+ 21 - 0
src/main/java/net/mingsoft/tf/wx/gate/TicketCheckResponse.java

@@ -0,0 +1,21 @@
+package net.mingsoft.tf.wx.gate;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class TicketCheckResponse {
+    private Integer code; //验票结果 0=无效票 1=验票成功
+    private String msg; //提示信息/票名
+    private String source; //票来源
+    private String time; //开始时间
+    private String endTime; //结束时间
+    private String ticketCode; //门票码
+    private Integer checkMode; //验票模式: 0=一码一验 1=一码全验
+    private Integer count; //本次可通行人数
+    private Integer surplusCount; //剩余可通行人数
+    private Integer parkNumber; //入园总人数
+    private String faceImgUrl; //人脸图像
+
+}

+ 2 - 2
src/main/resources/application.yml

@@ -19,8 +19,8 @@ server:
 #配置日志
 logging:
   level:
-    net.mingsoft: warn
-    net.mingsoft.base.dao.IBaseDao: warn
+    net.mingsoft: info
+    net.mingsoft.base.dao.IBaseDao: info
     org.springframework: error
     springfox.documentation: error
     com.baomidou: error

+ 188 - 0
src/main/webapp/WEB-INF/manager/tf/collection/form.ftl

@@ -0,0 +1,188 @@
+    <!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-form-item  label="用户" prop="collectionUser">
+	            <el-input
+                        v-model="form.collectionUser"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入用户">
+                </el-input>
+	        </el-form-item>   
+<!--类型-->
+
+    <el-form-item  label="类型" prop="collectionType">
+                <el-select   v-model="form.collectionType"
+                       :style="{width: '100%'}"
+                       :filterable="false"
+                       :disabled="false"
+                       :multiple="false" :clearable="true"
+                        placeholder="请选择类型">
+                    <el-option v-for='item in collectionTypeOptions' :key="item.value" :value="item.value"
+                               :label="item.label"></el-option>
+                </el-select>
+    </el-form-item>
+
+            <!--值-->
+
+	        <el-form-item  label="值" prop="collectionValue">
+	            <el-input
+                        v-model="form.collectionValue"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        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,
+                // 类型
+                collectionTypeOptions:[{"value":"1","label":"企业"},{"value":"2","label":"产品"},{"value":"3","label":"设计谷"}],
+                //表单数据
+                form: {
+                    // 用户
+                    collectionUser:'',
+                    				// 类型
+                    				collectionType:"",
+                    // 值
+                    collectionValue:'',
+
+                },
+                rules:{
+                        // 用户
+                        collectionUser: [{"min":0,"max":255,"message":"用户长度必须为0-255"}],
+                        // 值
+                        collectionValue: [{"min":0,"max":255,"message":"值长度必须为0-255"}],
+
+                },
+
+            }
+        },
+        watch:{
+
+        },
+        components:{
+        },
+        computed:{
+        },
+        methods: {
+
+            back: function (){
+                ms.util.openSystemUrl("/tf/collection/index.do",true);
+            },
+
+            save:function() {
+                var that = this;
+                var url = ms.manager + "/tf/collection/save.do"
+                if (that.form.id > 0) {
+                    url = ms.manager + "/tf/collection/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/collection/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/collection/get.do", {"id":id}).then(function (res) {
+                    that.loading = false
+                    if(res.result&&res.data) {
+                                      
+                        that.form = res.data;
+                    }
+                });
+            },
+    //类型  列表格式化
+    collectionTypeFormat:function(row, column, cellValue, index){
+        var value="";
+
+            if(cellValue){
+            var data = this.collectionTypeOptions.find(function(value){
+            return value.value==cellValue;
+            })
+            if(data&&data.label){
+            value = data.label;
+            }
+            }
+
+        return value;
+    },
+
+//获取collectionType数据源
+        },
+        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>

+ 318 - 0
src/main/webapp/WEB-INF/manager/tf/collection/index.ftl

@@ -0,0 +1,318 @@
+<!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:collection:save">
+                <el-button type="primary" class="el-icon-plus" size="default" @click="save()">新增</el-button>
+
+            </@shiro.hasPermission>
+            <@shiro.hasPermission name="tf:collection: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="collectionType">
+                <el-select   v-model="form.collectionType"
+                       :style="{width: '100%'}"
+                       :filterable="false"
+                       :disabled="false"
+                       :multiple="false" :clearable="true"
+                        placeholder="请选择类型">
+                    <el-option v-for='item in collectionTypeOptions' :key="item.value" :value="item.value"
+                               :label="item.label"></el-option>
+                </el-select>
+    </el-form-item>
+
+                                        </el-col>
+                                <el-col :span=16 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="collectionUser">
+                            </el-table-column>
+                        <el-table-column label="类型"   align="left" prop="collectionType" :formatter="collectionTypeFormat">
+                        </el-table-column>
+                            <el-table-column label="值"   align="left" prop="collectionValue">
+                            </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:collection:update">
+                                    <el-link type="primary" :underline="false" @click="save(scope.row.id)">编辑</el-link>
+                                </@shiro.hasPermission>
+                            <@shiro.hasPermission name="tf:collection: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": "",
+    "action": "and",
+    "field": "COLLECTION_USER",
+    "el": "eq",
+    "model": "collectionUser",
+    "name": "用户",
+    "type": "input"
+    },
+       {
+  "isSearch": "true",
+  "action": "and",
+  "field": "COLLECTION_TYPE",
+  "el": "eq",
+  "model": "collectionType",
+  "name": "类型",
+  "key": "value",
+  "title": "label",
+  "type": "select",
+  "multiple": "false"
+  ,"options":[{"value":"1","label":"企业"},{"value":"2","label":"产品"},{"value":"3","label":"设计谷"}]
+},    {
+    "isSearch": "",
+    "action": "and",
+    "field": "COLLECTION_VALUE",
+    "el": "eq",
+    "model": "collectionValue",
+    "name": "值",
+    "type": "input"
+    },
+                ],
+                dataList: [], //收藏列表
+                selectionList:[],//收藏列表选中
+                total: 0, //总记录数量
+                pageSize: 10, //页面数量
+                currentPage:1, //初始页
+                manager: ms.manager,
+                loading: true,//加载状态
+                emptyText:'',//提示文字
+                // 类型
+                collectionTypeOptions:[{"value":"1","label":"企业"},{"value":"2","label":"产品"},{"value":"3","label":"设计谷"}],
+                //搜索表单
+                form:{
+                    sqlWhere:null
+                },
+                //历史记录参数
+                historyKey: "tf_collection_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/collection/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/collection/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/collection/form.do?id="+id);
+                }else {
+                    ms.util.openSystemUrl("/tf/collection/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);
+            },
+    //类型  列表格式化
+    collectionTypeFormat:function(row, column, cellValue, index){
+        var value="";
+
+            if(cellValue){
+            var data = this.collectionTypeOptions.find(function(value){
+            return value.value==cellValue;
+            })
+            if(data&&data.label){
+            value = data.label;
+            }
+            }
+
+        return value;
+    },
+
+//获取collectionType数据源
+
+        },
+        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>

+ 19 - 0
src/main/webapp/static/locale/lang/collection/en_US.js

@@ -0,0 +1,19 @@
+var en_US ={
+    form:{
+                collectionUser:{
+            text:'用户',
+            placeholder:'请输入用户',
+            help:'',
+        },
+        collectionType:{
+            text:'类型',
+            placeholder:'请选择类型',
+            help:'',
+        },
+        collectionValue:{
+            text:'值',
+            placeholder:'请输入值',
+            help:'',
+        },
+    }
+}

+ 20 - 0
src/main/webapp/static/locale/lang/collection/zh_CN.js

@@ -0,0 +1,20 @@
+
+var zh_CN ={
+    form:{
+                collectionUser:{
+            text:'用户',
+            placeholder:'请输入用户',
+            help:'',
+        },
+        collectionType:{
+            text:'类型',
+            placeholder:'请选择类型',
+            help:'',
+        },
+        collectionValue:{
+            text:'值',
+            placeholder:'请输入值',
+            help:'',
+        },
+    }
+}