diff --git a/README.md b/README.md index 550987f..0df33d6 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,7 @@ 后端采用Spring Boot、Spring Security、Redis & Jwt。 权限认证使用Jwt,支持多终端认证系统。 支持加载动态权限菜单,多方式轻松权限控制。 -高效率开发,使用代码生成器可以一键生成前后端代码。 \ No newline at end of file +高效率开发,使用代码生成器可以一键生成前后端代码。 + +API常量类配置 +ApiConstants \ No newline at end of file diff --git a/tagApi-admin/src/main/java/hw/tagApi/web/controller/system/SysApiTokenController.java b/tagApi-admin/src/main/java/hw/tagApi/web/controller/system/SysApiTokenController.java new file mode 100644 index 0000000..a66745c --- /dev/null +++ b/tagApi-admin/src/main/java/hw/tagApi/web/controller/system/SysApiTokenController.java @@ -0,0 +1,98 @@ +package hw.tagApi.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 hw.tagApi.common.annotation.Log; +import hw.tagApi.common.core.controller.BaseController; +import hw.tagApi.common.core.domain.AjaxResult; +import hw.tagApi.common.enums.BusinessType; +import hw.tagApi.system.domain.SysApiToken; +import hw.tagApi.system.service.ISysApiTokenService; +import hw.tagApi.common.utils.poi.ExcelUtil; +import hw.tagApi.common.core.page.TableDataInfo; + +/** + * 用户令牌Controller + * + * @author Yinq + * @date 2025-04-23 + */ +@RestController +@RequestMapping("/system/apiToken") +public class SysApiTokenController extends BaseController { + @Autowired + private ISysApiTokenService sysApiTokenService; + + /** + * 查询用户令牌列表 + */ + @PreAuthorize("@ss.hasPermi('system:apiToken:list')") + @GetMapping("/list") + public TableDataInfo list(SysApiToken sysApiToken) { + startPage(); + List list = sysApiTokenService.selectSysApiTokenList(sysApiToken); + return getDataTable(list); + } + + /** + * 导出用户令牌列表 + */ + @PreAuthorize("@ss.hasPermi('system:apiToken:export')") + @Log(title = "用户令牌", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysApiToken sysApiToken) { + List list = sysApiTokenService.selectSysApiTokenList(sysApiToken); + ExcelUtil util = new ExcelUtil(SysApiToken.class); + util.exportExcel(response, list, "用户令牌数据"); + } + + /** + * 获取用户令牌详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:apiToken:query')") + @GetMapping(value = "/{tokenId}") + public AjaxResult getInfo(@PathVariable("tokenId") Long tokenId) { + return success(sysApiTokenService.selectSysApiTokenByTokenId(tokenId)); + } + + /** + * 新增用户令牌 + */ + @PreAuthorize("@ss.hasPermi('system:apiToken:add')") + @Log(title = "用户令牌", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysApiToken sysApiToken) { + return toAjax(sysApiTokenService.insertSysApiToken(sysApiToken)); + } + + /** + * 修改用户令牌 + */ + @PreAuthorize("@ss.hasPermi('system:apiToken:edit')") + @Log(title = "用户令牌", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysApiToken sysApiToken) { + return toAjax(sysApiTokenService.updateSysApiToken(sysApiToken)); + } + + /** + * 删除用户令牌 + */ + @PreAuthorize("@ss.hasPermi('system:apiToken:remove')") + @Log(title = "用户令牌", businessType = BusinessType.DELETE) + @DeleteMapping("/{tokenIds}") + public AjaxResult remove(@PathVariable Long[] tokenIds) { + return toAjax(sysApiTokenService.deleteSysApiTokenByTokenIds(tokenIds)); + } +} diff --git a/tagApi-admin/src/main/resources/application.yml b/tagApi-admin/src/main/resources/application.yml index fc31a9c..3ad0af1 100644 --- a/tagApi-admin/src/main/resources/application.yml +++ b/tagApi-admin/src/main/resources/application.yml @@ -95,7 +95,7 @@ token: # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) - expireTime: 30 + expireTime: 720 # MyBatis配置 mybatis: @@ -127,3 +127,7 @@ xss: excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* + +tagApi: + username: highwayiot + password: tagPass@2025 \ No newline at end of file diff --git a/tagApi-admin/src/main/resources/logback.xml b/tagApi-admin/src/main/resources/logback.xml index 6d49de1..bf52a23 100644 --- a/tagApi-admin/src/main/resources/logback.xml +++ b/tagApi-admin/src/main/resources/logback.xml @@ -1,7 +1,7 @@ - + diff --git a/tagApi-service/src/main/java/hw/tagApi/service/constant/ApiConstants.java b/tagApi-service/src/main/java/hw/tagApi/service/constant/ApiConstants.java index a0189a4..ff97739 100644 --- a/tagApi-service/src/main/java/hw/tagApi/service/constant/ApiConstants.java +++ b/tagApi-service/src/main/java/hw/tagApi/service/constant/ApiConstants.java @@ -1,6 +1,5 @@ package hw.tagApi.service.constant; -import com.fasterxml.jackson.databind.ObjectMapper; /** * API常量类 @@ -13,7 +12,8 @@ public class ApiConstants { /** * 本机IP端口 */ - public static final String BASE_URL = "http://127.0.0.1:9000/docs/export/"; +// public static final String BASE_URL = "http://127.0.0.1:9000/docs/export/"; + public static final String BASE_URL = "http://1.13.177.47:9000/docs/export/"; /** * 过期时间(毫秒) 6小时 diff --git a/tagApi-service/src/main/java/hw/tagApi/service/controller/KDocsApiController.java b/tagApi-service/src/main/java/hw/tagApi/service/controller/KDocsApiController.java index 27637aa..02714ab 100644 --- a/tagApi-service/src/main/java/hw/tagApi/service/controller/KDocsApiController.java +++ b/tagApi-service/src/main/java/hw/tagApi/service/controller/KDocsApiController.java @@ -2,17 +2,18 @@ package hw.tagApi.service.controller; import hw.tagApi.common.core.controller.BaseController; import hw.tagApi.common.core.domain.AjaxResult; -import hw.tagApi.common.utils.poi.ExcelUtil; import hw.tagApi.service.constant.ApiConstants; import hw.tagApi.service.domain.ApiContent; import hw.tagApi.service.domain.ApiRequest; import hw.tagApi.service.domain.ApiResponse; import hw.tagApi.service.service.IKDocsService; import hw.tagApi.system.domain.SysAttachInfo; +import hw.tagApi.system.service.ISysApiTokenService; import hw.tagApi.system.service.ISysAttachInfoService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.servlet.ServletException; @@ -26,6 +27,7 @@ import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Objects; /** * 云接口Controller @@ -45,6 +47,15 @@ public class KDocsApiController extends BaseController { @Autowired private ISysAttachInfoService attachInfoService; + @Autowired + private ISysApiTokenService apiTokenService; + + @Value("${tagApi.username}") + private String apiUsername; + + @Value("${tagApi.password}") + private String apiPassword; + /** * 统一接口处理 * @@ -173,7 +184,23 @@ public class KDocsApiController extends BaseController { * @return 是否有效 */ private boolean validateApiKey(String apiKey) { - // TODO: 实现API-Key的验证逻辑 - return true; + String sysApiToken = apiTokenService.getSysApiToken(); + return Objects.equals(sysApiToken, apiKey); } + + + /** + * 获取token + * @param username + * @param password + * @return + */ + @GetMapping("/getToken") + public AjaxResult getToken(@RequestParam String username, @RequestParam String password) { + if (!apiUsername.equals(username) || !apiPassword.equals(password)) { + return AjaxResult.error("账号或密码错误!"); + } + return AjaxResult.success(apiTokenService.getSysApiToken()); + } + } diff --git a/tagApi-system/src/main/java/hw/tagApi/system/domain/SysApiToken.java b/tagApi-system/src/main/java/hw/tagApi/system/domain/SysApiToken.java new file mode 100644 index 0000000..72213f1 --- /dev/null +++ b/tagApi-system/src/main/java/hw/tagApi/system/domain/SysApiToken.java @@ -0,0 +1,135 @@ +package hw.tagApi.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import hw.tagApi.common.annotation.Excel; +import hw.tagApi.common.core.domain.BaseEntity; + +/** + * 用户令牌对象 sys_api_token + * + * @author Yinq + * @date 2025-04-23 + */ +public class SysApiToken extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键标识 */ + private Long tokenId; + + /** 令牌字符串 */ + @Excel(name = "令牌字符串") + private String tokenCode; + + /** 过期时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "过期时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date expiresTime; + + /** 启用状态(1是 0否) */ + @Excel(name = "启用状态", readConverterExp = "1=是,0=否") + private String enableFlag; + + /** 预留字段1 */ + @Excel(name = "预留字段1") + private String fields1; + + /** 预留字段2 */ + @Excel(name = "预留字段2") + private String fields2; + + /** 预留字段3 */ + @Excel(name = "预留字段3") + private String fields3; + + public void setTokenId(Long tokenId) + { + this.tokenId = tokenId; + } + + public Long getTokenId() + { + return tokenId; + } + + public void setTokenCode(String tokenCode) + { + this.tokenCode = tokenCode; + } + + public String getTokenCode() + { + return tokenCode; + } + + public void setExpiresTime(Date expiresTime) + { + this.expiresTime = expiresTime; + } + + public Date getExpiresTime() + { + return expiresTime; + } + + public void setEnableFlag(String enableFlag) + { + this.enableFlag = enableFlag; + } + + public String getEnableFlag() + { + return enableFlag; + } + + public void setFields1(String fields1) + { + this.fields1 = fields1; + } + + public String getFields1() + { + return fields1; + } + + public void setFields2(String fields2) + { + this.fields2 = fields2; + } + + public String getFields2() + { + return fields2; + } + + public void setFields3(String fields3) + { + this.fields3 = fields3; + } + + public String getFields3() + { + return fields3; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("tokenId", getTokenId()) + .append("tokenCode", getTokenCode()) + .append("expiresTime", getExpiresTime()) + .append("enableFlag", getEnableFlag()) + .append("fields1", getFields1()) + .append("fields2", getFields2()) + .append("fields3", getFields3()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/tagApi-system/src/main/java/hw/tagApi/system/mapper/SysApiTokenMapper.java b/tagApi-system/src/main/java/hw/tagApi/system/mapper/SysApiTokenMapper.java new file mode 100644 index 0000000..7c335cb --- /dev/null +++ b/tagApi-system/src/main/java/hw/tagApi/system/mapper/SysApiTokenMapper.java @@ -0,0 +1,61 @@ +package hw.tagApi.system.mapper; + +import java.util.List; +import hw.tagApi.system.domain.SysApiToken; + +/** + * 用户令牌Mapper接口 + * + * @author Yinq + * @date 2025-04-23 + */ +public interface SysApiTokenMapper +{ + /** + * 查询用户令牌 + * + * @param tokenId 用户令牌主键 + * @return 用户令牌 + */ + public SysApiToken selectSysApiTokenByTokenId(Long tokenId); + + /** + * 查询用户令牌列表 + * + * @param sysApiToken 用户令牌 + * @return 用户令牌集合 + */ + public List selectSysApiTokenList(SysApiToken sysApiToken); + + /** + * 新增用户令牌 + * + * @param sysApiToken 用户令牌 + * @return 结果 + */ + public int insertSysApiToken(SysApiToken sysApiToken); + + /** + * 修改用户令牌 + * + * @param sysApiToken 用户令牌 + * @return 结果 + */ + public int updateSysApiToken(SysApiToken sysApiToken); + + /** + * 删除用户令牌 + * + * @param tokenId 用户令牌主键 + * @return 结果 + */ + public int deleteSysApiTokenByTokenId(Long tokenId); + + /** + * 批量删除用户令牌 + * + * @param tokenIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSysApiTokenByTokenIds(Long[] tokenIds); +} diff --git a/tagApi-system/src/main/java/hw/tagApi/system/service/ISysApiTokenService.java b/tagApi-system/src/main/java/hw/tagApi/system/service/ISysApiTokenService.java new file mode 100644 index 0000000..6060454 --- /dev/null +++ b/tagApi-system/src/main/java/hw/tagApi/system/service/ISysApiTokenService.java @@ -0,0 +1,67 @@ +package hw.tagApi.system.service; + +import java.util.List; +import hw.tagApi.system.domain.SysApiToken; + +/** + * 用户令牌Service接口 + * + * @author Yinq + * @date 2025-04-23 + */ +public interface ISysApiTokenService +{ + /** + * 查询用户令牌 + * + * @param tokenId 用户令牌主键 + * @return 用户令牌 + */ + public SysApiToken selectSysApiTokenByTokenId(Long tokenId); + + /** + * 查询用户令牌列表 + * + * @param sysApiToken 用户令牌 + * @return 用户令牌集合 + */ + public List selectSysApiTokenList(SysApiToken sysApiToken); + + /** + * 新增用户令牌 + * + * @param sysApiToken 用户令牌 + * @return 结果 + */ + public int insertSysApiToken(SysApiToken sysApiToken); + + /** + * 修改用户令牌 + * + * @param sysApiToken 用户令牌 + * @return 结果 + */ + public int updateSysApiToken(SysApiToken sysApiToken); + + /** + * 批量删除用户令牌 + * + * @param tokenIds 需要删除的用户令牌主键集合 + * @return 结果 + */ + public int deleteSysApiTokenByTokenIds(Long[] tokenIds); + + /** + * 删除用户令牌信息 + * + * @param tokenId 用户令牌主键 + * @return 结果 + */ + public int deleteSysApiTokenByTokenId(Long tokenId); + + /** + * 获取Token + * @return + */ + public String getSysApiToken(); +} diff --git a/tagApi-system/src/main/java/hw/tagApi/system/service/impl/SysApiTokenServiceImpl.java b/tagApi-system/src/main/java/hw/tagApi/system/service/impl/SysApiTokenServiceImpl.java new file mode 100644 index 0000000..03f8d87 --- /dev/null +++ b/tagApi-system/src/main/java/hw/tagApi/system/service/impl/SysApiTokenServiceImpl.java @@ -0,0 +1,111 @@ +package hw.tagApi.system.service.impl; + +import java.util.List; +import hw.tagApi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import hw.tagApi.system.mapper.SysApiTokenMapper; +import hw.tagApi.system.domain.SysApiToken; +import hw.tagApi.system.service.ISysApiTokenService; + +/** + * 用户令牌Service业务层处理 + * + * @author Yinq + * @date 2025-04-23 + */ +@Service +public class SysApiTokenServiceImpl implements ISysApiTokenService +{ + @Autowired + private SysApiTokenMapper sysApiTokenMapper; + + /** + * 查询用户令牌 + * + * @param tokenId 用户令牌主键 + * @return 用户令牌 + */ + @Override + public SysApiToken selectSysApiTokenByTokenId(Long tokenId) + { + return sysApiTokenMapper.selectSysApiTokenByTokenId(tokenId); + } + + /** + * 查询用户令牌列表 + * + * @param sysApiToken 用户令牌 + * @return 用户令牌 + */ + @Override + public List selectSysApiTokenList(SysApiToken sysApiToken) + { + return sysApiTokenMapper.selectSysApiTokenList(sysApiToken); + } + + /** + * 新增用户令牌 + * + * @param sysApiToken 用户令牌 + * @return 结果 + */ + @Override + public int insertSysApiToken(SysApiToken sysApiToken) + { + sysApiToken.setCreateTime(DateUtils.getNowDate()); + return sysApiTokenMapper.insertSysApiToken(sysApiToken); + } + + /** + * 修改用户令牌 + * + * @param sysApiToken 用户令牌 + * @return 结果 + */ + @Override + public int updateSysApiToken(SysApiToken sysApiToken) + { + sysApiToken.setUpdateTime(DateUtils.getNowDate()); + return sysApiTokenMapper.updateSysApiToken(sysApiToken); + } + + /** + * 批量删除用户令牌 + * + * @param tokenIds 需要删除的用户令牌主键 + * @return 结果 + */ + @Override + public int deleteSysApiTokenByTokenIds(Long[] tokenIds) + { + return sysApiTokenMapper.deleteSysApiTokenByTokenIds(tokenIds); + } + + /** + * 删除用户令牌信息 + * + * @param tokenId 用户令牌主键 + * @return 结果 + */ + @Override + public int deleteSysApiTokenByTokenId(Long tokenId) + { + return sysApiTokenMapper.deleteSysApiTokenByTokenId(tokenId); + } + + /** + * 获取Token + * @return + */ + @Override + public String getSysApiToken() { + SysApiToken sysApiToken = new SysApiToken(); + sysApiToken.setEnableFlag("1"); + List apiTokens = sysApiTokenMapper.selectSysApiTokenList(sysApiToken); + if (apiTokens.isEmpty()){ + return null; + } + return apiTokens.get(0).getTokenCode(); + } +} diff --git a/tagApi-system/src/main/resources/mapper/system/SysApiTokenMapper.xml b/tagApi-system/src/main/resources/mapper/system/SysApiTokenMapper.xml new file mode 100644 index 0000000..222b309 --- /dev/null +++ b/tagApi-system/src/main/resources/mapper/system/SysApiTokenMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + select token_id, token_code, expires_time, enable_flag, fields_1, fields_2, fields_3, create_by, create_time, update_by, update_time, remark from sys_api_token + + + + + + + + insert into sys_api_token + + token_code, + expires_time, + enable_flag, + fields_1, + fields_2, + fields_3, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{tokenCode}, + #{expiresTime}, + #{enableFlag}, + #{fields1}, + #{fields2}, + #{fields3}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update sys_api_token + + token_code = #{tokenCode}, + expires_time = #{expiresTime}, + enable_flag = #{enableFlag}, + fields_1 = #{fields1}, + fields_2 = #{fields2}, + fields_3 = #{fields3}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where token_id = #{tokenId} + + + + delete from sys_api_token where token_id = #{tokenId} + + + + delete from sys_api_token where token_id in + + #{tokenId} + + + \ No newline at end of file diff --git a/tagApi-ui/src/api/system/apiToken.js b/tagApi-ui/src/api/system/apiToken.js new file mode 100644 index 0000000..129f581 --- /dev/null +++ b/tagApi-ui/src/api/system/apiToken.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询用户令牌列表 +export function listApiToken(query) { + return request({ + url: '/system/apiToken/list', + method: 'get', + params: query + }) +} + +// 查询用户令牌详细 +export function getApiToken(tokenId) { + return request({ + url: '/system/apiToken/' + tokenId, + method: 'get' + }) +} + +// 新增用户令牌 +export function addApiToken(data) { + return request({ + url: '/system/apiToken', + method: 'post', + data: data + }) +} + +// 修改用户令牌 +export function updateApiToken(data) { + return request({ + url: '/system/apiToken', + method: 'put', + data: data + }) +} + +// 删除用户令牌 +export function delApiToken(tokenId) { + return request({ + url: '/system/apiToken/' + tokenId, + method: 'delete' + }) +} diff --git a/tagApi-ui/src/views/system/apiToken/index.vue b/tagApi-ui/src/views/system/apiToken/index.vue new file mode 100644 index 0000000..d3b0652 --- /dev/null +++ b/tagApi-ui/src/views/system/apiToken/index.vue @@ -0,0 +1,332 @@ + + +