ソースを参照

前端页面 (sysConfig.vue):

列表显示:第48-54行显示状态标签(启用/禁用)
编辑表单:第104-109行可以修改状态
状态筛选:支持按状态过滤配置项
urbanu 1 ヶ月 前
コミット
0cd1a41b65
2 ファイル変更56 行追加20 行削除
  1. 42 19
      src/views/daytask/content/banner.vue
  2. 14 1
      src/views/system/menuMange/index.vue

+ 42 - 19
src/views/daytask/content/banner.vue

@@ -23,12 +23,12 @@
             <el-tag>{{ positionMap[row.position] || row.position }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="link_type" label="链接类型" align="center" width="100">
+        <el-table-column prop="linkType" label="链接类型" align="center" width="100">
           <template #default="{ row }">
-            {{ linkTypeMap[row.link_type] || row.link_type }}
+            {{ linkTypeMap[row.linkType] || row.linkType }}
           </template>
         </el-table-column>
-        <el-table-column prop="link_url" label="链接地址" align="center" min-width="200" show-overflow-tooltip />
+        <el-table-column prop="linkUrl" label="链接地址" align="center" min-width="200" show-overflow-tooltip />
         <el-table-column prop="sort" label="排序" align="center" width="70" />
         <el-table-column prop="status" label="状态" align="center" width="80">
           <template #default="{ row }">
@@ -37,9 +37,9 @@
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="created_at" label="创建时间" align="center" min-width="160">
+        <el-table-column prop="createdAt" label="创建时间" align="center" min-width="160">
           <template #default="{ row }">
-            <span v-if="row.created_at">{{ formatUnix(row.created_at) }}</span>
+            <span v-if="row.createdAt">{{ formatUnix(row.createdAt) }}</span>
           </template>
         </el-table-column>
         <el-table-column fixed="right" label="操作" align="center" width="150">
@@ -70,15 +70,16 @@
           <el-option label="我的页" value="mine" />
         </el-select>
       </el-form-item>
-      <el-form-item label="链接类型" prop="link_type">
-        <el-select v-model="formData.link_type" placeholder="请选择链接类型" style="width: 100%">
-          <el-option label="无链接" value="none" />
-          <el-option label="内部页面" value="page" />
-          <el-option label="外部链接" value="url" />
+      <el-form-item label="链接类型" prop="linkType">
+        <el-select v-model="formData.linkType" placeholder="请选择链接类型" style="width: 100%">
+          <el-option label="无链接" :value="0" />
+          <el-option label="内部页面" :value="1" />
+          <el-option label="外部链接" :value="2" />
+          <el-option label="任务详情" :value="3" />
         </el-select>
       </el-form-item>
-      <el-form-item v-if="formData.link_type !== 'none'" label="链接地址" prop="link_url">
-        <el-input v-model="formData.link_url" placeholder="请输入链接地址" />
+      <el-form-item v-if="formData.linkType !== 0" label="链接地址" prop="linkUrl">
+        <el-input v-model="formData.linkUrl" placeholder="请输入链接地址" />
       </el-form-item>
       <el-form-item label="排序" prop="sort">
         <el-input-number v-model="formData.sort" :min="0" style="width: 100%" />
@@ -109,7 +110,7 @@ const tableData = ref([]);
 const pageable = reactive({ pageNum: 1, pageSize: 30, total: 0 });
 
 const positionMap = { home: "首页轮播", task: "任务页", mine: "我的页" };
-const linkTypeMap = { none: "无链接", page: "内部页面", url: "外部链接" };
+const linkTypeMap = { 0: "无链接", 1: "内部页面", 2: "外部链接", 3: "任务详情" };
 
 const dialogVisible = ref(false);
 const isEdit = ref(false);
@@ -120,8 +121,8 @@ const formData = ref({
   title: "",
   image: "",
   position: "home",
-  link_type: "none",
-  link_url: "",
+  linkType: 0,
+  linkUrl: "",
   sort: 0,
   status: 1
 });
@@ -170,15 +171,25 @@ const handleCurrent = (data) => {
 const openDialog = (row) => {
   isEdit.value = !!row;
   if (row) {
-    formData.value = { ...row };
+    // 只复制表单需要的字段,避免发送多余字段给后端
+    formData.value = {
+      id: row.id,
+      title: row.title || "",
+      image: row.image || "",
+      position: row.position || "home",
+      linkType: row.linkType ?? 0,
+      linkUrl: row.linkUrl || "",
+      sort: row.sort ?? 0,
+      status: row.status ?? 1
+    };
   } else {
     formData.value = {
       id: null,
       title: "",
       image: "",
       position: "home",
-      link_type: "none",
-      link_url: "",
+      linkType: 0,
+      linkUrl: "",
       sort: 0,
       status: 1
     };
@@ -196,7 +207,19 @@ const handleSubmit = async () => {
     submitLoading.value = true;
     try {
       const api = isEdit.value ? updateBanner : createBanner;
-      const res = await api(formData.value);
+      // 后端期望 { id, data: {...} } 格式,字段名需要转为 snake_case
+      const { id } = formData.value;
+      const data = {
+        title: formData.value.title,
+        image: formData.value.image,
+        position: formData.value.position,
+        link_type: formData.value.linkType,
+        link_url: formData.value.linkUrl,
+        sort: formData.value.sort,
+        status: formData.value.status
+      };
+      const params = isEdit.value ? { id, data } : { data };
+      const res = await api(params);
       if (res.code === 200) {
         ElNotification.success(isEdit.value ? "更新成功" : "创建成功");
         dialogVisible.value = false;

+ 14 - 1
src/views/system/menuMange/index.vue

@@ -81,6 +81,12 @@
               <el-radio-button :value="false" label="否" />
             </el-radio-group>
           </el-form-item>
+          <el-form-item label="是否启用" prop="enable">
+            <el-radio-group v-model="drawerFrom.enable" size="small">
+              <el-radio-button :value="true" label="启用" />
+              <el-radio-button :value="false" label="禁用" />
+            </el-radio-group>
+          </el-form-item>
 
         </el-form>
       </div>
@@ -177,6 +183,7 @@ const drawerFrom = ref({
   router: "",//  string  必需
   sort: "",//  integer 排序
   isHide: false,//  boolean 是否隐藏菜单
+  enable: true,//  boolean 是否启用
   component: "", //页面路径
 
 })
@@ -202,6 +209,7 @@ const editUser = (type, row) => {
         router: "",//  string  必需
         sort: 0,//  integer
         isHide: false,
+        enable: true,
         component: "",
         isKeepAlive: true
       }
@@ -217,6 +225,7 @@ const editUser = (type, row) => {
       drawerFrom.value.isKeepAlive = true
       drawerFrom.value.sort = row.sort || 0
       drawerFrom.value.isHide = row.meta?.isHide || false
+      drawerFrom.value.enable = row.enable !== undefined ? row.enable : true
       drawerTitle.value = "新增菜单"
       break;
     case 2:
@@ -230,6 +239,7 @@ const editUser = (type, row) => {
       drawerFrom.value.isKeepAlive = true
       drawerFrom.value.sort = row.sort || 0
       drawerFrom.value.isHide = row.meta?.isHide || false
+      drawerFrom.value.enable = row.enable !== undefined ? row.enable : true
       drawerTitle.value = "修改菜单"
       break;
   }
@@ -257,7 +267,7 @@ const confrimForm = (formEl) => {
   formEl.validate((valid) => {
     if (!valid) return
     let params = {}
-    let {parentId, id, parentName, name, icon, router, component, sort, isHide, isKeepAlive} = drawerFrom.value
+    let {parentId, id, parentName, name, icon, router, component, sort, isHide, enable, isKeepAlive} = drawerFrom.value
     switch (drawerType.value) {
       case 0:
         params = {
@@ -268,6 +278,7 @@ const confrimForm = (formEl) => {
           component,
           sort: +sort,
           isHide,
+          enable,
           isKeepAlive
         }
         sysMenuCreate(params).then(resp => {
@@ -291,6 +302,7 @@ const confrimForm = (formEl) => {
           component,
           sort: +sort,
           isHide,
+          enable,
           isKeepAlive
         }
         sysMenuCreate(params).then(resp => {
@@ -316,6 +328,7 @@ const confrimForm = (formEl) => {
           component,
           sort: +sort,
           isHide: isHide,
+          enable: enable,
           isKeepAlive
         }
         sysMenuSet(params).then(resp => {