From db9f34881bfb372892823fcd403f3d833a4ecdfe Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 14 七月 2025 14:18:13 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.11.205:9000/r/se-cloud

---
 se-ui/src/views/system/token/index.vue                                                    |  308 +++++++++++++++++++
 se-modules/se-system/src/main/resources/mapper/system/SysAppTokenMapper.xml               |   96 ++++++
 se-modules/se-system/src/main/java/com/se/system/domain/SysAppToken.java                  |  116 +++++++
 se-modules/se-system/src/main/java/com/se/system/service/inte/ISysAppTokenService.java    |   61 +++
 se-modules/se-system/src/main/java/com/se/system/controller/SysAppTokenController.java    |  105 ++++++
 se-modules/se-system/src/main/java/com/se/system/service/impl/SysAppTokenServiceImpl.java |   97 ++++++
 se-modules/se-system/src/main/java/com/se/system/mapper/SysAppTokenMapper.java            |   61 +++
 se-ui/src/api/system/token.js                                                             |   44 ++
 docker-compose/mysql/initdb/se_cloud_20240629.sql                                         |   20 
 docker-compose/mysql/initdb/se_cloud_20241204.sql                                         |   46 ++
 10 files changed, 943 insertions(+), 11 deletions(-)

diff --git a/docker-compose/mysql/initdb/se_cloud_20240629.sql b/docker-compose/mysql/initdb/se_cloud_20240629.sql
index a2ecb8c..5c56dad 100644
--- a/docker-compose/mysql/initdb/se_cloud_20240629.sql
+++ b/docker-compose/mysql/initdb/se_cloud_20240629.sql
@@ -176,7 +176,7 @@
 -- 涓�绾ц彍鍗�
 insert into sys_menu values('1', '绯荤粺绠$悊', '0', '1', 'system',           null, '', '', 1, 0, 'M', '0', '0', '', 'system',   'admin', sysdate(), '', null, '绯荤粺绠$悊鐩綍');
 -- insert into sys_menu values('2', '绯荤粺鐩戞帶', '0', '2', 'monitor',          null, '', '', 1, 0, 'M', '0', '0', '', 'monitor',  'admin', sysdate(), '', null, '绯荤粺鐩戞帶鐩綍');
--- insert into sys_menu values('3', '绯荤粺宸ュ叿', '0', '3', 'tool',             null, '', '', 1, 0, 'M', '0', '0', '', 'tool',     'admin', sysdate(), '', null, '绯荤粺宸ュ叿鐩綍');
+insert into sys_menu values('3', '绯荤粺宸ュ叿', '0', '3', 'tool',             null, '', '', 1, 0, 'M', '0', '0', '', 'tool',     'admin', sysdate(), '', null, '绯荤粺宸ュ叿鐩綍', '');
 -- insert into sys_menu values('4', '瀹樼綉', '0', '4', 'http://se.vip', null, '', '', 0, 0, 'M', '0', '0', '', 'guide',    'admin', sysdate(), '', null, '瀹樼綉鍦板潃');
 -- 浜岀骇鑿滃崟
 insert into sys_menu values('100',  '鐢ㄦ埛绠$悊',       '1',   '1', 'user',       'system/user/index',                 '', '', 1, 0, 'C', '0', '0', 'system:user:list',        'user',          'admin', sysdate(), '', null, '鐢ㄦ埛绠$悊鑿滃崟');
@@ -193,9 +193,9 @@
 -- insert into sys_menu values('111',  'Sentinel鎺у埗鍙�', '2',   '3', 'http://localhost:8718',        '',                '', '', 0, 0, 'C', '0', '0', 'monitor:sentinel:list',   'sentinel',      'admin', sysdate(), '', null, '娴侀噺鎺у埗鑿滃崟');
 -- insert into sys_menu values('112',  'Nacos鎺у埗鍙�',    '2',   '4', 'http://localhost:8848/nacos',  '',                '', '', 0, 0, 'C', '0', '0', 'monitor:nacos:list',      'nacos',         'admin', sysdate(), '', null, '鏈嶅姟娌荤悊鑿滃崟');
 -- insert into sys_menu values('113',  'Admin鎺у埗鍙�',    '2',   '5', 'http://localhost:9100/login',  '',                '', '', 0, 0, 'C', '0', '0', 'monitor:server:list',     'server',        'admin', sysdate(), '', null, '鏈嶅姟鐩戞帶鑿滃崟');
--- insert into sys_menu values('114',  '琛ㄥ崟鏋勫缓',       '3',   '1', 'build',      'tool/build/index',                  '', '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate(), '', null, '琛ㄥ崟鏋勫缓鑿滃崟');
--- insert into sys_menu values('115',  '浠g爜鐢熸垚',       '3',   '2', 'gen',        'tool/gen/index',                    '', '', 1, 0, 'C', '0', '0', 'tool:gen:list',           'code',          'admin', sysdate(), '', null, '浠g爜鐢熸垚鑿滃崟');
--- insert into sys_menu values('116',  '绯荤粺鎺ュ彛',       '3',   '3', 'http://localhost:8080/swagger-ui/index.html', '', '', '', 0, 0, 'C', '0', '0', 'tool:swagger:list',       'swagger',       'admin', sysdate(), '', null, '绯荤粺鎺ュ彛鑿滃崟');
+insert into sys_menu values('114',  '琛ㄥ崟鏋勫缓',       '3',   '1', 'build',      'tool/build/index',                  '', '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate(), '', null, '琛ㄥ崟鏋勫缓鑿滃崟', '');
+insert into sys_menu values('115',  '浠g爜鐢熸垚',       '3',   '2', 'gen',        'tool/gen/index',                    '', '', 1, 0, 'C', '0', '0', 'tool:gen:list',           'code',          'admin', sysdate(), '', null, '浠g爜鐢熸垚鑿滃崟', '');
+insert into sys_menu values('116',  '绯荤粺鎺ュ彛',       '3',   '3', 'http://localhost:8080/swagger-ui/index.html', '', '', '', 0, 0, 'C', '0', '0', 'tool:swagger:list',       'swagger',       'admin', sysdate(), '', null, '绯荤粺鎺ュ彛鑿滃崟', '');
 -- 涓夌骇鑿滃崟
 insert into sys_menu values('500',  '鎿嶄綔鏃ュ織', '108', '1', 'operlog',    'system/operlog/index',    '', '', 1, 0, 'C', '0', '0', 'system:operlog:list',    'form',          'admin', sysdate(), '', null, '鎿嶄綔鏃ュ織鑿滃崟');
 insert into sys_menu values('501',  '鐧诲綍鏃ュ織', '108', '2', 'logininfor', 'system/logininfor/index', '', '', 1, 0, 'C', '0', '0', 'system:logininfor:list', 'logininfor',    'admin', sysdate(), '', null, '鐧诲綍鏃ュ織鑿滃崟');
@@ -267,12 +267,12 @@
 -- insert into sys_menu values('1053', '鐘舵�佷慨鏀�', '110', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus',   '#', 'admin', sysdate(), '', null, '');
 -- insert into sys_menu values('1054', '浠诲姟瀵煎嚭', '110', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export',         '#', 'admin', sysdate(), '', null, '');
 -- 浠g爜鐢熸垚鎸夐挳
--- insert into sys_menu values('1055', '鐢熸垚鏌ヨ', '115', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query',             '#', 'admin', sysdate(), '', null, '');
--- insert into sys_menu values('1056', '鐢熸垚淇敼', '115', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit',              '#', 'admin', sysdate(), '', null, '');
--- insert into sys_menu values('1057', '鐢熸垚鍒犻櫎', '115', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove',            '#', 'admin', sysdate(), '', null, '');
--- insert into sys_menu values('1058', '瀵煎叆浠g爜', '115', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import',            '#', 'admin', sysdate(), '', null, '');
--- insert into sys_menu values('1059', '棰勮浠g爜', '115', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 'admin', sysdate(), '', null, '');
--- insert into sys_menu values('1060', '鐢熸垚浠g爜', '115', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1055', '鐢熸垚鏌ヨ', '115', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query',             '#', 'admin', sysdate(), '', null, '', '');
+insert into sys_menu values('1056', '鐢熸垚淇敼', '115', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit',              '#', 'admin', sysdate(), '', null, '', '');
+insert into sys_menu values('1057', '鐢熸垚鍒犻櫎', '115', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove',            '#', 'admin', sysdate(), '', null, '', '');
+insert into sys_menu values('1058', '瀵煎叆浠g爜', '115', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import',            '#', 'admin', sysdate(), '', null, '', '');
+insert into sys_menu values('1059', '棰勮浠g爜', '115', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 'admin', sysdate(), '', null, '', '');
+insert into sys_menu values('1060', '鐢熸垚浠g爜', '115', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 'admin', sysdate(), '', null, '', '');
 -- 棣栭〉
 insert into sys_menu values('1061', '浣滄垬瀹為獙鏉′欢寤鸿',            '0', '1', '#', '', '', '', 1, 0, 'M', '0', '0', 'system:index:sy',   '#', 'admin', sysdate(), '', null, '棣栭〉', 'index');
 insert into sys_menu values('1062', '浣滄垬姒傚康寮�鍙戜笌楠岃瘉骞冲彴',   '1061', '1', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:glkf', '#', 'admin', sysdate(), '', null, '姒傚康寮�鍙戜笌楠岃瘉骞冲彴', 'index');
diff --git a/docker-compose/mysql/initdb/se_cloud_20241204.sql b/docker-compose/mysql/initdb/se_cloud_20241204.sql
index 115d76d..2a23bea 100644
--- a/docker-compose/mysql/initdb/se_cloud_20241204.sql
+++ b/docker-compose/mysql/initdb/se_cloud_20241204.sql
@@ -107,5 +107,49 @@
 
 insert into sys_status_ctrl (sys_name,ip,url,method,order_num) values ('鐢ㄦ埛鍙婃潈闄愮鐞�','127.0.0.1','http://localhost:8080/system/health', 'GET',1);
 insert into sys_status_ctrl (sys_name,ip,url,method,order_num) values ('鏁版嵁绠$悊鍒嗙郴缁�','127.0.0.1','http://localhost:8080/gateway/health','GET',2);
+
 -- ----------------------------
-                                                                                                                                                                             
+-- 03銆佸垎绯荤粺浠诲姟鎺у埗琛�
+-- ----------------------------
+drop table if exists sys_app_token;
+create table sys_app_token (
+  id                bigint(20)      not null auto_increment    comment 'ID',
+  app_name          varchar(200)                               comment '绯荤粺鍚嶇О',
+  token             varchar(50)                                comment '浠ょ墝',
+  expire_time       datetime                                   comment '澶辨晥鏃堕棿',
+  role_name         varchar(20)     default 'readonly'         comment '瑙掕壊鍚嶇О', 
+  status            char(1)         default 0                  comment '鐘舵�侊紙0姝e父 1鍋滅敤锛�',
+  create_by         varchar(64)     default ''                 comment '鍒涘缓鑰�',
+  create_time       datetime                                   comment '鍒涘缓鏃堕棿',
+  update_by         varchar(64)     default ''                 comment '鏇存柊鑰�',
+  update_time       datetime                                   comment '鏇存柊鏃堕棿',
+  remark            varchar(500)                               comment '澶囨敞',
+  primary key (id)
+) engine=innodb auto_increment=1 comment = '澶栨帴搴旂敤琛�';
+select * from sys_app_token order by id; -- select * from sys_role;
+
+insert into sys_app_token (app_name, token, expire_time, role_name, create_by, create_time) values ('缁煎悎绠$悊鍒嗙郴缁�', uuid(), '2027-01-01 00:00:00', 'superuser', 'admin', now()); -- 1801411200000
+
+-- 鑿滃崟 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('澶栨帴搴旂敤', '3', '1', 'token', 'system/token/index', 1, 0, 'M', '0', '0', 'system:token:list', '#', '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, mark)
+values('澶栨帴搴旂敤鏌ヨ', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:token:query',        '#', 'admin', sysdate(), '', null, '', 'sys');
+
+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, mark)
+values('澶栨帴搴旂敤鏂板', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:token:add',          '#', 'admin', sysdate(), '', null, '', 'sys');
+
+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, mark)
+values('澶栨帴搴旂敤淇敼', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:token:edit',         '#', 'admin', sysdate(), '', null, '', 'sys');
+
+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, remar, markk)
+values('澶栨帴搴旂敤鍒犻櫎', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:token:remove',       '#', 'admin', sysdate(), '', null, '', 'sys');
+
+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, mark)
+values('澶栨帴搴旂敤瀵煎嚭', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:token:export',       '#', 'admin', sysdate(), '', null, '', 'sys');
+-- ----------------------------                                                                                                                                              
diff --git a/se-modules/se-system/src/main/java/com/se/system/controller/SysAppTokenController.java b/se-modules/se-system/src/main/java/com/se/system/controller/SysAppTokenController.java
new file mode 100644
index 0000000..1abb040
--- /dev/null
+++ b/se-modules/se-system/src/main/java/com/se/system/controller/SysAppTokenController.java
@@ -0,0 +1,105 @@
+package com.se.system.controller;
+
+import java.util.List;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import com.se.system.service.impl.SysAppTokenServiceImpl;
+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.se.common.log.annotation.Log;
+import com.se.common.log.enums.BusinessType;
+import com.se.common.security.annotation.RequiresPermissions;
+import com.se.system.domain.SysAppToken;
+import com.se.common.core.web.controller.BaseController;
+import com.se.common.core.web.domain.AjaxResult;
+import com.se.common.core.utils.poi.ExcelUtil;
+import com.se.common.core.web.page.TableDataInfo;
+
+/**
+ * 澶栨帴搴旂敤Controller
+ * 
+ * @author se
+ * @date 2025-04-07
+ */
+@RestController
+@RequestMapping("/token")
+public class SysAppTokenController extends BaseController
+{
+    @Resource
+    private SysAppTokenServiceImpl sysAppTokenService;
+
+    /**
+     * 鏌ヨ澶栨帴搴旂敤鍒楄〃
+     */
+    @RequiresPermissions("system:token:list")
+    @GetMapping("/list")
+    public TableDataInfo list(SysAppToken sysAppToken)
+    {
+        startPage();
+        List<SysAppToken> list = sysAppTokenService.selectSysAppTokenList(sysAppToken);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭澶栨帴搴旂敤鍒楄〃
+     */
+    @RequiresPermissions("system:token:export")
+    @Log(title = "澶栨帴搴旂敤", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysAppToken sysAppToken)
+    {
+        List<SysAppToken> list = sysAppTokenService.selectSysAppTokenList(sysAppToken);
+        ExcelUtil<SysAppToken> util = new ExcelUtil<SysAppToken>(SysAppToken.class);
+        util.exportExcel(response, list, "澶栨帴搴旂敤鏁版嵁");
+    }
+
+    /**
+     * 鑾峰彇澶栨帴搴旂敤璇︾粏淇℃伅
+     */
+    @RequiresPermissions("system:token:query")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sysAppTokenService.selectSysAppTokenById(id));
+    }
+
+    /**
+     * 鏂板澶栨帴搴旂敤
+     */
+    @RequiresPermissions("system:token:add")
+    @Log(title = "澶栨帴搴旂敤", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysAppToken sysAppToken)
+    {
+        return toAjax(sysAppTokenService.insertSysAppToken(sysAppToken));
+    }
+
+    /**
+     * 淇敼澶栨帴搴旂敤
+     */
+    @RequiresPermissions("system:token:edit")
+    @Log(title = "澶栨帴搴旂敤", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysAppToken sysAppToken)
+    {
+        return toAjax(sysAppTokenService.updateSysAppToken(sysAppToken));
+    }
+
+    /**
+     * 鍒犻櫎澶栨帴搴旂敤
+     */
+    @RequiresPermissions("system:token:remove")
+    @Log(title = "澶栨帴搴旂敤", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysAppTokenService.deleteSysAppTokenByIds(ids));
+    }
+}
diff --git a/se-modules/se-system/src/main/java/com/se/system/domain/SysAppToken.java b/se-modules/se-system/src/main/java/com/se/system/domain/SysAppToken.java
new file mode 100644
index 0000000..8babbad
--- /dev/null
+++ b/se-modules/se-system/src/main/java/com/se/system/domain/SysAppToken.java
@@ -0,0 +1,116 @@
+package com.se.system.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.se.common.core.annotation.Excel;
+import com.se.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 澶栨帴搴旂敤瀵硅薄 sys_app_token
+ * 
+ * @author se
+ * @date 2025-04-07
+ */
+public class SysAppToken extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+    /** 绯荤粺鍚嶇О */
+    @Excel(name = "绯荤粺鍚嶇О")
+    private String appName;
+
+    /** 浠ょ墝 */
+    @Excel(name = "浠ょ墝")
+    private String token;
+
+    /** 澶辨晥鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "澶辨晥鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date expireTime;
+
+    /** 瑙掕壊鍚嶇О */
+    @Excel(name = "瑙掕壊鍚嶇О")
+    private String roleName;
+
+    /** 鐘舵�侊紙0姝e父 1鍋滅敤锛� */
+    @Excel(name = "鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
+    private String status;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setAppName(String appName) 
+    {
+        this.appName = appName;
+    }
+
+    public String getAppName() 
+    {
+        return appName;
+    }
+    public void setToken(String token) 
+    {
+        this.token = token;
+    }
+
+    public String getToken() 
+    {
+        return token;
+    }
+    public void setExpireTime(Date expireTime)
+    {
+        this.expireTime = expireTime;
+    }
+
+    public Date getExpireTime()
+    {
+        return expireTime;
+    }
+
+    public void setRoleName(String roleName) 
+    {
+        this.roleName = roleName;
+    }
+
+    public String getRoleName() 
+    {
+        return roleName;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("appName", getAppName())
+            .append("token", getToken())
+            .append("expireTime", getExpireTime())
+            .append("roleName", getRoleName())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/se-modules/se-system/src/main/java/com/se/system/mapper/SysAppTokenMapper.java b/se-modules/se-system/src/main/java/com/se/system/mapper/SysAppTokenMapper.java
new file mode 100644
index 0000000..3c26389
--- /dev/null
+++ b/se-modules/se-system/src/main/java/com/se/system/mapper/SysAppTokenMapper.java
@@ -0,0 +1,61 @@
+package com.se.system.mapper;
+
+import java.util.List;
+import com.se.system.domain.SysAppToken;
+
+/**
+ * 澶栨帴搴旂敤Mapper鎺ュ彛
+ * 
+ * @author se
+ * @date 2025-04-07
+ */
+public interface SysAppTokenMapper 
+{
+    /**
+     * 鏌ヨ澶栨帴搴旂敤
+     * 
+     * @param id 澶栨帴搴旂敤涓婚敭
+     * @return 澶栨帴搴旂敤
+     */
+    public SysAppToken selectSysAppTokenById(Long id);
+
+    /**
+     * 鏌ヨ澶栨帴搴旂敤鍒楄〃
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 澶栨帴搴旂敤闆嗗悎
+     */
+    public List<SysAppToken> selectSysAppTokenList(SysAppToken sysAppToken);
+
+    /**
+     * 鏂板澶栨帴搴旂敤
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 缁撴灉
+     */
+    public int insertSysAppToken(SysAppToken sysAppToken);
+
+    /**
+     * 淇敼澶栨帴搴旂敤
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 缁撴灉
+     */
+    public int updateSysAppToken(SysAppToken sysAppToken);
+
+    /**
+     * 鍒犻櫎澶栨帴搴旂敤
+     * 
+     * @param id 澶栨帴搴旂敤涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteSysAppTokenById(Long id);
+
+    /**
+     * 鎵归噺鍒犻櫎澶栨帴搴旂敤
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteSysAppTokenByIds(Long[] ids);
+}
diff --git a/se-modules/se-system/src/main/java/com/se/system/service/impl/SysAppTokenServiceImpl.java b/se-modules/se-system/src/main/java/com/se/system/service/impl/SysAppTokenServiceImpl.java
new file mode 100644
index 0000000..5c87e7a
--- /dev/null
+++ b/se-modules/se-system/src/main/java/com/se/system/service/impl/SysAppTokenServiceImpl.java
@@ -0,0 +1,97 @@
+package com.se.system.service.impl;
+
+import java.util.List;
+import com.se.common.core.utils.DateUtils;
+import org.springframework.stereotype.Service;
+import com.se.system.mapper.SysAppTokenMapper;
+import com.se.system.domain.SysAppToken;
+import com.se.system.service.inte.ISysAppTokenService;
+
+import javax.annotation.Resource;
+
+/**
+ * 澶栨帴搴旂敤Service涓氬姟灞傚鐞�
+ * 
+ * @author se
+ * @date 2025-04-07
+ */
+@Service
+public class SysAppTokenServiceImpl implements ISysAppTokenService 
+{
+    @Resource
+    private SysAppTokenMapper sysAppTokenMapper;
+
+    /**
+     * 鏌ヨ澶栨帴搴旂敤
+     * 
+     * @param id 澶栨帴搴旂敤涓婚敭
+     * @return 澶栨帴搴旂敤
+     */
+    @Override
+    public SysAppToken selectSysAppTokenById(Long id)
+    {
+        return sysAppTokenMapper.selectSysAppTokenById(id);
+    }
+
+    /**
+     * 鏌ヨ澶栨帴搴旂敤鍒楄〃
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 澶栨帴搴旂敤
+     */
+    @Override
+    public List<SysAppToken> selectSysAppTokenList(SysAppToken sysAppToken)
+    {
+        return sysAppTokenMapper.selectSysAppTokenList(sysAppToken);
+    }
+
+    /**
+     * 鏂板澶栨帴搴旂敤
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysAppToken(SysAppToken sysAppToken)
+    {
+        sysAppToken.setCreateTime(DateUtils.getNowDate());
+        return sysAppTokenMapper.insertSysAppToken(sysAppToken);
+    }
+
+    /**
+     * 淇敼澶栨帴搴旂敤
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysAppToken(SysAppToken sysAppToken)
+    {
+        sysAppToken.setUpdateTime(DateUtils.getNowDate());
+        return sysAppTokenMapper.updateSysAppToken(sysAppToken);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎澶栨帴搴旂敤
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑澶栨帴搴旂敤涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysAppTokenByIds(Long[] ids)
+    {
+        return sysAppTokenMapper.deleteSysAppTokenByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎澶栨帴搴旂敤淇℃伅
+     * 
+     * @param id 澶栨帴搴旂敤涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysAppTokenById(Long id)
+    {
+        return sysAppTokenMapper.deleteSysAppTokenById(id);
+    }
+}
diff --git a/se-modules/se-system/src/main/java/com/se/system/service/inte/ISysAppTokenService.java b/se-modules/se-system/src/main/java/com/se/system/service/inte/ISysAppTokenService.java
new file mode 100644
index 0000000..2e401f3
--- /dev/null
+++ b/se-modules/se-system/src/main/java/com/se/system/service/inte/ISysAppTokenService.java
@@ -0,0 +1,61 @@
+package com.se.system.service.inte;
+
+import java.util.List;
+import com.se.system.domain.SysAppToken;
+
+/**
+ * 澶栨帴搴旂敤Service鎺ュ彛
+ * 
+ * @author se
+ * @date 2025-04-07
+ */
+public interface ISysAppTokenService 
+{
+    /**
+     * 鏌ヨ澶栨帴搴旂敤
+     * 
+     * @param id 澶栨帴搴旂敤涓婚敭
+     * @return 澶栨帴搴旂敤
+     */
+    public SysAppToken selectSysAppTokenById(Long id);
+
+    /**
+     * 鏌ヨ澶栨帴搴旂敤鍒楄〃
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 澶栨帴搴旂敤闆嗗悎
+     */
+    public List<SysAppToken> selectSysAppTokenList(SysAppToken sysAppToken);
+
+    /**
+     * 鏂板澶栨帴搴旂敤
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 缁撴灉
+     */
+    public int insertSysAppToken(SysAppToken sysAppToken);
+
+    /**
+     * 淇敼澶栨帴搴旂敤
+     * 
+     * @param sysAppToken 澶栨帴搴旂敤
+     * @return 缁撴灉
+     */
+    public int updateSysAppToken(SysAppToken sysAppToken);
+
+    /**
+     * 鎵归噺鍒犻櫎澶栨帴搴旂敤
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑澶栨帴搴旂敤涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteSysAppTokenByIds(Long[] ids);
+
+    /**
+     * 鍒犻櫎澶栨帴搴旂敤淇℃伅
+     * 
+     * @param id 澶栨帴搴旂敤涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteSysAppTokenById(Long id);
+}
diff --git a/se-modules/se-system/src/main/resources/mapper/system/SysAppTokenMapper.xml b/se-modules/se-system/src/main/resources/mapper/system/SysAppTokenMapper.xml
new file mode 100644
index 0000000..fc23665
--- /dev/null
+++ b/se-modules/se-system/src/main/resources/mapper/system/SysAppTokenMapper.xml
@@ -0,0 +1,96 @@
+<?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.se.system.mapper.SysAppTokenMapper">
+
+    <resultMap type="SysAppToken" id="SysAppTokenResult">
+        <result property="id"    column="id"    />
+        <result property="appName"    column="app_name"    />
+        <result property="token"    column="token"    />
+        <result property="expireTime"    column="expire_time"    />
+        <result property="roleName"    column="role_name"    />
+        <result property="status"    column="status"    />
+        <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="selectSysAppTokenVo">
+        select id, app_name, token, expire_time, role_name, status, create_by, create_time, update_by, update_time, remark from sys_app_token
+    </sql>
+
+    <select id="selectSysAppTokenList" parameterType="SysAppToken" resultMap="SysAppTokenResult">
+        <include refid="selectSysAppTokenVo"/>
+        <where>
+            <if test="appName != null  and appName != ''"> and app_name like concat('%', #{appName}, '%')</if>
+            <if test="token != null  and token != ''"> and token = #{token}</if>
+            <if test="expireTime != null "> and expire_time = #{expireTime}</if>
+            <if test="roleName != null  and roleName != ''"> and role_name like concat('%', #{roleName}, '%')</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+
+    <select id="selectSysAppTokenById" parameterType="Long" resultMap="SysAppTokenResult">
+        <include refid="selectSysAppTokenVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysAppToken" parameterType="SysAppToken" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_app_token
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="appName != null">app_name,</if>
+            <if test="token != null">token,</if>
+            <if test="expireTime != null">expire_time,</if>
+            <if test="roleName != null">role_name,</if>
+            <if test="status != null">status,</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="appName != null">#{appName},</if>
+            <if test="token != null">#{token},</if>
+            <if test="expireTime != null">#{expireTime},</if>
+            <if test="roleName != null">#{roleName},</if>
+            <if test="status != null">#{status},</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="updateSysAppToken" parameterType="SysAppToken">
+        update sys_app_token
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="appName != null">app_name = #{appName},</if>
+            <if test="token != null">token = #{token},</if>
+            <if test="expireTime != null">expire_time = #{expireTime},</if>
+            <if test="roleName != null">role_name = #{roleName},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysAppTokenById" parameterType="Long">
+        delete from sys_app_token where id = #{id}
+    </delete>
+
+    <delete id="deleteSysAppTokenByIds" parameterType="String">
+        delete from sys_app_token where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/se-ui/src/api/system/token.js b/se-ui/src/api/system/token.js
new file mode 100644
index 0000000..1a080b9
--- /dev/null
+++ b/se-ui/src/api/system/token.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ澶栨帴搴旂敤鍒楄〃
+export function listToken(query) {
+  return request({
+    url: '/system/token/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ澶栨帴搴旂敤璇︾粏
+export function getToken(id) {
+  return request({
+    url: '/system/token/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板澶栨帴搴旂敤
+export function addToken(data) {
+  return request({
+    url: '/system/token',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼澶栨帴搴旂敤
+export function updateToken(data) {
+  return request({
+    url: '/system/token',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎澶栨帴搴旂敤
+export function delToken(id) {
+  return request({
+    url: '/system/token/' + id,
+    method: 'delete'
+  })
+}
diff --git a/se-ui/src/views/system/token/index.vue b/se-ui/src/views/system/token/index.vue
new file mode 100644
index 0000000..a4a2dba
--- /dev/null
+++ b/se-ui/src/views/system/token/index.vue
@@ -0,0 +1,308 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="绯荤粺鍚嶇О" prop="appName">
+        <el-input
+          v-model="queryParams.appName"
+          placeholder="璇疯緭鍏ョ郴缁熷悕绉�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="浠ょ墝" prop="token">
+        <el-input
+          v-model="queryParams.token"
+          placeholder="璇疯緭鍏ヤ护鐗�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="澶辨晥鏃堕棿" prop="expireTime">
+        <el-date-picker clearable
+          v-model="queryParams.expireTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="璇烽�夋嫨澶辨晥鏃堕棿">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="瑙掕壊鍚嶇О" prop="roleName">
+        <el-input
+          v-model="queryParams.roleName"
+          placeholder="璇疯緭鍏ヨ鑹插悕绉�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </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:token: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:token: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:token: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:token:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="tokenList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" />
+      <el-table-column label="绯荤粺鍚嶇О" align="center" prop="appName" />
+      <el-table-column label="浠ょ墝" align="center" prop="token" />
+      <el-table-column label="澶辨晥鏃堕棿" align="center" prop="expireTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.expireTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="瑙掕壊鍚嶇О" align="center" prop="roleName" />
+      <el-table-column label="鐘舵��" align="center" prop="status" />
+      <el-table-column label="澶囨敞" align="center" prop="remark" />
+      <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:token:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:token: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="appName">
+          <el-input v-model="form.appName" placeholder="璇疯緭鍏ョ郴缁熷悕绉�" />
+        </el-form-item>
+        <el-form-item label="浠ょ墝" prop="token">
+          <el-input v-model="form.token" placeholder="璇疯緭鍏ヤ护鐗�" readonly />
+        </el-form-item>
+        <el-form-item label="澶辨晥鏃堕棿" prop="expireTime">
+          <el-date-picker clearable
+            v-model="form.expireTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="璇烽�夋嫨澶辨晥鏃堕棿">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="瑙掕壊鍚嶇О" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�" />
+        </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 { listToken, getToken, delToken, addToken, updateToken } from "@/api/system/token";
+
+export default {
+  name: "Token",
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 澶栨帴搴旂敤琛ㄦ牸鏁版嵁
+      tokenList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        appName: null,
+        token: null,
+        expireTime: null,
+        roleName: null,
+        status: null,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ澶栨帴搴旂敤鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listToken(this.queryParams).then(response => {
+        this.tokenList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        appName: null,
+        token: null,
+        expireTime: null,
+        roleName: null,
+        status: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞澶栨帴搴旂敤";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getToken(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼澶栨帴搴旂敤";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateToken(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addToken(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎澶栨帴搴旂敤缂栧彿涓�"' + ids + '"鐨勬暟鎹」锛�').then(function() {
+        return delToken(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('system/token/export', {
+        ...this.queryParams
+      }, `token_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

--
Gitblit v1.9.3