Remove the variable association application

This commit is contained in:
2025-10-26 15:16:25 +08:00
parent d844403505
commit 1dd68022b7
6 changed files with 16 additions and 198 deletions

View File

@@ -541,17 +541,6 @@ func AppDeleteHandler(c *gin.Context) {
return return
} }
// 删除相关的变量记录
if err := tx.Where("app_uuid = ?", app.UUID).Delete(&models.Variable{}).Error; err != nil {
tx.Rollback()
logrus.WithError(err).Error("Failed to delete related variables")
c.JSON(http.StatusInternalServerError, gin.H{
"code": 1,
"msg": "删除相关变量失败",
})
return
}
// 删除应用 // 删除应用
if err := tx.Delete(&app).Error; err != nil { if err := tx.Delete(&app).Error; err != nil {
tx.Rollback() tx.Rollback()
@@ -576,7 +565,7 @@ func AppDeleteHandler(c *gin.Context) {
logrus.WithFields(logrus.Fields{ logrus.WithFields(logrus.Fields{
"app_id": app.ID, "app_id": app.ID,
"app_uuid": app.UUID, "app_uuid": app.UUID,
}).Info("Successfully deleted app and related data") }).Info("Successfully deleted app and related APIs")
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": 0, "code": 0,
@@ -1258,17 +1247,6 @@ func AppsBatchDeleteHandler(c *gin.Context) {
}) })
return return
} }
// 删除这些应用的所有相关变量
if err := tx.Where("app_uuid IN ?", appUUIDs).Delete(&models.Variable{}).Error; err != nil {
tx.Rollback()
logrus.WithError(err).Error("Failed to delete related variables")
c.JSON(http.StatusInternalServerError, gin.H{
"code": 1,
"msg": "删除相关变量失败",
})
return
}
} }
// 批量删除应用 // 批量删除应用
@@ -1295,7 +1273,7 @@ func AppsBatchDeleteHandler(c *gin.Context) {
logrus.WithFields(logrus.Fields{ logrus.WithFields(logrus.Fields{
"app_ids": req.IDs, "app_ids": req.IDs,
"app_uuids": appUUIDs, "app_uuids": appUUIDs,
}).Info("Successfully batch deleted apps and related data (APIs and variables)") }).Info("Successfully batch deleted apps and related APIs")
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": 0, "code": 0,

View File

@@ -38,9 +38,6 @@ func VariableListHandler(c *gin.Context) {
limit = 10 limit = 10
} }
// 获取应用UUID参数用于按应用筛选变量
appUUID := strings.TrimSpace(c.Query("app_uuid"))
// 获取搜索关键词参数(支持编号、别名、数据的综合搜索) // 获取搜索关键词参数(支持编号、别名、数据的综合搜索)
search := strings.TrimSpace(c.Query("search")) search := strings.TrimSpace(c.Query("search"))
@@ -58,11 +55,6 @@ func VariableListHandler(c *gin.Context) {
// 构建基础查询 // 构建基础查询
query := db.Model(&models.Variable{}) query := db.Model(&models.Variable{})
// 如果指定了应用UUID则按应用筛选
if appUUID != "" {
query = query.Where("app_uuid = ?", appUUID)
}
// 如果指定了搜索关键词,则在编号、别名、数据、备注中进行模糊搜索 // 如果指定了搜索关键词,则在编号、别名、数据、备注中进行模糊搜索
if search != "" { if search != "" {
query = query.Where("number LIKE ? OR alias LIKE ? OR data LIKE ? OR remark LIKE ?", query = query.Where("number LIKE ? OR alias LIKE ? OR data LIKE ? OR remark LIKE ?",
@@ -86,32 +78,11 @@ func VariableListHandler(c *gin.Context) {
return return
} }
// 获取关联的应用信息
var appUUIDs []string
for _, variable := range variables {
appUUIDs = append(appUUIDs, variable.AppUUID)
}
var apps []models.App
if len(appUUIDs) > 0 {
if err := db.Where("uuid IN ?", appUUIDs).Find(&apps).Error; err != nil {
logrus.WithError(err).Error("Failed to fetch related apps")
}
}
// 创建应用UUID到应用名称的映射
appMap := make(map[string]string)
for _, app := range apps {
appMap[app.UUID] = app.Name
}
// 构建响应数据 // 构建响应数据
type VariableResponse struct { type VariableResponse struct {
ID uint `json:"id"` ID uint `json:"id"`
UUID string `json:"uuid"` UUID string `json:"uuid"`
Number string `json:"number"` Number string `json:"number"`
AppUUID string `json:"app_uuid"`
AppName string `json:"app_name"`
Alias string `json:"alias"` Alias string `json:"alias"`
Data string `json:"data"` Data string `json:"data"`
Remark string `json:"remark"` Remark string `json:"remark"`
@@ -121,17 +92,10 @@ func VariableListHandler(c *gin.Context) {
var responseData []VariableResponse var responseData []VariableResponse
for _, variable := range variables { for _, variable := range variables {
appName := appMap[variable.AppUUID]
if appName == "" {
appName = "未知应用"
}
responseData = append(responseData, VariableResponse{ responseData = append(responseData, VariableResponse{
ID: variable.ID, ID: variable.ID,
UUID: variable.UUID, UUID: variable.UUID,
Number: variable.Number, Number: variable.Number,
AppUUID: variable.AppUUID,
AppName: appName,
Alias: variable.Alias, Alias: variable.Alias,
Data: variable.Data, Data: variable.Data,
Remark: variable.Remark, Remark: variable.Remark,
@@ -153,7 +117,6 @@ func VariableListHandler(c *gin.Context) {
// VariableCreateHandler 新增变量API处理器 // VariableCreateHandler 新增变量API处理器
func VariableCreateHandler(c *gin.Context) { func VariableCreateHandler(c *gin.Context) {
var req struct { var req struct {
AppUUID string `json:"app_uuid"`
Alias string `json:"alias"` Alias string `json:"alias"`
Data string `json:"data"` Data string `json:"data"`
Remark string `json:"remark"` Remark string `json:"remark"`
@@ -165,7 +128,6 @@ func VariableCreateHandler(c *gin.Context) {
// 验证必填字段 // 验证必填字段
if !variableBaseController.ValidateRequired(c, map[string]interface{}{ if !variableBaseController.ValidateRequired(c, map[string]interface{}{
"应用UUID": req.AppUUID,
"变量别名": req.Alias, "变量别名": req.Alias,
}) { }) {
return return
@@ -183,16 +145,8 @@ func VariableCreateHandler(c *gin.Context) {
return return
} }
// 验证应用是否存在
var app models.App
if err := db.Where("uuid = ?", req.AppUUID).First(&app).Error; err != nil {
variableBaseController.HandleValidationError(c, "应用不存在")
return
}
// 创建变量 // 创建变量
variable := models.Variable{ variable := models.Variable{
AppUUID: strings.TrimSpace(req.AppUUID),
Alias: strings.TrimSpace(req.Alias), Alias: strings.TrimSpace(req.Alias),
Data: req.Data, Data: req.Data,
Remark: strings.TrimSpace(req.Remark), Remark: strings.TrimSpace(req.Remark),
@@ -211,7 +165,6 @@ func VariableCreateHandler(c *gin.Context) {
func VariableUpdateHandler(c *gin.Context) { func VariableUpdateHandler(c *gin.Context) {
var req struct { var req struct {
UUID string `json:"uuid"` UUID string `json:"uuid"`
AppUUID string `json:"app_uuid"`
Alias string `json:"alias"` Alias string `json:"alias"`
Data string `json:"data"` Data string `json:"data"`
Remark string `json:"remark"` Remark string `json:"remark"`
@@ -224,7 +177,6 @@ func VariableUpdateHandler(c *gin.Context) {
// 验证必填字段 // 验证必填字段
if !variableBaseController.ValidateRequired(c, map[string]interface{}{ if !variableBaseController.ValidateRequired(c, map[string]interface{}{
"变量UUID": req.UUID, "变量UUID": req.UUID,
"应用UUID": req.AppUUID,
"变量别名": req.Alias, "变量别名": req.Alias,
}) { }) {
return return
@@ -242,13 +194,6 @@ func VariableUpdateHandler(c *gin.Context) {
return return
} }
// 验证应用是否存在
var app models.App
if err := db.Where("uuid = ?", req.AppUUID).First(&app).Error; err != nil {
variableBaseController.HandleValidationError(c, "应用不存在")
return
}
// 通过uuid字段查找变量 // 通过uuid字段查找变量
var variable models.Variable var variable models.Variable
if err := db.Where("uuid = ?", strings.TrimSpace(req.UUID)).First(&variable).Error; err != nil { if err := db.Where("uuid = ?", strings.TrimSpace(req.UUID)).First(&variable).Error; err != nil {
@@ -256,8 +201,7 @@ func VariableUpdateHandler(c *gin.Context) {
return return
} }
// 更新字段 // 更新字段(不允许修改应用关联)
variable.AppUUID = strings.TrimSpace(req.AppUUID)
variable.Alias = strings.TrimSpace(req.Alias) variable.Alias = strings.TrimSpace(req.Alias)
variable.Data = req.Data variable.Data = req.Data
variable.Remark = strings.TrimSpace(req.Remark) variable.Remark = strings.TrimSpace(req.Remark)
@@ -334,20 +278,3 @@ func VariablesBatchDeleteHandler(c *gin.Context) {
variableBaseController.HandleSuccess(c, "批量删除成功", nil) variableBaseController.HandleSuccess(c, "批量删除成功", nil)
} }
// VariableGetAppsHandler 获取应用列表(用于筛选下拉框)
func VariableGetAppsHandler(c *gin.Context) {
db, ok := variableBaseController.GetDB(c)
if !ok {
return
}
var apps []models.App
if err := db.Select("uuid, name").Find(&apps).Error; err != nil {
logrus.WithError(err).Error("Failed to fetch apps")
variableBaseController.HandleInternalError(c, "获取应用列表失败", err)
return
}
variableBaseController.HandleSuccess(c, "success", apps)
}

View File

@@ -26,9 +26,6 @@ type Variable struct {
// Number变量编号时间戳+6位随机数字格式 // Number变量编号时间戳+6位随机数字格式
Number string `gorm:"uniqueIndex;size:20;not null;comment:变量编号,时间戳+6位随机数字格式" json:"number"` Number string `gorm:"uniqueIndex;size:20;not null;comment:变量编号,时间戳+6位随机数字格式" json:"number"`
// AppUUID关联的应用UUID
AppUUID string `gorm:"size:36;not null;index;comment:关联的应用UUID" json:"app_uuid"`
// Alias变量别名便于识别和管理 // Alias变量别名便于识别和管理
Alias string `gorm:"size:100;not null;comment:变量别名" json:"alias"` Alias string `gorm:"size:100;not null;comment:变量别名" json:"alias"`

View File

@@ -102,7 +102,6 @@ func RegisterAdminRoutes(router *gin.Engine) {
// 变量管理API // 变量管理API
router.GET("/admin/variable/list", adminctl.AdminAuthRequired(), adminctl.VariableListHandler) router.GET("/admin/variable/list", adminctl.AdminAuthRequired(), adminctl.VariableListHandler)
router.GET("/admin/variable/apps", adminctl.AdminAuthRequired(), adminctl.VariableGetAppsHandler)
router.POST("/admin/variable/create", adminctl.AdminAuthRequired(), adminctl.VariableCreateHandler) router.POST("/admin/variable/create", adminctl.AdminAuthRequired(), adminctl.VariableCreateHandler)
router.POST("/admin/variable/update", adminctl.AdminAuthRequired(), adminctl.VariableUpdateHandler) router.POST("/admin/variable/update", adminctl.AdminAuthRequired(), adminctl.VariableUpdateHandler)
router.POST("/admin/variable/delete", adminctl.AdminAuthRequired(), adminctl.VariableDeleteHandler) router.POST("/admin/variable/delete", adminctl.AdminAuthRequired(), adminctl.VariableDeleteHandler)

View File

@@ -120,7 +120,6 @@
$('#total-variables').text(data.total_variables || 0); $('#total-variables').text(data.total_variables || 0);
} }
}).fail(() => { }).fail(() => {
console.log('获取应用统计失败');
// 显示默认值 // 显示默认值
$('#total-apps').text('0'); $('#total-apps').text('0');
$('#enabled-apps').text('0'); $('#enabled-apps').text('0');

View File

@@ -12,14 +12,6 @@
<div style="padding: 20px;"> <div style="padding: 20px;">
<form class="layui-form layui-form-pane" id="variableFilterForm" lay-filter="variableFilterForm"> <form class="layui-form layui-form-pane" id="variableFilterForm" lay-filter="variableFilterForm">
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">应用</label>
<div class="layui-input-inline">
<select name="app_uuid" lay-filter="appSelect">
<option value="">请选择应用</option>
</select>
</div>
</div>
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">搜索</label> <label class="layui-form-label">搜索</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
@@ -52,14 +44,6 @@
<div id="variableFormLayer" style="display:none;padding:20px"> <div id="variableFormLayer" style="display:none;padding:20px">
<form class="layui-form layui-form-pane" lay-filter="variableForm" id="variableForm"> <form class="layui-form layui-form-pane" lay-filter="variableForm" id="variableForm">
<input type="hidden" name="uuid"> <input type="hidden" name="uuid">
<div class="layui-form-item">
<label class="layui-form-label">应用选择</label>
<div class="layui-input-block">
<select name="app_uuid" lay-verify="required" lay-filter="formAppSelect">
<option value="">请选择应用</option>
</select>
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">变量别名</label> <label class="layui-form-label">变量别名</label>
<div class="layui-input-block"> <div class="layui-input-block">
@@ -116,29 +100,7 @@
return new Date(dateStr).toLocaleString(); return new Date(dateStr).toLocaleString();
} }
// 加载应用列表到下拉框
function loadApps() {
$.ajax({
url: '/admin/variable/apps',
type: 'GET',
success: function (res) {
if (res.code === 0 && res.data) {
let options = '<option value="">请选择应用</option>';
res.data.forEach(function (app) {
options += '<option value="' + app.uuid + '">' + app.name + '</option>';
});
$('select[name="app_uuid"]').html(options);
form.render('select');
}
},
error: function () {
layer.msg('加载应用列表失败', { icon: 2 });
}
});
}
// 初始化加载应用列表
loadApps();
// 渲染表格 // 渲染表格
const variablesTable = table.render({ const variablesTable = table.render({
@@ -168,7 +130,6 @@
cols: [[ cols: [[
{ type: 'checkbox', width: 50 }, { type: 'checkbox', width: 50 },
{ field: 'id', title: 'ID', width: 80, sort: true }, { field: 'id', title: 'ID', width: 80, sort: true },
{ field: 'app_name', title: '应用名称', minWidth: 120 },
{ field: 'number', title: '变量编号', width: 180 }, { field: 'number', title: '变量编号', width: 180 },
{ field: 'alias', title: '变量别名', minWidth: 150 }, { field: 'alias', title: '变量别名', minWidth: 150 },
{ {
@@ -207,24 +168,10 @@
]] ]]
}); });
// 监听应用选择变化
form.on('select(appSelect)', function (data) {
variablesTable.reload({
where: {
app_uuid: data.value,
search: $('input[name="search"]').val()
},
page: {
curr: 1
}
});
});
// 搜索功能 // 搜索功能
$('#btnSearchVariables').on('click', function () { $('#btnSearchVariables').on('click', function () {
variablesTable.reload({ variablesTable.reload({
where: { where: {
app_uuid: $('select[name="app_uuid"]').val(),
search: $('input[name="search"]').val() search: $('input[name="search"]').val()
}, },
page: { page: {
@@ -247,18 +194,14 @@
// 新增变量 // 新增变量
$('#btnAddVariable').on('click', function () { $('#btnAddVariable').on('click', function () {
console.log('新增变量按钮被点击');
$('#variableForm')[0].reset(); $('#variableForm')[0].reset();
$('input[name="id"]').val(''); $('input[name="id"]').val('');
// 重新加载应用列表到表单中
loadApps();
layer.open({ layer.open({
type: 1, type: 1,
title: '新增变量', title: '新增变量',
content: $('#variableFormLayer'), content: $('#variableFormLayer'),
area: ['500px', '460px'], area: ['500px', '435px'],
btn: ['创建', '取消'], btn: ['创建', '取消'],
yes: function (index, layero) { yes: function (index, layero) {
// 手动收集表单数据 // 手动收集表单数据
@@ -271,13 +214,7 @@
} }
}); });
console.log('新增变量 - 收集到的表单数据:', formData);
// 验证必填字段 // 验证必填字段
if (!formData.app_uuid || formData.app_uuid.trim() === '') {
layer.msg('应用UUID不能为空', { icon: 2 });
return;
}
if (!formData.alias || formData.alias.trim() === '') { if (!formData.alias || formData.alias.trim() === '') {
layer.msg('请输入变量别名', { icon: 2 }); layer.msg('请输入变量别名', { icon: 2 });
return; return;
@@ -287,8 +224,6 @@
return; return;
} }
console.log('新增变量 - 发送的JSON数据:', JSON.stringify(formData));
$.ajax({ $.ajax({
url: '/admin/variable/create', url: '/admin/variable/create',
type: 'POST', type: 'POST',
@@ -357,17 +292,8 @@
if (obj.event === 'edit') { if (obj.event === 'edit') {
// 编辑 // 编辑
console.log('编辑按钮被点击', data);
$('#variableForm')[0].reset(); $('#variableForm')[0].reset();
$('input[name="uuid"]').val(data.uuid); $('input[name="uuid"]').val(data.uuid);
// 重新加载应用列表,然后设置选中值
loadApps();
setTimeout(function () {
$('select[name="app_uuid"]').val(data.app_uuid);
form.render('select');
}, 100);
$('input[name="alias"]').val(data.alias); $('input[name="alias"]').val(data.alias);
$('textarea[name="data"]').val(data.data); $('textarea[name="data"]').val(data.data);
$('textarea[name="remark"]').val(data.remark); $('textarea[name="remark"]').val(data.remark);
@@ -376,7 +302,7 @@
type: 1, type: 1,
title: '编辑变量', title: '编辑变量',
content: $('#variableFormLayer'), content: $('#variableFormLayer'),
area: ['500px', '460px'], area: ['500px', '435px'],
btn: ['保存', '取消'], btn: ['保存', '取消'],
yes: function (index, layero) { yes: function (index, layero) {
// 手动收集表单数据 // 手动收集表单数据
@@ -389,13 +315,7 @@
} }
}); });
console.log('编辑变量 - 收集到的表单数据:', formData);
// 验证必填字段 // 验证必填字段
if (!formData.app_uuid || formData.app_uuid.trim() === '') {
layer.msg('应用UUID不能为空', { icon: 2 });
return;
}
if (!formData.alias || formData.alias.trim() === '') { if (!formData.alias || formData.alias.trim() === '') {
layer.msg('请输入变量别名', { icon: 2 }); layer.msg('请输入变量别名', { icon: 2 });
return; return;
@@ -405,8 +325,6 @@
return; return;
} }
console.log('编辑变量 - 发送的JSON数据:', JSON.stringify(formData));
$.ajax({ $.ajax({
url: '/admin/variable/update', url: '/admin/variable/update',
type: 'POST', type: 'POST',