浏览代码

权限增加

1004749546@qq.com 4 年之前
父节点
当前提交
b5803b330b

+ 15 - 0
src/api/OperateJournal.js

@@ -0,0 +1,15 @@
+import { axios } from '@/utils/request'
+
+// 操作日志列表
+export const journalList = (params) => {
+  let url = `/sysLog/queryLike/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios.request({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+

+ 3 - 3
src/api/menu.js

@@ -2,7 +2,7 @@ import { axios } from '@/utils/request'
 
 // 获取菜单树数据
 export const getMenuList = params => {
-  const url = `/menu/findAll`
+  const url = `/yymenu/findAll`
   return axios({
     url: url,
     data: params,
@@ -12,7 +12,7 @@ export const getMenuList = params => {
 
 // 保存
 export const saveMenu = params => {
-  const url = `/menu/save`
+  const url = `/yymenu/save`
   return axios({
     url: url,
     data: params,
@@ -22,7 +22,7 @@ export const saveMenu = params => {
 
 // 删除
 export const deleteMenu = params => {
-  const url = `/menu/delete/${params.id}`
+  const url = `/yymenu/delete/${params.id}`
   return axios({
     url: url,
     method: 'get'

+ 7 - 7
src/api/power-role.js

@@ -5,7 +5,7 @@ export const getPowerRoleList = params => {
   const url = `/yyrole/queryLike/${params.pageNo}/${params.pageSize}`
   delete params.pageNo
   delete params.pageSize
-  return axios.request({
+  return axios({
     url: url,
     data: params,
     method: 'POST'
@@ -14,7 +14,7 @@ export const getPowerRoleList = params => {
 
 // 改变权限状态接口 flag 0:禁用 1:启用
 export const updateEnableStatus = params => {
-  return axios.request({
+  return axios({
     url: `/yyrole/enable/${params.id}/${params.flag}`,
     data: {},
     method: 'get'
@@ -23,7 +23,7 @@ export const updateEnableStatus = params => {
 
 // 删除用户接口
 export const delectRolePower = params => {
-  return axios.request({
+  return axios({
     url: `/yyrole/delete/${params.id}`,
     data: {},
     method: 'get'
@@ -32,7 +32,7 @@ export const delectRolePower = params => {
 
 // 新增/编辑保存接口
 export const saveRolePower = params => {
-  return axios.request({
+  return axios({
     url: '/yyrole/save',
     data: params,
     method: 'POST'
@@ -42,7 +42,7 @@ export const saveRolePower = params => {
 // 获取菜单树数据
 export const getMenuList = params => {
   const url = `/yyrole/findAllMenu/${params.id}`
-  return axios.request({
+  return axios({
     url: url,
     method: 'get'
   })
@@ -51,9 +51,9 @@ export const getMenuList = params => {
 // 保存权限分配
 export const addMenuPower = params => {
   const url = `/yyrole/saveRoleMenu`
-  return axios.request({
+  return axios({
     url: url,
     data: params,
     method: 'post'
   })
-}
+}

+ 8 - 7
src/api/power-user.js

@@ -1,8 +1,9 @@
 import { axios } from '@/utils/request'
+
 // 重置密码
 export const resetPSD = params => {
-  return axios.request({
-    url: '/yyuser/resetPwd',
+  return axios({
+    url: `/zxyj/user/resetPwd`,
     data: params,
     method: 'POST'
   })
@@ -13,7 +14,7 @@ export const getPowerUserList = params => {
   const url = `/yyuser/queryLike/${params.pageNo}/${params.pageSize}`
   delete params.pageNo
   delete params.pageSize
-  return axios.request({
+  return axios({
     url: url,
     data: params,
     method: 'POST'
@@ -22,7 +23,7 @@ export const getPowerUserList = params => {
 
 // 改变权限状态接口
 export const updateEnableStatus = params => {
-  return axios.request({
+  return axios({
     url: `/yyuser/enable/${params.id}/${params.flag}`,
     data: {},
     method: 'get'
@@ -31,7 +32,7 @@ export const updateEnableStatus = params => {
 
 // 删除用户接口
 export const delectUserPower = params => {
-  return axios.request({
+  return axios({
     url: `/yyuser/delete/${params.id}`,
     data: {},
     method: 'get'
@@ -40,7 +41,7 @@ export const delectUserPower = params => {
 
 // 新增/编辑保存接口
 export const saveUserPower = params => {
-  return axios.request({
+  return axios({
     url: '/yyuser/save',
     data: params,
     method: 'POST'
@@ -49,7 +50,7 @@ export const saveUserPower = params => {
 
 // 获取角色列表接口
 export const getRoleList = params => {
-  return axios.request({
+  return axios({
     url: '/yyrole/findAll',
     data: params,
     method: 'POST'

+ 22 - 0
src/api/register.js

@@ -0,0 +1,22 @@
+import { axios } from '@/utils/request'
+
+export const listRegister = () => {
+  return axios({
+    url: 'register/findAll',
+    method: 'get'
+  })
+}
+
+export const saveRegister = params => {
+  return axios({
+    url: 'register/save',
+    data: params,
+    method: 'post'
+  })
+}
+export const delRegisterNode = params => {
+  return axios({
+    url: `register/del/${params.id}`,
+    method: 'get'
+  })
+}

+ 47 - 13
src/config/router.config.js

@@ -71,7 +71,7 @@ export const asyncRouterMap = [{
     path: '/storehouseManagement',
     name: 'storehouseManagement',
     component: PageView,
-    meta: { title: '卫星仓管理', icon: 'switcher' },
+    meta: { title: '卫星仓管理', icon: 'switcher', permission: 'M_storehouseManagement' },
     children: [
       /**
         *  之后迭代版本可能有用
@@ -86,19 +86,19 @@ export const asyncRouterMap = [{
         path: 'storeBind/list',
         name: 'StoreBind',
         component: () => import(/* webpackChunkName: "storehouseManagement" */ '@/views/storehouseManagement/storeBind/StoreBindList.vue'),
-        meta: { title: '卫星仓绑定', icon: 'block' }
+        meta: { title: '卫星仓绑定', icon: 'block', permission: 'M_storeBind_list' }
       },
       {
         path: 'customerInfo/list',
         name: 'CustomerList',
         component: () => import(/* webpackChunkName: "storehouseManagement" */ '@/views/storehouseManagement/customerInfo/CustomerList.vue'),
-        meta: { title: '客户信息', icon: 'idcard' }
+        meta: { title: '客户信息', icon: 'idcard', permission: 'M_customerInfo' }
       },
       {
         path: 'productInfo/list',
         name: 'ProductList',
         component: () => import(/* webpackChunkName: "storehouseManagement" */ '@/views/storehouseManagement/productInfo/ProductList.vue'),
-        meta: { title: '产品信息', icon: 'profile' }
+        meta: { title: '产品信息', icon: 'profile', permission: 'M_productInfo' }
       }
     ]
   },
@@ -106,19 +106,19 @@ export const asyncRouterMap = [{
     path: '/supplierManagement',
     name: 'supplierManagement',
     component: PageView,
-    meta: { title: '供应商管理', icon: 'solution' },
+    meta: { title: '供应商管理', icon: 'solution', permission: 'M_supplierManagement' },
     children: [
       {
         path: 'supplierList',
         name: 'SupplierList',
         component: () => import(/* webpackChunkName: "storehouseManagement" */ '@/views/supplierManagement/SupplierList.vue'),
-        meta: { title: '供应商信息', icon: 'contacts' }
+        meta: { title: '供应商信息', icon: 'contacts', permission: 'M_supplierList_list' }
       },
       {
         path: 'organization',
         name: 'Organization',
         component: () => import(/* webpackChunkName: "storehouseManagement" */ '@/views/supplierManagement/Organization.vue'),
-        meta: { title: '组织机构', icon: 'cluster' }
+        meta: { title: '组织机构', icon: 'cluster', permission: 'M_organization_list' }
       }
     ]
   },
@@ -127,9 +127,9 @@ export const asyncRouterMap = [{
     redirect: '/auth/userList',
     component: PageView,
     meta: {
-      title: '运营平台权限管理',
-      icon: 'apartment'
-      // permission: 'M_power_auth'
+      title: '权限管理',
+      icon: 'lock',
+      permission: 'M_auth_0'
     },
     children: [
       {
@@ -153,15 +153,49 @@ export const asyncRouterMap = [{
         }
       },
       {
-        path: '/auth/menu',
-        name: 'powerMenuList',
+        path: '/menusAuth/menu',
+        name: 'powerMenu',
         component: () => import(/* webpackChunkName: "auth" */ '@/views/power/menu/menu.vue'),
         meta: {
           title: '菜单管理',
-          icon: 'bars'
+          icon: 'profile',
+          permission: 'M_power_menu_list'
         }
       }
     ]
+  },
+  {
+    path: '/setting',
+    redirect: '/setting/userList',
+    component: PageView,
+    meta: {
+      title: '系统设置',
+      icon: 'setting',
+      permission: 'M_setting_0'
+    },
+    children: [{
+      path: '/setting/dataDictionary',
+      name: 'powerDD',
+      component: () => import(/* webpackChunkName: "setting" */
+        '@/views/power/dataDictionary/dataDictionary.vue'),
+      meta: {
+        title: '数据字典管理',
+        icon: 'database',
+        permission: 'M_sys_dataDictionary'
+      }
+    },
+    {
+      path: '/setting/OperateJournal',
+      name: 'powerOperateJournal',
+      component: () => import(/* webpackChunkName: "setting" */
+        '@/views/power/OperateJournal/OperateJournal.vue'),
+      meta: {
+        title: '操作日志',
+        icon: 'read',
+        permission: 'M_OperateJournal'
+      }
+    }
+    ]
   }
   ]
 },

+ 22 - 18
src/main.js

@@ -8,39 +8,43 @@ import store from './store/'
 import { VueAxios } from './utils/request'
 
 // mock
-//import './mock'
+// import './mock'
 
 import bootstrap from './core/bootstrap'
 import './core/use'
 import './permission' // permission control
-import './utils/filter' // global filter
+import './utils/filter'
+
+import VueCookies from 'vue-cookies' // global filter
 
 Vue.config.productionTip = false
 
 // mount axios Vue.$http and this.$http
 Vue.use(VueAxios)
-
-import VueCookies from 'vue-cookies'
 Vue.use(VueCookies)
 Vue.$cookies.config('7d')
 /**
  * 权限检查
  */
 Vue.prototype.$hasPermissions = function (value) {
- let isExist = false;
- const roles = store.getters.roles
- const permissionList = roles.permissionList
- //console.log(permissionsStr,'permissionsStr')
- if (permissionList == undefined || permissionList == null) {
-  return false;
- }
- let has = permissionList.find(item => {
-   return item == value
- })
- if (has) {
-  isExist = true;
- }
- return isExist;
+  let isExist = false
+  const roles = store.getters.roles
+  const permissionList = roles.permissionList
+  // console.log(permissionsStr,'permissionsStr')
+  if (permissionList == undefined || permissionList == null) {
+    return false
+  }
+  const has = permissionList.find(item => {
+    return item == value
+  })
+  if (has) {
+    isExist = true
+  }
+  return isExist
+}
+// 禁止输入框输入空格,换行符,<,>
+Vue.prototype.$filterEmpty = function (e) {
+  return e.target.value.replace(/\s|\r\n|\n|<|>/g, '')
 }
 new Vue({
   router,

+ 1 - 1
src/utils/request.js

@@ -38,7 +38,7 @@ const err = (error) => {
 // request interceptor
 service.interceptors.request.use(config => {
   const token = store.getters.token
-  config.headers['App-Type'] = 8 // 平台类型
+  config.headers['App-Type'] = 1 // 平台类型
   if (token) {
     config.headers['access-token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
   }

+ 134 - 0
src/views/power/OperateJournal/OperateJournal.vue

@@ -0,0 +1,134 @@
+<template>
+  <a-card :bordered="false">
+    <div class="operateJournal">
+      <!-- 搜索框 -->
+      <div class="table-page-search-wrapper" style="margin-bottom: 15px;">
+        <a-form layout="inline">
+          <a-row :gutter="48">
+            <a-col :md="8" :sm="24">
+              <a-form-item label="操作时间">
+                <a-range-picker
+                  :format="dateFormat"
+                  show-time
+                  :placeholder="['开始时间', '结束时间']"
+                  v-model="time"
+                  @change="onChange"
+                  id="OperateJournal-onChange"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="操作人"><a-input allowClear v-model.trim="queryParam.queryWord" :maxLength="30" placeholder="请输入" id="OperateJournal-queryWord"/></a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-button style="margin-right: 10px;" type="primary" @click="$refs.table.refresh(true)" id="OperateJournal-refreshTable">查询</a-button>
+              <a-button type="" @click="resetForm" id="OperateJournal-resetForm">重置</a-button>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        ref="table"
+        size="default"
+        rowKey="id"
+        :columns="columns"
+        :data="loadData"
+        bordered>
+        <span slot="actDesc" slot-scope="text, record">{{ record.actDate }}-{{ record.actDesc }}</span>
+        <span slot="actorName" slot-scope="text, record">{{ record.actorName }}-{{ record.actorPhone }}</span>
+      </s-table>
+    </div>
+  </a-card>
+</template>
+
+<script>
+import { STable } from '@/components'
+import { journalList } from '@/api/OperateJournal.js'
+import getDate from '@/libs/getDate'
+import moment from 'moment'
+export default {
+  name: 'OperateJournal',
+  components: { STable },
+  data () {
+    return {
+      // 列表
+      form: this.$form.createForm(this, {
+        name: 'OperateJournal'
+      }),
+      time: [moment(moment().startOf('day').valueOf()).format(this.dateFormat), moment(moment().valueOf()).format(this.dateFormat)],
+      queryParam: {
+        beginDate: null, // 查询的开始时间
+        endDate: null, // 查询的结束时间
+        queryWord: '' // 操作人
+      },
+      dateFormat: 'YYYY-MM-DD HH:mm:ss',
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'no',
+          width: 60,
+          align: 'center'
+        },
+        {
+          title: '操作人',
+          dataIndex: 'actorName',
+          width: 100,
+          align: 'center',
+          scopedSlots: { customRender: 'actorName' }
+        },
+        {
+          title: 'IP',
+          dataIndex: 'ip',
+          width: 200,
+          align: 'center'
+        },
+        {
+          title: '日志明细',
+          dataIndex: 'actDesc',
+          width: 200,
+          align: 'center',
+          scopedSlots: { customRender: 'actDesc' }
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+		  const searchData = Object.assign(parameter, this.queryParam)
+		  if (this.time && this.time.length) {
+		    searchData.beginDate = moment(this.time[0]).format('YYYY-MM-DD HH:mm:ss')
+		    searchData.endDate = moment(this.time[1]).format('YYYY-MM-DD HH:mm:ss')
+		  } else {
+		    searchData.beginDate = ''
+		    searchData.endDate = ''
+		  }
+        return journalList(searchData).then(res => {
+          const no = (res.data.data.pageNo - 1) * res.data.data.pageSize
+          for (let i = 0; i < res.data.data.list.length; i++) {
+            const _item = res.data.data.list[i]
+            _item.no = no + i + 1
+          }
+          return res.data.data
+        })
+      }
+    }
+  },
+  methods: {
+    moment,
+    // 操作时间change
+    onChange (dates, dateStrings) {
+      this.queryParam.beginDate = dateStrings[0]
+      this.queryParam.endDate = dateStrings[1]
+    },
+    // 重置
+    resetForm () {
+      this.queryParam.beginDate = getDate.getToday().starttime
+      this.queryParam.endDate = getDate.getToday().endtime
+      this.time = [moment(moment().startOf('day').valueOf()).format(this.dateFormat), moment(moment().valueOf()).format(this.dateFormat)]
+      this.queryParam.queryWord = ''
+      this.$refs.table.refresh(true)
+    }
+  }
+
+}
+</script>
+
+<style></style>

+ 336 - 0
src/views/power/dataDictionary/codeItemModal.vue

@@ -0,0 +1,336 @@
+<template>
+  <div>
+    <a-modal
+      class="modalBox"
+      :title="titleText"
+      v-model="isshow"
+      @cancle="cancel"
+      :centered="true"
+      width="45%">
+      <a-form :form="form" @submit="handleSubmit">
+        <a-row :gutter="24">
+          <a-col :span="24">
+            <!-- code -->
+            <a-form-item label="字典码" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
+              <a-input
+                disabled
+                placeholder=""
+                allowClear
+                id="codeItemModal-lookupCode"
+                v-decorator="['formData.lookupCode', {
+                  initialValue: formData.lookupCode,getValueFromEvent: $filterEmpty,
+                  rules: [] }]"
+              />
+            </a-form-item>
+          </a-col>
+        </a-row>
+
+        <a-row :gutter="24">
+          <a-col :span="12" style="padding-right: 0px;">
+            <!-- 名称 -->
+            <a-form-item label="名称" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder="请输入名称(最多30个字符)"
+                id="codeItemModal-dispName"
+                allowClear
+                :maxLength="30"
+                v-decorator="['formData.dispName', {
+                  initialValue: formData.dispName,getValueFromEvent: $filterEmpty,
+                  rules: [{ required: true, message: '请输入名称(最多30个字符)!' }] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <!-- 项编码 -->
+            <a-form-item label="项编码" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder="请输入项编码"
+                id="codeItemModal-code"
+                allowClear
+                v-decorator="['formData.code', {
+                  initialValue: formData.code,getValueFromEvent: $filterEmpty,
+                  rules: [{ required: true, message: '请输入项编码!' }] }]"
+              />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12" style="padding-right: 0px;">
+            <a-form-item label="启用" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-radio-group
+                name="radioGroup"
+                id="codeItemModal-isEnable"
+                v-decorator="[
+                  'formData.isEnable',
+                  {
+                    initialValue: formData.isEnable,
+                    rules: [] },
+                ]"
+              >
+                <a-radio :value="1">是</a-radio>
+                <a-radio :value="0">否</a-radio>
+              </a-radio-group>
+            </a-form-item>
+          </a-col>
+          <!-- 排序值 -->
+          <a-col :span="12">
+            <a-form-item label="排序值" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                type="number"
+                placeholder="请输入(0~999999)之间的序号值"
+                oninput="if(value.length>6)value=value.slice(0,6);if(value<0)value=0"
+                id="codeItemModal-sort"
+                allowClear
+                v-decorator="['formData.sort', {
+                  initialValue: formData.sort,getValueFromEvent: $filterEmpty,
+                  rules: [{ required: true, message: '请输入(0~999999)之间的序号值!' }] }]"
+              />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <!-- 扩展参数 -->
+        <a-row :gutter="24">
+          <a-col :span="12" style="padding-right: 0px;">
+            <!-- 扩展一 -->
+            <a-form-item label="扩展一" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder=""
+                allowClear
+                id="codeItemModal-attr1"
+                v-decorator="['formData.attr1', {
+                  initialValue: formData.attr1,getValueFromEvent: $filterEmpty,
+                  rules: [] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <!-- 扩展二 -->
+            <a-form-item label="扩展二" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder=""
+                allowClear
+                id="codeItemModal-attr2"
+                v-decorator="['formData.attr2', {
+                  initialValue: formData.attr2,getValueFromEvent: $filterEmpty,
+                  rules: [] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12" style="padding-right: 0px;">
+            <!-- 扩展三 -->
+            <a-form-item label="扩展三" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder=""
+                allowClear
+                id="codeItemModal-attr3"
+                v-decorator="['formData.attr3', {
+                  initialValue: formData.attr3,getValueFromEvent: $filterEmpty,
+                  rules: [] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <!-- 扩展四 -->
+            <a-form-item label="扩展四" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder=""
+                allowClear
+                id="codeItemModal-attr4"
+                v-decorator="['formData.attr4', {
+                  initialValue: formData.attr4,getValueFromEvent: $filterEmpty,
+                  rules: [] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12" style="padding-right: 0px;">
+            <!-- 扩展五 -->
+            <a-form-item label="扩展五" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder=""
+                allowClear
+                id="codeItemModal-attr5"
+                v-decorator="['formData.attr5', {
+                  initialValue: formData.attr5,getValueFromEvent: $filterEmpty,
+                  rules: [] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <!-- 扩展六 -->
+            <a-form-item label="扩展六" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder=""
+                allowClear
+                id="codeItemModal-attr6"
+                v-decorator="['formData.attr6', {
+                  initialValue: formData.attr6,getValueFromEvent: $filterEmpty,
+                  rules: [] }]"
+              />
+            </a-form-item>
+          </a-col>
+        </a-row>
+
+        <a-row :gutter="24">
+          <a-col :span="24">
+            <a-form-item label="备注" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
+              <a-textarea
+                v-decorator="[
+                  'formData.remarks',
+                  {
+                    initialValue: formData.remarks,getValueFromEvent: $filterEmpty,
+                    rules: [] },
+                ]"
+                style="min-height: 50px;"
+                placeholder="请输入备注(最多500个字符)"
+                :maxLength="500"
+                id="codeItemModal-remarks"
+                autosize />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+          <a-button type="primary" @click="handleSubmit()" id="codeItemModal-handleSubmit">
+            保存
+          </a-button>
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()" id="codeItemModal-handleCancel">
+            取消
+          </a-button>
+        </a-form-item>
+      </a-form>
+
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { saveLookUpItem } from '@/api/lookup.js'
+export default {
+  name: 'CodeItemModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      titleText: '新增字典项',
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'miniForm' }),
+      roleList: [],
+      formData: {
+        lookupCode: '',
+        code: '', // code
+        dispName: '',
+        isEnable: 1, // 活动状态
+        sort: '',
+        attr1: '',
+        attr2: '',
+        attr3: '',
+        attr4: '',
+        attr5: '',
+        attr6: '',
+        remarks: ''
+      }
+
+    }
+  },
+  methods: {
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        console.log(values, 'values222')
+        if (!err) {
+          console.log(values.formData, ' formData.type222222222')
+          saveLookUpItem(Object.assign(this.formData, values.formData)).then(res => {
+            console.log(res, 'res--save')
+            if (res.status + '' === '200') {
+              this.$message.success(res.message)
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      this.cancel()
+    },
+    clear () {
+      this.form.resetFields()
+      delete this.formData.id
+      this.formData.lookupCode = ''
+      this.formData.code = ''
+      this.formData.dispName = ''
+      this.formData.isEnable = 1
+      this.formData.sort = ''
+      this.formData.attr1 = ''
+      this.formData.attr2 = ''
+      this.formData.attr3 = ''
+      this.formData.attr4 = ''
+      this.formData.attr5 = ''
+      this.formData.attr6 = ''
+      this.formData.remarks = ''
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'miniForm' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data.id) { // 编辑
+          this.titleText = '编辑字典项'
+          this.formData = Object.assign({}, this.data)
+
+          delete this.formData.no
+          this.formData.isEnable = Number(this.formData.isEnable)
+          console.log(this.formData, 'this.formData')
+        } else {
+          this.formData.lookupCode = this.data.lookupCode
+          this.titleText = '新增字典项'
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style scoped="scoped">
+  .modalBox{
+    width: 650px !important;
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 207 - 0
src/views/power/dataDictionary/codeModal.vue

@@ -0,0 +1,207 @@
+<template>
+  <div>
+    <a-modal
+      class="modalBox"
+      :title="titleText"
+      v-model="isshow"
+      @cancle="cancel"
+      :centered="true"
+      width="45%">
+      <a-form :form="form" @submit="handleSubmit">
+        <!-- 类别编码 -->
+        <a-form-item label="类别编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            id="codeModal-code"
+            placeholder="请输入类别编码"
+            :disabled="true"
+            allowClear
+            v-decorator="['formData.code', {
+              initialValue: formData.code,getValueFromEvent: $filterEmpty,
+              rules: [{ required: true, message: '请输入类别编码!' }] }]"
+          />
+        </a-form-item>
+
+        <!-- 名称 -->
+        <a-form-item label="名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入名称30个字以内"
+            id="codeModal-name"
+            allowClear
+            :maxLength="30"
+            v-decorator="['formData.name', {
+              initialValue: formData.name,getValueFromEvent: $filterEmpty,
+              rules: [{ required: true, message: '请输入名称30个字以内!' }] }]"
+          />
+        </a-form-item>
+
+        <!-- 排序值 -->
+        <a-form-item label="排序值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            type="number"
+            placeholder="请输入排序值"
+            id="codeModal-sort"
+            allowClear
+            v-decorator="['formData.sort', {
+              initialValue: formData.sort,getValueFromEvent: $filterEmpty,
+              rules: [{ required: true, message: '请输入排序值!' }] }]"
+          />
+        </a-form-item>
+        <!-- 状态 -->
+        <a-form-item label="启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-radio-group
+            name="radioGroup"
+            id="codeModal-isEnable"
+            v-decorator="[
+              'formData.isEnable',
+              {
+                initialValue: formData.isEnable,
+                rules: [{ required: true, message: '请选择状态!' }] },
+            ]"
+          >
+            <a-radio :value="1">是</a-radio>
+            <a-radio :value="0">否</a-radio>
+          </a-radio-group>
+        </a-form-item>
+
+        <a-form-item label="备注" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-textarea
+            v-decorator="[
+              'formData.remarks',
+              { initialValue: formData.remarks,getValueFromEvent: $filterEmpty,
+                rules: [] },
+            ]"
+            :maxLength="500"
+            id="codeModal-remarks"
+            style="min-height: 60px;"
+            placeholder=""
+            autosize />
+        </a-form-item>
+
+        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+          <a-button type="primary" @click="handleSubmit()" id="codeModal-handleSubmit">
+            保存
+          </a-button>
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()" id="codeModal-handleCancel">
+            取消
+          </a-button>
+        </a-form-item>
+      </a-form>
+
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { saveLookUp } from '@/api/lookup.js'
+export default {
+  name: 'CodeModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      titleText: '新增字典',
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'miniForm' }),
+      formData: {
+        name: '',
+        code: '',
+        sort: '',
+        isEnable: '', // 活动状态
+        remarks: ''
+      }
+
+    }
+  },
+  methods: {
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          console.log(values.formData, ' formData.type222222222')
+          saveLookUp(Object.assign(this.formData, values.formData)).then(res => {
+            console.log(res, 'res--save')
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.warning(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      this.cancel()
+    },
+    clear () {
+      this.form.resetFields()
+      delete this.formData.id
+      this.formData.name = ''
+      this.formData.code = ''
+      this.formData.sort = ''
+      this.formData.isEnable = ''
+      this.formData.remarks = ''
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'miniForm' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data.id) { // 编辑
+          this.formData.titleText = '编辑字典'
+          this.formData = Object.assign({}, this.data)
+
+          delete this.formData.no
+          this.formData.isEnable = Number(this.formData.isEnable)
+          console.log(this.formData, 'this.formData')
+        } else {
+          this.formData.titleText = '新增字典'
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 408 - 0
src/views/power/dataDictionary/dataDictionary.vue

@@ -0,0 +1,408 @@
+<template>
+  <a-card :bordered="false">
+    <a-row :gutter="24">
+      <!-- 左侧字典列表 -->
+      <a-col :span="6">
+        <a-row :gutter="24">
+          <!-- <a-button style="margin-right: 10px;" type="primary" icon="plus" @click="addCode">新增字典</a-button> -->
+          <a-button style="margin-right: 10px;" type="primary" icon="plus" @click="editCode">编辑字典</a-button>
+          <!-- <a-select style="width: 110px" placeholder="更多操作" allowClear >
+               <a-select-option @click="editCode" value="编辑字典">编辑字典</a-select-option>
+               <a-select-option @click="delectCode" value="删除字典">删除字典</a-select-option>
+             </a-select> -->
+        </a-row>
+        <a-row :gutter="24" class="textCount">
+          <a-icon type="info-circle" style="color: #1890FF;margin-right: 10px;" />
+          <span>当前选择:<span style="color: #40a9ff;font-weight: 600;">{{ selectedMenu }}</span><span v-if="selectedKey.length" class="imgSize" @click="cancelSel">取消选择</span></span>
+        </a-row>
+        <a-row :gutter="24" >
+          <a-input-search v-model="code" placeholder="输入编码类别/名称 搜索字典" style="width: 100%" @search="getCodeList" id="dataDictionary-getCodeList"/>
+        </a-row>
+        <a-row :gutter="24" >
+          <a-menu class="menu-box" style="border-right: 0;max-height: 650px;overflow: auto;" v-model="selectedKey" >
+            <a-menu-item style="margin-bottom: 0px;height: 30px; line-height: 30px;" v-for="(item,index) in codeList" :key="index" :value="item">{{ item.name }}</a-menu-item>
+          </a-menu>
+          <span v-if="noData" style="line-height: 50px; font-weight: 600;">暂无数据</span>
+        </a-row>
+      </a-col>
+      <!-- 右侧数据列表 -->
+      <a-col :span="18" >
+        <div style="padding-left: 20px;">
+          <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+              <a-row :gutter="48">
+                <a-col :md="6" :sm="24">
+                  <a-form-item label="数据名称">
+                    <a-input allowClear v-model="queryParam.dispName" placeholder="请输入数据名称" id="dataDictionary-dispName"/>
+                  </a-form-item>
+                </a-col>
+
+                <a-col :md="6" :sm="24">
+                  <a-form-item label="状态">
+                    <a-select
+                      allowClear
+                      id="dataDictionary-isEnable"
+                      v-model="queryParam.isEnable"
+                      placeholder="请选择"
+                    >
+                      <a-select-option :value="1">
+                        是
+                      </a-select-option>
+                      <a-select-option :value="0">
+                        否
+                      </a-select-option>
+                    </a-select>
+                    <!-- <v-select code="FLAG" v-model="queryParam.enableFlag" allowClear placeholder="是否启用"></v-select> -->
+                  </a-form-item>
+                </a-col>
+                <a-col :md="2" :sm="24">
+                  <a-button type="primary" @click="$refs.table.refresh(true)" id="dataDictionary-handSubmit">查询</a-button>
+                </a-col>
+                <!-- <a-col :md="2" :sm="24">
+                  <a-button type="primary" @click="queryParam=''">重置</a-button>
+                </a-col> -->
+              </a-row>
+            </a-form>
+          </div>
+          <!-- <a-divider/> -->
+          <div class="table-operator">
+            <a-button type="primary" icon="plus" @click="openCodeItemModal" id="dataDictionary-openCodeItemModal">新增数据</a-button>
+            <!-- <a-button type="" icon="delete" @click="delectAll">批量删除</a-button> -->
+            <a-button type="" icon="reload" @click="$refs.table.refresh(true)" id="dataDictionary-refreshTable">刷新数据</a-button>
+          </div>
+          <!-- <div  class="textCount">
+            <a-icon type="info-circle" style="color: #1890FF;margin-right: 10px;" />
+            <span>已选择<span style="color: #40a9ff;font-weight: 600;margin-left: 10px;">{{selectedNum}}项</span><span class="imgSize">清空</span></span>
+          </div> -->
+          <s-table
+            ref="table"
+            size="default"
+            rowKey="id"
+            :columns="columns"
+            :data="loadData"
+            bordered
+          >
+            <span slot="action" slot-scope="text, record">
+              <template>
+                <a class="action-button" @click="handleEdit(record)" id="dataDictionary-handleEdit">编辑</a>
+                <a v-if="!record.isEnable" class="action-button red-text" @click="delect(record)" id="dataDictionary-delect">删除</a>
+              </template>
+            </span>
+          </s-table>
+        </div>
+
+      </a-col>
+    </a-row>
+    <codeModal :visible="showCodeModal" :data="codeData" @refresh="getCodeList" @close="showCodeModal = false"></codeModal>
+    <codeItemModal :visible="showItemCodeModal" :data="itemCodeData" @refresh="$refs.table.refresh(true)" @close="showItemCodeModal = false"></codeItemModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import codeModal from './codeModal.vue'
+import codeItemModal from './codeItemModal.vue'
+import { listLookUp, delLookUp, getLookUpItem, delLookUpItem } from '@/api/lookup.js'
+export default {
+  name: 'DataDictionary',
+  components: {
+    STable, VSelect, codeModal, codeItemModal
+  },
+  props: {},
+  data () {
+    // const rowSelection = {
+    //    onChange: (selectedRowKeys, selectedRows) => {
+    //      console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows)
+    //    },
+    //    onSelect: (record, selected, selectedRows) => {
+    //      this.selectedNum = selectedRows.length
+    //      console.log(record,'record')
+    //      console.log(selectedRows,'selectedRows')
+    //    },
+    //    onSelectAll: (selected, selectedRows, changeRows) => {
+    //      this.selectedNum = selectedRows.length
+    //      console.log(selected, selectedRows, changeRows)
+    //    }
+    //  }
+    return {
+      // 查询参数
+      queryParam: {
+        dispName: '',
+        isEnable: undefined,
+        lookupCode: ''
+      },
+      noData: false,
+      code: '', // 根据输入编码类别/名称搜索字典
+      selectedNum: '',
+      selectedKey: [], // 选中的字典编码项
+      selectedMenu: '',
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'miniForm' }),
+      codeList: [],
+      showCodeModal: false,
+      showItemCodeModal: false,
+      codeData: {}, // 编辑字典行数据
+      itemCodeData: {},
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'no',
+          width: '40',
+          align: 'center'
+        },
+        {
+          title: '名称',
+          dataIndex: 'dispName',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '项编码',
+          dataIndex: 'code',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '排序值',
+          dataIndex: 'sort',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '是否启用',
+          width: '100',
+          align: 'center',
+          dataIndex: 'isEnable',
+          customRender: function (text) {
+            if (text == 1) {
+              return '启用'
+            } else {
+              return '禁用'
+            }
+          }
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createDate',
+          width: '120',
+          align: 'center'
+        },
+        {
+          title: '备注',
+          dataIndex: 'remarks',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '操作',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        console.log(parameter, 'parameter')
+
+        return getLookUpItem(Object.assign(parameter, this.queryParam)).then(res => {
+          const no = (res.data.pageNo - 1) * res.data.pageSize
+          for (let i = 0; i < res.data.list.length; i++) {
+            const _item = res.data.list[i]
+            _item.no = no + i + 1
+            _item.isEnable = _item.isEnable + '' === '1'
+          }
+          return res.data
+        })
+      },
+      optionAlertShow: false
+    }
+  },
+  methods: {
+
+    // 获取字典列表
+    getCodeList () {
+      console.log({ code: this.code })
+      listLookUp({ code: this.code }).then(res => {
+        console.log(res, 'res1111111')
+        if (res.status == 200) {
+          this.codeList = res.data
+          this.noData = false
+          if (!res.data.length) {
+            this.noData = true
+          }
+        }
+      })
+    },
+    // 添加字典
+    addCode () {
+      this.showCodeModal = true
+      this.codeData = {}
+    },
+    // 编辑字典
+    editCode () {
+      if (!this.selectedKey.length) {
+        return this.$message.warning('您还未选择要编辑的字典')
+      }
+      this.showCodeModal = true
+      this.codeData = this.codeList[this.selectedKey]
+    },
+    // 删除字典
+    delectCode () {
+      if (!this.selectedKey.length) {
+        return this.$message.warning('您还未选择要删除的字典')
+      }
+      const _this = this
+      const id = this.codeList[this.selectedKey].id
+      this.$confirm({
+        title: '警告',
+        content: `确定要删除 ${this.codeList[this.selectedKey].name} 吗?`,
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          delLookUp({
+            id: id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.getCodeList()
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+    // 字典 取消选择
+    cancelSel () {
+      this.selectedKey = []
+      this.selectedMenu = ''
+    },
+
+    // 新增数据
+    openCodeItemModal () {
+      if (!this.selectedKey.length) {
+        return this.$message.warning('请先选择一个字典类别')
+      }
+      this.showItemCodeModal = true
+      this.itemCodeData = { lookupCode: this.codeList[this.selectedKey].code }
+    },
+
+    // 批量删除数据
+    delectAll () {
+      if (!this.selectedNum) {
+        return this.$message.warning('您还未选择要删除的数据')
+      }
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: `确定要删除您选择的这${this.selectedNum}条数据吗?`,
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          // delectUserPower({
+          //   id: row.id
+          // }).then(res => {
+          //   if (res.status == 200) {
+          //     _this.$message.success('删除成功')
+          //     _this.$refs.table.refresh()
+          //   }
+          // }).catch(() => {
+          //   _this.$message.success('删除失败, 请稍后重试')
+          // })
+        }
+      })
+    },
+    // 删除
+    delect (row) {
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: '确定要删除吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          delLookUpItem({
+            id: row.id
+          }).then(res => {
+            console.log(res, 'res1111')
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.$refs.table.refresh()
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+    handleEdit (row) {
+      console.log(row, 'row')
+      this.showItemCodeModal = true
+      this.itemCodeData = row
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'miniForm' })
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      vm.getCodeList()
+    })
+  },
+  watch: {
+    selectedKey (newValue, oldValue) {
+      console.log(newValue, 'newValue')
+      if (newValue.length) {
+        this.selectedMenu = this.codeList[this.selectedKey].name + ' ' + '(' + this.codeList[this.selectedKey].code + ')'
+        this.queryParam.lookupCode = this.codeList[this.selectedKey].code
+        this.$refs.table.refresh(true)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+  .menu-box::-webkit-scrollbar{
+    width: 6px;
+    height: 6px ;
+  }
+
+  .menu-box::-webkit-scrollbar-thumb{
+    width: 6px;
+    height: 6px ;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 0 2px #d1d1d1;
+    background: #e4e4e4;
+  }
+
+  .textCount{
+    border: 1px solid #91d5ff;
+    background-color: #e6f7ff;
+    border-radius: 5px;
+    padding: 5px 10px 5px 20px;
+    margin: 10px 0;
+    color: rgba(0, 0, 0, 0.85);
+  }
+  .imgSize{
+    color: #2d8cf0;
+    margin-left: 10px;
+    font-size: 14px;
+  }
+  .action-button{
+    line-height: 40px;
+    white-space: nowrap;
+    padding: 5px 10px;
+    background-color: #1890ff;
+    border-radius: 4px;
+    color: #fff;
+    margin-right: 5px;
+  }
+  .red-text{
+    background-color: red;
+  }
+</style>

+ 423 - 0
src/views/power/job/jobs.vue

@@ -0,0 +1,423 @@
+<template>
+  <a-card class="settlement" :bordered="false">
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="20">
+          <a-col :md="6" :sm="24">
+            <a-form-item style="margin-bottom: 0;">
+              <a-input v-model.trim="queryParam.name" id="jobs-name" placeholder="定时器名称" allowClear @pressEnter="$refs.table.refresh(true)"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="4" :sm="24">
+            <a-button type="primary" @click="$refs.table.refresh(true)" id="jobs-handSubmit">查询</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <a-divider />
+    <div class="btns">
+      <a-button @click="addJob()" type="primary" icon="plus-circle" id="jobs-addJob">新增JOB</a-button>
+      <a-button @click="startJob()" type="default" icon="play-circle" id="jobs-startJob">启动</a-button>
+      <a-button @click="stopJob()" type="default" icon="stop" id="jobs-stopJob">停止</a-button>
+    </div>
+
+    <s-table
+      ref="table"
+      size="default"
+      :rowKey="(record) => record.id"
+      :columns="columns"
+      :data="loadData"
+      :bordered="true"
+      :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+    >
+      <span slot="action" slot-scope="text, record">
+        <template>
+          <a @click="editJob(record)" id="jobs-editJob">编辑</a>
+          <a-divider type="vertical" />
+          <a @click="deleteRow(record)" id="jobs-deleteRow">删除</a>
+          <a-divider type="vertical" />
+          <a @click="syncJob(record)" id="jobs-syncJob">立即运行一次</a>
+        </template>
+      </span>
+      <span slot="isEnable" slot-scope="text, record">
+        {{ record.isEnable ? '启用' : '禁用' }}
+      </span>
+      <div slot="status" slot-scope="text, record">
+        <span v-if="record.status === 'STAT'" style="color:green">运行中</span>
+        <span v-if="record.status !== 'STAT'" style="color:red">已停止</span>
+      </div>
+    </s-table>
+
+    <a-modal
+      title="新增JOB"
+      v-model="visible"
+      :footer="null"
+      :maskClosable="false"
+      @cancel="handleCancel"
+    >
+      <a-form
+        @submit="handleSubmit"
+        :form="form"
+      >
+        <a-form-item
+          label="JOB名称"
+          :label-col="{ span: 6 }"
+          :wrapper-col="{ span: 17 }"
+        >
+          <a-input id="jobs-name" v-decorator="['formData.name',{initialValue: formData.name,rules:[{ required: true, message: '请输入JOB名称' }]}]"/>
+        </a-form-item>
+        <a-form-item
+          label="JOB分组"
+          :label-col="{ span: 6 }"
+          :wrapper-col="{ span: 17 }"
+        >
+          <a-input id="jobs-group" v-decorator="['formData.group',{initialValue: formData.group,rules:[{ required: true, message: '请输入JOB分组称' }]}]"/>
+        </a-form-item>
+        <a-form-item
+          label="JOB业务类名"
+          :label-col="{ span: 6 }"
+          :wrapper-col="{ span: 17 }"
+        >
+          <a-input id="jobs-className" v-decorator="['formData.className',{initialValue: formData.className,rules:[{ required: true, message: '请输入JOB业务类名' }]}]"/>
+        </a-form-item>
+        <a-form-item
+          label="CRON表达式"
+          :label-col="{ span: 6 }"
+          :wrapper-col="{ span: 17 }"
+        >
+          <a-input @click="openCronModal" v-model="formData.cron" @change="setCorn" id="jobs-cron">
+            <a-icon slot="prefix" type="schedule" title="corn控件"/>
+            <a-icon v-if="formData.cron" slot="suffix" type="close-circle" @click="formData.cron=''" title="清空"/>
+          </a-input>
+          <JCronModal ref="innerVueCron" :data="formData.cron" @ok="setCorn"></JCronModal>
+        </a-form-item>
+        <a-form-item
+          label="是否启用"
+          :label-col="{ span: 6 }"
+          :wrapper-col="{ span: 17 }"
+        >
+          <a-switch checkedChildren="启用" unCheckedChildren="禁用" id="jobs-isEnable" v-decorator="['formData.isEnable', { initialValue: formData.isEnable, valuePropName: 'checked' }]" />
+          <!-- <a-switch checkedChildren="启用" unCheckedChildren="禁用" :checked="formData.isEnable" @change="changeStatus"/> -->
+        </a-form-item>
+
+        <div class="jobBtns">
+          <a-button key="back" @click="handleCancel" id="jobs-handleCancel">取消</a-button>
+          <a-button htmlType="submit" :loading="loading" type="primary" id="jobs-submit">
+            确定
+          </a-button>
+        </div>
+
+      </a-form>
+    </a-modal>
+
+  </a-card>
+</template>
+
+<script>
+import { STable } from '@/components'
+import { listJob, pauseJob, resumeJob, delJob, callJob, addJob } from '@/api/job.js'
+import JCronModal from '@/components/Cron/JCronModal'
+
+export default {
+  name: 'Jobs',
+  components: {
+    STable,
+    JCronModal
+  },
+  data () {
+    return {
+      showCron: false,
+      // 查询参数
+      queryParam: {
+        name: ''
+      },
+      selectedRowKeys: [],
+      visible: false,
+      loading: false,
+      formLayout: 'horizontal',
+      formData: {},
+      formBackData: {
+        name: '',
+        group: '',
+        className: '',
+        cron: '',
+        isEnable: false
+      },
+      form: this.$form.createForm(this),
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'no',
+          width: '70px',
+          align: 'center'
+        },
+        {
+          title: 'JOB名称',
+          dataIndex: 'name',
+          width: '150px',
+          align: 'center'
+        },
+        {
+          title: 'JOB状态',
+          dataIndex: 'status',
+          width: '100px',
+          align: 'center',
+          scopedSlots: { customRender: 'status' }
+        },
+        {
+          title: 'JOB分组',
+          dataIndex: 'group',
+          width: '150px',
+          align: 'center'
+        },
+        {
+          title: 'JOB业务类名',
+          dataIndex: 'className',
+          width: '200px',
+          align: 'center'
+        },
+        {
+          title: 'CRON表达式',
+          dataIndex: 'cron',
+          width: '150px',
+          align: 'center'
+        },
+        {
+          title: '是否启用',
+          dataIndex: 'isEnable',
+          align: 'center',
+          width: '100px',
+          scopedSlots: { customRender: 'isEnable' }
+        },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          width: '250px',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        return listJob(Object.assign(parameter, this.queryParam)).then(res => {
+          const data = res.data
+          const no = (data.pageNo - 1) * data.pageSize
+          for (var i = 0; i < data.list.length; i++) {
+            data.list[i].no = no + i + 1
+            data.list[i].isEnable = data.list[i].isEnable + '' === '1'
+          }
+          return data
+        })
+      }
+    }
+  },
+  created () {
+
+  },
+  methods: {
+    // 打开cron 表达式弹框
+    openCronModal () {
+      this.$refs.innerVueCron.show()
+    },
+    setCorn (data) {
+      console.log('cron data', data)
+      // this.formData.cron = data
+      this.$set(this.formData, 'cron', data)
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          // 保存数据
+          let params = Object.assign(this.formData, values.formData)
+          params = Object.assign({}, params)
+          params.isEnable = params.isEnable ? 1 : 0
+          params.id = this.formData.id
+
+          if (params.cron == '' || params.cron.length == 0) {
+            this.$message.warning('请输入CRON表达式')
+            return
+          }
+
+          this.loading = true
+          addJob(params).then(res => {
+            console.log(res)
+            if (res.status + '' === '200') {
+              this.$message.success(params.id ? '修改成功' : '保存成功')
+              this.visible = false
+              this.$refs.table.refresh(true)
+            } else {
+              // this.$message.warning(res.message)
+            }
+            this.loading = false
+          })
+        }
+      })
+    },
+    // 编辑
+    editJob (record) {
+      this.visible = true
+      this.formData = Object.assign({}, {
+        id: record.id,
+        name: record.name,
+        group: record.group,
+        className: record.className,
+        cron: record.cron,
+        isEnable: record.isEnable
+      })
+    },
+    /**
+     * 删除选中的job
+     * @param params
+     */
+    deleteRow (record) {
+      const that = this
+      const h = this.$createElement
+      this.$confirm({
+        title: '提示',
+        content: h('div', {
+          style: {
+            textAlign: 'center'
+          }
+        }, [
+          h('div', '删除后,数据将无法恢复。'),
+          h('div', '确认删除吗?')
+        ]),
+        onOk () {
+          delJob({ id: record.id }).then(res => {
+            if (res.status === '200') {
+              that.$message.success('删除成功')
+              that.$refs.table.refresh()
+            }
+          })
+        }
+      })
+    },
+    /**
+     * 立即执行一次
+     * @param params
+     */
+    syncJob (record) {
+      const that = this
+      const h = this.$createElement
+      this.$confirm({
+        title: '提示',
+        content: h('div', {
+          style: {
+            textAlign: 'center'
+          }
+        }, [
+          h('div', '是否立即执行一次定时器。')
+        ]),
+        onOk () {
+          callJob({ id: record.id }).then(res => {
+            if (res.status === '200') {
+              that.$message.success('执行成功')
+              that.$refs.table.refresh()
+            }
+          })
+        }
+      })
+    },
+    handleCancel (e) {
+      this.visible = false
+      this.loading = false
+      this.formData = Object.assign({}, this.formBackData)
+      this.form.resetFields()
+    },
+    addJob () {
+      this.formData = Object.assign({}, this.formBackData)
+      this.form.resetFields()
+      this.visible = true
+    },
+    /**
+     * 批量启动
+     */
+    startJob () {
+      const _this = this
+      const checkIds = this.selectedRowKeys
+      if (checkIds.length) {
+        // 调用后台启动方法
+        resumeJob({
+          ids: checkIds
+        }).then(res => {
+          if (res.status === '200') {
+            _this.$message.success('操作成功')
+          } else {
+            _this.$message.info(res.message)
+          }
+          _this.$refs.table.refresh()
+        })
+      } else {
+        this.$message.info('请选择需要启动的服务')
+      }
+    },
+    /**
+     * 批量停止
+     */
+    stopJob () {
+      const _this = this
+      const h = this.$createElement
+      const checkIds = this.selectedRowKeys
+      if (checkIds.length) {
+        this.$confirm({
+          title: '提示',
+          content: h('div', {
+            style: {
+              textAlign: 'center'
+            }
+          }, [
+            h('div', '您确定停止所选的服务吗?')
+          ]),
+          onOk () {
+            pauseJob({
+              'ids': checkIds
+            }).then(res => {
+              if (res.status === '200') {
+                _this.$message.success('操作成功')
+              } else {
+                _this.$message.info(res.message)
+              }
+              _this.$refs.table.refresh()
+            })
+          }
+        })
+      } else {
+        this.$message.info('请选择需要停止的服务')
+      }
+    },
+    /**
+     * 获取选中的列表
+     * @returns {Array}
+     */
+    onSelectChange (selectedRowKeys) {
+      this.selectedRowKeys = selectedRowKeys
+    }
+  }
+}
+</script>
+<style>
+  .jobBtns{
+    text-align: center;
+    padding-top: 20px;
+  }
+  .jobBtns button{
+    margin: 0 10px;
+  }
+  .ant-modal-footer{
+    text-align: center;
+  }
+  .ant-modal-body .ant-form-item{
+    margin-bottom: 10px;
+  }
+  .btns{
+    padding-bottom: 15px;
+  }
+  .btns button{
+    margin-right: 15px;
+  }
+  .ant-table-thead > tr > th, .ant-table-tbody > tr > td{
+    word-break: break-all;
+  }
+</style>

+ 25 - 25
src/views/power/menu/childModal.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel">
+    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel" :centered="true">
       <a-form :form="form" @submit="handleSubmit">
         <!-- 上级菜单 -->
         <a-form-item label="上级菜单" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
@@ -13,6 +13,7 @@
         <a-form-item label="类型" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-select
             @change="selectChange"
+            id="childModal-type"
             :disabled="disabled"
             v-decorator="[
               'formData.type',
@@ -31,10 +32,13 @@
         <!-- 名称 -->
         <a-form-item label="名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-input
-            placeholder="请输入名称"
+            placeholder="请输入名称30个字以内"
+            id="childModal-name"
+            :maxLength="30"
+            allowClear
             v-decorator="['formData.name', {
-              initialValue: formData.name,
-              rules: [{ required: true, message: '请输入名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+              initialValue: formData.name,getValueFromEvent: $filterEmpty,
+              rules: [{ required: true, message: '请输入名称!' },{pattern:'^[^<|>]{1,30}$',message:'请输入不含<或>的字符,最多30个字符'}] }]"
           />
         </a-form-item>
         <!-- 路由英文名 -->
@@ -66,10 +70,12 @@
         <a-form-item label="前端权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-input
             placeholder="请输入前端权限编码"
+            id="childModal-code"
+            allowClear
             v-decorator="[
               'formData.code',
               {
-                initialValue: formData.code,
+                initialValue: formData.code,getValueFromEvent: $filterEmpty,
                 rules: [{ required: true, message: '请输入前端权限编码!' }] },
             ]"
           />
@@ -79,9 +85,11 @@
         <a-form-item label="后台权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-input
             placeholder="请输入后台权限编码"
+            allowClear
+            id="childModal-permission"
             v-decorator="[
               'formData.permission',
-              {initialValue: formData.permission},
+              {initialValue: formData.permission,},
             ]"
           />
 
@@ -120,9 +128,12 @@
         <a-form-item label="排序值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-input
             type="number"
-            placeholder="请输入排序值"
+            oninput="if(value.length>6)value=value.slice(0,6);if(value<0)value=0"
+            placeholder="请输入(0~999999)之间的排序值"
+            allowClear
+            id="childModal-sort"
             v-decorator="['formData.sort', {
-              initialValue: formData.sort,
+              initialValue: formData.sort,getValueFromEvent: $filterEmpty,
               rules: [] }]"
           />
         </a-form-item>
@@ -130,6 +141,7 @@
         <a-form-item label="启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-radio-group
             name="radioGroup"
+            id="childModal-status"
             v-decorator="[
               'formData.status',
               {
@@ -143,10 +155,10 @@
         </a-form-item>
 
         <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
-          <a-button type="primary" @click="handleSubmit()">
+          <a-button type="primary" @click="handleSubmit()" id="childModal-handleSubmit">
             保存
           </a-button>
-          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()" id="childModal-handleCancel">
             取消
           </a-button>
         </a-form-item>
@@ -233,17 +245,7 @@ export default {
     },
     // 取消
     handleCancel () {
-      const _this = this
-      this.$confirm({
-        title: '提示',
-        content: '确定取消吗?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          _this.clear()
-          _this.cancel()
-        }
-      })
+      this.cancel()
     },
     clear () {
       this.form.resetFields()
@@ -275,13 +277,13 @@ export default {
     isshow (newValue, oldValue) {
       if (newValue) {
         if (this.data.id) { // 添加子菜单
-          this.titleText = '添加子菜单'
+          this.titleText = '新增子菜单'
           this.disabled = false
           console.log(this.data, 'this.data')
           this.formData.parentId = this.data.id
           this.parentTitle = this.data.name
         } else { // 添加顶菜单
-          this.titleText = '添加顶菜单'
+          this.titleText = '新增顶菜单'
           this.formData.type = 0
           this.disabled = true
         }
@@ -294,8 +296,6 @@ export default {
 </script>
 
 <style >
-  .modalBox{
-  }
   .ant-modal-footer {
     display: none;
   }

+ 44 - 14
src/views/power/menu/menu.vue

@@ -1,9 +1,27 @@
 <template>
   <a-card :bordered="false">
     <a-row :gutter="24">
-      <a-button style="margin-right: 10px;" type="primary" icon="plus" @click="addChild">添加子菜单</a-button>
-      <a-button style="margin-right: 10px;background-color: #19be6b;color: #fff;" type="" icon="plus" @click="addTitle">添加顶部菜单</a-button>
-      <a-button style="margin-right: 10px;background-color: red;color: #fff;" type="" icon="delete" @click="delect()">删除</a-button>
+      <a-button
+        v-if="$hasPermissions('B_power_menu_child_add')"
+        style="margin-right: 10px;"
+        type="primary"
+        icon="plus"
+        @click="addChild"
+        id="menu-addChild">新增子菜单</a-button>
+      <a-button
+        v-if="$hasPermissions('B_power_menu_top_add')"
+        style="margin-right: 10px;background-color: #19be6b;color: #fff;"
+        type=""
+        icon="plus"
+        @click="addTitle"
+        id="menu-addTitle">新增顶部菜单</a-button>
+      <a-button
+        v-if="$hasPermissions('B_power_menu_del')"
+        style="margin-right: 10px;background-color: red;color: #fff;"
+        type=""
+        icon="delete"
+        @click="delect()"
+        id="menu-delect">删除</a-button>
 
     </a-row>
     <a-row :gutter="24">
@@ -15,7 +33,7 @@
         </a-row>
 
         <a-row :gutter="24" >
-          <a-input-search placeholder="输入搜索菜单名搜索" style="width: 100%" @change="onChange" />
+          <a-input-search placeholder="输入搜索菜单名搜索" style="width: 100%" @change="onChange" id="menu-onChange" />
           <a-tree
             @expand="onExpand"
             :treeData="getMenus"
@@ -54,10 +72,13 @@
           <!-- 名称 -->
           <a-form-item label="名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-input
-              placeholder="请输入名称"
+              placeholder="请输入名称30个字以内"
+              :maxLength="30"
+              allowClear
+              id="menu-name"
               v-decorator="['formData.name', {
-                initialValue: formData.name,
-                rules: [{ required: true, message: '请输入名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+                initialValue: formData.name,getValueFromEvent: $filterEmpty,
+                rules: [{ required: true, message: '请输入名称30个字以内!' },{pattern:'^[^<|>]{1,30}$',message:'请输入不含<或>的字符,最多30个字符'}] }]"
             />
           </a-form-item>
           <!-- 路由英文名 -->
@@ -91,10 +112,12 @@
           <a-form-item label="前端权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-input
               placeholder="请输入前端权限编码"
+              allowClear
+              id="menu-code"
               v-decorator="[
                 'formData.code',
                 {
-                  initialValue: formData.code,
+                  initialValue: formData.code,getValueFromEvent: $filterEmpty,
                   rules: [{ required: true, message: '请输入前端权限编码!' }] },
               ]"
             />
@@ -103,10 +126,12 @@
           <a-form-item label="后台权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-input
               placeholder="请输入后台权限编码"
+              allowClear
+              id="menu-permission"
               v-decorator="[
                 'formData.permission',
                 {
-                  initialValue: formData.permission,
+                  initialValue: formData.permission,getValueFromEvent: $filterEmpty,
                   rules: [{ required: formData.isLeaf, message: '请输入后台权限编码!' }] },
               ]"
             />
@@ -144,9 +169,12 @@
           <a-form-item label="排序值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-input
               type="number"
-              placeholder="请输入排序值"
+              oninput="if(value.length>6)value=value.slice(0,6);if(value<0)value=0"
+              placeholder="请输入(0~999999)之间的排序值"
+              allowClear
+              id="menu-sort"
               v-decorator="['formData.sort', {
-                initialValue: formData.sort,
+                initialValue: formData.sort,getValueFromEvent: $filterEmpty,
                 rules: [] }]"
             />
           </a-form-item>
@@ -154,6 +182,7 @@
           <a-form-item label="启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-radio-group
               name="radioGroup"
+              id="menu-status"
               v-decorator="[
                 'formData.status',
                 {
@@ -167,10 +196,10 @@
           </a-form-item>
 
           <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
-            <a-button type="primary" @click="handleSubmit()">
+            <a-button v-if="$hasPermissions('B_power_menu_edit')" type="primary" @click="handleSubmit()" id="menu-handleSubmit">
               保存
             </a-button>
-            <a-button :style="{ marginLeft: '8px' }" @click="clear">
+            <a-button :style="{ marginLeft: '8px' }" @click="clear" id="menu-clear">
               重置
             </a-button>
           </a-form-item>
@@ -238,6 +267,7 @@ export default {
 
     onSelect (selectedKeys, info) {
       console.log('onSelect', info)
+      this.clear()
       this.selectedKeys = selectedKeys
       if (info.selected) {
         const data = info.selectedNodes[0].data.props
@@ -397,7 +427,7 @@ export default {
             if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
               _this.getMenuList()
-              _this.clear()
+              // _this.clear()
             } else {
               // this.$message.warning(res.message)
             }

+ 443 - 0
src/views/power/register/register.vue

@@ -0,0 +1,443 @@
+<template>
+  <a-card :bordered="false">
+    <a-row :gutter="24">
+      <!-- 左侧菜单树列表 -->
+      <a-col :span="8">
+        <a-row :gutter="24" class="textCount">
+          <a-icon type="info-circle" style="color: #1890FF;margin-right: 10px;" />
+          <span>当前选择:<span style="color: #40a9ff;font-weight: 600;">{{ selectedMenu }}</span><span v-if="selectedKeys.length" class="imgSize" @click="cancelSel">取消选择</span></span>
+        </a-row>
+
+        <a-row :gutter="24" >
+          <a-row :gutter="24" >
+            <a-input-search placeholder="搜索" style="width: 100%" @change="onChange" id="register-onChange"/>
+          </a-row>
+          <a-tree
+            @expand="onExpand"
+            :treeData="getMenus"
+            :expandedKeys="expandedKeys"
+            :autoExpandParent="autoExpandParent"
+            @select="onSelect"
+            :selectedKeys="selectedKeys"
+          >
+            <template slot="title" slot-scope="{title}">
+              <span v-if="title.indexOf(searchValue) > -1">
+                {{ title.substr(0, title.indexOf(searchValue)) }}
+                <span style="color: #f50">{{ searchValue }}</span>
+                {{ title.substr(title.indexOf(searchValue) + searchValue.length) }}
+              </span>
+              <span v-else>{{ title }}</span>
+            </template>
+          </a-tree>
+        </a-row>
+      </a-col>
+      <!-- 右侧 -->
+      <a-col :span="16" >
+
+        <a-form :form="form" @submit="handleSubmit">
+          <a-form-item label=" " :colon="false" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-button style="margin-right: 10px;" type="primary" icon="plus" @click="addChild" id="register-addChild">新增子分类</a-button>
+            <a-button style="margin-right: 10px;background-color: #19be6b;color: #fff;" type="" icon="plus" @click="addTop" id="register-addTop">新增根节点</a-button>
+            <a-button style="margin-right: 10px;background-color: red;color: #fff;" type="" icon="delete" @click="remove()" id="register-remove">删除</a-button>
+          </a-form-item>
+          <!-- 父路径 -->
+          <a-form-item label="父路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              disabled
+              placeholder=""
+              id="register-parentPath"
+              v-decorator="['formData.parentPath', {
+                initialValue: formData.parentPath,
+                rules: [] }]"
+            />
+          </a-form-item>
+          <!-- 显示名称-->
+          <a-form-item label="显示名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入节点显示名称30个字以内"
+              id="register-dispname"
+			  :maxLength="30"
+			  allowClear
+              v-decorator="['formData.dispname', {
+                initialValue: formData.dispname,getValueFromEvent: $filterEmpty,
+                rules: [{ required: true, message: '请输入节点显示名称30个字以内!' }] }]"
+            />
+          </a-form-item>
+          <!-- 名称 -->
+          <a-form-item label="编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入节点code"
+              id="register-name"
+			  allowClear
+              v-decorator="['formData.name', {
+                initialValue: formData.name,getValueFromEvent: $filterEmpty,
+                rules: [{ required: true, message: '请输入节点code!' }] }]"
+            />
+          </a-form-item>
+
+          <!-- 值 -->
+          <a-form-item label="值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              :maxlength="20"
+              placeholder="请输入节点值"
+			  allowClear
+              id="register-value"
+              v-decorator="['formData.value', {
+                initialValue: formData.value,getValueFromEvent: $filterEmpty,
+                rules: [{ required: true, message: '请输入节点值!' }] }]"
+            />
+          </a-form-item>
+
+          <!-- 排序值 -->
+          <a-form-item label="排序" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              type="number"
+              :maxlength="20"
+			  allowClear
+              id="register-index"
+              placeholder="请输入正确的序号"
+              v-decorator="['formData.index', {
+                initialValue: formData.index,getValueFromEvent: $filterEmpty,
+                rules: [{ required: true, message: '请输入正确的序号!' }] }]"
+            />
+          </a-form-item>
+
+          <!-- 状态 -->
+          <a-form-item label="是否启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-radio-group
+              name="radioGroup"
+              id="register-isEnable"
+              v-decorator="[
+                'formData.isEnable',
+                {
+                  initialValue: formData.isEnable,
+                  rules: [{ required: true, message: '请选择状态!' }] },
+              ]"
+            >
+              <a-radio :value="1">是</a-radio>
+              <a-radio :value="0">否</a-radio>
+            </a-radio-group>
+          </a-form-item>
+          <a-form-item label="备注" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-textarea
+              v-decorator="[
+                'formData.desc',
+                { initialValue: formData.desc,getValueFromEvent: $filterEmpty,
+                  rules: [] },
+              ]"
+			  :maxLength="500"
+              style="min-height: 60px;"
+              placeholder="输入内容为500个字以内"
+              id="register-desc"
+              autosize />
+          </a-form-item>
+
+          <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+            <a-button type="primary" @click="handleSubmit()" id="register-handleSubmit">
+              保存
+            </a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="reset" id="register-reset">
+              重置
+            </a-button>
+          </a-form-item>
+        </a-form>
+
+      </a-col>
+    </a-row>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { listRegister, saveRegister, delRegisterNode } from '@/api/register'
+import _ from 'lodash'
+
+export default {
+  name: 'Menu',
+  components: {
+    STable, VSelect
+  },
+  props: {},
+  data () {
+    return {
+      treeData: [],
+      dataList: [],
+      searchValue: '',
+      actions: 'addTop', // addTop:添加一级分类,addChild:添加子分类,edit
+      expandedKeys: [],
+      autoExpandParent: true,
+      selectedKeys: [],
+      selectedData: {}, // 被选中的节点数据
+      selectedMenu: '', // 选择的树节点名
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'register' }),
+      parentData: {}, // 父级菜单
+      formData: {},
+      formDataBack: {
+        id: '',
+        dispname: '',
+        name: '',
+        value: '',
+        index: '',
+        parentPath: '',
+        isEnable: '',
+        desc: '',
+        parentId: '0'
+      }
+
+    }
+  },
+  computed: {
+    getMenus () {
+      this.generateList(this.treeData)
+      return this.treeData
+    }
+  },
+  methods: {
+    initPage () {
+      this.addTop()
+      this.initTree()
+    },
+    onExpand (expandedKeys) {
+      console.log('onExpand', expandedKeys)
+      this.expandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+
+    onSelect (selectedKeys, info) {
+      console.log('onSelect', info)
+      this.selectedKeys = selectedKeys
+      if (info.selected) {
+        this.selectedData = info
+        const data = info.selectedNodes[0].data.props
+        this.selectedMenu = data.dispname
+        this.formData = {
+          id: data.id,
+          dispname: data.dispname,
+          name: data.name,
+          value: data.value,
+          index: data.index,
+          parentPath: data.parentPath,
+          isEnable: data.isEnable,
+          desc: data.desc,
+          parentId: data.parentId
+        }
+        this.formData.isEnable = Number(this.formData.isEnable)
+        this.actions = 'edit'
+      } else {
+        this.selectedMenu = ''
+        this.clear()
+      }
+    },
+    generateList (data) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i]
+        node.key = node.id
+        node.title = node.dispname
+        const key = node.title
+        this.dataList.push({ key, title: key })
+        node.scopedSlots = { title: 'title' }
+        // node.slots = { icon: node.type == '0' ? 'file' : 'pushpin' }
+
+        if (node.children) {
+          this.generateList(node.children)
+        }
+      }
+    },
+    getParentKey (key, tree) {
+      let parentKey
+      for (let i = 0; i < tree.length; i++) {
+        const node = tree[i]
+        if (node.children) {
+          if (node.children.some(item => item.title == key)) {
+            parentKey = node.key
+          } else if (this.getParentKey(key, node.children)) {
+            parentKey = this.getParentKey(key, node.children)
+          }
+        }
+      }
+      return parentKey
+    },
+    onChange (e) {
+      const value = e.target.value
+      const expandedKeys = this.dataList
+        .map(item => {
+          if (item.title.indexOf(value) > -1) {
+            return this.getParentKey(item.title, this.treeData)
+          }
+          return null
+        })
+        .filter((item, i, self) => item && self.indexOf(item) === i)
+      Object.assign(this, {
+        expandedKeys,
+        searchValue: value,
+        autoExpandParent: true
+      })
+    },
+    // 初始化 查询Tree 数据
+    initTree () {
+      const _this = this
+      listRegister().then(res => {
+        if (res.status === '200') {
+          const treeData = res.data
+          if (treeData) {
+            _this.treeData = treeData
+          }
+        } else {
+          this.$Message.warning(res.message)
+        }
+      })
+    },
+    // 添加根节点
+    addTop () {
+      this.clear()
+      this.actions = 'addTop'
+      this.formData = _.cloneDeep(this.formDataBack)
+    },
+    // 添加子节点
+    addChild () {
+      if (!this.selectedKeys.length) {
+        this.$message.warning('请先选择一个根节点')
+      }
+
+      this.actions = 'addChild'
+      const currentNode = this.selectedData.selectedNodes[0].data.props
+      this.formData = _.cloneDeep(this.formDataBack)
+      this.formData.parentId = currentNode.id
+      if (currentNode.parentId === 0) {
+        this.formData.parentPath = currentNode.dispname
+      } else {
+        this.formData.parentPath = currentNode.parentPath + ' > ' + currentNode.dispname
+      }
+    },
+
+    //  取消选择
+    cancelSel () {
+      this.selectedKeys = []
+      this.selectedMenu = ''
+      this.clear()
+    },
+    reset () {
+      if (this.actions != 'addTop') {
+        const data = {
+          id: this.formData.id,
+          parentId: this.formData.parentId,
+          parentPath: this.formData.parentPath
+        }
+        console.log(data, 'data')
+        this.formData = _.cloneDeep(this.formDataBack)
+        this.formData.id = data.id
+        this.formData.parentId = data.parentId
+        this.formData.parentPath = data.parentPath
+      }
+      this.cancelSel()
+    },
+    // 清空列表
+    clear () {
+      this.form.resetFields()
+      this.formData = _.cloneDeep(this.formDataBack)
+    },
+
+    // 删除数据
+    remove () {
+      if (!this.selectedKeys.length) {
+        return this.$message.warning('您还未选择要删除的数据')
+      }
+      if (this.selectedData.node.$children.length) {
+        return this.$message.warning('请先删除子节点')
+      }
+      const _this = this
+      console.log(_this.formData.id, '_this.formData.id')
+      this.$confirm({
+        title: '警告',
+        content: `确定要删除您选择的 ${_this.formData.dispname} 的数据吗?`,
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          delRegisterNode({
+            id: _this.formData.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.cancelSel()
+              _this.initTree()
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          console.log(values.formData, ' formData.type222222222')
+          let params = {}
+          if (this.actions === 'addTop') {
+            params = Object.assign({}, values.formData)
+          } else {
+            params = Object.assign(_this.formData, values.formData)
+          }
+          saveRegister(params).then(res => {
+            if (res.status + '' === '200') {
+              _this.initTree()
+              _this.cancelSel()
+              this.$message.success(res.message ? res.message : '保存成功')
+            } else {
+              // this.$message.error(res.message ? res.message : '保存失败')
+            }
+          })
+        }
+      })
+    }
+
+  },
+  mounted () {
+    // this.initTree()
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'register' })
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      vm.initPage()
+    })
+  },
+  watch: {
+
+  }
+}
+</script>
+
+<style>
+  .menu-box::-webkit-scrollbar{
+    width: 6px;
+    height: 6px ;
+  }
+
+  .menu-box::-webkit-scrollbar-thumb{
+    width: 6px;
+    height: 6px ;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 0 2px #d1d1d1;
+    background: #e4e4e4;
+  }
+
+  .textCount{
+    border: 1px solid #91d5ff;
+    background-color: #e6f7ff;
+    border-radius: 5px;
+    padding: 5px 10px 5px 20px;
+    margin: 10px 0;
+    color: rgba(0, 0, 0, 0.85);
+  }
+  .imgSize{
+    color: #2d8cf0;
+    margin-left: 10px;
+    font-size: 14px;
+  }
+
+</style>

+ 12 - 29
src/views/power/role/menuModal.vue

@@ -1,10 +1,8 @@
 <template>
   <div>
-    <a-modal class="modalBox" :title="roleName" centered v-model="isshow" @cancle="cancel">
+    <a-modal class="modalBox" :title="roleName" v-model="isshow" @cancle="cancel" :centered="true">
       <a-form class="form-box" style="max-height: 600px;" :form="form" @submit="handleSubmit">
-
         <a-tree
-          id="role-menu-tree"
           checkable
           @check="onCheck"
           @expand="onExpand"
@@ -13,13 +11,12 @@
           v-model="checkedKeys"
           :treeData="treeData"
         />
-
       </a-form>
       <a-form-item :wrapper-col="{ offset: 15 }">
-        <a-button id="role-menu-btn-save" type="primary" @click="handleSubmit()">
+        <a-button type="primary" @click="handleSubmit()" id="menuModal-handleSubmit">
           保存
         </a-button>
-        <a-button id="role-menu-btn-cancel" :style="{ marginLeft: '8px' }" @click="handleCancel()">
+        <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()" id="menuModal-handleCancel">
           取消
         </a-button>
       </a-form-item>
@@ -63,8 +60,6 @@ export default {
   },
   methods: {
     onExpand (expandedKeys) {
-      // if not set autoExpandParent to false, if children expanded, parent can not collapse.
-      // or, you can remove all expanded children keys.
       this.expandedKeys = expandedKeys
       this.autoExpandParent = false
     },
@@ -81,19 +76,20 @@ export default {
       const _this = this
       this.form.validateFields((err, values) => {
         if (!err) {
+          console.log(this.checkedData)
           if (this.checkedData.length == 0) {
             return this.$message.warning('请先选择菜单')
           }
           const arr = this.checkedData.join(',')
           addMenuPower({ id: this.id, menuIds: arr }).then(res => {
-            if (res.status == 200) {
+            if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
               this.$emit('refresh')
               setTimeout(function () {
                 _this.cancel()
               }, 300)
             } else {
-              this.$message.error(res.message)
+              // this.$message.error(res.message)
             }
           })
         }
@@ -101,25 +97,16 @@ export default {
     },
     // 取消
     handleCancel () {
-      const _this = this
-      this.$confirm({
-        title: '提示',
-        centered: true,
-        content: '确定取消吗?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          _this.clear()
-          _this.cancel()
-        }
-      })
+      this.cancel()
     },
     clear () {
       this.form.resetFields()
       this.roleName = ''
       this.id = ''
       this.checkedKeys = []
+      this.expandedKeys = []
     },
+    // 查找叶子节点
     findLeaf (data, arr) {
       for (let i = 0; i < data.length; i++) {
         const node = data[i]
@@ -130,6 +117,7 @@ export default {
             return item == node.id
           })
           if (hasNode) {
+            this.expandedKeys.push(node.id)
             this.checkedKeys.push(node.id)
           }
         }
@@ -151,14 +139,9 @@ export default {
           this.roleName = '分配权限' + '(' + this.data.role.name + ')'
           if (this.data.role.menuIds) {
             const arr = this.data.role.menuIds.split(',')
-            const temp = []
-            arr.map(item => {
-              temp.push(Number(item))
-            })
-            this.checkedData = temp
-            this.expandedKeys = temp
+            this.checkedData = arr
             // 找出叶子节点
-            this.findLeaf(this.treeData, temp)
+            this.findLeaf(this.treeData, arr)
           }
         }
       } else {

+ 135 - 107
src/views/power/role/roleList.vue

@@ -1,34 +1,34 @@
 <template>
   <a-card :bordered="false">
     <div class="table-page-search-wrapper">
-      <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+      <a-form layout="inline">
         <a-row :gutter="48">
           <a-col :md="6" :sm="24">
             <a-form-item label="角色名称">
-              <a-input allowClear v-model.trim="queryParam.name" id="role-name" placeholder="请输入角色名称"/>
+              <a-input
+                allowClear
+                v-model.trim="queryParam.name"
+                placeholder="请输入角色名称"
+                :maxLength="30"
+                id="roleList-name"
+                @pressEnter="$refs.table.refresh(true)" />
             </a-form-item>
           </a-col>
+
           <a-col :md="6" :sm="24">
             <a-form-item label="状态">
-              <v-select
-                code="ENABLE_STATE"
-                ref="isEnable"
-                v-model="queryParam.isEnable"
-                id="role-enable"
-                allowClear
-                placeholder="请选择状态" ></v-select>
+              <v-select code="ENABLE_FLAG" v-model="queryParam.isEnable" allowClear placeholder="请选择状态" id="roleList-isEnable"></v-select>
             </a-form-item>
           </a-col>
-          <a-col :md="4" :sm="24" class="flex-sp">
-            <a-button type="primary" id="role-btn-search" @click="$refs.table.refresh(true)">查询</a-button>
-            <a-button id="role-btn-reset" @click="reset">重置</a-button>
+          <a-col :md="6" :sm="24">
+            <a-button type="primary" @click="$refs.table.refresh(true)" id="roleList-handSubmit" style="margin-right: 10px;">查询</a-button>
+            <a-button type="" @click="reset" id="roleList-reset">重置</a-button>
           </a-col>
         </a-row>
       </a-form>
     </div>
-    <a-divider/>
     <div class="table-operator">
-      <a-button id="role-btn-add" v-hasPermission="'B_power_role_add'" type="primary" icon="plus" @click="openModal">新建</a-button>
+      <a-button type="primary" icon="plus" @click="openModal" id="roleList-openModal" v-hasPermission="'B_power_role_add'" style="margin-top:18px ;">新增</a-button>
     </div>
 
     <s-table
@@ -37,23 +37,34 @@
       rowKey="id"
       :columns="columns"
       :data="loadData"
-      bordered
-    >
-      <!-- 状态 -->
+      bordered>
+      <!-- 启用禁用 -->
       <span slot="status" slot-scope="text, record">
-        <a-switch v-if="$hasPermissions('B_power_role_enable')" checkedChildren="" unCheckedChildren="" v-model="record.isEnable" @change="changeFlagHandle(text, record)"/>
-        <span v-else>{{ $refs.isEnable.getNameByCode(record.isEnable) }}</span>
+        <a-switch
+          checkedChildren="启用"
+          unCheckedChildren="禁用"
+          id="roleList-isEnable"
+          v-model="record.isEnable"
+          v-hasPermission="'B_power_role_enable'"
+          @change="changeFlagHandle(text, record)" />
+        <span v-if="!$hasPermissions('B_power_role_enable')">--</span>
       </span>
       <!-- 角色描述 -->
-      <span slot="remarks" slot-scope="text, record">{{ record.remarks || '--' }}</span>
-
+      <template slot="remarks" slot-scope="text, record">
+        <span :title="record.remarks" style="display: inline-block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;max-width: 100%;">{{ record.remarks ?record.remarks : '--' }}</span>
+      </template>
+      <!-- 操作 -->
       <span slot="action" slot-scope="text, record">
-        <template>
-          <a v-if="$hasPermissions('B_power_role_menu')" class="action-button menu-text" id="role-btn-menu" @click="openMenuModal(record)">菜单权限</a>
-          <a v-if="$hasPermissions('B_power_role_edit')" class="action-button" id="role-btn-edit" @click="handleEdit(record)">修改</a>
-          <a v-if="!record.isEnable && $hasPermissions('B_power_role_del')" class="action-button red-text" id="role-btn-del" @click="delect(record)">删除</a>
-          <span v-if="!$hasPermissions('B_power_role_menu') && !$hasPermissions('B_power_role_edit') && !(!record.isEnable && $hasPermissions('B_power_role_del'))">--</span>
-        </template>
+        <a-icon type="setting" title="菜单权限" class="actionBtn icon-orange" @click="openMenuModal(record)" v-hasPermission="'M_power_role_menu'"/>
+        <a-icon type="edit" title="编辑" class="actionBtn icon-blues" @click="handleEdit(record)" v-hasPermission="'B_power_role_edit'" />
+        <a-icon
+          type="delete"
+          title="删除"
+          class="actionBtn icon-red"
+          v-if="$hasPermissions('B_power_role_del') && !record.isEnable"
+          @click="delect(record)" />
+        <span v-if="!$hasPermissions('M_power_role_menu') && !$hasPermissions('B_power_role_edit') && (!$hasPermissions('B_power_role_del') && !record.isEnable)">--</span>
+      </span>
       </span>
     </s-table>
     <roleModal :visible="showModal" :data="itemData" @refresh="refreshTable" @close="showModal = false"></roleModal>
@@ -62,14 +73,25 @@
 </template>
 
 <script>
-import { STable, VSelect } from '@/components'
+import {
+  STable,
+  VSelect
+} from '@/components'
 import roleModal from './roleModal.vue'
 import menuModal from './menuModal.vue'
-import { getPowerRoleList, updateEnableStatus, delectRolePower, getMenuList } from '@/api/power-role.js'
+import {
+  getPowerRoleList,
+  updateEnableStatus,
+  delectRolePower,
+  getMenuList
+} from '@/api/power-role.js'
 export default {
   name: 'RoleList',
   components: {
-    STable, VSelect, roleModal, menuModal
+    STable,
+    VSelect,
+    roleModal,
+    menuModal
   },
   data () {
     return {
@@ -83,46 +105,55 @@ export default {
       itemData: {}, // 编辑行数据
       menuData: {},
       // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '40',
-          align: 'center'
-        },
-        {
-          title: '角色名称',
-          dataIndex: 'name',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '角色描述',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'remarks' }
-        },
-        {
-          title: '状态',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'status' }
-        },
-        {
-          title: '创建时间',
-          dataIndex: 'createDate',
-          width: '120',
-          align: 'center'
-        },
-        {
-          title: '操作',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'action' }
+      columns: [{
+        title: '序号',
+        dataIndex: 'no',
+        width: 60,
+        align: 'center'
+      },
+      {
+        title: '创建时间',
+        dataIndex: 'createDate',
+        width: 150,
+        align: 'center'
+      },
+      {
+        title: '角色名称',
+        dataIndex: 'name',
+        width: 200,
+        align: 'center'
+      },
+      {
+        title: '角色描述',
+        dataIndex: 'remarks',
+        width: 200,
+        ellipsis: true, // 内容超过宽度 自动出现省略号
+        align: 'center',
+        scopedSlots: {
+          customRender: 'remarks'
         }
+      },
+      {
+        title: '状态',
+        width: 150,
+        align: 'center',
+        scopedSlots: {
+          customRender: 'status'
+        }
+      },
+      {
+        title: '操作',
+        width: 150,
+        align: 'center',
+        scopedSlots: {
+          customRender: 'action'
+        }
+      }
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
+        console.log(parameter, 'parameter')
+
         return getPowerRoleList(Object.assign(parameter, this.queryParam)).then(res => {
           const no = (res.data.pageNo - 1) * res.data.pageSize
           for (let i = 0; i < res.data.list.length; i++) {
@@ -146,6 +177,12 @@ export default {
     refreshTable () {
       this.$refs.table.refresh(true)
     },
+    // 重置
+    reset () {
+      this.queryParam.name = ''
+      this.queryParam.isEnable = ''
+      this.refreshTable()
+    },
     // 新建
     openModal () {
       this.showModal = true
@@ -158,26 +195,22 @@ export default {
     // 获取菜单树列表
     getMenuList (id) {
       const _this = this
-      getMenuList({ id: id }).then(res => {
+      getMenuList({
+        id: id
+      }).then(res => {
         if (res.status == 200) {
           _this.menuData = res.data
           this.showMenuModal = true
+          console.log(res.data, 'this.itemData')
         }
       })
     },
-    //  重置
-    reset () {
-      this.queryParam = {
-        name: '',
-        isEnable: ''
-      }
-      this.$refs.table.refresh(true)
-    },
+
     // 删除
     delect (row) {
       const _this = this
       this.$confirm({
-        title: '提示',
+        title: '警告',
         centered: true,
         content: '删除后无法恢复,确认删除?',
         okText: '确定',
@@ -186,19 +219,17 @@ export default {
           delectRolePower({
             id: row.id
           }).then(res => {
+            console.log(res, 'res1111')
             if (res.status == 200) {
-              _this.$message.success('删除成功')
+              _this.$message.success(res.message)
               _this.$refs.table.refresh()
-            } else {
-              this.$message.error(res.message)
             }
-          }).catch(() => {
-            _this.$message.success('删除失败, 请稍后重试')
           })
         }
       })
     },
     handleEdit (row) {
+      console.log(row, 'row')
       this.showModal = true
       this.itemData = row
     },
@@ -209,10 +240,9 @@ export default {
         flag: record.isEnable ? '1' : '0'
       }
       updateEnableStatus(_data).then(res => {
-        if (res.status == 200) {
-          this.$message.success('修改成功')
+        if (res.status + '' === '200') {
+          this.$message.success(res.message)
         } else {
-          this.$message.error(res.message)
           record.isEnable = !record.isEnable
         }
       })
@@ -221,27 +251,25 @@ export default {
 }
 </script>
 <style scoped>
-  .table-page-search-wrapper .ant-form-inline .ant-form-item{
-    margin-bottom: 0;
-  }
-  .flex-sp{
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-  }
-  .action-button{
-    line-height: 40px;
-    white-space: nowrap;
-    padding: 5px 10px;
-    background-color: #1890ff;
-    border-radius: 4px;
-    color: #fff;
-    margin-right: 5px;
-  }
-  .red-text{
-    background-color: red;
-  }
-  .menu-text {
-    background-color: #f90;
-  }
+	.table-page-search-wrapper .ant-form-inline .ant-form-item {
+		margin-bottom: 0;
+	}
+
+	.action-button {
+		line-height: 40px;
+		white-space: nowrap;
+		padding: 5px 10px;
+		background-color: #1890ff;
+		border-radius: 4px;
+		color: #fff;
+		margin-right: 5px;
+	}
+
+	.red-text {
+		background-color: red;
+	}
+
+	.menu-text {
+		background-color: #f90;
+	}
 </style>

+ 32 - 28
src/views/power/role/roleModal.vue

@@ -1,23 +1,31 @@
 <template>
   <div>
-    <a-modal class="modalBox" :title="titleText" centered v-model="isshow" @cancle="cancel">
+    <a-modal
+      class="modalBox"
+      :title="titleText"
+      v-model="isshow"
+      @cancle="cancel"
+      width="45%"
+      :centered="true">
       <a-form :form="form" @submit="handleSubmit">
         <!-- 用户名称 -->
         <a-form-item label="角色名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-input
-            id="role-add-name"
-            placeholder="请输入角色名称"
+            placeholder="请输入角色名称(最多30个字符)"
+            allowClear
+            :maxLength="30"
+            id="roleModal-name"
             v-decorator="['formData.name', {
-              initialValue: formData.name,
-              rules: [{ required: true, message: '请输入角色名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+              initialValue: formData.name,getValueFromEvent: $filterEmpty,
+              rules: [{ required: true, message: '请输入角色名称(最多30个字符)!' },{pattern:'^[^<|>]{1,30}$',message:'请输入不含<或>的字符,最多30个字符'}] }]"
           />
         </a-form-item>
 
         <!-- 状态 -->
         <a-form-item label="状态" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-radio-group
-            id="role-add-enable"
             name="radioGroup"
+            id="roleModal-isEnable"
             v-decorator="[
               'formData.isEnable',
               {
@@ -32,22 +40,23 @@
 
         <a-form-item label="角色描述" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
           <a-textarea
-            id="role-add-remarks"
+            id="roleModal-remarks"
+            :maxLength="500"
             v-decorator="[
               'formData.remarks',
-              { initialValue: formData.remarks,
+              { initialValue: formData.remarks,getValueFromEvent: $filterEmpty,
                 rules: [] },
             ]"
             style="min-height: 60px;"
-            placeholder=""
+            placeholder="请输入角色描述(最多500个字符)"
             autosize />
         </a-form-item>
 
-        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
-          <a-button id="role-add-btn-save" type="primary" @click="handleSubmit()">
+        <a-form-item :wrapper-col="{ span: 24, offset: 10 }">
+          <a-button type="primary" @click="handleSubmit()" id="roleModal-handleSubmit" :style="{ marginRight: '15px' }">
             保存
           </a-button>
-          <a-button id="role-add-btn-cancel" :style="{ marginLeft: '8px' }" @click="handleCancel()">
+          <a-button :style="{ marginLeft: '15px' }" @click="handleCancel()" id="roleModal-handleCancel">
             取消
           </a-button>
         </a-form-item>
@@ -79,7 +88,7 @@ export default {
   },
   data () {
     return {
-      titleText: '添加角色',
+      titleText: '新增角色',
       isshow: this.visible,
       formLayout: 'horizontal',
       form: this.$form.createForm(this, { name: 'roleModal' }),
@@ -96,20 +105,23 @@ export default {
       this.clear()
       this.$emit('close')
     },
+
     // 保存提交
     handleSubmit () {
       const _this = this
       this.form.validateFields((err, values) => {
         if (!err) {
+          console.log(values.formData, ' formData.type222222222')
           saveRolePower(Object.assign(this.formData, values.formData)).then(res => {
-            if (res.status == 200) {
+            console.log(res, 'res--save')
+            if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
               this.$emit('refresh')
               setTimeout(function () {
                 _this.cancel()
               }, 300)
             } else {
-              this.$message.error(res.message)
+              // this.$message.error(res.message)
             }
           })
         }
@@ -117,18 +129,7 @@ export default {
     },
     // 取消
     handleCancel () {
-      const _this = this
-      this.$confirm({
-        title: '提示',
-        centered: true,
-        content: '确定取消吗?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          _this.clear()
-          _this.cancel()
-        }
-      })
+      this.cancel()
     },
     clear () {
       this.form.resetFields()
@@ -138,6 +139,8 @@ export default {
       this.formData.remarks = ''
     }
 
+  },
+  mounted () {
   },
   beforeCreate () {
     this.form = this.$form.createForm(this, { name: 'roleModal' })
@@ -153,8 +156,9 @@ export default {
           this.formData = Object.assign({}, this.data)
           delete this.formData.no
           this.formData.isEnable = Number(this.formData.isEnable)
+          console.log(this.formData, 'this.formData')
         } else {
-          this.titleText = '添加角色'
+          this.titleText = '新增角色'
         }
       } else {
         this.cancel()

+ 147 - 122
src/views/power/user/userList.vue

@@ -1,39 +1,52 @@
 <template>
   <a-card :bordered="false">
     <div class="table-page-search-wrapper">
-      <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+      <a-form layout="inline">
         <a-row :gutter="48">
           <a-col :md="6" :sm="24">
             <a-form-item label="用户名称">
-              <a-input allowClear v-model.trim="queryParam.name" id="user-name" placeholder="请输入用户名称"/>
+              <a-input
+                allowClear
+                v-model.trim="queryParam.name"
+                placeholder="请输入用户名称"
+                id="userList-name"
+                :maxLength="30"
+                @pressEnter="$refs.table.refresh(true)" />
             </a-form-item>
           </a-col>
+
           <a-col :md="6" :sm="24">
             <a-form-item label="手机号码">
-              <a-input allowClear v-model.trim="queryParam.phone" id="user-phone" placeholder="请输入手机号码"/>
+              <a-input
+                allowClear
+                v-model.trim="queryParam.phone"
+                placeholder="请输入手机号码"
+                :maxLength="11"
+                id="userList-phone"
+                @pressEnter="$refs.table.refresh(true)" />
             </a-form-item>
           </a-col>
+
           <a-col :md="6" :sm="24">
             <a-form-item label="状态">
-              <v-select
-                code="ENABLE_STATE"
-                v-model="queryParam.loginFlag"
-                ref="loginFlag"
-                id="user-loginFlag"
-                allowClear
-                placeholder="请选择状态"></v-select>
+              <v-select code="ENABLE_FLAG" v-model="queryParam.loginFlag" allowClear placeholder="请选择状态" id="userList-check-enable-state"></v-select>
             </a-form-item>
           </a-col>
-          <a-col :md="4" :sm="24" class="flex-sp">
-            <a-button type="primary" id="user-btn-search" @click="$refs.table.refresh(true)">查询</a-button>
-            <a-button id="user-btn-reset" @click="reset">重置</a-button>
+          <a-col :md="6" :sm="24">
+            <a-button type="primary" @click="$refs.table.refresh(true)" id="userList-handSubmit" style="margin-right: 10px;">查询</a-button>
+            <a-button type="" @click="reset" id="userList-reset">重置</a-button>
           </a-col>
         </a-row>
       </a-form>
     </div>
-    <a-divider/>
     <div class="table-operator">
-      <a-button id="user-btn-add" v-hasPermission="'B_power_user_add'" type="primary" icon="plus" @click="openModal">新建</a-button>
+      <a-button
+        type="primary"
+        icon="plus"
+        @click="openModal"
+        id="userList-openModal"
+        v-hasPermission="'B_power_user_add'"
+        style="margin-top:18px ;">新增</a-button>
     </div>
 
     <s-table
@@ -42,25 +55,37 @@
       rowKey="id"
       :columns="columns"
       :data="loadData"
-      bordered
-    >
+      bordered>
       <span slot="status" slot-scope="text, record">
-        <a-switch v-if="$hasPermissions('B_power_user_enable')" checkedChildren="" unCheckedChildren="" v-model="record.loginFlag" @change="changeFlagHandle(text, record)"/>
-        <span v-else>{{ $refs.loginFlag.getNameByCode(record.loginFlag) }}</span>
+        <a-switch
+          v-hasPermission="'B_power_user_enable'"
+          checkedChildren="启用"
+          unCheckedChildren="禁用"
+          v-model="record.loginFlag"
+          @change="changeFlagHandle(text, record)"
+          id="userList-changeFlagHandle" />
+        <span v-if="!$hasPermissions('B_power_user_enable')">--</span>
       </span>
-      <div slot="roleNames" slot-scope="text, record" :title="record.roleNames">
-        <span v-if="record.roleNames">{{ record.roleNames.substr(0,12) + '...' }}</span>
-        <span v-else>无</span>
-      </div>
       <span slot="action" slot-scope="text, record">
-        <template>
-          <div >
-            <a class="action-button" v-if="$hasPermissions('B_power_user_edit')" @click="handleEdit(record)">修改</a>
-            <a v-if="record.loginFlag && $hasPermissions('B_power_user_resetPsd')" class="action-button reset-text" id="user-btn-resetPass" @click="resetPassword(record)">重置密码</a>
-            <a v-if="!record.loginFlag && $hasPermissions('B_power_user_del')" class="action-button red-text" id="user-btn-del" @click="delect(record)">删除</a>
-            <span v-if="!$hasPermissions('B_power_user_edit') && !(record.loginFlag && $hasPermissions('B_power_user_resetPsd')) && !(!record.loginFlag && $hasPermissions('B_power_user_del'))">--</span>
-          </div>
-        </template>
+        <a-icon
+          type="unlock"
+          title="重置密码"
+          v-if="$hasPermissions('B_power_user_resetPsd') && record.loginFlag==1"
+          class="actionBtn icon-orange"
+          @click="resetPassword(record)" />
+        <a-icon
+          v-hasPermission="'B_power_user_edit'"
+          type="edit"
+          title="编辑"
+          class="actionBtn icon-blues"
+          @click="handleEdit(record)"
+        />
+        <a-icon
+          type="delete"
+          title="删除"
+          class="actionBtn icon-red"
+          v-if="$hasPermissions('B_power_user_del') && record.loginFlag==0"
+          @click="delect(record)"/>
       </span>
     </s-table>
     <userModal :visible="showModal" @refresh="$refs.table.refresh(true)" :data="itemData" @close="showModal = false"></userModal>
@@ -68,13 +93,23 @@
 </template>
 
 <script>
-import { STable, VSelect } from '@/components'
+import {
+  STable,
+  VSelect
+} from '@/components'
 import userModal from './userModal.vue'
-import { resetPSD, updateEnableStatus, getPowerUserList, delectUserPower } from '@/api/power-user.js'
+import {
+  resetPSD,
+  updateEnableStatus,
+  getPowerUserList,
+  delectUserPower
+} from '@/api/power-user.js'
 export default {
   name: 'UserList',
   components: {
-    STable, VSelect, userModal
+    STable,
+    VSelect,
+    userModal
   },
   data () {
     return {
@@ -87,54 +122,56 @@ export default {
       showModal: false,
       itemData: {}, // 编辑行数据
       // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '40',
-          align: 'center'
-        },
-        {
-          title: '用户名称',
-          dataIndex: 'name',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '手机号码',
-          dataIndex: 'phone',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '角色',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'roleNames' }
-        },
-        {
-          title: '状态',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'status' }
-        },
-        {
-          title: '创建时间',
-          dataIndex: 'createDate',
-          width: '120',
-          align: 'center'
-        },
-        {
-          title: '操作',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'action' }
+      columns: [{
+        title: '序号',
+        dataIndex: 'no',
+        width: 60,
+        align: 'center'
+      },
+      {
+        title: '创建时间',
+        dataIndex: 'createDate',
+        width: 120,
+        align: 'center'
+      },
+      {
+        title: '用户名称',
+        dataIndex: 'name',
+        width: 100,
+        align: 'center'
+      },
+      {
+        title: '手机号码',
+        dataIndex: 'phone',
+        width: 100,
+        align: 'center'
+      },
+      {
+        title: '角色',
+        width: 100,
+        align: 'center',
+        dataIndex: 'roleNames'
+      },
+      {
+        title: '状态',
+        width: 100,
+        align: 'center',
+        scopedSlots: {
+          customRender: 'status'
+        }
+      },
+      {
+        title: '操作',
+        width: 100,
+        align: 'center',
+        scopedSlots: {
+          customRender: 'action'
         }
+      }
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
         return getPowerUserList(Object.assign(parameter, this.queryParam)).then(res => {
-          console.log(res, '-------------------列表')
           const no = (res.data.pageNo - 1) * res.data.pageSize
           for (let i = 0; i < res.data.list.length; i++) {
             const _item = res.data.list[i]
@@ -162,25 +199,28 @@ export default {
       this.showModal = true
       this.itemData = {}
     },
+    // 重置
+    reset () {
+      this.queryParam.name = ''
+      this.queryParam.phone = '',
+      this.queryParam.loginFlag = ''
+      this.refreshTable()
+    },
     // 重置密码
     resetPassword (row) {
       resetPSD({
         id: row.id
       }).then(res => {
         if (res.status == 200) {
-          this.$message.success('密码重置成功')
-        } else {
-          this.$message.error(res.message)
+          this.$message.success(res.message)
         }
-      }).catch(() => {
-        this.$message.success('密码重置失败, 请稍后重试')
       })
     },
     // 删除
     delect (row) {
       const _this = this
       this.$confirm({
-        title: '提示',
+        title: '警告',
         centered: true,
         content: '删除后无法恢复,确认删除?',
         okText: '确定',
@@ -190,26 +230,13 @@ export default {
             id: row.id
           }).then(res => {
             if (res.status == 200) {
-              _this.$message.success('删除成功')
+              _this.$message.success(res.message)
               _this.$refs.table.refresh()
-            } else {
-              _this.$message.error(res.message)
             }
-          }).catch(() => {
-            _this.$message.success('删除失败, 请稍后重试')
           })
         }
       })
     },
-    //  重置
-    reset () {
-      this.queryParam = {
-        name: '',
-        phone: '',
-        loginFlag: ''
-      }
-      this.$refs.table.refresh(true)
-    },
     getBizStr (storeBizList) {
       const str = []
       storeBizList.forEach(item => {
@@ -218,6 +245,7 @@ export default {
       return str.join(',')
     },
     handleEdit (row) {
+      console.log(row, 'row')
       this.showModal = true
       this.itemData = row
     },
@@ -229,9 +257,8 @@ export default {
       }
       updateEnableStatus(_data).then(res => {
         if (res.status + '' === '200') {
-          this.$message.success('修改成功')
+          this.$message.success(res.message)
         } else {
-          this.$message.error(res.message)
           record.loginFlag = !record.loginFlag
         }
       })
@@ -240,27 +267,25 @@ export default {
 }
 </script>
 <style scoped>
-  .table-page-search-wrapper .ant-form-inline .ant-form-item{
-    margin-bottom: 0;
-  }
-  .flex-sp{
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-  }
-  .action-button{
-   line-height: 40px;
-   white-space: nowrap;
-    padding: 5px 10px;
-    background-color: #1890ff;
-    border-radius: 4px;
-    color: #fff;
-    margin-right: 5px;
-  }
-  .red-text{
-    background-color: red;
-  }
-  .reset-text {
-    background-color: #31b50b;
-  }
+	.table-page-search-wrapper .ant-form-inline .ant-form-item {
+		margin-bottom: 0;
+	}
+
+	.action-button {
+		line-height: 40px;
+		white-space: nowrap;
+		padding: 5px 10px;
+		background-color: #1890ff;
+		border-radius: 4px;
+		color: #fff;
+		margin-right: 5px;
+	}
+
+	.red-text {
+		background-color: red;
+	}
+
+	.reset-text {
+		background-color: #31b50b;
+	}
 </style>

+ 60 - 36
src/views/power/user/userModal.vue

@@ -1,17 +1,25 @@
 <template>
   <div>
-    <a-modal class="modalBox" :title="titleText" centered v-model="isshow" @cancle="cancel">
+    <a-modal
+      class="modalBox"
+      :title="titleText"
+      v-model="isshow"
+      @cancle="cancel"
+      width="45%"
+      :centered="true">
       <a-form :form="form" @submit="handleSubmit">
         <a-row :gutter="24">
           <a-col :span="12">
             <!-- 用户名称 -->
             <a-form-item label="用户名称" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
               <a-input
-                id="user-add-name"
-                placeholder="请输入用户名称"
+                placeholder="请输入用户名称(最多30个字符)"
+                allowClear
+                id="userModal-name"
+                :maxLength="30"
                 v-decorator="['formData.name', {
-                  initialValue: formData.name,
-                  rules: [{ required: true, message: '请输入用户名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+                  initialValue: formData.name,getValueFromEvent: $filterEmpty,
+                  rules: [{ required: true, message: '请输入用户名称(最多30个字符)!' },{pattern:'^[^<|>]{1,30}$',message:'请输入不含<或>的字符,最多30个字符'}] }]"
               />
             </a-form-item>
           </a-col>
@@ -19,22 +27,25 @@
             <!-- 手机号码 -->
             <a-form-item label="手机号码" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
               <a-input
-                id="user-add-phone"
                 placeholder="请输入手机号码"
+                allowClear
+                :maxLength="11"
+                id="userModal-phone"
                 v-decorator="['formData.phone', {
-                  initialValue: formData.phone,
+                  initialValue: formData.phone,getValueFromEvent: $filterEmpty,
                   rules: [{ required: true, message: '请输入手机号码!' },{pattern:/^[1][0-9]{10}$/, message: '请输入正确的手机号码!'}] }]"
               />
             </a-form-item>
           </a-col>
         </a-row>
+
         <a-row :gutter="24">
           <!-- 性别 -->
           <a-col :span="12">
             <a-form-item label="性别" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
               <v-select
-                id="user-add-sex"
                 code="SEX"
+                id="userModal-sex"
                 v-decorator="[
                   'formData.sex',
                   {
@@ -49,8 +60,8 @@
           <a-col :span="12">
             <a-form-item label="状态" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
               <a-radio-group
-                id="user-add-loginFlag"
                 name="radioGroup"
+                id="userModal-loginFlag"
                 v-decorator="[
                   'formData.loginFlag',
                   {
@@ -58,8 +69,8 @@
                     rules: [{ required: true, message: '请选择状态!' }] },
                 ]"
               >
-                <a-radio :value="1"></a-radio>
-                <a-radio :value="0"></a-radio>
+                <a-radio :value="1">启用</a-radio>
+                <a-radio :value="0">禁用</a-radio>
               </a-radio-group>
 
             </a-form-item>
@@ -69,16 +80,17 @@
           <a-col :span="24">
             <a-form-item label="角色" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
               <a-select
-                id="user-add-role"
+                id="userModal-roleNames"
                 v-decorator="[
                   'formData.roleNames',
                   {
                     initialValue: formData.roleNames,
-                    rules: [{ required: true, message: '请选择状态!' }] },
+                    rules: [{ required: true, message: '请选择角色!' }] },
                 ]"
                 mode="multiple"
                 style="width: 100%"
                 placeholder="请选择角色"
+                allowClear
               >
                 <a-select-option
                   v-for="item in roleList"
@@ -89,33 +101,36 @@
               </a-select>
             </a-form-item>
           </a-col>
+
         </a-row>
         <a-row :gutter="24">
           <a-col :span="24">
             <a-form-item label="备注" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
               <a-textarea
-                id="user-add-remarks"
+                id="userModal-remarks"
+                :maxLength="500"
                 v-decorator="[
                   'formData.remarks',
                   {
-                    initialValue: formData.remarks,
+                    initialValue: formData.remarks,getValueFromEvent: $filterEmpty,
                     rules: [] },
                 ]"
                 style="min-height: 50px;"
-                placeholder=""
+                placeholder="请输入备注(最多500个字符)"
                 autosize />
             </a-form-item>
           </a-col>
         </a-row>
-        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
-          <a-button id="user-add-btn-save" type="primary" @click="handleSubmit()">
+        <a-form-item :wrapper-col="{ span: 24, offset: 10}">
+          <a-button type="primary" @click="handleSubmit()" id="userModal-handleSubmit" :style="{ marginRight: '15px' }">
             保存
           </a-button>
-          <a-button id="user-add-btn-cancel" :style="{ marginLeft: '8px' }" @click="handleCancel()">
+          <a-button :style="{ marginLeft: '15px' }" @click="handleCancel()" id="userModal-handleCancel">
             取消
           </a-button>
         </a-form-item>
       </a-form>
+
     </a-modal>
   </div>
 </template>
@@ -142,7 +157,7 @@ export default {
   },
   data () {
     return {
-      titleText: '添加用户',
+      titleText: '新增用户',
       isshow: this.visible,
       formLayout: 'horizontal',
       form: this.$form.createForm(this, { name: 'miniForm' }),
@@ -155,6 +170,7 @@ export default {
         sex: '',
         remarks: ''
       }
+
     }
   },
   methods: {
@@ -162,21 +178,26 @@ export default {
       this.clear()
       this.$emit('close')
     },
+
     // 保存提交
     handleSubmit () {
       const _this = this
       this.form.validateFields((err, values) => {
+        console.log(values, 'values222')
         if (!err) {
           values.formData.roleNames = values.formData.roleNames.join(',')
+          console.log(values.formData, ' formData.type222222222')
+          console.log(Object.assign({ id: this.data.id ? this.data.id : '' }, values.formData))
           saveUserPower(Object.assign({ id: this.data.id ? this.data.id : '' }, values.formData)).then(res => {
-            if (res.status == 200) {
+            console.log(res, 'res--save')
+            if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
               this.$emit('refresh')
               setTimeout(function () {
                 _this.cancel()
               }, 300)
             } else {
-              this.$message.error(res.message)
+              // this.$message.error(res.message)
             }
           })
         }
@@ -184,18 +205,7 @@ export default {
     },
     // 取消
     handleCancel () {
-      const _this = this
-      this.$confirm({
-        title: '提示',
-        centered: true,
-        content: '确定取消吗?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          _this.clear()
-          _this.cancel()
-        }
-      })
+      this.cancel()
     },
     clear () {
       this.form.resetFields()
@@ -207,16 +217,19 @@ export default {
       this.formData.sex = ''
       this.formData.remarks = ''
     },
+
     // 获取角色列表接口
     getRoleList () {
       getRoleList().then(res => {
-        if (res.status == 200) {
+        console.log(res, 'res--role')
+        if (res.status + '' === '200') {
           this.roleList = res.data
         } else {
           this.$message.warning(res.message)
         }
       })
     }
+
   },
   mounted () {
     this.getRoleList()
@@ -235,9 +248,13 @@ export default {
           this.formData = Object.assign({}, this.data)
           delete this.formData.no
           let roleNames = this.formData.roleNames
+          console.log(roleNames, 'roleNames')
           if (roleNames) {
             roleNames = roleNames.split(',')
+            console.log(roleNames, 'roleNames22')
             const arr = []
+            console.log(this.roleList, 'this.roleList')
+
             roleNames.map(item => {
               const row = this.roleList.find(a => {
                 return a.name == item
@@ -246,13 +263,18 @@ export default {
                 arr.push(row.id)
               }
             })
+
+            console.log(arr, 'arrs')
             this.formData.roleNames = arr
           } else {
             this.formData.roleNames = []
           }
+
           this.formData.loginFlag = Number(this.formData.loginFlag)
+          // this.formData.sex = Number(this.formData.sex)
+          console.log(this.formData, 'this.formData')
         } else {
-          this.titleText = '添加用户'
+          this.titleText = '新增用户'
         }
       } else {
         this.cancel()
@@ -263,6 +285,8 @@ export default {
 </script>
 
 <style >
+  .modalBox{
+  }
   .ant-modal-footer {
     display: none;
   }

+ 1 - 2
src/views/storehouseManagement/customerInfo/CustomerList.vue

@@ -31,7 +31,6 @@
 </template>
 
 <script>
-import moment from 'moment'
 import {
   STable,
   VSelect
@@ -78,7 +77,7 @@ export default {
         align: 'center',
         width: 150,
         customRender: (text, record, index) => {
-          return record.row.addrProvinceName + record.row.addrCityName + record.row.addrDistrictName + record.row.addrDetail
+          return record.addrProvinceName + record.addrCityName + record.addrDistrictName + record.addrDetail
         }
       }
       ],

+ 1 - 1
src/views/storehouseManagement/storeBind/StoreBindList.vue

@@ -56,7 +56,7 @@
     </div>
     <!-- 合计 -->
     <div class="ftext" >
-      <a-button class="btn-cont" type="primary" @click="openModal" id="storeBindList-add">新增绑定</a-button>
+      <a-button class="btn-cont" v-hasPermission="'B_addBind'" type="primary" @click="openModal" id="storeBindList-add">新增绑定</a-button>
     </div>
     <!-- 列表 -->
     <div>

+ 4 - 4
src/views/supplierManagement/Organization.vue

@@ -1,7 +1,7 @@
 <template>
   <a-card class="organization-wrap" :bordered="false">
     <!-- 新建 -->
-    <div class="table-operator"><a-button id="organization-add" type="primary" icon="plus" @click="addOrg()" >新增最高级</a-button></div>
+    <div class="table-operator"><a-button v-hasPermission="'B_organization_add'" id="organization-add" type="primary" icon="plus" @click="addOrg()" >新增最高级</a-button></div>
     <!-- 表格列表 -->
     <s-table
       class="s-table"
@@ -16,7 +16,7 @@
       <!-- 操作 -->
       <template slot="action" slot-scope="text, record">
         <a-button
-          v-if="record.parentIdPaths.split(',').length < 5"
+          v-if="record.parentIdPaths.split(',').length < 5 && $hasPermissions('B_organization_add_child')"
           type="link"
           size="small"
           icon="plus"
@@ -25,7 +25,7 @@
           @click="addOrg(text)"
         >新增子级</a-button>
         <a-button
-          v-if="record.pid != 0"
+          v-if="record.pid != 0 && $hasPermissions('B_organization_edit')"
           type="link"
           size="small"
           icon="edit"
@@ -34,7 +34,7 @@
           @click="editOrg(text)"
         >编辑</a-button>
         <a-button
-          v-if="record.pid != 0"
+          v-if="record.pid != 0 && $hasPermissions('B_organization_del')"
           type="link"
           size="small"
           icon="delete"

+ 2 - 0
src/views/supplierManagement/SupplierList.vue

@@ -57,10 +57,12 @@
         <a-icon
           type="edit"
           title="编辑"
+          v-if="$hasPermissions('B_supplier_edit')"
           id="supplier-edit"
           @click="handleEdit(record)"
           class="actionBtn icon-blues"
         />
+        <span v-else>--</span>
       </template>
     </s-table>