From f8a4a4306824bf9874a4333e12a0307555ffbb08 Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期二, 15 七月 2025 14:41:42 +0800
Subject: [PATCH] 前端

---
 server/services/src/main/java/com/doumee/dao/business/CategoryMapper.java                   |    3 
 admin/src/api/business/category.js                                                          |    3 
 admin/src/components/business/OperaCategoryWindow.vue                                       |  105 +++++---
 /dev/null                                                                                   |  206 ------------------
 admin/src/views/business/category.vue                                                       |   55 ++--
 admin/src/views/business/member.vue                                                         |    9 
 server/admin/src/main/java/com/doumee/api/business/CategoryController.java                  |   10 
 server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java |   21 +
 server/services/src/main/java/com/doumee/dao/business/model/Category.java                   |   11 +
 admin/src/components/business/OperaIdentityDetailWindow.vue                                 |   34 +--
 admin/src/views/business/categoryCar.vue                                                    |  106 +++++++++
 server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java     |   51 ++--
 12 files changed, 279 insertions(+), 335 deletions(-)

diff --git a/admin/src/api/business/category.js b/admin/src/api/business/category.js
index d44f859..3162d80 100644
--- a/admin/src/api/business/category.js
+++ b/admin/src/api/business/category.js
@@ -11,6 +11,9 @@
 export function create (data) {
   return request.post('/business/category/create', data)
 }
+export function updateStatus (data) {
+  return request.post('/business/category/updateStatus', data)
+}
 
 // 淇敼
 export function updateById (data) {
diff --git a/admin/src/components/business/OperaCategoryWindow.vue b/admin/src/components/business/OperaCategoryWindow.vue
index 40738ff..828473c 100644
--- a/admin/src/components/business/OperaCategoryWindow.vue
+++ b/admin/src/components/business/OperaCategoryWindow.vue
@@ -6,41 +6,27 @@
     @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�" prop="deleted">
-        <el-input v-model="form.deleted" placeholder="璇疯緭鍏ユ槸鍚﹀凡鍒犻櫎 0鏈垹闄� 1宸插垹闄�" v-trim/>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
       </el-form-item>
-      <el-form-item label="鐘舵��:0=鍚敤锛�1=绂佺敤锛�" prop="status">
-        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬�:0=鍚敤锛�1=绂佺敤锛�" v-trim/>
+      <el-form-item v-if="form.type == 1 || form.type == 2" :label=" form.type == 1?'杞﹁締瑙勬牸':'椁愭爣閰嶇疆'" prop="detailList">
+        <el-input v-model="form.detailList" placeholder="璇疯緭鍏ュ唴瀹�" v-trim/>
       </el-form-item>
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="createUser">
-        <el-input v-model="form.createUser" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      <el-form-item v-if="form.type == 1" label="鍥炬爣" prop="icon">
+        <UploadAvatarImage
+            :file="{ imgurlfull: form.iconFull, imgurl: form.icon }"
+            :uploadData="uploadData"
+            @uploadSuccess="uploadAvatarSuccess"
+        />
       </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
-        <el-date-picker v-model="form.createTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      <el-form-item  v-if="form.type == 1"  label="鏄惁鍥哄畾杞﹁締" prop="isFixed">
+        <el-radio-group v-model="form.isFixed">
+          <el-radio :label="0">闈炲浐瀹�</el-radio>
+          <el-radio :label="1">鍥哄畾杞﹀瀷</el-radio>
+        </el-radio-group>
       </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="updateUser">
-        <el-input v-model="form.updateUser" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="updateTime">
-        <el-date-picker v-model="form.updateTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="remark">
-        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍗曚綅鍚嶇О" prop="name">
-        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ崟浣嶅悕绉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱" prop="type">
-        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨�:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍐呭锛堣溅杈嗚鏍笺�侀鏍囥�佹墜缁垂姣斾緥锛�" prop="detail">
-        <el-input v-model="form.detail" placeholder="璇疯緭鍏ュ唴瀹癸紙杞﹁締瑙勬牸銆侀鏍囥�佹墜缁垂姣斾緥锛�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級" prop="icon">
-        <el-input v-model="form.icon" placeholder="璇疯緭鍏ュ浘鏍囷紙杞﹁締绫诲瀷浣跨敤锛�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱" prop="isFixed">
-        <el-input v-model="form.isFixed" placeholder="璇疯緭鍏ユ槸鍚﹀浐瀹氳溅杈嗭紙杞﹁締绫诲瀷浣跨敤锛�:0=鍚︼紱1=鏄紱" v-trim/>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -49,27 +35,27 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
 export default {
   name: 'OperaCategoryWindow',
   extends: BaseOpera,
-  components: { GlobalWindow },
+  components: { GlobalWindow ,UploadAvatarImage},
   data () {
     return {
+      isUploading: false,
+      uploadData: {
+        folder: 'category'
+      },
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
-        deleted: '',
-        status: '',
-        createUser: '',
-        createTime: '',
-        updateUser: '',
-        updateTime: '',
-        remark: '',
+        status: 0,
+        sortnum: null,
         name: '',
-        type: '',
-        detail: '',
+        type: null,
+        detailList: [],
         icon: '',
-        isFixed: ''
+        isFixed: 0
       },
       // 楠岃瘉瑙勫垯
       rules: {
@@ -81,6 +67,41 @@
       api: '/business/category',
       'field.id': 'id'
     })
+  },
+  methods:{
+    uploadAvatarSuccess (file) {
+      this.$set(this.param, 'icon', file.imgurl)
+      this.$set(this.param, 'iconFull', file.imgurlfull)
+    },
+    open(title, target, type) {
+      this.title = title
+      this.visible = true
+      this.form = {
+        id: null,
+        status: 0,
+        sortnum: null,
+        name: '',
+        type: type,
+        detailList: [],
+        icon: '',
+        isFixed: 0
+      }
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+          this.form.type = type
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/components/business/OperaIdentityDetailWindow.vue b/admin/src/components/business/OperaIdentityDetailWindow.vue
index 3872416..4d97125 100644
--- a/admin/src/components/business/OperaIdentityDetailWindow.vue
+++ b/admin/src/components/business/OperaIdentityDetailWindow.vue
@@ -80,8 +80,8 @@
             <el-input  type="textarea" rows="5" v-model="form.auditRemark" placeholder="璇疯緭鍏ヨ璇佸鏍稿娉�" v-trim/>
           </el-form-item>
         </el-form>
-        <el-button @click="checkDo(2)" type="primary" class="status-red">鍚屾剰</el-button>
-        <el-button  @click="checkDo(3)" type="danger" >鎷掔粷</el-button>
+        <el-button @click="checkDo(2)" :loading="dealing" type="primary" class="status-red">鍚屾剰</el-button>
+        <el-button  @click="checkDo(3)" :loading="dealing" type="danger" >鎷掔粷</el-button>
       </div>
     </div>
   </GlobalWindow>
@@ -91,7 +91,7 @@
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
 import { getById } from '@/api/business/member'
-import { fetchList as renzhengList,audit } from '@/api/business/identityInfo'
+import { fetchList as renzhengList, audit } from '@/api/business/identityInfo'
 export default {
   components: {
     GlobalWindow
@@ -99,6 +99,7 @@
   extends: BaseOpera,
   data () {
     return {
+      dealing: false,
       form: {
         id: null,
         auditRemark: null
@@ -135,25 +136,11 @@
     open (title, row) {
       this.title = title
       this.visible = true
-      this.activeTabs = 0
-      this.type = 0
-      this.page0 = 1
-      this.pageSize = 10
-      this.tableData = {}
-      this.tableData1 = {}
       this.tableData2 = []
       this.id = row.id
       this.form.id = this.id
+      this.form.auditRemark =null
       this.memberId = row.memberId
-      this.searchForm = {
-        type: 0,
-        startTime: null,
-        endTime: null,
-        optType: null,
-        acceptMemberId: -1,
-        releaseMemberId: -1,
-        transactionNo: null
-      }
       this.getData()
     },
     getData () {
@@ -168,12 +155,12 @@
 
     },
     checkDo (status) {
-      console.log( this.$refs.formCheck.length)
+      console.log(this.$refs.formCheck.length)
       this.$refs.formCheck.validate((valid) => {
         if (!valid) {
           return
         }
-        this.$dialog.actionConfirm('鎮ㄧ‘璁ゃ��' + (status === 3 ? '鎷掔粷' : '鍚屾剰') + '銆戣鐢宠鍚楋紵','鎿嶄綔纭')
+        this.$dialog.actionConfirm('鎮ㄧ‘璁ゃ��' + (status === 3 ? '鎷掔粷' : '鍚屾剰') + '銆戣鐢宠鍚楋紵', '鎿嶄綔纭')
           .then(() => {
             this.dealing = true
             audit({
@@ -182,9 +169,12 @@
               auditRemark: this.form.auditRemark
             })
               .then(res => {
-                this.$tip.apiSuccess('澶勭悊鎴愬姛')
+                this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
                 this.getData()
-                this.isShowProblem = false
+                this.$emit('success')
+              })
+              .catch(e => {
+                this.$tip.apiFailed(e)
               })
               .finally(() => {
                 this.dealing = false
diff --git a/admin/src/components/common/UploadFaceImg.vue b/admin/src/components/common/UploadFaceImg.vue
deleted file mode 100644
index 98e2dd1..0000000
--- a/admin/src/components/common/UploadFaceImg.vue
+++ /dev/null
@@ -1,206 +0,0 @@
-<template>
-  <div>
-    <el-upload
-        class="avatar-uploader"
-        accept=".png,.jpg,.jpeg"
-        :style="customStyle"
-        action=""
-        :auto-upload="false"
-        :show-file-list="false"
-        :on-change='openUpdateIcon'>
-      <img v-if=" file.imgurlfull" style="width: 100%;" :src="file.imgurlfull" :style="customStyle" class="avatar">
-      <div v-else :style="customStyle">
-        <i class="el-icon-plus avatar-uploader-icon"></i>
-        <div class="tips-style">{{ tipsLabel }}</div>
-      </div>
-    </el-upload>
-    <el-dialog
-        append-to-body
-        :close-on-click-modal="false"
-        title="涓婁紶鍥剧墖"
-        :visible.sync="updateImg"
-        width="1000px"
-        class="icon-dialog-wrapper dialong-com-style">
-      <ImageCropper ref="iconShot" v-if="updateImg" :imgSrc="img" >
-      </ImageCropper>
-      <span slot="footer" class="dialog-footer">
-            <el-button v-if="loading">鍙� 娑�</el-button>
-            <el-button v-else @click="updateImg = false">鍙� 娑�</el-button>
-            <el-button :loading="loading" type="primary" @click="uploadIcon">纭� 瀹�</el-button>
-          </span>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import ImageCropper from '@/components/common/ImageCropper'
-import { upload } from '@/api/system/common'
-export default {
-  components: { ImageCropper },
-  props: {
-    file: {
-      type: Object,
-      default: () => {}
-    },
-    tipsLabel: '',
-    customStyle: {
-      type: String,
-      default: 'width: 90px; height: 90px;'
-    },
-    uploadData: Object
-  },
-  data () {
-    return {
-      loading: false,
-      fileInfo:{},
-      img: null,
-      updateImg: false,
-      imageSrc: null,
-      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload'
-    }
-  },
-
-  methods: {
-    uploadIcon () {
-      // 鑾峰彇瑁佸壀鍚庣殑鍥剧墖
-      this.$refs.iconShot.getImagecropper().getCropBlob((fileData) => { // 鑾峰彇褰撳墠瑁佸壀濂界殑鏁版嵁
-        // 娉ㄦ鏃剁殑data鏄竴涓狟lob鏁版嵁锛岄儴鍒嗘帴鍙f帴鏀剁殑鏄疐ile杞寲鐨凢ormData鏁版嵁
-        console.log(fileData)
-        const formData = new FormData()
-
-        formData.append('folder', 'member')
-        if(this.uploadData.isFace || this.uploadData.isFace == 0){
-          formData.append('isFace', 0)
-        }
-        formData.append(
-            'file',
-            new File(
-                [fileData], // 灏咮lob绫诲瀷杞寲鎴怓ile绫诲瀷
-                this.fileInfo.name, // 璁剧疆File绫诲瀷鐨勬枃浠跺悕绉�
-                { type: this.fileInfo.type } // 璁剧疆File绫诲瀷鐨勬枃浠剁被鍨�
-            )
-        )
-        this.loading = true
-        upload(formData).then(res => {
-          this.loading = false
-          console.log(res)
-          this.file.imgurl = res.imgaddr
-          this.file.imgurlfull = res.url
-          this.$message.success('涓婁紶鎴愬姛')
-          this.imageSrc = res.url
-          this.updateImg = false
-          this.$emit('uploadSuccess', { imgurl: res.imgaddr, imgurlfull: res.url, name: res.originname })
-          this.$emit('uploadEnd')
-        }, () => {
-          this.loading = false
-        })
-      })
-    },
-
-    // 涓婁紶鍥剧墖
-    openUpdateIcon (file, fileList) {
-      const isJPG = file.raw.type === 'image/jpeg' || file.raw.type === 'image/png'
-      const isLt2M = file.size / 1024 / 1024 < 5
-      if (!isJPG) {
-        this.$message.error('涓婁紶澶村儚鍥剧墖鍙兘鏄� JPG/PNG 鏍煎紡!')
-        return false
-      }
-      if (!isLt2M) {
-        this.$message.error('涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 5MB!')
-        return false
-      }
-      // 涓婁紶鎴愬姛鍚庡皢鍥剧墖鍦板潃璧嬪�肩粰瑁佸壀妗嗘樉绀哄浘鐗�
-      this.$nextTick(async () => {
-        // base64鏂瑰紡
-        // this.option.img = await fileByBase64(file.raw)
-        this.fileInfo.name = file.name
-        this.fileInfo.type = file.type
-        console.log(file, fileList)
-        this.img = URL.createObjectURL(file.raw)
-        // this.loading = false
-        this.updateImg = true
-      })
-    },
-    handleAvatarSuccess (res, file) {
-      if (res.code == 200) {
-        const { data } = res
-        this.file.imgurl = data.imgaddr
-        this.file.imgurlfull = data.url
-        this.$message.success('涓婁紶鎴愬姛')
-        this.imageSrc = data.url
-        this.updateImg = true
-        // this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
-      } else {
-        this.$message.error('涓婁紶澶辫触')
-      }
-      this.$emit('uploadEnd')
-    },
-    uploadError () {
-      this.$message.error('涓婁紶澶辫触')
-      this.$emit('uploadEnd')
-    },
-    // // 鎷︽埅
-    beforeAvatarUpload (file) {
-      this.$emit('uploadBegin')
-      return true
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-$image-width: 90px;
-.avatar-uploader {
-  width: $image-width;
-  height: $image-width;
-}
-::v-deep .el-upload {
-  border: 1px dashed #d9d9d9;
-  border-radius: 6px;
-  cursor: pointer;
-  position: relative;
-  overflow: hidden;
-}
-.avatar-uploader .el-upload:hover {
-  border-color: #409EFF;
-}
-.avatar-uploader-icon {
-  line-height: 90px;
-  font-size: 28px;
-  color: #8c939d;
-  width: $image-width;
-  height: $image-width;
-  text-align: center;
-}
-.avatar {
-  width: 100% !important;
-  height: auto !important;
-  display: block;
-}
-.tips-style {
-  height: 13px;
-  font-size: 13px;
-  font-weight: 400;
-  color: #999999;
-  line-height: 13px;
-}
-</style>
-<style lang="scss" scoped>
-::v-deep .el-upload--picture-card{
-  width: 90px !important;
-  height: 90px !important;
-}
-::v-deep .el-upload-list__item {
-  width: 90px !important;
-  height: 90px !important;
-}
-.icon {
-  -webkit-transform: translate(-50%,-50%);
-  -ms-transform: translate(-50%,-50%);
-  transform: translate(0%, -85%);
-}
-::v-deep .el-upload-list__item {
-  width: 90px !important;
-  height: 90px !important;
-}
-</style>
diff --git a/admin/src/views/business/category.vue b/admin/src/views/business/category.vue
index 66c2d14..0581cdd 100644
--- a/admin/src/views/business/category.vue
+++ b/admin/src/views/business/category.vue
@@ -13,7 +13,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <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('鏂板缓鍝佺閰嶇疆',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
@@ -24,19 +24,17 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
-        <el-table-column prop="deleted" label="鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵��:0=鍚敤锛�1=绂佺敤锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="createUser" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="updateUser" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
         <el-table-column prop="name" label="鍗曚綅鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="type" label="绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱" min-width="100px"></el-table-column>
-        <el-table-column prop="detail" label="鍐呭锛堣溅杈嗚鏍笺�侀鏍囥�佹墜缁垂姣斾緥锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="icon" label="鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級" min-width="100px"></el-table-column>
-        <el-table-column prop="isFixed" label="鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱" min-width="100px"></el-table-column>
+        <el-table-column label="鐘舵��">
+          <template slot-scope="{row}">
+            <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
+            inactive-color="#ff4949" :active-value="0" :inactive-value="1">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
         <el-table-column
           v-if="containPermissions(['business:category:update', 'business:category:delete'])"
           label="鎿嶄綔"
@@ -44,7 +42,7 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鍒嗙被淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鏂板缓鍝佺閰嶇疆', row,searchForm.type)" 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>
         </el-table-column>
@@ -74,19 +72,8 @@
     return {
       // 鎼滅储
       searchForm: {
-        id: '',
-        deleted: '',
-        status: '',
-        createUser: '',
-        createTime: '',
-        updateUser: '',
-        updateTime: '',
-        remark: '',
         name: '',
-        type: '',
-        detail: '',
-        icon: '',
-        isFixed: ''
+        type: 0
       }
     }
   },
@@ -98,6 +85,22 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    changeStatus (e, row) {
+      this.working = true
+      this.api.updateStatus({ id: row.id, status: e })
+        .then(res => {
+          this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
+          this.search()
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.working = false
+        })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/categoryCar.vue b/admin/src/views/business/categoryCar.vue
new file mode 100644
index 0000000..2ff4c1a
--- /dev/null
+++ b/admin/src/views/business/categoryCar.vue
@@ -0,0 +1,106 @@
+<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-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鍒嗙被淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+          :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="updateUser" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鍗曚綅鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column label="鐘舵��">
+          <template slot-scope="{row}">
+            <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
+                       inactive-color="#ff4949" :active-value="0" :inactive-value="1">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column prop="type" label="绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱" min-width="100px"></el-table-column>
+        <el-table-column prop="detail" label="鍐呭锛堣溅杈嗚鏍笺�侀鏍囥�佹墜缁垂姣斾緥锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="icon" label="鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級" min-width="100px"></el-table-column>
+        <el-table-column prop="isFixed" label="鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱" min-width="100px">
+        </el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:category:update', 'business:category:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鍒嗙被淇℃伅琛�', row)" 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>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
+  </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'
+export default {
+  name: 'Category',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaCategoryWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        deleted: '',
+        status: '',
+        createUser: '',
+        createTime: '',
+        updateUser: '',
+        updateTime: '',
+        remark: '',
+        name: '',
+        type: '',
+        detail: '',
+        icon: '',
+        isFixed: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鍒嗙被淇℃伅琛�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/member.vue b/admin/src/views/business/member.vue
index be349a1..8d63f67 100644
--- a/admin/src/views/business/member.vue
+++ b/admin/src/views/business/member.vue
@@ -14,13 +14,12 @@
             <el-option :value="1" label="鎺ュ崟鏂�"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="鐘舵��" prop="status">
+<!--      <el-form-item label="鐘舵��" prop="status">
         <el-select v-model="searchForm.status"  @keypress.enter.native="search" clearable placeholder="鐘舵��">
           <el-option label="鍚敤" value="0"></el-option>
           <el-option label="绂佺敤" value="1"></el-option>
         </el-select>
-      </el-form-item>
-
+      </el-form-item>-->
       <el-form-item label="娉ㄥ唽鏃堕棿" prop="eventType">
         <el-date-picker type="datetime" style="width: 120px" v-model="searchForm.startTime" clearable value-format="yyyy-MM-dd HH:mm:ss"
                         placeholder="寮�濮嬫椂闂�" />-
@@ -70,13 +69,13 @@
               {{row.autoReciveStatus ==1?"鏄�":"鍚�"}}
             </template>
         </el-table-column>
-        <el-table-column label="鐘舵��">
+<!--        <el-table-column label="鐘舵��">
           <template slot-scope="{row}">
             <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
                        inactive-color="#ff4949" :active-value="0" :inactive-value="1">
             </el-switch>
           </template>
-        </el-table-column>
+        </el-table-column>-->
       <el-table-column
               v-if="containPermissions(['business:member:update', 'business:member:delete'])"
               label="鎿嶄綔"
diff --git a/server/admin/src/main/java/com/doumee/api/business/CategoryController.java b/server/admin/src/main/java/com/doumee/api/business/CategoryController.java
index fdc565b..fbfd63d 100644
--- a/server/admin/src/main/java/com/doumee/api/business/CategoryController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/CategoryController.java
@@ -3,15 +3,18 @@
 import com.doumee.api.BaseController;
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.Constants;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.system.model.SystemJob;
 import com.doumee.service.business.CategoryService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -45,6 +48,13 @@
         categoryService.deleteById(id);
         return ApiResponse.success(null);
     }
+    @ApiOperation("淇敼鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("system:category:update")
+    public ApiResponse updateStatus( @RequestBody Category param) {
+        categoryService.updateById(param);
+        return ApiResponse.success(null);
+    }
 
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
diff --git a/server/services/src/main/java/com/doumee/dao/business/CategoryMapper.java b/server/services/src/main/java/com/doumee/dao/business/CategoryMapper.java
index 324b66b..e470e9d 100644
--- a/server/services/src/main/java/com/doumee/dao/business/CategoryMapper.java
+++ b/server/services/src/main/java/com/doumee/dao/business/CategoryMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.Category;
+import com.github.yulichang.base.MPJBaseMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/07/09 12:00
  */
-public interface CategoryMapper extends BaseMapper<Category> {
+public interface CategoryMapper extends MPJBaseMapper<Category> {
 
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Category.java b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
index beca239..0665ae1 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Category.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -9,6 +10,7 @@
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 鍒嗙被淇℃伅琛�
@@ -69,9 +71,18 @@
     @ApiModelProperty(value = "鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級")
     @ExcelColumn(name="鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級")
     private String icon;
+    @ApiModelProperty(value = "鎺掑簭鐮侊紙鍗囧簭锛�")
+    @ExcelColumn(name="鎺掑簭鐮侊紙鍗囧簭锛�")
+    private Integer sortnum;
 
     @ApiModelProperty(value = "鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱", example = "1")
     @ExcelColumn(name="鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱")
     private Integer isFixed;
+    @ApiModelProperty(value = "鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱", example = "1")
+    @TableField(exist = false)
+    private String updateUserName;
+    @ApiModelProperty(value = "椁愭爣绛夐厤缃」闆嗗悎", example = "1")
+    @TableField(exist = false)
+    private List<String> detailList;
 
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index 478f86a..13c59df 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -1,15 +1,20 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.constants.Constants;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.CategoryMapper;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.CategoryService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -87,57 +92,55 @@
     @Override
     public PageData<Category> findPage(PageWrap<Category> pageWrap) {
         IPage<Category> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<Category> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        queryWrapper.selectAll(Category.class)
+                .selectAs(SystemUser::getUsername, Category::getUpdateUserName)
+                .leftJoin(SystemUser.class,SystemUser::getId,Category::getUpdateUser);
         if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(Category::getId, pageWrap.getModel().getId());
+            queryWrapper.eq(Category::getId, pageWrap.getModel().getId());
         }
         if (pageWrap.getModel().getDeleted() != null) {
-            queryWrapper.lambda().eq(Category::getDeleted, pageWrap.getModel().getDeleted());
+            queryWrapper.eq(Category::getDeleted, pageWrap.getModel().getDeleted());
         }
         if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(Category::getStatus, pageWrap.getModel().getStatus());
+            queryWrapper.eq(Category::getStatus, pageWrap.getModel().getStatus());
         }
         if (pageWrap.getModel().getCreateUser() != null) {
-            queryWrapper.lambda().eq(Category::getCreateUser, pageWrap.getModel().getCreateUser());
+            queryWrapper.eq(Category::getCreateUser, pageWrap.getModel().getCreateUser());
         }
         if (pageWrap.getModel().getCreateTime() != null) {
-            queryWrapper.lambda().ge(Category::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
-            queryWrapper.lambda().le(Category::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
+            queryWrapper.ge(Category::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
+            queryWrapper.le(Category::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
         }
         if (pageWrap.getModel().getUpdateUser() != null) {
-            queryWrapper.lambda().eq(Category::getUpdateUser, pageWrap.getModel().getUpdateUser());
+            queryWrapper.eq(Category::getUpdateUser, pageWrap.getModel().getUpdateUser());
         }
         if (pageWrap.getModel().getUpdateTime() != null) {
-            queryWrapper.lambda().ge(Category::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
-            queryWrapper.lambda().le(Category::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
+            queryWrapper.ge(Category::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
+            queryWrapper.le(Category::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
         }
         if (pageWrap.getModel().getRemark() != null) {
-            queryWrapper.lambda().eq(Category::getRemark, pageWrap.getModel().getRemark());
+            queryWrapper.eq(Category::getRemark, pageWrap.getModel().getRemark());
         }
         if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().eq(Category::getName, pageWrap.getModel().getName());
+            queryWrapper.like(Category::getName, pageWrap.getModel().getName());
         }
         if (pageWrap.getModel().getType() != null) {
-            queryWrapper.lambda().eq(Category::getType, pageWrap.getModel().getType());
+            queryWrapper.eq(Category::getType, pageWrap.getModel().getType());
         }
         if (pageWrap.getModel().getDetail() != null) {
-            queryWrapper.lambda().eq(Category::getDetail, pageWrap.getModel().getDetail());
+            queryWrapper.eq(Category::getDetail, pageWrap.getModel().getDetail());
         }
         if (pageWrap.getModel().getIcon() != null) {
-            queryWrapper.lambda().eq(Category::getIcon, pageWrap.getModel().getIcon());
+            queryWrapper.eq(Category::getIcon, pageWrap.getModel().getIcon());
         }
         if (pageWrap.getModel().getIsFixed() != null) {
-            queryWrapper.lambda().eq(Category::getIsFixed, pageWrap.getModel().getIsFixed());
+            queryWrapper.eq(Category::getIsFixed, pageWrap.getModel().getIsFixed());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
-        return PageData.from(categoryMapper.selectPage(page, queryWrapper));
+        queryWrapper.orderByAsc(Category::getSortnum);
+        return PageData.from(categoryMapper.selectJoinPage(page, Category.class,queryWrapper));
     }
 
     @Override
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
index 5f6cd0b..aa13767 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
@@ -371,8 +371,10 @@
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
     public void audit(AuditDTO auditDTO){
         if(Objects.isNull(auditDTO)
-        || Objects.isNull(auditDTO.getId())
-        || Objects.isNull(auditDTO.getAuditStatus())){
+            || Objects.isNull(auditDTO.getId())
+            || Objects.isNull(auditDTO.getAuditStatus())
+            ||  auditDTO.getAuditStatus()<2
+            ||  auditDTO.getAuditStatus()>3){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
@@ -383,21 +385,22 @@
         if(!Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.ONE)){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"宸插鎵癸紝璇峰嬁閲嶅鎿嶄綔");
         }
+        Date date = new Date();
         identityInfoMapper.update(new UpdateWrapper<IdentityInfo>().lambda()
-                .set(IdentityInfo::getAuditStatus,Constants.equalsInteger(auditDTO.getAuditStatus(),Constants.ZERO)?Constants.TWO:Constants.THREE)
+                .set(IdentityInfo::getAuditStatus, auditDTO.getAuditStatus() )
                 .set(StringUtils.isNotBlank(auditDTO.getAuditRemark()),IdentityInfo::getAuditRemark,auditDTO.getAuditRemark())
-                .set(IdentityInfo::getAuditTime,"now()")
+                .set(IdentityInfo::getAuditTime,date)
                 .set(IdentityInfo::getUpdateUser,user.getId())
-                .set(IdentityInfo::getUpdateTime,"now()")
+                .set(IdentityInfo::getUpdateTime,date)
                 .eq(IdentityInfo::getId,identityInfo.getId())
         );
 
         memberMapper.update(new UpdateWrapper<Member>().lambda()
                 .set(Member::getUpdateUser,user.getId())
-                .set(Member::getUpdateTime,"now()")
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity,Constants.equalsInteger(auditDTO.getAuditStatus(),Constants.ZERO)?Constants.TWO:Constants.THREE)
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ONE),Member::getDriverIdentity,Constants.equalsInteger(auditDTO.getAuditStatus(),Constants.ZERO)?Constants.TWO:Constants.THREE)
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.TWO),Member::getChefIdentity,Constants.equalsInteger(auditDTO.getAuditStatus(),Constants.ZERO)?Constants.TWO:Constants.THREE)
+                .set(Member::getUpdateTime,date)
+                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity, auditDTO.getAuditStatus() )
+                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ONE),Member::getDriverIdentity , auditDTO.getAuditStatus() )
+                .set(Constants.equalsInteger(identityInfo.getType(),Constants.TWO),Member::getChefIdentity , auditDTO.getAuditStatus() )
                 .eq(Member::getId,identityInfo.getMemberId())
         );
 

--
Gitblit v1.9.3