This commit is contained in:
六如
2024-11-20 10:37:42 +08:00
parent 16a2ca7723
commit ba384660f1
37 changed files with 313 additions and 43 deletions

View File

@@ -13,7 +13,7 @@ public enum ConfigKeyEnum {
PASSWORD_SALT("admin.password-salt", ""),
JWT_TIMEOUT_DAYS("admin.jwt-timeout-days", "365"),
JWT_SECRET("admin.jwt.secret", ""),
TORNA_URL("admin.torna-url", ""),
TORNA_SERVER_ADDR("admin.torna-server-addr", ""),
OPEN_PROD_URL("admin.open-prod-url", ""),
OPEN_SANDBOX_URL("admin.open-sandbox-url", "");

View File

@@ -0,0 +1,42 @@
package com.gitee.sop.adminbackend.controller.doc;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.common.util.CopyUtil;
import com.gitee.sop.adminbackend.controller.doc.param.DocAppAddParam;
import com.gitee.sop.adminbackend.controller.doc.vo.DocAppVO;
import com.gitee.sop.adminbackend.service.doc.DocService;
import com.gitee.sop.adminbackend.service.website.dto.DocAppDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author 六如
*/
@RestController
@RequestMapping("doc")
public class DocController {
@Autowired
private DocService docService;
@GetMapping("app/list")
public Result<List<DocAppVO>> listApp() {
List<DocAppDTO> docAppDTOS = docService.listDocApp();
List<DocAppVO> docAppVOS = CopyUtil.copyList(docAppDTOS, DocAppVO::new);
return Result.ok(docAppVOS);
}
@PostMapping("app/add")
public Result<Integer> addApp(@Validated @RequestBody DocAppAddParam param) {
docService.addDocApp(param.getTornaToken());
return Result.ok(1);
}
}

View File

@@ -2,7 +2,7 @@ package com.gitee.sop.adminbackend.controller.doc;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.common.util.CopyUtil;
import com.gitee.sop.adminbackend.controller.doc.resp.DocSettingVO;
import com.gitee.sop.adminbackend.controller.doc.vo.DocSettingVO;
import com.gitee.sop.adminbackend.service.doc.DocService;
import com.gitee.sop.adminbackend.service.doc.dto.DocSettingDTO;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -0,0 +1,18 @@
package com.gitee.sop.adminbackend.controller.doc.param;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
/**
* @author 六如
*/
@Data
public class DocAppAddParam {
@NotBlank
@Length(max = 128)
private String tornaToken;
}

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.website.resp;
package com.gitee.sop.adminbackend.controller.doc.vo;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.doc.resp;
package com.gitee.sop.adminbackend.controller.doc.vo;
import lombok.Data;

View File

@@ -7,10 +7,10 @@ import com.gitee.sop.adminbackend.common.util.RSATool;
import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO;
import com.gitee.sop.adminbackend.common.req.StatusUpdateParam;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.controller.isv.req.IsvInfoAddParam;
import com.gitee.sop.adminbackend.controller.isv.req.IsvInfoUpdateKeysParam;
import com.gitee.sop.adminbackend.controller.isv.req.IsvInfoUpdateParam;
import com.gitee.sop.adminbackend.controller.isv.req.IsvKeysGenParam;
import com.gitee.sop.adminbackend.controller.isv.param.IsvInfoAddParam;
import com.gitee.sop.adminbackend.controller.isv.param.IsvInfoUpdateKeysParam;
import com.gitee.sop.adminbackend.controller.isv.param.IsvInfoUpdateParam;
import com.gitee.sop.adminbackend.controller.isv.param.IsvKeysGenParam;
import com.gitee.sop.adminbackend.dao.entity.IsvInfo;
import com.gitee.sop.adminbackend.service.isv.IsvInfoService;
import com.gitee.sop.adminbackend.service.isv.PermIsvGroupService;

View File

@@ -4,8 +4,8 @@ import com.gitee.fastmybatis.core.PageInfo;
import com.gitee.fastmybatis.core.query.LambdaQuery;
import com.gitee.sop.adminbackend.common.req.IdParam;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.controller.isv.req.PermGroupPageParam;
import com.gitee.sop.adminbackend.controller.isv.req.PermGroupParam;
import com.gitee.sop.adminbackend.controller.isv.param.PermGroupPageParam;
import com.gitee.sop.adminbackend.controller.isv.param.PermGroupParam;
import com.gitee.sop.adminbackend.dao.entity.PermGroup;
import com.gitee.sop.adminbackend.service.isv.PermGroupService;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -3,8 +3,8 @@ package com.gitee.sop.adminbackend.controller.isv;
import com.gitee.fastmybatis.core.PageInfo;
import com.gitee.fastmybatis.core.query.LambdaQuery;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.controller.isv.req.PermGroupApiInfoParam;
import com.gitee.sop.adminbackend.controller.isv.req.PermGroupPermissionParam;
import com.gitee.sop.adminbackend.controller.isv.param.PermGroupApiInfoParam;
import com.gitee.sop.adminbackend.controller.isv.param.PermGroupPermissionParam;
import com.gitee.sop.adminbackend.dao.entity.ApiInfo;
import com.gitee.sop.adminbackend.service.isv.PermGroupPermissionService;
import com.gitee.sop.adminbackend.service.isv.dto.PermGroupPermissionDTO;

View File

@@ -2,7 +2,7 @@ package com.gitee.sop.adminbackend.controller.isv;
import com.gitee.sop.adminbackend.common.context.SpringContext;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.controller.isv.req.IsvGroupSettingParam;
import com.gitee.sop.adminbackend.controller.isv.param.IsvGroupSettingParam;
import com.gitee.sop.adminbackend.service.isv.PermIsvGroupService;
import com.gitee.sop.adminbackend.service.isv.dto.IsvGroupSettingDTO;
import com.gitee.sop.adminbackend.service.isv.event.ChangeIsvPermEvent;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import com.gitee.fastmybatis.core.query.Operator;
import com.gitee.fastmybatis.core.query.annotation.Condition;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import com.gitee.fastmybatis.core.query.Operator;
import com.gitee.fastmybatis.core.query.annotation.Condition;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import com.gitee.fastmybatis.core.query.Operator;
import com.gitee.fastmybatis.core.query.annotation.Condition;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.isv.req;
package com.gitee.sop.adminbackend.controller.isv.param;
import lombok.Data;

View File

@@ -5,7 +5,7 @@ import com.gitee.fastmybatis.core.query.Query;
import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO;
import com.gitee.sop.adminbackend.common.req.StatusUpdateParam;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.controller.serve.req.ApiInfoPageParam;
import com.gitee.sop.adminbackend.controller.serve.param.ApiInfoPageParam;
import com.gitee.sop.adminbackend.dao.entity.ApiInfo;
import com.gitee.sop.adminbackend.service.serve.ApiInfoService;
import com.gitee.sop.adminbackend.common.util.CopyUtil;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.serve.req;
package com.gitee.sop.adminbackend.controller.serve.param;
import com.gitee.fastmybatis.core.query.Operator;
import com.gitee.fastmybatis.core.query.annotation.Condition;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.serve.req;
package com.gitee.sop.adminbackend.controller.serve.param;
import com.gitee.fastmybatis.core.query.Operator;
import com.gitee.fastmybatis.core.query.annotation.Condition;

View File

@@ -2,8 +2,8 @@ package com.gitee.sop.adminbackend.controller.sys;
import com.gitee.sop.adminbackend.common.annotation.NoToken;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.controller.sys.req.LoginParam;
import com.gitee.sop.adminbackend.controller.sys.resp.LoginResultVO;
import com.gitee.sop.adminbackend.controller.sys.param.LoginParam;
import com.gitee.sop.adminbackend.controller.sys.vo.LoginResultVO;
import com.gitee.sop.adminbackend.service.sys.login.LoginService;
import com.gitee.sop.adminbackend.service.sys.login.dto.LoginDTO;
import com.gitee.sop.adminbackend.service.sys.login.dto.LoginUser;

View File

@@ -1,7 +1,7 @@
package com.gitee.sop.adminbackend.controller.sys;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.controller.sys.req.ConfigSettingParam;
import com.gitee.sop.adminbackend.controller.sys.param.ConfigSettingParam;
import com.gitee.sop.adminbackend.service.sys.SysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.sys.req;
package com.gitee.sop.adminbackend.controller.sys.param;
import com.gitee.sop.adminbackend.service.sys.dto.SystemConfigDTO;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.sys.req;
package com.gitee.sop.adminbackend.controller.sys.param;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.sys.resp;
package com.gitee.sop.adminbackend.controller.sys.vo;
import lombok.Data;

View File

@@ -3,8 +3,8 @@ package com.gitee.sop.adminbackend.controller.website;
import com.gitee.sop.adminbackend.common.annotation.NoToken;
import com.gitee.sop.adminbackend.common.resp.Result;
import com.gitee.sop.adminbackend.common.util.CopyUtil;
import com.gitee.sop.adminbackend.controller.website.resp.DocAppVO;
import com.gitee.sop.adminbackend.controller.website.resp.DocInfoTreeVO;
import com.gitee.sop.adminbackend.controller.doc.vo.DocAppVO;
import com.gitee.sop.adminbackend.controller.website.vo.DocInfoTreeVO;
import com.gitee.sop.adminbackend.service.website.WebsiteService;
import com.gitee.sop.adminbackend.service.website.dto.DocAppDTO;
import com.gitee.sop.adminbackend.service.website.dto.DocInfoTreeDTO;

View File

@@ -1,4 +1,4 @@
package com.gitee.sop.adminbackend.controller.website.resp;
package com.gitee.sop.adminbackend.controller.website.vo;
import com.gitee.fastmybatis.core.support.TreeNode;
import lombok.Data;

View File

@@ -1,14 +1,30 @@
package com.gitee.sop.adminbackend.service.doc;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.gitee.httphelper.HttpHelper;
import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum;
import com.gitee.sop.adminbackend.common.exception.BizException;
import com.gitee.sop.adminbackend.common.util.CopyUtil;
import com.gitee.sop.adminbackend.dao.entity.DocApp;
import com.gitee.sop.adminbackend.dao.mapper.DocAppMapper;
import com.gitee.sop.adminbackend.service.doc.dto.DocSettingDTO;
import com.gitee.sop.adminbackend.service.doc.dto.TornaModuleDTO;
import com.gitee.sop.adminbackend.service.sys.SysConfigService;
import com.gitee.sop.adminbackend.service.sys.dto.SystemConfigDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import com.gitee.sop.adminbackend.service.website.dto.DocAppDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
@@ -20,9 +36,15 @@ public class DocService {
@Autowired
private SysConfigService sysConfigService;
@Autowired
private DocAppMapper docAppMapper;
@Autowired
private TornaClient tornaClient;
public DocSettingDTO getDocSetting() {
DocSettingDTO docSettingDTO = new DocSettingDTO();
docSettingDTO.setTornaServerAddr(ConfigKeyEnum.TORNA_URL.getValue());
docSettingDTO.setTornaServerAddr(ConfigKeyEnum.TORNA_SERVER_ADDR.getValue());
docSettingDTO.setOpenProdUrl(ConfigKeyEnum.OPEN_PROD_URL.getValue());
docSettingDTO.setOpenSandboxUrl(ConfigKeyEnum.OPEN_SANDBOX_URL.getValue());
return docSettingDTO;
@@ -30,10 +52,27 @@ public class DocService {
public void save(DocSettingDTO docSettingDTO) {
Collection<SystemConfigDTO> systemConfigDTOS = new ArrayList<>();
systemConfigDTOS.add(new SystemConfigDTO(ConfigKeyEnum.TORNA_URL.getKey(), docSettingDTO.getTornaServerAddr(), "Torna服务器地址"));
systemConfigDTOS.add(new SystemConfigDTO(ConfigKeyEnum.TORNA_SERVER_ADDR.getKey(), docSettingDTO.getTornaServerAddr(), "Torna服务器地址"));
systemConfigDTOS.add(new SystemConfigDTO(ConfigKeyEnum.OPEN_PROD_URL.getKey(), docSettingDTO.getOpenProdUrl(), "开放平台线上地址"));
systemConfigDTOS.add(new SystemConfigDTO(ConfigKeyEnum.OPEN_SANDBOX_URL.getKey(), docSettingDTO.getOpenSandboxUrl(), "开放平台沙箱地址"));
sysConfigService.save(systemConfigDTOS);
}
public void addDocApp(String token) {
if (docAppMapper.checkExist(DocApp::getToken, token)) {
throw new BizException("该应用已添加");
}
TornaModuleDTO tornaModuleDTO = tornaClient.execute("module.get", null, token, TornaModuleDTO.class);
DocApp docApp = new DocApp();
docApp.setAppName(tornaModuleDTO.getName());
docApp.setToken(token);
docAppMapper.saveIgnoreNull(docApp);
}
public List<DocAppDTO> listDocApp() {
List<DocApp> docApps = docAppMapper.listAll();
return CopyUtil.copyList(docApps, DocAppDTO::new);
}
}

View File

@@ -0,0 +1,51 @@
package com.gitee.sop.adminbackend.service.doc;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.gitee.httphelper.HttpHelper;
import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum;
import com.gitee.sop.adminbackend.common.exception.BizException;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.Objects;
/**
* @author 六如
*/
@Component
public class TornaClient {
public <T> T execute(String name, Object param, String token, Class<T> respClass) {
try {
HttpHelper httpHelper = HttpHelper.get(getTornaApiUrl())
.parameter("name", name)
.parameter("access_token", token);
if (param != null) {
httpHelper.parameter("data", JSON.toJSONString(param));
}
String body = httpHelper
.execute()
.asString();
JSONObject jsonObject = JSON.parseObject(body);
if (!Objects.equals("0", jsonObject.getString("code"))) {
throw new BizException(jsonObject.getString("msg"));
}
JSONObject data = jsonObject.getJSONObject("data");
return data.toJavaObject(respClass);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String getTornaApiUrl() {
String value = ConfigKeyEnum.TORNA_SERVER_ADDR.getValue();
if (ObjectUtils.isEmpty(value)) {
throw new BizException("Torna服务器地址未配置");
}
return StringUtils.trimTrailingCharacter(value, '/') + "/api";
}
}

View File

@@ -0,0 +1,15 @@
package com.gitee.sop.adminbackend.service.doc.dto;
import lombok.Data;
/**
* @author 六如
*/
@Data
public class TornaModuleDTO {
private Long id;
private String name;
}

View File

@@ -4,7 +4,7 @@
"FixedHeader": true,
"HiddenSideBar": false,
"MultiTagsCache": false,
"KeepAlive": true,
"KeepAlive": false,
"Locale": "zh",
"Layout": "vertical",
"Theme": "light",

View File

@@ -0,0 +1,32 @@
import { createUrl, http } from "@/utils/http";
import type { Result } from "@/model";
// 后端请求接口
const apiUrl: any = createUrl({
addApp: "/doc/app/add",
listApp: "/doc/app/list"
});
interface DocApp {
id: number;
appName: string;
}
/**
* 接口管理
*/
export const api: any = {
/**
* 分页查询
*/
listApp(): Promise<Result<Array<DocApp>>> {
return http.get<Result<Array<DocApp>>, any>(apiUrl.listApp, {});
},
/**
* 新增
* @param data 表单内容
*/
addApp(data: object) {
return http.post<Result<any>, any>(apiUrl.addApp, { data });
}
};

View File

@@ -50,7 +50,7 @@
height: 100vh;
min-height: 100%;
margin-left: $sideBarWidth;
background: #f0f2f5;
//background: #f0f2f5;
/* main-content 属性动画 */
transition: margin-left var(--pure-transition-duration);

View File

@@ -0,0 +1,56 @@
import { ref } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { api } from "@/api/doc";
export const tabsData = ref<Array<any>>([
{
id: "",
appName: ""
}
]);
export const activeName = ref(0);
export const handleClick = data => {
const id = data.props.name;
loadContent(id);
};
export const handleAddApp = () => {
ElMessageBox.prompt("请输入Torna应用token", "添加应用", {
confirmButtonText: "确定",
cancelButtonText: "取消",
inputPattern: /\w+/,
inputErrorMessage: "请输入Torna应用token"
})
.then(({ value }) => {
const data = {
tornaToken: value
};
api.addApp(data).then(() => {
ElMessage.success("添加成功");
loadTabs(true);
});
})
.catch(() => {});
};
const loadTabs = showLast => {
api.listApp().then(resp => {
tabsData.value = resp.data;
const length = tabsData.value.length;
if (length > 0) {
const showData = showLast
? tabsData.value[length - 1]
: tabsData.value[0];
activeName.value = showData.id;
loadContent(showData.id);
}
});
};
const loadContent = id => {
console.log(id);
};
loadTabs(false);

View File

@@ -1,6 +1,23 @@
<script setup lang="ts">
const a = 1;
import { activeName, handleClick, handleAddApp, tabsData } from "./index";
</script>
<template>
<el-card>1</el-card>
<el-card shadow="never">
<el-tabs
v-show="tabsData.length > 0"
v-model="activeName"
type="card"
@tab-click="handleClick"
>
<el-tab-pane
v-for="item in tabsData"
:key="item.id"
:label="item.appName"
:name="item.id"
/>
</el-tabs>
</el-card>
<div v-show="tabsData.length === 0" style="margin: 20px">
<el-button type="primary" @click="handleAddApp">添加应用</el-button>
</div>
</template>