ソースを参照

积分管理模块页面搭建完成

sunny 2 年 前
コミット
3c828eec51

+ 75 - 0
src/api/pointManage.js

@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+
+export function getPointInstructionsDetail(query) {
+  return request({
+    url: '/news/getdgtIndustryNews',
+    method: 'post',
+    data: query
+  })
+}
+
+export function updatePointInstructions(query) {
+  return request({
+    url: '/news/listForDGTSiteNews',
+    method: 'post',
+    data: query
+  })
+}
+
+export function pointRulesTypeList(data) {
+  return request({
+    url: '/news/createForDGTSiteNews',
+    method: 'post',
+    data
+  })
+}
+
+export function getPointRulesList(query) {
+  return request({
+    url: '/news/update',
+    method: 'post',
+    data:query
+  })
+}
+
+export function updatePointRulesItem(data) {
+  return request({
+    url: '/news/delete',
+    method: 'post',
+    data
+  })
+}
+
+export function companyTypeList(query) {
+  return request({
+    url: '/news/createForDGTSiteNews',
+    method: 'post',
+    data:query
+  })
+}
+
+export function depTypeList(query) {
+  return request({
+    url: '/news/createForDGTSiteNews',
+    method: 'post',
+    data:query
+  })
+}
+
+export function getPointList(query) {
+  return request({
+    url: '/news/createForDGTSiteNews',
+    method: 'post',
+    data:query
+  })
+}
+
+export function getItemPointList(query) {
+  return request({
+    url: '/news/createForDGTSiteNews',
+    method: 'post',
+    data:query
+  })
+}
+
+

+ 4 - 2
src/permission.js

@@ -15,6 +15,8 @@ function hasPermission(roles, permissionRoles) {
 }
 
 const whiteList = ['/login', '/authredirect']// no redirect whitelist
+//自定义路由
+const myRoles = ['pointManage', 'pointInstructions', 'pointRulesList', 'pointList']
 
 router.beforeEach((to, from, next) => {
   NProgress.start() // start progress bar
@@ -27,8 +29,8 @@ router.beforeEach((to, from, next) => {
       if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息
         store.dispatch('GetUserInfo').then(res => {
           store.dispatch('GetUserMenus').then(res => { // 拉取user_info
-            const roles = res.data.data // note: roles must be a array! such as: ['editor','develop']
-            // const roles = ['userManage', 'user', 'address']
+            // const roles = res.data.data // note: roles must be a array! such as: ['editor','develop']
+            const roles = myRoles;
             store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表
               router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
               next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record

+ 15 - 0
src/router/index.js

@@ -52,6 +52,21 @@ export default new Router({
 })
 
 export const asyncRouterMap = [
+  {
+    path: '/pointManage',
+    component: Layout,
+    redirect: 'noredirect',
+    name: 'pointManage',
+    meta: {
+      title: '积分管理',
+      icon: 'people'
+    },
+    children: [
+      { path: 'pointInstructions', component: _import('pointManage/pointInstructions'), name: 'pointInstructions', meta: { title: '积分规则说明书', noCache: true }},
+      { path: 'pointRulesList', component: _import('pointManage/pointRulesList'), name: 'pointRulesList', meta: { title: '积分规则列表', noCache: true }},
+      { path: 'pointList', component: _import('pointManage/pointList'), name: 'pointList', meta: { title: '积分列表', noCache: true }},
+    ]
+  },
   {
     path: '/user',
     component: Layout,

ファイルの差分が大きいため隠しています
+ 85 - 0
src/views/pointManage/pointInstructions.vue


+ 371 - 0
src/views/pointManage/pointList.vue

@@ -0,0 +1,371 @@
+<template>
+    <div class="app-container calendar-list-container">
+
+        <!-- 查询和其他操作 -->
+        <div class="filter-container">
+            <el-select v-model="listQuery.companyType" clearable placeholder="请选择公司主体" style="top: -4px;width: 200px;">
+                <el-option :key="item.type" v-for="item in companyTypeList" :label="item.name" :value="item.type">
+                </el-option>
+            </el-select>
+            <el-select v-model="listQuery.depType" clearable placeholder="请选择部门" style="top: -4px;width: 200px;">
+                <el-option :key="item.type" v-for="item in depTypeList" :label="item.name" :value="item.type">
+                </el-option>
+            </el-select>
+            <el-input clearable class="filter-item" style="width: 200px;" placeholder="请输入员工姓名"
+                v-model="listQuery.name"></el-input>
+            <el-date-picker class="filter-item" v-model="listQuery.time" type="datetime" placeholder="选择生成时间">
+            </el-date-picker>
+            <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查找</el-button>
+            <el-button class="filter-item" type="primary"  :loading="downloadLoading" v-waves icon="el-icon-download" @click="handleDownload">导出</el-button>
+
+        </div>
+
+        <!-- 查询结果 -->
+        <el-table size="small" :data="list" v-loading="listLoading" element-loading-text="正在查询中。。。" border fit
+            highlight-current-row>
+            <el-table-column type="index" label="序号" header-align="center" align="center">
+            </el-table-column>
+
+            <el-table-column align="center" min-width="100px" label="员工姓名" prop="name">
+            </el-table-column>
+
+            <el-table-column align="center" min-width="200px" label="公司主体" prop="companyName">
+            </el-table-column>
+
+            <el-table-column align="center" min-width="80px" label="部门" prop="depName">
+            </el-table-column>
+            <el-table-column align="center" min-width="80px" label="积分" prop="integral">
+            </el-table-column>
+            <el-table-column align="center" label="操作" width="240px" class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                    <el-button type="primary" size="small" @click="handleView(scope.row, false)">查看</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+
+        <!-- 分页 -->
+        <div class="pagination-container">
+            <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                :current-page="listQuery.page" :page-sizes="[10, 20, 30, 50]" :page-size="listQuery.limit"
+                layout="total, sizes, prev, pager, next, jumper" :total="total">
+            </el-pagination>
+        </div>
+
+        <!-- 员工积分记录列表 -->
+        <el-dialog title="员工积分记录" :visible.sync="dialogFormVisible" width="70%">
+            <div class="filter-container">
+                <el-select v-model="itemListQuery.type" clearable placeholder="请选择积分类型" style="top: -4px;width: 200px;">
+                    <el-option :key="item.type" v-for="item in allTypeList" :label="item.name" :value="item.type">
+                    </el-option>
+                </el-select>
+                <el-date-picker class="filter-item" v-model="itemListQuery.time" type="datetime" placeholder="选择生成时间">
+                </el-date-picker>
+                <el-button class="filter-item" type="primary" v-waves icon="el-icon-search"
+                    @click="itemHandleFilter">查找</el-button>
+                <el-button class="filter-item" type="primary" v-waves icon="el-icon-download">导出</el-button>
+
+            </div>
+            <!-- 查询结果 -->
+            <el-table size="small" :data="itemList" v-loading="listLoading" element-loading-text="正在查询中。。。" border fit
+                highlight-current-row>
+                <el-table-column type="index" label="序号" header-align="center" align="center">
+                </el-table-column>
+
+                <el-table-column align="center" min-width="100px" label="员工姓名" prop="name">
+                </el-table-column>
+
+                <el-table-column align="center" min-width="200px" label="积分类型" prop="integralCategory">
+                </el-table-column>
+
+                <el-table-column align="center" min-width="80px" label="积分名称" prop="integralName">
+                </el-table-column>
+                <el-table-column align="center" min-width="80px" label="积分" prop="integral">
+                </el-table-column>
+                <el-table-column align="center" min-width="80px" label="生成时间" prop="time">
+                </el-table-column>
+            </el-table>
+
+            <!-- 分页 -->
+            <div class="pagination-container">
+                <el-pagination background @size-change="itemHandleSizeChange" @current-change="itemHandleCurrentChange"
+                    :current-page="itemListQuery.page" :page-sizes="[10, 20, 30, 50]" :page-size="itemListQuery.limit"
+                    layout="total, sizes, prev, pager, next, jumper" :total="itemTotal">
+                </el-pagination>
+            </div>
+        </el-dialog>
+
+    </div>
+</template>
+  
+<style>
+.demo-table-expand {
+    font-size: 0;
+}
+
+.demo-table-expand label {
+    width: 200px;
+    color: #99a9bf;
+}
+
+.demo-table-expand .el-form-item {
+    margin-right: 0;
+    margin-bottom: 0;
+}
+</style>
+  
+<script>
+import { getPointList, getItemPointList, companyTypeList, depTypeList, pointRulesTypeList } from "@/api/pointManage";
+import waves from "@/directive/waves"; // 水波纹指令
+import Tinymce from '@/components/Tinymce'
+
+export default {
+    name: 'pointList',
+    components: { Tinymce },
+    directives: { waves },
+    data() {
+        return {
+            companyTypeList: [
+                {
+                    type: 'highTechnology',
+                    name: '高科技'
+                },
+                {
+                    type: 'fastExtinction',
+                    name: '快销'
+                },
+                {
+                    type: 'manufacturingIndustry',
+                    name: '制造业'
+                },
+                {
+                    type: 'all',
+                    name: '全部'
+                },
+            ],
+            depTypeList: [
+                {
+                    type: 1,
+                    name: '启用'
+                },
+                {
+                    type: 0,
+                    name: '禁用'
+                },
+            ],
+            allTypeList: [
+                {
+                    type: 'highTechnology',
+                    name: '高科技'
+                },
+                {
+                    type: 'fastExtinction',
+                    name: '快销'
+                },
+                {
+                    type: 'manufacturingIndustry',
+                    name: '制造业'
+                },
+                {
+                    type: 'all',
+                    name: '全部'
+                },
+            ],
+            list: [
+                {
+                    id: 1,
+                    name: '类型1',
+                    companyName: '名称1',
+                    depName: '代码1',
+                    integral: '100',
+                    flag: 1
+                },
+                {
+                    id: 2,
+                    name: '类型2',
+                    companyName: '名称2',
+                    depName: '代码2',
+                    integral: '200',
+                    flag: 0
+                },
+                {
+                    id: 3,
+                    name: '类型3',
+                    companyName: '名称3',
+                    depName: '代码3',
+                    integral: '300',
+                    flag: 1
+                },
+            ],
+            itemList: [
+                {
+                    id: 1,
+                    name: '类型1',
+                    integralCategory: '名称1',
+                    integralName: '代码1',
+                    integral: '100',
+                    time: '2023-4-3'
+                },
+                {
+                    id: 2,
+                    name: '类型1',
+                    integralCategory: '名称1',
+                    integralName: '代码1',
+                    integral: '100',
+                    time: '2023-4-3'
+                },
+                {
+                    id: 3,
+                    name: '类型1',
+                    integralCategory: '名称1',
+                    integralName: '代码1',
+                    integral: '100',
+                    time: '2023-4-3'
+                },
+            ],
+            total: 0,
+            itemTotal: 0,
+            listLoading: false,
+            downloadLoading: false,
+            listQuery: {
+                page: 1,
+                limit: 10,
+                companyType: '',
+                depType: '',
+                name: '',
+                time: '',
+            },
+            itemListQuery: {
+                page: 1,
+                limit: 10,
+                id: '',
+                type: '',
+                time: '',
+            },
+            dialogFormVisible: false,
+        }
+    },
+    created() {
+        // this.getCompanyTypeList();
+        // this.getDepTypeList(); 
+        // this.getList();
+    },
+    methods: {
+        handleDownload() {
+            this.downloadLoading = true
+            import('@/vendor/Export2Excel').then(excel => {
+            const tHeader = ['员工姓名', '公司主体', '部门', '积分', ]
+            const filterVal = ['name','companyName', 'depName', 'integral']
+            excel.export_json_to_excel2(tHeader, this.list, filterVal, '积分列表')
+            this.downloadLoading = false
+            })
+        },
+        getCompanyTypeList() {
+            companyTypeList().then(response => {
+                this.companyTypeList = response.data.data;
+            }).catch(() => {
+                this.companyTypeList = []
+            });
+        },
+        getDepTypeList() {
+            depTypeList().then(response => {
+                this.depTypeList = response.data.data;
+            }).catch(() => {
+                this.depTypeList = []
+            });
+        },
+        getPointRulesType() {
+            pointRulesTypeList().then(response => {
+                this.allTypeList = response.data.data;
+            }).catch(() => {
+                this.allTypeList = []
+            });
+        },
+        getList() {
+            this.listLoading = true
+            getPointList(this.listQuery).then(response => {
+                this.list = response.data.data.items
+                this.total = response.data.data.total
+                this.listLoading = false
+            }).catch(() => {
+                this.list = []
+                this.total = 0
+                this.listLoading = false
+            })
+        },
+        getItemList() {
+            this.listLoading = true
+            getItemPointList(this.itemListQuery).then(response => {
+                this.itemList = response.data.data.items
+                this.itemLotal = response.data.data.total
+                this.listLoading = false
+            }).catch(() => {
+                this.itemList = []
+                this.itemLotal = 0
+                this.listLoading = false
+            })
+        },
+        handleFilter() {
+            this.listQuery.page = 1
+            this.getList()
+        },
+
+        handleSizeChange(val) {
+            this.listQuery.limit = val
+            this.getList()
+        },
+
+        handleCurrentChange(val) {
+            this.listQuery.page = val
+            this.getList()
+        },
+        itemHandleFilter() {
+            this.itemListQuery.page = 1
+            this.getItemList()
+        },
+
+        itemHandleSizeChange(val) {
+            this.itemListQuery.limit = val
+            this.getItemList()
+        },
+
+        itemHandleCurrentChange(val) {
+            this.itemListQuery.page = val
+            this.getItemList()
+        },
+
+        handleView(row) {
+            this.itemListQuery.id = row.id;
+            // getPointRulesType()
+            // this.getItemList()
+            this.dialogFormVisible = true
+        },
+    }
+}
+</script>
+<style>
+.ad-avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+}
+
+.ad-avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+}
+
+.ad-avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 178px;
+    height: 178px;
+    line-height: 178px;
+    text-align: center;
+}
+
+.ad-avatar {
+    display: block;
+}
+</style>
+  

+ 335 - 0
src/views/pointManage/pointRulesList.vue

@@ -0,0 +1,335 @@
+<template>
+    <div class="app-container calendar-list-container">
+  
+      <!-- 查询和其他操作 -->
+      <div class="filter-container">
+        <el-select v-model="listQuery.type" clearable placeholder="请选择积分类型" style="top: -4px;width: 200px;">
+          <el-option
+                  :key="item.type"
+                  v-for="item in allTypeList"
+                  :label="item.name"
+                  :value="item.type"
+                >
+                </el-option>
+        </el-select>
+        <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查找</el-button>
+  
+      </div>
+  
+      <!-- 查询结果 -->
+      <el-table
+        size="small"
+        :data="list"
+        v-loading="listLoading"
+        @selection-change="handleSelectionChange"
+        element-loading-text="正在查询中。。。"
+        border
+        fit
+        highlight-current-row
+      >
+        <!-- <el-table-column type="selection" width="55px"> </el-table-column> -->
+        <el-table-column type="index" label="序号" header-align="center" align="center">
+        </el-table-column>
+  
+        <el-table-column align="center" min-width="100px" label="积分类型" prop="integralCategory">
+        </el-table-column>
+  
+        <el-table-column align="center" min-width="200px" label="积分名称" prop="integralName">
+        </el-table-column>
+  
+        <el-table-column align="center" min-width="80px" label="积分规则代码" prop="integralSeq">
+        </el-table-column>
+        <el-table-column align="center" min-width="80px" label="积分" prop="integral">
+        </el-table-column>
+        <el-table-column align="center" min-width="80px" label="规则状态">
+          <template slot-scope="props">
+            <el-tag type="success" v-if="props.row.flag == 1">启用</el-tag>
+            <el-tag type="danger" v-if="props.row.flag == 0">禁用</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="操作" width="240px" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              type="primary"
+              size="small"
+              @click="handleUpdate(scope.row, false)"
+              >编辑</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+  
+      <!-- 分页 -->
+      <div class="pagination-container">
+        <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listQuery.page"
+          :page-sizes="[10,20,30,50]" :page-size="listQuery.limit" layout="total, sizes, prev, pager, next, jumper" :total="total">
+        </el-pagination>
+      </div>
+  
+      <!-- 添加或修改对话框 -->
+      <el-dialog
+        :title="textMap[dialogStatus]"
+        :visible.sync="dialogFormVisible"
+        width="70%"
+      >
+        <el-form :rules="rules" ref="dataForm" :model="dataForm" status-icon label-position="left" label-width="100px" style='width:700px; margin-left:50px;'>
+         <el-form-item  label="积分" prop="integral">
+              <el-input v-model="dataForm.integral"></el-input>
+            </el-form-item>
+              <el-form-item
+              label="规则状态"
+              prop="flag"
+            >
+              <el-select
+                v-model="dataForm.flag"
+                filterable
+                placeholder="请选择"
+                style="width: 350px"
+              >
+                <el-option
+                  :key="item.type"
+                  v-for="item in flagList"
+                  :label="item.name"
+                  :value="item.type"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="dialogFormVisible = false">取消</el-button>
+          <el-button type="primary" @click="updateData">确定</el-button>
+        </div>
+      </el-dialog>
+  
+    </div>
+  </template>
+  
+  <style>
+    .demo-table-expand {
+      font-size: 0;
+    }
+    .demo-table-expand label {
+      width: 200px;
+      color: #99a9bf;
+    }
+    .demo-table-expand .el-form-item {
+      margin-right: 0;
+      margin-bottom: 0;
+    }
+  </style>
+  
+  <script>
+    import {pointRulesTypeList, getPointRulesList, updatePointRulesItem} from "@/api/pointManage";
+    import waves from "@/directive/waves"; // 水波纹指令
+    import Tinymce from '@/components/Tinymce'
+  
+  export default {
+    name: 'pointRulesList',
+    components: { Tinymce },
+    directives: { waves },
+    data() {
+      return {
+        allTypeList:[
+            {
+                type:'highTechnology',
+                name:'高科技'
+            },
+            {
+                type:'fastExtinction',
+                name:'快销'
+            },
+            {
+                type:'manufacturingIndustry',
+                name:'制造业'
+            },
+            {
+                type:'all',
+                name:'全部'
+            },
+        ],
+        flagList:[
+        {
+            type:1,
+            name:'启用'
+          },
+          {
+            type:0,
+            name:'禁用'
+          },
+        ],
+        list: [
+            {
+                id:1,
+                integralCategory:'类型1',
+                integralName:'名称1',
+                integralSeq:'代码1',
+                integral:'100',
+                flag:1
+            },
+             {
+                id:2,
+                integralCategory:'类型2',
+                integralName:'名称2',
+                integralSeq:'代码2',
+                integral:'200',
+                flag:0
+            },
+             {
+                id:3,
+                integralCategory:'类型3',
+                integralName:'名称3',
+                integralSeq:'代码3',
+                integral:'300',
+                flag:1
+            },
+            {
+                id:4,
+                integralCategory:'类型1',
+                integralName:'名称1',
+                integralSeq:'代码1',
+                integral:'100',
+                flag:1
+            },
+             {
+                id:5,
+                integralCategory:'类型2',
+                integralName:'名称2',
+                integralSeq:'代码2',
+                integral:'200',
+                flag:0
+            },
+             {
+                id:6,
+                integralCategory:'类型3',
+                integralName:'名称3',
+                integralSeq:'代码3',
+                integral:'300',
+                flag:1
+            },
+        ],
+        delarr: [],
+        multipleSelection: [],
+        total: 0,
+        listLoading: false,
+        listQuery: {
+          page: 1,
+          limit: 10,
+          type: '',
+          title: '',
+        },
+        dataForm: {
+          integral: undefined,
+          flag: undefined,
+        },
+        dialogFormVisible: false,
+        dialogStatus: '',
+        textMap: {
+          update: "编辑",
+          create: "创建",
+        },
+        rules: {
+            integral: [{ required: true, message: "积分不能为空", trigger: "blur" }],
+            flag: [{ required: true, message: "请选择规则状态", trigger: "blur" }],
+        },
+      }
+    },
+    created() {
+  
+      // getPointRulesType();
+      // this.getList();
+    },
+    methods: {
+      getPointRulesType() {
+        pointRulesTypeList().then(response => {
+          this.allTypeList = response.data.data;
+        }).catch(() => {
+          this.allTypeList = []
+        });
+      },
+       
+      getList() {
+        this.listLoading = true
+        getPointRulesList(this.listQuery).then(response => {
+          this.list = response.data.data.items
+          this.total = response.data.data.total
+          this.listLoading = false
+        }).catch(() => {
+          this.list = []
+          this.total = 0
+          this.listLoading = false
+        })
+      },
+  
+      handleFilter() {
+        this.listQuery.page = 1
+        this.getList()
+      },
+  
+      handleSizeChange(val) {
+        this.listQuery.limit = val
+        this.getList()
+      },
+  
+      handleCurrentChange(val) {
+        this.listQuery.page = val
+        this.getList()
+      },
+  
+      handleUpdate(row) {
+        this.dataForm = Object.assign({}, row);
+        this.dialogStatus = 'update'
+        this.dialogFormVisible = true
+        this.$nextTick(() => {
+          this.$refs['dataForm'].clearValidate()
+        })
+      },
+  
+      updateData() {
+        this.$refs['dataForm'].validate((valid) => {
+          if (valid) {
+            // updatePointRulesItem(this.dataForm).then(() => {
+                this.dialogFormVisible = false
+                this.$notify({
+                  title: '成功',
+                  message: '更新成功',
+                  type: 'success',
+                  duration: 2000
+                })
+                // this.getList()
+            //   }) 
+          }
+        })
+      },
+  
+    
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+    }
+  }
+  </script>
+  <style>
+    .ad-avatar-uploader .el-upload {
+      border: 1px dashed #d9d9d9;
+      border-radius: 6px;
+      cursor: pointer;
+      position: relative;
+      overflow: hidden;
+    }
+    .ad-avatar-uploader .el-upload:hover {
+      border-color: #409EFF;
+    }
+    .ad-avatar-uploader-icon {
+      font-size: 28px;
+      color: #8c939d;
+      width: 178px;
+      height: 178px;
+      line-height: 178px;
+      text-align: center;
+    }
+    .ad-avatar {
+      display: block;
+    }
+  </style>
+