Sfoglia il codice sorgente

feat(category): backend alignment

furffico 1 anno fa
parent
commit
6a3a79e2ee

+ 6 - 25
src/crud/prod/category.ts

@@ -9,9 +9,9 @@ export const tableOption = {
     align: 'center',
     refreshBtn: true,
     searchSize: 'mini',
-    addBtn: false,
-    editBtn: false,
-    delBtn: false,
+    addBtn: true,
+    editBtn: true,
+    delBtn: true,
     viewBtn: false,
     props: {
       label: 'label',
@@ -20,33 +20,14 @@ export const tableOption = {
     column: [
     {
       label: "#",
-      prop: "categoryId",
+      prop: "id",
       editDisabled: true,
-      addDisabled: true
+      addDisplay: false
     }, {
       label: '分类名',
-      prop: 'categoryName',
+      prop: 'name',
       search: true,
       align: "left",
       minWidth: 300,
-    }, {
-      label: '优先级',
-      prop: 'seq'
-    },
-    {
-        label: "状态",
-        prop: 'status',
-        search: true,
-        slot: true,
-        type: 'select',
-        dicData: [
-            {
-                label: '下线',
-                value: 0
-            }, {
-                label: '正常',
-                value: 1
-            }
-        ]
     }]
 }

+ 1 - 1
src/utils/formatters.ts

@@ -1,4 +1,4 @@
 
 
 export const currencyFormatter = (v:number) => "¥"+v.toFixed(2)
-export const row_currencyFormatter = (_:any, v:number) => "¥"+v.toFixed(2)
+export const row_currencyFormatter = (_:any, v:number|null) => v?("¥"+v.toFixed(2)):"-"

+ 71 - 0
src/utils/httpx.ts

@@ -0,0 +1,71 @@
+import axios from 'axios'
+import { Message } from 'element-ui'
+
+export const httpx = axios.create({
+  timeout: 1000 * 5,
+  // withCredentials: true,
+  headers: {
+    'Content-Type': 'application/json; charset=utf-8'
+  }
+})
+
+httpx.interceptors.response.use(
+  (response) => {
+    if (response.data.code >= 0) {
+      response.statusText = response.data.msg;
+      response.data = response.data.data;
+      return response;
+    } else {
+      Message({
+        message: response.data.msg,
+        type: 'error',
+        duration: 1500,
+        customClass: 'element-error-message-zindex'
+      })
+      return Promise.reject()
+    }
+  }, (error) => {
+    switch (error.response.status) {
+      case 400:
+        Message({
+          message: error.response.data,
+          type: 'error',
+          duration: 1500,
+          customClass: 'element-error-message-zindex'
+        })
+                break
+      case 401:
+        // clearLoginInfo()
+        // router.push({ name: 'login' })
+        break
+      case 405:
+        Message({
+          message: 'http请求方式有误',
+          type: 'error',
+          duration: 1500,
+          customClass: 'element-error-message-zindex'
+        })
+        break
+      case 500:
+        Message({
+          message: '服务器出了点小差,请稍后再试',
+          type: 'error',
+          duration: 1500,
+          customClass: 'element-error-message-zindex'
+        })
+        break
+      case 501:
+        Message({
+          message: '服务器不支持当前请求所需要的某个功能',
+          type: 'error',
+          duration: 1500,
+          customClass: 'element-error-message-zindex'
+        })
+        break
+    }
+    return Promise.reject(error)
+  }
+)
+
+export default httpx
+export { AxiosPromise, AxiosResponse } from "axios"

+ 14 - 0
src/utils/vo/index.ts

@@ -0,0 +1,14 @@
+
+export interface ICategory {
+    id: number
+    name: string
+    adminId: number
+  }
+  
+export type IPage = Record<"total" | "currentPage" | "pageSize", number>
+
+interface IPageData<T>{
+  // 后端返回的格式不统一,这个用不了
+  total: number
+  items: T[]
+}

+ 0 - 183
src/views/modules/prod/category-add-or-update.vue

@@ -1,183 +0,0 @@
-<template>
-  <el-dialog :title="!dataForm.currentId ? '新增' : '修改'"
-             :close-on-click-modal="false"
-             :visible.sync="visible">
-    <el-form :model="dataForm"
-             :rules="dataRule"
-             ref="dataForm"
-             @keyup.enter.native="dataFormSubmit()"
-             label-width="80px">
-      <!--el-form-item v-if="dataForm.type !== 2"
-                    label="分类图片"
-                    prop="pic">
-        <pic-upload v-model="dataForm.pic"></pic-upload>
-      </el-form-item-->
-      <el-form-item v-if="dataForm.type !== 2"
-                    label="分类名称"
-                    prop="categoryName">
-        <el-input v-model="dataForm.categoryName"
-                  controls-position="right"
-                  :min="0"
-                  label="分类名称"></el-input>
-      </el-form-item>
-      <el-form-item label="上级分类">
-        <el-cascader expand-trigger="hover"
-                     :options="categoryList"
-                     :props="categoryTreeProps"
-                     change-on-select
-                     :clearable="true"
-                     v-model="selectedCategory"
-                     @change="handleChange">
-        </el-cascader>
-      </el-form-item>
-      <el-form-item v-if="dataForm.type !== 2"
-                    label="排序号"
-                    prop="seq">
-        <el-input-number v-model="dataForm.seq"
-                         controls-position="right"
-                         :min="0"
-                         label="排序号"></el-input-number>
-      </el-form-item>
-      <el-form-item label="状态"
-                    size="mini"
-                    prop="status">
-        <el-radio-group v-model="dataForm.status">
-          <el-radio :label="0">下线</el-radio>
-          <el-radio :label="1">正常</el-radio>
-        </el-radio-group>
-      </el-form-item>
-    </el-form>
-    <span slot="footer"
-          class="dialog-footer">
-      <el-button size="small"
-                 @click="visible = false">取消</el-button>
-      <el-button size="small"
-                 type="primary"
-                 @click="dataFormSubmit()">确定</el-button>
-    </span>
-  </el-dialog>
-</template>
-<script>
-import { treeDataTranslate, idList } from '@/utils'
-import PicUpload from '@/components/pic-upload'
-import { Debounce } from '@/utils/debounce'
-export default {
-  data () {
-    return {
-      visible: false,
-      dataForm: {
-        categoryId: 0,
-        currentId: 0,
-        grade: 0,
-        categoryName: '',
-        seq: 1,
-        status: 1,
-        parentId: 0,
-        pic: ''
-      },
-      dataRule: {
-        categoryName: [
-          { required: true, message: '分类名称不能为空', trigger: 'blur' },
-          { pattern: /\s\S+|S+\s|\S/, message: '请输入正确的分类名称', trigger: 'blur' }
-        ],
-        pic: [
-          { required: true, message: '分类图片不能为空', trigger: 'blur' }
-        ]
-      },
-      categoryList: [],
-      selectedCategory: [],
-      categoryTreeProps: {
-        value: 'categoryId',
-        label: 'categoryName'
-      },
-      isSubmit: false
-    }
-  },
-  components: {
-    PicUpload
-  },
-  methods: {
-    init (id) {
-      this.dataForm.currentId = id || 0
-      this.dataForm.categoryId = id || 0
-      this.$http({
-        url: this.$http.adornUrl('/prod/category/listCategory'),
-        method: 'get',
-        params: this.$http.adornParams()
-      }).then(({ data }) => {
-        this.categoryList = treeDataTranslate(data, 'categoryId', 'parentId')
-      }).then(() => {
-        this.visible = true
-        this.$nextTick(() => {
-          this.$refs['dataForm'].resetFields()
-          this.selectedCategory = []
-        })
-      }).then(() => {
-        if (this.dataForm.categoryId) {
-          // 修改
-          this.$http({
-            url: this.$http.adornUrl(`/prod/category/info/${this.dataForm.categoryId}`),
-            method: 'get',
-            params: this.$http.adornParams()
-          }).then(({ data }) => {
-            this.dataForm.categoryId = data.categoryId
-            this.dataForm.categoryName = data.categoryName
-            this.dataForm.seq = data.seq
-            this.dataForm.pic = data.pic
-            this.dataForm.parentId = data.parentId
-            this.dataForm.status = data.status
-            this.selectedCategory = idList(this.categoryList, data.parentId, 'categoryId', 'children').reverse()
-          })
-        }
-      })
-    },
-    handleChange (val) {
-      this.dataForm.parentId = val[val.length - 1]
-    },
-    // 表单提交
-    dataFormSubmit: Debounce(function () {
-      if (this.selectedCategory.length === 1) {
-        this.dataForm.grade = 0
-      }
-      if (this.selectedCategory.length === 2) {
-        this.dataForm.grade = 1
-      }
-      if (this.selectedCategory.length === 3) {
-        this.dataForm.grade = 2
-      }
-      this.$refs['dataForm'].validate((valid) => {
-        if (valid) {
-          if (this.isSubmit) {
-            return
-          }
-          this.isSubmit = true
-          this.$http({
-            url: this.$http.adornUrl(`/prod/category`),
-            method: this.dataForm.categoryId ? 'put' : 'post',
-            data: this.$http.adornData({
-              'categoryId': this.dataForm.categoryId || undefined,
-              'categoryName': this.dataForm.categoryName,
-              'status': this.dataForm.status,
-              'seq': this.dataForm.seq,
-              'grade': this.dataForm.grade,
-              'parentId': this.dataForm.parentId,
-              'pic': this.dataForm.pic
-            })
-          }).then(({ data }) => {
-            this.$message({
-              message: '操作成功',
-              type: 'success',
-              duration: 1000,
-              onClose: () => {
-                this.isSubmit = false
-                this.visible = false
-                this.$emit('refreshDataList')
-              }
-            })
-          })
-        }
-      })
-    })
-  }
-}
-</script>

+ 72 - 84
src/views/modules/prod/category.vue

@@ -1,117 +1,105 @@
 <template>
-  <div>
-    
-  <avue-crud 
-    ref="crud"
-    :page="page"
-    :data="dataList"
-    :table-loading="dataListLoading"
-    :option="tableOption"
-  >
-    <template slot-scope="scope" slot="menuLeft" >
-      <el-button v-if="isAuth('prod:category:save')"
-                   type="primary"
-                   icon="el-icon-plus"
-                   size="small"
-                   @click="addOrUpdateHandle()">新增</el-button>
-    </template>
-    
-    <template slot-scope="scope" slot="status">
-      <el-tag v-if="scope.row.status === 1" size="small" type="success">正常</el-tag>
-      <el-tag v-else size="small" type="warning">下线</el-tag>
-    </template>
-
-    <template slot-scope="scope" slot="menu">
-      <el-button v-if="isAuth('prod:category:update')"
-                  type="primary"
-                  size="small"
-                  @click="addOrUpdateHandle(scope.row.categoryId)">修改</el-button>
-      <el-button v-if="isAuth('prod:category:delete')"
-                  type="danger"
-                  size="small"
-                  @click="deleteHandle(scope.row.categoryId)">删除</el-button>
-    </template>
+  <avue-crud ref="crud" :page="page" :data="dataList" :table-loading="dataListLoading" :option="tableOption"
+    @on-load="getDataList" @row-update="updateItem" @row-del="deleteItem" @row-save="addItem">
   </avue-crud>
-  <!-- 弹窗, 新增 / 修改 -->
-  <add-or-update v-if="addOrUpdateVisible"
-                  ref="addOrUpdate"
-                  @refreshDataList="getDataList"></add-or-update>
-</div>
 </template>
 
-<script>
-import AddOrUpdate from './category-add-or-update'
+<script lang="ts">
+import Vue from 'vue'
 import { tableOption } from '@/crud/prod/category'
+import { httpx, AxiosPromise, AxiosResponse } from "@/utils/httpx"
+import { ceil, clone } from 'lodash'
+import { ICategory, IPage } from '@/utils/vo'
 
-export default {
-  data () {
+export default Vue.extend({
+  data() {
     return {
       dataForm: {},
-      dataList: [],
+      dataList: [] as ICategory[],
       dataListLoading: false,
       addOrUpdateVisible: false,
       resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
-      tableOption
+      tableOption,
+      page: {
+        total: 1,
+        currentPage: 1,
+        pageSize: 10,
+      } as IPage
     }
   },
-  components: {
-    AddOrUpdate
-  },
-  activated () {
-    this.getDataList()
-  },
   methods: {
     // 获取数据列表
-    getDataList () {
+    getDataList(page?: IPage, params: Partial<ICategory> = { name: "" }, done?: Function) {
       this.dataListLoading = true
-      this.$http({
-        url: this.$http.adornUrl('/prod/category/table'),
-        method: 'get',
-        params: this.$http.adornParams()
-      }).then(({ data }) => {
-        // this.dataList = treeDataTranslate(data, 'categoryId', 'parentId')
-        this.dataList = data
+      if (page) { this.page = page }
+      return httpx.post('/goodsTypes/queryGoodsTypeList', {
+        name: params.name,
+        limit: page?.pageSize || this.page.pageSize,
+        page: page?.currentPage || this.page.currentPage,
+      }).then(({ data: { goodsTypeList: items, total } }: AxiosResponse<{ goodsTypeList: ICategory[], total: number }>) => {
+        this.dataList = items
+        this.page.total = total
+        if (done) { done() }
+      }).finally(() => {
         this.dataListLoading = false
       })
     },
-    // 新增 / 修改
-    addOrUpdateHandle (id) {
-      this.addOrUpdateVisible = true
-      this.$nextTick(() => {
-        this.$refs.addOrUpdate.init(id)
+
+    addItem({ name }: { name: string }, done?: Function, loading?: Function) {
+      // 新增项所在的页(应该是最后一页吧)
+      let newpage = clone(this.page)
+      newpage.total += 1
+      newpage.currentPage = ceil(newpage.total / newpage.pageSize)
+      return this.AddOrUpdateItem({ name }, done, loading, newpage)
+    },
+
+    updateItem(data: ICategory, index?: number, done?: Function, loading?: Function) {
+      // 修改项更新后所在的页(不应该放在最后吧)
+      // TODO: 告诉后端查询时按照id排序
+      let newpage = clone(this.page)
+      newpage.currentPage = ceil(newpage.total / newpage.pageSize)
+      return this.AddOrUpdateItem(data, done, loading, newpage)
+    },
+
+    AddOrUpdateItem({ id, name, adminId = 0 }: Partial<ICategory> & { name: string }, done?: Function, loading?: Function, newpage?: IPage) {
+      let request: AxiosPromise
+      if (id !== undefined) {
+        request = httpx.post("/goodsTypes/updateGoodsType", {
+          id, name, adminId
+        })
+      } else {
+        request = httpx.post("/goodsTypes/addGoodsType", {
+          name, adminId
+        })
+      }
+      return request.then(({ data }) => {
+        this.getDataList(newpage)
+        this.$message({
+          message: '操作成功',
+          type: 'success',
+          duration: 1000,
+        })
+        if (done) { done() }
+        if (loading) { loading() }
       })
     },
-    // 删除
-    deleteHandle (id) {
-      this.$confirm(`确定进行删除操作?`, '提示', {
+
+    deleteItem({ id }: ICategory) {
+      return this.$confirm(`确定进行删除操作?`, '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        this.$http({
-          url: this.$http.adornUrl(`/prod/category/${id}`),
-          method: 'delete',
-          data: this.$http.adornData()
-        }).then(({ data }) => {
+        httpx.post("/goodsTypes/deleteGoodsType", { id }).then(({ data }) => {
+          this.getDataList()
           this.$message({
             message: '操作成功',
             type: 'success',
-            duration: 1500,
-            onClose: () => {
-              this.getDataList()
-            }
+            duration: 1000
           })
         })
       })
     }
   }
-}
-</script>
-<style lang="scss">
-.mod-category {
-  img {
-    height: 80px;
-    width: 200px;
-  }
-}
-</style>
+})
+</script>

+ 1 - 29
src/views/modules/user/user.vue

@@ -43,7 +43,7 @@ export default {
       addOrUpdateVisible: false,
       tableOption: tableOption,
       page: {
-        total: 12, // 总页数
+        total: 1, // 总页数
         currentPage: 1, // 当前页数
         pageSize: 10 // 每页显示多少条
       }
@@ -99,34 +99,6 @@ export default {
         this.$refs.addOrUpdate.init(id)
       })
     },
-    // 删除
-    deleteHandle(id) {
-      var ids = id ? [id] : this.dataListSelections.map(item => {
-        return item.userId
-      })
-      this.$confirm(`确定进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      })
-        .then(() => {
-          this.$http({
-            url: this.$http.adornUrl('/admin/user'),
-            method: 'delete',
-            data: this.$http.adornData(ids, false)
-          }).then(({ data }) => {
-            this.$message({
-              message: '操作成功',
-              type: 'success',
-              duration: 1500,
-              onClose: () => {
-                this.getDataList(this.page)
-              }
-            })
-          })
-        })
-        .catch(() => { })
-    },
     // 条件查询
     searchChange(params, done) {
       this.getDataList(this.page, params, done)

+ 7 - 0
vue.config.js

@@ -42,6 +42,13 @@ module.exports = {
       alias: {
         '@': resolve('src')
       }
+    },
+    devServer:{
+      proxy: {
+        // "^/user": {target: "http://192.168.58.137:10086"},
+        "^/(user|goods|goodsTypes)/": {target: "http://127.0.0.1:10086"},
+        "^/.*": {target: "http://116.63.32.160:8085"},
+      },
     }
   },
   chainWebpack(config) {