From 20b11236b4364034f52df294b9240776f539ede1 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期二, 16 七月 2024 14:49:01 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/zbomyoujia

---
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectInfoResponse.java      |   55 +
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java          |    4 
 server/service/src/main/java/com/doumee/service/business/impl/CustomerUserServiceImpl.java               |  271 +++++
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCusFavoritesInfoResponse.java |   31 
 server/web/src/main/java/com/doumee/api/web/CustomerApi.java                                             |   52 +
 server/web/src/main/java/com/doumee/api/web/ApiController.java                                           |   43 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java             |   11 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerInfoRequest.java                   |   12 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java      |    3 
 server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java                                |   11 
 server/service/src/main/java/com/doumee/core/utils/Constants.java                                        |   26 
 server/service/src/main/java/com/doumee/service/business/InitService.java                                |    2 
 server/service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java                                     |    2 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java         |   24 
 server/service/src/main/java/com/doumee/service/business/ShopService.java                                |   15 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMDaogouBindListResponse.java       |   24 
 server/service/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java                                 |    5 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java             |    6 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java   |    3 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java                |   46 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMBaseRequst.java                            |   17 
 server/service/src/main/java/com/doumee/dao/business/model/Users.java                                    |   26 
 server/service/src/main/java/com/doumee/service/business/GetZhongTaiDataService.java                     |   52 +
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java                |    3 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMBaseResponse.java                 |   24 
 server/service/src/main/java/com/doumee/dao/web/response/ZSZXCatalogResponse.java                        |   31 
 server/service/src/main/java/com/doumee/service/business/impl/GetZhongTaiDataServiceImpl.java            |  167 +++
 server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java                     |  114 +
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java         |    3 
 admin/src/views/timer/timer.vue                                                                          |  102 +-
 server/service/src/main/java/com/doumee/dao/business/CustomerUserMapper.java                             |   13 
 server/service/src/main/java/com/doumee/dao/business/model/CustomerUser.java                             |  115 ++
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java                            |  262 ++++-
 server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java                                        |    7 
 server/service/src/main/java/com/doumee/dao/web/reqeust/ShopQueryByLLDTO.java                            |   21 
 server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java                       |   90 +
 server/service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java                                  |   90 +
 server/web/src/main/java/com/doumee/api/web/CustomerManageApi.java                                       |   42 
 server/admin/src/main/java/com/doumee/api/timer/QuartzController.java                                    |    2 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerListRequest.java                   |   22 
 server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java                                     |   12 
 server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java                                     |   17 
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java                       |  158 ++
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmDaogouBindListRequest.java                 |   24 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagInfoResponse.java          |   36 
 server/service/src/main/java/com/doumee/service/business/UsersService.java                               |    5 
 admin/src/views/timer/components/OperaTimerWindow.vue                                                    |    8 
 server/admin/src/main/java/com/doumee/timer/CustomerUserUpdateBiz.java                                   |   39 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java     |    4 
 server/service/src/main/java/com/doumee/service/business/CustomerUserService.java                        |   99 ++
 server/web/src/main/java/com/doumee/api/web/PersonnelApi.java                                            |   14 
 server/service/src/main/java/com/doumee/dao/business/model/Shop.java                                     |   26 
 server/service/src/main/java/com/doumee/biz/zbom/ZbomSMSService.java                                     |    1 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMCustomerListResponse.java         |   23 
 server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java                      |   74 +
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagChildInfoResponse.java     |   31 
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java                            |   11 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java      |   20 
 server/admin/src/main/java/com/doumee/api/business/CustomerUserController.java                           |   90 +
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java                        |    8 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java                         |   28 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBehaviorInfoResponse.java     |   38 
 server/service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java                            |    4 
 server/service/src/main/java/com/doumee/core/utils/DateUtil.java                                         |    4 
 /dev/null                                                                                                |   25 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerPostRequest.java                   |   18 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java      |    7 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java                |    4 
 server/web/src/main/java/com/doumee/api/web/CatalogApi.java                                              |   46 
 server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMConstants.java                             |   44 
 server/web/src/main/java/com/doumee/api/web/PublicController.java                                        |   18 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBindCusFavoriteDoRequest.java          |   27 
 72 files changed, 2,473 insertions(+), 339 deletions(-)

diff --git a/admin/src/views/timer/components/OperaTimerWindow.vue b/admin/src/views/timer/components/OperaTimerWindow.vue
index f3e8b6d..f710051 100644
--- a/admin/src/views/timer/components/OperaTimerWindow.vue
+++ b/admin/src/views/timer/components/OperaTimerWindow.vue
@@ -8,16 +8,16 @@
   >
     <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix="锛�">
       <el-form-item label="Bean鍚嶇О" prop="beanName">
-        <el-input v-model="form.beanName" placeholder="璇疯緭鍏ean鍚嶇О" :maxlength="10" v-trim/>
+        <el-input v-model="form.beanName" placeholder="璇疯緭鍏ean鍚嶇О"  v-trim/>
       </el-form-item>
       <el-form-item label="妯″潡鍚嶇О" prop="module">
-        <el-input v-model="form.module" placeholder="璇疯緭鍏ユā鍧楀悕绉�" :maxlength="10" v-trim/>
+        <el-input v-model="form.module" placeholder="璇疯緭鍏ユā鍧楀悕绉�"   v-trim/>
       </el-form-item>
       <el-form-item label="Cron琛ㄨ揪寮�" prop="cronExpres">
-        <el-input v-model="form.cronExpres" placeholder="璇疯緭鍏ron琛ㄨ揪寮�" :maxlength="10" v-trim/>
+        <el-input v-model="form.cronExpres" placeholder="璇疯緭鍏ron琛ㄨ揪寮�"   v-trim/>
       </el-form-item>
       <el-form-item label="澶囨敞" prop="remark">
-        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" :maxlength="10" v-trim/>
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
       </el-form-item>
       <el-form-item label="鎵ц鍙傛暟" prop="params">
         <el-input v-model="form.params" type="textarea" placeholder="璇疯緭鍏ユ墽琛屽弬鏁�" v-trim/>
diff --git a/admin/src/views/timer/timer.vue b/admin/src/views/timer/timer.vue
index 912f85c..91e4b1e 100644
--- a/admin/src/views/timer/timer.vue
+++ b/admin/src/views/timer/timer.vue
@@ -70,7 +70,7 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaTimerWindow from '@/views/timer/components/OperaTimerWindow'
-import {runOnceById} from "@/api/timer/timer";
+import {pauseById, resumeById, runOnceById} from '@/api/timer/timer'
 export default {
   name: 'Devices',
   extends: BaseTable,
@@ -83,13 +83,13 @@
         beanName: '',
         module: ''
       },
-      pausing:false,
-      running:false,
-      resuming:false,
+      pausing: false,
+      running: false,
+      resuming: false,
       room: []
     }
   },
-  provide() {
+  provide () {
     return {
       room: () => this.room
     }
@@ -107,61 +107,61 @@
     pauseById (row) {
       this.__checkApi()
       this.$dialog.actionConfirm('纭鏆傚仠璇ヤ换鍔″悧?')
-          .then(() => {
-            this.pausing = true
-            this.api.paustById(row.id)
-                .then(() => {
-                  this.$message.info('鏆傚仠鎴愬姛')
-                  this.search()
-                })
-                .catch(e => {
-                  // this.$tip.apiFailed(e)
-                })
-                .finally(() => {
-                  this.pausing = false
-                })
-          })
-          .catch(() => {})
+        .then(() => {
+          this.pausing = true
+          this.api.pauseById(row.id)
+            .then(() => {
+              this.$message.info('鏆傚仠鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              // this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.pausing = false
+            })
+        })
+        .catch(() => {})
     },
     resumeById (row) {
       this.__checkApi()
       this.$dialog.actionConfirm('纭鎭㈠璇ヤ换鍔″悧?')
-          .then(() => {
-            this.resuming = true
-            this.api.resumeById(row.id)
-                .then(() => {
-                  this.$message.info('鎭㈠鎴愬姛')
-                  this.search()
-                })
-                .catch(e => {
-                  // this.$tip.apiFailed(e)
-                })
-                .finally(() => {
-                  this.resuming = false
-                })
-          })
-          .catch(() => {})
+        .then(() => {
+          this.resuming = true
+          this.api.resumeById(row.id)
+            .then(() => {
+              this.$message.info('鎭㈠鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              // this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.resuming = false
+            })
+        })
+        .catch(() => {})
     },
     runById (row) {
       this.__checkApi()
       this.$dialog.actionConfirm('纭鎵ц涓�娆¤浠诲姟鍚�?')
-          .then(() => {
-            this.running = true
-            this.api.runOnceById(row.id)
-                .then(() => {
-                  this.$message.info('鎵ц鎴愬姛')
-                  this.search()
-                })
-                .catch(e => {
-                  // this.$tip.apiFailed(e)
-                })
-                .finally(() => {
-                  this.running = false
-                })
-          })
-          .catch(() => {})
+        .then(() => {
+          this.running = true
+          this.api.runOnceById(row.id)
+            .then(() => {
+              this.$message.info('鎵ц鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              // this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.running = false
+            })
+        })
+        .catch(() => {})
     }
-  },
+  }
 }
 
 </script>
diff --git a/server/admin/src/main/java/com/doumee/api/business/CustomerUserController.java b/server/admin/src/main/java/com/doumee/api/business/CustomerUserController.java
new file mode 100644
index 0000000..e380b16
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/CustomerUserController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.CustomerUser;
+import com.doumee.service.business.CustomerUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/07/15 10:21
+ */
+@Api(tags = "瀹㈡埛瀵艰喘鍏宠仈琛�")
+@RestController
+@RequestMapping("/business/customerUser")
+public class CustomerUserController extends BaseController {
+
+    @Autowired
+    private CustomerUserService customerUserService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:customeruser:create")
+    public ApiResponse create(@RequestBody CustomerUser customerUser) {
+        return ApiResponse.success(customerUserService.create(customerUser));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:customeruser:delete")
+    public ApiResponse deleteById(@PathVariable Long id) {
+        customerUserService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:customeruser:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Long> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Long.valueOf(id));
+        }
+        customerUserService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:customeruser:update")
+    public ApiResponse updateById(@RequestBody CustomerUser customerUser) {
+        customerUserService.updateById(customerUser);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:customeruser:query")
+    public ApiResponse<PageData<CustomerUser>> findPage (@RequestBody PageWrap<CustomerUser> pageWrap) {
+        return ApiResponse.success(customerUserService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:customeruser:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<CustomerUser> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(CustomerUser.class).export(customerUserService.findPage(pageWrap).getRecords(), "瀹㈡埛瀵艰喘鍏宠仈琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:customeruser:query")
+    public ApiResponse findById(@PathVariable Long id) {
+        return ApiResponse.success(customerUserService.findById(id));
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/api/timer/QuartzController.java b/server/admin/src/main/java/com/doumee/api/timer/QuartzController.java
index 220def6..3524a93 100644
--- a/server/admin/src/main/java/com/doumee/api/timer/QuartzController.java
+++ b/server/admin/src/main/java/com/doumee/api/timer/QuartzController.java
@@ -54,7 +54,7 @@
     }
 
     @ApiOperation( "鎵ц涓�娆�")
-    @GetMapping("RequiresPermissions")
+    @GetMapping("/runOnce/{id}")
     @RequiresPermissions("business:quartz:update")
     public ApiResponse runOnce(@PathVariable("id") Integer id) {
         quartzJobService.runOnce(id) ; return ApiResponse.success(null);
diff --git a/server/admin/src/main/java/com/doumee/timer/CustomerUserUpdateBiz.java b/server/admin/src/main/java/com/doumee/timer/CustomerUserUpdateBiz.java
new file mode 100644
index 0000000..d22869e
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/timer/CustomerUserUpdateBiz.java
@@ -0,0 +1,39 @@
+package com.doumee.timer;
+
+import com.doumee.core.utils.DateUtil;
+import com.doumee.service.business.CustomerUserService;
+import com.doumee.service.business.InitService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author 瀹氭椂鑾峰彇蹇楅偊瀹㈡埛缁戝畾瀵艰喘闆嗗悎鏁版嵁
+ * @since 2023-07-26 11:44
+ */
+@Component("customerBindDaogou")
+public class CustomerUserUpdateBiz implements JobService {
+    private static final Logger log = LoggerFactory.getLogger(CustomerUserUpdateBiz.class);
+
+    @Autowired
+    CustomerUserService customerUserService;
+    @Override
+    public void run(String params,String module) {
+        Method method = null;
+        try {
+            if(StringUtils.equals(module,"syncYesterday")){
+                String date = DateUtil.getYesterday();
+                customerUserService.syncYesterday(date);
+            }else{
+                log.info("\n ======== 瀹氭椂浠诲姟宸叉墽琛岋細zbomRedisResut.========"+module);
+            }
+        } catch (Exception e) {
+           e.printStackTrace();
+        }
+    }
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java
index 5d02b44..77b2005 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java
@@ -1,8 +1,12 @@
 package com.doumee.biz.zbom;
 
-import com.doumee.biz.zbom.model.CrmCustomerSubmmitModel;
-import com.doumee.biz.zbom.model.IamUpateShopModel;
-import com.doumee.biz.zbom.model.IamUpateUserModel;
+import com.doumee.biz.zbom.model.crm.CRMConstants;
+import com.doumee.biz.zbom.model.crm.CrmCustomerInfoRequest;
+import com.doumee.biz.zbom.model.crm.CrmCustomerListRequest;
+import com.doumee.biz.zbom.model.crm.CrmDaogouBindListRequest;
+import com.doumee.biz.zbom.model.crm.response.CRMBaseResponse;
+import com.doumee.biz.zbom.model.crm.response.CRMCustomerListResponse;
+import com.doumee.biz.zbom.model.crm.response.CRMDaogouBindListResponse;
 import com.doumee.dao.business.model.CustomerLog;
 import org.springframework.stereotype.Service;
 
@@ -16,7 +20,10 @@
 @Service
 public interface ZbomCRMService {
 
-    void dealCustomerLogData(CustomerLog customerLog);
+    int dealCustomerLogData(CustomerLog customerLog);
+    String zbomEncode(String str);
+    String getCrmGoUrl(String userName);
 
-    int postDataToCrm(CrmCustomerSubmmitModel entity );
+    CRMBaseResponse<List<CRMCustomerListResponse>> getCustomerList(CrmCustomerListRequest entity );
+    CRMBaseResponse<List<CRMDaogouBindListResponse>> getDaogouBindList(CrmDaogouBindListRequest entity );
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/ZbomSMSService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomSMSService.java
index 906ae4e..9c9cf66 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/ZbomSMSService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomSMSService.java
@@ -1,6 +1,5 @@
 package com.doumee.biz.zbom;
 
-import com.doumee.biz.zbom.model.CrmCustomerSubmmitModel;
 import org.springframework.stereotype.Service;
 
 /**
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
index f3ac168..0b41ced 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
@@ -3,6 +3,7 @@
 import com.doumee.biz.zbom.model.zhongtai.*;
 import com.doumee.biz.zbom.model.zhongtai.response.*;
 import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.web.response.ZSZXCatalogResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -21,16 +22,18 @@
     ZTUserGetTokenResponse userUpdateInfo(ZTUserInfoUpdateRequest param);
     boolean userLogout(ZTBaseRequst param);
     List<ZTCatalogInfoResponse> getCatalogList(ZTCatalogListRequest param);
+    List<ZTTagInfoResponse> getTagList(ZTCatalogListRequest param);
     ZTBasePageResponse<ZTContentListResponse> pageContentList(ZTContentListRequest param);
    ZTContentInfoResponse getContentInfo(ZTContentInfoRequest param);
    boolean collectDo(ZTActionDoRequest param);
    boolean likeDo(ZTActionBatchDoRequest param);
    boolean shareDo(ZTActionDoRequest param);
    boolean viewDo(ZTActionDoRequest param);
-    ZTBasePageResponse<ZTContentListResponse> pageCollectList(ZTContentListRequest param);
+    ZTBasePageResponse<ZTCollectInfoResponse> pageCollectList(ZTContentListRequest param);
     ZTBasePageResponse<ZTContentListResponse> pageLikeList(ZTContentListRequest param);
+    ZTBasePageResponse<ZTBehaviorInfoResponse> pageBehavoirList(ZTContentListRequest param);
     List<ZTAreaInfoResponse> getAreaList(ZTAreaListRequest param);
-
-
-
+    boolean bindCustomerFavorites(ZTBindCusFavoriteDoRequest param);
+    ZSZXCatalogResponse getZSZXCatalogs();
+    ZTBasePageResponse<ZTCusFavoritesInfoResponse> pageCusFavoriteList(ZTContentListRequest param);
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java
index f6d1d27..bd00ca2 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java
@@ -1,10 +1,15 @@
 package com.doumee.biz.zbom.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.doumee.biz.zbom.ZbomCRMService;
-import com.doumee.biz.zbom.model.CrmCustomerInfoModel;
-import com.doumee.biz.zbom.model.CrmCustomerSubmmitModel;
+import com.doumee.biz.zbom.model.crm.*;
+import com.doumee.biz.zbom.model.crm.response.CRMBaseResponse;
+import com.doumee.biz.zbom.model.crm.response.CRMCustomerListResponse;
+import com.doumee.biz.zbom.model.crm.response.CRMDaogouBindListResponse;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.HttpsUtil;
@@ -12,6 +17,7 @@
 import com.doumee.dao.business.CustomerLogMapper;
 import com.doumee.dao.business.model.CrmInterfaceLog;
 import com.doumee.dao.business.model.CustomerLog;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +25,7 @@
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.net.URLEncoder;
 import java.util.*;
 
 /**
@@ -27,6 +34,7 @@
  * @date 2023/11/30 15:33
  */
 @Service
+@Slf4j
 public class ZbomCRMServiceImpl implements ZbomCRMService {
 
     @Autowired
@@ -38,93 +46,152 @@
     private RedisTemplate<String, Object> redisTemplate;
 
 
-    @Override
-    @Async
-    public void dealCustomerLogData(CustomerLog customerLog){
-        CrmCustomerSubmmitModel entity = new CrmCustomerSubmmitModel();
-        List<CrmCustomerInfoModel> cusInfo = new ArrayList();
-        CrmCustomerInfoModel crmCustomerInfoModel = new CrmCustomerInfoModel();
-        crmCustomerInfoModel.setId(customerLog.getId());
-        crmCustomerInfoModel.setName(customerLog.getName());
-        crmCustomerInfoModel.setPhone(customerLog.getPhone());
-        crmCustomerInfoModel.setAreaname(customerLog.getAreaName());
-        crmCustomerInfoModel.setAreacode(customerLog.getAreaCode());
-        crmCustomerInfoModel.setOpenid(customerLog.getOpenid());
-        crmCustomerInfoModel.setSource(Constants.CrmSources.SOURCE_ZBJX);
-        crmCustomerInfoModel.setChannel(crmCustomerInfoModel.getSource()+"00");
-        crmCustomerInfoModel.setDate(DateUtil.dateToString(customerLog.getCreateDate(),"yyyy/MM/dd HH:mm"));
-        cusInfo.add(crmCustomerInfoModel);
-        entity.setCusInfo(cusInfo);
-        this.postDataToCrm(entity);
-
-    }
-
-
 
     /**
      * 蹇楅偊瀹㈡埛淇℃伅鎻愪氦鎺ュ彛
-     * @param entity
+     * @param customerLog
      * @return
      */
     @Override
-    public int postDataToCrm(CrmCustomerSubmmitModel entity )  {
-        // TODO Auto-generated method stub
-        int status = 2;
-        if(entity==null || entity.getCusInfo()==null || entity.getCusInfo().size() ==0){
-            return status;
+    @Async
+    public int dealCustomerLogData(CustomerLog customerLog){
+        CrmCustomerInfoRequest entity = new CrmCustomerInfoRequest();
+        entity.setId(customerLog.getId());
+        entity.setName(customerLog.getName());
+        entity.setPhone(zbomEncode(customerLog.getPhone()));
+        entity.setAreaname(customerLog.getAreaName());
+        entity.setAreacode(customerLog.getAreaCode());
+        entity.setOpenid(customerLog.getOpenid());
+//        鎻愪氦绫诲瀷 0-娴嬭瘯瑁呬慨椋庢牸锛�1-0鍏冨畾鍒讹紱2瑁呬慨璁$畻鍣�
+        if(Constants.equalsInteger(customerLog.getType(),Constants.ONE)){
+            entity.setSource(CRMConstants.CRM_SOURCE.SOURCE_MP01);
+            entity.setChannel(CRMConstants.CRM_SOURCE.SOURCE_MP01+"00");
+        }else{
+            entity.setSource(CRMConstants.CRM_SOURCE.SOURCE_MP02);
+            entity.setChannel(CRMConstants.CRM_SOURCE.SOURCE_MP02+"00");
         }
-        String type = "postCusData";
-        String appid = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_KEY);
-        String urlStr =  (String)redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) ;
-        long _t = System.currentTimeMillis();
-        String crmInfo="鎻愪氦澶辫触";
-        if (StringUtils.isNotBlank(appid)||StringUtils.isNotBlank(urlStr)) {
-            String param = JSONObject.toJSONString(entity);
-            String result = null;
-            int success =1;
-            String url = urlStr;
-            try {
-                String token = DigestUtils.md5Hex(type + _t + appid);
-                  url = urlStr + "?type=" + type + "&_t=" + _t + "&token=" + token;// 鎻愪氦CRM鍦板潃
-                  result = HttpsUtil.postJson(url,param);
-                if (StringUtils.isNotBlank(result)) {
-                    JSONObject r = JSONObject.parseObject(result.replace("(", "").replace(")", ""));
-                    if (r != null && (StringUtils.equalsIgnoreCase(r.getString("code"), "1")
-                            || StringUtils.equalsIgnoreCase(r.getString("code"), "2"))) {
-                          status = 1;
-                          crmInfo="鎻愪氦鎴愬姛";
-                        success =0;
-                    }else{
-                        status = 2;
-                        crmInfo="鎻愪氦澶辫触["+ result+"]";
-                    }
-                }
-            }catch (Exception e){
-                e.printStackTrace();
-                crmInfo+= e.getMessage();
-            }finally {
-                saveInterfaceLog(url,"蹇楅偊CRM瀹㈡埛鐣欒祫淇℃伅鎻愪氦",param,success,result);
-            }
+        entity.setOpenid(customerLog.getOpenid());
+        entity.setDate(DateUtil.dateToString(customerLog.getCreateDate(),"yyyy/MM/dd HH:mm"));
+        CrmCustomerPostRequest obj = new CrmCustomerPostRequest();
+        obj.setCusInfo(new ArrayList<>());
+        obj.getCusInfo().add(entity);
+        int status ;
+        String crmInfo;
+        String param = JSONObject.toJSONString(obj);
+        CRMBaseResponse result = sendCusHttpRequest(CRMConstants.IntegerUrl.POST_CUS_DATA_URL,CRMConstants.IntegerName.POST_CUS_DATA_NAME,param);
+        if (result != null && (StringUtils.equalsIgnoreCase(result.getCode(), CRMConstants.CODE_SUCCESS))) {
+            status = 1;
+            crmInfo="鎻愪氦鎴愬姛";
         }else{
             status = 2;
-            crmInfo="鎻愪氦澶辫触crm閰嶇疆鏈夎锛宎ppid:["+ appid+"]"+"url:["+ urlStr+"]";
+            crmInfo="鎻愪氦澶辫触["+ result!=null?result.getMsg():"鎺ュ彛璇锋眰澶辫触锛�"+"]";
         }
-        List<Long> idList = new ArrayList<>();
-        for(CrmCustomerInfoModel info : entity.getCusInfo()){
-            idList.add(info.getId());
-        }
-        // 濡傛灉鎻愪氦鎴愬姛
-        CustomerLog d = new CustomerLog();
-        d.setId(entity.getCusInfo().get(0).getId());
-        d.setCrmStatus(Constants.ONE);
         customerLogMapper.update(null,new UpdateWrapper<CustomerLog>().lambda()
-                .in(CustomerLog::getId,idList)
+                .eq(CustomerLog::getId,entity.getId())
                 .set(CustomerLog::getCrmStatus,Constants.ONE )
                 .set(CustomerLog::getCrmInfo,crmInfo )
                 .set(CustomerLog::getCrmDate,new Date() ));// 鏇存柊鐘舵��
         return status;// 榛樿澶辫触
     }
+    /**
+     * 鑾峰彇瀵艰喘缁戝畾鍒楄〃
+     * @param entity
+     * @return
+     */
+    @Override
+    public  CRMBaseResponse<List<CRMDaogouBindListResponse>> getDaogouBindList(CrmDaogouBindListRequest entity ){
+        int status ;
+        String crmInfo;
+        String param = JSONObject.toJSONString(entity);
+        CRMBaseResponse<List<CRMDaogouBindListResponse>> result = sendHttpRequest(CRMConstants.IntegerUrl.DAOGOU_BIND_LIST_URL,
+                CRMConstants.IntegerName.DAOGOU_BIND_LIST_NAME,
+                param,
+                new TypeReference<CRMBaseResponse<List<CRMDaogouBindListResponse>>>(){});
+        return result;// 榛樿澶辫触
+    }
 
+    /**
+     * 鑾峰彇瀹㈡埛鍒楄〃
+     * @param entity
+     * @return
+     */
+    @Override
+    public CRMBaseResponse<List<CRMCustomerListResponse>> getCustomerList(CrmCustomerListRequest entity ){
+        int status ;
+        String crmInfo;
+        String param = JSONObject.toJSONString(entity);
+        CRMBaseResponse<List<CRMCustomerListResponse>> result = sendHttpRequest(CRMConstants.IntegerUrl.CUS_BEFORE_PAGE_LIST_URL
+                ,CRMConstants.IntegerName.CUS_BEFORE_PAGE_LIST_NAME
+                ,param
+                ,new TypeReference<CRMBaseResponse<List<CRMCustomerListResponse>>>(){});
+        return result;// 榛樿澶辫触
+    }
+
+    public   <T> CRMBaseResponse<T> sendCusHttpRequest(String interfaceUrl,  String name,  String param){
+        log.info("銆�"+name+"銆�================寮�濮�===="+ JSONObject.toJSONString(param));
+        String appKey = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_KEY);
+        String url = redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) + interfaceUrl ;
+        long _t = System.currentTimeMillis();
+        if (StringUtils.isNotBlank(appKey)||StringUtils.isNotBlank(url)) {
+            String res = null;
+            int success = 0;
+            try {
+                url += "?type=postCusData&_t=" + _t + "&token=" + DigestUtils.md5Hex( "postCusData" + _t + appKey);
+                Map<String,String> headers = new HashMap<>();
+                res = HttpsUtil.postJson(url,param);
+                TypeReference typeReference =
+                        new TypeReference<CRMBaseResponse<T>>(){};
+                CRMBaseResponse<T>  result = JSONObject.parseObject(res, typeReference.getType());
+                logResult(result,name);
+                if(StringUtils.equals(result.getCode(),CRMConstants.CODE_SUCCESS)){
+                    return  result;
+                }else{
+                    success =1;
+                }
+            }catch (Exception e){
+                success = 1;
+                log.error("銆�"+name+"銆�================澶辫触===="+ JSONObject.toJSONString(param));
+            }finally {
+                saveInterfaceLog(url,name,param,success,res);
+            }
+        }
+        return  null;
+    }
+    public   <T> CRMBaseResponse<T> sendHttpRequest(String interfaceUrl,  String name,  String param,TypeReference<CRMBaseResponse<T>> typeReference){
+        log.info("銆�"+name+"銆�================寮�濮�===="+ JSONObject.toJSONString(param));
+        String appKey = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_KEY);
+        String url = redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) + interfaceUrl ;
+        long _t = System.currentTimeMillis();
+        if (StringUtils.isNotBlank(appKey)||StringUtils.isNotBlank(url)) {
+            String res = null;
+            int success = 0;
+            try {
+                url += "?timestamp=" + _t + "&sign=" + DigestUtils.md5Hex( _t + appKey);
+                Map<String,String> headers = new HashMap<>();
+                res = HttpsUtil.postJson(url,param);
+                CRMBaseResponse<T>  result = JSONObject.parseObject(res, typeReference.getType());
+                logResult(result,name);
+                if(StringUtils.equals(result.getCode(),CRMConstants.CODE_SUCCESS)){
+                    return  result;
+                }else{
+                    success =1;
+                }
+            }catch (Exception e){
+                success = 1;
+                log.error("銆�"+name+"銆�================澶辫触===="+ JSONObject.toJSONString(param));
+            }finally {
+                saveInterfaceLog(url,name,param,success,res);
+            }
+        }
+        return  null;
+    }
+    private static void logResult(CRMBaseResponse res,String name) {
+        if(StringUtils.equals(res.getCode(), CRMConstants.CODE_SUCCESS)){
+            log.info("銆怌RM鎺ュ彛锛�"+name+"銆�================鎴愬姛====\n"+res);
+        }else{
+            log.error("銆怌RM鎺ュ彛锛�"+name+"銆�================澶辫触====锛歕n"+ res);
+        }
+    }
     public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone){
             if(crmInterfaceLogMapper ==null){
                 return;
@@ -142,4 +209,55 @@
             log.setRepose(respone);
             crmInterfaceLogMapper.insert(log);
     }
+
+    /**
+     * 蹇楅偊瀛楃涓插姞瀵�
+     * @param str
+     * @return
+     */
+
+    @Override
+    public   String zbomEncode(String str)  {
+        StringBuffer sb = new StringBuffer();
+        String result = null;
+        try {
+            // 鍒涘缓StringBuffer瀵硅薄鐢ㄦ潵鎿嶄綔瀛楃涓�
+            String  urlStr =  (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_ENCODE_URL);
+            sb = new StringBuffer(
+                    urlStr + "?code=" + URLEncoder.encode(str, "UTF-8") + "&type=0&numstr=wy?");
+            result = HttpsUtil.sendGet(sb.toString());
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            saveInterfaceLog(sb.toString(),"蹇楅偊瀛楃涓插姞瀵嗘帴鍙�",str, result==null?1:0,result );
+        }
+        return  result;
+    }
+
+    /**
+     * 璺宠浆crm鍔熻兘 鑾峰彇鎺堟潈鍦板潃
+     * http://localhost:8080/core/oauth/authorize/jump?timestamp=1719998741&sign=41fbeb13965c43916876db7b5799e8ac&agent_phone_number=199077&bindKey=mp
+     * @param userName
+     * @return
+     */
+    @Override
+    public    String getCrmGoUrl(String userName){
+        StringBuffer sb = new StringBuffer();
+        String result = null;
+        try {
+            // 鍒涘缓StringBuffer瀵硅薄鐢ㄦ潵鎿嶄綔瀛楃涓�
+            int _t = (int)(System.currentTimeMillis());
+            String  appkey =  (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_AUTH_API_KEY);
+            String  url =  (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL)
+                    +CRMConstants.IntegerUrl.GO_CRM_AUTH_URL
+                    + "?timestamp="+_t
+                    +"&agent_phone_number=" + URLEncoder.encode(userName, "UTF-8")
+                    + "&bindKey=mp&sign="+ DigestUtils.md5Hex( _t + appkey);;
+            return url;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+       throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鑾峰彇璺宠浆鍦板潃澶辫触鍝︼紒");
+    }
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java
index dbe6b43..61cf379 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java
@@ -1,17 +1,10 @@
 package com.doumee.biz.zbom.impl;
 
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.doumee.biz.zbom.ZbomCRMService;
 import com.doumee.biz.zbom.ZbomSMSService;
-import com.doumee.biz.zbom.model.CrmCustomerInfoModel;
-import com.doumee.biz.zbom.model.CrmCustomerSubmmitModel;
 import com.doumee.core.utils.Constants;
-import com.doumee.core.utils.HttpsUtil;
 import com.doumee.dao.business.CrmInterfaceLogMapper;
 import com.doumee.dao.business.CustomerLogMapper;
 import com.doumee.dao.business.model.CrmInterfaceLog;
-import com.doumee.dao.business.model.CustomerLog;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,16 +16,14 @@
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 /**
  * 蹇楅偊CRM瀹㈡埛淇℃伅鎻愪氦鎺ュ彛
  * @author 姹熻箘韫�
  * @date 2023/11/30 15:33
  */
-//@Service
+@Service
 public class ZbomSMSServiceImpl implements ZbomSMSService  {
 
     @Autowired
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
index 663aa5c..2837a38 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
@@ -16,6 +16,7 @@
 import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.model.CrmInterfaceLog;
 import com.doumee.dao.business.model.InterfaceLog;
+import com.doumee.dao.web.response.ZSZXCatalogResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,11 +53,37 @@
                ZTConstants.IntegerName.USER_GET_TOKEN_NAME,
                param.getToken(),
                param.getUserType(),
-               JSONObject.toJSONString(param ));
+               JSONObject.toJSONString(param ),
+               new TypeReference<ZTBaseResponse<ZTUserGetTokenResponse>>(){});
        if(result!=null){
            return result.getData();
        }
        return null;
+   }
+    /**
+     * 鑾峰彇鐢ㄦ埛鐧婚檰token
+     * @return
+     */
+   @Override
+   public ZSZXCatalogResponse getZSZXCatalogs(){
+       ZSZXCatalogResponse response = new ZSZXCatalogResponse();
+       ZTCatalogListRequest param = new ZTCatalogListRequest();
+       param.setCatalogCode(ZTConstants.CatalogCode.ZHISHUO_ZHUANGXIU);
+       List<ZTCatalogInfoResponse> cataList = getCatalogList(param);
+        if(cataList!=null ){
+            for(ZTCatalogInfoResponse data : cataList){
+                if(StringUtils.equals(data.getCode(), ZTConstants.CatalogCode.JIADE_ID)){
+                    response.setJdId(data);
+                }else if(StringUtils.equals(data.getCode(), ZTConstants.CatalogCode.CHUFANGSHEJI)){
+                    response.setCfsj(data);
+                }else if(StringUtils.equals(data.getCode(), ZTConstants.CatalogCode.QW_SHEJI)){
+                    response.setQwsj(data);
+                }else if(StringUtils.equals(data.getCode(), ZTConstants.CatalogCode.SHOUNASHEJI)){
+                    response.setSnsj(data);
+                }
+            }
+        }
+       return response;
    }
     /**
      * 鐢ㄦ埛淇℃伅鍚屾
@@ -70,7 +97,8 @@
                 ZTConstants.IntegerName.USER_UPDATE_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<ZTUserGetTokenResponse>>(){});
         if(result!=null){
             return result.getData();
         }
@@ -88,7 +116,8 @@
                 ZTConstants.IntegerName.USER_LOGOUT_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<Object>>(){});
         if(result!=null ){
             return true;
         }
@@ -102,12 +131,33 @@
      */
     @Override
     public  List<ZTCatalogInfoResponse> getCatalogList(ZTCatalogListRequest param){
-        ZTBaseResponse<List<ZTCatalogInfoResponse>> result = sendHttpRequest(
+
+       ZTBaseResponse<List<ZTCatalogInfoResponse>> result = sendHttpRequest(
                 ZTConstants.IntegerUrl.CATALOG_LIST_URL,
                 ZTConstants.IntegerName.CATALOG_LIST_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+        new TypeReference<ZTBaseResponse<List<ZTCatalogInfoResponse>>>(){});
+        if(result!=null){
+            return result.getData();
+        }
+        return null;
+    }
+    /**
+     * 鑾峰彇鍒嗙被鍜屽垎绫讳笅鐨勬爣绛�
+     * @param param
+     * @return
+     */
+    @Override
+    public      List<ZTTagInfoResponse> getTagList(ZTCatalogListRequest param){
+        ZTBaseResponse<List<ZTTagInfoResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.TAG_LIST_URL,
+                ZTConstants.IntegerName.TAG_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<List<ZTTagInfoResponse>>>(){});
         if(result!=null){
             return result.getData();
         }
@@ -126,7 +176,8 @@
                 ZTConstants.IntegerName.CONTENT_LIST_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<ZTBasePageResponse<ZTContentListResponse>>>(){});
         if(result!=null){
             return result.getData();
         }
@@ -140,11 +191,12 @@
     @Override
     public ZTContentInfoResponse getContentInfo(ZTContentInfoRequest param){
         ZTBaseResponse<ZTContentInfoResponse> result = sendHttpRequest(
-                ZTConstants.IntegerUrl.CONTENT_INFO_URL+ param.getArticleId(),
+                ZTConstants.IntegerUrl.CONTENT_INFO_URL+ param.getId(),
                 ZTConstants.IntegerName.CONTENT_INFO_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<ZTContentInfoResponse>>(){});
         if(result!=null){
             return result.getData();
         }
@@ -162,7 +214,8 @@
                 ZTConstants.IntegerName.COLLECT_DO_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<Object>>(){});
         if(result!=null ){
             return true;
         }
@@ -180,7 +233,8 @@
                 ZTConstants.IntegerName.LIKE_DO_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<Object>>(){});
         if(result!=null ){
             return true;
         }
@@ -198,7 +252,8 @@
                 ZTConstants.IntegerName.SHARE_DO_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<Object>>(){});
         if(result!=null ){
             return true;
         }
@@ -216,7 +271,27 @@
                 ZTConstants.IntegerName.VIEW_DO_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<Object>>(){});
+        if(result!=null ){
+            return true;
+        }
+        return false;
+    }
+    /**
+     * 鐢ㄦ埛缁戝畾瀹㈡埛鍠滄娓呭崟锛屽彲缁戝畾澶氫釜鍐呭
+     * @param param
+     * @return
+     */
+    @Override
+    public boolean bindCustomerFavorites(ZTBindCusFavoriteDoRequest param){
+        ZTBaseResponse result = sendHttpRequest(
+                ZTConstants.IntegerUrl.BIND_CUSTOMER_FAVORITES_URL,
+                ZTConstants.IntegerName.BIND_CUSTOMER_FAVORITES_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<Object>>(){});
         if(result!=null ){
             return true;
         }
@@ -228,13 +303,52 @@
      * @return
      */
     @Override
-    public ZTBasePageResponse<ZTContentListResponse> pageCollectList(ZTContentListRequest param){
-        ZTBaseResponse< ZTBasePageResponse<ZTContentListResponse>> result = sendHttpRequest(
+    public ZTBasePageResponse<ZTCollectInfoResponse> pageCollectList(ZTContentListRequest param){
+        ZTBaseResponse< ZTBasePageResponse<ZTCollectInfoResponse>> result = sendHttpRequest(
                 ZTConstants.IntegerUrl.COLLECT_LIST_URL,
                 ZTConstants.IntegerName.COLLECT_LIST_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<ZTBasePageResponse<ZTCollectInfoResponse>>>(){});
+        if(result!=null){
+            return result.getData();
+        }
+        return  null;
+    }
+    /**
+     * 鑾峰彇鎴戠殑鏀惰棌鍒楄〃鍒嗛〉
+     * @param param
+     * @return
+     */
+    @Override
+    public  ZTBasePageResponse<ZTBehaviorInfoResponse> pageBehavoirList(ZTContentListRequest param){
+        ZTBaseResponse< ZTBasePageResponse<ZTBehaviorInfoResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.BEHAVIOR_LIST_URL,
+                ZTConstants.IntegerName.BEHAVIOR_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<ZTBasePageResponse<ZTBehaviorInfoResponse>>>(){});
+        if(result!=null){
+            return result.getData();
+        }
+        return  null;
+    }
+    /**
+     * 鑾峰彇瀹㈡埛鍠滄
+     * @param param
+     * @return
+     */
+    @Override
+    public ZTBasePageResponse<ZTCusFavoritesInfoResponse> pageCusFavoriteList(ZTContentListRequest param){
+        ZTBaseResponse< ZTBasePageResponse<ZTCusFavoritesInfoResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.CUSTOMER_FAVORITES_LIST_URL,
+                ZTConstants.IntegerName.CUSTOMER_FAVORITES_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<ZTBasePageResponse<ZTCusFavoritesInfoResponse>>>(){});
         if(result!=null){
             return result.getData();
         }
@@ -253,7 +367,8 @@
                 ZTConstants.IntegerName.LIKE_LIST_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<ZTBasePageResponse<ZTContentListResponse>>>(){});
         if(result!=null){
             return result.getData();
         }
@@ -275,7 +390,8 @@
                 ZTConstants.IntegerName.AREA_LIST_NAME,
                 param.getToken(),
                 param.getUserType(),
-                JSONObject.toJSONString(param ));
+                JSONObject.toJSONString(param ),
+                new TypeReference<ZTBaseResponse<List<ZTAreaInfoResponse>>>(){});
         if(result!=null){
             return result.getData();
         }
@@ -283,7 +399,7 @@
     }
 
 
-    public   <T> ZTBaseResponse<T> sendHttpRequest(String url,String name,String token,String userType,String param){
+    public   <T>   ZTBaseResponse<T> sendHttpRequest(String url,String name,String token,String userType,String param,TypeReference<ZTBaseResponse<T>> typeReference){
         log.info("銆�"+name+"銆�================寮�濮�===="+ JSONObject.toJSONString(param));
         String res = null;
         int success = 0;
@@ -294,11 +410,9 @@
             headers.put(ZTConstants.HEADER_USERTYPE,userType);
             String index = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_ZHONGTAI_API_URL);
             res = HttpsUtil.postJsonWithHeaders(index+url,param,headers);
-            TypeReference typeReference =
-                    new TypeReference<ZTBaseResponse<T>>(){};
             ZTBaseResponse<T>  result = JSONObject.parseObject(res, typeReference.getType());
             logResult(result,name);
-            if(StringUtils.equals(result.getCode(),ZTConstants.CODE_SUCCESS)){
+            if(Constants.equalsInteger(result.getCode(),ZTConstants.CODE_SUCCESS)){
                 return  result;
             }else{
                 success =1;
@@ -329,7 +443,7 @@
         interfaceLogMapper.insert(log);
     }
     private static void logResult(ZTBaseResponse res,String name) {
-        if(StringUtils.equals(res.getCode(), ZTConstants.CODE_SUCCESS)){
+        if(Constants.equalsInteger(res.getCode(),ZTConstants.CODE_SUCCESS)){
             log.info("銆愪腑鍙版帴鍙o細"+name+"銆�================鎴愬姛====\n"+res);
         }else{
             log.error("銆愪腑鍙版帴鍙o細"+name+"銆�================澶辫触====锛歕n"+ res);
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/CrmCustomerSubmmitModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/CrmCustomerSubmmitModel.java
deleted file mode 100644
index b2af4d4..0000000
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/CrmCustomerSubmmitModel.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.doumee.biz.zbom.model;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.gson.annotations.SerializedName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-@Data
-@ApiModel("蹇楅偊CRM瀹㈡埛鐣欒祫鎻愪氦鍙傛暟")
-public class CrmCustomerSubmmitModel implements Serializable {
-    @ApiModelProperty(value = "瀹㈡埛淇℃伅")
-    @JsonProperty("cus_info")
-    @SerializedName("cus_info")
-    private List<CrmCustomerInfoModel> cusInfo;
-}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMBaseRequst.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMBaseRequst.java
new file mode 100644
index 0000000..e8c057b
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMBaseRequst.java
@@ -0,0 +1,17 @@
+package com.doumee.biz.zbom.model.crm;
+
+import lombok.Data;
+
+
+/**
+ *  crm璇锋眰鍏叡鍙傛暟
+ */
+@Data
+public class CRMBaseRequst {
+    /**
+     * 鐖剁骇缂栫爜
+     */
+    private Integer timestamp;
+    private String sign;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMConstants.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMConstants.java
new file mode 100644
index 0000000..c97f9d5
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CRMConstants.java
@@ -0,0 +1,44 @@
+package com.doumee.biz.zbom.model.crm;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class CRMConstants {
+
+    public static final CharSequence CODE_SUCCESS = "1";
+    public interface IntegerUrl{
+        String POST_CUS_DATA_URL ="/api/public/zbom/postCusData";
+        String CUS_BEFORE_PAGE_LIST_URL ="api/public/mini/program/cusOrBeforeList";
+        String DAOGOU_BIND_LIST_URL ="api/public/mini/program/list";
+        String GO_CRM_AUTH_URL ="oauth/authorize/jump";
+
+    }
+    public interface IntegerName{
+        String POST_CUS_DATA_NAME ="鐣欒祫鏁版嵁鎻愪氦";
+        String CUS_BEFORE_PAGE_LIST_NAME  ="鏌ヨ绠$悊瀹㈡埛/娼滃鍒楄〃";
+        String DAOGOU_BIND_LIST_NAME  ="鏌ヨ瀹㈡埛瀵艰喘";
+    }
+    
+    public  interface CRM_SOURCE{
+       String SOURCE_DKXD = "DKXD";// 浠e涓嬪崟(DKXD)
+       String SOURCE_LYSJ = "LYSJ";// 闆跺厓璁捐(LYSJ)
+       String SOURCE_ZBSJSQ = "ZBSJSQ";// 蹇楅偊璁捐鐢宠(ZBSJSQ)
+       String SOURCE_ZBDXFX = "ZBDXFX";// 蹇楅偊鐭俊鍒嗕韩(ZBDXFX)
+       String SOURCE_ZBLLJL = "ZBLLJL";// 蹇楅偊娴忚璁板綍鍒嗕韩(ZBLLJL)
+       String SOURCE_ZBWDSC = "ZBWDSC";// 蹇楅偊鎴戠殑鏀惰棌鍒嗕韩(ZBWDSC)
+       String SOURCE_ZBLYSJ = "ZBLYSJ";// 蹇楅偊闆跺厓璁捐(ZBLYSJ)
+       String SOURCE_ZBLDX = "ZBLDX";// 蹇楅偊鑰佸甫鏂�(ZBLDX)
+       String SOURCE_ZBFGCS = "ZBFGCS";// 蹇楅偊椋庢牸娴嬭瘯(ZBFGCS)
+       String SOURCE_ZBJX = "DSLX22";// 蹇楅偊瀹堕��(ZBJX)
+       String SOURCE_MP01 = "MP01";// 闆跺厓璁捐
+       String SOURCE_MP02 = "MP02";//鎶ヤ环璁$畻鍣�
+    }
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/CrmCustomerInfoModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerInfoRequest.java
similarity index 78%
rename from server/service/src/main/java/com/doumee/biz/zbom/model/CrmCustomerInfoModel.java
rename to server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerInfoRequest.java
index 956be0c..0de506d 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/CrmCustomerInfoModel.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerInfoRequest.java
@@ -1,4 +1,4 @@
-package com.doumee.biz.zbom.model;
+package com.doumee.biz.zbom.model.crm;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -7,8 +7,8 @@
 import java.io.Serializable;
 
 @Data
-@ApiModel("蹇楅偊CRM瀹㈡埛鐣欒祫鎻愪氦鏄庣粏鍙傛暟")
-public class CrmCustomerInfoModel implements Serializable {
+@ApiModel("蹇楅偊CRM瀹㈡埛鐣欒祫鎻愪氦鍙傛暟")
+public   class CrmCustomerInfoRequest extends CRMBaseRequst implements Serializable {
     @ApiModelProperty(value = "浜哄憳缂栫爜")
     private Long id;
     @ApiModelProperty(value = "濮撳悕")
@@ -17,9 +17,9 @@
     private String phone;
     @ApiModelProperty(value = "璁捐甯堟墜鏈哄彿")
     private String shopper;
-    @ApiModelProperty(value = "鏉ユ簮")
+    @ApiModelProperty(value = "鏉ユ簮 MP01銆愰浂鍏冭璁°�戙�丮P02銆愭姤浠疯绠楀櫒銆�")
     private String source;
-    @ApiModelProperty(value = "娓犻亾")
+    @ApiModelProperty(value = "娓犻亾MP0100 锛孧P0200 ")
     private String channel;
     @ApiModelProperty(value = "鏃ユ湡 yyyy/MM/dd HH:mm")
     private String date;
@@ -39,4 +39,4 @@
     private String openid;
     @ApiModelProperty(value = "缁堢淇℃伅")
     private String terminal;
-}
+}
\ No newline at end of file
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerListRequest.java
new file mode 100644
index 0000000..0e76ad3
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerListRequest.java
@@ -0,0 +1,22 @@
+package com.doumee.biz.zbom.model.crm;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("鏌ヨ绠$悊瀹㈡埛/娼滃鍒楄〃璇锋眰鍙傛暟")
+public   class CrmCustomerListRequest extends CRMBaseRequst implements Serializable {
+    @ApiModelProperty(value = "鐢ㄦ埛鍚�",required = true)
+    private String userName;
+    @ApiModelProperty(value = "绫诲瀷 绠$悊瀹㈡埛:0 娼滃鍒楄〃锛�1" ,required = true)
+    private String flag;
+    @ApiModelProperty(value = "鍒嗛〉澶у皬 锛堥粯璁わ細10锛� 10")
+    private int pageSize;
+    @ApiModelProperty(value = "鍒嗛〉椤电爜  锛堥粯璁わ細1锛�")
+    private int page;
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О,瀹㈡埛鎵嬫満鍙风爜 ,鍦板潃")
+    private String keyWords;
+}
\ No newline at end of file
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerPostRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerPostRequest.java
new file mode 100644
index 0000000..8088b51
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmCustomerPostRequest.java
@@ -0,0 +1,18 @@
+package com.doumee.biz.zbom.model.crm;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("蹇楅偊CRM瀹㈡埛鐣欒祫鎻愪氦澶栧眰鍙傛暟")
+public   class CrmCustomerPostRequest extends CRMBaseRequst implements Serializable {
+    @JsonProperty("cus_info")
+    @SerializedName("cus_info")
+    private List< CrmCustomerInfoRequest > cusInfo;
+}
\ No newline at end of file
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmDaogouBindListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmDaogouBindListRequest.java
new file mode 100644
index 0000000..76e357f
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/CrmDaogouBindListRequest.java
@@ -0,0 +1,24 @@
+package com.doumee.biz.zbom.model.crm;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("鏌ヨ绠$悊瀹㈡埛/娼滃鍒楄〃璇锋眰鍙傛暟")
+public   class CrmDaogouBindListRequest extends CRMBaseRequst implements Serializable {
+    @ApiModelProperty(value = "鐢ㄦ埛鍚�",required = true)
+    private String userName;
+    @ApiModelProperty(value = "鏄惁瀹氭椂  1:鏄�  0鍚︼紙褰撲负1鏃� 锛宬eyWords 闈炲繀濉」鐩級 " ,required = true)
+    private String timing;
+    @ApiModelProperty(value = "鍒嗛〉澶у皬 锛堥粯璁わ細10锛� 10")
+    private int pageSize;
+    @ApiModelProperty(value = "鍒嗛〉椤电爜  锛堥粯璁わ細1锛�")
+    private int page;
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О,瀹㈡埛鎵嬫満鍙风爜 ,鍦板潃",required = true)
+    private String keyWords;
+    @ApiModelProperty(value = "timing 鏄�1鏃跺�欏繀浼� 锛寉yyy-MM-dd,褰撳ぉ鍒涘缓鐨勬剰鍚�",required = true)
+    private String creationDate;
+}
\ No newline at end of file
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMBaseResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMBaseResponse.java
new file mode 100644
index 0000000..5d93183
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMBaseResponse.java
@@ -0,0 +1,24 @@
+package com.doumee.biz.zbom.model.crm.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CRMBaseResponse<T> implements Serializable {
+
+    /**
+     * 娑堟伅鐮�,200:鎴愬姛;鍏朵粬code:澶辫触
+     */
+    private String code;
+    /**
+     * 鎻愮ず娑堟伅
+     */
+    private String msg;
+    private  int total;
+    /**
+     *  鏁版嵁
+     */
+    private T data;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMCustomerListResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMCustomerListResponse.java
new file mode 100644
index 0000000..dd1c850
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMCustomerListResponse.java
@@ -0,0 +1,23 @@
+package com.doumee.biz.zbom.model.crm.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 鏌ヨ绠$悊瀹㈡埛/娼滃鍒楄〃杩斿洖
+ */
+@Data
+public class CRMCustomerListResponse implements Serializable {
+    private String  dgName	;//瀵艰喘鍚嶇О
+    private String   dgPhone	;//瀵艰喘鎵嬫満鍙风爜
+    private String  orgName	;//缁勭粐鍚嶇О
+    private String  userName;//	鐢ㄦ埛鐧诲綍璐﹀彿
+    private String  userId	;//鐢ㄦ埛id涓婚敭
+    private String  productCodeName;//	浜у搧鍚嶇О
+    private String customerPhone;//	瀹㈡埛濮撳悕
+    private String customerName;//	瀹㈡埛鎵嬫満鍙�
+    private String  address	;//鍦板潃璇︽儏
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMDaogouBindListResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMDaogouBindListResponse.java
new file mode 100644
index 0000000..70c4cd8
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/crm/response/CRMDaogouBindListResponse.java
@@ -0,0 +1,24 @@
+package com.doumee.biz.zbom.model.crm.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 鏌ュ鎴峰璐� 杩斿洖
+ */
+@Data
+public class CRMDaogouBindListResponse implements Serializable {
+    private String  dgName	;//瀵艰喘鍚嶇О
+    private String   dgPhone	;//瀵艰喘鎵嬫満鍙风爜
+    private String  orgName	;//缁勭粐鍚嶇О
+    private String  userName;//	鐢ㄦ埛鐧诲綍璐﹀彿
+    private String  userId	;//鐢ㄦ埛id涓婚敭
+    private String  productCodeName;//	浜у搧鍚嶇О
+    private String customerPhone;//	瀹㈡埛濮撳悕
+    private String customerName;//	瀹㈡埛鎵嬫満鍙�
+    private String  address	;//鍦板潃璇︽儏
+    private String  creationDate	;//鏃堕棿 yyyy-MM-dd
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java
index 18a7efb..d0bb084 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java
@@ -1,5 +1,6 @@
 package com.doumee.biz.zbom.model.zhongtai;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 
@@ -11,8 +12,13 @@
     /**
      * 鐖剁骇缂栫爜
      */
+
+    @ApiModelProperty(value = "C绔紶鈥淐USTOMER鈥�, B绔紶'BUSINESS")
     private String userType;
+    @ApiModelProperty(value = "token" , hidden = true)
     private String token;
-    private String openid;
+    private String openId;
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭" , hidden = true)
+    private String userId;
 
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBindCusFavoriteDoRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBindCusFavoriteDoRequest.java
new file mode 100644
index 0000000..22e0c3e
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBindCusFavoriteDoRequest.java
@@ -0,0 +1,27 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 鐢ㄦ埛鏀惰棌銆佹祻瑙堛�佺偣璧炪�佸垎浜�+1
+ */
+@Data
+public class ZTBindCusFavoriteDoRequest extends  ZTBaseRequst {
+    /**
+     * 鍐呭ID鍒楄〃
+     */
+    private List<String> articleIds;
+    /**
+     * 鐢ㄦ埛ID
+     */
+//    private String userId;
+    /**
+     * OpenID
+     */
+    private String openId;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java
index 37e7fcb..635baa1 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java
@@ -1,5 +1,6 @@
 package com.doumee.biz.zbom.model.zhongtai;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 
@@ -10,7 +11,9 @@
 public class ZTCatalogListRequest  extends  ZTBaseRequst{
     /**
      * 鐩綍鍞竴缂栫爜,缂栫爜涓虹┖锛屽垯杩斿洖鍏ㄩ儴涓�绾х洰褰�
+     *
      */
+    @ApiModelProperty(value = "蹇楄瑁呬慨 zb_deco 浜у搧 product_intro 璧勮product_info 鍏ㄥ眿妗堜緥 whole_case",notes = "http://api.dev.zbom.7zcloud.com/content/api/catalog")
     private String catalogCode;
 
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java
index 6c76b7e..abedc76 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java
@@ -4,15 +4,32 @@
 
     public static  String PLATFORM_MP_WX = "mp-weixin";//灏忕▼搴忓钩鍙�
     public static  String PLATFORM_WEBPAD = "web-pad";//PAD绔�
-    public static  String CODE_SUCCESS = "200";//鎺ュ彛鎴愬姛杩斿洖鐮�
+    public static  Integer CODE_SUCCESS = 200;//鎺ュ彛鎴愬姛杩斿洖鐮�
     public static  String HEADER_USERTYPE = "userType";//userType鍦℉EADER涓殑鍚嶅瓧
     public static  String HEADER_TOKEN = "token";//token
     public static  String DEFAULT_PID = "1";//榛樿鐪佸競鍖簆id=1琛ㄧず鍙栧叏涓浗
+
+    /**
+     * 鍒嗙被code
+     * 涓�绱歝ode锛堝織璇磋淇� zb_deco 浜у搧 product_intro 璧勮product_info 鍏ㄥ眿妗堜緥 whole_case锛�
+     * 鑰虫満绱歝ode锛堝織璇磋淇細 鍏ㄥ眿璁捐 zb_deco_qwsj 鍘ㄦ埧璁捐 zb_deco_cfsj 鏀剁撼璁捐 zb_deco_snsj 瀹剁殑iD zb_deco_jdid锛�
+     */
+    public interface CatalogCode{
+        String ZHISHUO_ZHUANGXIU ="zb_deco";
+        String CHANPING ="product_intro";
+        String ZIXUN ="product_info";
+        String QW_CASE ="whole_case";
+        String QW_SHEJI ="zb_deco_qwsj";
+        String CHUFANGSHEJI ="zb_deco_cfsj";
+        String SHOUNASHEJI ="zb_deco_snsj";
+        String JIADE_ID ="zb_deco_jdid";
+    }
     public interface IntegerUrl{
         String USER_UPDATE_URL ="customer/api/sync";
         String USER_GET_TOKEN_URL ="/customer/api/login";
         String USER_LOGOUT_URL ="/customer/api/disable";
         String CATALOG_LIST_URL ="/content/api/catalog";
+        String TAG_LIST_URL ="/content/api/tag";
         String CONTENT_LIST_URL ="/content/api/page";
         String CONTENT_INFO_URL ="/content/api/detail/";
         String COLLECT_DO_URL ="/content/api/collect";
@@ -22,12 +39,16 @@
         String COLLECT_LIST_URL ="/behavior/getFavorite";
         String LIKE_LIST_URL ="/behavior/getLike";
         String AREA_LIST_URL ="/base/admin/bAreaRegion/getChildren";
+        String BIND_CUSTOMER_FAVORITES_URL ="/behavior/api/bindCustomerFavorites";
+        String CUSTOMER_FAVORITES_LIST_URL ="/behavior/api/customerFavorites";
+        String BEHAVIOR_LIST_URL ="/behavior/api/customerBehaviors";
     }
     public interface IntegerName{
         String USER_UPDATE_NAME ="鐢ㄦ埛淇℃伅鍚屾";
         String USER_GET_TOKEN_NAME  ="鐢ㄦ埛鐧婚檰";
         String USER_LOGOUT_NAME  ="娉ㄩ攢鐢ㄦ埛";
-        String CATALOG_LIST_NAME  ="鑾峰彇鍒嗙被鍜屽垎绫讳笅鐨勬爣绛�";
+        String CATALOG_LIST_NAME  ="鏍规嵁涓�绾ode鑾峰彇涓嬬骇鍒嗙被淇℃伅";
+        String TAG_LIST_NAME  ="鏍规嵁鍒嗙被code鑾峰彇鏍囩淇℃伅";
         String CONTENT_LIST_NAME  ="鑾峰彇鍐呭鍒楄〃鍒嗛〉";
         String CONTENT_INFO_NAME  ="鑾峰彇鍐呭璇︽儏";
         String COLLECT_DO_NAME  ="鍐呭鏀惰棌";
@@ -37,5 +58,8 @@
         String COLLECT_LIST_NAME  ="鑾峰彇鎴戠殑鏀惰棌鍒楄〃鍒嗛〉";
         String LIKE_LIST_NAME  ="鑾峰彇鎴戠殑鍠滄鍒楄〃鍒嗛〉";
         String AREA_LIST_NAME  ="鑾峰彇鐪佸競鍖洪泦鍚�";
+        String BIND_CUSTOMER_FAVORITES_NAME  ="缁戝畾瀹㈡埛鍠滄";
+        String CUSTOMER_FAVORITES_LIST_NAME  ="鑾峰彇瀹㈡埛鍠滄";
+        String BEHAVIOR_LIST_NAME  ="鑾峰彇琛屼负杞ㄨ抗";
     }
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java
index 85a8669..003c8f6 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java
@@ -9,8 +9,8 @@
 @Data
 public class ZTContentInfoRequest  extends  ZTBaseRequst{
     /**
-     * 涓存椂绁ㄦ嵁
+     * 鍐呭涓婚敭
      */
-    private String articleId;
+    private String id;
 
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java
index c362b62..f161c97 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java
@@ -1,44 +1,38 @@
 package com.doumee.biz.zbom.model.zhongtai;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.List;
 
 
-/**
- * 鐢ㄦ埛閫�鍑�
- */
 @Data
 public class ZTContentListRequest extends ZTBaseRequst {
-    /**
-     * 鐩綍鍞竴缂栫爜锛岀洰褰曞敮涓�缂栫爜
-     */
+    @ApiModelProperty(value = "鍒嗙被缂栫爜")
     private String catalogCode;
-    /**
-     * 鏄惁缃《锛岄粯璁alse
-     */
+
+    @ApiModelProperty(value = " 鏄惁缃《锛岄粯璁alse" , hidden = true)
     private Boolean isTop;
-    /**
-     * 褰撳墠椤�
-     */
+
+    @ApiModelProperty(value = "褰撳墠椤�")
     private String pageNum;
-    /**
-     * 姣忛〉鏉℃暟
-     */
+
+    @ApiModelProperty(value = "姣忛〉鏉℃暟")
     private String pageSize;
-    /**
-     * 鎼滅储鍏抽敭瀛楋紝鏍规嵁鏍囬鎼滅储鍏抽敭瀛�
-     */
+
+    @ApiModelProperty(value = "鎼滅储鍏抽敭瀛�")
     private String search;
-    /**
-     * 鎺掑簭鏂瑰紡锛孨ORMAL - 榛樿
-     * HOT - 鏈�鐑�
-     * LATEST - 鏈�鏂�
-     */
+
+    @ApiModelProperty(value = "鍐呭鏌ヨ鏉′欢")
+    private String query;
+
+    @ApiModelProperty(value = "鏍囩")
+    private String tagCodes;
+
+    @ApiModelProperty(value = "鎺掑簭鏂瑰紡 NORMAL - 榛樿锛汬OT - 鏈�鐑紱LATEST - 鏈�鏂帮紱")
     private String sortType;
-    /**
-     * 澶氫釜鏍囩鍞竴缂栫爜鐨勫垪琛紝澶氫釜鏍囩鍞竴缂栫爜鐨勫垪琛�
-     */
+
+    @ApiModelProperty(value = "澶氫釜鏍囩鍞竴缂栫爜鐨勫垪琛紝澶氫釜鏍囩鍞竴缂栫爜鐨勫垪琛�",hidden = true)
     private List<String> tagCode;
 
 
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java
index 0f195e7..5736989 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java
@@ -7,6 +7,7 @@
  */
 @Data
 public class ZTUserInfoUpdateRequest  extends  ZTBaseRequst{
+
     /**
      * 鍦板潃锛岀渷甯傚尯鐨勫畬鏁村瓧绗︿覆锛屾瘮濡�"骞夸笢鐪佸箍宸炲競鐧戒簯鍖�"
      */
@@ -20,7 +21,7 @@
      */
     private String appCode;
     /**
-     * 搴旂敤ID锛屽皬绋嬪簭鐨凙ppID 蹇呴渶
+     * 搴旂敤ID锛屽皬绋嬪簭鐨凙ppID
      */
     private String appId;
     /**
@@ -77,7 +78,11 @@
      */
     private String name;
     /**
-     * OpenID锛屽井淇$敤鎴风殑OpenID 蹇呴渶
+     * 鏄电О
+     */
+    private String nickname;
+    /**
+     * OpenID锛屽井淇$敤鎴风殑OpenID
      */
     private String openId;
     /**
@@ -85,7 +90,7 @@
      */
     private String phone;
     /**
-     * 骞冲彴绫诲瀷锛屽皬绋嬪簭浼爉p-weixin锛宲ad绔紶web-pad  蹇呴渶
+     * 骞冲彴绫诲瀷锛屽皬绋嬪簭浼爉p-weixin锛宲ad绔紶web-pad
      */
     private String platform;
     /**
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java
index 52c1541..00838af 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java
@@ -2,6 +2,7 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.Map;
 
 
@@ -9,7 +10,7 @@
  * 鐪佸競鍖鸿鎯呰繑鍥�
  */
 @Data
-public class ZTAreaInfoResponse {
+public class ZTAreaInfoResponse implements Serializable {
     /**
      * id":鈥�11000000000鏃�"
      * pid":"1"
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java
index 441512c..ba905a5 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java
@@ -1,25 +1,31 @@
 package com.doumee.biz.zbom.model.zhongtai.response;
 
+import com.fasterxml.jackson.annotation.JsonAlias;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 @Data
-public class ZTBasePageResponse<T> {
-    /**
-     *  褰撳墠椤�
-     */
-    private double current;
+public class ZTBasePageResponse<T> implements Serializable {
     /**
      * 璁板綍鍒楄〃
      */
+    @JsonAlias(value = {"data","records","userFavoriteList","userBehaviorList","customerFavoritesList"})
     private List<T> records;
     /**
-     * 姣忛〉鏄剧ず鏉℃暟
+     * 褰撳墠椤�
      */
-    private double size;
+    @JsonAlias(value = {"pageCount","pageNum"})
+    private String pageNum;
     /**
-     * 鎬昏褰曟暟
+     * 姣忛〉鏉℃暟
      */
-    private double total;
+    @JsonAlias(value = {"pageSize",})
+    private String pageSize;
+    /**
+     * 鎬绘暟
+     */
+    @JsonAlias(value = {"totalCount","total"})
+    private String total;
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java
index 10a6620..c3a3956 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java
@@ -2,8 +2,10 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 @Data
-public class ZTBaseResponse<T> {
+public class ZTBaseResponse<T> implements Serializable {
     /**
      *鏄惁鎴愬姛,true:鎴愬姛;false:澶辫触
      */
@@ -11,7 +13,7 @@
     /**
      * 娑堟伅鐮�,200:鎴愬姛;鍏朵粬code:澶辫触
      */
-    private String code;
+    private Integer code;
     /**
      * 鎻愮ず娑堟伅
      */
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBehaviorInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBehaviorInfoResponse.java
new file mode 100644
index 0000000..3f353e9
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBehaviorInfoResponse.java
@@ -0,0 +1,38 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 鍐呭鍒嗛〉鍒楄〃杩斿洖鍐呭
+ */
+@Data
+public class ZTBehaviorInfoResponse implements Serializable {
+    /**
+     * 琛屼负绫诲瀷锛宲raise-鐐硅禐锛�
+     * praise_cancel-鐐硅禐鍙栨秷,
+     * collect-鏀惰棌,
+     * collect_cancel-鏀惰棌鍙栨秷,
+     * view-鏌ョ湅,
+     * share-鍒嗕韩,
+     * download-涓嬭浇,
+     * like-鍠滄,
+     * like_cancel-鍙栨秷鍠滄
+     */
+    private String actionType;
+    /**
+     * 鍐呭ID
+     */
+    private String contentId;
+    /**
+     * 鍙戠敓鏃堕棿锛寉yyy-MM-dd HH:mm:ss
+     */
+    private String createTime;
+    /**
+     * 鏍囬
+     */
+    private String title;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java
index 0755f2d..e8511dd 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java
@@ -2,6 +2,7 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 
@@ -9,7 +10,7 @@
  * 鐢ㄦ埛閫�鍑�
  */
 @Data
-public class ZTCatalogInfoResponse {
+public class ZTCatalogInfoResponse implements Serializable {
     /**
      * 鐩綍鍞竴缂栫爜
      */
@@ -41,11 +42,11 @@
     /**
      * 鐩綍鎺掑簭
      */
-    private String sort;
+    private Integer sort;
 
     /**
      * 瀛愮洰褰�
      */
-    private List<ZTCatalogInfoResponse> childCatalog;
+    private List<ZTTagInfoResponse> childTagList;
 
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java
index 03c8568..461cbab 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java
@@ -2,6 +2,7 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 
@@ -9,7 +10,7 @@
  * 鐢ㄦ埛閫�鍑�
  */
 @Data
-public class ZTCatalogTagTypeResponse {
+public class ZTCatalogTagTypeResponse implements Serializable {
     /**
      * 瀛愮洰褰�
      */
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectInfoResponse.java
new file mode 100644
index 0000000..dbd7ab3
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectInfoResponse.java
@@ -0,0 +1,55 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 鍐呭鍒嗛〉鍒楄〃杩斿洖鍐呭
+ */
+@Data
+public class ZTCollectInfoResponse implements Serializable {
+    /**
+     * 鏀惰棌鏁�
+     */
+    private String collectCount;
+    /**
+     * 鍐呭ID
+     */
+    private String contentId;
+    /**
+     * 鍐呭鏍囬
+     */
+    private String contentTitle;
+    /**
+     * 鍐呭灏侀潰
+     */
+    private String coverImage;
+    /**
+     * 鏀惰棌鍒涘缓鏃堕棿
+     */
+    private String createTime;
+    /**
+     * 涓嬭浇鏁�
+     */
+    private String downloadCount;
+    /**
+     * 鍐呭璺宠浆URL锛屾棤璺宠浆鍒欎负绌哄瓧绗︿覆
+     */
+    private String jumpUrl;
+    /**
+     * 鐐硅禐鏁�
+     */
+    private String praiseCount;
+    /**
+     * 鍒嗕韩鏁�
+     */
+    private String shareCount;
+    /**
+     * 鏌ョ湅鏁�
+     */
+    private String viewCount;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java
index f15c7ec..b18f4c2 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java
@@ -2,12 +2,14 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 
 /**
  * 鐢ㄦ埛閫�鍑�
  */
 @Data
-public class ZTCollectResponse {
+public class ZTCollectResponse implements Serializable {
     /**
      * 鏀惰棌绫诲瀷锛屼骇鍝侊紝妗堜緥锛屽疄鏅� 蹇呴渶
      */
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java
index 504177b..cc2cf79 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java
@@ -2,6 +2,7 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.Map;
 
 
@@ -9,7 +10,7 @@
  * 鍐呭璇︽儏杩斿洖
  */
 @Data
-public class ZTContentInfoResponse {
+public class ZTContentInfoResponse  implements Serializable {
     /**
      * 浣滆��
      */
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java
index e783704..9bc6d41 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java
@@ -1,72 +1,90 @@
 package com.doumee.biz.zbom.model.zhongtai.response;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.io.Serializable;
 
 
 /**
  * 鍐呭鍒嗛〉鍒楄〃杩斿洖鍐呭
  */
 @Data
-public class ZTContentListResponse {
+public class ZTContentListResponse implements Serializable {
     /**
      * 浣滆��
      */
+    @ApiModelProperty(value = "浣滆��")
     private String author;
     /**
      * 灏侀潰鍥�
      */
+    @ApiModelProperty(value = "灏侀潰鍥�")
     private String coverImage;
     /**
      * 鏀惰棌閲�
      */
+    @ApiModelProperty(value = "鏀惰棌閲�")
     private double favoriteCount;
     /**
      * 鏂囩珷ID
      */
+    @ApiModelProperty(value = "鏂囩珷ID")
     private String id;
     /**
      * 鏄惁缃《
      */
+    @ApiModelProperty(value = "鏄惁缃《")
     private String isTop;
     /**
      * 璇█缂栫爜
      */
+    @ApiModelProperty(value = "璇█缂栫爜")
     private String langCode;
     /**
      * 鐐硅禐閲�
      */
+    @ApiModelProperty(value = "鐐硅禐閲�")
     private double likeCount;
     /**
      * 鍙戝竷鏃ユ湡
      */
+    @ApiModelProperty(value = "鍙戝竷鏃ユ湡")
     private String publishDate;
     /**
      * 鍙戝竷缁勭粐
      */
+    @ApiModelProperty(value = "鍙戝竷缁勭粐")
     private String publishDepartment;
     /**
      * 闃呰閲�
      */
+    @ApiModelProperty(value = "闃呰閲�")
     private double readCount;
     /**
      * 鎺掑簭
      */
+    @ApiModelProperty(value = "鎺掑簭")
     private String sort;
     /**
      * 瀛愭爣棰�
      */
+    @ApiModelProperty(value = "瀛愭爣棰�")
     private String subtitle;
     /**
      * 鏍囬
      */
+    @ApiModelProperty(value = "鏍囬")
     private String title;
     /**
      * 鏂囩珷绫诲瀷
      */
+    @ApiModelProperty(value = "鏂囩珷绫诲瀷")
     private String type;
     /**
      * 鏂囩珷澶栭摼URL锛岃棰戝拰鍏朵粬璺宠浆閾炬帴绫诲瀷
      */
+    @ApiModelProperty(value = "鏂囩珷澶栭摼URL锛岃棰戝拰鍏朵粬璺宠浆閾炬帴绫诲瀷")
     private String url;
 
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCusFavoritesInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCusFavoritesInfoResponse.java
new file mode 100644
index 0000000..6054903
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCusFavoritesInfoResponse.java
@@ -0,0 +1,31 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTCusFavoritesInfoResponse implements Serializable {
+    /**
+     * 鍐呭ID
+     */
+    private String contentId;
+    /**
+     * 灏侀潰URL
+     */
+    private String cover;
+    /**
+     * 鍠滄鏃堕棿锛寉yyy-MM-dd HH:mm:ss
+     */
+    private String favoriteTime;
+    /**
+     * 鏍囬
+     */
+    private String title;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagChildInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagChildInfoResponse.java
new file mode 100644
index 0000000..91bb89e
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagChildInfoResponse.java
@@ -0,0 +1,31 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ *
+ */
+@Data
+public class ZTTagChildInfoResponse implements Serializable {
+    /**
+     * 鏍囩鍊糃ODE
+     */
+    private String labelValueCode;
+    /**
+     * 鏍囩鍊糏D
+     */
+    private String labelValueId;
+    /**
+     * 鏍囩鍊糔AME
+     */
+    private String labelValueName;
+    /**
+     * 鏍囩鍊兼帓搴�
+     */
+    private String labelValueSort;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagInfoResponse.java
new file mode 100644
index 0000000..dedebe8
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTTagInfoResponse.java
@@ -0,0 +1,36 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTTagInfoResponse implements Serializable {
+    /**
+     * 鏍囩CODE
+     */
+    private String labelCode;
+    /**
+     * 鏍囩ID
+     */
+    private String labelId;
+    /**
+     * 鏍囩NAME
+     */
+    private String labelName;
+    /**
+     * 鏍囩鎺掑簭
+     */
+    private String labelSort;
+
+    /**
+     * 瀛愮洰褰�
+     */
+    private List<ZTTagChildInfoResponse> valueVos;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java
index 4eae486..7c622c8 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java
@@ -2,8 +2,10 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 @Data
-public class ZTUserGetTokenResponse {
+public class ZTUserGetTokenResponse implements Serializable {
     /**
      *鐢ㄦ埛涓存椂绁ㄦ嵁
      */
diff --git a/server/service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java b/server/service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
index e427737..132bfa8 100644
--- a/server/service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
+++ b/server/service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
@@ -49,6 +49,8 @@
     public static final String HEADER_KEY = "token";
     //鍙栧�煎悕绉�
     public static final String UserId_Name = "AppUserId";
+    //鍙栧�煎悕绉�
+    public static final String UserType = "UserType";
     //鍔犲瘑瀵嗛挜
     private final static String jwtSecret = "MhAjU9poLf8ko54K25XBDtonaL33vtt1";
     //杩囨湡鏃堕棿(s) 86400L=1澶� 604800L=7澶�
diff --git a/server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java b/server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
index a5b106c..8fd806c 100644
--- a/server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
+++ b/server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -13,6 +13,7 @@
 import io.jsonwebtoken.JwtException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -40,6 +41,12 @@
 
     @Autowired
     private RedisTemplate<String,Object> redisTemplate;
+
+    /**
+     * 鏄惁寮�鍙戣��
+     */
+    @Value("${debug_model}")
+    private Boolean isDebug;
 
     /**
      * 娣诲姞鎷︽埅鍣�
@@ -111,6 +118,7 @@
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸茬鐢�,璇疯仈绯荤鐞嗗憳");
             }
             request.setAttribute(JwtTokenUtil.UserId_Name, memberId);
+            request.setAttribute(JwtTokenUtil.UserType, Constants.CUSTOMER);
             return true;
         } catch (IllegalArgumentException | JwtException e) {
             throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
@@ -120,6 +128,9 @@
     public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response){
         String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
         try {
+            if(isDebug){
+                return  true;
+            }
             //鍒ゆ柇Token鏄惁瓒呮椂
             boolean expiration = JwtTokenUtil.isTokenExpired(token);
             if (expiration) {
@@ -142,6 +153,7 @@
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸茬鐢�,璇疯仈绯荤鐞嗗憳");
             }
             request.setAttribute(JwtTokenUtil.UserId_Name, userId);
+            request.setAttribute(JwtTokenUtil.UserType, Constants.BUSINESS);
             return true;
         } catch (IllegalArgumentException | JwtException e) {
             throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
diff --git a/server/service/src/main/java/com/doumee/core/utils/Constants.java b/server/service/src/main/java/com/doumee/core/utils/Constants.java
index 7a19d73..4841bbb 100644
--- a/server/service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -38,11 +38,12 @@
     public static final String HK_ROOTORG_CODE ="HK_ROOTORG_CODE" ;
     public static final String HK_ROOTORG_NAME ="HK_ROOTORG_NAME" ;
     public static final String REDIS_TOKEN_KEY = "token_";
-    public static final String CUSTOMER = "CUSTOMER";    
+    public static final String CUSTOMER = "CUSTOMER";
     public static final String BUSINESS = "BUSINESS";
 
 
     //琚嫓璁夸汉淇℃伅鏍¢獙鏂瑰紡锛�0鎵嬫満鍙峰崟鐙牎楠� 1鎵嬫満鍙峰拰濮撳悕缁勫悎鏍¢獙锛�
+    public static final String ZBOM_CRM_AUTH_API_KEY = "ZBOM_CRM_AUTH_API_KEY";
     public static final String BEVISITED_USER_VALID = "BEVISITED_USER_VALID";
     public static final String LW_BEVISITED_USER_VALID = "LW_BEVISITED_USER_VALID";
     public static final String SELECT_DOORS_VISIT_REQUIRED = "SELECT_DOORS_VISIT_REQUIRED";
@@ -92,6 +93,9 @@
     public static final String ZBOM = "ZBOM" ;
     public static final String ZBOM_IAM_APPKEY = "ZBOM_IAM_APPKEY";
     public static final String ZBOM_IAM_APPID = "ZBOM_IAM_APPID";
+    public static final String USER_CARD_HEADER_IMG ="USER_CARD_HEADER_IMG" ;
+    public static final String USER_CARD_PHONE_IMG ="USER_CARD_PHONE_IMG" ;
+    public static final String USER_CARD_ADDR_IMG ="USER_CARD_ADDR_IMG" ;
 
     public static Integer parseIntByStr(String idtOrgStatus) {
         try {
@@ -308,6 +312,8 @@
     public static final String ACCESS_KEY = "ACCESS_KEY";
     public static final String ENDPOINT = "ENDPOINT";
     public static final String RESOURCE_PATH = "RESOURCE_PATH";
+    public static final String WEIXIN_DEFAULT_IMGS = "WEIXIN_DEFAULT_IMGS";
+    public static final String USER_CARD_DEFAULT_IMG = "USER_CARD_DEFAULT_IMG";
     public static final String USERS_FILE = "USERS_FILE";
     public static final String NEWS_FILE = "NEWS_FILE";
     //鍙戦�佷細璁紑濮�  瀹氭椂鎻愬墠澶氬皯鍒嗛挓鍙戦��
@@ -326,6 +332,7 @@
     public static final String WX_PLATFORM = "WX_PLATFORM";
     public static final String ZBOM_ZHONGTAI_API_URL = "ZBOM_ZHONGTAI_API_URL";
     public static final String WX_PLATFORM_ACCESS_TOKEN = "WX_PLATFORM_ACCESS_TOKEN";
+    public static final String ZBOM_ENCODE_URL = "ZBOM_ENCODE_URL";
     public static final String WX_PLATFORM_APPID = "WX_PLATFORM_APPID";
     public static final String WX_PLATFORM_SECRET = "WX_PLATFORM_SECRET";
     public static final String WX_PLATFORM_AUDIT_VISIT = "WX_PLATFORM_AUDIT_VISIT";
@@ -345,28 +352,15 @@
     public static final String WX_SECRET_PERSONNEL = "WX_SECRET_PERSONNEL";
 
 
-    public interface CrmSources{
-
-
-       String SOURCE_DKXD = "DKXD";// 浠e涓嬪崟(DKXD)
-       String SOURCE_LYSJ = "LYSJ";// 闆跺厓璁捐(LYSJ)
-       String SOURCE_ZBSJSQ = "ZBSJSQ";// 蹇楅偊璁捐鐢宠(ZBSJSQ)
-       String SOURCE_ZBDXFX = "ZBDXFX";// 蹇楅偊鐭俊鍒嗕韩(ZBDXFX)
-       String SOURCE_ZBLLJL = "ZBLLJL";// 蹇楅偊娴忚璁板綍鍒嗕韩(ZBLLJL)
-       String SOURCE_ZBWDSC = "ZBWDSC";// 蹇楅偊鎴戠殑鏀惰棌鍒嗕韩(ZBWDSC)
-       String SOURCE_ZBLYSJ = "ZBLYSJ";// 蹇楅偊闆跺厓璁捐(ZBLYSJ)
-       String SOURCE_ZBLDX = "ZBLDX";// 蹇楅偊鑰佸甫鏂�(ZBLDX)
-       String SOURCE_ZBFGCS = "ZBFGCS";// 蹇楅偊椋庢牸娴嬭瘯(ZBFGCS)
-       String SOURCE_ZBJX = "DSLX22";// 蹇楅偊瀹堕��(ZBJX)
-    }
-
     public interface RedisKeys {
        String IMPORTING_MEMBER ="IMPORTING_MEMBER";
        String IMPORTING_SHOP ="IMPORTING_SHOP";
        String IMPORTING_USERS ="IMPORTING_USERS";
        String IAM_APPID ="IAM_APPID";
        String ZBOM_CRM_API_KEY ="ZBOM_CRM_API_KEY";
+       String ZBOM_CRM_AUTH_API_KEY ="ZBOM_CRM_AUTH_API_KEY";
        String ZBOM_CRM_API_URL ="ZBOM_CRM_API_URL";
+       String ZBOM_ENCODE_URL ="ZBOM_ENCODE_URL";
        String ZBOM_SMS_API_KEY ="ZBOM_SMS_API_KEY";
        String ZBOM_ZHONGTAI_API_URL ="ZBOM_ZHONGTAI_API_URL";
        String ZBOM_SMS_API_URL ="ZBOM_SMS_API_URL";
diff --git a/server/service/src/main/java/com/doumee/core/utils/DateUtil.java b/server/service/src/main/java/com/doumee/core/utils/DateUtil.java
index 2ccb323..ab78baa 100644
--- a/server/service/src/main/java/com/doumee/core/utils/DateUtil.java
+++ b/server/service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -356,7 +356,7 @@
      * @return String
      * @throws Exception
      */
-    public static String getNowShortDate() throws Exception {
+    public static String getNowShortDate() {
         String nowDate = "";
         try {
             java.sql.Date date = null;
@@ -364,7 +364,7 @@
             nowDate = sdfShort.format(date);
             return nowDate;
         } catch (Exception e) {
-            throw e;
+           return  "";
         }
     }
 
diff --git a/server/service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java b/server/service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java
index 8a443f0..c467fde 100644
--- a/server/service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java
+++ b/server/service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java
@@ -4,6 +4,7 @@
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.MediaType;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
@@ -43,8 +44,8 @@
         System.out.println("缁撴潫锛�" + (System.currentTimeMillis() - starttime) / 1000);
     }
 
-    private static final int width = 898;
-    private static final int height = 1308;
+    private static final int width = 750;
+    private static final int height = 1140;
 
     /**
      * 鐢熸垚鍒嗕韩鍥剧墖
@@ -133,9 +134,7 @@
         g2.drawRect(0, 0, width - 1, height - 1);
         InputStream inputStream = bufferedImageToInputStream(bi);
         return inputStream;
-//        String fileName = "8701EAC36DEC405A94C530F0E6796589.jpg"; //ID.nextGUID() + ".jpg";
-//        GeneratePicUtil.saveFile(inputStream, filePath+ File.separator+fileName);
-//        return filePath + File.separator+ fileName;
+
     }
 
     public  static MultipartFile getMultipartFile(InputStream inputStream, String fileName) {
@@ -197,7 +196,7 @@
         }
     }
 
-    public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage) throws IOException {
+    public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage) {
         return bufferedImageToInputStream(backgroundImage, "jpg");
     }
 
@@ -209,7 +208,7 @@
      * @return
      * @throws IOException
      */
-    public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage, String format) throws IOException {
+    public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage, String format)  {
         ByteArrayOutputStream bs = new ByteArrayOutputStream();
         try (
                 ImageOutputStream
@@ -217,6 +216,8 @@
             ImageIO.write(backgroundImage, format, imOut);
             InputStream is = new ByteArrayInputStream(bs.toByteArray());
             return is;
+        }catch (Exception e){
+            return null;
         }
     }
 
@@ -267,8 +268,83 @@
         }
         return resMatrix;
     }
+    public static InputStream generateUserCardImg(String imgurl, String qrcode, String name,String type, String phone, String shopaddr, String shopname,String phoneIcon,String addrIcon)  {
 
+        BufferedImage bi =  new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        //寰楀埌瀹冪殑缁樺埗鐜(杩欏紶鍥剧墖鐨勭瑪)
+        Graphics2D g2 = (Graphics2D) bi.getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.fillRect(0, 0, width, height);
+        //鑳屾櫙鍥剧墖
+        BufferedImage img1 =getImgIO(imgurl);
+        if(img1!=null){
+            g2.drawImage(img1, 0, 0, 750, 700, null);
+        }else{
+            g2.setColor(new Color(102, 102, 102, 1));
+            g2.drawRect( 0, 0, 750, 700);
+        }
 
+        //鍟嗗搧鍚嶇О
+        if(name.length()>5){
+            name = name.substring(0,5)+"...";
+        }
+        g2.setColor(Color.black);
+        g2.setFont(new Font("榛戜綋", Font.PLAIN, 40));
+        g2.drawString(name, 40, 990-242);
 
+        int w = 40+ name.length()*40;
+        g2.setColor(Color.GRAY);
+        g2.setFont(new Font("榛戜綋", Font.PLAIN, 30));
+        g2.drawString(type, w, 990-242);
+        if(StringUtils.isNotBlank(qrcode)){
+            //涓汉浜岀淮鐮�
+            BufferedImage img2 = getImgIO(qrcode);
+            if(img2!=null){
+                g2.drawImage(img2, 522, 982-242, 188, 188, null);
+            }
 
+            g2.setColor(Color.GRAY);
+            g2.setFont(new Font("榛戜綋", Font.PLAIN, 24));
+            g2.drawString("鎵爜娣诲姞濂藉弸", 544, 1186-242);
+        }
+        //鎵嬫満鍙�
+        BufferedImage img4 = getImgIO(phoneIcon);
+        if(img4!=null){
+            g2.drawImage(img4, 40, 1072-28-242, 34, 36, null);
+        }
+        g2.setColor(Color.GRAY);
+        g2.setFont(new Font("榛戜綋", Font.PLAIN, 30));
+        g2.drawString(phone, 94, 1072-242);
+
+        BufferedImage img3 = getImgIO(addrIcon);
+        if(img3!=null){
+            g2.drawImage(img3, 40, 1142-28-242, 34, 36, null);
+        }
+        if(shopaddr.length()>12){
+            shopaddr = shopaddr.substring(0,12)+"\n"+shopaddr.substring(12);
+        }
+        //鍦板潃
+        g2.setColor(Color.GRAY);
+        g2.setFont(new Font("榛戜綋", Font.PLAIN, 30));
+        g2.drawString(shopaddr, 94, 1142-242);
+
+        //搴曢儴
+        if(shopname.length()>15){
+            shopname = shopname.substring(0,15)+"...";
+        }
+        g2.setColor(Color.GRAY);
+        g2.setFont(new Font("榛戜綋", Font.PLAIN, 30));
+        g2.drawString(shopname, 180, 1300-242);
+
+        InputStream inputStream = bufferedImageToInputStream(bi);
+        return inputStream;
+    }
+
+    private static BufferedImage getImgIO(String imgurl) {
+        try {
+        return     ImageIO.read(new URL(imgurl));
+        }catch (Exception e){
+
+        }return null;
+    }
 }
diff --git a/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java b/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java
index 46015fb..2d2d4f2 100644
--- a/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java
+++ b/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -22,6 +22,13 @@
     public static String post(String url, String data, String contentType, boolean ignoreSSL) {
         return connection(url, "POST", data, contentType, ignoreSSL,null);
     }
+    public static String sendGet(String url) {
+        if(url.startsWith("https://")){
+            return connection(url, "GET", "", "text/plain; charset=utf-8", true,null);
+        }else{
+            return connectionHttp(url, "GET", "", "text/plain; charset=utf-8",null);
+        }
+    }
     public static String postJson(String url, String data) {
         if(url.startsWith("https://")){
             return connection(url, "POST", data, "application/json", true,null);
diff --git a/server/service/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java b/server/service/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java
index cb8a032..16cbafd 100644
--- a/server/service/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java
+++ b/server/service/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java
@@ -9,14 +9,19 @@
 import com.amazonaws.services.s3.AmazonS3;
 import com.amazonaws.services.s3.AmazonS3ClientBuilder;
 import com.amazonaws.services.s3.model.*;
+import com.doumee.core.oss.FileContent;
+import com.doumee.core.oss.FileModel;
 import com.doumee.core.utils.FileDigest;
 
 import java.io.*;
 import java.net.URL;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import com.doumee.core.utils.ID;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
diff --git a/server/service/src/main/java/com/doumee/dao/business/CustomerUserMapper.java b/server/service/src/main/java/com/doumee/dao/business/CustomerUserMapper.java
new file mode 100644
index 0000000..1b8830f
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/business/CustomerUserMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.CustomerUser;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/07/15 10:21
+ */
+public interface CustomerUserMapper extends MPJJoinMapper<CustomerUser> {
+
+}
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/CustomerUser.java b/server/service/src/main/java/com/doumee/dao/business/model/CustomerUser.java
new file mode 100644
index 0000000..910efeb
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/business/model/CustomerUser.java
@@ -0,0 +1,115 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 瀹㈡埛瀵艰喘鍏宠仈琛�
+ * @author 姹熻箘韫�
+ * @date 2024/07/15 10:21
+ */
+@Data
+@ApiModel("瀹㈡埛瀵艰喘鍏宠仈琛�")
+@TableName("`customer_user`")
+public class CustomerUser {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "缂栫爜", example = "1")
+    @ExcelColumn(name="缂栫爜")
+    private Long id;
+
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�", example = "1")
+    @ExcelColumn(name="鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "缂栬緫鏃堕棿")
+    @ExcelColumn(name="缂栬緫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "缂栬緫浜轰唬鐮�", example = "1")
+    @ExcelColumn(name="缂栬緫浜轰唬鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "瀹㈡埛鎵嬫満鍙�")
+    @ExcelColumn(name="瀹㈡埛鎵嬫満鍙�")
+    private String customerPhone;
+    @ApiModelProperty(value = "瀹㈡埛濮撳悕")
+    @ExcelColumn(name="瀹㈡埛濮撳悕")
+    private String customerName;
+    @ApiModelProperty(value = "瀵艰喘鎵嬫満鍙�")
+    @ExcelColumn(name="瀵艰喘鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String info;
+
+    @ApiModelProperty(value = "瀵艰喘缂栫爜锛堝叧鑱攗sers琛級", example = "1")
+    @ExcelColumn(name="瀵艰喘缂栫爜锛堝叧鑱攗sers琛級")
+    private Long userId;
+
+    @ApiModelProperty(value = "瀵艰喘IAM缂栫爜")
+    @ExcelColumn(name="瀵艰喘IAM缂栫爜")
+    private String iamUserId;
+
+    @ApiModelProperty(value = "鐢ㄦ埛缂栫爜锛堝叧鑱攎ember琛級", example = "1")
+    @ExcelColumn(name="鐢ㄦ埛缂栫爜锛堝叧鑱攎ember琛級")
+    private Long memberId;
+
+    @ApiModelProperty(value = "瀵艰喘濮撳悕")
+    @ExcelColumn(name="瀵艰喘濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "瀵艰喘缁勭粐鍚嶇О")
+    @ExcelColumn(name="瀵艰喘缁勭粐鍚嶇О")
+    private String orgName;
+
+    @ApiModelProperty(value = "瀵艰喘鐧婚檰璐﹀彿")
+    @ExcelColumn(name="瀵艰喘鐧婚檰璐﹀彿")
+    private String username;
+
+    @ApiModelProperty(value = "浜у搧鍚嶇О")
+    @ExcelColumn(name="浜у搧鍚嶇О")
+    private String productCodeName;
+
+    @ApiModelProperty(value = "鍦板潃璇︽儏")
+    @ExcelColumn(name="鍦板潃璇︽儏")
+    private String addr;
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡")
+    @ExcelColumn(name="鍒涘缓鏃ユ湡")
+    private String  creationDate	;//鏃堕棿 yyyy-MM-dd
+
+    @ApiModelProperty(value = "鏉ユ簮 0灏忕▼搴� 1涓彴", example = "1")
+    @ExcelColumn(name="鏉ユ簮 0灏忕▼搴� 1涓彴")
+    private Integer source;
+    @ApiModelProperty(value = "涓彴鎻愪氦鐘舵�� 0鏈彁浜� 1宸叉彁浜� 2鎻愪氦澶辫触", example = "1")
+    @ExcelColumn(name="涓彴鎻愪氦鐘舵�� 0鏈彁浜� 1宸叉彁浜� 2鎻愪氦澶辫触")
+    private Integer ztStatus;
+
+    @ApiModelProperty(value = "涓彴鎻愪氦鏃堕棿")
+    @ExcelColumn(name="涓彴鎻愪氦鏃堕棿")
+    private Date ztDate;
+
+    @ApiModelProperty(value = "涓彴鎻愪氦澶囨敞")
+    @ExcelColumn(name="涓彴鎻愪氦澶囨敞")
+    private String ztInfo;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Shop.java b/server/service/src/main/java/com/doumee/dao/business/model/Shop.java
index c58df25..ce9b58c 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Shop.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -9,6 +9,8 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -120,7 +122,7 @@
     @ApiModelProperty(value = "鎵�灞炲叧鑱擲鐮�", example = "1")
     @ExcelColumn(name="鎵�灞炲叧鑱擲鐮�")
     private String scode;
-    @ApiModelProperty(value = "娉ㄥ唽鍦�" )
+    @ApiModelProperty(value = "娉ㄥ唽鍦�(IAM)" )
     @ExcelColumn(name="娉ㄥ唽鍦�")
     private String regAddr;
     @ApiModelProperty(value = "娉曚汉韬唤璇佸彿" )
@@ -188,6 +190,19 @@
     @ApiModelProperty(value = "閮ㄩ棬绾у埆璺緞", example = "1")
     @ExcelColumn(name="閮ㄩ棬绾у埆璺緞")
     private String namePath;
+
+    @ApiModelProperty(value = "缁忓害", example = "1")
+    @ExcelColumn(name="缁忓害")
+    private BigDecimal longitude;
+
+    @ApiModelProperty(value = "绾害", example = "1")
+    @ExcelColumn(name="绾害")
+    private BigDecimal latitude;
+
+    @ApiModelProperty(value = "鍦板潃")
+    @ExcelColumn(name="鍦板潃")
+    private String address;
+
     @ApiModelProperty(value = "鐖剁骇閮ㄩ棬绾у埆璺緞", example = "1")
     @TableField(exist = false)
     private String parentIdPath;
@@ -215,4 +230,13 @@
     @ApiModelProperty(value = "涓嬬骇閮ㄩ棬闆嗗悎", example = "1")
     @TableField(exist = false)
     private List<Shop> childList;
+
+    @ApiModelProperty(value = "璺濈 ", example = "1")
+    @TableField(exist = false)
+    private BigDecimal distance;
+
+    @ApiModelProperty(value = "闂ㄥ簵瀵艰喘鍒楄〃 ", example = "1")
+    @TableField(exist = false)
+    private List<Users> usersList;
+
 }
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Users.java b/server/service/src/main/java/com/doumee/dao/business/model/Users.java
index 54c9563..962847e 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Users.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Users.java
@@ -134,8 +134,8 @@
     @ExcelColumn(name="鏈嶅姟瀹㈡埛鏁�")
     private Integer costomerNum;
 
-    @ApiModelProperty(value = "浠庝笟骞存湀(yyyy-MM)")
-    @ExcelColumn(name="浠庝笟骞存湀(yyyy-MM)")
+    @ApiModelProperty(value = "浠庝笟骞翠唤")
+    @ExcelColumn(name="浠庝笟骞存湀")
     private String jobDate;
 
     @ApiModelProperty(value = "瀹d紶璇�")
@@ -145,6 +145,18 @@
     @ApiModelProperty(value = "涓汉浜岀淮鐮佸浘鐗囧湴鍧�")
     @ExcelColumn(name="涓汉浜岀淮鐮佸浘鐗囧湴鍧�")
     private String qrcodeImg;
+
+    @ApiModelProperty(value = "浼佷笟浜岀淮鐮佸浘鐗囧湴鍧�")
+    @ExcelColumn(name="浼佷笟浜岀淮鐮佸浘鐗囧湴鍧�")
+    private String companyQrcodeImg;
+
+    @ApiModelProperty(value = "涓彴涓存椂绁ㄦ嵁杩囨湡鏃堕棿")
+    @ExcelColumn(name="涓彴涓存椂绁ㄦ嵁杩囨湡鏃堕棿")
+    private Date tokenDate;
+
+    @ApiModelProperty(value = "涓彴涓存椂绁ㄦ嵁")
+    @ExcelColumn(name="涓彴涓存椂绁ㄦ嵁")
+    private String token;
 
     @ApiModelProperty(value = "閭")
     @ExcelColumn(name="閭")
@@ -179,7 +191,15 @@
     @ApiModelProperty(value = "瀹屾暣澶村儚褰�")
     @TableField(exist = false)
     private String imgurlFull;
-    @ApiModelProperty(value = "涓汉浜岀淮鐮佸浘鐗囧湴鍧�")
+    @ApiModelProperty(value = "涓汉浜岀淮鐮佸浘鐗囧畬鏁村湴鍧�")
     @TableField(exist = false)
     private String qrcodeImgFull;
+    @ApiModelProperty(value = "闂ㄥ簵鍦板潃")
+    @TableField(exist = false)
+    private String shopAddress;
+
+    @ApiModelProperty(value = "浼佷笟浜岀淮鐮佸浘鐗囧畬鏁村湴鍧�")
+    @TableField(exist = false)
+    private String companyQrcodeImgFull;
+
 }
diff --git a/server/service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java b/server/service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java
index e0191a9..53331b5 100644
--- a/server/service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java
+++ b/server/service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java
@@ -1,5 +1,7 @@
 package com.doumee.dao.timer.scheduler;
 
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
 import com.doumee.dao.timer.entity.JobState;
 import com.doumee.dao.timer.entity.QuartzJob;
 import org.quartz.*;
@@ -142,7 +144,7 @@
                 this.scheduler.pauseJob(getJobKey(quartzJob.getId()));
             }
         } catch (SchedulerException e){
-            throw new RuntimeException("pauseJob Fail",e) ;
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"pauseJob Fail",e) ;
         }
     }
 
diff --git a/server/service/src/main/java/com/doumee/dao/web/reqeust/ShopQueryByLLDTO.java b/server/service/src/main/java/com/doumee/dao/web/reqeust/ShopQueryByLLDTO.java
new file mode 100644
index 0000000..756b2f4
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/web/reqeust/ShopQueryByLLDTO.java
@@ -0,0 +1,21 @@
+package com.doumee.dao.web.reqeust;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/12/7 11:19
+ */
+@Data
+public class ShopQueryByLLDTO {
+
+    @ApiModelProperty(value = "缁忓害")
+    private String longitude;
+
+    @ApiModelProperty(value = "绾害")
+    private String latitude;
+
+}
diff --git a/server/service/src/main/java/com/doumee/dao/web/response/ZSZXCatalogResponse.java b/server/service/src/main/java/com/doumee/dao/web/response/ZSZXCatalogResponse.java
new file mode 100644
index 0000000..86311b3
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/web/response/ZSZXCatalogResponse.java
@@ -0,0 +1,31 @@
+package com.doumee.dao.web.response;
+
+import com.doumee.biz.zbom.model.zhongtai.response.ZTCatalogInfoResponse;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Users;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/3/23 9:25
+ */
+@Data
+@ApiModel("蹇楄瑁呬慨棣栭〉鍥涗釜妯″潡瀵硅薄")
+public class ZSZXCatalogResponse implements Serializable {
+
+    @ApiModelProperty(value = "瀹剁殑ID")
+    private ZTCatalogInfoResponse jdId;
+    @ApiModelProperty(value = "鏀剁撼璁捐")
+    private ZTCatalogInfoResponse snsj;
+    @ApiModelProperty(value = "鍘ㄦ埧璁捐")
+    private ZTCatalogInfoResponse cfsj;
+    @ApiModelProperty(value = "鍏ㄥ眿璁捐")
+    private ZTCatalogInfoResponse qwsj;
+
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/CustomerUserService.java b/server/service/src/main/java/com/doumee/service/business/CustomerUserService.java
new file mode 100644
index 0000000..d3b2aca
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/service/business/CustomerUserService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.CustomerUser;
+import java.util.List;
+
+/**
+ * 瀹㈡埛瀵艰喘鍏宠仈琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/07/15 10:21
+ */
+public interface CustomerUserService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param customerUser 瀹炰綋瀵硅薄
+     * @return Long
+     */
+    Long create(CustomerUser customerUser);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Long id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param customerUser 瀹炰綋瀵硅薄
+     */
+    void delete(CustomerUser customerUser);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Long> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param customerUser 瀹炰綋瀵硅薄
+     */
+    void updateById(CustomerUser customerUser);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param customerUsers 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<CustomerUser> customerUsers);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return CustomerUser
+     */
+    CustomerUser findById(Long id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param customerUser 瀹炰綋瀵硅薄
+     * @return CustomerUser
+     */
+    CustomerUser findOne(CustomerUser customerUser);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param customerUser 瀹炰綋瀵硅薄
+     * @return List<CustomerUser>
+     */
+    List<CustomerUser> findList(CustomerUser customerUser);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<CustomerUser>
+     */
+    PageData<CustomerUser> findPage(PageWrap<CustomerUser> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param customerUser 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(CustomerUser customerUser);
+
+    void syncYesterday(String date);
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/GetZhongTaiDataService.java b/server/service/src/main/java/com/doumee/service/business/GetZhongTaiDataService.java
new file mode 100644
index 0000000..dd08ae9
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/service/business/GetZhongTaiDataService.java
@@ -0,0 +1,52 @@
+package com.doumee.service.business;
+
+import com.doumee.biz.zbom.model.zhongtai.ZTCatalogListRequest;
+import com.doumee.biz.zbom.model.zhongtai.ZTContentListRequest;
+import com.doumee.biz.zbom.model.zhongtai.response.*;
+
+import java.util.List;
+
+/**
+ * 鐢ㄦ埛琛屼负鏁版嵁淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/07/04 14:40
+ */
+public interface GetZhongTaiDataService {
+
+    /**
+     * 鍒嗙被鏁版嵁
+     * @param param
+     * @return
+     */
+    List<ZTCatalogInfoResponse> getCatalogList(ZTCatalogListRequest param);
+
+    /**
+     * 鏍囩鏁版嵁
+     * @param param
+     * @return
+     */
+    List<ZTTagInfoResponse> getCataLogTagList(ZTCatalogListRequest param);
+
+    /**
+     * 鐖跺瓙绾у垎绫绘暟鎹�  鍒嗙被+鏍囩
+     * @param ztCatalogListRequest
+     * @return
+     */
+    List<ZTCatalogInfoResponse> getZTCatalogInfoResponse(ZTCatalogListRequest ztCatalogListRequest);
+
+    /**
+     * 鍐呭鍒嗛〉
+     * @param ztContentListRequest
+     * @return
+     */
+    ZTBasePageResponse<ZTContentListResponse> pageContentList(ZTContentListRequest ztContentListRequest);
+
+    /**
+     * 鍐呭璇︽儏
+     * @param id  涓氬姟涓婚敭
+     * @param userType 鐢ㄦ埛绫诲瀷
+     * @param userId 鐢ㄦ埛涓婚敭
+     * @return
+     */
+    ZTContentInfoResponse getContentInfo(String id, String userType, Long userId);
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/InitService.java b/server/service/src/main/java/com/doumee/service/business/InitService.java
index d05de5d..3ac4288 100644
--- a/server/service/src/main/java/com/doumee/service/business/InitService.java
+++ b/server/service/src/main/java/com/doumee/service/business/InitService.java
@@ -36,10 +36,12 @@
         redisTemplate.opsForValue().set(Constants.RedisKeys.IAM_APPKEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_APPKEY).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.IAM_APPID,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_APPID).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_CRM_API_KEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_KEY).getCode());
+        redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_CRM_AUTH_API_KEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_AUTH_API_KEY).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_CRM_API_URL,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_URL).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_SMS_API_URL,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_SMS_API_URL).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_SMS_API_KEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_SMS_API_KEY).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_ZHONGTAI_API_URL,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_ZHONGTAI_API_URL).getCode());
+        redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_ENCODE_URL,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_ENCODE_URL).getCode());
     }
     @PostConstruct
     public void cacheShopTree(){
diff --git a/server/service/src/main/java/com/doumee/service/business/ShopService.java b/server/service/src/main/java/com/doumee/service/business/ShopService.java
index e087c15..38bd705 100644
--- a/server/service/src/main/java/com/doumee/service/business/ShopService.java
+++ b/server/service/src/main/java/com/doumee/service/business/ShopService.java
@@ -5,6 +5,7 @@
 import com.doumee.dao.admin.request.UpdateShopSortDTO;
 import com.doumee.dao.business.model.Shop;
 import com.doumee.dao.business.vo.ShopTreeVo;
+import com.doumee.dao.web.reqeust.ShopQueryByLLDTO;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -110,4 +111,18 @@
     void dealShopNamePath();
 
     List<Shop> listByParent(String parentId);
+
+    /**
+     * 鏍规嵁缁忕含搴� 鑾峰彇闂ㄥ簵鍒楄〃
+     * @param pageWrap
+     * @return
+     */
+    PageData<Shop> queryShopByLL(PageWrap<Shop> pageWrap);
+
+    /**
+     * 闂ㄥ簵璇︽儏
+     * @param id
+     * @return
+     */
+    Shop shopDetail(Long id,Long memberId);
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/UsersService.java b/server/service/src/main/java/com/doumee/service/business/UsersService.java
index e31e89b..3467559 100644
--- a/server/service/src/main/java/com/doumee/service/business/UsersService.java
+++ b/server/service/src/main/java/com/doumee/service/business/UsersService.java
@@ -2,6 +2,7 @@
 
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.Users;
 import com.doumee.dao.web.response.AccountResponse;
 import org.springframework.web.multipart.MultipartFile;
@@ -105,4 +106,8 @@
     void bindingOpenid(String code,Long userId);
 
     String importBatch(MultipartFile file);
+
+    Users usersDetail(Long userId);
+
+    String getUserCard(Users users);
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/CustomerUserServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/CustomerUserServiceImpl.java
new file mode 100644
index 0000000..bd783e7
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/service/business/impl/CustomerUserServiceImpl.java
@@ -0,0 +1,271 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.biz.zbom.ZbomCRMService;
+import com.doumee.biz.zbom.model.crm.CRMConstants;
+import com.doumee.biz.zbom.model.crm.CrmDaogouBindListRequest;
+import com.doumee.biz.zbom.model.crm.response.CRMBaseResponse;
+import com.doumee.biz.zbom.model.crm.response.CRMDaogouBindListResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.CustomerUserMapper;
+import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.UsersMapper;
+import com.doumee.dao.business.model.CustomerUser;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Users;
+import com.doumee.service.business.CustomerUserService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 瀹㈡埛瀵艰喘鍏宠仈琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/07/15 10:21
+ */
+@Service
+public class CustomerUserServiceImpl implements CustomerUserService {
+
+    @Autowired
+    private CustomerUserMapper customerUserMapper;
+    @Autowired
+    private MemberMapper memberMapper;
+    @Autowired
+    private UsersMapper usersMapper;
+    @Autowired
+    private ZbomCRMService zbomCRMService;
+
+    @Override
+    public Long create(CustomerUser customerUser) {
+        customerUserMapper.insert(customerUser);
+        return customerUser.getId();
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        customerUserMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(CustomerUser customerUser) {
+        UpdateWrapper<CustomerUser> deleteWrapper = new UpdateWrapper<>(customerUser);
+        customerUserMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        customerUserMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(CustomerUser customerUser) {
+        customerUserMapper.updateById(customerUser);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<CustomerUser> customerUsers) {
+        if (CollectionUtils.isEmpty(customerUsers)) {
+            return;
+        }
+        for (CustomerUser customerUser: customerUsers) {
+            this.updateById(customerUser);
+        }
+    }
+
+    @Override
+    public CustomerUser findById(Long id) {
+        return customerUserMapper.selectById(id);
+    }
+
+    @Override
+    public CustomerUser findOne(CustomerUser customerUser) {
+        QueryWrapper<CustomerUser> wrapper = new QueryWrapper<>(customerUser);
+        return customerUserMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<CustomerUser> findList(CustomerUser customerUser) {
+        QueryWrapper<CustomerUser> wrapper = new QueryWrapper<>(customerUser);
+        return customerUserMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<CustomerUser> findPage(PageWrap<CustomerUser> pageWrap) {
+        IPage<CustomerUser> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<CustomerUser> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(CustomerUser::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(CustomerUser::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(CustomerUser::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(CustomerUser::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getPhone() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getPhone, pageWrap.getModel().getPhone());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getUserId() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getUserId, pageWrap.getModel().getUserId());
+        }
+        if (pageWrap.getModel().getIamUserId() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getIamUserId, pageWrap.getModel().getIamUserId());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getOrgName() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getOrgName, pageWrap.getModel().getOrgName());
+        }
+        if (pageWrap.getModel().getUsername() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getUsername, pageWrap.getModel().getUsername());
+        }
+        if (pageWrap.getModel().getProductCodeName() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getProductCodeName, pageWrap.getModel().getProductCodeName());
+        }
+        if (pageWrap.getModel().getAddr() != null) {
+            queryWrapper.lambda().eq(CustomerUser::getAddr, pageWrap.getModel().getAddr());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(customerUserMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(CustomerUser customerUser) {
+        QueryWrapper<CustomerUser> wrapper = new QueryWrapper<>(customerUser);
+        return customerUserMapper.selectCount(wrapper);
+    }
+    @Override
+    @Transactional
+    public void syncYesterday(String date) {
+        CrmDaogouBindListRequest request = new CrmDaogouBindListRequest();
+        request.setPage(0);
+        request.setPageSize(100);
+        request.setTiming(Constants.ONE+"");
+        request.setCreationDate(date);
+        boolean hasMore = true;
+        int currentNum = 0;
+        Date cdate = new Date();
+        while (hasMore){
+            try {
+                request.setPage(request.getPage()+1);
+                currentNum += currentNum;
+                CRMBaseResponse<List<CRMDaogouBindListResponse>> response = zbomCRMService.getDaogouBindList(request);
+                if(response==null
+                        || !StringUtils.equals(response.getCode(), CRMConstants.CODE_SUCCESS)
+                        || response.getData() ==null
+                        || response.getData().size() ==0){
+                    hasMore = false;
+                }
+                if(currentNum >= response.getTotal()){
+                    hasMore = false;
+                }
+                dealSyncDataBiz(cdate,response.getData());
+            }catch (Exception e){
+               hasMore = false;
+            }
+        }
+    }
+
+    private void dealSyncDataBiz(Date date,List<CRMDaogouBindListResponse> list) {
+        List<CustomerUser> addList = new ArrayList<>();
+        List<String> phoneList = new ArrayList<>();
+        for(CRMDaogouBindListResponse data : list){
+            if(StringUtils.isBlank(data.getCustomerPhone())){
+                continue;
+            }
+            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                    .eq(Member::getPhone,data.getCustomerPhone() )
+                    .eq(Member::getIsdeleted,Constants.ZERO)
+                    .last("limit 1" ));
+            Users user = usersMapper.selectOne(new QueryWrapper<Users>().lambda()
+                    .eq(Users::getIamId,data.getUserId() )
+                    .last("limit 1" ));
+            if(member == null){
+                continue;
+            }
+            phoneList.add(data.getCustomerPhone());
+
+            CustomerUser model = new CustomerUser();
+            model.setCreateDate(date);
+            model.setIsdeleted(Constants.ZERO);
+            model.setEditDate(date);
+            model.setName(data.getDgName());
+            model.setPhone(data.getDgPhone());
+            model.setOrgName(data.getOrgName());
+            model.setCustomerName(data.getCustomerName());
+            model.setCustomerPhone(data.getCustomerPhone());
+            model.setUsername(data.getUserName());
+            model.setSource(Constants.ONE);
+            model.setZtStatus(Constants.ONE);
+            model.setZtInfo("crm鍚屾");
+            model.setIamUserId(data.getUserId());
+            model.setUserId(user== null?null:user.getId());
+            model.setCreationDate(data.getCreationDate());
+            addList.add(model);
+        }
+        if(phoneList.size()>0){
+            /**
+             * 鍒犻櫎鑰佸緱鏁版嵁
+             */
+            customerUserMapper.update(null,new UpdateWrapper<CustomerUser>().lambda()
+                    .in(CustomerUser::getPhone,phoneList)
+                    .eq(CustomerUser::getZtStatus,Constants.ONE)
+                    .eq(CustomerUser::getIsdeleted,Constants.ZERO)
+                    .set(CustomerUser::getIsdeleted,Constants.ONE)
+            );
+        }
+        if(addList .size() >0){
+            int temp = 0;
+            while(temp < addList.size()){
+                int index;
+                if(temp + 500 <= addList.size()){
+                    index = temp+500;
+                }else{
+                    index = addList.size();
+                }
+                customerUserMapper.insert(addList.subList(temp,index));
+                temp = index;
+            }
+        }
+    }
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/GetZhongTaiDataServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/GetZhongTaiDataServiceImpl.java
new file mode 100644
index 0000000..b834ec6
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/service/business/impl/GetZhongTaiDataServiceImpl.java
@@ -0,0 +1,167 @@
+package com.doumee.service.business.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.biz.zbom.ZbomZhongTaiService;
+import com.doumee.biz.zbom.model.zhongtai.ZTCatalogListRequest;
+import com.doumee.biz.zbom.model.zhongtai.ZTConstants;
+import com.doumee.biz.zbom.model.zhongtai.ZTContentInfoRequest;
+import com.doumee.biz.zbom.model.zhongtai.ZTContentListRequest;
+import com.doumee.biz.zbom.model.zhongtai.response.*;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.dao.business.IamInterfaceLogMapper;
+import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.UsersMapper;
+import com.doumee.service.business.GetZhongTaiDataService;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/7/15 14:12
+ */
+@Service
+public class GetZhongTaiDataServiceImpl implements GetZhongTaiDataService {
+
+    @Autowired
+    private ZbomZhongTaiService zbomZhongTaiService;
+
+    @Autowired
+    private MemberMapper memberMapper;
+
+    @Autowired
+    private UsersMapper usersMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+
+
+    @Override
+    public List<ZTCatalogInfoResponse> getCatalogList(ZTCatalogListRequest ztCatalogListRequest){
+        if(Objects.isNull(ztCatalogListRequest)
+        || StringUtils.isBlank(ztCatalogListRequest.getCatalogCode())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.ZHISHUO_ZHUANGXIU)
+            ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.CHANPING)
+            ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.ZIXUN)
+            ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.QW_CASE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍒嗙被淇℃伅閿欒");
+        }
+        return zbomZhongTaiService.getCatalogList(ztCatalogListRequest);
+    }
+
+
+    @Override
+    public List<ZTTagInfoResponse> getCataLogTagList(ZTCatalogListRequest ztCatalogListRequest){
+        if(Objects.isNull(ztCatalogListRequest)
+                || StringUtils.isBlank(ztCatalogListRequest.getCatalogCode())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.ZHISHUO_ZHUANGXIU)
+                ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.CHANPING)
+                ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.ZIXUN)
+                ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.QW_CASE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍒嗙被淇℃伅閿欒");
+        }
+        return zbomZhongTaiService.getTagList(ztCatalogListRequest);
+    }
+
+
+    /**
+     *  鑾峰彇鐖跺瓙绾х粨鏋勬暟鎹垪琛�
+     * 蹇楄瑁呬慨 zb_deco 浜у搧 product_intro 璧勮product_info 鍏ㄥ眿妗堜緥 whole_case
+     * 鑾峰彇鐖跺瓙绾х粨鏋勬暟鎹�
+     * @return
+     */
+    @Override
+    public List<ZTCatalogInfoResponse> getZTCatalogInfoResponse(ZTCatalogListRequest ztCatalogListRequest){
+        if(Objects.isNull(ztCatalogListRequest)
+                || StringUtils.isBlank(ztCatalogListRequest.getCatalogCode())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.ZHISHUO_ZHUANGXIU)
+                ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.CHANPING)
+                ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.ZIXUN)
+                ||ztCatalogListRequest.getCatalogCode().equals(ZTConstants.CatalogCode.QW_CASE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍒嗙被淇℃伅閿欒");
+        }
+        List<ZTCatalogInfoResponse>  ztCatalogInfoResponseList = zbomZhongTaiService.getCatalogList(ztCatalogListRequest);
+        if(CollectionUtils.isNotEmpty(ztCatalogInfoResponseList)){
+            for (ZTCatalogInfoResponse ztCatalogInfoResponse:ztCatalogInfoResponseList) {
+                ZTCatalogListRequest ztCatalogTagListRequest = new ZTCatalogListRequest();
+                ztCatalogTagListRequest.setCatalogCode(ztCatalogInfoResponse.getCode());
+                List<ZTTagInfoResponse> ztTagInfoResponseList = zbomZhongTaiService.getTagList(ztCatalogTagListRequest);
+                if(CollectionUtils.isNotEmpty(ztCatalogInfoResponseList)){
+                    ztCatalogInfoResponse.setChildTagList(ztTagInfoResponseList);
+                }
+            }
+        }
+        return ztCatalogInfoResponseList;
+    }
+
+
+    /**
+     * 鍐呭 鍒嗛〉鏁版嵁
+     * @param ztContentListRequest
+     * @return
+     */
+    @Override
+    public ZTBasePageResponse<ZTContentListResponse> pageContentList(ZTContentListRequest ztContentListRequest){
+        if(Objects.isNull(ztContentListRequest)
+            || Objects.isNull(ztContentListRequest.getPageNum())
+            || Objects.isNull(ztContentListRequest.getPageSize())
+            || StringUtils.isBlank(ztContentListRequest.getCatalogCode())
+            || StringUtils.isBlank(ztContentListRequest.getTagCodes())
+            || StringUtils.isBlank(ztContentListRequest.getQuery())
+            || StringUtils.isBlank(ztContentListRequest.getSortType())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        //鏌ヨ 涓彴
+        String token = MemberServiceImpl.getZTToken(zbomZhongTaiService,memberMapper,usersMapper,systemDictDataBiz,ztContentListRequest.getUserId(),ztContentListRequest.getUserType());
+        ztContentListRequest.setToken(token);
+        String catalogCode = ztContentListRequest.getCatalogCode();
+        if(catalogCode.equals(ZTConstants.CatalogCode.ZHISHUO_ZHUANGXIU)
+                ||catalogCode.equals(ZTConstants.CatalogCode.CHANPING)
+                ||catalogCode.equals(ZTConstants.CatalogCode.ZIXUN)
+                ||catalogCode.equals(ZTConstants.CatalogCode.QW_CASE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍒嗙被淇℃伅閿欒");
+        }
+        ZTBasePageResponse<ZTContentListResponse> response = zbomZhongTaiService.pageContentList(ztContentListRequest);
+        return response;
+    }
+
+
+
+    @Override
+    public ZTContentInfoResponse getContentInfo(String id,String userType,Long userId){
+        //鏌ヨ 涓彴 TOKEN
+        String token = MemberServiceImpl.getZTToken(zbomZhongTaiService,memberMapper,usersMapper,systemDictDataBiz,userId.toString(),userType);
+        ZTContentInfoRequest ztContentListRequest = new ZTContentInfoRequest();
+        ztContentListRequest.setToken(token);
+        ztContentListRequest.setUserType(userType);
+        ztContentListRequest.setId(id);
+        ZTContentInfoResponse response = zbomZhongTaiService.getContentInfo(ztContentListRequest);
+        return response;
+    }
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 18e6aa8..9dce68e 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -18,11 +18,14 @@
 import com.doumee.core.oss.FileModel;
 import com.doumee.core.utils.CodeVerifyUtils;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.core.wx.WxMiniConfig;
 import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.UsersMapper;
 import com.doumee.dao.business.model.InterfaceLog;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Users;
 import com.doumee.dao.web.reqeust.EditMemberRequest;
 import com.doumee.dao.web.reqeust.WxPhoneRequest;
 import com.doumee.dao.web.response.AccountResponse;
@@ -35,6 +38,7 @@
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.Response;
+import org.apache.catalina.User;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -56,6 +60,9 @@
 
     @Autowired
     private MemberMapper memberMapper;
+
+    @Autowired
+    private UsersMapper usersMapper;
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
@@ -259,14 +266,13 @@
 
     @Override
     public AccountResponse wxLogin(String code){
-//        try {
-            //鑾峰彇寰俊鏁忔劅鏁版嵁
-//            WxMaJscode2SessionResult session = WxMiniConfig.wxCustomerService.getUserService().getSessionInfo(code);
-//            String openId = session.getOpenid();
-//            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) {
-//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鑾峰彇openid澶辫触锛佽鑱旂郴绠$悊鍛�");
-//            }
-            String openId = code;
+        try {
+//            鑾峰彇寰俊鏁忔劅鏁版嵁
+            WxMaJscode2SessionResult session = WxMiniConfig.wxCustomerService.getUserService().getSessionInfo(code);
+            String openId = session.getOpenid();
+            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鑾峰彇openid澶辫触锛佽鑱旂郴绠$悊鍛�");
+            }
             Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("OPENID", openId));
             if (member == null) {
                 member = new Member();
@@ -281,13 +287,13 @@
             String token = JwtTokenUtil.generateToken(payLoad);
             AccountResponse accountResponse = new AccountResponse();
             accountResponse.setToken(token);
-//            accountResponse.setSessionKey(session.getSessionKey());
+            accountResponse.setSessionKey(session.getSessionKey());
             accountResponse.setMember(member);
             return accountResponse;
-//        } catch (WxErrorException e) {
-//            e.printStackTrace();
-//        }
-//        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"寰俊鐧诲綍寮傚父锛佽鑱旂郴绠$悊鍛�");
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"寰俊鐧诲綍寮傚父锛佽鑱旂郴绠$悊鍛�");
     }
 
     @Override
@@ -311,7 +317,7 @@
     public void updMemberDetail(EditMemberRequest editMemberRequest){
         Member member = memberMapper.selectById(editMemberRequest.getMemberId());
         ZTUserInfoUpdateRequest ztUserInfoUpdateRequest = new  ZTUserInfoUpdateRequest();
-        ztUserInfoUpdateRequest.setOpenid(member.getOpenid());
+        ztUserInfoUpdateRequest.setOpenId(member.getOpenid());
         String appId = systemDictDataBiz.queryByCode(Constants.WX_MINI_CONFIG,Constants.WX_APPID_CUSTOMER).getCode();
         ztUserInfoUpdateRequest.setAppId(appId);
         ztUserInfoUpdateRequest.setPlatform(Constants.PLATFORM);
@@ -365,29 +371,61 @@
     }
 
 
-    /**
-     * 鏇存柊涓彴token淇℃伅
-     * @param member
-     */
-    public void updUserZTToken(Member member){
-        //濡傛灉鏃犳湁鏁堟湡/宸茶繃鏈� 閲嶆柊鑾峰彇
-        if(Objects.isNull(member.getTokenDate()) || member.getTokenDate().getTime()<=System.currentTimeMillis() ){
-            ZTUserGetTokenRequest param = new ZTUserGetTokenRequest();
-            //鏌ヨAPPID
-            String appId = systemDictDataBiz.queryByCode(Constants.WX_MINI_CONFIG,Constants.WX_APPID_CUSTOMER).getCode();
-            param.setAppId(appId);
-            param.setOpenId(member.getOpenid());
-            ZTUserGetTokenResponse ztUserGetTokenResponse = zbomZhongTaiService.getUserToken(param);
-            if(Objects.nonNull(ztUserGetTokenResponse)){
-                member.setToken(ztUserGetTokenResponse.getToken());
-                //TODO 鏆傛棤杩囨湡鏃ユ湡
-                memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getToken,ztUserGetTokenResponse.getToken())
-                        .eq(Member::getId,member.getId()));
-            }else{
-                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"涓彴TOKEN鑾峰彇澶辫触锛岃鑱旂郴绠$悊鍛�");
+
+
+    public static String getZTToken(ZbomZhongTaiService zbomZhongTaiService, MemberMapper memberMapper, UsersMapper usersMapper, SystemDictDataBiz systemDictDataBiz, String id, String userType){
+        if(userType.equals(Constants.CUSTOMER)){
+            Member member = memberMapper.selectById(id);
+            if(Objects.isNull(member)){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
             }
-        };
+            //濡傛灉鏃犳湁鏁堟湡/宸茶繃鏈� 閲嶆柊鑾峰彇
+            if(Objects.isNull(member.getTokenDate()) || member.getTokenDate().getTime()<=System.currentTimeMillis() ){
+                ZTUserGetTokenRequest param = new ZTUserGetTokenRequest();
+                //鏌ヨAPPID
+                String appId = systemDictDataBiz.queryByCode(Constants.WX_MINI_CONFIG,Constants.WX_APPID_CUSTOMER).getCode();
+                param.setAppId(appId);
+                param.setOpenId(member.getOpenid());
+                ZTUserGetTokenResponse ztUserGetTokenResponse = zbomZhongTaiService.getUserToken(param);
+                if(Objects.nonNull(ztUserGetTokenResponse)){
+                    member.setToken(ztUserGetTokenResponse.getToken());
+                    //TODO 鏆傛棤杩囨湡鏃ユ湡
+                    memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getToken,ztUserGetTokenResponse.getToken())
+                            .eq(Member::getId,member.getId()));
+                    return ztUserGetTokenResponse.getToken();
+                }else{
+                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"涓彴TOKEN鑾峰彇澶辫触锛岃鑱旂郴绠$悊鍛�");
+                }
+            }
+            return member.getToken();
+        }else if(userType.equals(Constants.BUSINESS)){
+            Users users = usersMapper.selectById(id);
+            if(Objects.isNull(users)){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            if(Objects.isNull(users.getTokenDate()) || users.getTokenDate().getTime()<=System.currentTimeMillis() ){
+                ZTUserGetTokenRequest param = new ZTUserGetTokenRequest();
+                //鏌ヨAPPID
+                String appId = systemDictDataBiz.queryByCode(Constants.WX_MINI_CONFIG,Constants.WX_APPID_CUSTOMER).getCode();
+                param.setAppId(appId);
+                param.setOpenId(users.getOpenid());
+                ZTUserGetTokenResponse ztUserGetTokenResponse = zbomZhongTaiService.getUserToken(param);
+                if(Objects.nonNull(ztUserGetTokenResponse)){
+                    users.setToken(ztUserGetTokenResponse.getToken());
+                    //TODO 鏆傛棤杩囨湡鏃ユ湡
+                    usersMapper.update(new UpdateWrapper<Users>().lambda().set(Users::getToken,ztUserGetTokenResponse.getToken())
+                            .eq(Users::getId,users.getId()));
+                    return ztUserGetTokenResponse.getToken();
+                }else{
+                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"涓彴TOKEN鑾峰彇澶辫触锛岃鑱旂郴绠$悊鍛�");
+                }
+            }
+            return users.getToken();
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍙傛暟閿欒");
+        }
     }
+
 
 
 
@@ -401,11 +439,11 @@
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸叉敞閿�");
         }
         //鏍¢獙鐢ㄦ埛token淇℃伅
-        this.updUserZTToken(member);
+        MemberServiceImpl.getZTToken(zbomZhongTaiService,memberMapper,usersMapper,systemDictDataBiz,member.getId().toString(),Constants.CUSTOMER);
         //璋冭捣涓彴娉ㄩ攢鎺ュ彛
         ZTBaseRequst ztBaseRequst = new ZTBaseRequst();
         ztBaseRequst.setUserType(Constants.CUSTOMER);
-        ztBaseRequst.setOpenid(member.getOpenid());
+        ztBaseRequst.setOpenId(member.getOpenid());
         ztBaseRequst.setToken(member.getToken());
         Boolean logoutFlag = zbomZhongTaiService.userLogout(ztBaseRequst);
         if(logoutFlag){
@@ -420,4 +458,6 @@
     }
 
 
+
+
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
index 2a03951..62ed2f3 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -1,5 +1,6 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.excel.ExcelImporter;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
@@ -12,15 +13,15 @@
 import com.doumee.dao.admin.request.FcodeImport;
 import com.doumee.dao.admin.request.ShopImport;
 import com.doumee.dao.admin.request.UpdateShopSortDTO;
-import com.doumee.dao.business.CategoryMapper;
 import com.doumee.dao.business.CategorySegMapper;
+import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.SegmentsMapper;
-import com.doumee.dao.business.ShopMapper;
+import com.doumee.dao.business.UsersMapper;
 import com.doumee.dao.business.join.ShopJoinMapper;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.business.vo.ShopTree;
 import com.doumee.dao.business.vo.ShopTreeVo;
-import com.doumee.dao.system.model.SystemUser;
+import com.doumee.dao.web.reqeust.ShopQueryByLLDTO;
 import com.doumee.service.business.ShopService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -41,7 +42,6 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 
 /**
  * 蹇楅偊缁勭粐淇℃伅琛⊿ervice瀹炵幇
@@ -55,10 +55,17 @@
     private RedisTemplate<String, Object> redisTemplate;
     @Autowired
     private ShopJoinMapper shopMapper;
+
     @Autowired
     private SegmentsMapper segmentsMapper;
     @Autowired
     private CategorySegMapper categorySegMapper;
+    @Autowired
+    private UsersMapper usersMapper;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @Autowired
+    private MemberMapper memberMapper;
 
     @Override
     public Long create(Shop shop) {
@@ -858,4 +865,79 @@
             }
         }
     }
+
+
+
+    @Override
+    public PageData<Shop> queryShopByLL(PageWrap<Shop> pageWrap) {
+        if(Objects.isNull(pageWrap.getModel())
+                || Objects.isNull(pageWrap.getModel().getLatitude())
+                || Objects.isNull(pageWrap.getModel().getLongitude())){
+            return null;
+        }
+        IPage<Shop> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Shop> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.select("ID,NAME,ADDRESS,PROVINCE_NAME,CITY_NAME,AREA_NAME,TOWN,AREA_NAME,LEGAL_PHONE," +
+                        " CONVERT (ST_Distance_Sphere (point ("+pageWrap.getModel().getLongitude()+", "+pageWrap.getModel().getLatitude()+" ), point ( LONGITUDE, LATITUDE )) /1000,decimal(15,2)) as distance ")
+                .eq("isdeleted",Constants.ZERO)
+                .isNotNull("LATITUDE")
+                .isNotNull("LONGITUDE")
+                .eq("ATTRIBUTE",Constants.ONE)
+                .orderByAsc(" distance ");
+        Utils.MP.blankToNull(pageWrap.getModel());
+        PageData<Shop> pageData = PageData.from(shopMapper.selectPage(page, queryWrapper));
+        String prefix = StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()) +
+        StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.USERS_FILE).getCode());
+        for (Shop shop:pageData.getRecords()) {
+            //鏌ヨ闂ㄥ簵涓嬪璐暟鎹�
+            List<Users> usersList =usersMapper.selectList(new QueryWrapper<Users>().lambda().eq(Users::getDepartmentId,shop.getId())
+                    .eq(Users::getIsdeleted,Constants.ZERO)
+                    .eq(Users::getStatus,Constants.ONE)
+                    .eq(Users::getType,Constants.ZERO)
+            );
+            for (Users users:usersList) {
+                if(StringUtils.isNotBlank(users.getImgurl())){
+                    users.setImgurlFull(prefix + users.getImgurl());
+                }
+            }
+            shop.setUsersList(usersList);
+        }
+        return pageData;
+    }
+
+    @Override
+    public Shop shopDetail(Long id,Long memberId) {
+        Member member = memberMapper.selectById(memberId);
+        if(Objects.isNull(member)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏈煡璇㈠埌鐢ㄦ埛淇℃伅");
+        }
+        QueryWrapper<Shop> queryWrapper = new QueryWrapper<Shop>();
+        //濡傛灉浜哄憳娌℃湁缁忕含搴︿俊鎭紝鍒欎笉鏌ヨ璺濈
+        if(Objects.nonNull(member.getLatitude())&&Objects.nonNull(member.getLongitude())){
+            queryWrapper.select("ID,NAME,ADDRESS,PROVINCE_NAME,CITY_NAME,AREA_NAME,TOWN,AREA_NAME,LEGAL_PHONE," +
+                    " CONVERT (ST_Distance_Sphere (point ("+member.getLongitude()+", "+member.getLatitude()+" ), point ( LONGITUDE, LATITUDE )) /1000,decimal(15,2)) as distance ");
+        }
+        queryWrapper.eq("id",id);
+        Shop shop = shopMapper.selectOne(queryWrapper);
+        if(Objects.isNull(shop)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        String prefix = StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()) +
+                StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.USERS_FILE).getCode());
+        List<Users> usersList =usersMapper.selectList(new QueryWrapper<Users>().lambda().eq(Users::getDepartmentId,shop.getId())
+                .eq(Users::getIsdeleted,Constants.ZERO)
+                .eq(Users::getStatus,Constants.ONE)
+                .eq(Users::getType,Constants.ZERO)
+        );
+        for (Users users:usersList) {
+            if(StringUtils.isNotBlank(users.getImgurl())){
+                users.setImgurlFull(prefix + users.getImgurl());
+            }
+        }
+        shop.setUsersList(usersList);
+        return shop;
+    }
+
+
+
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java
index 64a7de6..509aafe 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java
@@ -1,6 +1,7 @@
 package com.doumee.service.business.impl;
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.hutool.core.date.DateUnit;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.biz.zbom.model.IamUserRoleModel;
 import com.doumee.biz.zbom.model.IamUserTypeModel;
@@ -13,7 +14,10 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.GeneratePicUtil;
 import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.tyyun.TyyZosUtil;
 import com.doumee.dao.admin.request.ShopImport;
 import com.doumee.dao.admin.request.UserImport;
 import com.doumee.dao.business.ShopMapper;
@@ -41,10 +45,8 @@
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.io.InputStream;
+import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -600,5 +602,69 @@
         return null;
     }
 
+
+
+    @Override
+    public     String getUserCard(Users users){
+        String path = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode();
+        String folder = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.USERS_FILE).getCode();
+        String defualtHeader = systemDictDataBiz.queryByCode(Constants.WEIXIN_DEFAULT_IMGS, Constants.USER_CARD_HEADER_IMG).getCode();
+        String defualtPhone = systemDictDataBiz.queryByCode(Constants.WEIXIN_DEFAULT_IMGS, Constants.USER_CARD_PHONE_IMG).getCode();
+        String defualtAddr = systemDictDataBiz.queryByCode(Constants.WEIXIN_DEFAULT_IMGS, Constants.USER_CARD_ADDR_IMG).getCode();
+        String imgurl =StringUtils.isNotBlank(users.getImgurl())?path+users.getImgurl():defualtHeader;
+        String qrcode =StringUtils.isNotBlank(users.getQrcodeImg())?path+users.getQrcodeImg():null;
+        InputStream inputStream = GeneratePicUtil.generateUserCardImg(
+                imgurl
+                ,qrcode
+                ,StringUtils.defaultString(users.getName(),"-")
+                ,"瀵艰喘"
+                ,StringUtils.defaultString(users.getPhone(),"-")
+                ,StringUtils.defaultString(users.getShopAddress(),"-")
+                ,"ZBOM蹇楅偊瀹跺眳锝�"+ StringUtils.defaultString(users.getShopName(),"-")
+                ,defualtPhone
+                ,defualtAddr);
+        TyyZosUtil obs = new TyyZosUtil( systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.ENDPOINT).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.ACCESS_ID).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.ACCESS_KEY).getCode());
+        String fileName =folder+ DateUtil.getNowShortDate()+"/"+UUID.randomUUID().toString() + ".jpg";
+        if (obs.uploadInputstreamObject(inputStream,systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.BUCKETNAME).getCode(), fileName)) {
+            return  path+fileName;
+        }
+        return null;
+    }
+
+    @Override
+    public Users usersDetail(Long userId){
+        Users users = usersMapper.selectById(userId);
+        if(Objects.isNull(users)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        String prefix = StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()) +
+                StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.USERS_FILE).getCode());
+        if(StringUtils.isNotBlank(users.getImgurl())){
+            users.setImgurlFull(prefix + users.getImgurl());
+        }
+        if(StringUtils.isNotBlank(users.getQrcodeImg())){
+            users.setQrcodeImgFull(prefix + users.getQrcodeImg());
+        }
+        if(StringUtils.isNotBlank(users.getCompanyQrcodeImg())){
+            users.setCompanyQrcodeImgFull(prefix + users.getCompanyQrcodeImg());
+        }
+        if(Objects.nonNull(users.getDepartmentId())){
+            Shop shop = shopMapper.selectById(users.getDepartmentId());
+            if(Objects.nonNull(shop)){
+                users.setShopName(shop.getName());
+                if(StringUtils.isNotBlank(shop.getAddress())){
+                    users.setShopAddress(shop.getAddress());
+                }else{
+                    users.setShopAddress(shop.getProvinceName()+shop.getCityName()+shop.getAreaName()+shop.getTown()+shop.getRegAddr());
+                }
+            }
+        }
+        return users;
+    }
+
+
+
 }
 
diff --git a/server/web/src/main/java/com/doumee/api/web/ApiController.java b/server/web/src/main/java/com/doumee/api/web/ApiController.java
index 7a5bf06..969c732 100644
--- a/server/web/src/main/java/com/doumee/api/web/ApiController.java
+++ b/server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -2,8 +2,13 @@
 
 import com.doumee.config.Jwt.JwtTokenUtil;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Users;
+import com.doumee.service.business.MemberService;
+import com.doumee.service.business.UsersService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.formula.ptg.MemAreaPtg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -17,6 +22,15 @@
 @Slf4j
 public class ApiController {
 
+    @Autowired
+    UsersService usersService;
+    @Autowired
+    MemberService memberService;
+    /**
+     * 鏄惁寮�鍙戣��
+     */
+    @Value("${debug_model}")
+    private Boolean isDebug;
 
     /**
      * 寰楀埌request瀵硅薄
@@ -38,5 +52,34 @@
         Object obj = this.getRequest().getAttribute(JwtTokenUtil.UserId_Name);
         return obj != null ? (Long) obj : null;
     }
+    protected Long getUserId() {
+        if(isDebug){
+            return 2L;
+        }
+        Object obj = this.getRequest().getAttribute(JwtTokenUtil.UserId_Name);
+        return obj != null ? (Long) obj : null;
+    }
+    protected Users getLoginUserInfo() {
+      Long userId = getUserId();
+      if(userId== null){
+          return null;
+      }
+        Users user = usersService.findById(userId);
+      return user;
+    }
+    protected Member getLoginMemberInfo() {
+      Long userId = getMemberId();
+      if(userId== null){
+          return null;
+      }
+        Member user = memberService.findById(userId);
+      return user;
+    }
+
+
+    protected Long getUserType() {
+        Object obj = this.getRequest().getAttribute(JwtTokenUtil.UserType);
+        return obj != null ? (Long) obj : null;
+    }
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/CatalogApi.java b/server/web/src/main/java/com/doumee/api/web/CatalogApi.java
new file mode 100644
index 0000000..5926997
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/CatalogApi.java
@@ -0,0 +1,46 @@
+package com.doumee.api.web;
+
+import com.doumee.biz.zbom.ZbomZhongTaiService;
+import com.doumee.config.annotation.UserLoginRequired;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.business.model.SmsEmail;
+import com.doumee.dao.web.response.AccountResponse;
+import com.doumee.dao.web.response.ZSZXCatalogResponse;
+import com.doumee.service.business.SmsEmailService;
+import com.doumee.service.business.UsersService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/7/10 18:06
+ */
+@Api(tags = "鍒嗙被鍜屾爣绛剧浉鍏虫帴鍙�")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/web/catalog")
+@Slf4j
+public class CatalogApi extends ApiController{
+
+    @Autowired
+    public ZbomZhongTaiService zbomZhongTaiService;
+
+    @Autowired
+    public SmsEmailService smsEmailService;
+
+
+    @ApiOperation(value = "C绔皬绋嬪簭-鑾峰彇棣栭〉蹇楄瑁呬慨鍥涗釜妯″潡绫荤洰鏁版嵁", notes = "鑾峰彇棣栭〉蹇楄瑁呬慨鍥涗釜妯″潡绫荤洰鏁版嵁")
+    @PostMapping("/getZSZXCatalogs")
+    public ApiResponse<ZSZXCatalogResponse> getZSZXCatalogs() {
+        return  ApiResponse.success(zbomZhongTaiService.getZSZXCatalogs());
+    }
+
+}
diff --git a/server/web/src/main/java/com/doumee/api/web/CustomerApi.java b/server/web/src/main/java/com/doumee/api/web/CustomerApi.java
index 3c9c591..0e9ba35 100644
--- a/server/web/src/main/java/com/doumee/api/web/CustomerApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/CustomerApi.java
@@ -4,19 +4,22 @@
 import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.CustomerLog;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Shop;
+import com.doumee.dao.business.model.Users;
 import com.doumee.dao.web.reqeust.*;
 import com.doumee.dao.web.response.AccountResponse;
 import com.doumee.dao.web.response.BjParamConfigResponse;
-import com.doumee.service.business.BjParamService;
-import com.doumee.service.business.CustomerService;
-import com.doumee.service.business.MemberService;
+import com.doumee.service.business.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -29,7 +32,7 @@
  * @Author : Rk
  * @create 2024/7/10 14:03
  */
-@Api(tags = "瀹㈡埛绔皬绋嬪簭鐢ㄦ埛涓氬姟")
+@Api(tags = "銆怌绔皬绋嬪簭銆戠敤鎴蜂笟鍔�")
 @Trace(exclude = true)
 @RestController
 @RequestMapping("/web/customer")
@@ -48,6 +51,12 @@
 
     @Autowired
     private ZbomCRMService zbomCRMService;
+
+    @Autowired
+    private ShopService shopService;
+
+    @Autowired
+    private UsersService usersService;
 
     @ApiOperation(value = "瀹㈡埛绔皬绋嬪簭鐧婚檰", notes = "瀹㈡埛绔皬绋嬪簭")
     @GetMapping("/wxLoginCustomer")
@@ -146,5 +155,40 @@
         return  ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
+    @LoginRequired
+    @ApiOperation(value = "闂ㄥ簵鍒楄〃", notes = "瀹㈡埛绔皬绋嬪簭")
+    @PostMapping("/shopPage")   @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<PageData<Shop>> shopPage (@RequestBody PageWrap<Shop> pageWrap) {
+        return ApiResponse.success(shopService.queryShopByLL(pageWrap));
+    }
+
+
+    @LoginRequired
+    @ApiOperation(value = "闂ㄥ簵璇︽儏", notes = "瀹㈡埛绔皬绋嬪簭")
+    @GetMapping("/shopDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Long", name = "shopId", value = "闂ㄥ簵涓婚敭", required = true)
+    })
+    public ApiResponse<Shop> shopDetail (@RequestParam Long shopId) {
+        Long memberId = this.getMemberId();
+        return ApiResponse.success(shopService.shopDetail(shopId,memberId));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "瀵艰喘璇︽儏", notes = "瀹㈡埛绔皬绋嬪簭")
+    @GetMapping("/usersDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Long", name = "userId", value = "瀵艰喘涓婚敭", required = true)
+    })
+    public ApiResponse<Users> usersDetail (@RequestParam Long userId) {
+        return ApiResponse.success(usersService.usersDetail(userId));
+    }
+
+
+
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/CustomerManageApi.java b/server/web/src/main/java/com/doumee/api/web/CustomerManageApi.java
new file mode 100644
index 0000000..1e284a3
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/CustomerManageApi.java
@@ -0,0 +1,42 @@
+package com.doumee.api.web;
+
+import com.doumee.biz.zbom.ZbomZhongTaiService;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.web.response.ZSZXCatalogResponse;
+import com.doumee.service.business.SmsEmailService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/7/10 18:06
+ */
+@Api(tags = "銆怋绔皬绋嬪簭銆戝鎴风鐞嗘帴鍙�")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/web/customer")
+@Slf4j
+public class CustomerManageApi extends ApiController{
+
+    @Autowired
+    public ZbomZhongTaiService zbomZhongTaiService;
+
+    @Autowired
+    public SmsEmailService smsEmailService;
+
+
+    @ApiOperation(value = "C绔皬绋嬪簭-鑾峰彇棣栭〉蹇楄瑁呬慨鍥涗釜妯″潡绫荤洰鏁版嵁", notes = "鑾峰彇棣栭〉蹇楄瑁呬慨鍥涗釜妯″潡绫荤洰鏁版嵁")
+    @PostMapping("/getZSZXCatalogs")
+    public ApiResponse<ZSZXCatalogResponse> getZSZXCatalogs() {
+        return  ApiResponse.success(zbomZhongTaiService.getZSZXCatalogs());
+    }
+
+}
diff --git a/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java b/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java
index 8772dde..6b24bfd 100644
--- a/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java
@@ -15,10 +15,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * Created by IntelliJ IDEA.
@@ -26,7 +23,7 @@
  * @Author : Rk
  * @create 2024/7/10 18:06
  */
-@Api(tags = "鍛樺伐绔皬绋嬪簭鐢ㄦ埛涓氬姟")
+@Api(tags = "銆怋绔皬绋嬪簭銆戠敤鎴蜂笟鍔�")
 @Trace(exclude = true)
 @RestController
 @RequestMapping("/web/personnel")
@@ -86,4 +83,11 @@
         return  ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
+    @ApiOperation(value = "鑾峰彇涓汉鍚嶇墖", notes = "鍛樺伐绔皬绋嬪簭")
+    @PostMapping("/getUserCard")
+    public ApiResponse<String> getUserCard() {
+        return  ApiResponse.success(usersService.getUserCard(this.getLoginUserInfo()));
+    }
+
+
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/PublicController.java b/server/web/src/main/java/com/doumee/api/web/PublicController.java
index 03b0570..459aea0 100644
--- a/server/web/src/main/java/com/doumee/api/web/PublicController.java
+++ b/server/web/src/main/java/com/doumee/api/web/PublicController.java
@@ -3,12 +3,16 @@
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.api.BaseController;
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.FtpUtil;
 import com.doumee.core.utils.aliyun.ALiYunUtil;
 import com.doumee.core.utils.tyyun.TyyZosUtil;
+import com.doumee.dao.business.model.Users;
+import com.doumee.dao.system.model.SystemDictData;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -46,6 +50,20 @@
     private SystemDictDataBiz systemDictDataBiz;
 
 
+
+    @LoginRequired
+    @ApiOperation(value = "瀛楀吀鍊兼煡璇�")
+    @GetMapping("/getDictData")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "澶х被缂栫爜", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "label", value = "瀛愮被缂栫爜", required = true)
+    })
+    public ApiResponse<SystemDictData> getDictData (@RequestParam String code,@RequestParam String label) {
+        SystemDictData systemDictData = systemDictDataBiz.queryByCode(code,label);
+        return ApiResponse.success(systemDictData);
+    }
+
+
     @ApiOperation(value = "涓婁紶", notes = "涓婁紶", httpMethod = "POST", position = 6)
     @ApiImplicitParams({
         @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
deleted file mode 100644
index f978edf..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.doumee.config.shiro;
-
-import com.alibaba.fastjson.JSON;
-import com.doumee.core.model.ApiResponse;
-import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
-import org.springframework.http.HttpStatus;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Shiro璁よ瘉杩囨护鍣紝澶勭悊鏈璇佹儏鍐电殑鍝嶅簲
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-public class ShiroAuthFilter extends FormAuthenticationFilter {
-
-    public ShiroAuthFilter() {
-        super();
-    }
-
-    @Override
-    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
-        HttpServletResponse servletResponse = (HttpServletResponse) response;
-        servletResponse.setHeader("content-type", "application/json;charset=UTF-8");
-        servletResponse.getWriter().write(JSON.toJSONString(ApiResponse.failed(HttpStatus.UNAUTHORIZED.value(), "鏈櫥褰曟垨鐧诲綍淇℃伅宸茶繃鏈�")));
-        return Boolean.FALSE;
-    }
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroCache.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroCache.java
deleted file mode 100644
index 36cd7af..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroCache.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.doumee.config.shiro;
-
-import com.doumee.service.proxy.CacheProxy;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.cache.Cache;
-import org.apache.shiro.cache.CacheException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * Shiro缂撳瓨
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-@Scope(value = "prototype")
-@Slf4j
-@Component
-public class ShiroCache implements Cache<Object, Serializable> {
-
-    private String keyPrefix = "";
-
-    @Autowired
-    private CacheProxy<Object, Serializable> cacheProxy;
-
-    public ShiroCache () {
-        log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]");
-    }
-
-    public ShiroCache(String keyPrefix) {
-        log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]");
-        this.keyPrefix = keyPrefix;
-    }
-
-    @Override
-    public Serializable get(Object key) throws CacheException {
-        if (key == null) {
-            return null;
-        }
-        return cacheProxy.get(getKey(key));
-    }
-
-    @Override
-    public Serializable put(Object key, Serializable value) throws CacheException {
-        if (key == null) {
-            return null;
-        }
-        cacheProxy.put(getKey(key), value);
-        return value;
-    }
-
-    public Serializable put(Object key, Serializable value, int timeout) throws CacheException {
-        if (key == null) {
-            return null;
-        }
-        cacheProxy.put(getKey(key), value, timeout);
-        return value;
-    }
-
-    @Override
-    public void clear() throws CacheException {
-        Set<Object> keys = this.keys();
-        cacheProxy.remove(keys);
-    }
-
-    @Override
-    public int size() {
-        return this.keys().size();
-    }
-
-    @Override
-    public Set<Object> keys() {
-        Set<Object> keys = cacheProxy.keys(keyPrefix + "*");
-        if (CollectionUtils.isEmpty(keys)) {
-            return Collections.emptySet();
-        }
-        return keys;
-    }
-
-    @Override
-    public Collection<Serializable> values() {
-        Collection<Serializable> values = new ArrayList<>();
-        Set<Object> keys = this.keys();
-        if (CollectionUtils.isEmpty(keys)) {
-            return values;
-        }
-        for (Object k : keys) {
-            values.add(cacheProxy.get(k));
-        }
-        return values;
-    }
-
-    @Override
-    public Serializable remove(Object key) throws CacheException {
-        if (key == null) {
-            return null;
-        }
-        Serializable value = this.get(getKey(key));
-        cacheProxy.remove(getKey(key));
-        return value;
-    }
-
-    private Object getKey (Object key) {
-        return (key instanceof String ? (this.keyPrefix + key) : key);
-    }
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
deleted file mode 100644
index fedcb98..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.doumee.config.shiro;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.cache.Cache;
-import org.apache.shiro.cache.CacheException;
-import org.apache.shiro.cache.CacheManager;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * 鑷畾涔塖hiro CacheManager
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-@Slf4j
-@Component
-public class ShiroCacheManager implements CacheManager {
-
-    private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap();
-
-    private static ApplicationContext applicationContext;
-
-    @Override
-    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
-        log.debug("get cache, name=" + name);
-        Cache cache = this.caches.get(name);
-        if (cache == null) {
-            cache = applicationContext.getBean(ShiroCache.class, "shiro:cache:");
-            this.caches.put(name, cache);
-        }
-        return cache;
-    }
-
-    @Autowired
-    public void setApplicationContext (ApplicationContext applicationContext) {
-        if (ShiroCacheManager.applicationContext == null) {
-            ShiroCacheManager.applicationContext = applicationContext;
-        }
-    }
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroConfig.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroConfig.java
deleted file mode 100644
index 86411e1..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroConfig.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package com.doumee.config.shiro;
-
-import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.session.mgt.SessionManager;
-import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
-import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
-import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
-import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import javax.servlet.Filter;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * Shiro閰嶇疆
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-@Configuration
-public class ShiroConfig {
-
-    @Value("${cache.session.expire}")
-    private int sessionExpireTime;
-
-    @Autowired
-    private ShiroCredentialsMatcher shiroCredentialsMatcher;
-
-    @Autowired
-    private ShiroSessionDAO shiroSessionDAO;
-
-    @Autowired
-    private ShiroCacheManager shiroCacheManager;
-
-    @Autowired
-    private ShiroRealm shiroRealm;
-
-    @Bean
-    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
-        DefaultAdvisorAutoProxyCreator autoProxyCreator = new DefaultAdvisorAutoProxyCreator();
-        autoProxyCreator.setProxyTargetClass(true);
-        return autoProxyCreator;
-    }
-
-    @Bean
-    public SessionManager sessionManager() {
-        ShiroSessionManager sessionManager = new ShiroSessionManager();
-        sessionManager.setSessionDAO(shiroSessionDAO);
-        return sessionManager;
-    }
-
-    @Bean
-    public SecurityManager securityManager() {
-        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
-        securityManager.setRealm(shiroRealm);
-        securityManager.setSessionManager(this.sessionManager());
-        securityManager.setCacheManager(shiroCacheManager);
-        return securityManager;
-    }
-
-    @Bean
-    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
-        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
-        shiroFilterFactoryBean.setSecurityManager(securityManager);
-        Map<String, String> map = new LinkedHashMap<>();
-        // 璺緞鎷︽埅閰嶇疆
-        map.put("/system/login", "anon");
-        map.put("/system/logout", "anon");
-        map.put("/common/captcha", "anon");
-        map.put("/web/**", "anon");
-        //鏂囦欢涓婁紶鍙栨秷鎷︽埅
-        map.put("/public/**", "anon");
-        // - 鏀捐swagger
-        map.put("/doc.html", "anon");
-        map.put("/webjars/**", "anon");
-        map.put("/swagger-resources/**", "anon");
-        map.put("/v2/api-docs/**", "anon");
-        // - 鍏朵粬鎺ュ彛缁熶竴鎷︽埅
-        map.put("/**", "authc");
-        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
-        // 娣诲姞璁よ瘉杩囨护鍣�
-        Map<String, Filter> filters = new LinkedHashMap<>();
-        filters.put("authc", new ShiroAuthFilter());
-        shiroFilterFactoryBean.setFilters(filters);
-        return shiroFilterFactoryBean;
-    }
-
-    @Bean
-    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
-        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
-        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
-        return authorizationAttributeSourceAdvisor;
-    }
-
-    @Bean
-    public ShiroSessionDAO getShiroSessionDAO () {
-        shiroSessionDAO.setExpireTime(sessionExpireTime);
-        return shiroSessionDAO;
-    }
-
-    @Bean
-    public ShiroRealm getShiroRealm () {
-        shiroRealm.setCredentialsMatcher(shiroCredentialsMatcher);
-        return shiroRealm;
-    }
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
deleted file mode 100644
index 75c5280..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.doumee.config.shiro;
-
-import com.doumee.core.utils.Utils;
-import com.doumee.dao.system.model.SystemUser;
-import com.doumee.service.system.SystemUserService;
-import org.apache.shiro.authc.AuthenticationInfo;
-import org.apache.shiro.authc.AuthenticationToken;
-import org.apache.shiro.authc.UsernamePasswordToken;
-import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-
-/**
- * Shiro瀵嗙爜姣斿澶勭悊
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-@Component
-public class ShiroCredentialsMatcher extends HashedCredentialsMatcher {
-
-    @Lazy
-    @Autowired
-    private SystemUserService systemUserService;
-
-    @Override
-    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
-        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
-        SystemUser queryUserDto = new SystemUser();
-        queryUserDto.setUsername(usernamePasswordToken.getUsername());
-        queryUserDto.setDeleted(Boolean.FALSE);
-        SystemUser systemUser = systemUserService.findOne(queryUserDto);
-        if (systemUser == null) {
-            return Boolean.FALSE;
-        }
-        // 鍔犲瘑瀵嗙爜
-        String pwd = Utils.Secure.encryptPassword(new String(usernamePasswordToken.getPassword()), systemUser.getSalt());
-        // 姣旇緝瀵嗙爜
-        return this.equals(pwd, systemUser.getPassword());
-    }
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroRealm.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroRealm.java
deleted file mode 100644
index 690addf..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroRealm.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.doumee.config.shiro;
-
-import com.doumee.core.model.LoginUserInfo;
-import com.doumee.dao.system.model.SystemPermission;
-import com.doumee.dao.system.model.SystemRole;
-import com.doumee.dao.system.model.SystemUser;
-import com.doumee.service.system.SystemPermissionService;
-import com.doumee.service.system.SystemRoleService;
-import com.doumee.service.system.SystemUserService;
-import org.apache.shiro.authc.AuthenticationException;
-import org.apache.shiro.authc.AuthenticationInfo;
-import org.apache.shiro.authc.AuthenticationToken;
-import org.apache.shiro.authc.SimpleAuthenticationInfo;
-import org.apache.shiro.authz.AuthorizationInfo;
-import org.apache.shiro.authz.SimpleAuthorizationInfo;
-import org.apache.shiro.realm.AuthorizingRealm;
-import org.apache.shiro.subject.PrincipalCollection;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * 鑷畾涔塕ealm锛屽鐞嗚璇佸拰鏉冮檺
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-@Component
-public class ShiroRealm extends AuthorizingRealm {
-
-    @Lazy
-    @Autowired
-    private SystemUserService systemUserService;
-
-    @Lazy
-    @Autowired
-    private SystemRoleService systemRoleService;
-
-    @Lazy
-    @Autowired
-    private SystemPermissionService systemPermissionService;
-
-    /**
-     * 鏉冮檺澶勭悊
-     * @author Eva.Caesar Liu
-     * @date 2023/03/21 14:49
-     */
-    @Override
-    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
-        LoginUserInfo loginUserInfo = (LoginUserInfo)principalCollection.getPrimaryPrincipal();
-        // 璁剧疆鐢ㄦ埛瑙掕壊鍜屾潈闄�
-        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
-        authorizationInfo.addRoles(loginUserInfo.getRoles());
-        authorizationInfo.addStringPermissions(loginUserInfo.getPermissions());
-        return authorizationInfo;
-    }
-
-    /**
-     * 璁よ瘉澶勭悊
-     * @author Eva.Caesar Liu
-     * @date 2023/03/21 14:49
-     */
-    @Override
-    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
-        // 鑾峰彇鐢ㄦ埛鍚�
-        String username = authenticationToken.getPrincipal().toString();
-        // 鏍规嵁鐢ㄦ埛鍚嶆煡璇㈢敤鎴峰璞�
-        SystemUser queryDto = new SystemUser();
-        queryDto.setUsername(username);
-        queryDto.setDeleted(Boolean.FALSE);
-        SystemUser user = systemUserService.findOne(queryDto);
-        if (user == null) {
-            return null;
-        }
-        // 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
-        List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
-        List<SystemPermission> permissions = systemPermissionService.findByUserId(user.getId());
-        LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions);
-        // 楠岃瘉鐢ㄦ埛
-        return new SimpleAuthenticationInfo(userInfo, user.getPassword(), this.getName());
-    }
-
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
deleted file mode 100644
index 2cc6a11..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.doumee.config.shiro;
-
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.session.Session;
-import org.apache.shiro.session.UnknownSessionException;
-import org.apache.shiro.session.mgt.SimpleSession;
-import org.apache.shiro.session.mgt.eis.SessionDAO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * 鑷畾涔塖hiro SessionDAO锛屽皢浼氳瘽淇℃伅瀛樺叆缂撳瓨涓�
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-@Data
-@Slf4j
-@Component
-public class ShiroSessionDAO implements SessionDAO {
-
-    private static final String KEY_PREFIX = "shiro:session:";
-
-    @Autowired
-    private ShiroCache shiroCache;
-
-    private int expireTime = 1800;
-
-    @Autowired
-    private ShiroTokenManager shiroTokenManager;
-
-    @Override
-    public Serializable create(Session session) {
-        if (session == null) {
-            log.error("session is null");
-            throw new UnknownSessionException("session is null");
-        }
-        Serializable sessionId = shiroTokenManager.build();
-        ((SimpleSession)session).setId(sessionId);
-        this.saveSession(session);
-        return sessionId;
-    }
-
-    @Override
-    public Session readSession(Serializable sessionId) throws UnknownSessionException{
-        if (sessionId == null) {
-            log.warn("session id is null");
-            return null;
-        }
-        if (sessionId instanceof String) {
-            // 瀵筍essionId杩涜楠岃瘉锛堝彲鐢ㄤ簬闃叉Session鎹曡幏銆佹毚鍔涙崟鎹夌瓑涓�绯诲垪瀹夊叏闂锛屾渶缁堝畨鍏ㄦ�у彇鍐充簬check濡備綍瀹炵幇锛�
-            shiroTokenManager.check((String) sessionId);
-        }
-        log.debug("read session from cache");
-        Session session = getSessionFromCache(sessionId);
-        if (session == null) {
-            throw new UnknownSessionException("There is no session with id [" + sessionId + "]");
-        }
-        return session;
-    }
-
-    @Override
-    public void update(Session session) throws UnknownSessionException {
-        this.saveSession(session);
-    }
-
-    @Override
-    public void delete(Session session) {
-        if (session != null && session.getId() != null) {
-            shiroCache.remove(KEY_PREFIX + session.getId());
-        }
-    }
-
-    @Override
-    public Collection<Session> getActiveSessions() {
-        Set<Session> sessions = new HashSet<>();
-        Set<Object> keys = shiroCache.keys();
-        if (keys != null && keys.size() > 0) {
-            Iterator iter = keys.iterator();
-            while(iter.hasNext()) {
-                sessions.add((Session) shiroCache.get(iter.next()));
-            }
-        }
-        return sessions;
-    }
-
-    private void saveSession(Session session) throws UnknownSessionException {
-        if (session == null || session.getId() == null) {
-            log.error("session or session id is null");
-            throw new UnknownSessionException("session or session id is null");
-        }
-        shiroCache.put(KEY_PREFIX + session.getId(), (SimpleSession)session, expireTime);
-    }
-
-    private Session getSessionFromCache (Serializable sessionId) {
-        Serializable object = shiroCache.get(KEY_PREFIX + sessionId);
-        Session session = null;
-        if (object != null) {
-            session = (Session)shiroCache.get(KEY_PREFIX + sessionId);
-        }
-        return session;
-    }
-
-    public void setExpireTime (int expireTime) {
-        this.expireTime = expireTime;
-    }
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
deleted file mode 100644
index ef159a7..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.doumee.config.shiro;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.session.Session;
-import org.apache.shiro.session.mgt.DefaultSessionManager;
-import org.apache.shiro.session.mgt.SessionContext;
-import org.apache.shiro.session.mgt.SessionKey;
-import org.apache.shiro.web.servlet.Cookie;
-import org.apache.shiro.web.servlet.ShiroHttpServletRequest;
-import org.apache.shiro.web.servlet.SimpleCookie;
-import org.apache.shiro.web.session.mgt.WebSessionManager;
-import org.apache.shiro.web.util.WebUtils;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.Serializable;
-
-/**
- * 鑷畾涔変細璇濈鐞嗗櫒
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49
- */
-@Slf4j
-public class ShiroSessionManager extends DefaultSessionManager implements WebSessionManager {
-
-    private static final String AUTH_TOKEN = "eva-auth-token";
-
-    @Override
-    protected void onStart(Session session, SessionContext context) {
-        super.onStart(session, context);
-        if (!WebUtils.isHttp(context)) {
-            log.debug("SessionContext argument is not Http compatible or does not have an Http request/response pair. No session ID cookie will be set.");
-            return;
-        }
-        HttpServletRequest request = WebUtils.getHttpRequest(context);
-        HttpServletResponse response = WebUtils.getHttpResponse(context);
-        Serializable sessionId = session.getId();
-        this.storeSessionId(sessionId, request, response);
-        request.removeAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE);
-        request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_IS_NEW, Boolean.TRUE);
-    }
-
-    @Override
-    public Serializable getSessionId(SessionKey key) {
-        Serializable sessionId = super.getSessionId(key);
-        if (sessionId == null && WebUtils.isWeb(key)) {
-            ServletRequest servletRequest = WebUtils.getRequest(key);
-            if (!(servletRequest instanceof HttpServletRequest)) {
-                log.trace("Can not get sessionId from header, the request is not HttpServletRequest");
-                return null;
-            }
-            HttpServletRequest request = (HttpServletRequest) servletRequest;
-            // 浠巆ookie涓幏鍙栬璇�
-            javax.servlet.http.Cookie[] cookies = request.getCookies();
-            if (cookies != null) {
-                for (javax.servlet.http.Cookie cookie : cookies) {
-                    if (AUTH_TOKEN.equals(cookie.getName())) {
-                        return cookie.getValue();
-                    }
-                }
-            }
-            // 浠巋eader涓幏鍙栬璇�
-            return request.getHeader(AUTH_TOKEN);
-        }
-        return sessionId;
-    }
-
-    @Override
-    public boolean isServletContainerSessions() {
-        return false;
-    }
-
-    private void storeSessionId(Serializable currentId, HttpServletRequest request, HttpServletResponse response) {
-        if (currentId == null) {
-            String msg = "sessionId cannot be null when persisting for subsequent requests.";
-            throw new IllegalArgumentException(msg);
-        }
-        Cookie cookie = new SimpleCookie(AUTH_TOKEN);
-        cookie.setHttpOnly(false);
-        String idString = currentId.toString();
-        cookie.setValue(idString);
-        cookie.saveTo(request, response);
-        log.trace("Set session ID cookie for session with id {}", idString);
-    }
-}
diff --git a/server/web/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java b/server/web/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
deleted file mode 100644
index d5f3b40..0000000
--- a/server/web/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.doumee.config.shiro;
-
-import com.doumee.core.exception.UnSafeSessionException;
-import org.springframework.stereotype.Component;
-
-import java.util.UUID;
-
-/**
- * 榛樿Token绠$悊鍣�
- * @author Eva.Caesar Liu
- * @date 2023/03/21 14:49  36143 45311
- */
-@Component
-public class ShiroTokenManager {
-
-    String build() {
-        return UUID.randomUUID().toString();
-    }
-
-    void check(String token) throws UnSafeSessionException {
-        if (token == null || token.length() != 36) {
-            throw new UnSafeSessionException();
-        }
-    }
-}

--
Gitblit v1.9.3