diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApplicationController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApplicationController.java index 4283e14..19e9530 100644 --- a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApplicationController.java +++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApplicationController.java @@ -1,6 +1,7 @@ package org.dromara.pangu.application.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.IdUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.log.annotation.Log; @@ -8,11 +9,15 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.pangu.application.domain.PgApiDict; import org.dromara.pangu.application.domain.PgApplication; +import org.dromara.pangu.application.service.IPgApiDictService; import org.dromara.pangu.application.service.IPgApplicationService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 第三方应用管理 * @@ -25,6 +30,7 @@ import org.springframework.web.bind.annotation.*; public class PgApplicationController extends BaseController { private final IPgApplicationService applicationService; + private final IPgApiDictService apiDictService; @SaCheckPermission("business:application:list") @GetMapping("/list") @@ -58,4 +64,31 @@ public class PgApplicationController extends BaseController { public R remove(@PathVariable Long[] appIds) { return toAjax(applicationService.deleteByIds(appIds)); } + + /** + * 重置应用密钥 + */ + @SaCheckPermission("business:application:edit") + @Log(title = "应用管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetSecret/{appId}") + public R resetSecret(@PathVariable Long appId) { + PgApplication app = applicationService.selectById(appId); + if (app == null) { + return R.fail("应用不存在"); + } + // 生成新的32位密钥 + String newSecret = IdUtil.fastSimpleUUID(); + app.setAppSecret(newSecret); + applicationService.update(app); + return R.ok(app); + } + + /** + * 获取API接口列表(用于授权选择) + */ + @SaCheckPermission("business:application:list") + @GetMapping("/apiList") + public R> apiList() { + return R.ok(apiDictService.selectList()); + } } diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApiDictService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApiDictService.java new file mode 100644 index 0000000..d93b85c --- /dev/null +++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApiDictService.java @@ -0,0 +1,18 @@ +package org.dromara.pangu.application.service; + +import org.dromara.pangu.application.domain.PgApiDict; + +import java.util.List; + +/** + * API接口字典 Service 接口 + * + * @author pangu + */ +public interface IPgApiDictService { + + /** + * 查询所有启用的API接口列表 + */ + List selectList(); +} diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApiDictServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApiDictServiceImpl.java new file mode 100644 index 0000000..57e205b --- /dev/null +++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApiDictServiceImpl.java @@ -0,0 +1,30 @@ +package org.dromara.pangu.application.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.pangu.application.domain.PgApiDict; +import org.dromara.pangu.application.mapper.PgApiDictMapper; +import org.dromara.pangu.application.service.IPgApiDictService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * API接口字典 Service 实现 + * + * @author pangu + */ +@RequiredArgsConstructor +@Service +public class PgApiDictServiceImpl implements IPgApiDictService { + + private final PgApiDictMapper baseMapper; + + @Override + public List selectList() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PgApiDict::getStatus, "0"); + lqw.orderByAsc(PgApiDict::getOrderNum); + return baseMapper.selectList(lqw); + } +} diff --git a/frontend/ruoyi-ui/src/api/pangu/application.js b/frontend/ruoyi-ui/src/api/pangu/application.js index a3b4510..65abf24 100644 --- a/frontend/ruoyi-ui/src/api/pangu/application.js +++ b/frontend/ruoyi-ui/src/api/pangu/application.js @@ -9,7 +9,7 @@ import request from '@/utils/request' */ export function getApplicationList(params) { return request({ - url: '/api/application/list', + url: '/business/application/list', method: 'get', params }) @@ -18,9 +18,9 @@ export function getApplicationList(params) { /** * 获取应用详情 */ -export function getApplicationDetail(id) { +export function getApplicationDetail(appId) { return request({ - url: `/api/application/${id}`, + url: `/business/application/${appId}`, method: 'get' }) } @@ -30,7 +30,7 @@ export function getApplicationDetail(id) { */ export function addApplication(data) { return request({ - url: '/api/application', + url: '/business/application', method: 'post', data }) @@ -41,7 +41,7 @@ export function addApplication(data) { */ export function updateApplication(data) { return request({ - url: '/api/application', + url: '/business/application', method: 'put', data }) @@ -50,9 +50,9 @@ export function updateApplication(data) { /** * 删除应用 */ -export function deleteApplication(id) { +export function deleteApplication(appId) { return request({ - url: `/api/application/${id}`, + url: `/business/application/${appId}`, method: 'delete' }) } @@ -60,10 +60,10 @@ export function deleteApplication(id) { /** * 重置应用密钥 */ -export function resetAppSecret(id) { +export function resetAppSecret(appId) { return request({ - url: `/api/application/${id}/resetSecret`, - method: 'post' + url: `/business/application/resetSecret/${appId}`, + method: 'put' }) } @@ -72,7 +72,7 @@ export function resetAppSecret(id) { */ export function getApiAuthOptions() { return request({ - url: '/api/application/authOptions', + url: '/business/application/apiList', method: 'get' }) } diff --git a/frontend/ruoyi-ui/src/views/business/application/components/AppDialog.vue b/frontend/ruoyi-ui/src/views/business/application/components/AppDialog.vue index 559d01f..005aace 100644 --- a/frontend/ruoyi-ui/src/views/business/application/components/AppDialog.vue +++ b/frontend/ruoyi-ui/src/views/business/application/components/AppDialog.vue @@ -19,18 +19,18 @@ - + - - + + @@ -44,14 +44,14 @@ inactive-text="停用" /> - - + + - {{ item.label }} + {{ item.apiName }} @@ -68,9 +68,9 @@ * 应用管理 - 新增/编辑弹窗 * @author pangu */ -import { addApplication, getApiAuthOptions, updateApplication } from '@/api/pangu/application' import { ElMessage } from 'element-plus' import { computed, nextTick, reactive, ref } from 'vue' +import request from '@/utils/request' const emit = defineEmits(['success']) @@ -81,14 +81,14 @@ const isEdit = ref(false) const apiAuthOptions = ref([]) const form = reactive({ - id: null, + appId: null, appName: '', appCode: '', - description: '', - contactName: '', + remark: '', + contactPerson: '', contactPhone: '', status: '0', - apiAuth: [] + apiCodes: [] }) const rules = { @@ -105,9 +105,9 @@ const dialogTitle = computed(() => isEdit.value ? '编辑应用' : '新增应用 // 加载接口授权选项 const loadAuthOptions = async () => { try { - const res = await getApiAuthOptions() + const res = await request.get('/business/application/apiList') if (res.code === 200) { - apiAuthOptions.value = res.data + apiAuthOptions.value = res.data || [] } } catch (error) { console.error('加载接口授权选项失败:', error) @@ -123,14 +123,14 @@ const open = (row = null) => { isEdit.value = true nextTick(() => { Object.assign(form, { - id: row.id, + appId: row.appId, appName: row.appName, appCode: row.appCode, - description: row.description || '', - contactName: row.contactName || '', + remark: row.remark || '', + contactPerson: row.contactPerson || '', contactPhone: row.contactPhone || '', status: row.status || '0', - apiAuth: row.apiAuth || [] + apiCodes: row.apiCodes || [] }) }) } else { @@ -144,8 +144,8 @@ const handleSubmit = async () => { await formRef.value.validate() submitLoading.value = true - const api = isEdit.value ? updateApplication : addApplication - const res = await api(form) + const method = isEdit.value ? 'put' : 'post' + const res = await request[method]('/business/application', form) if (res.code === 200) { ElMessage.success(isEdit.value ? '修改成功' : '新增成功') @@ -165,14 +165,14 @@ const handleSubmit = async () => { const handleClosed = () => { formRef.value?.resetFields() Object.assign(form, { - id: null, + appId: null, appName: '', appCode: '', - description: '', - contactName: '', + remark: '', + contactPerson: '', contactPhone: '', status: '0', - apiAuth: [] + apiCodes: [] }) } diff --git a/frontend/ruoyi-ui/src/views/business/application/components/SecretDialog.vue b/frontend/ruoyi-ui/src/views/business/application/components/SecretDialog.vue new file mode 100644 index 0000000..09f6abf --- /dev/null +++ b/frontend/ruoyi-ui/src/views/business/application/components/SecretDialog.vue @@ -0,0 +1,88 @@ + + + diff --git a/frontend/ruoyi-ui/src/views/business/application/index.vue b/frontend/ruoyi-ui/src/views/business/application/index.vue index a258400..917591c 100644 --- a/frontend/ruoyi-ui/src/views/business/application/index.vue +++ b/frontend/ruoyi-ui/src/views/business/application/index.vue @@ -33,14 +33,9 @@ - - - + + + -