chore: 清理设置页多余文案并移除未使用的 License 模板

支付已迁至独立菜单;模板未接入发证流程,前后端入口一并下线。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Logan.LiandCursor committed 2026-08-12 22:01:02 +08:00
1 parent 4c46088f4f
commit 76bba729f1
5 files changed
+20 -190

No files matched your search

@@ -2,7 +2,6 @@ package setting
import ( import (
"backend/internal/dto" "backend/internal/dto"
"backend/internal/model"
settingservice "backend/internal/service/setting" settingservice "backend/internal/service/setting"
"net/http" "net/http"
"strconv" "strconv"
@@ -119,38 +118,3 @@ func (ctrl *SettingController) ClearAuditLogs(c *gin.Context) {
} }
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "日志已清空"}) c.JSON(http.StatusOK, gin.H{"code": 0, "message": "日志已清空"})
} }
// ListLicenseTemplates 查询 License 模板 // Logan.Li
func (ctrl *SettingController) ListLicenseTemplates(c *gin.Context) {
templates, err := ctrl.svc.ListLicenseTemplates()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"code": 500, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "data": templates})
}
// SaveLicenseTemplate 创建/更新 License 模板 // Logan.Li
func (ctrl *SettingController) SaveLicenseTemplate(c *gin.Context) {
var tmpl model.LicenseTemplate
if err := c.ShouldBindJSON(&tmpl); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"})
return
}
result, err := ctrl.svc.SaveLicenseTemplate(tmpl)
if err != nil {
c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "保存成功", "data": result})
}
// DeleteLicenseTemplate 删除 License 模板 // Logan.Li
func (ctrl *SettingController) DeleteLicenseTemplate(c *gin.Context) {
id, _ := strconv.ParseUint(c.Param("id"), 10, 32)
if err := ctrl.svc.DeleteLicenseTemplate(uint(id)); err != nil {
c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "删除成功"})
}
@@ -530,34 +530,3 @@ func (s *SettingService) ListAuditLogs(page, pageSize int, action, targetType st
func (s *SettingService) ClearAuditLogs() error { func (s *SettingService) ClearAuditLogs() error {
return s.db.Exec("DELETE FROM audit_logs").Error return s.db.Exec("DELETE FROM audit_logs").Error
} }
// ============ License 模板 ============
// ListLicenseTemplates 查询 License 模板 // Logan.Li
func (s *SettingService) ListLicenseTemplates() ([]model.LicenseTemplate, error) {
var templates []model.LicenseTemplate
s.db.Order("created_at DESC").Find(&templates)
return templates, nil
}
// SaveLicenseTemplate 创建/更新 License 模板 // Logan.Li
func (s *SettingService) SaveLicenseTemplate(tmpl model.LicenseTemplate) (*model.LicenseTemplate, error) {
if tmpl.Name == "" {
return nil, errors.New("模板名称不能为空")
}
if tmpl.ID > 0 {
if err := s.db.Save(&tmpl).Error; err != nil {
return nil, errors.New("更新模板失败")
}
} else {
if err := s.db.Create(&tmpl).Error; err != nil {
return nil, errors.New("创建模板失败")
}
}
return &tmpl, nil
}
// DeleteLicenseTemplate 删除 License 模板 // Logan.Li
func (s *SettingService) DeleteLicenseTemplate(id uint) error {
return s.db.Delete(&model.LicenseTemplate{}, id).Error
}
-3
View File
@@ -246,9 +246,6 @@ func SetupRouter(db *gorm.DB, cfg *config.Config) *gin.Engine {
register(system, "GET", "/waffo", settingController.GetWaffo) register(system, "GET", "/waffo", settingController.GetWaffo)
register(system, "PUT", "/waffo", settingController.UpdateWaffo) register(system, "PUT", "/waffo", settingController.UpdateWaffo)
register(system, "POST", "/waffo/test", settingController.DebugWaffo) register(system, "POST", "/waffo/test", settingController.DebugWaffo)
register(system, "GET", "/license-templates", settingController.ListLicenseTemplates)
register(system, "POST", "/license-templates", settingController.SaveLicenseTemplate)
register(system, "DELETE", "/license-templates/:id", settingController.DeleteLicenseTemplate)
} }
// 支付调试(与 settings/waffo/test 同一 handler) // Logan.Li // 支付调试(与 settings/waffo/test 同一 handler) // Logan.Li
-12
View File
@@ -48,18 +48,6 @@ export async function testWaffoConnection(data) {
throw lastError || new Error('调试接口不可用') throw lastError || new Error('调试接口不可用')
} }
export function getLicenseTemplates() {
return request({ url: '/settings/license-templates', method: 'get' })
}
export function saveLicenseTemplate(data) {
return request({ url: '/settings/license-templates', method: 'post', data })
}
export function deleteLicenseTemplate(id) {
return request({ url: `/settings/license-templates/${id}`, method: 'delete' })
}
export function getAuditLogs(params) { export function getAuditLogs(params) {
return request({ url: '/logs', method: 'get', params }) return request({ url: '/logs', method: 'get', params })
} }
+20 -108
View File
@@ -1,134 +1,46 @@
<template> <template>
<div> <div>
<el-row :gutter="16"> <el-card shadow="never" class="settings-card">
<!-- 系统设置 --> <template #header>系统设置</template>
<el-col :span="12"> <el-form :model="setting" label-width="140px" v-loading="loadingSetting" style="max-width: 520px">
<el-card shadow="never"> <el-form-item label="系统名称"><el-input v-model="setting.system_name" /></el-form-item>
<template #header>系统设置</template> <el-form-item label="默认有效期(天)"><el-input-number v-model="setting.default_duration" :min="0" /></el-form-item>
<el-form :model="setting" label-width="130px" v-loading="loadingSetting"> <el-form-item label="默认最大激活数"><el-input-number v-model="setting.default_max_activations" :min="1" /></el-form-item>
<el-form-item label="系统名称"><el-input v-model="setting.system_name" /></el-form-item> <el-form-item label="到期提醒(天)"><el-input-number v-model="setting.expire_reminder_days" :min="1" /></el-form-item>
<el-form-item label="默认有效期(天)"><el-input-number v-model="setting.default_duration" :min="0" /></el-form-item> <el-form-item label="API 限频"><el-input-number v-model="setting.api_rate_limit" :min="0" /></el-form-item>
<el-form-item label="默认最大激活数"><el-input-number v-model="setting.default_max_activations" :min="1" /></el-form-item> <el-form-item label="日志保留(天)"><el-input-number v-model="setting.log_retention_days" :min="0" /></el-form-item>
<el-form-item label="到期提醒(天)"><el-input-number v-model="setting.expire_reminder_days" :min="1" /></el-form-item> <el-form-item>
<el-form-item label="API 限频"><el-input-number v-model="setting.api_rate_limit" :min="0" /></el-form-item> <el-button type="primary" @click="saveSetting">保存设置</el-button>
<el-form-item label="日志保留(天)"><el-input-number v-model="setting.log_retention_days" :min="0" /></el-form-item> </el-form-item>
<el-form-item>
<el-button type="primary" @click="saveSetting">保存设置</el-button>
</el-form-item>
</el-form>
</el-card>
</el-col>
<!-- License 模板 -->
<el-col :span="12">
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>License 模板</span>
<el-button size="small" type="primary" @click="openTemplate">新增模板</el-button>
</div>
</template>
<el-table :data="templates" size="small" stripe>
<el-table-column prop="name" label="名称" min-width="120" />
<el-table-column label="时长" width="90">
<template #default="{ row }">{{ row.duration === 0 ? '永久' : row.duration + '天' }}</template>
</el-table-column>
<el-table-column prop="max_activations" label="激活数" width="80" />
<el-table-column prop="description" label="说明" min-width="120" show-overflow-tooltip />
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button size="small" link @click="editTemplate(row)">编辑</el-button>
<el-button size="small" link type="danger" @click="removeTemplate(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
<el-alert
type="info"
:closable="false"
show-icon
title="Waffo 支付配置已迁至「支付」菜单,可在侧边栏直接进入。"
style="margin-top: 16px"
/>
<!-- 模板对话框 -->
<el-dialog v-model="tmplVisible" :title="tmplForm.id ? '编辑模板' : '新增模板'" width="440px">
<el-form :model="tmplForm" label-width="90px">
<el-form-item label="名称"><el-input v-model="tmplForm.name" /></el-form-item>
<el-form-item label="时长(天)"><el-input-number v-model="tmplForm.duration" :min="0" /><span style="margin-left:8px;color:#909399">0=永久</span></el-form-item>
<el-form-item label="激活数"><el-input-number v-model="tmplForm.max_activations" :min="1" /></el-form-item>
<el-form-item label="说明"><el-input v-model="tmplForm.description" type="textarea" :rows="2" /></el-form-item>
</el-form> </el-form>
<template #footer> </el-card>
<el-button @click="tmplVisible = false">取消</el-button>
<el-button type="primary" @click="saveTemplate">保存</el-button>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, reactive, onMounted } from 'vue' import { reactive, ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { getSetting, updateSetting } from '@/api/setting'
import {
getSetting, updateSetting, getLicenseTemplates, saveLicenseTemplate, deleteLicenseTemplate,
} from '@/api/setting'
const setting = reactive({}) const setting = reactive({})
const loadingSetting = ref(false) const loadingSetting = ref(false)
const templates = ref([])
const tmplVisible = ref(false)
const tmplForm = reactive({ id: null, name: '', duration: 365, max_activations: 1, description: '' })
async function loadSetting() { async function loadSetting() {
loadingSetting.value = true loadingSetting.value = true
try { try {
const res = await getSetting() const res = await getSetting()
Object.assign(setting, res.data) Object.assign(setting, res.data)
} finally { loadingSetting.value = false } } finally {
loadingSetting.value = false
}
} }
async function saveSetting() { async function saveSetting() {
await updateSetting(setting) await updateSetting(setting)
ElMessage.success('设置已保存')
} }
async function loadTemplates() { onMounted(loadSetting)
const res = await getLicenseTemplates()
templates.value = res.data || []
}
function openTemplate() {
Object.assign(tmplForm, { id: null, name: '', duration: 365, max_activations: 1, description: '' })
tmplVisible.value = true
}
function editTemplate(row) {
Object.assign(tmplForm, row)
tmplVisible.value = true
}
async function saveTemplate() {
await saveLicenseTemplate(tmplForm)
tmplVisible.value = false
loadTemplates()
}
async function removeTemplate(row) {
await ElMessageBox.confirm(`确定删除模板「${row.name}」?`, '提示', { type: 'warning' })
await deleteLicenseTemplate(row.id)
loadTemplates()
}
onMounted(() => {
loadSetting()
loadTemplates()
})
</script> </script>
<style scoped> <style scoped>
.card-header { display: flex; justify-content: space-between; align-items: center; } .settings-card { max-width: 720px; }
</style> </style>