huangxiao 2 viikkoa sitten
vanhempi
commit
f3f2dd0718
37 muutettua tiedostoa jossa 3720 lisäystä ja 2 poistoa
  1. 1 1
      src/main/java/net/mingsoft/config/ShiroConfig.java
  2. 43 0
      src/main/java/net/mingsoft/tf/action/BaseAction.java
  3. 279 0
      src/main/java/net/mingsoft/tf/action/BoothAction.java
  4. 238 0
      src/main/java/net/mingsoft/tf/action/ExhibitionAction.java
  5. 274 0
      src/main/java/net/mingsoft/tf/action/ExhibitorAction.java
  6. 16 0
      src/main/java/net/mingsoft/tf/biz/IBoothBiz.java
  7. 16 0
      src/main/java/net/mingsoft/tf/biz/IExhibitionBiz.java
  8. 16 0
      src/main/java/net/mingsoft/tf/biz/IExhibitorBiz.java
  9. 34 0
      src/main/java/net/mingsoft/tf/biz/impl/BoothBizImpl.java
  10. 34 0
      src/main/java/net/mingsoft/tf/biz/impl/ExhibitionBizImpl.java
  11. 34 0
      src/main/java/net/mingsoft/tf/biz/impl/ExhibitorBizImpl.java
  12. 18 0
      src/main/java/net/mingsoft/tf/constant/Const.java
  13. 14 0
      src/main/java/net/mingsoft/tf/dao/IBoothDao.java
  14. 23 0
      src/main/java/net/mingsoft/tf/dao/IBoothDao.xml
  15. 14 0
      src/main/java/net/mingsoft/tf/dao/IExhibitionDao.java
  16. 20 0
      src/main/java/net/mingsoft/tf/dao/IExhibitionDao.xml
  17. 14 0
      src/main/java/net/mingsoft/tf/dao/IExhibitorDao.java
  18. 25 0
      src/main/java/net/mingsoft/tf/dao/IExhibitorDao.xml
  19. 140 0
      src/main/java/net/mingsoft/tf/entity/BoothEntity.java
  20. 90 0
      src/main/java/net/mingsoft/tf/entity/ExhibitionEntity.java
  21. 176 0
      src/main/java/net/mingsoft/tf/entity/ExhibitorEntity.java
  22. 17 0
      src/main/java/net/mingsoft/tf/resources/resources_en_US.properties
  23. 17 0
      src/main/java/net/mingsoft/tf/resources/resources_zh_CN.properties
  24. 1 1
      src/main/java/net/mingsoft/tf/wx/WxCustomUserNamePasswordToken.java
  25. 191 0
      src/main/java/net/mingsoft/tf/wx/WxPeopleAction.java
  26. 228 0
      src/main/webapp/WEB-INF/manager/tf/booth/form.ftl
  27. 356 0
      src/main/webapp/WEB-INF/manager/tf/booth/index.ftl
  28. 190 0
      src/main/webapp/WEB-INF/manager/tf/exhibition/form.ftl
  29. 282 0
      src/main/webapp/WEB-INF/manager/tf/exhibition/index.ftl
  30. 326 0
      src/main/webapp/WEB-INF/manager/tf/exhibitor/form.ftl
  31. 406 0
      src/main/webapp/WEB-INF/manager/tf/exhibitor/index.ftl
  32. 34 0
      src/main/webapp/static/locale/lang/booth/en_US.js
  33. 35 0
      src/main/webapp/static/locale/lang/booth/zh_CN.js
  34. 14 0
      src/main/webapp/static/locale/lang/exhibition/en_US.js
  35. 15 0
      src/main/webapp/static/locale/lang/exhibition/zh_CN.js
  36. 44 0
      src/main/webapp/static/locale/lang/exhibitor/en_US.js
  37. 45 0
      src/main/webapp/static/locale/lang/exhibitor/zh_CN.js

+ 1 - 1
src/main/java/net/mingsoft/config/ShiroConfig.java

@@ -34,7 +34,7 @@ import net.mingsoft.basic.strategy.ManagerModelStrategy;
 import net.mingsoft.people.filter.PeopleLoginFilter;
 import net.mingsoft.people.realm.PeopleAuthRealm;
 import net.mingsoft.people.realm.PeopleLoginMD5CredentialsMatcher;
-import net.mingsoft.tf.basic.realm.WxCustomUserNamePasswordToken;
+import net.mingsoft.tf.wx.WxCustomUserNamePasswordToken;
 import org.apache.shiro.authc.AuthenticationInfo;
 import org.apache.shiro.authc.AuthenticationToken;
 import org.apache.shiro.authc.Authenticator;

+ 43 - 0
src/main/java/net/mingsoft/tf/action/BaseAction.java

@@ -0,0 +1,43 @@
+
+package net.mingsoft.tf.action;
+
+import java.util.MissingResourceException;
+import net.mingsoft.base.util.BundleUtil;
+
+/**
+* tf基础控制层
+* @author 阿白
+* 创建日期:2025年10月23日 下午6:08:02<br/>
+* 历史修订:<br/>
+*/
+public class BaseAction extends net.mingsoft.basic.action.BaseAction{
+
+    /**
+    * 读取国际化资源文件(没有占位符号的),优先模块对应的资源文件,如果模块资源文件找不到就会优先基础层
+    * @param key 国际化文件key
+    * @return 国际化字符串
+    */
+    protected String getResString(String key) {
+        return this.getResString(key,"");
+    }
+
+    /**
+    * 读取国际化资源文件,优先模块对应的资源文件,如果模块资源文件找不到就会优先基础层
+    * @param key 国际化文件key
+    * @param params 拼接值
+    * @return 国际化字符串
+    */
+    protected String getResString(String key,String... params) {
+        String str = "";
+        try {
+            str = super.getResString(key);
+            //替换占位
+            for (int i = 0; i < params.length; i++) {
+                str = str.replace("{" + i + "}", params[i]);
+            }
+        } catch (MissingResourceException e) {
+            str = BundleUtil.getString(net.mingsoft.tf.constant.Const.RESOURCES,key,params);
+        }
+        return str;
+    }
+}

+ 279 - 0
src/main/java/net/mingsoft/tf/action/BoothAction.java

@@ -0,0 +1,279 @@
+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.IBoothBiz;
+import net.mingsoft.tf.entity.BoothEntity;
+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年10月23日 下午6:08:01<br/>
+* 历史修订:<br/>
+*/
+@Tag(name = "后台-展位接口")
+@Controller("tfBoothAction")
+@RequestMapping("/${ms.manager.path}/tf/booth")
+public class BoothAction extends net.mingsoft.tf.action.BaseAction{
+
+
+    /**
+    * 注入展位业务层
+    */
+    @Autowired
+    private IBoothBiz boothBiz;
+
+    /**
+    * 返回主界面index
+    */
+    @Hidden
+    @GetMapping("/index")
+    public String index() {
+        return "/tf/booth/index";
+    }
+
+
+    /**
+    * 返回编辑界面booth的form
+    */
+    @Hidden
+    @GetMapping("/form")
+    public String form() {
+        return "/tf/booth/form";
+    }
+
+
+    /**
+    * 查询展位列表
+    * @param booth 展位实体
+    */
+    @Operation(summary = "查询展位列表接口")
+    @Parameters({
+        @Parameter(name = "boothCode", description = "编码", in = ParameterIn.QUERY),
+        @Parameter(name = "inputHudra", description = "楼层", in = ParameterIn.QUERY),
+        @Parameter(name = "boothName", description = "名称", in = ParameterIn.QUERY),
+        @Parameter(name = "boothStyle", description = "风格", in = ParameterIn.QUERY),
+        @Parameter(name = "boothMaterials", description = "材料", in = ParameterIn.QUERY),
+        @Parameter(name = "boothEnable", description = "是否使用", in = ParameterIn.QUERY),
+    })
+    @RequestMapping(value ="/list",method = {RequestMethod.GET,RequestMethod.POST})
+    @ResponseBody
+    @RequiresPermissions("tf:booth:view")
+    public ResultData list(@ModelAttribute @Parameter(hidden = true) BoothEntity booth) {
+        BasicUtil.startPage();
+        List boothList = null;
+        if ( booth.getSqlWhere() != null){
+            boothList = boothBiz.query(booth);
+        } else {
+            LambdaQueryWrapper<BoothEntity> wrapper = new LambdaQueryWrapper<>(booth).orderByDesc(BoothEntity::getCreateDate);
+            boothList = boothBiz.list(wrapper);
+        }
+        return ResultData.build().success(new EUListBean(boothList,(int)BasicUtil.endPage(boothList).getTotal()));
+    }
+
+
+    /**
+    * 获取展位
+    * @param booth 展位实体
+    */
+    @Operation(summary = "获取展位列表接口")
+    @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY)
+    @GetMapping("/get")
+    @ResponseBody
+    @RequiresPermissions("tf:booth:view")
+    public ResultData get(@ModelAttribute @Parameter(hidden = true) BoothEntity booth) {
+        if (StringUtils.isBlank(booth.getId())) {
+            return ResultData.build().error(getResString("err.error",this.getResString("id")));
+        }
+        BoothEntity _booth = (BoothEntity)boothBiz.getById(booth.getId());
+        return ResultData.build().success(_booth);
+    }
+
+
+    /**
+    * 保存展位
+    * @param booth 展位实体
+    */
+    @Operation(summary = "保存展位列表接口")
+    @Parameters({
+        @Parameter(name = "boothCode", description = "编码", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "inputHudra", description = "楼层", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "boothName", description = "名称", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "boothStyle", description = "风格", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "boothMaterials", description = "材料", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "boothEnable", description = "是否使用", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/save")
+    @ResponseBody
+    @LogAnn(title = "保存展位", businessType = BusinessTypeEnum.INSERT)
+    @RequiresPermissions("tf:booth:save")
+    public ResultData save(@ModelAttribute @Parameter(hidden = true) BoothEntity booth) {
+        //验证编码的值是否重复
+        if (super.validated("BOOTH","BOOTH_CODE",booth.getBoothCode())) {
+            return ResultData.build().error(getResString("err.exist", this.getResString("booth.code")));
+        }
+
+        //验证编码的值是否合法
+        if (StringUtils.isBlank(booth.getBoothCode())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("booth.code")));
+        }
+        if (!StringUtil.checkLength(booth.getBoothCode()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.code"), "0", "255"));
+        }
+        //验证楼层的值是否合法
+        if (StringUtils.isBlank(booth.getInputHudra())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("input.hudra")));
+        }
+        if (!StringUtil.checkLength(booth.getInputHudra()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("input.hudra"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(booth.getBoothName()) && !StringUtil.checkLength(booth.getBoothName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.name"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(booth.getBoothStyle()) && !StringUtil.checkLength(booth.getBoothStyle()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.style"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(booth.getBoothMaterials()) && !StringUtil.checkLength(booth.getBoothMaterials()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.materials"), "0", "255"));
+        }
+        //验证是否使用的值是否合法
+        if (booth.getBoothEnable()==null) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("booth.enable")));
+        }
+        boothBiz.save(booth);
+        return ResultData.build().success(booth);
+    }
+
+    /**
+    *  删除展位
+    *
+    * @param booths 展位实体
+    */
+    @Operation(summary = "批量删除展位列表接口")
+    @PostMapping("/delete")
+    @ResponseBody
+    @LogAnn(title = "删除展位", businessType = BusinessTypeEnum.DELETE)
+    @RequiresPermissions("tf:booth:del")
+    public ResultData delete(@RequestBody List<BoothEntity> booths) {
+        List<String> ids = (List)booths.stream().map((p) -> {return p.getId();}).collect(Collectors.toList());
+        return this.boothBiz.removeByIds(ids) ? ResultData.build().success() : ResultData.build().error(this.getResString("err.error", new String[]{this.getResString("id")}));
+    }
+
+    /**
+    *	更新展位列表
+    *
+    * @param booth 展位实体
+    */
+    @Operation(summary = "更新展位列表接口")
+    @Parameters({
+        @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY),
+        @Parameter(name = "boothCode", description = "编码", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "inputHudra", description = "楼层", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "boothName", description = "名称", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "boothStyle", description = "风格", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "boothMaterials", description = "材料", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "boothEnable", description = "是否使用", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/update")
+    @ResponseBody
+    @LogAnn(title = "更新展位", businessType = BusinessTypeEnum.UPDATE)
+    @RequiresPermissions("tf:booth:update")
+    public ResultData update(@ModelAttribute @Parameter(hidden = true) BoothEntity booth) {
+        //先查询数据是否存在
+        BoothEntity _booth = (BoothEntity)boothBiz.getById(booth.getId());
+        if(_booth == null) {
+            return ResultData.build().error(getResString("err.not.exist",booth.getId() ));
+        }
+        //验证编码的值是否重复
+        if (super.validated("BOOTH","BOOTH_CODE",booth.getBoothCode(), booth.getId(),"id")) {
+            return ResultData.build().error(getResString("err.exist", this.getResString("booth.code")));
+        }
+
+        //验证编码的值是否合法
+        if (StringUtils.isBlank(booth.getBoothCode())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("booth.code")));
+        }
+        if (!StringUtil.checkLength(booth.getBoothCode()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.code"), "0", "255"));
+        }
+        //验证楼层的值是否合法
+        if (StringUtils.isBlank(booth.getInputHudra())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("input.hudra")));
+        }
+        if (!StringUtil.checkLength(booth.getInputHudra()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("input.hudra"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(booth.getBoothName()) && !StringUtil.checkLength(booth.getBoothName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.name"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(booth.getBoothStyle()) && !StringUtil.checkLength(booth.getBoothStyle()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.style"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(booth.getBoothMaterials()) && !StringUtil.checkLength(booth.getBoothMaterials()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("booth.materials"), "0", "255"));
+        }
+        //验证是否使用的值是否合法
+        if (booth.getBoothEnable()==null) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("booth.enable")));
+        }
+        boothBiz.updateById(booth);
+        return ResultData.build().success(booth);
+    }
+
+    @GetMapping("verify")
+    @ResponseBody
+    public ResultData verify(String fieldName, String fieldValue, String id,String idName) {
+        boolean verify = false;
+        if (StringUtils.isBlank(id)) {
+            verify = super.validated("BOOTH",fieldName,fieldValue);
+        } else {
+            verify = super.validated("BOOTH",fieldName,fieldValue,id,idName);
+        }
+        if (verify) {
+            return ResultData.build().success(false);
+        }else {
+            return ResultData.build().success(true);
+        }
+    }
+
+}

+ 238 - 0
src/main/java/net/mingsoft/tf/action/ExhibitionAction.java

@@ -0,0 +1,238 @@
+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.IExhibitionBiz;
+import net.mingsoft.tf.entity.ExhibitionEntity;
+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年10月23日 下午6:08:02<br/>
+* 历史修订:<br/>
+*/
+@Tag(name = "后台-展会接口")
+@Controller("tfExhibitionAction")
+@RequestMapping("/${ms.manager.path}/tf/exhibition")
+public class ExhibitionAction extends net.mingsoft.tf.action.BaseAction{
+
+
+    /**
+    * 注入展会业务层
+    */
+    @Autowired
+    private IExhibitionBiz exhibitionBiz;
+
+    /**
+    * 返回主界面index
+    */
+    @Hidden
+    @GetMapping("/index")
+    public String index() {
+        return "/tf/exhibition/index";
+    }
+
+
+    /**
+    * 返回编辑界面exhibition的form
+    */
+    @Hidden
+    @GetMapping("/form")
+    public String form() {
+        return "/tf/exhibition/form";
+    }
+
+
+    /**
+    * 查询展会列表
+    * @param exhibition 展会实体
+    */
+    @Operation(summary = "查询展会列表接口")
+    @Parameters({
+        @Parameter(name = "activityName", description = "活动名称", in = ParameterIn.QUERY),
+        @Parameter(name = "activityStart", description = "开始日期", in = ParameterIn.QUERY),
+        @Parameter(name = "activityEnd", description = "结束日期", in = ParameterIn.QUERY),
+    })
+    @RequestMapping(value ="/list",method = {RequestMethod.GET,RequestMethod.POST})
+    @ResponseBody
+    @RequiresPermissions("tf:exhibition:view")
+    public ResultData list(@ModelAttribute @Parameter(hidden = true) ExhibitionEntity exhibition) {
+        BasicUtil.startPage();
+        List exhibitionList = null;
+        if ( exhibition.getSqlWhere() != null){
+            exhibitionList = exhibitionBiz.query(exhibition);
+        } else {
+            LambdaQueryWrapper<ExhibitionEntity> wrapper = new LambdaQueryWrapper<>(exhibition).orderByDesc(ExhibitionEntity::getCreateDate);
+            exhibitionList = exhibitionBiz.list(wrapper);
+        }
+        return ResultData.build().success(new EUListBean(exhibitionList,(int)BasicUtil.endPage(exhibitionList).getTotal()));
+    }
+
+
+    /**
+    * 获取展会
+    * @param exhibition 展会实体
+    */
+    @Operation(summary = "获取展会列表接口")
+    @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY)
+    @GetMapping("/get")
+    @ResponseBody
+    @RequiresPermissions("tf:exhibition:view")
+    public ResultData get(@ModelAttribute @Parameter(hidden = true) ExhibitionEntity exhibition) {
+        if (StringUtils.isBlank(exhibition.getId())) {
+            return ResultData.build().error(getResString("err.error",this.getResString("id")));
+        }
+        ExhibitionEntity _exhibition = (ExhibitionEntity)exhibitionBiz.getById(exhibition.getId());
+        return ResultData.build().success(_exhibition);
+    }
+
+
+    /**
+    * 保存展会
+    * @param exhibition 展会实体
+    */
+    @Operation(summary = "保存展会列表接口")
+    @Parameters({
+        @Parameter(name = "activityName", description = "活动名称", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "activityStart", description = "开始日期", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "activityEnd", description = "结束日期", required = true, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/save")
+    @ResponseBody
+    @LogAnn(title = "保存展会", businessType = BusinessTypeEnum.INSERT)
+    @RequiresPermissions("tf:exhibition:save")
+    public ResultData save(@ModelAttribute @Parameter(hidden = true) ExhibitionEntity exhibition) {
+
+        //验证活动名称的值是否合法
+        if (StringUtils.isBlank(exhibition.getActivityName())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("activity.name")));
+        }
+        if (!StringUtil.checkLength(exhibition.getActivityName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("activity.name"), "0", "255"));
+        }
+        //验证开始日期的值是否合法
+        if (exhibition.getActivityStart()==null) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("activity.start")));
+        }
+        //验证结束日期的值是否合法
+        if (exhibition.getActivityEnd()==null) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("activity.end")));
+        }
+        exhibitionBiz.save(exhibition);
+        return ResultData.build().success(exhibition);
+    }
+
+    /**
+    *  删除展会
+    *
+    * @param exhibitions 展会实体
+    */
+    @Operation(summary = "批量删除展会列表接口")
+    @PostMapping("/delete")
+    @ResponseBody
+    @LogAnn(title = "删除展会", businessType = BusinessTypeEnum.DELETE)
+    @RequiresPermissions("tf:exhibition:del")
+    public ResultData delete(@RequestBody List<ExhibitionEntity> exhibitions) {
+        List<String> ids = (List)exhibitions.stream().map((p) -> {return p.getId();}).collect(Collectors.toList());
+        return this.exhibitionBiz.removeByIds(ids) ? ResultData.build().success() : ResultData.build().error(this.getResString("err.error", new String[]{this.getResString("id")}));
+    }
+
+    /**
+    *	更新展会列表
+    *
+    * @param exhibition 展会实体
+    */
+    @Operation(summary = "更新展会列表接口")
+    @Parameters({
+        @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY),
+        @Parameter(name = "activityName", description = "活动名称", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "activityStart", description = "开始日期", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "activityEnd", description = "结束日期", required = true, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/update")
+    @ResponseBody
+    @LogAnn(title = "更新展会", businessType = BusinessTypeEnum.UPDATE)
+    @RequiresPermissions("tf:exhibition:update")
+    public ResultData update(@ModelAttribute @Parameter(hidden = true) ExhibitionEntity exhibition) {
+        //先查询数据是否存在
+        ExhibitionEntity _exhibition = (ExhibitionEntity)exhibitionBiz.getById(exhibition.getId());
+        if(_exhibition == null) {
+            return ResultData.build().error(getResString("err.not.exist",exhibition.getId() ));
+        }
+
+        //验证活动名称的值是否合法
+        if (StringUtils.isBlank(exhibition.getActivityName())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("activity.name")));
+        }
+        if (!StringUtil.checkLength(exhibition.getActivityName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("activity.name"), "0", "255"));
+        }
+        //验证开始日期的值是否合法
+        if (exhibition.getActivityStart()==null) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("activity.start")));
+        }
+        //验证结束日期的值是否合法
+        if (exhibition.getActivityEnd()==null) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("activity.end")));
+        }
+        exhibitionBiz.updateById(exhibition);
+        return ResultData.build().success(exhibition);
+    }
+
+    @GetMapping("verify")
+    @ResponseBody
+    public ResultData verify(String fieldName, String fieldValue, String id,String idName) {
+        boolean verify = false;
+        if (StringUtils.isBlank(id)) {
+            verify = super.validated("EXHIBITION",fieldName,fieldValue);
+        } else {
+            verify = super.validated("EXHIBITION",fieldName,fieldValue,id,idName);
+        }
+        if (verify) {
+            return ResultData.build().success(false);
+        }else {
+            return ResultData.build().success(true);
+        }
+    }
+
+}

+ 274 - 0
src/main/java/net/mingsoft/tf/action/ExhibitorAction.java

@@ -0,0 +1,274 @@
+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.IExhibitorBiz;
+import net.mingsoft.tf.entity.ExhibitorEntity;
+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年10月23日 下午6:08:02<br/>
+* 历史修订:<br/>
+*/
+@Tag(name = "后台-展商接口")
+@Controller("tfExhibitorAction")
+@RequestMapping("/${ms.manager.path}/tf/exhibitor")
+public class ExhibitorAction extends net.mingsoft.tf.action.BaseAction{
+
+
+    /**
+    * 注入展商业务层
+    */
+    @Autowired
+    private IExhibitorBiz exhibitorBiz;
+
+    /**
+    * 返回主界面index
+    */
+    @Hidden
+    @GetMapping("/index")
+    public String index() {
+        return "/tf/exhibitor/index";
+    }
+
+
+    /**
+    * 返回编辑界面exhibitor的form
+    */
+    @Hidden
+    @GetMapping("/form")
+    public String form() {
+        return "/tf/exhibitor/form";
+    }
+
+
+    /**
+    * 查询展商列表
+    * @param exhibitor 展商实体
+    */
+    @Operation(summary = "查询展商列表接口")
+    @Parameters({
+        @Parameter(name = "exhibitorName", description = "公司名称", in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorBooth", description = "展位号", in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorContact", description = "联系人", in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorPhone", description = "联系电话", in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorIntroduction", description = "公司简介", in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorUser", description = "用户ID", in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorActivities", description = "展会ID", in = ParameterIn.QUERY),
+    })
+    @RequestMapping(value ="/list",method = {RequestMethod.GET,RequestMethod.POST})
+    @ResponseBody
+    @RequiresPermissions("tf:exhibitor:view")
+    public ResultData list(@ModelAttribute @Parameter(hidden = true) ExhibitorEntity exhibitor) {
+        BasicUtil.startPage();
+        List exhibitorList = null;
+        if ( exhibitor.getSqlWhere() != null){
+            exhibitorList = exhibitorBiz.query(exhibitor);
+        } else {
+            LambdaQueryWrapper<ExhibitorEntity> wrapper = new LambdaQueryWrapper<>(exhibitor).orderByDesc(ExhibitorEntity::getCreateDate);
+            exhibitorList = exhibitorBiz.list(wrapper);
+        }
+        return ResultData.build().success(new EUListBean(exhibitorList,(int)BasicUtil.endPage(exhibitorList).getTotal()));
+    }
+
+
+    /**
+    * 获取展商
+    * @param exhibitor 展商实体
+    */
+    @Operation(summary = "获取展商列表接口")
+    @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY)
+    @GetMapping("/get")
+    @ResponseBody
+    @RequiresPermissions("tf:exhibitor:view")
+    public ResultData get(@ModelAttribute @Parameter(hidden = true) ExhibitorEntity exhibitor) {
+        if (StringUtils.isBlank(exhibitor.getId())) {
+            return ResultData.build().error(getResString("err.error",this.getResString("id")));
+        }
+        ExhibitorEntity _exhibitor = (ExhibitorEntity)exhibitorBiz.getById(exhibitor.getId());
+        return ResultData.build().success(_exhibitor);
+    }
+
+
+    /**
+    * 保存展商
+    * @param exhibitor 展商实体
+    */
+    @Operation(summary = "保存展商列表接口")
+    @Parameters({
+        @Parameter(name = "exhibitorName", description = "公司名称", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorBooth", description = "展位号", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorContact", description = "联系人", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorPhone", description = "联系电话", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorLogo", description = "公司LOGO", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorIntroduction", description = "公司简介", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorUser", description = "用户ID", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorActivities", description = "展会ID", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/save")
+    @ResponseBody
+    @LogAnn(title = "保存展商", businessType = BusinessTypeEnum.INSERT)
+    @RequiresPermissions("tf:exhibitor:save")
+    public ResultData save(@ModelAttribute @Parameter(hidden = true) ExhibitorEntity exhibitor) {
+
+        //验证公司名称的值是否合法
+        if (StringUtils.isBlank(exhibitor.getExhibitorName())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("exhibitor.name")));
+        }
+        if (!StringUtil.checkLength(exhibitor.getExhibitorName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.name"), "0", "255"));
+        }
+        //验证展位号的值是否合法
+        if (StringUtils.isBlank(exhibitor.getExhibitorBooth())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("exhibitor.booth")));
+        }
+        if (!StringUtil.checkLength(exhibitor.getExhibitorBooth()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.booth"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorContact()) && !StringUtil.checkLength(exhibitor.getExhibitorContact()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.contact"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorPhone()) && !StringUtil.checkLength(exhibitor.getExhibitorPhone()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.phone"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorUser()) && !StringUtil.checkLength(exhibitor.getExhibitorUser()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.user"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorActivities()) && !StringUtil.checkLength(exhibitor.getExhibitorActivities()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.activities"), "0", "255"));
+        }
+        exhibitorBiz.save(exhibitor);
+        return ResultData.build().success(exhibitor);
+    }
+
+    /**
+    *  删除展商
+    *
+    * @param exhibitors 展商实体
+    */
+    @Operation(summary = "批量删除展商列表接口")
+    @PostMapping("/delete")
+    @ResponseBody
+    @LogAnn(title = "删除展商", businessType = BusinessTypeEnum.DELETE)
+    @RequiresPermissions("tf:exhibitor:del")
+    public ResultData delete(@RequestBody List<ExhibitorEntity> exhibitors) {
+        List<String> ids = (List)exhibitors.stream().map((p) -> {return p.getId();}).collect(Collectors.toList());
+        return this.exhibitorBiz.removeByIds(ids) ? ResultData.build().success() : ResultData.build().error(this.getResString("err.error", new String[]{this.getResString("id")}));
+    }
+
+    /**
+    *	更新展商列表
+    *
+    * @param exhibitor 展商实体
+    */
+    @Operation(summary = "更新展商列表接口")
+    @Parameters({
+        @Parameter(name = "id", description = "主键ID", required =true,in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorName", description = "公司名称", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorBooth", description = "展位号", required = true, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorContact", description = "联系人", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorPhone", description = "联系电话", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorLogo", description = "公司LOGO", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorIntroduction", description = "公司简介", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorUser", description = "用户ID", required = false, in = ParameterIn.QUERY),
+        @Parameter(name = "exhibitorActivities", description = "展会ID", required = false, in = ParameterIn.QUERY),
+    })
+    @PostMapping("/update")
+    @ResponseBody
+    @LogAnn(title = "更新展商", businessType = BusinessTypeEnum.UPDATE)
+    @RequiresPermissions("tf:exhibitor:update")
+    public ResultData update(@ModelAttribute @Parameter(hidden = true) ExhibitorEntity exhibitor) {
+        //先查询数据是否存在
+        ExhibitorEntity _exhibitor = (ExhibitorEntity)exhibitorBiz.getById(exhibitor.getId());
+        if(_exhibitor == null) {
+            return ResultData.build().error(getResString("err.not.exist",exhibitor.getId() ));
+        }
+
+        //验证公司名称的值是否合法
+        if (StringUtils.isBlank(exhibitor.getExhibitorName())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("exhibitor.name")));
+        }
+        if (!StringUtil.checkLength(exhibitor.getExhibitorName()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.name"), "0", "255"));
+        }
+        //验证展位号的值是否合法
+        if (StringUtils.isBlank(exhibitor.getExhibitorBooth())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("exhibitor.booth")));
+        }
+        if (!StringUtil.checkLength(exhibitor.getExhibitorBooth()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.booth"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorContact()) && !StringUtil.checkLength(exhibitor.getExhibitorContact()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.contact"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorPhone()) && !StringUtil.checkLength(exhibitor.getExhibitorPhone()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.phone"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorUser()) && !StringUtil.checkLength(exhibitor.getExhibitorUser()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.user"), "0", "255"));
+        }
+        if (  StringUtils.isNotBlank(exhibitor.getExhibitorActivities()) && !StringUtil.checkLength(exhibitor.getExhibitorActivities()+"", 0, 255)) {
+          return ResultData.build().error(getResString("err.length", this.getResString("exhibitor.activities"), "0", "255"));
+        }
+        exhibitorBiz.updateById(exhibitor);
+        return ResultData.build().success(exhibitor);
+    }
+
+    @GetMapping("verify")
+    @ResponseBody
+    public ResultData verify(String fieldName, String fieldValue, String id,String idName) {
+        boolean verify = false;
+        if (StringUtils.isBlank(id)) {
+            verify = super.validated("EXHIBITOR",fieldName,fieldValue);
+        } else {
+            verify = super.validated("EXHIBITOR",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/IBoothBiz.java

@@ -0,0 +1,16 @@
+package net.mingsoft.tf.biz;
+
+import net.mingsoft.base.biz.IBaseBiz;
+import net.mingsoft.tf.entity.BoothEntity;
+
+
+/**
+ * 展位业务
+ * @author 阿白
+ * 创建日期:2025年10月23日 下午6:08:01<br/>
+ * 历史修订:<br/>
+ */
+public interface IBoothBiz extends IBaseBiz<BoothEntity> {
+
+
+}

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

@@ -0,0 +1,16 @@
+package net.mingsoft.tf.biz;
+
+import net.mingsoft.base.biz.IBaseBiz;
+import net.mingsoft.tf.entity.ExhibitionEntity;
+
+
+/**
+ * 展会业务
+ * @author 阿白
+ * 创建日期:2025年10月23日 下午6:08:02<br/>
+ * 历史修订:<br/>
+ */
+public interface IExhibitionBiz extends IBaseBiz<ExhibitionEntity> {
+
+
+}

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

@@ -0,0 +1,16 @@
+package net.mingsoft.tf.biz;
+
+import net.mingsoft.base.biz.IBaseBiz;
+import net.mingsoft.tf.entity.ExhibitorEntity;
+
+
+/**
+ * 展商业务
+ * @author 阿白
+ * 创建日期:2025年10月23日 下午6:08:02<br/>
+ * 历史修订:<br/>
+ */
+public interface IExhibitorBiz extends IBaseBiz<ExhibitorEntity> {
+
+
+}

+ 34 - 0
src/main/java/net/mingsoft/tf/biz/impl/BoothBizImpl.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.BoothEntity;
+import net.mingsoft.tf.biz.IBoothBiz;
+import net.mingsoft.tf.dao.IBoothDao;
+
+/**
+* 展位管理持久化层
+* @author 阿白
+* 创建日期:2025年10月23日 下午6:08:01<br/>
+* 历史修订:<br/>
+*/
+@Service("tfboothBizImpl")
+public class BoothBizImpl extends BaseBizImpl<IBoothDao,BoothEntity> implements IBoothBiz {
+
+
+    @Autowired
+    private IBoothDao boothDao;
+
+
+    @Override
+    protected IBaseDao getDao() {
+        // TODO Auto-generated method stub
+        return boothDao;
+    }
+
+
+
+}

+ 34 - 0
src/main/java/net/mingsoft/tf/biz/impl/ExhibitionBizImpl.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.ExhibitionEntity;
+import net.mingsoft.tf.biz.IExhibitionBiz;
+import net.mingsoft.tf.dao.IExhibitionDao;
+
+/**
+* 展会管理持久化层
+* @author 阿白
+* 创建日期:2025年10月23日 下午6:08:02<br/>
+* 历史修订:<br/>
+*/
+@Service("tfexhibitionBizImpl")
+public class ExhibitionBizImpl extends BaseBizImpl<IExhibitionDao,ExhibitionEntity> implements IExhibitionBiz {
+
+
+    @Autowired
+    private IExhibitionDao exhibitionDao;
+
+
+    @Override
+    protected IBaseDao getDao() {
+        // TODO Auto-generated method stub
+        return exhibitionDao;
+    }
+
+
+
+}

+ 34 - 0
src/main/java/net/mingsoft/tf/biz/impl/ExhibitorBizImpl.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.ExhibitorEntity;
+import net.mingsoft.tf.biz.IExhibitorBiz;
+import net.mingsoft.tf.dao.IExhibitorDao;
+
+/**
+* 展商管理持久化层
+* @author 阿白
+* 创建日期:2025年10月23日 下午6:08:02<br/>
+* 历史修订:<br/>
+*/
+@Service("tfexhibitorBizImpl")
+public class ExhibitorBizImpl extends BaseBizImpl<IExhibitorDao,ExhibitorEntity> implements IExhibitorBiz {
+
+
+    @Autowired
+    private IExhibitorDao exhibitorDao;
+
+
+    @Override
+    protected IBaseDao getDao() {
+        // TODO Auto-generated method stub
+        return exhibitorDao;
+    }
+
+
+
+}

+ 18 - 0
src/main/java/net/mingsoft/tf/constant/Const.java

@@ -0,0 +1,18 @@
+package net.mingsoft.tf.constant;
+
+import java.util.ResourceBundle;
+
+/**
+ * tf定义
+ * @author 阿白
+ * 创建日期:2025年10月23日 下午6:08:02<br/>
+ * 历史修订:<br/>
+ */
+public final class Const {
+
+	/**
+	 * 资源文件
+	 */
+	public final static String RESOURCES = "net.mingsoft.tf.resources.resources";
+	
+}

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

@@ -0,0 +1,14 @@
+package net.mingsoft.tf.dao;
+
+import net.mingsoft.base.dao.IBaseDao;
+import java.util.*;
+import net.mingsoft.tf.entity.BoothEntity;
+
+/**
+ * 展位持久层
+ * @author 阿白
+ * 创建日期:2025年10月23日 下午6:08:01<br/>
+ * 历史修订:<br/>
+ */
+public interface IBoothDao extends IBaseDao<BoothEntity> {
+}

+ 23 - 0
src/main/java/net/mingsoft/tf/dao/IBoothDao.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.IBoothDao">
+
+	<resultMap id="resultMap" type="net.mingsoft.tf.entity.BoothEntity">
+				<result column="BOOTH_CODE" property="boothCode" /><!--编码 -->
+				<result column="INPUT_HUDRA" property="inputHudra" /><!--楼层 -->
+				<result column="BOOTH_NAME" property="boothName" /><!--名称 -->
+				<result column="BOOTH_STYLE" property="boothStyle" /><!--风格 -->
+				<result column="BOOTH_MATERIALS" property="boothMaterials" /><!--材料 -->
+				<result column="BOOTH_ENABLE" property="boothEnable" /><!--是否使用 -->
+	</resultMap>
+
+	<select id="query" resultMap="resultMap">
+		SELECT * FROM BOOTH
+		<where>
+			DEL=0
+			<include refid="net.mingsoft.base.dao.IBaseDao.sqlWhere"></include>
+		</where>
+		 ORDER BY ID DESC
+	</select>
+
+</mapper>

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

@@ -0,0 +1,14 @@
+package net.mingsoft.tf.dao;
+
+import net.mingsoft.base.dao.IBaseDao;
+import java.util.*;
+import net.mingsoft.tf.entity.ExhibitionEntity;
+
+/**
+ * 展会持久层
+ * @author 阿白
+ * 创建日期:2025年10月23日 下午6:08:02<br/>
+ * 历史修订:<br/>
+ */
+public interface IExhibitionDao extends IBaseDao<ExhibitionEntity> {
+}

+ 20 - 0
src/main/java/net/mingsoft/tf/dao/IExhibitionDao.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.IExhibitionDao">
+
+	<resultMap id="resultMap" type="net.mingsoft.tf.entity.ExhibitionEntity">
+				<result column="ACTIVITY_NAME" property="activityName" /><!--活动名称 -->
+				<result column="ACTIVITY_START" property="activityStart" /><!--开始日期 -->
+				<result column="ACTIVITY_END" property="activityEnd" /><!--结束日期 -->
+	</resultMap>
+
+	<select id="query" resultMap="resultMap">
+		SELECT * FROM EXHIBITION
+		<where>
+			DEL=0
+			<include refid="net.mingsoft.base.dao.IBaseDao.sqlWhere"></include>
+		</where>
+		 ORDER BY ID DESC
+	</select>
+
+</mapper>

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

@@ -0,0 +1,14 @@
+package net.mingsoft.tf.dao;
+
+import net.mingsoft.base.dao.IBaseDao;
+import java.util.*;
+import net.mingsoft.tf.entity.ExhibitorEntity;
+
+/**
+ * 展商持久层
+ * @author 阿白
+ * 创建日期:2025年10月23日 下午6:08:02<br/>
+ * 历史修订:<br/>
+ */
+public interface IExhibitorDao extends IBaseDao<ExhibitorEntity> {
+}

+ 25 - 0
src/main/java/net/mingsoft/tf/dao/IExhibitorDao.xml

@@ -0,0 +1,25 @@
+<?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.IExhibitorDao">
+
+	<resultMap id="resultMap" type="net.mingsoft.tf.entity.ExhibitorEntity">
+				<result column="EXHIBITOR_NAME" property="exhibitorName" /><!--公司名称 -->
+				<result column="EXHIBITOR_BOOTH" property="exhibitorBooth" /><!--展位号 -->
+				<result column="EXHIBITOR_CONTACT" property="exhibitorContact" /><!--联系人 -->
+				<result column="EXHIBITOR_PHONE" property="exhibitorPhone" /><!--联系电话 -->
+				<result column="EXHIBITOR_LOGO" property="exhibitorLogo" /><!--公司LOGO -->
+				<result column="EXHIBITOR_INTRODUCTION" property="exhibitorIntroduction" /><!--公司简介 -->
+				<result column="EXHIBITOR_USER" property="exhibitorUser" /><!--用户ID -->
+				<result column="EXHIBITOR_ACTIVITIES" property="exhibitorActivities" /><!--展会ID -->
+	</resultMap>
+
+	<select id="query" resultMap="resultMap">
+		SELECT * FROM EXHIBITOR
+		<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/BoothEntity.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年10月23日 下午6:08:01<br/>
+* 历史修订:<br/>
+*/
+@TableName("BOOTH")
+public class BoothEntity extends BaseEntity {
+
+private static final long serialVersionUID = 1761214081936L;
+
+    /**
+    * 编码
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String boothCode;
+    /**
+    * 楼层
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String inputHudra;
+    /**
+    * 名称
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String boothName;
+    /**
+    * 风格
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String boothStyle;
+    /**
+    * 材料
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String boothMaterials;
+    /**
+    * 是否使用
+    */
+    
+    private Boolean boothEnable;
+
+
+    /**
+    * 设置编码
+    */
+    public void setBoothCode(String boothCode) {
+        this.boothCode = boothCode;
+    }
+
+    /**
+    * 获取编码
+    */
+    public String getBoothCode() {
+        return this.boothCode;
+    }
+    /**
+    * 设置楼层
+    */
+    public void setInputHudra(String inputHudra) {
+        this.inputHudra = inputHudra;
+    }
+
+    /**
+    * 获取楼层
+    */
+    public String getInputHudra() {
+        return this.inputHudra;
+    }
+    /**
+    * 设置名称
+    */
+    public void setBoothName(String boothName) {
+        this.boothName = boothName;
+    }
+
+    /**
+    * 获取名称
+    */
+    public String getBoothName() {
+        return this.boothName;
+    }
+    /**
+    * 设置风格
+    */
+    public void setBoothStyle(String boothStyle) {
+        this.boothStyle = boothStyle;
+    }
+
+    /**
+    * 获取风格
+    */
+    public String getBoothStyle() {
+        return this.boothStyle;
+    }
+    /**
+    * 设置材料
+    */
+    public void setBoothMaterials(String boothMaterials) {
+        this.boothMaterials = boothMaterials;
+    }
+
+    /**
+    * 获取材料
+    */
+    public String getBoothMaterials() {
+        return this.boothMaterials;
+    }
+    /**
+    * 设置是否使用
+    */
+    public void setBoothEnable(Boolean boothEnable) {
+        this.boothEnable = boothEnable;
+    }
+
+    /**
+    * 获取是否使用
+    */
+    public Boolean getBoothEnable() {
+        return this.boothEnable;
+    }
+
+
+}

+ 90 - 0
src/main/java/net/mingsoft/tf/entity/ExhibitionEntity.java

@@ -0,0 +1,90 @@
+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年10月23日 下午6:08:02<br/>
+* 历史修订:<br/>
+*/
+@TableName("EXHIBITION")
+public class ExhibitionEntity extends BaseEntity {
+
+private static final long serialVersionUID = 1761214082179L;
+
+    /**
+    * 活动名称
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String activityName;
+    /**
+    * 开始日期
+    */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    
+    private Date activityStart;
+    /**
+    * 结束日期
+    */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    
+    private Date activityEnd;
+
+
+    /**
+    * 设置活动名称
+    */
+    public void setActivityName(String activityName) {
+        this.activityName = activityName;
+    }
+
+    /**
+    * 获取活动名称
+    */
+    public String getActivityName() {
+        return this.activityName;
+    }
+    /**
+    * 设置开始日期
+    */
+    public void setActivityStart(Date activityStart) {
+        this.activityStart = activityStart;
+    }
+
+    /**
+    * 获取开始日期
+    */
+    public Date getActivityStart() {
+        return this.activityStart;
+    }
+    /**
+    * 设置结束日期
+    */
+    public void setActivityEnd(Date activityEnd) {
+        this.activityEnd = activityEnd;
+    }
+
+    /**
+    * 获取结束日期
+    */
+    public Date getActivityEnd() {
+        return this.activityEnd;
+    }
+
+
+}

+ 176 - 0
src/main/java/net/mingsoft/tf/entity/ExhibitorEntity.java

@@ -0,0 +1,176 @@
+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年10月23日 下午6:08:02<br/>
+* 历史修订:<br/>
+*/
+@TableName("EXHIBITOR")
+public class ExhibitorEntity extends BaseEntity {
+
+private static final long serialVersionUID = 1761214082422L;
+
+    /**
+    * 公司名称
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String exhibitorName;
+    /**
+    * 展位号
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String exhibitorBooth;
+    /**
+    * 联系人
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String exhibitorContact;
+    /**
+    * 联系电话
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String exhibitorPhone;
+    /**
+    * 公司LOGO
+    */
+    
+    private String exhibitorLogo;
+    /**
+    * 公司简介
+    */
+    
+    private String exhibitorIntroduction;
+    /**
+    * 用户ID
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String exhibitorUser;
+    /**
+    * 展会ID
+    */
+    @TableField(condition = SqlCondition.LIKE)
+    private String exhibitorActivities;
+
+
+    /**
+    * 设置公司名称
+    */
+    public void setExhibitorName(String exhibitorName) {
+        this.exhibitorName = exhibitorName;
+    }
+
+    /**
+    * 获取公司名称
+    */
+    public String getExhibitorName() {
+        return this.exhibitorName;
+    }
+    /**
+    * 设置展位号
+    */
+    public void setExhibitorBooth(String exhibitorBooth) {
+        this.exhibitorBooth = exhibitorBooth;
+    }
+
+    /**
+    * 获取展位号
+    */
+    public String getExhibitorBooth() {
+        return this.exhibitorBooth;
+    }
+    /**
+    * 设置联系人
+    */
+    public void setExhibitorContact(String exhibitorContact) {
+        this.exhibitorContact = exhibitorContact;
+    }
+
+    /**
+    * 获取联系人
+    */
+    public String getExhibitorContact() {
+        return this.exhibitorContact;
+    }
+    /**
+    * 设置联系电话
+    */
+    public void setExhibitorPhone(String exhibitorPhone) {
+        this.exhibitorPhone = exhibitorPhone;
+    }
+
+    /**
+    * 获取联系电话
+    */
+    public String getExhibitorPhone() {
+        return this.exhibitorPhone;
+    }
+    /**
+    * 设置公司LOGO
+    */
+    public void setExhibitorLogo(String exhibitorLogo) {
+        this.exhibitorLogo = exhibitorLogo;
+    }
+
+    /**
+    * 获取公司LOGO
+    */
+    public String getExhibitorLogo() {
+        return this.exhibitorLogo;
+    }
+    /**
+    * 设置公司简介
+    */
+    public void setExhibitorIntroduction(String exhibitorIntroduction) {
+        this.exhibitorIntroduction = exhibitorIntroduction;
+    }
+
+    /**
+    * 获取公司简介
+    */
+    public String getExhibitorIntroduction() {
+        return this.exhibitorIntroduction;
+    }
+    /**
+    * 设置用户ID
+    */
+    public void setExhibitorUser(String exhibitorUser) {
+        this.exhibitorUser = exhibitorUser;
+    }
+
+    /**
+    * 获取用户ID
+    */
+    public String getExhibitorUser() {
+        return this.exhibitorUser;
+    }
+    /**
+    * 设置展会ID
+    */
+    public void setExhibitorActivities(String exhibitorActivities) {
+        this.exhibitorActivities = exhibitorActivities;
+    }
+
+    /**
+    * 获取展会ID
+    */
+    public String getExhibitorActivities() {
+        return this.exhibitorActivities;
+    }
+
+
+}

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

@@ -0,0 +1,17 @@
+booth.code=booth code
+input.hudra=input hudra
+booth.name=booth name
+booth.style=booth style
+booth.materials=booth materials
+booth.enable=booth enable
+activity.name=activity name
+activity.start=activity start
+activity.end=activity end
+exhibitor.name=exhibitor name
+exhibitor.booth=exhibitor booth
+exhibitor.contact=exhibitor contact
+exhibitor.phone=exhibitor phone
+exhibitor.logo=exhibitor logo
+exhibitor.introduction=exhibitor introduction
+exhibitor.user=exhibitor user
+exhibitor.activities=exhibitor activities

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

@@ -0,0 +1,17 @@
+booth.code=\u7f16\u7801
+input.hudra=\u697c\u5c42
+booth.name=\u540d\u79f0
+booth.style=\u98ce\u683c
+booth.materials=\u6750\u6599
+booth.enable=\u662f\u5426\u4f7f\u7528
+activity.name=\u6d3b\u52a8\u540d\u79f0
+activity.start=\u5f00\u59cb\u65e5\u671f
+activity.end=\u7ed3\u675f\u65e5\u671f
+exhibitor.name=\u516c\u53f8\u540d\u79f0
+exhibitor.booth=\u5c55\u4f4d\u53f7
+exhibitor.contact=\u8054\u7cfb\u4eba
+exhibitor.phone=\u8054\u7cfb\u7535\u8bdd
+exhibitor.logo=\u516c\u53f8LOGO
+exhibitor.introduction=\u516c\u53f8\u7b80\u4ecb
+exhibitor.user=\u7528\u6237ID
+exhibitor.activities=\u5c55\u4f1aID

+ 1 - 1
src/main/java/net/mingsoft/people/action/web/WxCustomUserNamePasswordToken.java → src/main/java/net/mingsoft/tf/wx/WxCustomUserNamePasswordToken.java

@@ -1,4 +1,4 @@
-package net.mingsoft.people.action.web;
+package net.mingsoft.tf.wx;
 
 import net.mingsoft.basic.realm.CustomUserNamePasswordToken;
 

+ 191 - 0
src/main/java/net/mingsoft/tf/wx/WxPeopleAction.java

@@ -0,0 +1,191 @@
+package net.mingsoft.tf.wx;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+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.base.exception.BusinessException;
+import net.mingsoft.mdiy.action.ModelAction;
+import net.mingsoft.people.action.BaseAction;
+import net.mingsoft.people.action.people.PeopleUserAction;
+import net.mingsoft.people.action.web.PeopleAction;
+import net.mingsoft.people.bean.PeopleBean;
+import net.mingsoft.people.biz.IPeopleBiz;
+import net.mingsoft.people.entity.PeopleEntity;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Tag(name = "前端-微信-会员模块接口")
+@Controller
+public class WxPeopleAction extends BaseAction {
+    @Autowired
+    private IPeopleBiz peopleBiz;
+    @Autowired
+    private PeopleUserAction peopleUserAction;
+    @Autowired
+    private PeopleAction peopleAction;
+    @Autowired
+    private ModelAction modelAction;
+
+    @Operation(summary = "微信-获得电话号码")
+    @Parameters({
+            @Parameter(name = "code", description = "code", required = true, in = ParameterIn.QUERY)
+    })
+    @PostMapping(value = "/wx/phone")
+    @ResponseBody
+    public ResultData wxGetPhone(String code) {
+        // TODO
+        return null;
+    }
+
+    @Operation(summary = "微信-登录")
+    @Parameters({
+            @Parameter(name = "code", description = "code", required = true, in = ParameterIn.QUERY)
+    })
+    @PostMapping(value = "/wx/login")
+    @ResponseBody
+    public ResultData wxCheckLogin(String code, HttpServletRequest request, HttpServletResponse response) {
+        return Optional.ofNullable(code)
+                .map(c -> "https://api.weixin.qq.com/sns/jscode2session?appid=wx0a115eb69d6e9359&secret=d906c8ca51acfd61e13dd61b62364050&js_code=" + c + "&grant_type=authorization_code")
+                .map(HttpUtil::get)
+                .map(JSONObject::new)
+                .map(json -> json.getStr("openid"))
+                .filter(StringUtils::isNotBlank)
+                .map(openid -> {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("openid", openid);
+                    PeopleEntity user = this.peopleBiz.getEntityByUserName(openid);
+                    if (user != null) {
+                        ResultData login = executeLogin(openid, request, response);
+                        if (login.isSuccess()) {
+                            map.putAll(login.getData(Map.class));
+                        }
+                    }
+                    return ResultData.build().success(map);
+                })
+                .orElse(ResultData.build().error("登录失败"));
+    }
+
+    @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 = "", description = "公司名称", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "", description = "职位", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "", description = "展商邀请码", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "", description = "身份类型", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "", description = "了解渠道", required = true, in = ParameterIn.QUERY),
+            @Parameter(name = "", description = "参观目的", required = true, in = ParameterIn.QUERY),
+    })
+    @PostMapping(value = "/wx/register")
+    @ResponseBody
+    public ResultData wxRegister(@RequestBody PeopleBean people, HttpServletRequest request, HttpServletResponse response) {
+        people.setPeoplePassword(RandomUtil.randomString(8));
+        // TODO 7个新字段保存,还有一个邀请用户ID
+        ResultData register = peopleAction.register(people, request, response);
+        if (register.isSuccess()) {
+            return executeLogin(people.getPeopleName(), request, response);
+        }
+        return register;
+    }
+
+    private ResultData executeLogin(String openid, HttpServletRequest request, HttpServletResponse response) {
+        Subject subject = SecurityUtils.getSubject();
+        WxCustomUserNamePasswordToken cupt = new WxCustomUserNamePasswordToken(openid);
+        try {
+            LOG.debug("people 尝试登陆");
+            subject.login(cupt);
+            LOG.debug("people 登陆成功");
+            ResultData info = peopleUserAction.info(request, response);
+            if (info.isSuccess()) {
+                Map<String, Object> data = info.getData(Map.class);
+                PeopleBean tempPeople = new PeopleBean();
+                // TODO
+                // tempPeople.setId(peopleEntity.getId());
+                // tempPeople.setPeopleName(peopleEntity.getPeopleName());
+                // tempPeople.setPeoplePhone(peopleEntity.getPeoplePhone());
+                // tempPeople.setPuIcon(peopleEntity.getPuIcon());
+                // tempPeople.setPuNickname(peopleEntity.getPuNickname());
+                return ResultData.build().success(tempPeople);
+            }
+            return info;
+        } catch (Exception e) {
+            LOG.debug("people 登陆失败");
+            if (e.getCause() instanceof BusinessException) {
+                throw (BusinessException) e.getCause();
+            }
+            e.printStackTrace();
+        }
+        return ResultData.build().error(
+                this.getResString("err.error", this.getResString("people.no.exist")));
+    }
+
+    @Operation(summary = "微信-邀请的用户汇总")
+    @PostMapping(value = "/people/invitation/summary")
+    @ResponseBody
+    public ResultData invitationSummary() {
+        // TODO
+        return null;
+    }
+
+    @Operation(summary = "微信-邀请的用户明细")
+    @PostMapping(value = "/people/invitation/details")
+    @ResponseBody
+    public ResultData invitationDetails() {
+        // TODO
+        return null;
+    }
+
+    @Operation(summary = "微信-生成入场二维码")
+    @PostMapping(value = "/people/qrcode")
+    @ResponseBody
+    public ResultData qrcode() {
+        // TODO
+        return null;
+    }
+
+    @Operation(summary = "微信-展商-上传LOGO")
+    @PostMapping(value = "/people/upload/logo")
+    @ResponseBody
+    public ResultData logo() {
+        // TODO
+        return null;
+    }
+
+    @Operation(summary = "微信-展商-申请")
+    @PostMapping(value = "/people/exhibitor/create")
+    @ResponseBody
+    public ResultData exhibitorCreate() {
+        // TODO
+        return null;
+    }
+
+    @Operation(summary = "微信-展商-详情")
+    @PostMapping(value = "/people/exhibitor/info")
+    @ResponseBody
+    public ResultData exhibitorInfo() {
+        // TODO
+        return null;
+    }
+}

+ 228 - 0
src/main/webapp/WEB-INF/manager/tf/booth/form.ftl

@@ -0,0 +1,228 @@
+    <!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="boothCode">
+	            <el-input
+                        v-model="form.boothCode"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入编码">
+                </el-input>
+	        </el-form-item>   
+            <!--楼层-->
+
+	        <el-form-item  label="楼层" prop="inputHudra">
+	            <el-input
+                        v-model="form.inputHudra"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入楼层">
+                </el-input>
+	        </el-form-item>   
+            <!--名称-->
+
+	        <el-form-item  label="名称" prop="boothName">
+	            <el-input
+                        v-model="form.boothName"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入名称">
+                </el-input>
+	        </el-form-item>   
+            <!--风格-->
+
+	        <el-form-item  label="风格" prop="boothStyle">
+	            <el-input
+                        v-model="form.boothStyle"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入风格">
+                </el-input>
+	        </el-form-item>   
+            <!--材料-->
+
+	        <el-form-item  label="材料" prop="boothMaterials">
+	            <el-input
+                        v-model="form.boothMaterials"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入材料">
+                </el-input>
+	        </el-form-item>   
+        <!--是否使用-->
+    
+        <el-form-item  label="是否使用" prop="boothEnable">
+            <el-switch v-model="form.boothEnable"
+                       :disabled="false">
+            </el-switch>
+        </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: {
+                    // 编码
+                    boothCode:'',
+                    // 楼层
+                    inputHudra:'',
+                    // 名称
+                    boothName:'',
+                    // 风格
+                    boothStyle:'',
+                    // 材料
+                    boothMaterials:'',
+                    // 是否使用
+                    boothEnable:true,
+
+                },
+                rules:{
+                        // 编码
+                        boothCode: [{"type":"string","message":"编码格式不正确"},{"required":true,"message":"编码不能为空"},{"min":0,"max":255,"message":"编码长度必须为0-255"}],
+                        // 楼层
+                        inputHudra: [{"type":"string","message":"楼层格式不正确"},{"required":true,"message":"楼层不能为空"},{"min":0,"max":255,"message":"楼层长度必须为0-255"}],
+                        // 名称
+                        boothName: [{"type":"string","message":"名称格式不正确"},{"min":0,"max":255,"message":"名称长度必须为0-255"}],
+                        // 风格
+                        boothStyle: [{"type":"string","message":"风格格式不正确"},{"min":0,"max":255,"message":"风格长度必须为0-255"}],
+                        // 材料
+                        boothMaterials: [{"type":"string","message":"材料格式不正确"},{"min":0,"max":255,"message":"材料长度必须为0-255"}],
+
+                },
+
+            }
+        },
+        watch:{
+           
+        },
+        components:{
+        },
+        computed:{
+        },
+        methods: {
+
+            back: function (){
+                ms.util.openSystemUrl("/tf/booth/index.do",true);
+            },
+
+            save:function() {
+                var that = this;
+                var url = ms.manager + "/tf/booth/save.do"
+                if (that.form.id > 0) {
+                    url = ms.manager + "/tf/booth/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/booth/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/booth/get.do", {"id":id}).then(function (res) {
+                    that.loading = false
+                    if(res.result&&res.data) {
+                                                                                               
+                        that.form = res.data;
+                    }
+                });
+            },
+              update: function (row) {
+                var that = this;
+                ms.http.post(ms.manager+"/tf/booth/update.do", row).then(function (data) {
+                  if (data.result) {
+                    that.$notify({
+                      title: '成功',
+                      message: '更新成功',
+                      type: 'success'
+                    });
+
+                  } else {
+                    that.$notify({
+                      title: '失败',
+                      message: data.msg,
+                      type: 'warning'
+                    });
+                  }
+                });
+              },         },
+        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>

+ 356 - 0
src/main/webapp/WEB-INF/manager/tf/booth/index.ftl

@@ -0,0 +1,356 @@
+<!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:booth:save">
+                <el-button type="primary" class="el-icon-plus" size="default" @click="save()">新增</el-button>
+
+            </@shiro.hasPermission>
+            <@shiro.hasPermission name="tf:booth: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="boothCode">
+	            <el-input
+                        v-model="form.boothCode"
+                         :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="inputHudra">
+	            <el-input
+                        v-model="form.inputHudra"
+                         :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="boothName">
+	            <el-input
+                        v-model="form.boothName"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入名称">
+                </el-input>
+	        </el-form-item>   
+                                        </el-col>
+                        </el-row>
+                        <el-row>
+                                        <el-col :span=8>
+            <!--风格-->
+
+	        <el-form-item  label="风格" prop="boothStyle">
+	            <el-input
+                        v-model="form.boothStyle"
+                         :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="boothMaterials">
+	            <el-input
+                        v-model="form.boothMaterials"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入材料">
+                </el-input>
+	        </el-form-item>   
+                                        </el-col>
+                                <el-col :span=8 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="boothCode">
+                            </el-table-column>
+                            <el-table-column label="楼层"   align="left" prop="inputHudra">
+                            </el-table-column>
+                            <el-table-column label="名称"   align="left" prop="boothName">
+                            </el-table-column>
+                            <el-table-column label="风格"   align="left" prop="boothStyle">
+                            </el-table-column>
+                            <el-table-column label="材料"   align="left" prop="boothMaterials">
+                            </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:booth:update">
+                                    <el-link type="primary" :underline="false" @click="save(scope.row.id)">编辑</el-link>
+                                </@shiro.hasPermission>
+                            <@shiro.hasPermission name="tf:booth: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': 'BOOTH_CODE', 'el': 'eq', 'model': 'boothCode', 'name': '编码', 'type': 'input'},
+        //楼层
+        {'isSearch':'true','action':'and', 'field': 'INPUT_HUDRA', 'el': 'eq', 'model': 'inputHudra', 'name': '楼层', 'type': 'input'},
+        //名称
+        {'isSearch':'true','action':'and', 'field': 'BOOTH_NAME', 'el': 'eq', 'model': 'boothName', 'name': '名称', 'type': 'input'},
+        //风格
+        {'isSearch':'true','action':'and', 'field': 'BOOTH_STYLE', 'el': 'eq', 'model': 'boothStyle', 'name': '风格', 'type': 'input'},
+        //材料
+        {'isSearch':'true','action':'and', 'field': 'BOOTH_MATERIALS', 'el': 'eq', 'model': 'boothMaterials', 'name': '材料', 'type': 'input'},
+                ],
+                dataList: [], //展位列表
+                selectionList:[],//展位列表选中
+                total: 0, //总记录数量
+                pageSize: 10, //页面数量
+                currentPage:1, //初始页
+                manager: ms.manager,
+                loading: true,//加载状态
+                emptyText:'',//提示文字
+                //搜索表单
+                form:{
+                    sqlWhere:null
+                },
+                //历史记录参数
+                historyKey: "tf_booth_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/booth/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/booth/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/booth/form.do?id="+id);
+                }else {
+                    ms.util.openSystemUrl("/tf/booth/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);
+            },
+              update: function (row) {
+                var that = this;
+                ms.http.post(ms.manager+"/tf/booth/update.do", row).then(function (data) {
+                  if (data.result) {
+                    that.$notify({
+                      title: '成功',
+                      message: '更新成功',
+                      type: 'success'
+                    });
+
+                  } else {
+                    that.$notify({
+                      title: '失败',
+                      message: data.msg,
+                      type: 'warning'
+                    });
+                  }
+                });
+              }, 
+        },
+        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>

+ 190 - 0
src/main/webapp/WEB-INF/manager/tf/exhibition/form.ftl

@@ -0,0 +1,190 @@
+    <!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="activityName">
+	            <el-input
+                        v-model="form.activityName"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入活动名称">
+                </el-input>
+	        </el-form-item>   
+                        <el-row
+                                :gutter="0"
+                                justify="start" align="top">
+                                <el-col :span=12>
+        <!--开始日期-->
+    
+        <el-form-item  label="开始日期" prop="activityStart">
+               <el-date-picker
+                     v-model="form.activityStart"
+placeholder="请选择开始日期"                    :readonly="false"
+                    :disabled="false"
+                    :editable="true"
+                    :clearable="true"
+                  value-format="YYYY-MM-DD"
+                    :style="{width:'100%'}"
+                    type="date">
+            </el-date-picker>
+        </el-form-item>
+                                </el-col>
+                                <el-col :span=12>
+        <!--结束日期-->
+    
+        <el-form-item  label="结束日期" prop="activityEnd">
+               <el-date-picker
+                     v-model="form.activityEnd"
+placeholder="请选择结束日期"                    :readonly="false"
+                    :disabled="false"
+                    :editable="true"
+                    :clearable="true"
+                  value-format="YYYY-MM-DD"
+                    :style="{width:'100%'}"
+                    type="date">
+            </el-date-picker>
+        </el-form-item>
+                                </el-col>
+                        </el-row>
+            </el-form>
+        </el-main>
+    </div>
+    </body>
+
+    </html>
+
+<script>
+    var formVue = new _Vue({
+        el: '#form',
+
+        data:function() {
+            return {
+                loading:false,
+                saveDisabled: false,
+                //表单数据
+                form: {
+                    // 活动名称
+                    activityName:'',
+                    //开始日期
+                   activityStart:"",
+                    //结束日期
+                   activityEnd:"",
+
+                },
+                rules:{
+                        // 活动名称
+                        activityName: [{"required":true,"message":"活动名称不能为空"},{"min":0,"max":255,"message":"活动名称长度必须为0-255"}],
+                        // 开始日期
+                        activityStart: [{"required":true,"message":"请选择开始日期"}],
+                        // 结束日期
+                        activityEnd: [{"required":true,"message":"请选择结束日期"}],
+
+                },
+
+            }
+        },
+        watch:{
+                              
+        },
+        components:{
+        },
+        computed:{
+        },
+        methods: {
+
+            back: function (){
+                ms.util.openSystemUrl("/tf/exhibition/index.do",true);
+            },
+
+            save:function() {
+                var that = this;
+                var url = ms.manager + "/tf/exhibition/save.do"
+                if (that.form.id > 0) {
+                    url = ms.manager + "/tf/exhibition/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/exhibition/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/exhibition/get.do", {"id":id}).then(function (res) {
+                    that.loading = false
+                    if(res.result&&res.data) {
+                   
+                        that.form = res.data;
+                    }
+                });
+            },
+           //开始日期日期格式化
+           activityStartFormat:function(row, column, cellValue, index){                
+                return ms.util.date.fmt(new Date(row.ACTIVITY_START),'YYYY-MM-DD');                
+            },
+           //结束日期日期格式化
+           activityEndFormat:function(row, column, cellValue, index){                
+                return ms.util.date.fmt(new Date(row.ACTIVITY_END),'YYYY-MM-DD');                
+            },
+        },
+        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>

+ 282 - 0
src/main/webapp/WEB-INF/manager/tf/exhibition/index.ftl

@@ -0,0 +1,282 @@
+<!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:exhibition:save">
+                <el-button type="primary" class="el-icon-plus" size="default" @click="save()">新增</el-button>
+
+            </@shiro.hasPermission>
+            <@shiro.hasPermission name="tf:exhibition: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="activityName">
+	            <el-input
+                        v-model="form.activityName"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入活动名称">
+                </el-input>
+	        </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="activityName">
+                            </el-table-column>
+                <el-table-column label="开始日期"   min-width="200" align="center" prop="activityStart" >
+                    </el-table-column>
+                <el-table-column label="结束日期"   min-width="200" align="center" prop="activityEnd" >
+                    </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:exhibition:update">
+                                    <el-link type="primary" :underline="false" @click="save(scope.row.id)">编辑</el-link>
+                                </@shiro.hasPermission>
+                            <@shiro.hasPermission name="tf:exhibition: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': 'ACTIVITY_NAME', 'el': 'eq', 'model': 'activityName', 'name': '活动名称', 'type': 'input'},
+    // 开始日期
+{'action':'and', 'field': 'ACTIVITY_START', 'model': 'activityStart', 'el': 'gt','fmt': 'YYYY-MM-DD', 'name': '开始日期', 'type': 'date'},
+
+    // 结束日期
+{'action':'and', 'field': 'ACTIVITY_END', 'model': 'activityEnd', 'el': 'gt','fmt': 'YYYY-MM-DD', 'name': '结束日期', 'type': 'date'},
+
+                ],
+                dataList: [], //展会列表
+                selectionList:[],//展会列表选中
+                total: 0, //总记录数量
+                pageSize: 10, //页面数量
+                currentPage:1, //初始页
+                manager: ms.manager,
+                loading: true,//加载状态
+                emptyText:'',//提示文字
+                //搜索表单
+                form:{
+                    sqlWhere:null
+                },
+                //历史记录参数
+                historyKey: "tf_exhibition_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/exhibition/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/exhibition/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/exhibition/form.do?id="+id);
+                }else {
+                    ms.util.openSystemUrl("/tf/exhibition/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);
+            },
+           //开始日期日期格式化
+           activityStartFormat:function(row, column, cellValue, index){                
+                return ms.util.date.fmt(new Date(row.ACTIVITY_START),'YYYY-MM-DD');                
+            },
+           //结束日期日期格式化
+           activityEndFormat:function(row, column, cellValue, index){                
+                return ms.util.date.fmt(new Date(row.ACTIVITY_END),'YYYY-MM-DD');                
+            },
+
+        },
+        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>

+ 326 - 0
src/main/webapp/WEB-INF/manager/tf/exhibitor/form.ftl

@@ -0,0 +1,326 @@
+    <!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="exhibitorName">
+	            <el-input
+                        v-model="form.exhibitorName"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入公司名称">
+                </el-input>
+	        </el-form-item>   
+            <!--展位号-->
+
+	        <el-form-item  label="展位号" prop="exhibitorBooth">
+	            <el-input
+                        v-model="form.exhibitorBooth"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入展位号">
+                </el-input>
+	        </el-form-item>   
+            <!--联系人-->
+
+	        <el-form-item  label="联系人" prop="exhibitorContact">
+	            <el-input
+                        v-model="form.exhibitorContact"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入联系人">
+                </el-input>
+	        </el-form-item>   
+            <!--联系电话-->
+
+	        <el-form-item  label="联系电话" prop="exhibitorPhone">
+	            <el-input
+                        v-model="form.exhibitorPhone"
+                         :disabled="false"
+                          :readonly="false"
+                          :style="{width:  '100%'}"
+                          :clearable="true"
+                        placeholder="请输入联系电话">
+                </el-input>
+	        </el-form-item>   
+        <!--公司LOGO-->
+    
+        <el-form-item  label="公司LOGO" prop="exhibitorLogo">
+             <el-upload
+                    :file-list="form.exhibitorLogo"
+                    :action="ms.manager+'/file/upload.do'"
+                    :limit="1"
+                    multiple
+                    :disabled="false"
+                    :data="{uploadPath:'/tf/','isRename':true,'appId':true}"
+                    :on-remove="exhibitorLogoHandleRemove"
+                    :on-exceed="exhibitorLogoHandleExceed"
+                    :on-preview="exhibitorLogoHandlePreview"
+                    :before-upload="exhibitorLogoBeforeUpload"    
+                    :on-success="exhibitorLogoSuccess"
+                    :on-error="exhibitorLogoError"
+                    accept="image/*"
+                    list-type="picture-card">
+                <i class="el-icon-plus"></i>
+                <template #tip>
+                  <div class="el-upload__tip">最多上传1张图片</div>
+               </template>
+            </el-upload>
+        </el-form-item>
+   
+        <!--公司简介-->	
+	        <el-form-item  label="公司简介" prop="exhibitorIntroduction">
+	            <el-input
+                        type="textarea" :rows="5"
+                        :disabled="false"
+                        v-model="form.exhibitorIntroduction"
+                        :style="{width: '100%'}"
+                        placeholder="请输入公司简介">
+                </el-input>
+	        </el-form-item>
+	   
+            <!--用户ID-->
+
+            <!--展会ID-->
+
+            </el-form>
+        </el-main>
+    </div>
+    </body>
+
+    </html>
+
+<script>
+    var formVue = new _Vue({
+        el: '#form',
+
+        data:function() {
+            return {
+                loading:false,
+                saveDisabled: false,
+                //表单数据
+                form: {
+                    // 公司名称
+                    exhibitorName:'',
+                    // 展位号
+                    exhibitorBooth:'',
+                    // 联系人
+                    exhibitorContact:'',
+                    // 联系电话
+                    exhibitorPhone:'',
+                    // 公司LOGO
+                    exhibitorLogo: [],
+                    // 公司简介 
+                    exhibitorIntroduction:'',
+                    // 用户ID
+                    exhibitorUser:'',
+                    // 展会ID
+                    exhibitorActivities:'',
+
+                },
+                rules:{
+                        // 公司名称
+                        exhibitorName: [{"required":true,"message":"公司名称不能为空"},{"min":0,"max":255,"message":"公司名称长度必须为0-255"}],
+                        // 展位号
+                        exhibitorBooth: [{"required":true,"message":"展位号不能为空"},{"min":0,"max":255,"message":"展位号长度必须为0-255"}],
+                        // 联系人
+                        exhibitorContact: [{"min":0,"max":255,"message":"联系人长度必须为0-255"}],
+                        // 联系电话
+                        exhibitorPhone: [{"min":0,"max":255,"message":"联系电话长度必须为0-255"}],
+                        // 用户ID
+                        exhibitorUser: [{"min":0,"max":255,"message":"用户ID长度必须为0-255"}],
+                        // 展会ID
+                        exhibitorActivities: [{"min":0,"max":255,"message":"展会ID长度必须为0-255"}],
+
+                },
+
+            }
+        },
+        watch:{
+
+        },
+        components:{
+        },
+        computed:{
+        },
+        methods: {
+
+            back: function (){
+                ms.util.openSystemUrl("/tf/exhibitor/index.do",true);
+            },
+
+            save:function() {
+                var that = this;
+                var url = ms.manager + "/tf/exhibitor/save.do"
+                if (that.form.id > 0) {
+                    url = ms.manager + "/tf/exhibitor/update.do";
+                }
+
+                this.$refs.form.validate(function(valid) {
+                    if (valid) {
+                        that.saveDisabled = true;
+                        var form = JSON.parse(JSON.stringify(that.form));
+												if (form.exhibitorLogo.length>0) {												
+													form.exhibitorLogo.forEach(function (value) {
+														value.url = value.url.replace(new RegExp('^'+ms.contextpath), "");
+													});  
+													form.exhibitorLogo = JSON.stringify(form.exhibitorLogo);
+												} else {
+													form.exhibitorLogo = '';
+												}
+                        ms.http.post(url, form).then(function (res) {
+                            if (res.result) {
+                                that.$notify({
+                                    title: "成功",
+                                    message: "保存成功",
+                                    type: 'success'
+                                });
+                                ms.util.openSystemUrl("/tf/exhibitor/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/exhibitor/get.do", {"id":id}).then(function (res) {
+                    that.loading = false
+                    if(res.result&&res.data) {
+                                                                                                  if (res.data.exhibitorLogo) {
+                          res.data.exhibitorLogo = JSON.parse(res.data.exhibitorLogo);
+                          res.data.exhibitorLogo.forEach(function (value) {
+                             if(!value.url.startsWith("http://") && !value.url.startsWith("https://")){
+								value.url = ms.contextpath + value.url;
+							 }
+                          });
+                      } else {
+                          res.data.exhibitorLogo = [];
+                      }
+                                      
+                        that.form = res.data;
+                    }
+                });
+            },
+        // exhibitorLogo删除
+        exhibitorLogoHandleRemove: function (file, files) {
+        	var index = -1;
+        	index = this.form.exhibitorLogo.findIndex(function (text) {
+        		return text.uid == file.uid;
+        	});
+        	if (index != -1) {
+        		this.form.exhibitorLogo.splice(index, 1);
+        	}
+        },
+        //exhibitorLogo上传超过限制
+        exhibitorLogoHandleExceed: function (files, fileList) {
+        	this.$notify({
+        		title: '失败',
+        		message: '当前最多上传1个文件',
+        		type: 'warning'
+        	});
+        },
+        //exhibitorLogo预览
+        exhibitorLogoHandlePreview: function (file){
+				window.open(file.url);
+        },
+		//exhibitorLogo上传前
+		exhibitorLogoBeforeUpload: function (file) {
+			var type = file.type;
+                if (type) {
+                    var isImage = type.startsWith('image/');
+                    if (!isImage) {
+                        this.$notify({
+                            title: '提示',
+                            message: '请上传图片类型文件',
+                            type: 'warning'
+                        });
+                    }
+                    return isImage;
+                }
+                return false;
+		},
+        //exhibitorLogo上传成功
+        exhibitorLogoSuccess: function (response, file, fileList) {
+        	if (response.result) {
+				if(!response.data.startsWith("http://") && !response.data.startsWith("https://")) {
+					file.url = ms.contextpath + response.data;
+				}else{
+					file.url = response.data;
+				}
+        		this.form.exhibitorLogo.push({
+        			url: response.data,
+        			name: file.name,
+        			uid: file.uid
+        		});
+        	} else {
+				// 移除上传图片
+				var index = fileList.indexOf(file);
+				if (index > -1) {
+					fileList.splice(index, 1);
+				}
+        		this.$notify({
+        			title: '失败',
+        			message: response.msg,
+        			type: 'warning'
+        		});
+        	}
+        },
+        //exhibitorLogo上传失败
+        exhibitorLogoError: function (response, file, fileList) {
+        	response = JSON.parse(response.message);
+        	this.$notify({
+        		title: '失败',
+        		message: response.msg,
+        		type: 'warning'
+        	});
+        },        },
+        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>

+ 406 - 0
src/main/webapp/WEB-INF/manager/tf/exhibitor/index.ftl

@@ -0,0 +1,406 @@
+<!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:exhibitor:save">
+                <el-button type="primary" class="el-icon-plus" size="default" @click="save()">新增</el-button>
+
+            </@shiro.hasPermission>
+            <@shiro.hasPermission name="tf:exhibitor: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="exhibitorName">
+	            <el-input
+                        v-model="form.exhibitorName"
+                         :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="exhibitorBooth">
+	            <el-input
+                        v-model="form.exhibitorBooth"
+                         :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="exhibitorContact">
+	            <el-input
+                        v-model="form.exhibitorContact"
+                         :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="exhibitorName">
+                            </el-table-column>
+                            <el-table-column label="展位号"   align="left" prop="exhibitorBooth">
+                            </el-table-column>
+                            <el-table-column label="联系人"   align="left" prop="exhibitorContact">
+                            </el-table-column>
+                            <el-table-column label="联系电话"   align="left" prop="exhibitorPhone">
+                            </el-table-column>
+                    <el-table-column min-width="80" label="公司LOGO"  align="left">
+                        <template #default="scope">
+                            <template v-if="scope.row.exhibitorLogo&&scope.row.exhibitorLogo !=''&&JSON.parse(scope.row.exhibitorLogo).length">
+                                <div class="block" v-for="src in JSON.parse(scope.row.exhibitorLogo)">
+                                    <el-image
+                                        :src="(!src.url.startsWith('http://') && !src.url.startsWith('https://')) ? ms.contextpath + src.url : src.url"
+                                        :preview-teleported=true
+                                        style="width: 50px;height: 50px;line-height: 50px;font-size: 30px">
+                                      	<template #error>
+                                          	<template class="image-slot">
+                                              	<i class="el-icon-picture-outline"></i>
+                                          	</template>
+                                      	</template>
+                                    </el-image>
+                                </div>
+                            </template>
+                        </template>
+                    </el-table-column>
+                            <el-table-column label="用户ID"   align="left" prop="exhibitorUser">
+                            </el-table-column>
+                            <el-table-column label="展会ID"   align="left" prop="exhibitorActivities">
+                            </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:exhibitor:update">
+                                    <el-link type="primary" :underline="false" @click="save(scope.row.id)">编辑</el-link>
+                                </@shiro.hasPermission>
+                            <@shiro.hasPermission name="tf:exhibitor: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': 'EXHIBITOR_NAME', 'el': 'eq', 'model': 'exhibitorName', 'name': '公司名称', 'type': 'input'},
+        //展位号
+        {'isSearch':'true','action':'and', 'field': 'EXHIBITOR_BOOTH', 'el': 'eq', 'model': 'exhibitorBooth', 'name': '展位号', 'type': 'input'},
+        //联系人
+        {'isSearch':'true','action':'and', 'field': 'EXHIBITOR_CONTACT', 'el': 'eq', 'model': 'exhibitorContact', 'name': '联系人', 'type': 'input'},
+        //联系电话
+        {'isSearch':'','action':'and', 'field': 'EXHIBITOR_PHONE', 'el': 'eq', 'model': 'exhibitorPhone', 'name': '联系电话', 'type': 'input'},
+		// 公司LOGO
+    {'action':'and', 'field': 'EXHIBITOR_LOGO', 'el': 'empty', 'model': 'exhibitorLogo', 'name': '公司LOGO', 'type': 'imgupload'},
+        //用户ID
+        {'isSearch':'','action':'and', 'field': 'EXHIBITOR_USER', 'el': 'eq', 'model': 'exhibitorUser', 'name': '用户ID', 'type': 'input'},
+        //展会ID
+        {'isSearch':'','action':'and', 'field': 'EXHIBITOR_ACTIVITIES', 'el': 'eq', 'model': 'exhibitorActivities', 'name': '展会ID', 'type': 'input'},
+                ],
+                dataList: [], //展商列表
+                selectionList:[],//展商列表选中
+                total: 0, //总记录数量
+                pageSize: 10, //页面数量
+                currentPage:1, //初始页
+                manager: ms.manager,
+                loading: true,//加载状态
+                emptyText:'',//提示文字
+                //搜索表单
+                form:{
+                    sqlWhere:null
+                },
+                //历史记录参数
+                historyKey: "tf_exhibitor_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/exhibitor/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/exhibitor/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/exhibitor/form.do?id="+id);
+                }else {
+                    ms.util.openSystemUrl("/tf/exhibitor/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);
+            },
+        // exhibitorLogo删除
+        exhibitorLogoHandleRemove: function (file, files) {
+        	var index = -1;
+        	index = this.form.exhibitorLogo.findIndex(function (text) {
+        		return text.uid == file.uid;
+        	});
+        	if (index != -1) {
+        		this.form.exhibitorLogo.splice(index, 1);
+        	}
+        },
+        //exhibitorLogo上传超过限制
+        exhibitorLogoHandleExceed: function (files, fileList) {
+        	this.$notify({
+        		title: '失败',
+        		message: '当前最多上传1个文件',
+        		type: 'warning'
+        	});
+        },
+        //exhibitorLogo预览
+        exhibitorLogoHandlePreview: function (file){
+				window.open(file.url);
+        },
+		//exhibitorLogo上传前
+		exhibitorLogoBeforeUpload: function (file) {
+			var type = file.type;
+                if (type) {
+                    var isImage = type.startsWith('image/');
+                    if (!isImage) {
+                        this.$notify({
+                            title: '提示',
+                            message: '请上传图片类型文件',
+                            type: 'warning'
+                        });
+                    }
+                    return isImage;
+                }
+                return false;
+		},
+        //exhibitorLogo上传成功
+        exhibitorLogoSuccess: function (response, file, fileList) {
+        	if (response.result) {
+				if(!response.data.startsWith("http://") && !response.data.startsWith("https://")) {
+					file.url = ms.contextpath + response.data;
+				}else{
+					file.url = response.data;
+				}
+        		this.form.exhibitorLogo.push({
+        			url: response.data,
+        			name: file.name,
+        			uid: file.uid
+        		});
+        	} else {
+				// 移除上传图片
+				var index = fileList.indexOf(file);
+				if (index > -1) {
+					fileList.splice(index, 1);
+				}
+        		this.$notify({
+        			title: '失败',
+        			message: response.msg,
+        			type: 'warning'
+        		});
+        	}
+        },
+        //exhibitorLogo上传失败
+        exhibitorLogoError: function (response, file, fileList) {
+        	response = JSON.parse(response.message);
+        	this.$notify({
+        		title: '失败',
+        		message: response.msg,
+        		type: 'warning'
+        	});
+        },
+        },
+        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>

+ 34 - 0
src/main/webapp/static/locale/lang/booth/en_US.js

@@ -0,0 +1,34 @@
+var en_US ={
+    form:{
+                boothCode:{
+            text:'编码',
+            placeholder:'请输入编码',
+            help:'',
+        },
+        inputHudra:{
+            text:'楼层',
+            placeholder:'请输入楼层',
+            help:'',
+        },
+        boothName:{
+            text:'名称',
+            placeholder:'请输入名称',
+            help:'',
+        },
+        boothStyle:{
+            text:'风格',
+            placeholder:'请输入风格',
+            help:'',
+        },
+        boothMaterials:{
+            text:'材料',
+            placeholder:'请输入材料',
+            help:'',
+        },
+        boothEnable:{
+            text:'是否使用',
+            placeholder:'',
+            help:'',
+        },
+    }
+}

+ 35 - 0
src/main/webapp/static/locale/lang/booth/zh_CN.js

@@ -0,0 +1,35 @@
+
+var zh_CN ={
+    form:{
+                boothCode:{
+            text:'编码',
+            placeholder:'请输入编码',
+            help:'',
+        },
+        inputHudra:{
+            text:'楼层',
+            placeholder:'请输入楼层',
+            help:'',
+        },
+        boothName:{
+            text:'名称',
+            placeholder:'请输入名称',
+            help:'',
+        },
+        boothStyle:{
+            text:'风格',
+            placeholder:'请输入风格',
+            help:'',
+        },
+        boothMaterials:{
+            text:'材料',
+            placeholder:'请输入材料',
+            help:'',
+        },
+        boothEnable:{
+            text:'是否使用',
+            placeholder:'',
+            help:'',
+        },
+    }
+}

+ 14 - 0
src/main/webapp/static/locale/lang/exhibition/en_US.js

@@ -0,0 +1,14 @@
+var en_US ={
+    form:{
+                activityName:{
+            text:'活动名称',
+            placeholder:'请输入活动名称',
+            help:'',
+        },
+        gridAyurs:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+    }
+}

+ 15 - 0
src/main/webapp/static/locale/lang/exhibition/zh_CN.js

@@ -0,0 +1,15 @@
+
+var zh_CN ={
+    form:{
+                activityName:{
+            text:'活动名称',
+            placeholder:'请输入活动名称',
+            help:'',
+        },
+        gridAyurs:{
+            text:'栅格布局',
+            placeholder:'',
+            help:'',
+        },
+    }
+}

+ 44 - 0
src/main/webapp/static/locale/lang/exhibitor/en_US.js

@@ -0,0 +1,44 @@
+var en_US ={
+    form:{
+                exhibitorName:{
+            text:'公司名称',
+            placeholder:'请输入公司名称',
+            help:'',
+        },
+        exhibitorBooth:{
+            text:'展位号',
+            placeholder:'请输入展位号',
+            help:'',
+        },
+        exhibitorContact:{
+            text:'联系人',
+            placeholder:'请输入联系人',
+            help:'',
+        },
+        exhibitorPhone:{
+            text:'联系电话',
+            placeholder:'请输入联系电话',
+            help:'',
+        },
+        exhibitorLogo:{
+            text:'公司LOGO',
+            placeholder:'',
+            help:'',
+        },
+        exhibitorIntroduction:{
+            text:'公司简介',
+            placeholder:'请输入公司简介',
+            help:'',
+        },
+        exhibitorUser:{
+            text:'用户ID',
+            placeholder:'请输入用户ID',
+            help:'',
+        },
+        exhibitorActivities:{
+            text:'展会ID',
+            placeholder:'请输入展会ID',
+            help:'',
+        },
+    }
+}

+ 45 - 0
src/main/webapp/static/locale/lang/exhibitor/zh_CN.js

@@ -0,0 +1,45 @@
+
+var zh_CN ={
+    form:{
+                exhibitorName:{
+            text:'公司名称',
+            placeholder:'请输入公司名称',
+            help:'',
+        },
+        exhibitorBooth:{
+            text:'展位号',
+            placeholder:'请输入展位号',
+            help:'',
+        },
+        exhibitorContact:{
+            text:'联系人',
+            placeholder:'请输入联系人',
+            help:'',
+        },
+        exhibitorPhone:{
+            text:'联系电话',
+            placeholder:'请输入联系电话',
+            help:'',
+        },
+        exhibitorLogo:{
+            text:'公司LOGO',
+            placeholder:'',
+            help:'',
+        },
+        exhibitorIntroduction:{
+            text:'公司简介',
+            placeholder:'请输入公司简介',
+            help:'',
+        },
+        exhibitorUser:{
+            text:'用户ID',
+            placeholder:'请输入用户ID',
+            help:'',
+        },
+        exhibitorActivities:{
+            text:'展会ID',
+            placeholder:'请输入展会ID',
+            help:'',
+        },
+    }
+}