From 8ad07bd89eea15ea8ff9e0408616db290a96b131 Mon Sep 17 00:00:00 2001
From: wanglizhong <wlz>
Date: 星期四, 01 五月 2025 10:13:54 +0800
Subject: [PATCH] feat:上传客户配置

---
 ruoyi-system/src/main/resources/mapper/system/ServiceOrderMapper.xml                  |   43 +
 ruoyi-ui/src/views/system/clientApp/index.vue                                         |  356 +++++++++++++
 ruoyi-ui/src/api/system/clientApp.js                                                  |   53 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/IServiceOrderService.java         |    8 
 ruoyi-ui/package.json                                                                 |    1 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysClientAppController.java |   99 +++
 sql/ry_20250417.sql                                                                   |   29 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ServiceOrderServiceImpl.java |   30 
 ruoyi-ui/src/views/system/serviceOrder/anonymous.vue                                  |   82 +++
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java             |   15 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ServiceOrderController.java |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/ServiceOrderMapper.java            |   18 
 ruoyi-ui/src/router/index.js                                                          |    6 
 ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml                             |    9 
 ruoyi-admin/pom.xml                                                                   |    6 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java                 |    3 
 ruoyi-system/pom.xml                                                                  |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysClientApp.java                  |  128 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysClientAppService.java         |   57 ++
 ruoyi-system/src/main/resources/mapper/system/SysClientAppMapper.xml                  |  101 +++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysClientAppMapper.java            |   57 ++
 sql/sys_client_app.sql                                                                |   26 +
 ruoyi-admin/src/main/resources/application.yml                                        |    4 
 ruoyi-ui/src/api/system/order.js                                                      |    9 
 /dev/null                                                                             |   23 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysClientAppServiceImpl.java |  121 ++++
 ruoyi-admin/src/main/resources/application-druid.yml                                  |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/ServiceOrder.java                  |   70 +
 ruoyi-ui/src/views/system/serviceOrder/index.vue                                      |  146 +---
 ruoyi-admin/src/main/resources/sql/menu_client_app.sql                                |   22 
 30 files changed, 1,365 insertions(+), 180 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 9617d01..3ba8d4a 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -42,7 +42,11 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>9.4.0.jre8</version>
+        </dependency>
         <!-- 鏍稿績妯″潡-->
         <dependency>
             <groupId>com.ruoyi</groupId>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/framework/config/DynamicDataSourceConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/framework/config/DynamicDataSourceConfig.java
deleted file mode 100644
index 0519ecb..0000000
--- a/ruoyi-admin/src/main/java/com/ruoyi/framework/config/DynamicDataSourceConfig.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/framework/datasource/DataSourceType.java b/ruoyi-admin/src/main/java/com/ruoyi/framework/datasource/DataSourceType.java
deleted file mode 100644
index 0519ecb..0000000
--- a/ruoyi-admin/src/main/java/com/ruoyi/framework/datasource/DataSourceType.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ServiceOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ServiceOrderController.java
index 9482e69..5b3308c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ServiceOrderController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ServiceOrderController.java
@@ -1,6 +1,10 @@
 package com.ruoyi.web.controller.system;
 
 import java.util.List;
+
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.constant.HttpStatus;
+import com.ruoyi.common.enums.DataSourceType;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -20,8 +24,7 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.system.domain.ServiceOrder;
 import com.ruoyi.system.service.IServiceOrderService;
-import com.ruoyi.framework.datasource.annotation.DataSource;
-import com.ruoyi.framework.datasource.DataSourceType;
+
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -43,9 +46,17 @@
     @PreAuthorize("@ss.hasPermi('system:order:list')")
     @GetMapping("/list")
     public TableDataInfo list(ServiceOrder serviceOrder) {
-        startPage();
+        // 鑾峰彇鎬绘暟
+        int total = serviceOrderService.selectServiceOrderCount(serviceOrder);
+        // 鑾峰彇鍒嗛〉鏁版嵁
         List<ServiceOrder> list = serviceOrderService.selectServiceOrderList(serviceOrder);
-        return getDataTable(list);
+        // 璁剧疆鎬绘暟
+        TableDataInfo rspData = new TableDataInfo();
+        rspData.setCode(HttpStatus.SUCCESS);
+        rspData.setMsg("鏌ヨ鎴愬姛");
+        rspData.setRows(list);
+        rspData.setTotal(total);
+        return rspData;
     }
 
     @Log(title = "鏈嶅姟璁㈠崟", businessType = BusinessType.EXPORT)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysClientAppController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysClientAppController.java
new file mode 100644
index 0000000..95a3557
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysClientAppController.java
@@ -0,0 +1,99 @@
+package com.ruoyi.web.controller.system;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysClientApp;
+import com.ruoyi.system.service.ISysClientAppService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 瀹㈡埛搴旂敤閰嶇疆Controller
+ */
+@RestController
+@RequestMapping("/system/clientApp")
+public class SysClientAppController extends BaseController {
+    @Autowired
+    private ISysClientAppService sysClientAppService;
+
+    /**
+     * 鏌ヨ瀹㈡埛搴旂敤閰嶇疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:clientApp:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysClientApp sysClientApp) {
+        startPage();
+        List<SysClientApp> list = sysClientAppService.selectSysClientAppList(sysClientApp);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭瀹㈡埛搴旂敤閰嶇疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:clientApp:export')")
+    @Log(title = "瀹㈡埛搴旂敤閰嶇疆", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysClientApp sysClientApp) {
+        List<SysClientApp> list = sysClientAppService.selectSysClientAppList(sysClientApp);
+        ExcelUtil<SysClientApp> util = new ExcelUtil<SysClientApp>(SysClientApp.class);
+        util.exportExcel(response, list, "瀹㈡埛搴旂敤閰嶇疆鏁版嵁");
+    }
+
+    /**
+     * 鑾峰彇瀹㈡埛搴旂敤閰嶇疆璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:clientApp:query')")
+    @GetMapping(value = "/{appId}")
+    public AjaxResult getInfo(@PathVariable("appId") Long appId) {
+        return success(sysClientAppService.selectSysClientAppByAppId(appId));
+    }
+
+    /**
+     * 鏂板瀹㈡埛搴旂敤閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:clientApp:add')")
+    @Log(title = "瀹㈡埛搴旂敤閰嶇疆", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysClientApp sysClientApp) {
+        return toAjax(sysClientAppService.insertSysClientApp(sysClientApp));
+    }
+
+    /**
+     * 淇敼瀹㈡埛搴旂敤閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:clientApp:edit')")
+    @Log(title = "瀹㈡埛搴旂敤閰嶇疆", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysClientApp sysClientApp) {
+        try {
+            return toAjax(sysClientAppService.updateSysClientApp(sysClientApp));
+        }catch (Exception ex){
+            return AjaxResult.error(ex.getMessage());
+        }
+    }
+
+    /**
+     * 鍒犻櫎瀹㈡埛搴旂敤閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:clientApp:remove')")
+    @Log(title = "瀹㈡埛搴旂敤閰嶇疆", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{appIds}")
+    public AjaxResult remove(@PathVariable Long[] appIds) {
+        return toAjax(sysClientAppService.deleteSysClientAppByAppIds(appIds));
+    }
+} 
+ 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index 3442df1..963268b 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -17,6 +17,7 @@
                 password: camesa
                 driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
                 enabled: true
+                validationQuery: SELECT 1
             slave:
                 # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
                 enabled: false
@@ -42,7 +43,7 @@
             # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
             maxEvictableIdleTimeMillis: 900000
             # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
-            validationQuery: SELECT 1 FROM DUAL
+            validationQuery: SELECT 1
             testWhileIdle: true
             testOnBorrow: false
             testOnReturn: false
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 80e05fc..db0b9f1 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -12,6 +12,10 @@
   addressEnabled: false
   # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
   captchaType: math
+  # 鍖垮悕璁块棶閰嶇疆
+  anonymous:
+    appId: appId1
+    securityKey: your_security_key
 
 # 寮�鍙戠幆澧冮厤缃�
 server:
diff --git a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
index ac47c03..04111e8 100644
--- a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
+++ b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
@@ -14,7 +14,14 @@
 		<!-- 鎸囧畾 MyBatis 鎵�鐢ㄦ棩蹇楃殑鍏蜂綋瀹炵幇 -->
         <setting name="logImpl"                  value="SLF4J"  />
         <!-- 浣跨敤椹煎嘲鍛藉悕娉曡浆鎹㈠瓧娈� -->
-		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
+		<setting name="mapUnderscoreToCamelCase" value="true"/>
+        <!-- 浣跨敤鍒楀埆鍚嶆浛鎹㈠垪鍚� 榛樿:true -->
+        <setting name="useColumnLabel" value="true" />
+        <!-- 閰嶇疆SQL Server鏂硅█ -->
+        <setting name="databaseId" value="sqlserver" />
+        <!-- SQL Server鐗瑰畾閰嶇疆 -->
+        <setting name="jdbcTypeForNull" value="NULL"/>
+        <setting name="defaultExecutorType" value="BATCH"/>
 	</settings>
 	
 </configuration>
diff --git a/ruoyi-admin/src/main/resources/sql/menu_client_app.sql b/ruoyi-admin/src/main/resources/sql/menu_client_app.sql
new file mode 100644
index 0000000..b9a1c92
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/sql/menu_client_app.sql
@@ -0,0 +1,22 @@
+-- 鑿滃崟 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('瀹㈡埛搴旂敤閰嶇疆', '1', '1', 'clientApp', 'system/clientApp/index', 1, 0, 'C', '0', '0', 'system:clientApp:list', 'app', 'admin', sysdate(), '', null, '瀹㈡埛搴旂敤閰嶇疆鑿滃崟');
+
+-- 鎸夐挳鐖惰彍鍗旾D
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 鎸夐挳 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('瀹㈡埛搴旂敤閰嶇疆鏌ヨ', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:clientApp:query',        '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('瀹㈡埛搴旂敤閰嶇疆鏂板', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:clientApp:add',          '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('瀹㈡埛搴旂敤閰嶇疆淇敼', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:clientApp:edit',         '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('瀹㈡埛搴旂敤閰嶇疆鍒犻櫎', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:clientApp:remove',       '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('瀹㈡埛搴旂敤閰嶇疆瀵煎嚭', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:clientApp:export',       '#', 'admin', sysdate(), '', null, ''); 
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
index 0d945be..bf9f4d9 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
@@ -15,5 +15,6 @@
     /**
      * 浠庡簱
      */
-    SLAVE
+    SLAVE,
+    SQLSERVER
 }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java
index f6abac1..c59f20a 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java
@@ -9,6 +9,8 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.sql.DataSource;
+
+import com.ruoyi.common.enums.DataSourceType;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
@@ -19,7 +21,6 @@
 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
 import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
 import com.alibaba.druid.util.Utils;
-import com.ruoyi.common.enums.DataSourceType;
 import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.framework.config.properties.DruidProperties;
 import com.ruoyi.framework.datasource.DynamicDataSource;
@@ -48,14 +49,22 @@
         DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
         return druidProperties.dataSource(dataSource);
     }
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.sqlserver")
+    @ConditionalOnProperty(prefix = "spring.datasource.druid.sqlserver", name = "enabled", havingValue = "true")
+    public DataSource sqlserverDataSource(DruidProperties druidProperties) {
+
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        return druidProperties.dataSource(dataSource);
+    }
 
     @Bean(name = "dynamicDataSource")
     @Primary
-    public DynamicDataSource dataSource(DataSource masterDataSource)
-    {
+    public DynamicDataSource dataSource(DataSource masterDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
         targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
         setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
+        setDataSource(targetDataSources, DataSourceType.SQLSERVER.name(), "sqlserverDataSource");
         return new DynamicDataSource(masterDataSource, targetDataSources);
     }
     
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceType.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceType.java
deleted file mode 100644
index eb06fc7..0000000
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceType.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.ruoyi.framework.datasource;
-
-/**
- * 鏁版嵁婧愮被鍨�
- * 
- * @author ruoyi
- */
-public enum DataSourceType {
-    /**
-     * 涓诲簱
-     */
-    MASTER,
-
-    /**
-     * 浠庡簱
-     */
-    SLAVE,
-
-    /**
-     * SQL Server
-     */
-    SQLSERVER
-} 
\ No newline at end of file
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/annotation/DataSource.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/annotation/DataSource.java
deleted file mode 100644
index 513274b..0000000
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/annotation/DataSource.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.ruoyi.framework.datasource.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import com.ruoyi.framework.datasource.DataSourceType;
-
-/**
- * 鑷畾涔夊鏁版嵁婧愬垏鎹㈡敞瑙�
- * 
- * @author ruoyi
- */
-@Target({ ElementType.METHOD, ElementType.TYPE })
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface DataSource {
-    /**
-     * 鍒囨崲鏁版嵁婧愬悕绉�
-     */
-    public DataSourceType value() default DataSourceType.MASTER;
-} 
\ No newline at end of file
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index ebb3991..b5db5b3 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -27,6 +27,7 @@
             <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
             <version>3.5.1</version>
         </dependency>
+
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/ServiceOrder.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/ServiceOrder.java
index 4cefa3f..1310953 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/ServiceOrder.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/ServiceOrder.java
@@ -10,16 +10,18 @@
 
 /**
  * 鏈嶅姟璁㈠崟瀵硅薄 service_order
+ * 
+ * @author ruoyi
  */
 public class ServiceOrder extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 璁㈠崟ID */
+    /** 鏈嶅姟璁㈠崟ID */
     private Long serviceOrdId;
 
     /** 鐢ㄦ埛ID */
     @Excel(name = "鐢ㄦ埛ID")
-    private Integer serviceOrdUserID;
+    private Long serviceOrdUserID;
 
     /** 璁㈠崟绫诲埆 */
     @Excel(name = "璁㈠崟绫诲埆")
@@ -43,36 +45,36 @@
     @Excel(name = "棰勭害鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date serviceOrdApptDate;
 
-    /** 鍏徃鍚嶇О */
-    @Excel(name = "鍏徃鍚嶇О")
+    /** 鑱旂郴浜哄鍚� */
+    @Excel(name = "鑱旂郴浜哄鍚�")
     private String serviceOrdCoName;
 
-    /** 鍏徃鐢佃瘽 */
-    @Excel(name = "鍏徃鐢佃瘽")
+    /** 鑱旂郴浜虹數璇� */
+    @Excel(name = "鑱旂郴浜虹數璇�")
     private String serviceOrdCoPhone;
 
-    /** 鐥呬汉濮撳悕 */
-    @Excel(name = "鐥呬汉濮撳悕")
+    /** 鎮h�呭鍚� */
+    @Excel(name = "鎮h�呭鍚�")
     private String serviceOrdPtName;
 
-    /** 鐥呬汉骞撮緞 */
-    @Excel(name = "鐥呬汉骞撮緞")
+    /** 鎮h�呭勾榫� */
+    @Excel(name = "鎮h�呭勾榫�")
     private String serviceOrdPtAge;
 
-    /** 鐥呬汉鎬у埆 */
-    @Excel(name = "鐥呬汉鎬у埆")
+    /** 鎮h�呮�у埆 */
+    @Excel(name = "鎮h�呮�у埆")
     private String serviceOrdPtSex;
 
-    /** 鐥呬汉浣撻噸 */
-    @Excel(name = "鐥呬汉浣撻噸")
+    /** 鎮h�呬綋閲� */
+    @Excel(name = "鎮h�呬綋閲�")
     private String serviceOrdPtKG;
 
-    /** 鐥呬汉鍥界睄 */
-    @Excel(name = "鐥呬汉鍥界睄")
+    /** 鎮h�呭浗绫� */
+    @Excel(name = "鎮h�呭浗绫�")
     private String serviceOrdPtNat;
 
-    /** 鐥呬汉韬唤璇佸彿 */
-    @Excel(name = "鐥呬汉韬唤璇佸彿")
+    /** 鎮h�呰韩浠借瘉鍙� */
+    @Excel(name = "鎮h�呰韩浠借瘉鍙�")
     private String serviceOrdPtIDCard;
 
     /** 鍑哄彂鐪佷唤 */
@@ -111,9 +113,13 @@
     @Excel(name = "鏀粯閲戦")
     private BigDecimal serviceOrdTraPaidPrice;
 
-    /** 璁㈠崟澶囨敞 */
-    @Excel(name = "璁㈠崟澶囨敞")
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
     private String serviceOrdUnitRemarks;
+
+    /** 鍒嗛〉鍙傛暟 */
+    private Integer pageNum;
+    private Integer pageSize;
 
     // Getters and Setters
     public Long getServiceOrdId() {
@@ -124,11 +130,11 @@
         this.serviceOrdId = serviceOrdId;
     }
 
-    public Integer getServiceOrdUserID() {
+    public Long getServiceOrdUserID() {
         return serviceOrdUserID;
     }
 
-    public void setServiceOrdUserID(Integer serviceOrdUserID) {
+    public void setServiceOrdUserID(Long serviceOrdUserID) {
         this.serviceOrdUserID = serviceOrdUserID;
     }
 
@@ -316,9 +322,25 @@
         this.serviceOrdUnitRemarks = serviceOrdUnitRemarks;
     }
 
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
     @Override
     public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
             .append("serviceOrdId", getServiceOrdId())
             .append("serviceOrdUserID", getServiceOrdUserID())
             .append("serviceOrdClass", getServiceOrdClass())
@@ -344,6 +366,8 @@
             .append("serviceOrdTraPaidType", getServiceOrdTraPaidType())
             .append("serviceOrdTraPaidPrice", getServiceOrdTraPaidPrice())
             .append("serviceOrdUnitRemarks", getServiceOrdUnitRemarks())
+            .append("pageNum", getPageNum())
+            .append("pageSize", getPageSize())
             .toString();
     }
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysClientApp.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysClientApp.java
new file mode 100644
index 0000000..6c1de16
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysClientApp.java
@@ -0,0 +1,128 @@
+package com.ruoyi.system.domain;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 瀹㈡埛搴旂敤閰嶇疆瀵硅薄 sys_client_app
+ */
+public class SysClientApp extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 搴旂敤ID */
+    private Long appId;
+
+    /** 瀹㈡埛鍚嶇О */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    private String clientName;
+
+    /** 搴旂敤鏍囪瘑 */
+    @Excel(name = "搴旂敤鏍囪瘑")
+    private String appKey;
+
+    /** 瀹夊叏瀵嗛挜 */
+    @Excel(name = "瀹夊叏瀵嗛挜")
+    private String securityKey;
+
+    /** 鏈夋晥鏈熷紑濮嬫椂闂� */
+    @Excel(name = "鏈夋晥鏈熷紑濮嬫椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date validStartTime;
+
+    /** 鏈夋晥鏈熺粨鏉熸椂闂� */
+    @Excel(name = "鏈夋晥鏈熺粨鏉熸椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date validEndTime;
+
+    /** 鐘舵�侊紙0姝e父 1鍋滅敤锛� */
+    @Excel(name = "鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
+    private String status;
+
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    private String delFlag;
+
+    public Long getAppId() {
+        return appId;
+    }
+
+    public void setAppId(Long appId) {
+        this.appId = appId;
+    }
+
+    public String getClientName() {
+        return clientName;
+    }
+
+    public void setClientName(String clientName) {
+        this.clientName = clientName;
+    }
+
+    public String getAppKey() {
+        return appKey;
+    }
+
+    public void setAppKey(String appKey) {
+        this.appKey = appKey;
+    }
+
+    public String getSecurityKey() {
+        return securityKey;
+    }
+
+    public void setSecurityKey(String securityKey) {
+        this.securityKey = securityKey;
+    }
+
+    public Date getValidStartTime() {
+        return validStartTime;
+    }
+
+    public void setValidStartTime(Date validStartTime) {
+        this.validStartTime = validStartTime;
+    }
+
+    public Date getValidEndTime() {
+        return validEndTime;
+    }
+
+    public void setValidEndTime(Date validEndTime) {
+        this.validEndTime = validEndTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("appId", getAppId())
+            .append("clientName", getClientName())
+            .append("appKey", getAppKey())
+            .append("securityKey", getSecurityKey())
+            .append("validStartTime", getValidStartTime())
+            .append("validEndTime", getValidEndTime())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ServiceOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ServiceOrderMapper.java
index 409f713..9e6e200 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ServiceOrderMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ServiceOrderMapper.java
@@ -2,10 +2,14 @@
 
 import java.util.List;
 import com.ruoyi.system.domain.ServiceOrder;
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 鏈嶅姟璁㈠崟Mapper鎺ュ彛
  */
+@DataSource(DataSourceType.SQLSERVER)
 public interface ServiceOrderMapper {
     /**
      * 鏌ヨ鏈嶅姟璁㈠崟
@@ -19,9 +23,21 @@
      * 鏌ヨ鏈嶅姟璁㈠崟鍒楄〃
      * 
      * @param serviceOrder 鏈嶅姟璁㈠崟
+     * @param offset 璧峰浣嶇疆
+     * @param pageSize 姣忛〉澶у皬
      * @return 鏈嶅姟璁㈠崟闆嗗悎
      */
-    public List<ServiceOrder> selectServiceOrderList(ServiceOrder serviceOrder);
+    public List<ServiceOrder> selectServiceOrderList(@Param("serviceOrder") ServiceOrder serviceOrder, 
+                                                    @Param("offset") int offset, 
+                                                    @Param("pageSize") int pageSize);
+
+    /**
+     * 鏌ヨ鏈嶅姟璁㈠崟鎬绘暟
+     * 
+     * @param serviceOrder 鏈嶅姟璁㈠崟淇℃伅
+     * @return 鏈嶅姟璁㈠崟鎬绘暟
+     */
+    public int selectServiceOrderCount(@Param("serviceOrder") ServiceOrder serviceOrder);
 
     /**
      * 鏂板鏈嶅姟璁㈠崟
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysClientAppMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysClientAppMapper.java
new file mode 100644
index 0000000..d9f364a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysClientAppMapper.java
@@ -0,0 +1,57 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysClientApp;
+
+/**
+ * 瀹㈡埛搴旂敤閰嶇疆Mapper鎺ュ彛
+ */
+public interface SysClientAppMapper {
+    /**
+     * 鏌ヨ瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param appId 瀹㈡埛搴旂敤閰嶇疆涓婚敭
+     * @return 瀹㈡埛搴旂敤閰嶇疆
+     */
+    public SysClientApp selectSysClientAppByAppId(Long appId);
+
+    /**
+     * 鏌ヨ瀹㈡埛搴旂敤閰嶇疆鍒楄〃
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆
+     * @return 瀹㈡埛搴旂敤閰嶇疆闆嗗悎
+     */
+    public List<SysClientApp> selectSysClientAppList(SysClientApp sysClientApp);
+
+    /**
+     * 鏂板瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆
+     * @return 缁撴灉
+     */
+    public int insertSysClientApp(SysClientApp sysClientApp);
+
+    /**
+     * 淇敼瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆
+     * @return 缁撴灉
+     */
+    public int updateSysClientApp(SysClientApp sysClientApp);
+
+    /**
+     * 鍒犻櫎瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param appId 瀹㈡埛搴旂敤閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteSysClientAppByAppId(Long appId);
+
+    /**
+     * 鎵归噺鍒犻櫎瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param appIds 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteSysClientAppByAppIds(Long[] appIds);
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IServiceOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IServiceOrderService.java
index 5c423bb..8f41b31 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IServiceOrderService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IServiceOrderService.java
@@ -24,6 +24,14 @@
     public List<ServiceOrder> selectServiceOrderList(ServiceOrder serviceOrder);
 
     /**
+     * 鏌ヨ鏈嶅姟璁㈠崟鎬绘暟
+     * 
+     * @param serviceOrder 鏈嶅姟璁㈠崟淇℃伅
+     * @return 鏈嶅姟璁㈠崟鎬绘暟
+     */
+    public int selectServiceOrderCount(ServiceOrder serviceOrder);
+
+    /**
      * 鏂板鏈嶅姟璁㈠崟
      * 
      * @param serviceOrder 鏈嶅姟璁㈠崟
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysClientAppService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysClientAppService.java
new file mode 100644
index 0000000..5d2b008
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysClientAppService.java
@@ -0,0 +1,57 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysClientApp;
+
+/**
+ * 瀹㈡埛搴旂敤閰嶇疆Service鎺ュ彛
+ */
+public interface ISysClientAppService {
+    /**
+     * 鏌ヨ瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param appId 瀹㈡埛搴旂敤閰嶇疆涓婚敭
+     * @return 瀹㈡埛搴旂敤閰嶇疆
+     */
+    public SysClientApp selectSysClientAppByAppId(Long appId);
+
+    /**
+     * 鏌ヨ瀹㈡埛搴旂敤閰嶇疆鍒楄〃
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆
+     * @return 瀹㈡埛搴旂敤閰嶇疆闆嗗悎
+     */
+    public List<SysClientApp> selectSysClientAppList(SysClientApp sysClientApp);
+
+    /**
+     * 鏂板瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆
+     * @return 缁撴灉
+     */
+    public int insertSysClientApp(SysClientApp sysClientApp);
+
+    /**
+     * 淇敼瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆
+     * @return 缁撴灉
+     */
+    public int updateSysClientApp(SysClientApp sysClientApp);
+
+    /**
+     * 鎵归噺鍒犻櫎瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param appIds 闇�瑕佸垹闄ょ殑瀹㈡埛搴旂敤閰嶇疆涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteSysClientAppByAppIds(Long[] appIds);
+
+    /**
+     * 鍒犻櫎瀹㈡埛搴旂敤閰嶇疆淇℃伅
+     * 
+     * @param appId 瀹㈡埛搴旂敤閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteSysClientAppByAppId(Long appId);
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ServiceOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ServiceOrderServiceImpl.java
index ddac2e4..5e8f22c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ServiceOrderServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ServiceOrderServiceImpl.java
@@ -6,9 +6,12 @@
 import com.ruoyi.system.mapper.ServiceOrderMapper;
 import com.ruoyi.system.domain.ServiceOrder;
 import com.ruoyi.system.service.IServiceOrderService;
+import com.ruoyi.common.utils.PageUtils;
 
 /**
- * 鏈嶅姟璁㈠崟Service涓氬姟灞傚鐞�
+ * 鏈嶅姟璁㈠崟 鏈嶅姟灞傚疄鐜�
+ * 
+ * @author ruoyi
  */
 @Service
 public class ServiceOrderServiceImpl implements IServiceOrderService {
@@ -16,10 +19,10 @@
     private ServiceOrderMapper serviceOrderMapper;
 
     /**
-     * 鏌ヨ鏈嶅姟璁㈠崟
+     * 鏌ヨ鏈嶅姟璁㈠崟淇℃伅
      * 
      * @param serviceOrdId 鏈嶅姟璁㈠崟涓婚敭
-     * @return 鏈嶅姟璁㈠崟
+     * @return 鏈嶅姟璁㈠崟淇℃伅
      */
     @Override
     public ServiceOrder selectServiceOrderById(Long serviceOrdId) {
@@ -29,18 +32,25 @@
     /**
      * 鏌ヨ鏈嶅姟璁㈠崟鍒楄〃
      * 
-     * @param serviceOrder 鏈嶅姟璁㈠崟
-     * @return 鏈嶅姟璁㈠崟
+     * @param serviceOrder 鏈嶅姟璁㈠崟淇℃伅
+     * @return 鏈嶅姟璁㈠崟闆嗗悎
      */
     @Override
     public List<ServiceOrder> selectServiceOrderList(ServiceOrder serviceOrder) {
-        return serviceOrderMapper.selectServiceOrderList(serviceOrder);
+        // 璁$畻鍋忕Щ閲�
+        int offset = (serviceOrder.getPageNum() - 1) * serviceOrder.getPageSize();
+        return serviceOrderMapper.selectServiceOrderList(serviceOrder, offset, serviceOrder.getPageSize());
+    }
+
+    @Override
+    public int selectServiceOrderCount(ServiceOrder serviceOrder) {
+        return serviceOrderMapper.selectServiceOrderCount(serviceOrder);
     }
 
     /**
      * 鏂板鏈嶅姟璁㈠崟
      * 
-     * @param serviceOrder 鏈嶅姟璁㈠崟
+     * @param serviceOrder 鏈嶅姟璁㈠崟淇℃伅
      * @return 缁撴灉
      */
     @Override
@@ -51,7 +61,7 @@
     /**
      * 淇敼鏈嶅姟璁㈠崟
      * 
-     * @param serviceOrder 鏈嶅姟璁㈠崟
+     * @param serviceOrder 鏈嶅姟璁㈠崟淇℃伅
      * @return 缁撴灉
      */
     @Override
@@ -60,9 +70,9 @@
     }
 
     /**
-     * 鎵归噺鍒犻櫎鏈嶅姟璁㈠崟
+     * 鍒犻櫎鏈嶅姟璁㈠崟瀵硅薄
      * 
-     * @param serviceOrdIds 闇�瑕佸垹闄ょ殑鏈嶅姟璁㈠崟涓婚敭
+     * @param serviceOrdIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
      * @return 缁撴灉
      */
     @Override
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysClientAppServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysClientAppServiceImpl.java
new file mode 100644
index 0000000..f7e1844
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysClientAppServiceImpl.java
@@ -0,0 +1,121 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.SysClientAppMapper;
+import com.ruoyi.system.domain.SysClientApp;
+import com.ruoyi.system.service.ISysClientAppService;
+import com.ruoyi.common.utils.SecurityUtils;
+
+/**
+ * 瀹㈡埛搴旂敤閰嶇疆 鏈嶅姟灞傚疄鐜�
+ */
+@Service
+public class SysClientAppServiceImpl implements ISysClientAppService {
+    @Autowired
+    private SysClientAppMapper sysClientAppMapper;
+
+    /**
+     * 鏌ヨ瀹㈡埛搴旂敤閰嶇疆淇℃伅
+     * 
+     * @param appId 瀹㈡埛搴旂敤閰嶇疆涓婚敭
+     * @return 瀹㈡埛搴旂敤閰嶇疆淇℃伅
+     */
+    @Override
+    public SysClientApp selectSysClientAppByAppId(Long appId) {
+        return sysClientAppMapper.selectSysClientAppByAppId(appId);
+    }
+
+    /**
+     * 鏌ヨ瀹㈡埛搴旂敤閰嶇疆鍒楄〃
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆淇℃伅
+     * @return 瀹㈡埛搴旂敤閰嶇疆闆嗗悎
+     */
+    @Override
+    public List<SysClientApp> selectSysClientAppList(SysClientApp sysClientApp) {
+        return sysClientAppMapper.selectSysClientAppList(sysClientApp);
+    }
+
+    /**
+     * 鏂板瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysClientApp(SysClientApp sysClientApp) {
+        return sysClientAppMapper.insertSysClientApp(sysClientApp);
+    }
+
+    /**
+     * 淇敼瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param sysClientApp 瀹㈡埛搴旂敤閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysClientApp(SysClientApp sysClientApp) {
+        if (sysClientApp == null || sysClientApp.getAppId() == null) {
+            throw new RuntimeException("搴旂敤ID涓嶈兘涓虹┖");
+        }
+        
+        try {
+            // 璁剧疆鏇存柊浜�
+            sysClientApp.setUpdateBy(SecurityUtils.getUsername());
+            
+            // 妫�鏌ヨ褰曟槸鍚﹀瓨鍦�
+            SysClientApp existApp = sysClientAppMapper.selectSysClientAppByAppId(sysClientApp.getAppId());
+            if (existApp == null) {
+                throw new RuntimeException("搴旂敤閰嶇疆涓嶅瓨鍦�");
+            }
+            
+            // 鎵撳嵃鏇存柊鍓嶇殑鏁版嵁
+            System.out.println("鏇存柊鍓嶇殑鏁版嵁: " + existApp);
+            System.out.println("瑕佹洿鏂扮殑鏁版嵁: " + sysClientApp);
+            
+            // 鎵ц鏇存柊
+            int row = sysClientAppMapper.updateSysClientApp(sysClientApp);
+            System.out.println("鏇存柊缁撴灉: " + row);
+            
+            // 楠岃瘉鏇存柊鏄惁鎴愬姛
+            SysClientApp updatedApp = sysClientAppMapper.selectSysClientAppByAppId(sysClientApp.getAppId());
+            System.out.println("鏇存柊鍚庣殑鏁版嵁: " + updatedApp);
+            
+            // 濡傛灉鏁版嵁搴撶‘瀹炴洿鏂颁簡锛屼絾杩斿洖鍊煎紓甯革紝鎴戜滑杩斿洖1琛ㄧず鎴愬姛
+            if (row < 0 && updatedApp != null) {
+                System.out.println("妫�娴嬪埌鏁版嵁搴撳凡鏇存柊锛屼絾杩斿洖鍊煎紓甯革紝杩斿洖1");
+                return 1;
+            }
+            
+            return row;
+        } catch (Exception e) {
+            System.err.println("鏇存柊寮傚父: " + e.getMessage());
+            e.printStackTrace();
+            throw e;
+        }
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀹㈡埛搴旂敤閰嶇疆
+     * 
+     * @param appIds 闇�瑕佸垹闄ょ殑瀹㈡埛搴旂敤閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysClientAppByAppIds(Long[] appIds) {
+        return sysClientAppMapper.deleteSysClientAppByAppIds(appIds);
+    }
+
+    /**
+     * 鍒犻櫎瀹㈡埛搴旂敤閰嶇疆淇℃伅
+     * 
+     * @param appId 瀹㈡埛搴旂敤閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysClientAppByAppId(Long appId) {
+        return sysClientAppMapper.deleteSysClientAppByAppId(appId);
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/ServiceOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ServiceOrderMapper.xml
index 861731f..3320df2 100644
--- a/ruoyi-system/src/main/resources/mapper/system/ServiceOrderMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/ServiceOrderMapper.xml
@@ -36,22 +36,37 @@
         select ServiceOrdID, ServiceOrdUserID, ServiceOrdClass, ServiceOrdType, ServiceOrdState, ServiceOrdStartDate, ServiceOrdApptDate, ServiceOrdCoName, ServiceOrdCoPhone, ServiceOrdPtName, ServiceOrdPtAge, ServiceOrdPtSex, ServiceOrdPtKG, ServiceOrdPtNat, ServiceOrdPtIDCard, ServiceOrdTraProvince, ServiceOrdTraCity, ServiceOrdTraStreet, ServiceOrdTraEnd, ServiceOrdTraDistance, ServiceOrdTraUnitPrice, ServiceOrdTraTxnPrice, ServiceOrdTraPaidType, ServiceOrdTraPaidPrice, ServiceOrdUnitRemarks from ServiceOrder
     </sql>
 
-    <select id="selectServiceOrderList" parameterType="ServiceOrder" resultMap="ServiceOrderResult">
-        <include refid="selectServiceOrderVo"/>
+    <sql id="selectServiceOrderWhere">
         <where>  
-            <if test="serviceOrdUserID != null "> and ServiceOrdUserID = #{serviceOrdUserID}</if>
-            <if test="serviceOrdClass != null  and serviceOrdClass != ''"> and ServiceOrdClass = #{serviceOrdClass}</if>
-            <if test="serviceOrdType != null "> and ServiceOrdType = #{serviceOrdType}</if>
-            <if test="serviceOrdState != null "> and ServiceOrdState = #{serviceOrdState}</if>
-            <if test="serviceOrdStartDate != null "> and ServiceOrdStartDate = #{serviceOrdStartDate}</if>
-            <if test="serviceOrdApptDate != null "> and ServiceOrdApptDate = #{serviceOrdApptDate}</if>
-            <if test="serviceOrdCoName != null  and serviceOrdCoName != ''"> and ServiceOrdCoName like concat('%', #{serviceOrdCoName}, '%')</if>
-            <if test="serviceOrdCoPhone != null  and serviceOrdCoPhone != ''"> and ServiceOrdCoPhone = #{serviceOrdCoPhone}</if>
-            <if test="serviceOrdPtName != null  and serviceOrdPtName != ''"> and ServiceOrdPtName like concat('%', #{serviceOrdPtName}, '%')</if>
-            <if test="serviceOrdPtAge != null  and serviceOrdPtAge != ''"> and ServiceOrdPtAge = #{serviceOrdPtAge}</if>
-            <if test="serviceOrdPtSex != null  and serviceOrdPtSex != ''"> and ServiceOrdPtSex = #{serviceOrdPtSex}</if>
-            <if test="serviceOrdPtIDCard != null  and serviceOrdPtIDCard != ''"> and ServiceOrdPtIDCard = #{serviceOrdPtIDCard}</if>
+            <if test="serviceOrder.serviceOrdUserID != null "> and ServiceOrdUserID = #{serviceOrder.serviceOrdUserID}</if>
+            <if test="serviceOrder.serviceOrdClass != null  and serviceOrder.serviceOrdClass != ''"> and ServiceOrdClass = #{serviceOrder.serviceOrdClass}</if>
+            <if test="serviceOrder.serviceOrdType != null "> and ServiceOrdType = #{serviceOrder.serviceOrdType}</if>
+            <if test="serviceOrder.serviceOrdState != null "> and ServiceOrdState = #{serviceOrder.serviceOrdState}</if>
+            <if test="serviceOrder.serviceOrdStartDate != null "> and ServiceOrdStartDate = #{serviceOrder.serviceOrdStartDate}</if>
+            <if test="serviceOrder.serviceOrdApptDate != null "> and ServiceOrdApptDate = #{serviceOrder.serviceOrdApptDate}</if>
+            <if test="serviceOrder.serviceOrdCoName != null  and serviceOrder.serviceOrdCoName != ''"> and ServiceOrdCoName like '%' + #{serviceOrder.serviceOrdCoName} + '%'</if>
+            <if test="serviceOrder.serviceOrdCoPhone != null  and serviceOrder.serviceOrdCoPhone != ''"> and ServiceOrdCoPhone = #{serviceOrder.serviceOrdCoPhone}</if>
+            <if test="serviceOrder.serviceOrdPtName != null  and serviceOrder.serviceOrdPtName != ''"> and ServiceOrdPtName like '%' + #{serviceOrder.serviceOrdPtName} + '%'</if>
+            <if test="serviceOrder.serviceOrdPtAge != null  and serviceOrder.serviceOrdPtAge != ''"> and ServiceOrdPtAge = #{serviceOrder.serviceOrdPtAge}</if>
+            <if test="serviceOrder.serviceOrdPtSex != null  and serviceOrder.serviceOrdPtSex != ''"> and ServiceOrdPtSex = #{serviceOrder.serviceOrdPtSex}</if>
+            <if test="serviceOrder.serviceOrdPtIDCard != null  and serviceOrder.serviceOrdPtIDCard != ''"> and ServiceOrdPtIDCard = #{serviceOrder.serviceOrdPtIDCard}</if>
         </where>
+    </sql>
+
+    <select id="selectServiceOrderList" resultMap="ServiceOrderResult">
+        SELECT *
+        FROM (
+            SELECT ROW_NUMBER() OVER (ORDER BY ServiceOrdID) AS RowNum, *
+            FROM ServiceOrder
+            <include refid="selectServiceOrderWhere"/>
+        ) AS TempTable
+        WHERE RowNum BETWEEN #{offset} + 1 AND #{offset} + #{pageSize}
+    </select>
+
+    <select id="selectServiceOrderCount" resultType="Integer">
+        SELECT COUNT(1)
+        FROM ServiceOrder
+        <include refid="selectServiceOrderWhere"/>
     </select>
     
     <select id="selectServiceOrderById" parameterType="Long" resultMap="ServiceOrderResult">
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysClientAppMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysClientAppMapper.xml
new file mode 100644
index 0000000..2e3eca6
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/SysClientAppMapper.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.SysClientAppMapper">
+    
+    <resultMap type="SysClientApp" id="SysClientAppResult">
+        <result property="appId"    column="app_id"    />
+        <result property="clientName"    column="client_name"    />
+        <result property="appKey"    column="app_key"    />
+        <result property="securityKey"    column="security_key"    />
+        <result property="validStartTime"    column="valid_start_time"    />
+        <result property="validEndTime"    column="valid_end_time"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectSysClientAppVo">
+        select app_id, client_name, app_key, security_key, valid_start_time, valid_end_time, status, del_flag, create_by, create_time, update_by, update_time, remark from sys_client_app
+    </sql>
+
+    <select id="selectSysClientAppList" parameterType="SysClientApp" resultMap="SysClientAppResult">
+        <include refid="selectSysClientAppVo"/>
+        <where>  
+            <if test="clientName != null  and clientName != ''"> and client_name like concat('%', #{clientName}, '%')</if>
+            <if test="appKey != null  and appKey != ''"> and app_key = #{appKey}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="validStartTime != null "> and valid_start_time &gt;= #{validStartTime}</if>
+            <if test="validEndTime != null "> and valid_end_time &lt;= #{validEndTime}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysClientAppByAppId" parameterType="Long" resultMap="SysClientAppResult">
+        <include refid="selectSysClientAppVo"/>
+        where app_id = #{appId}
+    </select>
+        
+    <insert id="insertSysClientApp" parameterType="SysClientApp" useGeneratedKeys="true" keyProperty="appId">
+        insert into sys_client_app
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="clientName != null">client_name,</if>
+            <if test="appKey != null">app_key,</if>
+            <if test="securityKey != null">security_key,</if>
+            <if test="validStartTime != null">valid_start_time,</if>
+            <if test="validEndTime != null">valid_end_time,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="clientName != null">#{clientName},</if>
+            <if test="appKey != null">#{appKey},</if>
+            <if test="securityKey != null">#{securityKey},</if>
+            <if test="validStartTime != null">#{validStartTime},</if>
+            <if test="validEndTime != null">#{validEndTime},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysClientApp" parameterType="SysClientApp">
+        update sys_client_app
+        <set>
+            <if test="clientName != null and clientName != ''">client_name = #{clientName},</if>
+            <if test="appKey != null and appKey != ''">app_key = #{appKey},</if>
+            <if test="securityKey != null and securityKey != ''">security_key = #{securityKey},</if>
+            <if test="validStartTime != null">valid_start_time = #{validStartTime},</if>
+            <if test="validEndTime != null">valid_end_time = #{validEndTime},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            update_time = sysdate()
+        </set>
+        where app_id = #{appId}
+    </update>
+
+    <delete id="deleteSysClientAppByAppId" parameterType="Long">
+        delete from sys_client_app where app_id = #{appId}
+    </delete>
+
+    <delete id="deleteSysClientAppByAppIds" parameterType="Long">
+        delete from sys_client_app where app_id in 
+        <foreach item="appId" collection="array" open="(" separator="," close=")">
+            #{appId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json
index 3893f08..e7b33f4 100644
--- a/ruoyi-ui/package.json
+++ b/ruoyi-ui/package.json
@@ -48,6 +48,7 @@
     "js-beautify": "1.13.0",
     "js-cookie": "3.0.1",
     "jsencrypt": "3.0.0-rc.1",
+    "md5": "^2.3.0",
     "nprogress": "0.2.0",
     "quill": "2.0.2",
     "screenfull": "5.0.2",
diff --git a/ruoyi-ui/src/api/system/clientApp.js b/ruoyi-ui/src/api/system/clientApp.js
new file mode 100644
index 0000000..a125b53
--- /dev/null
+++ b/ruoyi-ui/src/api/system/clientApp.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ瀹㈡埛搴旂敤閰嶇疆鍒楄〃
+export function listClientApp(query) {
+  return request({
+    url: '/system/clientApp/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ瀹㈡埛搴旂敤閰嶇疆璇︾粏
+export function getClientApp(appId) {
+  return request({
+    url: '/system/clientApp/' + appId,
+    method: 'get'
+  })
+}
+
+// 鏂板瀹㈡埛搴旂敤閰嶇疆
+export function addClientApp(data) {
+  return request({
+    url: '/system/clientApp',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼瀹㈡埛搴旂敤閰嶇疆
+export function updateClientApp(data) {
+  return request({
+    url: '/system/clientApp',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎瀹㈡埛搴旂敤閰嶇疆
+export function delClientApp(appId) {
+  return request({
+    url: '/system/clientApp/' + appId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭瀹㈡埛搴旂敤閰嶇疆
+export function exportClientApp(query) {
+  return request({
+    url: '/system/clientApp/export',
+    method: 'post',
+    params: query
+  })
+} 
\ No newline at end of file
diff --git a/ruoyi-ui/src/api/system/order.js b/ruoyi-ui/src/api/system/order.js
index 98b4bd4..ccb017e 100644
--- a/ruoyi-ui/src/api/system/order.js
+++ b/ruoyi-ui/src/api/system/order.js
@@ -9,6 +9,15 @@
   })
 }
 
+// 楠岃瘉璁㈠崟璁块棶鍙傛暟
+export function validateOrderAccess(params) {
+  return request({
+    url: '/system/order/validate/check',
+    method: 'get',
+    params: params
+  })
+}
+
 // 鏌ヨ鏈嶅姟璁㈠崟璇︾粏
 export function getOrder(serviceOrdId) {
   return request({
diff --git a/ruoyi-ui/src/router/index.js b/ruoyi-ui/src/router/index.js
index 71907b6..4550b66 100644
--- a/ruoyi-ui/src/router/index.js
+++ b/ruoyi-ui/src/router/index.js
@@ -52,6 +52,12 @@
     hidden: true
   },
   {
+    path: '/system/order/anonymous',
+    component: () => import('@/views/system/serviceOrder/anonymous'),
+    hidden: true,
+    meta: { title: '鍖垮悕璁㈠崟鏌ョ湅', icon: 'eye',anonymous: true }
+  },
+  {
     path: '/404',
     component: () => import('@/views/error/404'),
     hidden: true
diff --git a/ruoyi-ui/src/views/system/clientApp/index.vue b/ruoyi-ui/src/views/system/clientApp/index.vue
new file mode 100644
index 0000000..31ef400
--- /dev/null
+++ b/ruoyi-ui/src/views/system/clientApp/index.vue
@@ -0,0 +1,356 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="瀹㈡埛鍚嶇О" prop="clientName">
+        <el-input
+          v-model="queryParams.clientName"
+          placeholder="璇疯緭鍏ュ鎴峰悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="搴旂敤鏍囪瘑" prop="appKey">
+        <el-input
+          v-model="queryParams.appKey"
+          placeholder="璇疯緭鍏ュ簲鐢ㄦ爣璇�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="status">
+        <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.sys_normal_disable"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:clientApp:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:clientApp:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:clientApp:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:clientApp:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="clientAppList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="搴旂敤ID" align="center" prop="appId" />
+      <el-table-column label="瀹㈡埛鍚嶇О" align="center" prop="clientName" />
+      <el-table-column label="搴旂敤鏍囪瘑" align="center" prop="appKey" />
+      <el-table-column label="瀹夊叏瀵嗛挜" align="center" prop="securityKey" />
+      <el-table-column label="鏈夋晥鏈熷紑濮�" align="center" prop="validStartTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.validStartTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鏈夋晥鏈熺粨鏉�" align="center" prop="validEndTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.validEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鐘舵��" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:clientApp:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:clientApp:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀瑰鎴峰簲鐢ㄩ厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="瀹㈡埛鍚嶇О" prop="clientName">
+          <el-input v-model="form.clientName" placeholder="璇疯緭鍏ュ鎴峰悕绉�" />
+        </el-form-item>
+        <el-form-item label="搴旂敤鏍囪瘑" prop="appKey">
+          <el-input v-model="form.appKey" placeholder="璇疯緭鍏ュ簲鐢ㄦ爣璇�" />
+        </el-form-item>
+        <el-form-item label="瀹夊叏瀵嗛挜" prop="securityKey">
+          <el-input v-model="form.securityKey" placeholder="璇疯緭鍏ュ畨鍏ㄥ瘑閽�" />
+        </el-form-item>
+        <el-form-item label="鏈夋晥鏈�" prop="validTime">
+          <el-date-picker
+            v-model="validTime"
+            type="datetimerange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            @change="handleValidTimeChange"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.sys_normal_disable"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listClientApp, getClientApp, delClientApp, addClientApp, updateClientApp, exportClientApp } from "@/api/system/clientApp";
+
+export default {
+  name: "ClientApp",
+  dicts: ['sys_normal_disable'],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 瀹㈡埛搴旂敤閰嶇疆琛ㄦ牸鏁版嵁
+      clientAppList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏈夋晥鏈熸椂闂磋寖鍥�
+      validTime: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        clientName: null,
+        appKey: null,
+        status: null
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        clientName: [
+          { required: true, message: "瀹㈡埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        appKey: [
+          { required: true, message: "搴旂敤鏍囪瘑涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        securityKey: [
+          { required: true, message: "瀹夊叏瀵嗛挜涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ瀹㈡埛搴旂敤閰嶇疆鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listClientApp(this.queryParams).then(response => {
+        this.clientAppList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        appId: null,
+        clientName: null,
+        appKey: null,
+        securityKey: null,
+        validStartTime: null,
+        validEndTime: null,
+        status: "0",
+        remark: null
+      };
+      this.validTime = [];
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.appId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞瀹㈡埛搴旂敤閰嶇疆";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const appId = row.appId || this.ids[0];
+      if (!appId) {
+        this.$modal.msgError("璇烽�夋嫨瑕佷慨鏀圭殑鏁版嵁");
+        return;
+      }
+      getClientApp(appId).then(response => {
+        this.form = response.data;
+        // 纭繚鏃堕棿鏍煎紡姝g‘
+        if (this.form.validStartTime && this.form.validEndTime) {
+          this.validTime = [
+            this.parseTime(this.form.validStartTime, '{y}-{m}-{d} {h}:{i}:{s}'),
+            this.parseTime(this.form.validEndTime, '{y}-{m}-{d} {h}:{i}:{s}')
+          ];
+        }
+        this.open = true;
+        this.title = "淇敼瀹㈡埛搴旂敤閰嶇疆";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.appId != null) {
+            updateClientApp(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addClientApp(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const appIds = row.appId || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎瀹㈡埛搴旂敤閰嶇疆缂栧彿涓�"' + appIds + '"鐨勬暟鎹」锛�').then(function() {
+        return delClientApp(appIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('system/clientApp/export', {
+        ...this.queryParams
+      }, `clientApp_${new Date().getTime()}.xlsx`)
+    },
+    // 澶勭悊鏈夋晥鏈熸椂闂村彉鍖�
+    handleValidTimeChange(val) {
+      if (val) {
+        this.form.validStartTime = val[0];
+        this.form.validEndTime = val[1];
+      } else {
+        this.form.validStartTime = null;
+        this.form.validEndTime = null;
+      }
+    }
+  }
+};
+</script> 
\ No newline at end of file
diff --git a/ruoyi-ui/src/views/system/serviceOrder/anonymous.vue b/ruoyi-ui/src/views/system/serviceOrder/anonymous.vue
new file mode 100644
index 0000000..ed3246e
--- /dev/null
+++ b/ruoyi-ui/src/views/system/serviceOrder/anonymous.vue
@@ -0,0 +1,82 @@
+<template>
+  <div class="app-container">
+    <div v-if="!validated" class="loading-container">
+      <el-alert
+        :title="errorMessage || '姝e湪鍔犺浇璁㈠崟鏁版嵁...'"
+        :type="errorMessage ? 'error' : 'info'"
+        :closable="false"
+        show-icon>
+      </el-alert>
+    </div>
+    <div v-else>
+      <!-- 澶嶇敤璁㈠崟璇︽儏灞曠ず閫昏緫 -->
+      <el-descriptions title="鏈嶅姟璁㈠崟璇︽儏" :column="2" border>
+        <el-descriptions-item label="璁㈠崟缂栧彿">{{ orderInfo.serviceOrdId }}</el-descriptions-item>
+        <el-descriptions-item label="鑱旂郴浜�">{{ orderInfo.serviceOrdCoName }}</el-descriptions-item>
+        <el-descriptions-item label="鎮h�呭鍚�">{{ orderInfo.serviceOrdPtName }}</el-descriptions-item>
+        <el-descriptions-item label="鑱旂郴鐢佃瘽">{{ orderInfo.serviceOrdCoPhone }}</el-descriptions-item>
+        <el-descriptions-item label="鎮h�呮�у埆">{{ orderInfo.serviceOrdPtSex }}</el-descriptions-item>
+        <el-descriptions-item label="鍑哄彂鏃堕棿">{{ orderInfo.serviceOrdStartDate }}</el-descriptions-item>
+        <el-descriptions-item label="鐩殑鍦板潃">{{ orderInfo.serviceOrdTraEnd }}</el-descriptions-item>
+        <el-descriptions-item label="璁㈠崟鐘舵��">
+          <dict-tag :options="dict.type.sys_order_status" :value="orderInfo.serviceOrdState"/>
+        </el-descriptions-item>
+      </el-descriptions>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getOrder } from "@/api/system/order";
+import { validateOrderAccess } from "@/api/system/order";
+
+export default {
+  name: "AnonymousOrder",
+  dicts: ['sys_order_status'],
+  data() {
+    return {
+      validated: false,
+      orderInfo: {},
+      errorMessage: ''
+    };
+  },
+  created() {
+    this.validateAndLoad();
+  },
+  methods: {
+    async validateAndLoad() {
+      try {
+        // 璋冪敤鍚庣楠岃瘉鎺ュ彛
+        const validateResult = await validateOrderAccess(this.$route.query);
+        if (validateResult.code !== 200) {
+          this.errorMessage = validateResult.msg;
+          this.validated = true;
+          setTimeout(() => {
+            this.$router.push('/401');
+          }, 2000);
+          return;
+        }
+
+        // 楠岃瘉閫氳繃鍚庡姞杞借鍗曟暟鎹�
+        const response = await getOrder(this.$route.query.serviceOrderId);
+        this.orderInfo = response.data;
+        this.validated = true;
+      } catch (error) {
+        console.error('楠岃瘉鎴栧姞杞借鍗曟暟鎹け璐�:', error);
+        this.errorMessage = '楠岃瘉鎴栧姞杞借鍗曟暟鎹け璐ワ紝璇风◢鍚庨噸璇�';
+        this.validated = true;
+        setTimeout(() => {
+          this.$router.push('/401');
+        }, 2000);
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.loading-container {
+  margin: 20px;
+  text-align: center;
+}
+</style> 
\ No newline at end of file
diff --git a/ruoyi-ui/src/views/system/order/order.vue b/ruoyi-ui/src/views/system/serviceOrder/index.vue
similarity index 67%
rename from ruoyi-ui/src/views/system/order/order.vue
rename to ruoyi-ui/src/views/system/serviceOrder/index.vue
index 4d530eb..c1f36e4 100644
--- a/ruoyi-ui/src/views/system/order/order.vue
+++ b/ruoyi-ui/src/views/system/serviceOrder/index.vue
@@ -1,19 +1,28 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="璁㈠崟ID" prop="serviceOrdId">
+      <el-form-item label="璁㈠崟缂栧彿" prop="serviceOrdId">
         <el-input
           v-model="queryParams.serviceOrdId"
-          placeholder="璇疯緭鍏ヨ鍗旾D"
+          placeholder="璇疯緭鍏ヨ鍗曠紪鍙�"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="鐥呬汉濮撳悕" prop="serviceOrdPtName">
+      <el-form-item label="鎮h�呭鍚�" prop="serviceOrdPtName">
         <el-input
           v-model="queryParams.serviceOrdPtName"
-          placeholder="璇疯緭鍏ョ梾浜哄鍚�"
+          placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鑱旂郴鐢佃瘽" prop="serviceOrdCoPhone">
+        <el-input
+          v-model="queryParams.serviceOrdCoPhone"
+          placeholder="璇疯緭鍏ヨ仈绯荤數璇�"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -22,24 +31,12 @@
       <el-form-item label="璁㈠崟鐘舵��" prop="serviceOrdState">
         <el-select v-model="queryParams.serviceOrdState" placeholder="璇烽�夋嫨璁㈠崟鐘舵��" clearable size="small">
           <el-option
-            v-for="dict in dict.type.sys_order_state"
+            v-for="dict in dict.type.sys_order_status"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
           />
         </el-select>
-      </el-form-item>
-      <el-form-item label="寮�濮嬫棩鏈�">
-        <el-date-picker
-          v-model="dateRange"
-          size="small"
-          style="width: 240px"
-          value-format="yyyy-MM-dd"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-        ></el-date-picker>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
@@ -95,23 +92,21 @@
 
     <el-table v-loading="loading" :data="orderList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="璁㈠崟ID" align="center" prop="serviceOrdId" />
-      <el-table-column label="鐥呬汉濮撳悕" align="center" prop="serviceOrdPtName" />
-      <el-table-column label="鐥呬汉骞撮緞" align="center" prop="serviceOrdPtAge" />
-      <el-table-column label="鐥呬汉鎬у埆" align="center" prop="serviceOrdPtSex" />
+      <el-table-column label="璁㈠崟缂栧彿" align="center" prop="serviceOrdId" />
+      <el-table-column label="鑱旂郴浜�" align="center" prop="serviceOrdCoName"/>
+      <el-table-column label="鎮h�呭鍚�" align="center" prop="serviceOrdPtName"/>
+      <el-table-column label="鑱旂郴鐢佃瘽" align="center" prop="serviceOrdCoPhone"/>
+      <el-table-column label="鎮h�呮�у埆" align="center" prop="serviceOrdPtSex"/>
+      <el-table-column label="鍑哄彂鏃堕棿" align="center" prop="serviceOrdStartDate" />
+      <el-table-column label="鐩殑鍦板潃" align="center" prop="serviceOrdTraEnd" />
       <el-table-column label="璁㈠崟鐘舵��" align="center" prop="serviceOrdState">
         <template slot-scope="scope">
-          <dict-tag :options="dict.type.sys_order_state" :value="scope.row.serviceOrdState"/>
+          <dict-tag :options="dict.type.sys_order_status" :value="scope.row.serviceOrdState"/>
         </template>
       </el-table-column>
-      <el-table-column label="寮�濮嬫棩鏈�" align="center" prop="serviceOrdStartDate" width="180">
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.serviceOrdStartDate, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="棰勭害鏃ユ湡" align="center" prop="serviceOrdApptDate" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.serviceOrdApptDate, '{y}-{m}-{d}') }}</span>
+          <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
       <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
@@ -145,50 +140,30 @@
     <!-- 娣诲姞鎴栦慨鏀规湇鍔¤鍗曞璇濇 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="鐥呬汉濮撳悕" prop="serviceOrdPtName">
-          <el-input v-model="form.serviceOrdPtName" placeholder="璇疯緭鍏ョ梾浜哄鍚�" />
+        <el-form-item label="鎮h�呭鍚�" prop="serviceOrdPtName">
+          <el-input v-model="form.serviceOrdPtName" placeholder="璇疯緭鍏ユ偅鑰呭鍚�" />
         </el-form-item>
-        <el-form-item label="鐥呬汉骞撮緞" prop="serviceOrdPtAge">
-          <el-input v-model="form.serviceOrdPtAge" placeholder="璇疯緭鍏ョ梾浜哄勾榫�" />
+        <el-form-item label="鑱旂郴鐢佃瘽" prop="serviceOrdCoPhone">
+          <el-input v-model="form.serviceOrdCoPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
         </el-form-item>
-        <el-form-item label="鐥呬汉鎬у埆" prop="serviceOrdPtSex">
-          <el-select v-model="form.serviceOrdPtSex" placeholder="璇烽�夋嫨鐥呬汉鎬у埆">
-            <el-option
-              v-for="dict in dict.type.sys_user_sex"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
-          </el-select>
+        <el-form-item label="鍑哄彂鍦板潃" prop="serviceOrdTraStreet">
+          <el-input v-model="form.serviceOrdTraStreet" placeholder="璇疯緭鍏ュ嚭鍙戝湴鍧�" />
+        </el-form-item>
+        <el-form-item label="鐩殑鍦板潃" prop="serviceOrdTraEnd">
+          <el-input v-model="form.serviceOrdTraEnd" placeholder="璇疯緭鍏ョ洰鐨勫湴鍧�" />
         </el-form-item>
         <el-form-item label="璁㈠崟鐘舵��" prop="serviceOrdState">
           <el-select v-model="form.serviceOrdState" placeholder="璇烽�夋嫨璁㈠崟鐘舵��">
             <el-option
-              v-for="dict in dict.type.sys_order_state"
+              v-for="dict in dict.type.sys_order_status"
               :key="dict.value"
               :label="dict.label"
               :value="dict.value"
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="寮�濮嬫棩鏈�" prop="serviceOrdStartDate">
-          <el-date-picker
-            v-model="form.serviceOrdStartDate"
-            type="datetime"
-            placeholder="閫夋嫨寮�濮嬫棩鏈�"
-            value-format="yyyy-MM-dd HH:mm:ss"
-          />
-        </el-form-item>
-        <el-form-item label="棰勭害鏃ユ湡" prop="serviceOrdApptDate">
-          <el-date-picker
-            v-model="form.serviceOrdApptDate"
-            type="datetime"
-            placeholder="閫夋嫨棰勭害鏃ユ湡"
-            value-format="yyyy-MM-dd HH:mm:ss"
-          />
-        </el-form-item>
-        <el-form-item label="璁㈠崟澶囨敞" prop="serviceOrdUnitRemarks">
-          <el-input v-model="form.serviceOrdUnitRemarks" type="textarea" placeholder="璇疯緭鍏ヨ鍗曞娉�" />
+        <el-form-item label="澶囨敞" prop="serviceOrdUnitRemarks">
+          <el-input v-model="form.serviceOrdUnitRemarks" type="textarea" placeholder="璇疯緭鍏ュ娉�" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -204,7 +179,7 @@
 
 export default {
   name: "Order",
-  dicts: ['sys_order_state', 'sys_user_sex'],
+  dicts: ['sys_order_status'],
   data() {
     return {
       // 閬僵灞�
@@ -225,14 +200,13 @@
       title: "",
       // 鏄惁鏄剧ず寮瑰嚭灞�
       open: false,
-      // 鏃ユ湡鑼冨洿
-      dateRange: [],
       // 鏌ヨ鍙傛暟
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         serviceOrdId: null,
         serviceOrdPtName: null,
+        serviceOrdCoPhone: null,
         serviceOrdState: null
       },
       // 琛ㄥ崟鍙傛暟
@@ -240,22 +214,19 @@
       // 琛ㄥ崟鏍¢獙
       rules: {
         serviceOrdPtName: [
-          { required: true, message: "鐥呬汉濮撳悕涓嶈兘涓虹┖", trigger: "blur" }
+          { required: true, message: "鎮h�呭鍚嶄笉鑳戒负绌�", trigger: "blur" }
         ],
-        serviceOrdPtAge: [
-          { required: true, message: "鐥呬汉骞撮緞涓嶈兘涓虹┖", trigger: "blur" }
+        serviceOrdCoPhone: [
+          { required: true, message: "鑱旂郴鐢佃瘽涓嶈兘涓虹┖", trigger: "blur" }
         ],
-        serviceOrdPtSex: [
-          { required: true, message: "鐥呬汉鎬у埆涓嶈兘涓虹┖", trigger: "change" }
+        serviceOrdTraStreet: [
+          { required: true, message: "鍑哄彂鍦板潃涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        serviceOrdTraEnd: [
+          { required: true, message: "鐩殑鍦板潃涓嶈兘涓虹┖", trigger: "blur" }
         ],
         serviceOrdState: [
           { required: true, message: "璁㈠崟鐘舵�佷笉鑳戒负绌�", trigger: "change" }
-        ],
-        serviceOrdStartDate: [
-          { required: true, message: "寮�濮嬫棩鏈熶笉鑳戒负绌�", trigger: "blur" }
-        ],
-        serviceOrdApptDate: [
-          { required: true, message: "棰勭害鏃ユ湡涓嶈兘涓虹┖", trigger: "blur" }
         ]
       }
     };
@@ -267,7 +238,7 @@
     /** 鏌ヨ鏈嶅姟璁㈠崟鍒楄〃 */
     getList() {
       this.loading = true;
-      listOrder(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+      listOrder(this.queryParams).then(response => {
         this.orderList = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -282,29 +253,11 @@
     reset() {
       this.form = {
         serviceOrdId: null,
-        serviceOrdUserID: null,
-        serviceOrdClass: null,
-        serviceOrdType: null,
-        serviceOrdState: null,
-        serviceOrdStartDate: null,
-        serviceOrdApptDate: null,
-        serviceOrdCoName: null,
-        serviceOrdCoPhone: null,
         serviceOrdPtName: null,
-        serviceOrdPtAge: null,
-        serviceOrdPtSex: null,
-        serviceOrdPtKG: null,
-        serviceOrdPtNat: null,
-        serviceOrdPtIDCard: null,
-        serviceOrdTraProvince: null,
-        serviceOrdTraCity: null,
+        serviceOrdCoPhone: null,
         serviceOrdTraStreet: null,
         serviceOrdTraEnd: null,
-        serviceOrdTraDistance: null,
-        serviceOrdTraUnitPrice: null,
-        serviceOrdTraTxnPrice: null,
-        serviceOrdTraPaidType: null,
-        serviceOrdTraPaidPrice: null,
+        serviceOrdState: null,
         serviceOrdUnitRemarks: null
       };
       this.resetForm("form");
@@ -316,7 +269,6 @@
     },
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
     resetQuery() {
-      this.dateRange = [];
       this.resetForm("queryForm");
       this.handleQuery();
     },
diff --git a/sql/ry_20250417.sql b/sql/ry_20250417.sql
index d6ee79f..37e9a96 100644
--- a/sql/ry_20250417.sql
+++ b/sql/ry_20250417.sql
@@ -701,4 +701,31 @@
   update_by         varchar(64)     default ''                 comment '鏇存柊鑰�',
   update_time       datetime                                   comment '鏇存柊鏃堕棿',
   primary key (column_id)
-) engine=innodb auto_increment=1 comment = '浠g爜鐢熸垚涓氬姟琛ㄥ瓧娈�';
\ No newline at end of file
+) engine=innodb auto_increment=1 comment = '浠g爜鐢熸垚涓氬姟琛ㄥ瓧娈�';
+
+
+-- ----------------------------
+-- 20銆佸鎴峰簲鐢ㄩ厤缃〃
+-- ----------------------------
+drop table if exists sys_client_app;
+create table sys_client_app (
+  app_id            bigint(20)      not null auto_increment    comment '搴旂敤ID',
+  client_name       varchar(50)     not null                   comment '瀹㈡埛鍚嶇О',
+  app_key           varchar(64)     not null                   comment '搴旂敤鏍囪瘑',
+  security_key      varchar(64)     not null                   comment '瀹夊叏瀵嗛挜',
+  valid_start_time  datetime                                   comment '鏈夋晥鏈熷紑濮嬫椂闂�',
+  valid_end_time    datetime                                   comment '鏈夋晥鏈熺粨鏉熸椂闂�',
+  status            char(1)         default '0'                comment '鐘舵�侊紙0姝e父 1鍋滅敤锛�',
+  del_flag          char(1)         default '0'                comment '鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛�',
+  create_by         varchar(64)     default ''                 comment '鍒涘缓鑰�',
+  create_time       datetime                                   comment '鍒涘缓鏃堕棿',
+  update_by         varchar(64)     default ''                 comment '鏇存柊鑰�',
+  update_time       datetime                                   comment '鏇存柊鏃堕棿',
+  remark            varchar(500)    default null               comment '澶囨敞',
+  primary key (app_id),
+  unique (app_key)
+) engine=innodb auto_increment=100 comment = '瀹㈡埛搴旂敤閰嶇疆琛�';
+
+-- ----------------------------
+-- 鍒濆鍖�-瀹㈡埛搴旂敤閰嶇疆琛ㄦ暟鎹�
+-- ----------------------------
\ No newline at end of file
diff --git a/sql/sys_client_app.sql b/sql/sys_client_app.sql
new file mode 100644
index 0000000..79293aa
--- /dev/null
+++ b/sql/sys_client_app.sql
@@ -0,0 +1,26 @@
+-- ----------------------------
+-- 瀹㈡埛搴旂敤閰嶇疆琛�
+-- ----------------------------
+drop table if exists sys_client_app;
+create table sys_client_app (
+  app_id            bigint(20)      not null auto_increment    comment '搴旂敤ID',
+  client_name       varchar(50)     not null                   comment '瀹㈡埛鍚嶇О',
+  app_key           varchar(64)     not null                   comment '搴旂敤鏍囪瘑',
+  security_key      varchar(64)     not null                   comment '瀹夊叏瀵嗛挜',
+  valid_start_time  datetime                                   comment '鏈夋晥鏈熷紑濮嬫椂闂�',
+  valid_end_time    datetime                                   comment '鏈夋晥鏈熺粨鏉熸椂闂�',
+  status            char(1)         default '0'                comment '鐘舵�侊紙0姝e父 1鍋滅敤锛�',
+  del_flag          char(1)         default '0'                comment '鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛�',
+  create_by         varchar(64)     default ''                 comment '鍒涘缓鑰�',
+  create_time       datetime                                   comment '鍒涘缓鏃堕棿',
+  update_by         varchar(64)     default ''                 comment '鏇存柊鑰�',
+  update_time       datetime                                   comment '鏇存柊鏃堕棿',
+  remark            varchar(500)    default null               comment '澶囨敞',
+  primary key (app_id),
+  unique (app_key)
+) engine=innodb auto_increment=100 comment = '瀹㈡埛搴旂敤閰嶇疆琛�';
+
+-- ----------------------------
+-- 鍒濆鍖�-瀹㈡埛搴旂敤閰嶇疆琛ㄦ暟鎹�
+-- ----------------------------
+insert into sys_client_app values(1, '娴嬭瘯瀹㈡埛', 'appId1', 'your_security_key', sysdate(), date_add(sysdate(), interval 1 year), '0', '0', 'admin', sysdate(), '', null, '娴嬭瘯瀹㈡埛搴旂敤'); 
\ No newline at end of file

--
Gitblit v1.9.1