Browse Source

组织管理bug修改

dev
jiangyuying 5 years ago
parent
commit
3e7462eea1
  1. 1
      epmet-oper-web/.env.development
  2. 2
      epmet-oper-web/.eslintignore
  3. 14
      epmet-oper-web/.vscode/settings.json
  4. BIN
      epmet-oper-web/epmet-oper.rar
  5. 53
      epmet-oper-web/gulpfile.js
  6. 585
      epmet-oper-web/src/js/ajax.js
  7. 10
      epmet-oper-web/src/main.js
  8. 22
      epmet-oper-web/src/views/modules/customer-manage/customer-info.vue
  9. 293
      epmet-oper-web/src/views/modules/customer-manage/customer-manage.vue
  10. 82
      epmet-oper-web/src/views/modules/customize/function.vue
  11. 26
      epmet-oper-web/vue.config.js

1
epmet-oper-web/.env.development

@ -1,2 +1,3 @@
NODE_ENV=development
VUE_APP_API_SERVER = http://192.168.1.130:8080/api
VUE_APP_NODE_ENV=dev

2
epmet-oper-web/.eslintignore

@ -1 +1,3 @@
/src/icons/iconfont.js
/*.js
/*.vue

14
epmet-oper-web/.vscode/settings.json

@ -8,18 +8,14 @@
// tabsize
"editor.tabSize": 2,
// #
"editor.formatOnSave": false,
"editor.formatOnSave": true,
// #eslint
"eslint.autoFixOnSave": true,
//  vue 
"eslint.validate": [
"javascript",
"javascriptreact",
{
"language": "vue",
"autoFix": true
}
],
"eslint.validate": [],
"semi": true, //
"singleQuote": true, //
"trailingComma": "es5", //
// #
"prettier.semi": false,
// #使

BIN
epmet-oper-web/epmet-oper.rar

Binary file not shown.

53
epmet-oper-web/gulpfile.js

@ -3,11 +3,13 @@ var $ = require('gulp-load-plugins')()
var fs = require('fs')
var path = require('path')
var del = require('del')
//var colors = require('colors')
// var colors = require('colors')
var child_process = require('child_process')
var theme = {}
var themeList = require('./src/element-ui/config.js').filter(item => !item.hasBuild)
var themeList = require('./src/element-ui/config.js').filter(
(item) => !item.hasBuild
)
var styleFileDir = './src/assets/scss'
var styleFileDirTemp = `${styleFileDir}-temp`
var themeFileDir = './public/element-theme'
@ -15,48 +17,56 @@ var et = require('element-theme')
var etOptions = require('./package.json')['element-theme']
var themeFileName = etOptions.config.replace(/.*\/(.+\.scss)/, '$1')
/**
* 构建生成主题
*/
gulp.task('themes', () => {
//console.log(colors.green('-------------------- 构建中,主题============= -------------------------'))
if (themeList.length <= 0) { return del(styleFileDirTemp) }
// console.log(colors.green('-------------------- 构建中,主题============= -------------------------'))
if (themeList.length <= 0) {
return del(styleFileDirTemp)
}
// 删除临时文件,保证本次操作正常执行
//del(styleFileDirTemp)
// del(styleFileDirTemp)
// 拷贝一份scss样式文件夹,作为构建的临时处理文件夹
//child_process.spawnSync('cp', ['-r', styleFileDir, styleFileDirTemp])
// child_process.spawnSync('cp', ['-r', styleFileDir, styleFileDirTemp])
// 拷贝element组件scss变量样式文件至临时处理文件夹中,并修改相应配置信息
//child_process.spawnSync('cp', ['-r', etOptions.config, styleFileDirTemp])
// child_process.spawnSync('cp', ['-r', etOptions.config, styleFileDirTemp])
etOptions.config = `${styleFileDirTemp}/${themeFileName}`
// 开始构建生成
fnCreate(themeList)
function fnCreate (themeList) {
function fnCreate(themeList) {
if (themeList.length >= 1) {
// 保存当前构建生成的主题对象
theme = themeList[0]
console.log('\n')
//console.log(colors.green('-------------------- 待构建,主题 -------------------------'))
// console.log(colors.green('-------------------- 待构建,主题 -------------------------'))
console.log(themeList)
console.log('\n')
//console.log(colors.green('-------------------- 构建中,主题 -------------------------'))
// console.log(colors.green('-------------------- 构建中,主题 -------------------------'))
console.log(theme)
console.log('\n')
// 修改.scss临时文件中的$--color-primary主题变量值
var data = fs.readFileSync(etOptions.config, 'utf8')
var result = data.replace(/\$--color-primary:(.*) !default;/, `$--color-primary:${theme.color} !default;`)
var result = data.replace(
/\$--color-primary:(.*) !default;/,
`$--color-primary:${theme.color} !default;`
)
fs.writeFileSync(path.resolve(etOptions.config), result)
// 修改aui.scss临时文件中引入element组件主题变量文件路径
var data = fs.readFileSync(`${styleFileDirTemp}/aui.scss`, 'utf8')
var result = data.replace(new RegExp(`(@import \")(.*\/)(${themeFileName}\";)`), '$1./$3')
var result = data.replace(
// eslint-disable-next-line no-useless-escape
new RegExp(`(@import \")(.*\/)(${themeFileName}\";)`),
'$1./$3'
)
fs.writeFileSync(path.resolve(`${styleFileDirTemp}/aui.scss`), result)
// 调用element-theme插件,生成element组件主题
@ -73,7 +83,7 @@ gulp.task('themes', () => {
// 删除临时文件
del(styleFileDirTemp)
console.log('\n')
//console.log(colors.green('-------------------- 构建完毕,删除临时文件 -------------------------'))
// console.log(colors.green('-------------------- 构建完毕,删除临时文件 -------------------------'))
console.log(styleFileDirTemp)
console.log('\n')
@ -82,10 +92,10 @@ gulp.task('themes', () => {
`${themeFileDir}/**/*.css`,
`!${themeFileDir}/**/index.css`,
`!${themeFileDir}/**/aui.css`,
`!${themeFileDir}/**/fonts`
`!${themeFileDir}/**/fonts`,
]
del(files)
//console.log(colors.green('-------------------- 构建完毕,删除主题独立组件文件 -------------------------'))
// console.log(colors.green('-------------------- 构建完毕,删除主题独立组件文件 -------------------------'))
console.log(files)
console.log('\n')
}
@ -93,12 +103,15 @@ gulp.task('themes', () => {
})
gulp.task('styles', () => {
return gulp.src([`${styleFileDirTemp}/aui.scss`])
return gulp
.src([`${styleFileDirTemp}/aui.scss`])
.pipe($.sass().on('error', $.sass.logError))
.pipe($.autoprefixer({
.pipe(
$.autoprefixer({
browsers: etOptions.browsers,
cascade: false
}))
cascade: false,
})
)
.pipe($.cleanCss())
.pipe($.rename('aui.css'))
.pipe(gulp.dest(`${themeFileDir}/${theme.name}`))

585
epmet-oper-web/src/js/ajax.js

@ -0,0 +1,585 @@
/* eslint-disable */
import axios from 'axios'
import Cookies from 'js-cookie'
import router from '@/router'
import qs from 'qs'
import { clearLoginInfo } from '@/utils'
import isPlainObject from 'lodash/isPlainObject'
import Vue from 'vue'
import { Loading } from 'element-ui' //引入Loading服务
// 默认超时时间60s
axios.defaults.timeout = 60000
let timer
let loading
//请求时间超过300ms 提示加载
function startLoading () {
if (timer) return
timer = setTimeout(() => {
loading = Loading.service({
lock: true, //是否锁定
text: '正在加载……', //加载中需要显示的文字
background: 'rgba(0,0,0,.7)', //背景颜色
})
}, 300)
}
//结束加载动画
function endLoading () {
if (timer) {
clearTimeout(timer)
}
if (loading) {
loading.close()
}
}
/**
* 请求拦截
*/
axios.interceptors.request.use(
(config) => {
config.headers['Accept-Language'] = Cookies.get('language') || 'zh-CN'
config.headers['token'] = Cookies.get('token') || ''
config.headers['Authorization'] = Cookies.get('token') || ''
// 默认参数
var defaults = {}
// 防止缓存,GET请求默认带_t参数
if (config.method === 'get') {
config.params = {
...config.params,
...{ _t: new Date().getTime() },
}
}
if (isPlainObject(config.params)) {
config.params = {
...defaults,
...config.params,
}
}
if (isPlainObject(config.data)) {
config.data = {
...defaults,
...config.data,
}
if (
/^application\/x-www-form-urlencoded/.test(
config.headers['content-type']
)
) {
config.data = qs.stringify(config.data)
}
}
return config
},
(error) => {
return Promise.reject(error)
}
)
/**
* 响应拦截
*/
axios.interceptors.response.use(
(response) => {
if (response.data.code === 401 || response.data.code === 10001) {
clearLoginInfo()
router.replace({ name: 'login' })
return Promise.reject(response.data.msg)
}
return response
},
(error) => {
console.error(error)
return Promise.reject(error)
}
)
/*
* 1后台请求成功均返回业务上的异常也属于请求成功 res.status=200的响应码
* 2res.data后台自定义的响应体包括
* 1)res.data.sysresultcode:请求结果success业务成功fail业务失败
* 2)res.data.rspMsg:返回消息用于进行消息提示
* 3)res.data.data返回数据用于获取请求的数据
* 3异步请求以cb_su(data.data, data.rspMsg)返回业务层
*/
export default {
// 并发请求
all (gets, cb) {
if (gets && gets.length > 0) {
let functions = gets.map((get) => {
return axios.get(processUrl(get.url), {
params: get.params,
})
})
axios.all(functions).then(
axios.spread((..._results) => {
let results = _results.map((_result) => {
return _result.data.data
})
cb(results)
})
)
}
},
get (url, params, cb_su, cb_err, headers) {
var p = {
params: params,
}
if (headers && JSON.stringify(headers) != '{}') {
var h = {
headers: headers,
}
p = {
...p,
...h,
}
}
url = url + '?r=' + new Date().getTime() //时间戳作为随机码,防止IE从缓存获取数据
axios
.get(processUrl(url), p)
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data
if (data.sysresultcode === 'success') {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data.data, data.rspMsg)
}
} else if (data.sysresultcode === 'fail') {
//业务失败
if (typeof cb_err === 'function') cb_err(data.rspMsg, data.data)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
})
.catch((err) => {
if (typeof (cb_err === 'function')) {
cb_err(err)
}
})
},
put (url, data, cb_su, cb_err) {
axios
.put(processUrl(url), data)
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data
if (data.sysresultcode === 'success') {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data.data, data.rspMsg)
}
} else if (data.sysresultcode === 'fail') {
//业务失败
if (typeof cb_err === 'function') cb_err(data.rspMsg, data.data)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
})
.catch((err) => {
if (typeof cb_err === 'function') {
cb_err(err)
}
})
},
post (url, data, cb_su, cb_err, headers) {
var h = {}
if (headers && JSON.stringify(headers) != '{}') {
h = {
headers,
}
}
//var data = qs.stringify(paramas);
axios
.post(processUrl(url), data, h)
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data
if (data.code == 0) {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data.data, data.msg)
}
} else {
//业务失败
if (typeof cb_err === 'function') cb_err(data.msg, data.data)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
})
.catch((err) => {
if (typeof cb_err === 'function') {
cb_err(err)
}
})
},
post2 (url, data, cb_su, cb_err) {
//var data = qs.stringify(paramas);
axios
.post(processUrl(url), data)
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data
if (data.sysresultcode === 'success') {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data.data, data.rspMsg)
}
} else if (data.sysresultcode === 'fail') {
//业务失败
if (typeof cb_err === 'function') cb_err(data.rspMsg, data.data)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
})
.catch((err) => {
if (typeof cb_err === 'function') {
cb_err(err)
}
})
},
delete (url, params, cb_su, cb_err) {
axios
.delete(processUrl(url), {
params: params,
})
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data
if (data.sysresultcode === 'success') {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data.data, data.rspMsg)
}
} else if (data.sysresultcode === 'fail') {
//业务失败
if (typeof cb_err === 'function') cb_err(data.rspMsg, data.data)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
})
.catch((err) => {
if (typeof cb_err === 'function') {
cb_err(err)
}
})
},
//导出文件,包括excel,word等
exportFile (url, params, cb_su, cb_err, headers) {
var h = {}
if (headers && JSON.stringify(headers) != '{}') {
h = headers
}
var errorMsg = '操作失败'
url = url + '?r=' + new Date().getTime() //时间戳作为随机码,防止IE从缓存获取数据
axios({
method: 'get',
url: processUrl(url),
params: params,
headers: h, //{ tenantCode: "GDYXB" },
responseType: 'blob',
})
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data //直接返回blob
if (data) {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data, '操作成功')
}
} else {
//业务失败
if (typeof cb_err === 'function') cb_err(errorMsg)
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
})
.catch((err) => {
if (typeof (cb_err === 'function')) {
cb_err(errorMsg)
}
})
},
//导出文件,包括excel,word等
exportFilePost (url, params, cb_su, cb_err) {
//var data = qs.stringify(paramas);
// axios
// .post(processUrl(url), data)
axios({
method: 'post',
url: processUrl(url),
data: params,
responseType: 'blob',
})
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data //直接返回blob
if (data) {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data, '操作成功')
}
} else {
//业务失败
if (typeof cb_err === 'function') cb_err(errorMsg)
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
})
.catch((err) => {
if (typeof cb_err === 'function') {
cb_err(err)
}
})
},
//上传文件
importFilePut (url, fileFormData, cb_su, cb_err) {
var errorMsg = '操作失败'
let requestConfig = {
headers: {
'Content-Type': 'multipart/form-data',
// Authorization: auth.loadTokenType() + ' ' + auth.loadAccessToken(),
},
}
Vue.http
.put(processUrl(url), fileFormData, requestConfig)
.then((res) => {
if (res && res.status === 200) {
var data = res.body //直接返回blob
if (data.sysresultcode === 'fail') {
//业务失败
if (typeof cb_err === 'function') cb_err(data.rspMsg)
} else if (data.sysresultcode === 'success') {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data, '操作成功')
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
})
.catch((err) => {
if (typeof (cb_err === 'function')) {
cb_err(errorMsg)
}
})
},
//上传文件
importFilePost (url, fileFormData, cb_su, cb_err) {
var errorMsg = '操作失败'
let requestConfig = {
headers: {
'Content-Type': 'multipart/form-data',
Authorization: auth.loadTokenType() + ' ' + auth.loadAccessToken(),
},
}
Vue.http
.post(processUrl(url), fileFormData, requestConfig)
.then((res) => {
if (res && res.status === 200) {
var data = res.body //直接返回blob
if (data.sysresultcode === 'fail') {
//业务失败
if (typeof cb_err === 'function') cb_err(data.rspMsg)
} else if (data.sysresultcode === 'success') {
//业务成功
if (typeof cb_su === 'function') {
cb_su(data, '操作成功')
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
} else {
if (typeof cb_err === 'function') cb_err(errorMsg)
}
})
.catch((err) => {
if (typeof (cb_err === 'function')) {
cb_err(errorMsg)
}
})
},
//登录获取token/刷新token
tokenPost (url, paramas, cb_su, cb_err) {
var data = qs.stringify(paramas)
axios
.post(processUrl(url), data)
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data
if (data) {
if (typeof cb_su === 'function') {
cb_su(data)
}
} else {
if (typeof cb_err === 'function') cb_err('登录验证失败')
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
} else {
if (typeof cb_err === 'function') cb_err(res)
}
})
.catch((err) => {
var rspMsg = '登录失败,请重试!'
if (
err &&
err.response &&
err.response.status === 401 &&
err.response.data &&
err.response.data.error === 'unauthorized'
) {
// 用户名不存在时: 状态码401
// Response Body:
// {
// "error": "unauthorized",
// "error_description": null
// }
rspMsg = err.response.data.error_description || '用户名不存在'
} else if (
err &&
err.response &&
err.response.status === 400 &&
err.response.data &&
err.response.data.error === 'invalid_grant'
) {
// 用户名存在,密码错误时:状态码400
// {
// "error": "invalid_grant",
// "error_description": "Bad credentials"
// }
rspMsg = '用户名或密码输入错误'
}
if (typeof cb_err === 'function') {
cb_err(rspMsg)
}
})
},
//通过接口传递的token进行验证登录 lyx 20191210
async interfacetokenPost (url, paramas, cb_su, cb_err) {
var data = qs.stringify(paramas)
await axios
.post(processUrl(url), data)
.then((res) => {
if (res) {
if (res.status === 200) {
var data = res.data
if (data) {
if (typeof cb_su === 'function') {
cb_su(data)
return true
}
} else {
if (typeof cb_err === 'function') {
cb_err('接口验证失败')
return false
}
}
} else {
if (typeof cb_err === 'function') {
cb_err(res)
return false
}
}
} else {
if (typeof cb_err === 'function') {
cb_err(res)
return false
}
}
})
.catch((err) => {
var rspMsg = '接口验证失败,请重试!'
if (
err &&
err.response &&
err.response.status === 401 &&
err.response.data &&
err.response.data.error === 'unauthorized'
) {
rspMsg = '用户名不存在'
} else if (
err &&
err.response &&
err.response.status === 400 &&
err.response.data &&
err.response.data.error === 'invalid_grant'
) {
rspMsg = '用户名或密码输入错误'
}
if (typeof cb_err === 'function') {
cb_err(rspMsg)
return false
}
})
},
}
// 添加服务器端URL
function processUrl (url) {
if (url.indexOf('http://') > -1) {
return url
}
return process.env.VUE_APP_API_SERVER + url
}

10
epmet-oper-web/src/main.js

@ -19,6 +19,14 @@ import renRegionTree from '@/components/ren-region-tree'
import { hasPermission, getDictLabel } from '@/utils'
import cloneDeep from 'lodash/cloneDeep'
// axios封装
import ajax from '@/js/ajax'
window.app = Object.assign({}, {
ajax
})
Vue.config.productionTip = false
Vue.use(renRadioGroup)
@ -47,5 +55,5 @@ new Vue({
i18n,
router,
store,
render: h => h(App)
render: (h) => h(App)
}).$mount('#app')

22
epmet-oper-web/src/views/modules/customer-manage/customer-info.vue

@ -1,24 +1,36 @@
<template>
<div>
<!-- <el-button @click="backStep" type="primary" icon="el-icon-back">返回</el-button> -->
<el-card shadow="never" class="aui-card--fill" style="width:800px" v-if="data.length!==0">
<el-card shadow="never"
class="aui-card--fill"
style="width:800px"
v-if="data.length!==0">
<el-row>
<h2>客户信息</h2>
<el-row v-for="(val, key) in data.customerInfoDTO" :key="key" style="margin:10px;font-size:16px;height:30px;line-height:30px;border-bottom:1px solid grey;" :gutter="20">
<el-row v-for="(val, key) in data.customerInfoDTO"
:key="key"
style="margin:10px;font-size:16px;height:30px;line-height:30px;border-bottom:1px solid grey;"
:gutter="20">
<el-col :span="10">{{key|infoName}}</el-col>
<el-col :span="14">{{val|showInfo}}</el-col>
</el-row>
</el-row>
<el-row>
<h2 v-if="data.rootAgencyDTO!=null">根级组织信息</h2>
<el-row v-for="(val, key) in data.rootAgencyDTO" :key="key" style="margin:10px;font-size:16px;height:30px;line-height:30px;border-bottom:1px solid grey;" :gutter="20">
<el-row v-for="(val, key) in data.rootAgencyDTO"
:key="key"
style="margin:10px;font-size:16px;height:30px;line-height:30px;border-bottom:1px solid grey;"
:gutter="20">
<el-col :span="10">{{key|infoName}}</el-col>
<el-col :span="14">{{val|showInfo}}</el-col>
</el-row>
</el-row>
<el-row>
<h2 v-if="data.managers.length!==0">管理员信息</h2>
<el-row v-for="(val, index) in data.managers" :key="index" style="margin:10px;font-size:16px;height:30px;line-height:30px;border-bottom:1px solid grey;" :gutter="20">
<el-row v-for="(val, index) in data.managers"
:key="index"
style="margin:10px;font-size:16px;height:30px;line-height:30px;border-bottom:1px solid grey;"
:gutter="20">
<el-col :span="6">{{val.realName}}</el-col>
<el-col :span="4">{{val.gender|genderName}}</el-col>
<el-col :span="14">{{val.mobile}}</el-col>
@ -31,7 +43,7 @@
export default {
props: {
dataList: {
type: [ Object, Array ],
type: [Object, Array],
default: function () {
return {
customerInfoDTO: {},

293
epmet-oper-web/src/views/modules/customer-manage/customer-manage.vue

@ -1,227 +1,218 @@
<template>
<div>
<el-button
type="primary"
<el-button type="primary"
plain
icon="el-icon-circle-plus-outline"
style="margin-bottom:10px;"
@click="toStep(2)"
>新增</el-button
>
<el-card shadow="never" class="aui-card--fill">
<el-table
v-loading="dataListLoading"
@click="toStep(2)">新增</el-button>
<el-card shadow="never"
class="aui-card--fill">
<el-table v-loading="dataListLoading"
:data="dataList"
border
style="width: 100%;"
@row-contextmenu="handleRowContext"
@cell-dblclick="handleRowContext"
>
<el-table-column
prop="logo"
@cell-dblclick="handleRowContext">
<el-table-column prop="logo"
label="客户LOGO"
header-align="left"
align="left"
width="100"
>
width="100">
<template slot-scope="scope">
<el-image
v-if="scope.row.logo"
<el-image v-if="scope.row.logo"
style="width: 40px; height: 40px;text-align: center;"
:src="scope.row.logo"
:preview-src-list="[scope.row.logo]"
>
:preview-src-list="[scope.row.logo]">
</el-image>
<!-- <img v-if="scope.row.logo" :src="scope.row.logo" class="customer-logo" /> -->
</template>
</el-table-column>
<el-table-column
prop="customerName"
<el-table-column prop="customerName"
label="客户名称"
header-align="left"
align="left"
width="300"
></el-table-column>
<el-table-column
label="操作"
width="300"></el-table-column>
<el-table-column label="操作"
fixed="right"
header-align="right"
align="right"
>
align="right">
<template slot-scope="scope">
<el-button
size="small"
<el-button size="small"
v-if="!scope.row.hasRootAgency"
@click="toSetUpStep(scope.row.customerId, 3)"
>根级组织设置</el-button
>
<el-button
size="small"
@click="toSetUpStep(scope.row.customerId, 3)">根级组织设置</el-button>
<el-button size="small"
v-if="!scope.row.hasManager"
@click="toSetUpStep(scope.row.customerId, 4)"
>管理员设置</el-button
>
<el-button size="small" @click="onOpenDetails(scope.row.customerId)"
>详情</el-button
>
@click="toSetUpStep(scope.row.customerId, 4)">管理员设置</el-button>
<el-button size="small"
@click="onOpenDetails(scope.row.customerId)">详情</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog
@close="toStep(0)"
<el-dialog @close="toStep(0)"
width="850px"
:visible.sync="centerDialogVisible"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
>
:close-on-press-escape="false">
<div v-if="step == 1">
<componentInfo :dataList="details"></componentInfo>
</div>
<div class="add-c-box" v-if="step == 2">
<div class="add-c-box"
v-if="step == 2">
<h2>客户信息</h2>
<el-form
label-position="left"
<el-form label-position="left"
label-width="80px"
:model="dataForm2"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="submitStepHandle()"
status-icon
>
<el-form-item prop="customerName" label="客户名称">
<el-input v-model="dataForm2.customerName" key="customerName">
<span slot="prefix" class="el-input__icon">
<svg class="icon-svg" aria-hidden="true">
status-icon>
<el-form-item prop="customerName"
label="客户名称">
<el-input v-model="dataForm2.customerName"
key="customerName">
<span slot="prefix"
class="el-input__icon">
<svg class="icon-svg"
aria-hidden="true">
<use xlink:href="#icon-user"></use>
</svg>
</span>
</el-input>
</el-form-item>
<el-form-item prop="organizationLevel" label="组织级别">
<el-select
v-model="dataForm2.organizationLevel"
key="organizationLevel"
>
<el-option
v-for="(val, key) in organizationLevels"
<el-form-item prop="organizationLevel"
label="组织级别">
<el-select v-model="dataForm2.organizationLevel"
key="organizationLevel">
<el-option v-for="(val, key) in organizationLevels"
:key="key"
:label="key"
:value="val"
></el-option>
:value="val"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="logo" label="客户LOGO">
<el-upload
class="avatar-uploader"
<el-form-item prop="logo"
label="客户LOGO">
<el-upload class="avatar-uploader"
:action="uploadUlr"
:show-file-list="false"
:on-success="handleAvatarSuccess"
>
<img v-if="dataForm2.logo" :src="dataForm2.logo" class="avatar" />
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
:on-success="handleAvatarSuccess">
<img v-if="dataForm2.logo"
:src="dataForm2.logo"
class="avatar" />
<i v-else
class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-button type="primary" @click="submitStepHandle">下一步</el-button>
<el-button type="primary"
@click="submitStepHandle">下一步</el-button>
</el-form>
</div>
<div class="add-c-box" v-else-if="step == 3">
<div class="add-c-box"
v-else-if="step == 3">
<h2>根级组织信息</h2>
<el-form
label-position="left"
<el-form label-position="left"
label-width="80px"
:model="dataForm3"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="submitStepHandle()"
status-icon
>
<el-form-item prop="agencyName" label="组织名称">
<el-input v-model="dataForm3.agencyName" key="agencyName">
<span slot="prefix" class="el-input__icon">
<svg class="icon-svg" aria-hidden="true">
status-icon>
<el-form-item prop="agencyName"
label="组织名称">
<el-input v-model="dataForm3.agencyName"
key="agencyName">
<span slot="prefix"
class="el-input__icon">
<svg class="icon-svg"
aria-hidden="true">
<use xlink:href="#icon-user"></use>
</svg>
</span>
</el-input>
</el-form-item>
<el-form-item prop="level" label="组织级别">
<el-select
v-model="dataForm3.level"
<el-form-item prop="level"
label="组织级别">
<el-select v-model="dataForm3.level"
key="level"
@change="onLevelChange"
>
<el-option
v-for="(val, key) in organizationLevels"
@change="onLevelChange">
<el-option v-for="(val, key) in organizationLevels"
:key="key"
:label="key"
:value="val"
></el-option>
:value="val"></el-option>
</el-select>
</el-form-item>
<el-form-item :prop="pcd" label="选择地区" :show-message="pcdError">
<v-distpicker
:hideArea="isHideArea"
<el-form-item :prop="pcd"
label="选择地区"
:show-message="pcdError">
<v-distpicker :hideArea="isHideArea"
:province="dataForm3.province"
:city="dataForm3.city"
:area="dataForm3.district"
:onlyProvince="isOnlyProvince"
@province="onChangeProvince"
@city="onChangeCity"
@area="onChangeArea"
></v-distpicker>
@area="onChangeArea"></v-distpicker>
</el-form-item>
<el-form-item prop="areaCode" label="地区编码">
<el-input
v-model="dataForm3.areaCode"
<el-form-item prop="areaCode"
label="地区编码">
<el-input v-model="dataForm3.areaCode"
key="areaCode"
disabled
></el-input>
disabled></el-input>
</el-form-item>
<el-button type="primary" @click="submitStepHandle">下一步</el-button>
<el-button type="primary"
@click="submitStepHandle">下一步</el-button>
</el-form>
</div>
<div class="add-c-box" v-else-if="step == 4">
<div class="add-c-box"
v-else-if="step == 4">
<h2>管理员信息</h2>
<el-form
label-position="left"
<el-form label-position="left"
label-width="80px"
:model="dataForm4"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="submitStepHandle()"
status-icon
>
<el-form-item prop="realName" label="姓名">
<el-input v-model="dataForm4.realName" key="realName">
<span slot="prefix" class="el-input__icon">
<svg class="icon-svg" aria-hidden="true">
status-icon>
<el-form-item prop="realName"
label="姓名">
<el-input v-model="dataForm4.realName"
key="realName">
<span slot="prefix"
class="el-input__icon">
<svg class="icon-svg"
aria-hidden="true">
<use xlink:href="#icon-user"></use>
</svg>
</span>
</el-input>
</el-form-item>
<el-form-item prop="gender" label="性别">
<el-select v-model="dataForm4.gender" key="gender">
<el-option
v-for="(val, key) in genders"
<el-form-item prop="gender"
label="性别">
<el-select v-model="dataForm4.gender"
key="gender">
<el-option v-for="(val, key) in genders"
:key="key"
:label="val"
:value="key"
></el-option>
:value="key"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="mobile" label="手机号">
<el-input v-model.number="dataForm4.mobile" key="mobile">
<span slot="prefix" class="el-input__icon">
<svg class="icon-svg" aria-hidden="true">
<el-form-item prop="mobile"
label="手机号">
<el-input v-model.number="dataForm4.mobile"
key="mobile">
<span slot="prefix"
class="el-input__icon">
<svg class="icon-svg"
aria-hidden="true">
<use xlink:href="#icon-user"></use>
</svg>
</span>
</el-input>
</el-form-item>
<el-button type="primary" @click="submitStepHandle">完成</el-button>
<el-button type="primary"
@click="submitStepHandle">完成</el-button>
</el-form>
</div>
</el-dialog>
@ -234,6 +225,7 @@
></style>
<script>
/* eslint-disable */
import mixinViewModule from '@/mixins/view-module'
import VDistpicker from 'v-distpicker'
import { Loading } from 'element-ui'
@ -245,7 +237,7 @@ export default {
return {
mixinViewModuleOptions: {
getDataListURL: '/oper/crm/customer/getvalidcustomerlist',
getDataListIsPage: false
getDataListIsPage: false,
},
uploadUlr: window.SITE_CONFIG['apiURL'] + '/oss/file/customerlogo/upload',
pcd: 'district',
@ -256,7 +248,7 @@ export default {
'乡(镇、街道)级': 'street',
区县级: 'district',
市级: 'city',
省级: 'province'
省级: 'province',
},
genders: ['未知', '男', '女'],
step: 1,
@ -287,20 +279,23 @@ export default {
isHideArea: false,
isOnlyProvince: false,
checkMobile: (rule, value, callback) => {
if (!Number.isInteger(value)) {
return callback(new Error('手机号格式不正确'))
}
// if (!Number.isInteger(value)) {
// return callback(new Error(''))
// }
var phoneReg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
if (!phoneReg.test(value.toString())) {
return callback(new Error('请输入正确格式的手机号'))
}
callback()
}
},
}
},
components: {
VDistpicker,
componentInfo
componentInfo,
},
mounted () {
console.log(app.ajax)
},
methods: {
toStep (s) {
@ -376,25 +371,38 @@ export default {
})
},
submitDataForm4 () {
this.dataForm4.customerId = this.customerId
this.dataForm4.agencyId = this.agencyId
this.dataForm4.mobile = this.dataForm4.mobile.toString()
console.log(this.dataForm4)
let dataForm = this.dataForm4
dataForm.customerId = this.dataForm4.customerId
dataForm.agencyId = this.dataForm4.agencyId
dataForm.mobile = this.dataForm4.mobile.toString()
console.log(dataForm)
const url = '/oper/crm/customer/addmanager'
const dataForm = this.dataForm4
return this.$http
.post(url, dataForm)
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
} else {
console.log('提交信息成功' + this.step)
app.ajax.post(url, dataForm,
(data, rspMsg) => {
this.$message.success('提交信息成功' + this.step)
this.toStep(0)
}
})
.catch(() => {
return this.$message.error('网络错误')
})
},
(rspMsg, data) => {
this.$message.error(rspMsg);
});
// return this.$http
// .post(url, dataForm)
// .then(({ data: res }) => {
// if (res.code !== 0) {
// return this.$message.error(res.msg)
// } else {
// console.log('' + this.step)
// this.toStep(0)
// }
// })
// .catch(() => {
// return this.$message.error('')
// })
},
async toNextStep () {
let loadingInstance = Loading.service()
@ -408,6 +416,7 @@ export default {
loadingInstance.close()
},
submitStepHandle () {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false

82
epmet-oper-web/src/views/modules/customize/function.vue

@ -1,13 +1,19 @@
<template>
<el-card shadow="never" class="aui-card--fill">
<el-card shadow="never"
class="aui-card--fill">
<div class="mod-sys__params">
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<el-form :inline="true"
:model="dataForm"
@keyup.enter.native="getDataList()">
<el-form-item label="功能名称">
<el-input v-model="dataForm.functionName" :placeholder="$t('params.paramCode')" clearable></el-input>
<el-input v-model="dataForm.functionName"
:placeholder="$t('params.paramCode')"
clearable></el-input>
</el-form-item>
<el-form-item label="功能类型">
<el-select v-model="dataForm.functionGroup"
placeholder="全部" clearable>
placeholder="全部"
clearable>
<el-option v-for="item in functionGroupList"
:key="item.dictValue"
:label="item.dictName"
@ -17,7 +23,8 @@
</el-form-item>
<el-form-item label="上架状态">
<el-select v-model="dataForm.shoppingStatus"
placeholder="全部" clearable>
placeholder="全部"
clearable>
<el-option v-for="item in shoppingStatusList"
:key="item.dictValue"
:label="item.dictName"
@ -29,29 +36,63 @@
<el-button @click="getDataList()">{{ $t('query') }}</el-button>
</el-form-item>
<el-form-item>
<el-button v-if="$hasPermission('sys:params:save')" type="primary" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button>
<el-button v-if="$hasPermission('sys:params:save')"
type="primary"
@click="addOrUpdateHandle()">{{ $t('add') }}</el-button>
</el-form-item>
<el-form-item>
<el-button v-if="$hasPermission('sys:params:delete')" type="danger" @click="deleteHandle()">{{ $t('deleteBatch') }}</el-button>
<el-button v-if="$hasPermission('sys:params:delete')"
type="danger"
@click="deleteHandle()">{{ $t('deleteBatch') }}</el-button>
</el-form-item>
</el-form>
<el-table v-loading="dataListLoading" :data="dataList" border @selection-change="dataListSelectionChangeHandle" style="width: 100%;">
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<el-table-column prop="functionName" label="功能名称" header-align="center" align="center"></el-table-column>
<el-table-column prop="functionGroup" label="功能类型" :formatter="groupFormat" header-align="center" align="center"></el-table-column>
<el-table-column prop="shoppingStatus" label="上架状态" :formatter="stateFormat" header-align="center" align="center"></el-table-column>
<el-table-column prop="functionExplain" label="功能说明" header-align="center" align="center"></el-table-column>
<el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
<el-table v-loading="dataListLoading"
:data="dataList"
border
@selection-change="dataListSelectionChangeHandle"
style="width: 100%;">
<el-table-column type="selection"
header-align="center"
align="center"
width="50"></el-table-column>
<el-table-column prop="functionName"
label="功能名称"
header-align="center"
align="center"></el-table-column>
<el-table-column prop="functionGroup"
label="功能类型"
:formatter="groupFormat"
header-align="center"
align="center"></el-table-column>
<el-table-column prop="shoppingStatus"
label="上架状态"
:formatter="stateFormat"
header-align="center"
align="center"></el-table-column>
<el-table-column prop="functionExplain"
label="功能说明"
header-align="center"
align="center"></el-table-column>
<el-table-column :label="$t('handle')"
fixed="right"
header-align="center"
align="center"
width="150">
<template slot-scope="scope">
<el-button v-if="$hasPermission('sys:params:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{$t('update')}}
<el-button v-if="$hasPermission('sys:params:update')"
type="text"
size="small"
@click="addOrUpdateHandle(scope.row.id)">{{$t('update')}}
</el-button>
<el-button v-if="$hasPermission('sys:params:delete')" type="text" size="small" @click="deleteHandle(scope.row.id)">{{$t('delete')}}
<el-button v-if="$hasPermission('sys:params:delete')"
type="text"
size="small"
@click="deleteHandle(scope.row.id)">{{$t('delete')}}
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page="page"
<el-pagination :current-page="page"
:page-sizes="[10, 20, 50, 100]"
:page-size="limit"
:total="total"
@ -60,7 +101,9 @@
@current-change="pageCurrentChangeHandle">
</el-pagination>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
<add-or-update v-if="addOrUpdateVisible"
ref="addOrUpdate"
@refreshDataList="getDataList"></add-or-update>
</div>
</el-card>
</template>
@ -128,5 +171,4 @@ export default {
</script>
<style scoped>
</style>

26
epmet-oper-web/vue.config.js

@ -3,7 +3,7 @@
*/
module.exports = {
baseUrl: process.env.NODE_ENV === 'production' ? '' : '/epmet-oper',
chainWebpack: config => {
chainWebpack: (config) => {
const svgRule = config.module.rule('svg')
svgRule.uses.clear()
svgRule
@ -19,7 +19,25 @@ module.exports = {
port: 9001,
overlay: {
errors: true,
warnings: true
}
}
warnings: true,
},
},
// webpack简单配置
configureWebpack: {
// debuge调试配置
devtool: 'source-map',
externals: {
AMap: 'AMap',
},
resolve: {
//配置路径别名
// /node_modules/@vue/cli-service/lib/config/base.js中已经配好的@路径,所以这里可以直接使用@
alias: {
'@js': '@/js',
'@c': '@/components',
'@v': '@/views',
'@m': '@/img',
},
},
},
}

Loading…
Cancel
Save