From a3ac76efa8bb383dd8e2151760762aa14d048892 Mon Sep 17 00:00:00 2001
From: nidapeng <jp@doumee.com>
Date: 星期四, 14 三月 2024 09:49:36 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/shop/src/main/java/com/doumee/api/business/DuSolutionController.java         |   90 +
 server/shop/src/main/java/com/doumee/api/business/MultifileController.java          |   90 +
 server/shop/src/main/java/com/doumee/api/business/WorktypeController.java           |  116 +
 server/shop/src/main/java/com/doumee/api/system/SystemPositionController.java       |  106 +
 server/shop/src/main/java/com/doumee/api/system/SystemDictController.java           |   82 
 server/shop/src/main/java/com/doumee/api/system/SystemUserController.java           |  192 ++
 server/shop/src/main/java/com/doumee/api/business/CompanyPermissionController.java  |   90 +
 server/shop/src/main/java/com/doumee/api/business/SolutionWorktypeController.java   |   90 +
 server/shop/src/main/java/com/doumee/api/business/MemberInsuranceController.java    |  109 +
 server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java        |  143 +
 server/shop/src/main/java/com/doumee/api/business/ApplyDetailController.java        |   96 +
 server/shop/src/main/java/com/doumee/api/business/SolutionsBaseController.java      |   90 +
 server/shop/src/main/java/com/doumee/api/common/CaptchaController.java              |   36 
 server/shop/src/main/java/com/doumee/api/system/SystemRoleController.java           |  118 +
 server/shop/src/main/java/com/doumee/api/system/SystemController.java               |   80 
 server/shop/src/main/java/com/doumee/api/system/SystemMonitorController.java        |   31 
 server/shop/src/main/java/com/doumee/api/business/NoticesController.java            |   92 +
 server/shop/src/main/java/com/doumee/api/business/ApplyLogController.java           |   90 +
 server/shop/src/main/java/com/doumee/api/business/AreasController.java              |   90 +
 server/shop/src/main/java/com/doumee/ShopApplication.java                           |   25 
 server/shop/src/main/java/com/doumee/api/system/SystemDataPermissionController.java |  106 +
 server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java   |   22 
 server/shop/src/main/java/com/doumee/api/business/DispatchUnitController.java       |  113 +
 server/shop/src/main/java/com/doumee/api/business/ApplyChagneDetailController.java  |   96 +
 server/shop/src/main/java/com/doumee/api/business/SolutionsController.java          |  105 +
 server/shop/src/main/java/com/doumee/api/system/SystemDepartmentController.java     |  109 +
 server/shop/src/main/java/com/doumee/api/system/SystemMenuController.java           |  102 +
 server/shop/src/main/java/com/doumee/api/business/TaxDetialController.java          |   90 +
 server/shop/src/main/java/com/doumee/api/common/PublicController.java               |  346 ++++
 server/shop/src/main/java/com/doumee/api/system/SystemTraceLogController.java       |   46 
 server/shop/src/main/java/com/doumee/api/business/SmsEmailController.java           |   97 +
 server/shop/src/main/java/com/doumee/api/business/CompanyController.java            |  151 +
 server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java         |   45 
 server/shop/pom.xml                                                                 |   58 
 server/shop/src/main/java/com/doumee/api/business/DuLogController.java              |   90 +
 server/shop/src/main/java/com/doumee/api/business/InsuranceApplyController.java     |  142 +
 server/shop/src/main/java/com/doumee/api/business/MemberController.java             |  100 +
 server/shop/src/main/java/com/doumee/api/system/SystemLoginLogController.java       |   47 
 server/shop/src/main/java/com/doumee/Main.java                                      |    7 
 server/shop/src/main/java/com/doumee/api/business/DuWorktypeController.java         |   90 +
 server/shop/src/main/java/com/doumee/api/BaseController.java                        |   60 
 server/shop/src/main/java/com/doumee/api/business/SignRecordController.java         |   90 +
 server/shop/src/main/java/com/doumee/config/swagger/SwaggerConfig.java              |   99 +
 server/shop/src/main/java/com/doumee/api/system/SystemDictDataController.java       |   95 +
 server/shop/src/main/java/com/doumee/api/business/InsuranceController.java          |  104 +
 server/shop/src/main/java/com/doumee/api/business/SettleClaimsController.java       |  152 +
 server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java         |   90 +
 server/pom.xml                                                                      |    3 
 server/shop/src/main/java/com/doumee/api/business/SettleClaimsLogController.java    |   90 +
 server/shop/src/main/resources/application.yml                                      |   65 
 server/shop/src/main/java/com/doumee/api/system/SystemPermissionController.java     |   91 +
 server/company/src/main/java/com/doumee/api/common/PublicController.java            |    1 
 server/shop/src/main/java/com/doumee/api/business/TaxesController.java              |  105 +
 server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java        |   90 +
 server/shop/src/main/java/com/doumee/api/business/CompanySolutionController.java    |  102 +
 55 files changed, 5,053 insertions(+), 2 deletions(-)

diff --git a/server/company/src/main/java/com/doumee/api/common/PublicController.java b/server/company/src/main/java/com/doumee/api/common/PublicController.java
index 9954481..d8754cb 100644
--- a/server/company/src/main/java/com/doumee/api/common/PublicController.java
+++ b/server/company/src/main/java/com/doumee/api/common/PublicController.java
@@ -305,7 +305,6 @@
                     if (true) {
                         // 鍏抽棴FTP娴�
                         // 绉诲姩鎴愬姛,杩斿洖鏂囦欢鍚�
-
                         /*context.put("error", 0);
                         context.put("url", remoteFileName);
                         context.put("fullurl", remoteFileName);
diff --git a/server/pom.xml b/server/pom.xml
index aa859e4..19ed8a1 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -14,7 +14,8 @@
     <module>service</module>
     <module>company</module>
     <module>dianziqian</module>
-      <module>emaysms</module>
+    <module>emaysms</module>
+    <module>shop</module>
   </modules>
 
   <parent>
diff --git a/server/shop/pom.xml b/server/shop/pom.xml
new file mode 100644
index 0000000..ed19a83
--- /dev/null
+++ b/server/shop/pom.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.doumee</groupId>
+        <artifactId>yunyibao</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>shop</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.doumee</groupId>
+            <artifactId>service</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <build>
+        <finalName>shop</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                    <mainClass>com.doumee.ShopApplication</mainClass>
+                    <layout>ZIP</layout>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <!--<plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-war-plugin</artifactId>
+            <version>2.6</version>
+            </plugin>-->
+
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/server/shop/src/main/java/com/doumee/Main.java b/server/shop/src/main/java/com/doumee/Main.java
new file mode 100644
index 0000000..ada0d0d
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/Main.java
@@ -0,0 +1,7 @@
+package com.doumee;
+
+public class Main {
+    public static void main(String[] args) {
+        System.out.println("Hello world!");
+    }
+}
\ No newline at end of file
diff --git a/server/shop/src/main/java/com/doumee/ShopApplication.java b/server/shop/src/main/java/com/doumee/ShopApplication.java
new file mode 100644
index 0000000..2c731bc
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/ShopApplication.java
@@ -0,0 +1,25 @@
+package com.doumee;
+
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.ApplicationContext;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+/**
+ * 鍚姩绫�
+ * @author Eva.Caesar Liu
+ * @date 2023/02/14 11:14
+ */
+@Slf4j
+@SpringBootApplication
+@MapperScan("com.doumee.dao")
+@EnableAsync
+public class ShopApplication {
+    public static void main(String[] args) {
+        ApplicationContext context = SpringApplication.run(ShopApplication.class);
+        context.getEnvironment();
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/BaseController.java b/server/shop/src/main/java/com/doumee/api/BaseController.java
new file mode 100644
index 0000000..c45000d
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/BaseController.java
@@ -0,0 +1,60 @@
+package com.doumee.api;
+
+import com.doumee.core.model.LoginUserInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller鍩虹被
+ * @author Eva.Caesar Liu
+ * @date 2023/02/14 11:14
+ */
+@Slf4j
+public class BaseController {
+
+    /**
+     * 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+     * @author Eva.Caesar Liu
+     * @date 2023/02/14 11:14
+     */
+    protected LoginUserInfo getLoginUser () {
+        return (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
+    }
+
+    /**
+     * 鑾峰彇ID闆嗗悎
+     *
+     * @param ids 浣跨敤","闅斿紑鐨勫涓狪D
+     * @return List<Integer>
+     */
+    protected List<Integer> getIdList (String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        return idList;
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢瀛楄妭娴�
+     *
+     * @param is 杈撳叆娴�
+     * @return ByteArrayOutputStream
+     */
+    protected ByteArrayOutputStream getOutputStream (InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        byte[] bs = new byte[is.available()];
+        int len;
+        while ((len = is.read(bs)) != -1) {
+            baos.write(bs, 0, len);
+        }
+        return baos;
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/ApplyChagneDetailController.java b/server/shop/src/main/java/com/doumee/api/business/ApplyChagneDetailController.java
new file mode 100644
index 0000000..51fa560
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/ApplyChagneDetailController.java
@@ -0,0 +1,96 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.ApplyDetailPageDTO;
+import com.doumee.dao.business.model.ApplyChagneDetail;
+import com.doumee.service.business.ApplyChagneDetailService;
+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/01/16 10:03
+ */
+@Api(tags = "鍔犲噺淇濇崲鍘傜敵璇锋槑缁嗕俊鎭〃")
+@RestController
+@RequestMapping("/business/applyChagneDetail")
+public class ApplyChagneDetailController extends BaseController {
+
+    @Autowired
+    private ApplyChagneDetailService applyChagneDetailService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:applychagnedetail:create")
+    public ApiResponse create(@RequestBody ApplyChagneDetail applyChagneDetail) {
+        return ApiResponse.success(applyChagneDetailService.create(applyChagneDetail));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:applychagnedetail:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        applyChagneDetailService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:applychagnedetail:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        applyChagneDetailService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:applychagnedetail:update")
+    public ApiResponse updateById(@RequestBody ApplyChagneDetail applyChagneDetail) {
+        applyChagneDetailService.updateById(applyChagneDetail);
+        return ApiResponse.success(null);
+    }
+    //
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:applychagnedetail:query")
+    public ApiResponse<PageData<ApplyChagneDetail>> findPage (@RequestBody PageWrap<ApplyDetailPageDTO> pageWrap) {
+        return ApiResponse.success(applyChagneDetailService.findPageForCompany(pageWrap));
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/list")
+    @RequiresPermissions("business:applychagnedetail:query")
+    public ApiResponse<List<ApplyChagneDetail>> findList (@RequestBody ApplyChagneDetail  pageWrap) {
+        return ApiResponse.success(applyChagneDetailService.findList(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:applychagnedetail:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<ApplyDetailPageDTO> pageWrap, HttpServletResponse response) {
+
+    }
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:applychagnedetail:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(applyChagneDetailService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java b/server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java
new file mode 100644
index 0000000..9bf62a2
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java
@@ -0,0 +1,143 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.ApplyChange;
+import com.doumee.service.business.ApplyChangeService;
+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/01/16 10:03
+ */
+@Api(tags = "鍔犲噺淇濇崲鍘傜敵璇蜂俊鎭〃")
+@RestController
+@RequestMapping("/business/applyChange")
+public class ApplyChangeController extends BaseController {
+
+    @Autowired
+    private ApplyChangeService applyChangeService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:applychange:create")
+    public ApiResponse create(@RequestBody ApplyChange applyChange) {
+        return ApiResponse.success(applyChangeService.create(applyChange));
+    }
+    @PreventRepeat
+    @ApiOperation("骞冲彴閫�鍥炴姇淇�")
+    @PostMapping("/back")
+    @RequiresPermissions("business:applychange:back")
+    public ApiResponse back(@RequestBody ApplyChange applyChange) {
+        return ApiResponse.success(applyChangeService.back(applyChange));
+    }
+    @PreventRepeat
+    @ApiOperation("骞冲彴澶勭悊閫�鍥炵敵璇�")
+    @PostMapping("/dealBackApply")
+    @RequiresPermissions("business:applychange:dealBackApply")
+    public ApiResponse dealBackApply(@RequestBody ApplyChange applyChange) {
+        return ApiResponse.success(applyChangeService.dealBackApply(applyChange));
+    }
+    @PreventRepeat
+    @ApiOperation("骞冲彴涓婁紶鎵瑰崟")
+    @PostMapping("/uploadPidan")
+    @RequiresPermissions("business:applychange:uploadPidan")
+    public ApiResponse uploadPidan(@RequestBody ApplyChange applyChange) {
+        return ApiResponse.success(applyChangeService.uploadPidan(applyChange));
+    }
+    @PreventRepeat
+    @ApiOperation("骞冲彴淇敼鎵瑰崟")
+    @PostMapping("/editPidan")
+    @RequiresPermissions("business:applychange:uploadPidan")
+    public ApiResponse editPidan(@RequestBody ApplyChange applyChange) {
+        return ApiResponse.success(applyChangeService.editPidan(applyChange));
+    }
+    @ApiOperation("鑾峰彇鍔犲噺淇濈绔犲湴鍧�")
+    @PostMapping("/getJiajianBaoSignLink")
+    @RequiresPermissions("business:applychange:sign")
+    public ApiResponse<String> getSignLinkJiajiabao (@RequestBody ApplyChange model, HttpServletResponse response) {
+        return ApiResponse.success( applyChangeService.getSignLinkJiajiabao(model));
+    }
+    @ApiOperation("鑾峰彇缂撳瓨鐢宠绛剧珷鍦板潃")
+    @PostMapping("/getChangeUnitSignLink")
+    @RequiresPermissions("business:applychange:sign")
+    public ApiResponse<String> getChangeUnitSignLink (@RequestBody ApplyChange model, HttpServletResponse response) {
+        return ApiResponse.success( applyChangeService.getSignLinkChangeUnit(model));
+    }
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:applychange:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        applyChangeService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:applychange:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        applyChangeService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:applychange:update")
+    public ApiResponse updateById(@RequestBody ApplyChange applyChange) {
+        applyChangeService.updateById(applyChange);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:applychange:query")
+    public ApiResponse<PageData<ApplyChange>> findPage (@RequestBody PageWrap<ApplyChange> pageWrap) {
+        return ApiResponse.success(applyChangeService.findPageForCompany(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:applychange:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<ApplyChange> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(ApplyChange.class).export(applyChangeService.findPageForCompany(pageWrap).getRecords(), "鍔犲噺淇濇崲鍘傜敵璇蜂俊鎭〃", response);
+    }
+
+    @ApiOperation("瀵煎嚭鍔犲噺淇濊鎯呭崟")
+    @PostMapping("/exportJiajianBaoExcel")
+    @RequiresPermissions("business:applychange:exportExcel")
+    public void exportJiajianBaoExcel (@RequestBody ApplyChange model, HttpServletResponse response) {
+        ExcelExporter.build(ApplyChange.class).exportJiajianBaoExcel(applyChangeService.exportJiajianBaoExcel(model),   response);
+    }
+    @ApiOperation("瀵煎嚭鎹㈠巶鐢宠璇︽儏鍗�")
+    @PostMapping("/exportChangeUnitExcel")
+    @RequiresPermissions("business:applychange:exportExcel")
+    public void exportChangeUnitExcel (@RequestBody ApplyChange model, HttpServletResponse response) {
+        ExcelExporter.build(ApplyChange.class).exportChangeUnitExcel(applyChangeService.exportChangeUnitExcel(model),   response);
+    }
+
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:applychange:query")
+    public ApiResponse<ApplyChange> findById(@PathVariable Integer id) {
+        return ApiResponse.success(applyChangeService.findDetail(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/ApplyDetailController.java b/server/shop/src/main/java/com/doumee/api/business/ApplyDetailController.java
new file mode 100644
index 0000000..700d030
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/ApplyDetailController.java
@@ -0,0 +1,96 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.ApplyDetailPageDTO;
+import com.doumee.dao.business.model.ApplyDetail;
+import com.doumee.service.business.ApplyDetailService;
+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/01/16 10:03
+ */
+@Api(tags = "鎶曚繚鐢宠鏄庣粏淇℃伅琛�")
+@RestController
+@RequestMapping("/business/applyDetail")
+public class ApplyDetailController extends BaseController {
+
+    @Autowired
+    private ApplyDetailService applyDetailService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:applydetail:create")
+    public ApiResponse create(@RequestBody ApplyDetail applyDetail) {
+        return ApiResponse.success(applyDetailService.create(applyDetail));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:applydetail:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        applyDetailService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:applydetail:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        applyDetailService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:applydetail:update")
+    public ApiResponse updateById(@RequestBody ApplyDetail applyDetail) {
+        applyDetailService.updateById(applyDetail);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:applydetail:query")
+    public ApiResponse<PageData<ApplyDetail>> findPage (@RequestBody PageWrap<ApplyDetailPageDTO> pageWrap) {
+        return ApiResponse.success(applyDetailService.findPageForCompany(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @RequiresPermissions("business:applydetail:query")
+    public ApiResponse<List<ApplyDetail>> findList (@RequestBody  ApplyDetail pageWrap) {
+        return ApiResponse.success(applyDetailService.findList(pageWrap));
+    }
+    @ApiOperation("瀵煎嚭鍦ㄤ繚浜哄憳璇﹀崟Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:applydetail:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<ApplyDetailPageDTO> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(ApplyDetail.class).exportWithFirstAndEnd(applyDetailService.findPageForCompany(pageWrap).getRecords(),
+                 pageWrap.getModel().getSolutionName(),"鍦ㄤ繚浜哄憳鍚嶅崟",null, response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:applydetail:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(applyDetailService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/ApplyLogController.java b/server/shop/src/main/java/com/doumee/api/business/ApplyLogController.java
new file mode 100644
index 0000000..dfc8d79
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/ApplyLogController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.ApplyLog;
+import com.doumee.service.business.ApplyLogService;
+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/01/16 10:03
+ */
+@Api(tags = "鎶曚繚鐢宠鎿嶄綔鍘嗗彶琛�")
+@RestController
+@RequestMapping("/business/applyLog")
+public class ApplyLogController extends BaseController {
+
+    @Autowired
+    private ApplyLogService applyLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:applylog:create")
+    public ApiResponse create(@RequestBody ApplyLog applyLog) {
+        return ApiResponse.success(applyLogService.create(applyLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:applylog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        applyLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:applylog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        applyLogService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:applylog:update")
+    public ApiResponse updateById(@RequestBody ApplyLog applyLog) {
+        applyLogService.updateById(applyLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:applylog:query")
+    public ApiResponse<PageData<ApplyLog>> findPage (@RequestBody PageWrap<ApplyLog> pageWrap) {
+        return ApiResponse.success(applyLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:applylog:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<ApplyLog> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(ApplyLog.class).export(applyLogService.findPage(pageWrap).getRecords(), "鎶曚繚鐢宠鎿嶄綔鍘嗗彶琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:applylog:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(applyLogService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/AreasController.java b/server/shop/src/main/java/com/doumee/api/business/AreasController.java
new file mode 100644
index 0000000..4ab4e89
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/AreasController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Areas;
+import com.doumee.service.business.AreasService;
+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/01/16 10:03
+ */
+@Api(tags = "鐪佸競鍖轰俊鎭〃")
+@RestController
+@RequestMapping("/business/areas")
+public class AreasController extends BaseController {
+
+    @Autowired
+    private AreasService areasService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:areas:create")
+    public ApiResponse create(@RequestBody Areas areas) {
+        return ApiResponse.success(areasService.create(areas));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:areas:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        areasService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:areas:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        areasService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:areas:update")
+    public ApiResponse updateById(@RequestBody Areas areas) {
+        areasService.updateById(areas);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:areas:query")
+    public ApiResponse<PageData<Areas>> findPage (@RequestBody PageWrap<Areas> pageWrap) {
+        return ApiResponse.success(areasService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:areas:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Areas> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Areas.class).export(areasService.findPage(pageWrap).getRecords(), "鐪佸競鍖轰俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:areas:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(areasService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/CompanyController.java b/server/shop/src/main/java/com/doumee/api/business/CompanyController.java
new file mode 100644
index 0000000..22e5c5c
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/CompanyController.java
@@ -0,0 +1,151 @@
+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.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.Company;
+import com.doumee.service.business.CompanyService;
+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/01/16 10:03
+ */
+@Api(tags = "浼佷笟淇℃伅琛�")
+@RestController
+@RequestMapping("/business/company")
+public class CompanyController extends BaseController {
+
+    @Autowired
+    private CompanyService companyService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:company:create")
+    public ApiResponse create(@RequestBody Company company) {
+        companyService.create(company);
+        companyService.startSignAuth(company.getId());
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:company:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        companyService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:company:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        companyService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:company:update")
+    public ApiResponse updateById(@RequestBody Company company) {
+        companyService.updateById(company);
+        companyService.startSignAuth(company.getId());
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID绂佺敤鍚敤")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("business:company:update")
+    public ApiResponse updateStatus(@RequestBody Company company) {
+        companyService.updateStatus(company);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("淇敼淇濋櫓鏂规")
+    @PostMapping("/updateSolutions")
+    @RequiresPermissions("business:company:update")
+    public ApiResponse updateSolutions(@RequestBody Company company) {
+        companyService.updateSolutions(company);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("浼佷笟鏇存崲鎵嬫満鍙�")
+    @PostMapping("/updatePhone")
+    @RequiresPermissions("business:company:update")
+    public ApiResponse updatePhone(@RequestBody Company company) {
+        companyService.updatePhone(company);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鏍规嵁ID鐢靛瓙绛捐璇佷紒涓氫俊鎭�")
+    @PostMapping("/startSignAuth/{id}")
+    @RequiresPermissions("business:company:update")
+    public ApiResponse startSignAuth(@PathVariable Integer id) {
+        companyService.startSignAuth(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:company:query")
+    public ApiResponse<PageData<Company>> findPage (@RequestBody PageWrap<Company> pageWrap) {
+        //鏉冮檺鑼冨洿鍐�
+        return ApiResponse.success(companyService.findPage(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴鏁版嵁(璐﹀彿鍒嗛厤浼佷笟浣跨敤)")
+    @PostMapping("/pageAll")
+    @RequiresPermissions("business:companypermission:create")
+    public ApiResponse<List<Company>> findPageAll (@RequestBody  Company pageWrap) {
+        pageWrap.setQueryFlag(Constants.ONE);//鏌ヨ鍏ㄩ儴
+        return ApiResponse.success(companyService.findList(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴鏁版嵁")
+    @PostMapping("/list")
+    @RequiresPermissions("business:company:query")
+    public ApiResponse<List<Company>> findList (@RequestBody  Company pageWrap) {
+        pageWrap.setQueryFlag(Constants.ZERO);//鏌ヨ鍏ㄩ儴鏉冮檺鑼冨洿鍐�
+        return ApiResponse.success(companyService.findList(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:company:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Company> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Company.class).export(companyService.findPage(pageWrap).getRecords(), "浼佷笟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:company:query")
+    public ApiResponse<Company> findById(@PathVariable Integer id) {
+
+        return ApiResponse.success(companyService.findById(id));
+    }
+
+    @ApiOperation("浼佷笟璇佷欢涓嬭浇")
+    @PostMapping("/exportFiles")
+    @RequiresPermissions("business:company:exportExcel")
+    public void exportFiles(@RequestBody Company company,HttpServletResponse response) {
+        if(company.getId() == null){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        companyService.exportFiles(company.getId(),response);
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/CompanyPermissionController.java b/server/shop/src/main/java/com/doumee/api/business/CompanyPermissionController.java
new file mode 100644
index 0000000..5cabd9f
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/CompanyPermissionController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.CompanyPermission;
+import com.doumee.service.business.CompanyPermissionService;
+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/01/16 10:03
+ */
+@Api(tags = "绠$悊鍛樼鐞嗕紒涓氭潈闄�")
+@RestController
+@RequestMapping("/business/companyPermission")
+public class CompanyPermissionController extends BaseController {
+
+    @Autowired
+    private CompanyPermissionService companyPermissionService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:companypermission:create")
+    public ApiResponse create(@RequestBody CompanyPermission companyPermission) {
+        return ApiResponse.success(companyPermissionService.create(companyPermission));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:companypermission:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        companyPermissionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:companypermission:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        companyPermissionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:companypermission:update")
+    public ApiResponse updateById(@RequestBody CompanyPermission companyPermission) {
+        companyPermissionService.updateById(companyPermission);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:companypermission:query")
+    public ApiResponse<PageData<CompanyPermission>> findPage (@RequestBody PageWrap<CompanyPermission> pageWrap) {
+        return ApiResponse.success(companyPermissionService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:companypermission:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<CompanyPermission> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(CompanyPermission.class).export(companyPermissionService.findPage(pageWrap).getRecords(), "绠$悊鍛樼鐞嗕紒涓氭潈闄�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:companypermission:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(companyPermissionService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/CompanySolutionController.java b/server/shop/src/main/java/com/doumee/api/business/CompanySolutionController.java
new file mode 100644
index 0000000..d65c852
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/CompanySolutionController.java
@@ -0,0 +1,102 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.CompanySolution;
+import com.doumee.service.business.CompanySolutionService;
+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/01/16 10:03
+ */
+@Api(tags = "浼佷笟鍙敤淇濋櫓鏂规鍏宠仈琛�")
+@RestController
+@RequestMapping("/business/companySolution")
+public class CompanySolutionController extends BaseController {
+
+    @Autowired
+    private CompanySolutionService companySolutionService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:companysolution:create")
+    public ApiResponse create(@RequestBody CompanySolution companySolution) {
+        return ApiResponse.success(companySolutionService.create(companySolution));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:companysolution:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        companySolutionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:companysolution:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        companySolutionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:companysolution:update")
+    public ApiResponse updateById(@RequestBody CompanySolution companySolution) {
+        companySolutionService.updateById(companySolution);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:companysolution:query")
+    public ApiResponse<PageData<CompanySolution>> findPage (@RequestBody PageWrap<CompanySolution> pageWrap) {
+        return ApiResponse.success(companySolutionService.findPage(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @RequiresPermissions("business:companysolution:query")
+    public ApiResponse<List<CompanySolution>> findPage (@RequestBody CompanySolution  pageWrap) {
+        return ApiResponse.success(companySolutionService.findList(pageWrap));
+    }
+    @ApiOperation("鏌ヨ浼佷笟鍏ㄩ儴鍏宠仈鏂规")
+    @PostMapping("/listForCompany")
+    @RequiresPermissions("business:companysolution:query")
+    public ApiResponse<List<CompanySolution>> findListForCompany (@RequestBody CompanySolution  pageWrap) {
+        return ApiResponse.success(companySolutionService.findListForCompany(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:companysolution:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<CompanySolution> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(CompanySolution.class).export(companySolutionService.findPage(pageWrap).getRecords(), "浼佷笟鍙敤淇濋櫓鏂规鍏宠仈琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:companysolution:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(companySolutionService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/DispatchUnitController.java b/server/shop/src/main/java/com/doumee/api/business/DispatchUnitController.java
new file mode 100644
index 0000000..75d2484
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/DispatchUnitController.java
@@ -0,0 +1,113 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.DispatchUnitQueryDTO;
+import com.doumee.dao.business.dto.SaveDispatchUnitDTO;
+import com.doumee.dao.business.model.DispatchUnit;
+import com.doumee.service.business.DispatchUnitService;
+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/01/16 10:03
+ */
+@Api(tags = "娲鹃仯鍗曚綅淇℃伅琛�")
+@RestController
+@RequestMapping("/business/dispatchUnit")
+public class DispatchUnitController extends BaseController {
+
+    @Autowired
+    private DispatchUnitService dispatchUnitService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:dispatchunit:create")
+    public ApiResponse create(@RequestBody SaveDispatchUnitDTO saveDispatchUnitDTO) {
+        return ApiResponse.success(dispatchUnitService.create(saveDispatchUnitDTO));
+    }
+    @ApiOperation("娲鹃仯鍗曚綅瀹℃牳")
+    @PostMapping("/check")
+    @RequiresPermissions("business:dispatchunit:check")
+    public ApiResponse check(@RequestBody DispatchUnit param) {
+        return ApiResponse.success(dispatchUnitService.check(param));
+    }
+    @ApiOperation("娲鹃仯鍗曚綅宸ョ瀹℃牳")
+    @PostMapping("/checkWorktype")
+    @RequiresPermissions("business:dispatchunit:checkWorktype")
+    public ApiResponse checkWorktype(@RequestBody DispatchUnit param) {
+        return ApiResponse.success(dispatchUnitService.checkWorktype(param));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:dispatchunit:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        dispatchUnitService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:dispatchunit:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        dispatchUnitService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+
+    @ApiOperation("鏁版嵁鍒楄〃")
+    @PostMapping("/findListByDTO")
+    @RequiresPermissions("business:dispatchunit:query")
+    public ApiResponse<List<DispatchUnit>> findListByDTO (@RequestBody DispatchUnitQueryDTO dispatchUnitQueryDTO) {
+        return ApiResponse.success(dispatchUnitService.findByDTO(dispatchUnitQueryDTO));
+    }
+
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:dispatchunit:update")
+    public ApiResponse updateById(@RequestBody DispatchUnit dispatchUnit) {
+        dispatchUnitService.updateById(dispatchUnit);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:dispatchunit:query")
+    public ApiResponse<PageData<DispatchUnit>> findPage (@RequestBody PageWrap<DispatchUnit> pageWrap) {
+        return ApiResponse.success(dispatchUnitService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:dispatchunit:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<DispatchUnit> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(DispatchUnit.class).export(dispatchUnitService.findPage(pageWrap).getRecords(), "娲鹃仯鍗曚綅淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:dispatchunit:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(dispatchUnitService.detailById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/DuLogController.java b/server/shop/src/main/java/com/doumee/api/business/DuLogController.java
new file mode 100644
index 0000000..61fd2ee
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/DuLogController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.DuLog;
+import com.doumee.service.business.DuLogService;
+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/01/16 10:03
+ */
+@Api(tags = "娲鹃仯鍗曚綅鎿嶄綔鍘嗗彶琛�")
+@RestController
+@RequestMapping("/business/duLog")
+public class DuLogController extends BaseController {
+
+    @Autowired
+    private DuLogService duLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:dulog:create")
+    public ApiResponse create(@RequestBody DuLog duLog) {
+        return ApiResponse.success(duLogService.create(duLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:dulog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        duLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:dulog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        duLogService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:dulog:update")
+    public ApiResponse updateById(@RequestBody DuLog duLog) {
+        duLogService.updateById(duLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:dulog:query")
+    public ApiResponse<PageData<DuLog>> findPage (@RequestBody PageWrap<DuLog> pageWrap) {
+        return ApiResponse.success(duLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:dulog:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<DuLog> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(DuLog.class).export(duLogService.findPage(pageWrap).getRecords(), "娲鹃仯鍗曚綅鎿嶄綔鍘嗗彶琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:dulog:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(duLogService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/DuSolutionController.java b/server/shop/src/main/java/com/doumee/api/business/DuSolutionController.java
new file mode 100644
index 0000000..72e9ce5
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/DuSolutionController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.DuSolution;
+import com.doumee.service.business.DuSolutionService;
+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/01/16 10:03
+ */
+@Api(tags = "娲鹃仯鍗曚綅鏂规绠″叧鑱斾俊鎭〃")
+@RestController
+@RequestMapping("/business/duSolution")
+public class DuSolutionController extends BaseController {
+
+    @Autowired
+    private DuSolutionService duSolutionService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:dusolution:create")
+    public ApiResponse create(@RequestBody DuSolution duSolution) {
+        return ApiResponse.success(duSolutionService.create(duSolution));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:dusolution:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        duSolutionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:dusolution:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        duSolutionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:dusolution:update")
+    public ApiResponse updateById(@RequestBody DuSolution duSolution) {
+        duSolutionService.updateById(duSolution);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:dusolution:query")
+    public ApiResponse<PageData<DuSolution>> findPage (@RequestBody PageWrap<DuSolution> pageWrap) {
+        return ApiResponse.success(duSolutionService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:dusolution:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<DuSolution> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(DuSolution.class).export(duSolutionService.findPage(pageWrap).getRecords(), "娲鹃仯鍗曚綅鏂规绠″叧鑱斾俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:dusolution:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(duSolutionService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/DuWorktypeController.java b/server/shop/src/main/java/com/doumee/api/business/DuWorktypeController.java
new file mode 100644
index 0000000..4f3012f
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/DuWorktypeController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.DuWorktype;
+import com.doumee.service.business.DuWorktypeService;
+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/01/16 10:03
+ */
+@Api(tags = "娲鹃仯鍗曚綅鏂规绠″伐绉嶅叧鑱斾俊鎭〃")
+@RestController
+@RequestMapping("/business/duWorktype")
+public class DuWorktypeController extends BaseController {
+
+    @Autowired
+    private DuWorktypeService duWorktypeService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:duworktype:create")
+    public ApiResponse create(@RequestBody DuWorktype duWorktype) {
+        return ApiResponse.success(duWorktypeService.create(duWorktype));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:duworktype:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        duWorktypeService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:duworktype:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        duWorktypeService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:duworktype:update")
+    public ApiResponse updateById(@RequestBody DuWorktype duWorktype) {
+        duWorktypeService.updateById(duWorktype);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:duworktype:query")
+    public ApiResponse<PageData<DuWorktype>> findPage (@RequestBody PageWrap<DuWorktype> pageWrap) {
+        return ApiResponse.success(duWorktypeService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:duworktype:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<DuWorktype> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(DuWorktype.class).export(duWorktypeService.findPage(pageWrap).getRecords(), "娲鹃仯鍗曚綅鏂规绠″伐绉嶅叧鑱斾俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:duworktype:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(duWorktypeService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/InsuranceApplyController.java b/server/shop/src/main/java/com/doumee/api/business/InsuranceApplyController.java
new file mode 100644
index 0000000..d07fa18
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/InsuranceApplyController.java
@@ -0,0 +1,142 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.InsuranceApplyQueryDTO;
+import com.doumee.dao.business.model.InsuranceApply;
+import com.doumee.service.business.InsuranceApplyService;
+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/01/16 10:03
+ */
+@Api(tags = "鎶曚繚鐢宠淇℃伅琛�")
+@RestController
+@RequestMapping("/business/insuranceApply")
+public class InsuranceApplyController extends BaseController {
+
+    @Autowired
+    private InsuranceApplyService insuranceApplyService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:insuranceapply:create")
+    public ApiResponse create(@RequestBody InsuranceApply insuranceApply) {
+        return ApiResponse.success(insuranceApplyService.create(insuranceApply));
+    }
+    @ApiOperation("骞冲彴鎶曚繚瀹℃牳")
+    @PostMapping("/check")
+    @RequiresPermissions("business:insuranceapply:check")
+    public ApiResponse check(@RequestBody InsuranceApply insuranceApply) {
+        return ApiResponse.success(insuranceApplyService.check(insuranceApply));
+    }
+    @ApiOperation("骞冲彴閫�鍥炴姇淇�")
+    @PostMapping("/back")
+    @RequiresPermissions("business:insuranceapply:back")
+    public ApiResponse back(@RequestBody InsuranceApply insuranceApply) {
+        return ApiResponse.success(insuranceApplyService.back(insuranceApply));
+    }
+    @ApiOperation("骞冲彴涓婁紶鎶曚繚鍗�")
+    @PostMapping("/uploadToubaodan")
+    @RequiresPermissions("business:insuranceapply:uploadToubaodan")
+    public ApiResponse uploadToubaodan(@RequestBody InsuranceApply insuranceApply) {
+        return ApiResponse.success(insuranceApplyService.uploadToubaodan(insuranceApply));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/getSignLink/{id}")
+    @RequiresPermissions("business:insuranceapply:query")
+    public ApiResponse<String> getSignLink(@PathVariable Integer id) {
+        return ApiResponse.success(insuranceApplyService.getSignLink(id));
+    }
+
+
+    @ApiOperation("骞冲彴涓婁紶淇濋櫓鍗�")
+    @PostMapping("/uploadBaoxiandan")
+    @RequiresPermissions("business:insuranceapply:uploadBaoxiandan")
+    public ApiResponse uploadBaoxiandan(@RequestBody InsuranceApply insuranceApply) {
+        return ApiResponse.success(insuranceApplyService.uploadBaoxiandan(insuranceApply));
+    }
+    @ApiOperation("骞冲彴澶勭悊閫�鍗曠敵璇�")
+    @PostMapping("/dealBackApply")
+    @RequiresPermissions("business:insuranceapply:dealBackApply")
+    public ApiResponse dealBackApply(@RequestBody InsuranceApply insuranceApply) {
+        return ApiResponse.success(insuranceApplyService.dealBackApply(insuranceApply));
+    }
+    @ApiOperation("骞冲彴淇敼淇濋櫓鍗�")
+    @PostMapping("/editBaoxiandan")
+    @RequiresPermissions("business:insuranceapply:editBaoxiandan")
+    public ApiResponse editBaoxiandan(@RequestBody InsuranceApply insuranceApply) {
+        return ApiResponse.success(insuranceApplyService.editBaoxiandan(insuranceApply));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:insuranceapply:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        insuranceApplyService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:insuranceapply:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        insuranceApplyService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:insuranceapply:update")
+    public ApiResponse updateById(@RequestBody InsuranceApply insuranceApply) {
+        insuranceApplyService.updateById(insuranceApply);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:insuranceapply:query")
+    public ApiResponse<PageData<InsuranceApply>> findPage (@RequestBody PageWrap<InsuranceApplyQueryDTO> pageWrap) {
+        return ApiResponse.success(insuranceApplyService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:insuranceapply:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<InsuranceApplyQueryDTO> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(InsuranceApply.class).export(insuranceApplyService.findPage(pageWrap).getRecords(), "鎶曚繚鐢宠淇℃伅琛�", response);
+    }
+    @ApiOperation("瀵煎嚭鎶曚繚璇︽儏鍗�")
+    @PostMapping("/exportDetailExcel")
+    @RequiresPermissions("business:insuranceapply:exportExcel")
+    public void exportDetailExcel (@RequestBody  InsuranceApply model, HttpServletResponse response) {
+        ExcelExporter.build(InsuranceApply.class).exportApplyDetail(insuranceApplyService.findDetailForExport(model),  response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:insuranceapply:query")
+    public ApiResponse<InsuranceApply> findById(@PathVariable Integer id) {
+        return ApiResponse.success(insuranceApplyService.findDetail(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/InsuranceController.java b/server/shop/src/main/java/com/doumee/api/business/InsuranceController.java
new file mode 100644
index 0000000..4444b71
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/InsuranceController.java
@@ -0,0 +1,104 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Insurance;
+import com.doumee.service.business.InsuranceService;
+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/01/16 10:03
+ */
+@Api(tags = "淇濋櫓鍏徃淇℃伅琛�")
+@RestController
+@RequestMapping("/business/insurance")
+public class InsuranceController extends BaseController {
+
+    @Autowired
+    private InsuranceService insuranceService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:insurance:create")
+    public ApiResponse create(@RequestBody Insurance insurance) {
+        return ApiResponse.success(insuranceService.create(insurance));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:insurance:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        insuranceService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:insurance:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        insuranceService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:insurance:update")
+    public ApiResponse updateById(@RequestBody Insurance insurance) {
+        insuranceService.updateById(insurance);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("绂佺敤鍚敤")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("business:insurance:update")
+    public ApiResponse updateStatus(@RequestBody Insurance solutions) {
+        insuranceService.updateStatus(solutions);
+        return ApiResponse.success(null);
+    }
+
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:insurance:query")
+    public ApiResponse<PageData<Insurance>> findPage (@RequestBody PageWrap<Insurance> pageWrap) {
+        return ApiResponse.success(insuranceService.findPage(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @RequiresPermissions("business:insurance:query")
+    public ApiResponse<List<Insurance>> findList (@RequestBody  Insurance pageWrap) {
+        return ApiResponse.success(insuranceService.findList(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:insurance:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Insurance> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Insurance.class).export(insuranceService.findPage(pageWrap).getRecords(), "淇濋櫓鍏徃淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:insurance:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(insuranceService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/MemberController.java b/server/shop/src/main/java/com/doumee/api/business/MemberController.java
new file mode 100644
index 0000000..9f9f3e4
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/MemberController.java
@@ -0,0 +1,100 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.MemberQueryDTO;
+import com.doumee.dao.business.model.Member;
+import com.doumee.service.business.MemberService;
+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/01/16 10:03
+ */
+@Api(tags = "鐢ㄥ伐淇℃伅琛�")
+@RestController
+@RequestMapping("/business/member")
+public class MemberController extends BaseController {
+
+    @Autowired
+    private MemberService memberService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:member:create")
+    public ApiResponse create(@RequestBody Member member) {
+        return ApiResponse.success(memberService.create(member));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:member:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        memberService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:member:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        memberService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:member:update")
+    public ApiResponse updateById(@RequestBody Member member) {
+        memberService.updateById(member);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:member:query")
+    public ApiResponse<PageData<Member>> findPage (@RequestBody PageWrap<MemberQueryDTO> pageWrap) {
+//        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+//        pageWrap.getModel().setCompanyId(user.getCompanyId());
+        return ApiResponse.success(memberService.findPageForCompany(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:member:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<MemberQueryDTO> pageWrap, HttpServletResponse response) {
+      /*  LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        pageWrap.getModel().setCompanyId(user.getCompanyId());
+        List<Member> list = memberService.findPageForCompany(pageWrap).getRecords();
+        for (int i = 0; i < list.size(); i++) {
+            Member member = list.get(i);
+            member.setSn(i+1);
+            member.setAge(Constants.getAgeByIdCard(member.getIdcardNo()));
+        }*/
+        ExcelExporter.build(Member.class).exportWithFirstAndEnd( memberService.findPageForCompany(pageWrap).getRecords(), "鍛樺伐鍒楄〃璇﹀崟","鍛樺伐鍒楄〃璇﹀崟",null, response);
+    }
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:member:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(memberService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/MemberInsuranceController.java b/server/shop/src/main/java/com/doumee/api/business/MemberInsuranceController.java
new file mode 100644
index 0000000..b47cf33
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/MemberInsuranceController.java
@@ -0,0 +1,109 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.MemberInsurance;
+import com.doumee.service.business.MemberInsuranceService;
+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/01/22 11:55
+ */
+@Api(tags = "鍛樺伐鎶曚繚鏄庣粏璁板綍")
+@RestController
+@RequestMapping("/business/memberInsurance")
+public class MemberInsuranceController extends BaseController {
+
+    @Autowired
+    private MemberInsuranceService memberInsuranceService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:memberinsurance:create")
+    public ApiResponse create(@RequestBody MemberInsurance memberInsurance) {
+        return ApiResponse.success(memberInsuranceService.create(memberInsurance));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:memberinsurance:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        memberInsuranceService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:memberinsurance:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        memberInsuranceService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:memberinsurance:update")
+    public ApiResponse updateById(@RequestBody MemberInsurance memberInsurance) {
+        memberInsuranceService.updateById(memberInsurance);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鍒楄〃鏌ヨ")
+    @PostMapping("/findList")
+    @RequiresPermissions("business:memberinsurance:query")
+    public ApiResponse<List<MemberInsurance>> findList (@RequestBody MemberInsurance memberInsurance) {
+        return ApiResponse.success(memberInsuranceService.findList(memberInsurance));
+    }
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:memberinsurance:query")
+    public ApiResponse<PageData<MemberInsurance>> findPage (@RequestBody PageWrap<MemberInsurance> pageWrap) {
+        return ApiResponse.success(memberInsuranceService.findPage(pageWrap));
+    }
+
+//    @ApiOperation("瀵煎嚭Excel")
+//    @PostMapping("/exportExcel")
+//    @RequiresPermissions("business:memberinsurance:exportExcel")
+//    public void exportExcel (@RequestBody PageWrap<MemberInsurance> pageWrap, HttpServletResponse response) {
+//        ExcelExporter.build(MemberInsurance.class).export(memberInsuranceService.findPage(pageWrap).getRecords(), "鍛樺伐鎶曚繚鏄庣粏璁板綍", response);
+//    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:memberinsurance:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<MemberInsurance> pageWrap, HttpServletResponse response) {
+        List<MemberInsurance> list = memberInsuranceService.findPage(pageWrap).getRecords();
+        for (int i = 0; i < list.size(); i++) {
+            MemberInsurance memberInsurance  = list.get(i);
+            memberInsurance.setSn(i+1);
+        }
+        ExcelExporter.build(MemberInsurance.class).exportWithFirstAndEnd(list,
+                "浜哄憳鎶曚繚璇﹀崟_濮撳悕锛�"+pageWrap.getModel().getMemberName() +"_韬唤璇佸彿锛�"+pageWrap.getModel().getIdcardNo(),
+                "浜哄憳鎶曚繚璇﹀崟_濮撳悕锛�"+pageWrap.getModel().getMemberName() +"_韬唤璇佸彿锛�"+pageWrap.getModel().getIdcardNo(),null, response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:memberinsurance:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(memberInsuranceService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/MultifileController.java b/server/shop/src/main/java/com/doumee/api/business/MultifileController.java
new file mode 100644
index 0000000..ce608d2
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/MultifileController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Multifile;
+import com.doumee.service.business.MultifileService;
+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/01/16 10:03
+ */
+@Api(tags = "闄勪欢涓婁紶淇℃伅琛�")
+@RestController
+@RequestMapping("/business/multifile")
+public class MultifileController extends BaseController {
+
+    @Autowired
+    private MultifileService multifileService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:multifile:create")
+    public ApiResponse create(@RequestBody Multifile multifile) {
+        return ApiResponse.success(multifileService.create(multifile));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:multifile:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        multifileService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:multifile:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        multifileService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:multifile:update")
+    public ApiResponse updateById(@RequestBody Multifile multifile) {
+        multifileService.updateById(multifile);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:multifile:query")
+    public ApiResponse<PageData<Multifile>> findPage (@RequestBody PageWrap<Multifile> pageWrap) {
+        return ApiResponse.success(multifileService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:multifile:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Multifile> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Multifile.class).export(multifileService.findPage(pageWrap).getRecords(), "闄勪欢涓婁紶淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:multifile:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(multifileService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/NoticesController.java b/server/shop/src/main/java/com/doumee/api/business/NoticesController.java
new file mode 100644
index 0000000..97d7836
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/NoticesController.java
@@ -0,0 +1,92 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.Notices;
+import com.doumee.service.business.NoticesService;
+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/01/16 10:03
+ */
+@Api(tags = "绯荤粺娑堟伅淇℃伅琛�")
+@RestController
+@RequestMapping("/business/notices")
+public class NoticesController extends BaseController {
+
+    @Autowired
+    private NoticesService noticesService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:notices:create")
+    public ApiResponse create(@RequestBody Notices notices) {
+        return ApiResponse.success(noticesService.create(notices));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:notices:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        noticesService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:notices:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        noticesService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:notices:update")
+    public ApiResponse updateById(@RequestBody Notices notices) {
+        noticesService.updateById(notices);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:notices:query")
+    public ApiResponse<PageData<Notices>> findPage (@RequestBody PageWrap<Notices> pageWrap) {
+        pageWrap.getModel().setPalt(Constants.ZERO);
+        return ApiResponse.success(noticesService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:notices:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Notices> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Notices.class).export(noticesService.findPage(pageWrap).getRecords(), "绯荤粺娑堟伅淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:notices:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(noticesService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/SettleClaimsController.java b/server/shop/src/main/java/com/doumee/api/business/SettleClaimsController.java
new file mode 100644
index 0000000..38abf43
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/SettleClaimsController.java
@@ -0,0 +1,152 @@
+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.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.SCSupplementDTO;
+import com.doumee.dao.business.model.SettleClaims;
+import com.doumee.service.business.SettleClaimsService;
+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/01/16 10:03
+ */
+@Api(tags = "鐞嗚禂鐢宠琛�")
+@RestController
+@RequestMapping("/business/settleClaims")
+public class SettleClaimsController extends BaseController {
+
+    @Autowired
+    private SettleClaimsService settleClaimsService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:settleclaims:create")
+    public ApiResponse create(@RequestBody SettleClaims settleClaims) {
+        return ApiResponse.success(settleClaimsService.create(settleClaims));
+    }
+    @ApiOperation("娣诲姞鎶ユ鍙�")
+    @PostMapping("/addCode")
+    @RequiresPermissions("business:settleclaims:addCode")
+    public ApiResponse addCode(@RequestBody SettleClaims settleClaims) {
+        return ApiResponse.success(settleClaimsService.addCode(settleClaims));
+    }
+    @ApiOperation("鐞嗚禂澶勭悊")
+    @PostMapping("/dealBiz")
+    @RequiresPermissions("business:settleclaims:dealBiz")
+    public ApiResponse dealBiz(@RequestBody SettleClaims settleClaims) {
+        return ApiResponse.success(settleClaimsService.dealBiz(settleClaims));
+    }
+    @ApiOperation("缁撴鎻愪氦")
+    @PostMapping("/doneCommit")
+    @RequiresPermissions("business:settleclaims:doneCommit")
+    public ApiResponse doneCommit(@RequestBody SettleClaims settleClaims) {
+        return ApiResponse.success(settleClaimsService.doneCommit(settleClaims));
+    }
+    @ApiOperation("鎾ら攢鐢宠")
+    @PostMapping("/back")
+    @RequiresPermissions("business:settleclaims:back")
+    public ApiResponse back(@RequestBody SettleClaims settleClaims) {
+        return ApiResponse.success(settleClaimsService.back(settleClaims));
+    }
+    @ApiOperation("闄勪欢涓婁紶")
+    @PostMapping("/claimsUploadFile")
+    @RequiresPermissions("business:settleclaims:update")
+    public ApiResponse claimsUploadFile(@RequestBody SCSupplementDTO scSupplementDTO) {
+        settleClaimsService.claimsUploadFile(scSupplementDTO);
+        return ApiResponse.success(null);
+    }
+
+
+    @ApiOperation("澶囨敞鏍囩")
+    @PostMapping("/remark")
+    @RequiresPermissions("business:settleclaims:remark")
+    public ApiResponse remark(@RequestBody SettleClaims settleClaims) {
+        return ApiResponse.success(settleClaimsService.remark(settleClaims));
+    }
+    @ApiOperation("璧勬枡纭")
+    @PostMapping("/confirm")
+    @RequiresPermissions("business:settleclaims:confirm")
+    public ApiResponse confirm(@RequestBody SettleClaims settleClaims) {
+        return ApiResponse.success(settleClaimsService.confirm(settleClaims));
+    }
+    @ApiOperation("璧勬枡涓嬭浇")
+    @PostMapping("/exportFiles")
+    @RequiresPermissions("business:settleclaims:exportExcel")
+    public void exportFiles(@RequestBody SettleClaims model,HttpServletResponse response) {
+        if(model.getId() == null){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        settleClaimsService.exportFiles(model.getId(),response);
+    }
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:settleclaims:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        settleClaimsService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:settleclaims:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        settleClaimsService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:settleclaims:update")
+    public ApiResponse updateById(@RequestBody SettleClaims settleClaims) {
+        settleClaimsService.updateById(settleClaims);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:settleclaims:query")
+    public ApiResponse<PageData<SettleClaims>> findPage (@RequestBody PageWrap<SettleClaims> pageWrap) {
+        return ApiResponse.success(settleClaimsService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:settleclaims:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<SettleClaims> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SettleClaims.class).export(settleClaimsService.findPage(pageWrap).getRecords(), "鐞嗚禂鐢宠琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:settleclaims:query")
+    public ApiResponse<SettleClaims> findById(@PathVariable Integer id) {
+        return ApiResponse.success(settleClaimsService.getSettleClaimsDetail(id));
+    }
+    @ApiOperation("鍒犻櫎闄勪欢")
+    @GetMapping("/delFile/{id}/{fileId}")
+    @RequiresPermissions("business:settleclaims:query")
+    public ApiResponse delFile(@PathVariable(name = "id") Integer id,@PathVariable(name = "fileId") Integer fileId) {
+        return ApiResponse.success(settleClaimsService.delFile(id,fileId));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/SettleClaimsLogController.java b/server/shop/src/main/java/com/doumee/api/business/SettleClaimsLogController.java
new file mode 100644
index 0000000..87a45ad
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/SettleClaimsLogController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.SettleClaimsLog;
+import com.doumee.service.business.SettleClaimsLogService;
+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/01/16 10:03
+ */
+@Api(tags = "鐞嗚碃鎿嶄綔鍘嗗彶琛�")
+@RestController
+@RequestMapping("/business/settleClaimsLog")
+public class SettleClaimsLogController extends BaseController {
+
+    @Autowired
+    private SettleClaimsLogService settleClaimsLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:settleclaimslog:create")
+    public ApiResponse create(@RequestBody SettleClaimsLog settleClaimsLog) {
+        return ApiResponse.success(settleClaimsLogService.create(settleClaimsLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:settleclaimslog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        settleClaimsLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:settleclaimslog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        settleClaimsLogService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:settleclaimslog:update")
+    public ApiResponse updateById(@RequestBody SettleClaimsLog settleClaimsLog) {
+        settleClaimsLogService.updateById(settleClaimsLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:settleclaimslog:query")
+    public ApiResponse<PageData<SettleClaimsLog>> findPage (@RequestBody PageWrap<SettleClaimsLog> pageWrap) {
+        return ApiResponse.success(settleClaimsLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:settleclaimslog:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<SettleClaimsLog> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SettleClaimsLog.class).export(settleClaimsLogService.findPage(pageWrap).getRecords(), "鐞嗚碃鎿嶄綔鍘嗗彶琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:settleclaimslog:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(settleClaimsLogService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/SignRecordController.java b/server/shop/src/main/java/com/doumee/api/business/SignRecordController.java
new file mode 100644
index 0000000..9a0e93d
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/SignRecordController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.SignRecord;
+import com.doumee.service.business.SignRecordService;
+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/01/16 10:27
+ */
+@Api(tags = "鐢靛瓙绛剧缃茶褰曡〃")
+@RestController
+@RequestMapping("/business/signRecord")
+public class SignRecordController extends BaseController {
+
+    @Autowired
+    private SignRecordService signRecordService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:signrecord:create")
+    public ApiResponse create(@RequestBody SignRecord signRecord) {
+        return ApiResponse.success(signRecordService.create(signRecord));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:signrecord:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        signRecordService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:signrecord:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        signRecordService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:signrecord:update")
+    public ApiResponse updateById(@RequestBody SignRecord signRecord) {
+        signRecordService.updateById(signRecord);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:signrecord:query")
+    public ApiResponse<PageData<SignRecord>> findPage (@RequestBody PageWrap<SignRecord> pageWrap) {
+        return ApiResponse.success(signRecordService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:signrecord:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<SignRecord> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SignRecord.class).export(signRecordService.findPage(pageWrap).getRecords(), "鐢靛瓙绛剧缃茶褰曡〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:signrecord:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(signRecordService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/SmsEmailController.java b/server/shop/src/main/java/com/doumee/api/business/SmsEmailController.java
new file mode 100644
index 0000000..9f545f7
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/SmsEmailController.java
@@ -0,0 +1,97 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.SmsEmail;
+import com.doumee.service.business.SmsEmailService;
+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/01/16 10:03
+ */
+@Api(tags = "鐭俊閭欢淇℃伅琛�")
+@RestController
+@RequestMapping("/business/smsEmail")
+public class SmsEmailController extends BaseController {
+
+    @Autowired
+    private SmsEmailService smsEmailService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:smsemail:create")
+    public ApiResponse create(@RequestBody SmsEmail smsEmail) {
+        return ApiResponse.success(smsEmailService.create(smsEmail));
+    }
+    @PreventRepeat
+    @ApiOperation("鍙戦�佺煭淇¢獙璇佺爜")
+    @PostMapping("/sendSms")
+//    @RequiresPermissions("business:smsemail:sendSms")
+    public ApiResponse sendSms(@RequestBody SmsEmail smsEmail) {
+        return ApiResponse.success(smsEmailService.sendSms(smsEmail));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:smsemail:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        smsEmailService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:smsemail:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        smsEmailService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:smsemail:update")
+    public ApiResponse updateById(@RequestBody SmsEmail smsEmail) {
+        smsEmailService.updateById(smsEmail);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:smsemail:query")
+    public ApiResponse<PageData<SmsEmail>> findPage (@RequestBody PageWrap<SmsEmail> pageWrap) {
+        return ApiResponse.success(smsEmailService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:smsemail:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<SmsEmail> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SmsEmail.class).export(smsEmailService.findPage(pageWrap).getRecords(), "鐭俊閭欢淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:smsemail:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(smsEmailService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/SolutionWorktypeController.java b/server/shop/src/main/java/com/doumee/api/business/SolutionWorktypeController.java
new file mode 100644
index 0000000..56483d2
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/SolutionWorktypeController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.SolutionWorktype;
+import com.doumee.service.business.SolutionWorktypeService;
+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/01/16 10:03
+ */
+@Api(tags = "淇濋櫓鏂规宸ョ鍏宠仈琛�")
+@RestController
+@RequestMapping("/business/solutionWorktype")
+public class SolutionWorktypeController extends BaseController {
+
+    @Autowired
+    private SolutionWorktypeService solutionWorktypeService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:solutionworktype:create")
+    public ApiResponse create(@RequestBody SolutionWorktype solutionWorktype) {
+        return ApiResponse.success(solutionWorktypeService.create(solutionWorktype));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:solutionworktype:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        solutionWorktypeService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:solutionworktype:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        solutionWorktypeService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:solutionworktype:update")
+    public ApiResponse updateById(@RequestBody SolutionWorktype solutionWorktype) {
+        solutionWorktypeService.updateById(solutionWorktype);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:solutionworktype:query")
+    public ApiResponse<PageData<SolutionWorktype>> findPage (@RequestBody PageWrap<SolutionWorktype> pageWrap) {
+        return ApiResponse.success(solutionWorktypeService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:solutionworktype:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<SolutionWorktype> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SolutionWorktype.class).export(solutionWorktypeService.findPage(pageWrap).getRecords(), "淇濋櫓鏂规宸ョ鍏宠仈琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:solutionworktype:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(solutionWorktypeService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/SolutionsBaseController.java b/server/shop/src/main/java/com/doumee/api/business/SolutionsBaseController.java
new file mode 100644
index 0000000..0d8b61a
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/SolutionsBaseController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.SolutionsBase;
+import com.doumee.service.business.SolutionsBaseService;
+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/01/16 10:03
+ */
+@Api(tags = "淇濋櫓鏂规淇℃伅琛�(鍩鸿〃锛�")
+@RestController
+@RequestMapping("/business/solutionsBase")
+public class SolutionsBaseController extends BaseController {
+
+    @Autowired
+    private SolutionsBaseService solutionsBaseService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:solutionsbase:create")
+    public ApiResponse create(@RequestBody SolutionsBase solutionsBase) {
+        return ApiResponse.success(solutionsBaseService.create(solutionsBase));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:solutionsbase:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        solutionsBaseService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:solutionsbase:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        solutionsBaseService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:solutionsbase:update")
+    public ApiResponse updateById(@RequestBody SolutionsBase solutionsBase) {
+        solutionsBaseService.updateById(solutionsBase);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:solutionsbase:query")
+    public ApiResponse<PageData<SolutionsBase>> findPage (@RequestBody PageWrap<SolutionsBase> pageWrap) {
+        return ApiResponse.success(solutionsBaseService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:solutionsbase:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<SolutionsBase> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SolutionsBase.class).export(solutionsBaseService.findPage(pageWrap).getRecords(), "淇濋櫓鏂规淇℃伅琛�(鍩鸿〃锛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:solutionsbase:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(solutionsBaseService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/SolutionsController.java b/server/shop/src/main/java/com/doumee/api/business/SolutionsController.java
new file mode 100644
index 0000000..2549513
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/SolutionsController.java
@@ -0,0 +1,105 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Solutions;
+import com.doumee.service.business.SolutionsService;
+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/01/16 10:03
+ */
+@Api(tags = "淇濋櫓鏂规淇℃伅琛�")
+@RestController
+@RequestMapping("/business/solutions")
+public class SolutionsController extends BaseController {
+
+    @Autowired
+    private SolutionsService solutionsService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:solutions:create")
+    public ApiResponse create(@RequestBody Solutions solutions) {
+        return ApiResponse.success(solutionsService.create(solutions));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:solutions:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        solutionsService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:solutions:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        solutionsService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:solutions:update")
+    public ApiResponse updateById(@RequestBody Solutions solutions) {
+        solutionsService.updateById(solutions);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("绂佺敤鍚敤")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("business:solutions:update")
+    public ApiResponse updateStatus(@RequestBody Solutions solutions) {
+        solutionsService.updateStatus(solutions);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:solutions:query")
+    public ApiResponse<PageData<Solutions>> findPage (@RequestBody PageWrap<Solutions> pageWrap) {
+        return ApiResponse.success(solutionsService.findPage(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @RequiresPermissions("business:solutions:query")
+    public ApiResponse<List<Solutions>> findList (@RequestBody  Solutions  pageWrap) {
+        return ApiResponse.success(solutionsService.findList(pageWrap));
+    }
+
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:solutions:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Solutions> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Solutions.class).export(solutionsService.findPage(pageWrap).getRecords(), "淇濋櫓鏂规淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:solutions:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(solutionsService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/TaxDetialController.java b/server/shop/src/main/java/com/doumee/api/business/TaxDetialController.java
new file mode 100644
index 0000000..3b47fbd
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/TaxDetialController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.TaxDetial;
+import com.doumee.service.business.TaxDetialService;
+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/01/16 10:03
+ */
+@Api(tags = "鍙戠エ鏄庣粏淇℃伅琛�")
+@RestController
+@RequestMapping("/business/taxDetial")
+public class TaxDetialController extends BaseController {
+
+    @Autowired
+    private TaxDetialService taxDetialService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:taxdetial:create")
+    public ApiResponse create(@RequestBody TaxDetial taxDetial) {
+        return ApiResponse.success(taxDetialService.create(taxDetial));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:taxdetial:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        taxDetialService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:taxdetial:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        taxDetialService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:taxdetial:update")
+    public ApiResponse updateById(@RequestBody TaxDetial taxDetial) {
+        taxDetialService.updateById(taxDetial);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:taxdetial:query")
+    public ApiResponse<PageData<TaxDetial>> findPage (@RequestBody PageWrap<TaxDetial> pageWrap) {
+        return ApiResponse.success(taxDetialService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:taxdetial:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<TaxDetial> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(TaxDetial.class).export(taxDetialService.findPage(pageWrap).getRecords(), "鍙戠エ鏄庣粏淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:taxdetial:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(taxDetialService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/TaxesController.java b/server/shop/src/main/java/com/doumee/api/business/TaxesController.java
new file mode 100644
index 0000000..4ff79c9
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/TaxesController.java
@@ -0,0 +1,105 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Taxes;
+import com.doumee.service.business.TaxesService;
+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/01/16 10:03
+ */
+@Api(tags = "鍙戠エ淇℃伅琛�")
+@RestController
+@RequestMapping("/business/taxes")
+public class TaxesController extends BaseController {
+
+    @Autowired
+    private TaxesService taxesService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:taxes:create")
+    public ApiResponse create(@RequestBody Taxes taxes) {
+        return ApiResponse.success(taxesService.create(taxes));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:taxes:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        taxesService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:taxes:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        taxesService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:taxes:update")
+    public ApiResponse updateById(@RequestBody Taxes taxes) {
+        taxesService.updateById(taxes);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID閫�鍥炵敵璇�")
+    @PostMapping("/backApply")
+    @RequiresPermissions("business:taxes:update")
+    public ApiResponse backApply(@RequestBody Taxes taxes) {
+        taxesService.backApply(taxes);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("涓婁紶鍙戠エ鍑瘉鎻愪氦淇濆瓨")
+    @PostMapping("/doneApply")
+    @RequiresPermissions("business:taxes:update")
+    public ApiResponse doneApply(@RequestBody Taxes taxes) {
+        taxesService.doneApply(taxes);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:taxes:query")
+    public ApiResponse<PageData<Taxes>> findPage (@RequestBody PageWrap<Taxes> pageWrap) {
+        return ApiResponse.success(taxesService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:taxes:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Taxes> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Taxes.class).export(taxesService.findPage(pageWrap).getRecords(), "鍙戠エ淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:taxes:query")
+    public ApiResponse<Taxes> findById(@PathVariable Integer id) {
+        return ApiResponse.success(taxesService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java b/server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java
new file mode 100644
index 0000000..7e39a97
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/UnionApplyController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.UnionApply;
+import com.doumee.service.business.UnionApplyService;
+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/03/12 11:34
+ */
+@Api(tags = "鍚堝苟鎶曚繚鍗曚俊鎭〃")
+@RestController
+@RequestMapping("/business/unionApply")
+public class UnionApplyController extends BaseController {
+
+    @Autowired
+    private UnionApplyService unionApplyService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:unionapply:create")
+    public ApiResponse create(@RequestBody UnionApply unionApply) {
+        return ApiResponse.success(unionApplyService.create(unionApply));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:unionapply:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        unionApplyService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:unionapply:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        unionApplyService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:unionapply:update")
+    public ApiResponse updateById(@RequestBody UnionApply unionApply) {
+        unionApplyService.updateById(unionApply);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:unionapply:query")
+    public ApiResponse<PageData<UnionApply>> findPage (@RequestBody PageWrap<UnionApply> pageWrap) {
+        return ApiResponse.success(unionApplyService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:unionapply:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<UnionApply> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(UnionApply.class).export(unionApplyService.findPage(pageWrap).getRecords(), "鍚堝苟鎶曚繚鍗曚俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:unionapply:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(unionApplyService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java b/server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java
new file mode 100644
index 0000000..08d9a26
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/UnionChangeController.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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.UnionChange;
+import com.doumee.service.business.UnionChangeService;
+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/03/12 11:34
+ */
+@Api(tags = "鍔犲噺淇濇崲鍘傚悎骞跺崟淇℃伅琛�")
+@RestController
+@RequestMapping("/business/unionChange")
+public class UnionChangeController extends BaseController {
+
+    @Autowired
+    private UnionChangeService unionChangeService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:unionchange:create")
+    public ApiResponse create(@RequestBody UnionChange unionChange) {
+        return ApiResponse.success(unionChangeService.create(unionChange));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:unionchange:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        unionChangeService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:unionchange:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        unionChangeService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:unionchange:update")
+    public ApiResponse updateById(@RequestBody UnionChange unionChange) {
+        unionChangeService.updateById(unionChange);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:unionchange:query")
+    public ApiResponse<PageData<UnionChange>> findPage (@RequestBody PageWrap<UnionChange> pageWrap) {
+        return ApiResponse.success(unionChangeService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:unionchange:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<UnionChange> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(UnionChange.class).export(unionChangeService.findPage(pageWrap).getRecords(), "鍔犲噺淇濇崲鍘傚悎骞跺崟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:unionchange:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(unionChangeService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/business/WorktypeController.java b/server/shop/src/main/java/com/doumee/api/business/WorktypeController.java
new file mode 100644
index 0000000..469bfd1
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/business/WorktypeController.java
@@ -0,0 +1,116 @@
+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.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.WorkTypeQueryDTO;
+import com.doumee.dao.business.model.Worktype;
+import com.doumee.service.business.WorktypeService;
+import io.swagger.annotations.*;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Api(tags = "宸ョ淇℃伅琛�")
+@RestController
+@RequestMapping("/business/worktype")
+public class WorktypeController extends BaseController {
+
+    @Autowired
+    private WorktypeService worktypeService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:worktype:create")
+    public ApiResponse create(@RequestBody Worktype worktype) {
+        return ApiResponse.success(worktypeService.create(worktype));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:worktype:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        worktypeService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:worktype:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        worktypeService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:worktype:update")
+    public ApiResponse updateById(@RequestBody Worktype worktype) {
+        worktypeService.updateById(worktype);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鏍规嵁鏉′欢宸ョ鍒楄〃")
+    @PostMapping("/findListByDTO")
+    public ApiResponse<List<Worktype>> findListByDTO (@RequestBody WorkTypeQueryDTO workTypeQueryDTO) {
+        return ApiResponse.success(worktypeService.findListByDTO(workTypeQueryDTO));
+    }
+
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:worktype:query")
+    public ApiResponse<PageData<Worktype>> findPage (@RequestBody PageWrap<Worktype> pageWrap) {
+        return ApiResponse.success(worktypeService.findPage(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @RequiresPermissions("business:worktype:query")
+    public ApiResponse<List<Worktype>> findList (@RequestBody Worktype pageWrap) {
+        return ApiResponse.success(worktypeService.findList(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:worktype:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Worktype> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Worktype.class).export(worktypeService.findPage(pageWrap).getRecords(), "宸ョ淇℃伅琛�", response);
+    }
+
+    @ApiOperation("瀵煎叆妯℃澘")
+    @PostMapping("/importExcel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+    })
+    @RequiresPermissions("business:worktype:create")
+    public ApiResponse<List<String>> importExcel (@ApiParam(value = "file") MultipartFile file ) {
+        return ApiResponse.success(worktypeService .importBatch(file));
+    }
+
+
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:worktype:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(worktypeService.findById(id));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/common/CaptchaController.java b/server/shop/src/main/java/com/doumee/api/common/CaptchaController.java
new file mode 100644
index 0000000..2162667
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/common/CaptchaController.java
@@ -0,0 +1,36 @@
+package com.doumee.api.common;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.service.common.CaptchaService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.RestController;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/02/14 11:14
+ */
+@Api(tags = "鍥剧墖楠岃瘉鐮佹帴鍙�")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/common")
+public class CaptchaController extends BaseController {
+
+    @Autowired
+    private CaptchaService captchaService;
+
+    /**
+     * @author Eva.Caesar Liu
+     * @date 2023/02/14 11:14
+     */
+    @ApiOperation("鑾峰彇鍥剧墖楠岃瘉鐮�")
+    @GetMapping("/captcha")
+    public ApiResponse<CaptchaService.Captcha> getCaptcha() {
+        return ApiResponse.success(captchaService.genCaptcha());
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/common/PublicController.java b/server/shop/src/main/java/com/doumee/api/common/PublicController.java
new file mode 100644
index 0000000..d8754cb
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/common/PublicController.java
@@ -0,0 +1,346 @@
+package com.doumee.api.common;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.annotation.excel.ExcelToPdfTool;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.aliyun.ALiYunUtil;
+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.commons.lang3.StringUtils;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/02/14 11:14
+ */
+@Api(tags = "鍏叡鎺ュ彛")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/public")
+@Slf4j
+public class PublicController extends BaseController {
+
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @ApiOperation("娴嬭瘯")
+    @PostMapping("/testPdf")
+    public String testPdf(@RequestParam Map<String,String> req, HttpServletResponse response) {
+        ExcelToPdfTool.excelToPdf(req.get("f1"),req.get("f2"));
+        return JSONObject.toJSONString(req);
+    }
+
+    @ApiOperation(value = "涓婁紶", notes = "涓婁紶", httpMethod = "POST", position = 6)
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+    })
+    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
+    public void uploadMobile(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        upload(multipartRequest, response, folder + "/",
+            systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(),
+            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
+            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
+            systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
+            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
+    }
+
+
+    @ApiOperation(value = "涓婁紶鍥剧墖", notes = "涓婁紶鍥剧墖", httpMethod = "POST", position = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+    })
+    @PostMapping(value = "/uploadPicture", headers = "content-type=multipart/form-data")
+    public void uploadPicture(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Iterator<String> fileNames = multipartRequest.getFileNames();
+        Map<String, Object> context = new HashMap<>();
+        while (fileNames.hasNext()){
+            MultipartFile file = multipartRequest.getFile(fileNames.next());
+            String fileName = file.getOriginalFilename();
+            String suffix = fileName.substring(fileName.lastIndexOf("."));
+            if ( !StringUtils.equalsIgnoreCase(suffix, ".jpg") && !StringUtils.equalsIgnoreCase(suffix, ".png")) {
+                context.put("code", 0);
+                context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡涓婁紶鏈夎锛�");
+                return;
+            }
+        }
+        upload(multipartRequest, response, folder + "/",
+                systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
+    }
+
+    public void upload(HttpServletRequest request, HttpServletResponse response, String folder, String bucketName,
+        String access_id, String access_key, String resourcePath, String endpoint) throws Exception {
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("text/html;charset=UTF-8");
+        Map<String, Object> context = new HashMap<>();
+        CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
+        if (multipartResovler.isMultipart(request)) {
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            Iterator<String> it = multipartRequest.getFileNames();
+            while (it.hasNext()) {
+                MultipartFile file = multipartRequest.getFile((String) it.next());// file
+                // multipartRequest.getFile((String)
+                // it.next());
+                if (file != null) {
+                    // 1銆佷笂浼犲埌鏈嶅姟鍣ㄤ复鏃舵枃浠跺す
+                    String uploadFileName = file.getOriginalFilename();
+                    String originname = uploadFileName;
+                    if (originname.lastIndexOf("/") >= 0) {
+                        originname = originname.substring(originname.lastIndexOf("/") + 1);
+                    }
+                    String nfix = "";// 鍚庣紑鍚�
+                    if (StringUtils.isNotBlank(uploadFileName)) {
+                        nfix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
+                    }
+                    if (StringUtils.equalsIgnoreCase(nfix, ".exe")) {
+                        context.put("code", 4000);
+                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".exe\"涓婁紶鏈夎锛�");
+                        return;
+                    }
+                    if (StringUtils.equalsIgnoreCase(nfix, ".dll")) {
+                        context.put("code", 4000);
+                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".dll\"涓婁紶鏈夎锛�");
+                        return;
+                    }
+                    String nowDate = DateUtil.getNowShortDate();// 褰撳墠鏃堕棿锛堝勾鏈堟棩锛�
+                    String fileName = UUID.randomUUID().toString() + nfix;
+                    String tempFileName =  nowDate + "/" + fileName;
+                    String key = folder + tempFileName;// 鏂囦欢鍚�
+                    ALiYunUtil obs = new ALiYunUtil(endpoint,access_id, access_key);
+                    int type = 2;
+                    if(StringUtils.endsWith(key,".mp4")){
+                        type =1;
+                    }else if(StringUtils.endsWith(key,".jpg")
+                            || StringUtils.endsWith(key,".JPG")
+                            || StringUtils.endsWith(key,".png")
+                            || StringUtils.endsWith(key,".PNG")
+                            || StringUtils.endsWith(key,".jpeg")
+                            || StringUtils.endsWith(key,".JPEG")){
+                        type =0;
+                    }
+                    if (obs.uploadOnlineObject(file.getInputStream(),bucketName, key,null)) {
+                        // 绉诲姩鎴愬姛,杩斿洖鏂囦欢鍚�
+                        // sendSuccessMessage(response, resourcePath+key);
+                        context.put("success", true);
+                        context.put("code", 200);
+                        context.put("errno",0);
+                        JSONObject fileJSON = new JSONObject();
+                        fileJSON.put("url", resourcePath + key);
+                        fileJSON.put("imgaddr", tempFileName);
+                        fileJSON.put("imgname", fileName);
+                        fileJSON.put("type", type);
+                        fileJSON.put("originname", originname);
+                        context.put("data",fileJSON);
+                        context.put("message","璇锋眰鎴愬姛");
+                        writerJson(response, context);
+                        return;
+                    } else {
+                        // 绉诲姩澶辫触
+                        context.put("code", 0);
+                        context.put("message", "涓婁紶澶辫触");
+                        writerJson(response, context);
+                        return;
+                    }
+                }
+
+            }
+        }
+        context.put("code", 0);
+        context.put("message", "涓婁紶澶辫触");
+        context.put("errno",0);
+        writerJson(response, context);
+        return;
+    }
+
+    public static void writerJson(HttpServletResponse response, Object object) {
+        response.setContentType("application/json");
+        writer(response, JSONObject.toJSONString(object));
+    }
+
+    private static void writer(HttpServletResponse response, String str) {
+        try {
+            StringBuffer result = new StringBuffer();
+            //璁剧疆椤甸潰涓嶇紦瀛�
+            response.setHeader("Pragma", "No-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setCharacterEncoding("UTF-8");
+            PrintWriter out = null;
+            out = response.getWriter();
+            out.print(str);
+            out.flush();
+            out.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
+    @ApiOperation(value = "涓婁紶", notes = "涓婁紶", httpMethod = "POST", position = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+    })
+    @PostMapping(value = "/uploadLocal", headers = "content-type=multipart/form-data")
+    public void uploadLocal(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+
+        // CommonsMultipartFile files = (CommonsMultipartFile) multipartRequest.getFile("filedata");
+        uploadFileLocal(multipartRequest,  folder+ "/", response,
+                systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.GOODS_IMG_DIR).getCode() ,
+                systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.FILE_DIR).getCode());
+
+    }
+
+    public void uploadFileLocal(HttpServletRequest request, String folder, HttpServletResponse response, String rootPath,String dir) throws Exception {
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("text/html;charset=UTF-8");
+        CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
+        Map<String, Object> context = new HashMap<>();
+        if (multipartResovler.isMultipart(request)) {
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            Iterator<String> it = multipartRequest.getFileNames();
+            while (it.hasNext()) {
+                MultipartFile file = multipartRequest.getFile((String) it.next());// file
+                // =
+                // (CommonsMultipartFile)
+                // multipartRequest.getFile((String)
+                // it.next());
+                if (file != null) {
+                    if (file.getSize() > 200 * 1024 * 1024L) {
+                        context.put("code", 4000);
+                        context.put("message", "涓婁紶鏂囦欢杩囧ぇ");
+                        return;
+                    }
+                    System.out.println(file.getOriginalFilename());
+                    if (file.getOriginalFilename() == null) {
+                        context.put("code", 4000);
+                        context.put("message", "鏂囦欢鍚嶄笉鍙负绌�");
+                        return;
+                    }
+                    /*
+                     * if(file.getOriginalFilename().contains(",")||file.getOriginalFilename().
+                     * contains(" ")){ sendFailureMessage(response,"鏂囦欢鍚嶇О鏈夎,涓嶅彲鍚湁閫楀彿绛夌壒娈婂瓧绗�"); }
+                     */
+
+                    String nowDate = DateUtil.getNowShortDate();
+                    folder += nowDate + "/";
+                    String strDirPath = rootPath + folder;
+                    File dirPath = new File(strDirPath);
+                    if (!dirPath.exists()) {
+                        dirPath.mkdirs();
+                    }
+                    String uploadFileName = file.getOriginalFilename();
+                    String x = UUID.randomUUID().toString().replace("-", "")
+                            + uploadFileName.substring(uploadFileName.lastIndexOf("."));
+                    String fileName = folder + x;
+                    String fileNames = nowDate + "/" + x;
+                    uploadFileName = uploadFileName.replace(" ", "");
+                    uploadFileName = uploadFileName.replace("锛�", ",");
+                    uploadFileName = uploadFileName.replaceAll(",", "-");
+                    System.err.println("R:" + fileName);
+                    String fileAndPath = dir + fileName;
+                    System.err.println("A:" + fileAndPath);
+                    // 鍒ゆ柇濡傛灉涓存椂鐩綍涓瓨鍦ㄧ浉鍚屽悕绉扮殑鏂囦欢鍏堝垹闄わ紝鍦ㄤ笂浼�
+                    File tempFile = new File(rootPath + fileName);
+                    if (tempFile.isFile() && tempFile.exists()) {
+                        tempFile.getAbsoluteFile().delete();
+                    }
+                    // 涓婁紶鍒版湇鍔″櫒涓存椂鏂囦欢澶�
+                    file.transferTo(tempFile);
+                    // 杞Щ鍒癋TP鏈嶅姟鍣�
+                    String nfix = "";
+                    if (null != uploadFileName) {
+                        nfix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
+                    }
+
+                    if (StringUtils.equalsIgnoreCase(nfix, ".exe")) {
+                        context.put("code", 4000);
+                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".exe\"涓婁紶鏈夎锛�");
+                        return;
+                    }
+                    if (StringUtils.equalsIgnoreCase(nfix, ".dll")) {
+                        context.put("code", 4000);
+                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".dll\"涓婁紶鏈夎锛�");
+                        return;
+                    }
+
+                    String remoteName = fileName;
+                    String remoteFileName = fileAndPath;
+
+             /*       Map map = new HashMap();
+                    map.put("url", remoteFileName);
+                    map.put("alt", uploadFileName);
+                    map.put("href", remoteFileName);
+                    List maps = Arrays.asList(remoteFileName);*/
+
+                    if (true) {
+                        // 鍏抽棴FTP娴�
+                        // 绉诲姩鎴愬姛,杩斿洖鏂囦欢鍚�
+                        /*context.put("error", 0);
+                        context.put("url", remoteFileName);
+                        context.put("fullurl", remoteFileName);
+                        context.put("fname", uploadFileName);
+                        context.put("data", maps);
+                        context.put("halfurl", fileNames);*/
+
+                        context.put("success", true);
+                        context.put("code", 200);
+                        context.put("errno",0);
+                        JSONObject fileJSON = new JSONObject();
+                        fileJSON.put("url", remoteFileName);
+                        fileJSON.put("imgaddr", fileNames);
+                        fileJSON.put("imgname", uploadFileName);
+                        fileJSON.put("originname", uploadFileName);
+                        context.put("data",fileJSON);
+                        context.put("message","璇锋眰鎴愬姛");
+
+                        writerJson(response, context);
+                        return;
+                    } else {
+                        // 绉诲姩澶辫触
+                        context.put("code", 0);
+                        context.put("message", "涓婁紶澶辫触");
+                        writerJson(response, context);
+                    }
+                }
+                context.put("code", 0);
+                context.put("message", "涓婁紶澶辫触");
+                writerJson(response, context);
+                return;
+            }
+        }
+        context.put("code", 0);
+        context.put("message", "涓婁紶澶辫触");
+        writerJson(response, context);
+        return;
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemController.java b/server/shop/src/main/java/com/doumee/api/system/SystemController.java
new file mode 100644
index 0000000..3cdb87f
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemController.java
@@ -0,0 +1,80 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemUserBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.LoginDTO;
+import com.doumee.dao.system.dto.LoginPhoneDTO;
+import com.doumee.dao.system.dto.UpdatePwdDto;
+import com.doumee.dao.system.dto.WebLoginDTO;
+import com.doumee.service.system.SystemLoginService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鍔熻兘")
+@Trace(exclude = true)
+@Slf4j
+@RestController
+@RequestMapping("/system")
+public class SystemController extends BaseController {
+
+    @Autowired
+    private SystemUserBiz systemUserBiz;
+
+    @Autowired
+    private SystemLoginService systemLoginService;
+
+    @PreventRepeat(limit = 10, lockTime = 10000)
+    @ApiOperation("鐧诲綍 - 鍚庣")
+    @PostMapping("/login")
+    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
+        return ApiResponse.success(systemLoginService.loginByPassword(dto, Constants.TWO, request));
+    }
+
+    @PreventRepeat(limit = 10, lockTime = 10000)
+    @ApiOperation("鐭俊楠岃瘉鐮佺櫥褰�")
+    @PostMapping("/loginByPhone")
+    public ApiResponse<String> loginByPhone (@Validated @RequestBody LoginPhoneDTO dto, HttpServletRequest request) {
+        return ApiResponse.success(systemLoginService.loginByPhone(dto, Constants.TWO, request));
+    }
+
+
+    @ApiOperation("閫�鍑虹櫥褰�")
+    @PostMapping("/logout")
+    public ApiResponse logout () {
+        Subject subject = SecurityUtils.getSubject();
+        subject.logout();
+        return ApiResponse.success(null);
+    }
+    @Trace(withRequestParameters = false)
+    @ApiOperation("淇敼褰撳墠鐢ㄦ埛瀵嗙爜")
+    @PostMapping("/updatePwd")
+    public ApiResponse updatePwd (@Validated @RequestBody UpdatePwdDto dto) {
+        dto.setUserId(this.getLoginUser().getId());
+        systemUserBiz.updatePwd(dto);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鑾峰彇褰撳墠鐧诲綍鐨勭敤鎴蜂俊鎭�")
+    @GetMapping("/getUserInfo")
+    public ApiResponse<LoginUserInfo> getUserInfo () {
+        return ApiResponse.success(this.getLoginUser());
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemDataPermissionController.java b/server/shop/src/main/java/com/doumee/api/system/SystemDataPermissionController.java
new file mode 100644
index 0000000..fcb5b7c
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemDataPermissionController.java
@@ -0,0 +1,106 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDataPermissionBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.DataPermissionConstants;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.model.SystemDataPermission;
+import com.doumee.dao.system.vo.SystemDataPermissionListVO;
+import com.doumee.service.system.SystemDataPermissionService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@RestController
+@RequestMapping("/system/dataPermission")
+@Api(tags = "绯荤粺鏁版嵁鏉冮檺")
+public class SystemDataPermissionController extends BaseController {
+
+    @Autowired
+    private SystemDataPermissionService systemDataPermissionService;
+
+    @Autowired
+    private SystemDataPermissionBiz systemDataPermissionBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:datapermission:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemDataPermission systemDataPermission) {
+        return ApiResponse.success(systemDataPermissionBiz.create(systemDataPermission));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:datapermission:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemDataPermissionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:datapermission:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDataPermissionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:datapermission:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemDataPermission systemDataPermission) {
+        systemDataPermissionBiz.update(systemDataPermission);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("system:datapermission:update")
+    public ApiResponse updateStatus(@Validated(OperaType.UpdateStatus.class) @RequestBody SystemDataPermission systemDataPermission) {
+        systemDataPermissionBiz.updateStatus(systemDataPermission);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:datapermission:query")
+    public ApiResponse<PageData<SystemDataPermissionListVO>> findPage (@RequestBody PageWrap<SystemDataPermission> pageWrap) {
+        return ApiResponse.success(systemDataPermissionService.findPage(pageWrap));
+    }
+
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ鏁版嵁鏉冮檺绫诲瀷")
+    @GetMapping("/types")
+    public ApiResponse<List<Map<String, Object>>> findTypes () {
+        return ApiResponse.success(DataPermissionConstants.Type.valueList());
+    }
+
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ鏁版嵁鏉冮檺妯″潡")
+    @GetMapping("/modules")
+    public ApiResponse<List<Map<String, Object>>> findModules () {
+        return ApiResponse.success(DataPermissionConstants.Module.valueList());
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemDepartmentController.java b/server/shop/src/main/java/com/doumee/api/system/SystemDepartmentController.java
new file mode 100644
index 0000000..f013ef7
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemDepartmentController.java
@@ -0,0 +1,109 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDepartmentBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemUserDTO;
+import com.doumee.dao.system.model.SystemDepartment;
+import com.doumee.dao.system.vo.SystemDepartmentListVO;
+import com.doumee.dao.system.vo.SystemUserListVO;
+import com.doumee.service.system.SystemUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "閮ㄩ棬")
+@RestController
+@RequestMapping("/system/department")
+public class SystemDepartmentController extends BaseController {
+
+    @Autowired
+    private SystemDepartmentBiz systemDepartmentBiz;
+
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:department:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemDepartment systemDepartment) {
+        systemDepartment.setCreateUser(getLoginUser().getId());
+        systemDepartment.setUpdateUser(getLoginUser().getId());
+        return ApiResponse.success(systemDepartmentBiz.create(systemDepartment));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:department:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemDepartmentBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @PreventRepeat
+    @RequiresPermissions("system:department:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDepartmentBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:department:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemDepartment systemDepartment) {
+        systemDepartment.setCreateUser(getLoginUser().getId());
+        systemDepartment.setUpdateUser(getLoginUser().getId());
+        systemDepartmentBiz.updateById(systemDepartment);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ閮ㄩ棬鍒楄〃")
+    @PostMapping("/tree")
+    @RequiresPermissions("system:department:query")
+    public ApiResponse<List<SystemDepartmentListVO>> findTree () {
+        return ApiResponse.success(systemDepartmentBiz.findTree());
+    }
+
+    @ApiOperation("鏌ヨ閮ㄩ棬鍒楄〃鍙婇儴闂ㄤ笅鐨勪汉鍛�")
+    @GetMapping("/findTreeUser")
+    @RequiresPermissions("system:department:query")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "parentId", value = "parentId", paramType = "query", dataType = "Integer"),
+    })
+    public ApiResponse<SystemDepartmentListVO> findTreeUser(Integer parentId) {
+        return ApiResponse.success(systemDepartmentBiz.findTreeUser(parentId));
+    }
+
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ閮ㄩ棬浜哄憳")
+    @PostMapping("/users")
+    @RequiresPermissions("system:department:queryUsers")
+    public ApiResponse<PageData<SystemUserListVO>> findPage (@RequestBody PageWrap<QuerySystemUserDTO> pageWrap) {
+        return ApiResponse.success(systemUserService.findPage(pageWrap));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemDictController.java b/server/shop/src/main/java/com/doumee/api/system/SystemDictController.java
new file mode 100644
index 0000000..71a297a
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemDictController.java
@@ -0,0 +1,82 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemDictDTO;
+import com.doumee.dao.system.model.SystemDict;
+import com.doumee.dao.system.vo.SystemDictListVO;
+import com.doumee.service.system.SystemDictService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺瀛楀吀")
+@RestController
+@RequestMapping("/system/dict")
+public class SystemDictController extends BaseController {
+
+    @Autowired
+    private SystemDictService systemDictService;
+
+    @Autowired
+    private SystemDictBiz systemDictBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:dict:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemDict systemDict) {
+        return ApiResponse.success(systemDictBiz.create(systemDict));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:dict:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemDictService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:dict:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDictService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemDict systemDict) {
+        systemDictBiz.updateById(systemDict);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:dict:query")
+    public ApiResponse<PageData<SystemDictListVO>> findPage (@RequestBody PageWrap<QuerySystemDictDTO> pageWrap) {
+        return ApiResponse.success(systemDictService.findPage(pageWrap));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemDictDataController.java b/server/shop/src/main/java/com/doumee/api/system/SystemDictDataController.java
new file mode 100644
index 0000000..4c76bfc
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemDictDataController.java
@@ -0,0 +1,95 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemDictDataDTO;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.dao.system.vo.SystemDictDataListVO;
+import com.doumee.service.system.SystemDictDataService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "瀛楀吀鏁版嵁")
+@RestController
+@RequestMapping("/system/dictData")
+public class SystemDictDataController extends BaseController {
+
+    @Autowired
+    private SystemDictDataService systemDictDataService;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemDictData systemDictData) {
+        return ApiResponse.success(systemDictDataBiz.create(systemDictData));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemDictDataService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:dict:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemDictDataService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemDictData systemDictData) {
+        systemDictDataBiz.updateById(systemDictData);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse<PageData<SystemDictDataListVO>> findPage (@RequestBody PageWrap<QuerySystemDictDataDTO> pageWrap) {
+        return ApiResponse.success(systemDictDataService.findPage(pageWrap));
+    }
+
+
+
+
+
+    @ApiOperation("缂栬緫鏌ヨ鍜栬眴浠诲姟瑙勫垯")
+    @PostMapping("/createCoffeeTask")
+    @RequiresPermissions("system:dict:update")
+    public ApiResponse createCoffeeTask(@Validated(OperaType.Create.class) @RequestBody List<SystemDictData> list) {
+           systemDictDataBiz.updateByDicId(list);
+        return ApiResponse.success(null);
+    }
+
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemLoginLogController.java b/server/shop/src/main/java/com/doumee/api/system/SystemLoginLogController.java
new file mode 100644
index 0000000..3949e25
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemLoginLogController.java
@@ -0,0 +1,47 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemLoginLogDTO;
+import com.doumee.dao.system.model.SystemLoginLog;
+import com.doumee.service.system.SystemLoginLogService;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@RestController
+@RequestMapping("/system/loginLog")
+@Api(tags = "鐧诲綍鏃ュ織")
+public class SystemLoginLogController extends BaseController {
+
+    @Autowired
+    private SystemLoginLogService systemLoginLogService;
+
+    @PostMapping("/page")
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @RequiresPermissions("system:loginLog:query")
+    public ApiResponse<PageData<SystemLoginLog>> findPage (@RequestBody PageWrap<QuerySystemLoginLogDTO> pageWrap) {
+        return ApiResponse.success(systemLoginLogService.findPage(pageWrap));
+    }
+
+    @PostMapping("/exportExcel")
+    @ApiOperation("瀵煎嚭Excel")
+    @RequiresPermissions("system:loginLog:query")
+    public void export (@RequestBody PageWrap<QuerySystemLoginLogDTO> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SystemLoginLog.class).export(systemLoginLogService.findPage(pageWrap).getRecords(), "鐧诲綍鏃ュ織", response);
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemMenuController.java b/server/shop/src/main/java/com/doumee/api/system/SystemMenuController.java
new file mode 100644
index 0000000..402e765
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemMenuController.java
@@ -0,0 +1,102 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemMenuBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.dao.system.dto.UpdateSystemMenuSortDTO;
+import com.doumee.dao.system.model.SystemMenu;
+import com.doumee.dao.system.vo.SystemMenuListVO;
+import com.doumee.dao.system.vo.SystemMenuNodeVO;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鑿滃崟")
+@RestController
+@RequestMapping("/system/menu")
+public class SystemMenuController extends BaseController {
+
+    @Autowired
+    private SystemMenuBiz systemMenuBiz;
+
+    @ApiOperation("鑿滃崟鎺掑簭")
+    @PostMapping("/updateSort")
+    @RequiresPermissions("system:menu:sort")
+    public ApiResponse updateSort (@Validated @RequestBody UpdateSystemMenuSortDTO dto) {
+        systemMenuBiz.updateSort(dto);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ鑿滃崟鏍�")
+    @GetMapping("/treeNodes")
+    public ApiResponse<List<SystemMenuNodeVO>> getTreeMenu () {
+        LoginUserInfo loginUserInfo = this.getLoginUser();
+        return ApiResponse.success(systemMenuBiz.findTree(loginUserInfo.getId(),loginUserInfo.getType()));
+    }
+
+    @ApiOperation("鏌ヨ鍒楄〃鏍�")
+    @PostMapping("/treeList/{type}")
+    @RequiresPermissions("system:menu:query")
+    public ApiResponse<List<SystemMenuListVO>> treeList (@PathVariable Integer type) {
+        return ApiResponse.success(systemMenuBiz.findTreeByType(type));
+    }
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:menu:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemMenu systemMenu) {
+        return ApiResponse.success(systemMenuBiz.create(systemMenu));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:menu:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemMenuBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:menu:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemMenuBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:menu:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemMenu systemMenu) {
+        systemMenuBiz.updateById(systemMenu);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼鑿滃崟鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("system:menu:update")
+    public ApiResponse updateStatus(@Validated(OperaType.UpdateStatus.class) @RequestBody SystemMenu systemMenu) {
+        systemMenuBiz.updateById(systemMenu);
+        return ApiResponse.success(null);
+    }
+
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemMonitorController.java b/server/shop/src/main/java/com/doumee/api/system/SystemMonitorController.java
new file mode 100644
index 0000000..b16d68b
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemMonitorController.java
@@ -0,0 +1,31 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.utils.Monitor;
+import com.doumee.core.utils.Utils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鐩戝惉")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/system/monitor")
+public class SystemMonitorController extends BaseController {
+
+    @ApiOperation("鑾峰彇绯荤粺淇℃伅")
+    @GetMapping("/getSystemInfo")
+    @RequiresPermissions("system:monitor:query")
+    public ApiResponse<Monitor> getSystemInfo () {
+        return ApiResponse.success(Utils.Monitor.current());
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemPermissionController.java b/server/shop/src/main/java/com/doumee/api/system/SystemPermissionController.java
new file mode 100644
index 0000000..327e24a
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemPermissionController.java
@@ -0,0 +1,91 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemPermissionBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemPermissionDTO;
+import com.doumee.dao.system.model.SystemPermission;
+import com.doumee.dao.system.vo.SystemPermissionListVO;
+import com.doumee.service.system.SystemPermissionService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺鏉冮檺")
+@RestController
+@RequestMapping("/system/permission")
+public class SystemPermissionController extends BaseController {
+
+    @Autowired
+    private SystemPermissionService systemPermissionService;
+
+    @Autowired
+    private SystemPermissionBiz systemPermissionBiz;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:permission:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemPermission systemPermission) {
+        return ApiResponse.success(systemPermissionBiz.create(systemPermission));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:permission:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemPermissionBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:permission:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemPermissionBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:permission:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemPermission systemPermission) {
+        systemPermissionBiz.updateById(systemPermission);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:permission:query")
+    public ApiResponse<PageData<SystemPermissionListVO>> findPage (@RequestBody PageWrap<QuerySystemPermissionDTO> pageWrap) {
+        return ApiResponse.success(systemPermissionService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏌ヨ鎵�鏈�")
+    @GetMapping("/all")
+    @RequiresPermissions("system:permission:query")
+    public ApiResponse<List<SystemPermission>> findAll () {
+        SystemPermission systemPermission = new SystemPermission();
+        systemPermission.setDeleted(Boolean.FALSE);
+        return ApiResponse.success(systemPermissionService.findList(systemPermission));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemPositionController.java b/server/shop/src/main/java/com/doumee/api/system/SystemPositionController.java
new file mode 100644
index 0000000..4670e06
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemPositionController.java
@@ -0,0 +1,106 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemPositionBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemUserDTO;
+import com.doumee.dao.system.model.SystemPosition;
+import com.doumee.dao.system.vo.SystemPositionListVO;
+import com.doumee.dao.system.vo.SystemUserListVO;
+import com.doumee.service.system.SystemPositionService;
+import com.doumee.service.system.SystemUserService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 宀椾綅鎺ュ彛
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "宀椾綅")
+@RestController
+@RequestMapping("/system/position")
+public class SystemPositionController extends BaseController {
+
+    @Autowired
+    private SystemPositionService systemPositionService;
+
+    @Autowired
+    private SystemPositionBiz systemPositionBiz;
+
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:position:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemPosition systemPosition) {
+        return ApiResponse.success(systemPositionBiz.create(systemPosition));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:position:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemPositionBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:position:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemPositionBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:position:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemPosition systemPosition) {
+        systemPositionBiz.updateById(systemPosition);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ宀椾綅鏍戝垪琛�")
+    @PostMapping("/tree")
+    @RequiresPermissions("system:position:query")
+    public ApiResponse<List<SystemPositionListVO>> findTree () {
+        return ApiResponse.success(systemPositionBiz.findTree());
+    }
+
+    @ApiOperation("鏌ヨ宀椾綅鍒楄〃")
+    @PostMapping("/all")
+    @RequiresPermissions("system:position:query")
+    public ApiResponse<List<SystemPosition>> findList () {
+        SystemPosition systemPosition = new SystemPosition();
+        systemPosition.setDeleted(Boolean.FALSE);
+        return ApiResponse.success(systemPositionService.findList(systemPosition));
+    }
+
+    @Trace(exclude = true)
+    @ApiOperation("鏌ヨ宀椾綅浜哄憳")
+    @PostMapping("/users")
+    @RequiresPermissions("system:position:queryUsers")
+    public ApiResponse<PageData<SystemUserListVO>> findPage (@RequestBody PageWrap<QuerySystemUserDTO> pageWrap) {
+        return ApiResponse.success(systemUserService.findPage(pageWrap));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemRoleController.java b/server/shop/src/main/java/com/doumee/api/system/SystemRoleController.java
new file mode 100644
index 0000000..cf27fba
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemRoleController.java
@@ -0,0 +1,118 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemRoleBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.CreateRoleMenuDTO;
+import com.doumee.dao.system.dto.CreateRolePermissionDTO;
+import com.doumee.dao.system.dto.QuerySystemRoleDTO;
+import com.doumee.dao.system.model.SystemRole;
+import com.doumee.dao.system.vo.SystemRoleListVO;
+import com.doumee.service.system.SystemRoleService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "绯荤粺瑙掕壊")
+@RestController
+@RequestMapping("/system/role")
+public class SystemRoleController extends BaseController {
+
+    @Autowired
+    private SystemRoleService systemRoleService;
+
+    @Autowired
+    private SystemRoleBiz systemRoleBiz;
+
+    @PreventRepeat
+    @ApiOperation("閰嶇疆瑙掕壊鑿滃崟")
+    @PostMapping("/createRoleMenu")
+    @RequiresPermissions("system:role:createRoleMenu")
+    public ApiResponse createRoleMenu (@Validated @RequestBody CreateRoleMenuDTO dto) {
+        systemRoleBiz.createRoleMenu(dto);
+        return ApiResponse.success(null);
+    }
+
+    @PreventRepeat
+    @ApiOperation("閰嶇疆瑙掕壊鏉冮檺")
+    @PostMapping("/createRolePermission")
+    @RequiresPermissions("system:role:createRolePermission")
+    public ApiResponse createRolePermission (@Validated @RequestBody CreateRolePermissionDTO dto) {
+        systemRoleBiz.createRolePermission(dto);
+        return ApiResponse.success(null);
+    }
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:role:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemRole systemRole) {
+        systemRole.setType(Constants.ONE);
+        return ApiResponse.success(systemRoleBiz.create(systemRole));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:role:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemRoleBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:role:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemRoleBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:role:update")
+    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemRole systemRole) {
+        systemRoleBiz.updateById(systemRole);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:role:query")
+    public ApiResponse<PageData<SystemRoleListVO>> findPage (@RequestBody PageWrap<QuerySystemRoleDTO> pageWrap) {
+        return ApiResponse.success(systemRoleService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏌ヨ鎵�鏈�")
+    @GetMapping("/all")
+    @RequiresPermissions("system:role:query")
+    public ApiResponse<List<SystemRole>> findAll () {
+        LoginUserInfo userInfo = this.getLoginUser();
+        SystemRole systemRole = new SystemRole();
+        systemRole.setDeleted(Boolean.FALSE);
+        if(userInfo.getType().equals(Constants.ONE)){
+            systemRole.setType(userInfo.getType());
+        }
+        return ApiResponse.success(systemRoleService.findList(systemRole));
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemTraceLogController.java b/server/shop/src/main/java/com/doumee/api/system/SystemTraceLogController.java
new file mode 100644
index 0000000..e4745dc
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemTraceLogController.java
@@ -0,0 +1,46 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.system.dto.QuerySystemTraceLogDTO;
+import com.doumee.dao.system.model.SystemTraceLog;
+import com.doumee.service.system.SystemTraceLogService;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "璺熻釜鏃ュ織")
+@RestController
+@RequestMapping("/system/traceLog")
+public class SystemTraceLogController extends BaseController {
+
+    @Autowired
+    private SystemTraceLogService systemTraceLogService;
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:traceLog:query")
+    public ApiResponse findPage (@RequestBody PageWrap<QuerySystemTraceLogDTO> pageWrap) {
+        return ApiResponse.success(systemTraceLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("system:traceLog:query")
+    public void exportExcel (@RequestBody PageWrap<QuerySystemTraceLogDTO> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(SystemTraceLog.class).export(systemTraceLogService.findPage(pageWrap).getRecords(), "鎿嶄綔鏃ュ織", response);
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemUserController.java b/server/shop/src/main/java/com/doumee/api/system/SystemUserController.java
new file mode 100644
index 0000000..acebc5d
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemUserController.java
@@ -0,0 +1,192 @@
+package com.doumee.api.system;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemUserBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.OperaType;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.system.dto.*;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.dao.system.vo.SystemUserListVO;
+import com.doumee.service.system.SystemUserService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import com.doumee.core.model.ApiResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Api(tags = "鐢ㄦ埛")
+@RestController
+@RequestMapping("/system/user")
+public class SystemUserController extends BaseController {
+
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @Autowired
+    private SystemUserBiz systemUserBiz;
+
+    @PreventRepeat
+    @ApiOperation("閰嶇疆鐢ㄦ埛瑙掕壊")
+    @PostMapping("/createUserRole")
+    @RequiresPermissions("system:user:createUserRole")
+    public ApiResponse createUserRole (@Validated @RequestBody CreateUserRoleDTO dto) {
+        systemUserBiz.createUserRole(dto);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("閲嶇疆鐢ㄦ埛瀵嗙爜")
+    @PostMapping("/resetPwd")
+    @RequiresPermissions("system:user:resetPwd")
+    public ApiResponse resetPwd (@Validated @RequestBody ResetSystemUserPwdDTO dto) {
+        dto.setOperaUserId(this.getLoginUser().getId());
+        systemUserBiz.resetPwd(dto);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("system:user:create")
+    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody CreateSystemUserDTO systemUser) {
+        systemUser.setCreateUser(this.getLoginUser().getId());
+        systemUserBiz.create(systemUser);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("system:user:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        systemUserBiz.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("system:user:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        systemUserBiz.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("system:user:update")
+    public ApiResponse updateById( @RequestBody CreateSystemUserDTO systemUser) {
+        systemUser.setUpdateUser(this.getLoginUser().getId());
+        systemUserBiz.updateById(systemUser);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("system:user:query")
+    public ApiResponse<PageData<SystemUserListVO>> findPage (@RequestBody PageWrap<QuerySystemUserDTO> pageWrap) {
+        pageWrap.getModel().setCompanyId(this.getLoginUser().getCompanyId());
+        return ApiResponse.success(systemUserService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ绯荤粺鐢ㄦ埛")
+    @PostMapping("/findAllList")
+    @RequiresPermissions("system:user:query")
+    public ApiResponse<PageData<SystemUser>> findAllList (@RequestBody PageWrap<SystemUser> pageWrap) {
+        return ApiResponse.success(systemUserService.findAllList(pageWrap));
+    }
+
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("system:user:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(systemUserService.findById(id));
+    }
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("鏂板缓鍛樺伐")
+    @PostMapping("/companyCreateUser")
+    @RequiresPermissions("system:user:create")
+    public ApiResponse companyCreate(@Validated(OperaType.Create.class) @RequestBody CreateCompanyUserDTO createCompanyUserDTO) {
+        createCompanyUserDTO.setType(Constants.UserType.COMPANY.getKey());
+        systemUserBiz.companyCreateUser(createCompanyUserDTO);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("鏂板缓涓绘挱")
+    @PostMapping("/companyCreateAnchor")
+//    @RequiresPermissions("system:user:create")
+    public ApiResponse companyCreateAnchor(@Validated(OperaType.Create.class) @RequestBody CreateCompanyUserDTO createCompanyUserDTO) {
+        createCompanyUserDTO.setType(Constants.UserType.ZHUBO.getKey());
+        systemUserBiz.companyCreateUser(createCompanyUserDTO);
+        return ApiResponse.success(null);
+    }
+
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("淇敼鍛樺伐淇℃伅")
+    @PostMapping("/companyUpdUser")
+    @RequiresPermissions("system:user:create")
+    public ApiResponse companyUpdUser(@Validated(OperaType.Create.class) @RequestBody CreateCompanyUserDTO createCompanyUserDTO) {
+        createCompanyUserDTO.setType(Constants.UserType.COMPANY.getKey());
+        systemUserBiz.companyUpdUser(createCompanyUserDTO);
+        return ApiResponse.success(null);
+    }
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("淇敼涓绘挱淇℃伅")
+    @PostMapping("/companyUpdAnchor")
+    @RequiresPermissions("system:user:create")
+    public ApiResponse companyUpdAnchor(@Validated(OperaType.Create.class) @RequestBody CreateCompanyUserDTO createCompanyUserDTO) {
+        createCompanyUserDTO.setType(Constants.UserType.ZHUBO.getKey());
+        systemUserBiz.companyUpdUser(createCompanyUserDTO);
+        return ApiResponse.success(null);
+    }
+
+
+    @PreventRepeat
+    @ApiOperation("淇敼鐢ㄦ埛鐘舵��")
+    @GetMapping("/updUserStatus")
+//    @RequiresPermissions("system:user:create")
+    public ApiResponse updUserStatus( @RequestParam Integer id,@RequestParam Integer status) {
+        systemUserBiz.updUserStatus(id,status);
+        return ApiResponse.success(null);
+    }
+
+
+    @Trace(withRequestParameters = false)
+    @PreventRepeat
+    @ApiOperation("淇敼瀵嗙爜")
+    @PostMapping("/updPassword")
+//    @RequiresPermissions("system:user:create")
+    public ApiResponse updPassword(@Validated(OperaType.Create.class) @RequestBody CreateCompanyUserDTO createCompanyUserDTO) {
+        systemUserBiz.updPassword(createCompanyUserDTO);
+        return ApiResponse.success(null);
+    }
+
+}
diff --git a/server/shop/src/main/java/com/doumee/config/swagger/SwaggerConfig.java b/server/shop/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
new file mode 100644
index 0000000..9817cda
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
@@ -0,0 +1,99 @@
+package com.doumee.config.swagger;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.RequestHandler;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.function.Predicate;
+
+/**
+ * Swagger閰嶇疆
+ * @author Eva.Caesar Liu
+ * @date 2022/03/11 10:24
+ */
+@Configuration
+@EnableOpenApi
+@EnableKnife4j
+public class SwaggerConfig {
+
+    @Value("${swagger.host:}")
+    private String host;
+
+    @Value("${swagger.title:鎺ュ彛鏂囨。}")
+    private String title;
+
+    @Value("${swagger.description:}")
+    private String description;
+
+    @Value("${project.version:}")
+    private String version;
+
+    @Bean
+    public ApiInfo getApiInfo() {
+        return new ApiInfoBuilder()
+                .title(title)
+                .description(description)
+                .version(version)
+                .build();
+    }
+    @Bean
+    public Docket getDocket() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(this.getApiInfo()).groupName("銆愮郴缁熺鐞嗘帴鍙PI銆�")
+                .host(host)
+                .select()
+                .apis( basePackage("com.doumee.api.system;com.doumee.api.business;"))
+                // 璁剧疆闇�瑕佽鎵弿鐨勭被锛岃繖閲岃缃负娣诲姞浜咢Api娉ㄨВ鐨勭被
+//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+                .paths(PathSelectors.any())
+                .build();
+    }
+    @Bean
+    public Docket getDocket1() {
+        return new Docket(DocumentationType.SWAGGER_2)
+            .apiInfo(this.getApiInfo()).groupName("銆愬叕鍏辨帴鍙PI銆�")
+            .host(host)
+            .select()
+            .apis( basePackage("com.doumee.api.common"))
+            // 璁剧疆闇�瑕佽鎵弿鐨勭被锛岃繖閲岃缃负娣诲姞浜咢Api娉ㄨВ鐨勭被
+//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+            .paths(PathSelectors.any())
+            .build();
+    }
+    /**
+     * 閲嶅啓basePackage鏂规硶锛屼娇鑳藉瀹炵幇澶氬寘璁块棶锛屽鍒惰创涓婂幓
+     * @author  teavamc
+     * @date 2019/1/26
+     * @return com.google.common.base.Predicate<springfox.documentation.RequestHandler>
+     */
+    public static Predicate<RequestHandler> basePackage(String basePackage) {
+        return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
+    }
+
+    private static Function<Class<?>, Boolean> handlerPackage(String basePackage)     {
+        return input -> {
+            // 寰幆鍒ゆ柇鍖归厤
+            for (String strPackage : basePackage.split(";")) {
+                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
+                if (isMatch) {
+                    return true;
+                }
+            }
+            return false;
+        };
+    }
+
+    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
+        return Optional.fromNullable(input.declaringClass());
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java b/server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java
new file mode 100644
index 0000000..8fd55c6
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java
@@ -0,0 +1,45 @@
+package com.doumee.config.swagger;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * Swagger鎷︽埅鍣�
+ * @author Eva.Caesar Liu
+ * @date 2022/04/18 18:12
+ */
+@Slf4j
+@Component
+public class SwaggerInterceptor implements HandlerInterceptor {
+
+    @Value("${swagger.enabled:false}")
+    private Boolean enabledSwagger;
+
+    @Value("${swagger.redirect-uri:/}")
+    private String redirectUri;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        if (!enabledSwagger) {
+            String uri = request.getContextPath();
+            if (StringUtils.isNotBlank(redirectUri))
+                uri = request.getContextPath() + redirectUri;
+            if (StringUtils.isBlank(uri))
+                uri = "/";
+            try {
+                response.sendRedirect(uri);
+            } catch (IOException e) {
+                log.error(String.format("Redirect to '%s' for swagger throw an exception : %s", uri, e.getMessage()), e);
+            }
+            return Boolean.FALSE;
+        }
+        return Boolean.TRUE;
+    }
+}
diff --git a/server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java b/server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java
new file mode 100644
index 0000000..ca3aa45
--- /dev/null
+++ b/server/shop/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java
@@ -0,0 +1,22 @@
+package com.doumee.config.swagger;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Swagger鎷︽埅鍣ㄩ厤缃�
+ * @author Eva.Caesar Liu
+ * @date 2022/04/18 18:12
+ */
+@Configuration
+public class SwaggerInterceptorConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private SwaggerInterceptor swaggerInterceptor;
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(swaggerInterceptor).addPathPatterns("/swagger-ui.html", "/doc.html");
+    }
+}
diff --git a/server/shop/src/main/resources/application.yml b/server/shop/src/main/resources/application.yml
new file mode 100644
index 0000000..83ded24
--- /dev/null
+++ b/server/shop/src/main/resources/application.yml
@@ -0,0 +1,65 @@
+# 椤圭洰淇℃伅閰嶇疆
+project:
+  name: 浜戞槗淇濆鎴锋湇鍔$郴缁�
+  version: 1.0.0
+  env: development
+#  env: production
+server:
+#  port: 10022
+  port: 10031
+
+spring:
+#  application:git
+#    name: doumeemes
+  profiles:
+    active: dev
+
+  # JSON杩斿洖閰嶇疆
+  jackson:
+    # 榛樿鏃跺尯
+    time-zone: GMT+8
+    # 榛樿鏃ユ湡鏍煎紡鍖�
+    date-format: yyyy-MM-dd HH:mm:ss
+  servlet:
+    multipart:
+      max-file-size: 200MB
+      max-request-size: 200MB
+      enabled: true
+# MyBatis閰嶇疆
+mybatis-plus:
+  mapper-locations: classpath*:/mappers/**/*.xml
+  configuration:
+    map-underscore-to-camel-case: true
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+# 缂撳瓨鍐呭璁剧疆
+cache:
+  session:
+    # 浼氳瘽杩囨湡鏃堕暱(s)
+    expire: 18000
+  captcha:
+    # 楠岃瘉鐮佽繃鏈熸椂闀�(s)
+    expire: 300
+
+# 璺熻釜鏃ュ織
+trace:
+  # 寮�鍚櫤鑳借窡韪ā寮�
+  smart: true
+  # 鎺掗櫎璺熻釜鐨刄RL姝e垯
+  exclude-patterns: .+/list[a-zA-Z0-9\-\_]*$, .+/tree[a-zA-Z0-9\-\_]*$, .+/page[a-zA-Z0-9\-\_]*$, .+/all[a-zA-Z0-9\-\_]*$, /swagger-resources.*
+
+# 鏃ュ織閰嶇疆
+logback:
+  level: INFO
+  appender: ${project.env}
+# dao灞傜殑鏃ュ織璁剧疆涓篸ebug锛屾柟渚挎煡鐪媠ql
+logging:
+  level:
+    doumeemes.dao: debug
+
+knife4j:
+  enable: true
+  basic:
+    enable: true
+    username: admin
+    password: 111111
\ No newline at end of file

--
Gitblit v1.9.3