From 08e9a67dd679f311e79a27b04cd0c53a30b4bccf Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 04 六月 2026 18:33:22 +0800
Subject: [PATCH] aaa

---
 company_admin/src/views/business/category.vue |  238 +++++++++++++++++++++++++++-------------------------------
 1 files changed, 111 insertions(+), 127 deletions(-)

diff --git a/company_admin/src/views/business/category.vue b/company_admin/src/views/business/category.vue
index 4c654a9..0971b55 100644
--- a/company_admin/src/views/business/category.vue
+++ b/company_admin/src/views/business/category.vue
@@ -1,169 +1,153 @@
 <template>
   <TableLayout :permissions="['business:category:query']">
-    <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
       <el-form-item label="绫诲埆鍚嶇О" prop="name">
-        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ョ被鍒悕绉�" @keypress.enter.native="search"></el-input>
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ョ被鍒悕绉�" @keypress.enter.native="loadTree"></el-input>
       </el-form-item>
       <el-form-item label="绫诲瀷" prop="type">
         <el-select v-model="searchForm.type" clearable placeholder="璇烽�夋嫨">
-          <el-option
-            v-for="item in typeList"
-            :key="item.id"
-            :label="item.name"
-            :value="item.id">
-          </el-option>
+          <el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
         </el-select>
       </el-form-item>
       <section>
-        <el-button type="primary" @click="search">鎼滅储</el-button>
-        <!-- <el-button type="primary" :loading="isWorking.export" v-permissions="['business:category:exportExcel']" @click="exportExcel">瀵煎嚭</el-button> -->
-        <el-button @click="reset">閲嶇疆</el-button>
+        <el-button type="primary" @click="loadTree">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
       </section>
     </el-form>
-    <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓绫诲埆')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓绫诲埆')" icon="el-icon-plus">鏂板缓涓�绾х被鍒�</el-button></li>
       </ul>
       <el-table
-        v-loading="isWorking.search"
-        :data="tableData.list"
+        v-loading="loading"
+        :data="tableData"
+        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+        row-key="id"
         stripe
         border
+        default-expand-all
         :header-cell-style="rowStyle"
         :cell-style="rowStyle"
       >
-        <el-table-column prop="imgurl" label="鍥炬爣" min-width="100px">
+        <el-table-column prop="imgurl" label="鍥炬爣" min-width="90px">
           <template slot-scope="{row}">
-              <el-image
-              v-if="row.imgurl"
-              style="width: 70px; height: 70px"
-              :src="row.prefixUrl + row.imgurl"
-              :preview-src-list="[row.prefixUrl + row.imgurl]"
-              fit="cover"></el-image>
+            <el-image v-if="row.imgurl" style="width: 50px; height: 50px" :src="categoryImgUrl(row)" fit="cover"></el-image>
           </template>
         </el-table-column>
-        <el-table-column prop="name" label="绫诲埆鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="categoryName" label="绫诲瀷" min-width="100px">
+        <el-table-column prop="name" label="绫诲埆鍚嶇О" min-width="140px">
           <template slot-scope="{row}">
-            <span v-if="row.type == 0">鑷畾涔�</span>
-            <span v-else>绯荤粺</span>
+            <span v-if="row.parentId">鈹� {{ row.name }}</span>
+            <span v-else>{{ row.name }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="sortnum" label="鎺掑簭鐮�(鍗囧簭)" min-width="100px"></el-table-column>
-        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+        <el-table-column label="绾у埆" min-width="80px">
+          <template slot-scope="{row}">{{ row.parentId ? '浜岀骇绫诲埆' : '涓�绾х被鍒�' }}</template>
+        </el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="80px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="140px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="80px">
           <template slot-scope="{row}">
-              <el-switch
-                  v-model="row.status"
-                  @change="changeStatus(row)"
-                  active-color="#13ce66"
-                  inactive-color="#ff4949"
-                  :active-value="0"
-                  :inactive-value="1">
-              </el-switch>
+            <el-switch v-model="row.status" @change="changeStatus(row)" :active-value="0" :inactive-value="1" />
           </template>
         </el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:category:update', 'business:category:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
+        <el-table-column label="鎿嶄綔" min-width="220px" fixed="right">
           <template slot-scope="{row}">
-            <el-button type="text" @click="edit(row.id)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+            <template v-if="!row.parentId">
+              <el-button type="text" @click="edit(row.id)" v-permissions="['business:category:update']">缂栬緫</el-button>
+              <el-button type="text" @click="$refs.operaSubCategoryWindow.open('鏂板缓瀛愮被鍒�', row)" v-permissions="['business:category:create']">鏂板瀛愮被鍒�</el-button>
+              <el-button type="text" class="btn-delete" icon="el-icon-delete" @click="deleteParent(row)" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+            </template>
+            <template v-else>
+              <el-button type="text" @click="$refs.operaSubCategoryWindow.open('缂栬緫瀛愮被鍒�', { id: row.parentId }, row)" v-permissions="['business:category:update']">缂栬緫</el-button>
+              <el-button type="text" class="btn-delete" icon="el-icon-delete" @click="deleteSub(row)" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+            </template>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
-      </pagination>
     </template>
-    <!-- 鏂板缓/淇敼 -->
-    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
+    <OperaCategoryWindow ref="operaCategoryWindow" @success="loadTree"/>
+    <OperaSubCategoryWindow ref="operaSubCategoryWindow" @success="loadTree"/>
   </TableLayout>
 </template>
-  
+
 <script>
-  import BaseTable from '@/components/base/BaseTable'
-  import TableLayout from '@/layouts/TableLayout'
-  import Pagination from '@/components/common/Pagination'
-  import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
-  import { queryById, updateDisableById } from '@/api/business/category.js'
-  export default {
-    name: 'Category',
-    extends: BaseTable,
-    components: { TableLayout, Pagination, OperaCategoryWindow },
-    data () {
-      return {
-        // 鎼滅储
-        searchForm: {
-          name: '',
-          type: ''
-        },
-        typeList: [
-          { name: '鑷畾涔�', id: 0 },
-          { name: '绯荤粺', id: 1 }
-        ]
-      }
+import TableLayout from '@/layouts/TableLayout'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import OperaSubCategoryWindow from '@/components/business/OperaSubCategoryWindow'
+import { fetchTree, queryById, updateDisableById, deleteById, deleteSub as deleteSubApi } from '@/api/business/category.js'
+
+export default {
+  name: 'Category',
+  components: { TableLayout, OperaCategoryWindow, OperaSubCategoryWindow },
+  data () {
+    return {
+      loading: false,
+      tableData: [],
+      searchForm: { name: '', type: '' },
+      typeList: [{ name: '鑷畾涔�', id: 0 }, { name: '绯荤粺', id: 1 }]
+    }
+  },
+  created () {
+    this.loadTree()
+  },
+  methods: {
+    rowStyle () { return 'text-align:center' },
+    categoryImgUrl (row) {
+      if (!row.imgurl) return ''
+      if (row.imgurl.indexOf('http') === 0) return row.imgurl
+      return (row.prefixUrl || '') + row.imgurl
     },
-    created () {
-      this.config({
-        module: '绫诲埆',
-        api: '/business/category',
-        'field.id': 'id',
-        'field.main': 'name'
-      })
-      this.search()
-    },
-    methods: {
-      rowStyle() {
-      return "text-align:center";
-    },
-      changeStatus(item) {
-        updateDisableById({
-          id: item.id,
-          status: item.status
-        }).then(res => {
-          this.$tip.apiSuccess('鏇存柊鎴愬姛')
-        }).finally(() => {
-          // this.search()
+    loadTree () {
+      this.loading = true
+      fetchTree(this.searchForm).then(res => {
+        this.tableData = (res || []).map(p => {
+          const prefixUrl = p.prefixUrl || ''
+          const children = (p.children || []).map(c => ({
+            ...c,
+            parentId: c.parentId != null ? c.parentId : p.id,
+            prefixUrl: c.prefixUrl || prefixUrl
+          }))
+          return { ...p, children }
         })
-      },
-      edit(id) {
-        queryById(id)
-          .then(res => {
-            let obj = {
-              id,
-              name: res.name,
-              attrFirst: res.attrFirst,
-              attrFirstList: res.attrFirstList,
-              attrSecond: res.attrSecond,
-              attrSecondList: res.attrSecondList,
-              sortnum: res.sortnum,
-              paramList: res.paramList,
-              imgurl: res.imgurl,
-              budgetList: res.budgetList.length > 0 ? res.budgetList : [{ maxamount: '', minamount: '' }],
-              type: res.type,
-              platCateId: res.platCateId,
-              tableData: res.paramList.map(item => {
-                return {
-                  id: item.id,
-                  name: item.name,
-                  isselect: item.isselect,
-                  isshow: item.isshow
-                }
-              }),
-              fileList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : []
-            }
-            this.$refs.operaCategoryWindow.open('缂栬緫绫诲埆', obj)
-          })
-      }
+      }).finally(() => { this.loading = false })
+    },
+    resetSearch () {
+      this.searchForm = { name: '', type: '' }
+      this.loadTree()
+    },
+    changeStatus (item) {
+      updateDisableById({ id: item.id, status: item.status }).then(() => {
+        this.$message.success('鏇存柊鎴愬姛')
+      })
+    },
+    edit (id) {
+      queryById(id).then(res => {
+        const obj = {
+          id, name: res.name, sortnum: res.sortnum, paramList: res.paramList,
+          imgurl: res.imgurl, budgetList: res.budgetList.length > 0 ? res.budgetList : [{ maxamount: '', minamount: '' }],
+          type: res.type, platCateId: res.platCateId,
+          tableData: res.paramList.map(item => ({ id: item.id, name: item.name, isselect: item.isselect, isshow: item.isshow })),
+          fileList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : []
+        }
+        this.$refs.operaCategoryWindow.open('缂栬緫绫诲埆', obj)
+      })
+    },
+    deleteParent (row) {
+      this.$confirm(`纭鍒犻櫎銆�${row.name}銆�?`, '鎻愮ず').then(() => {
+        deleteById(row.id).then(() => {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.loadTree()
+        })
+      })
+    },
+    deleteSub (row) {
+      this.$confirm(`纭鍒犻櫎瀛愮被鍒��${row.name}銆�?`, '鎻愮ず').then(() => {
+        deleteSubApi(row.id).then(() => {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.loadTree()
+        })
+      })
     }
   }
-</script>
\ No newline at end of file
+}
+</script>

--
Gitblit v1.9.3