chore: 清理设置页多余文案并移除未使用的 License 模板
支付已迁至独立菜单;模板未接入发证流程,前后端入口一并下线。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
4c46088f4f
commit
76bba729f1
5 files changed
+9
-179
No files matched your search
@@ -2,7 +2,6 @@ package setting
|
||||
|
||||
import (
|
||||
"backend/internal/dto"
|
||||
"backend/internal/model"
|
||||
settingservice "backend/internal/service/setting"
|
||||
"net/http"
|
||||
"strconv"
|
||||
@@ -119,38 +118,3 @@ func (ctrl *SettingController) ClearAuditLogs(c *gin.Context) {
|
||||
}
|
||||
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 {
|
||||
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
|
||||
}
|
||||
@@ -246,9 +246,6 @@ func SetupRouter(db *gorm.DB, cfg *config.Config) *gin.Engine {
|
||||
register(system, "GET", "/waffo", settingController.GetWaffo)
|
||||
register(system, "PUT", "/waffo", settingController.UpdateWaffo)
|
||||
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
|
||||
|
||||
@@ -48,18 +48,6 @@ export async function testWaffoConnection(data) {
|
||||
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) {
|
||||
return request({ url: '/logs', method: 'get', params })
|
||||
}
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-row :gutter="16">
|
||||
<!-- 系统设置 -->
|
||||
<el-col :span="12">
|
||||
<el-card shadow="never">
|
||||
<el-card shadow="never" class="settings-card">
|
||||
<template #header>系统设置</template>
|
||||
<el-form :model="setting" label-width="130px" v-loading="loadingSetting">
|
||||
<el-form :model="setting" label-width="140px" v-loading="loadingSetting" style="max-width: 520px">
|
||||
<el-form-item label="系统名称"><el-input v-model="setting.system_name" /></el-form-item>
|
||||
<el-form-item label="默认有效期(天)"><el-input-number v-model="setting.default_duration" :min="0" /></el-form-item>
|
||||
<el-form-item label="默认最大激活数"><el-input-number v-model="setting.default_max_activations" :min="1" /></el-form-item>
|
||||
@@ -17,118 +14,33 @@
|
||||
</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>
|
||||
<template #footer>
|
||||
<el-button @click="tmplVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="saveTemplate">保存</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import {
|
||||
getSetting, updateSetting, getLicenseTemplates, saveLicenseTemplate, deleteLicenseTemplate,
|
||||
} from '@/api/setting'
|
||||
import { reactive, ref, onMounted } from 'vue'
|
||||
import { getSetting, updateSetting } from '@/api/setting'
|
||||
|
||||
const setting = reactive({})
|
||||
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() {
|
||||
loadingSetting.value = true
|
||||
try {
|
||||
const res = await getSetting()
|
||||
Object.assign(setting, res.data)
|
||||
} finally { loadingSetting.value = false }
|
||||
} finally {
|
||||
loadingSetting.value = false
|
||||
}
|
||||
}
|
||||
|
||||
async function saveSetting() {
|
||||
await updateSetting(setting)
|
||||
ElMessage.success('设置已保存')
|
||||
}
|
||||
|
||||
async function loadTemplates() {
|
||||
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()
|
||||
})
|
||||
onMounted(loadSetting)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.card-header { display: flex; justify-content: space-between; align-items: center; }
|
||||
.settings-card { max-width: 720px; }
|
||||
</style>
|
||||
Reference in new issue
Block a user