Commit e65dfd38 authored by Pan's avatar Pan

refine code && rm code

parent cd47007f
...@@ -56,7 +56,6 @@ const Table = resolve => require(['../views/example/table'], resolve); ...@@ -56,7 +56,6 @@ const Table = resolve => require(['../views/example/table'], resolve);
const DragTable = resolve => require(['../views/example/dragTable'], resolve); const DragTable = resolve => require(['../views/example/dragTable'], resolve);
const InlineEditTable = resolve => require(['../views/example/inlineEditTable'], resolve); const InlineEditTable = resolve => require(['../views/example/inlineEditTable'], resolve);
const Form1 = resolve => require(['../views/example/form1'], resolve); const Form1 = resolve => require(['../views/example/form1'], resolve);
// const Form2 = resolve => require(['../views/example/form2'], resolve);
/* permission */ /* permission */
const Permission = resolve => require(['../views/permission/index'], resolve); const Permission = resolve => require(['../views/permission/index'], resolve);
...@@ -64,49 +63,56 @@ const Permission = resolve => require(['../views/permission/index'], resolve); ...@@ -64,49 +63,56 @@ const Permission = resolve => require(['../views/permission/index'], resolve);
Vue.use(Router); Vue.use(Router);
/**
* icon :the icon show in the sidebar
* hidden: if hiddenLtrue will not show in the sidebar
* redirect :if redirect:noredirect will not redirct in the levelbar
* noDropdown : if noDropdown:true will not has submenu
* meta: { role: ['admin'] } will control the page role
*/
export default new Router({ export default new Router({
// mode: 'history', //后端支持可开 // mode: 'history', //后端支持可开
scrollBehavior: () => ({ y: 0 }), scrollBehavior: () => ({ y: 0 }),
routes: [ routes: [
{ path: '/login', component: Login, hidden: true }, { path: '/login', component: Login, hidden: true },
{ path: '/authredirect', component: authRedirect, hidden: true }, { path: '/authredirect', component: authRedirect, hidden: true },
{ path: '/sendpwd', component: sendPWD, hidden: true }, { path: '/sendpwd', component: sendPWD, hidden: true },
{ path: '/reset', component: reset, hidden: true }, { path: '/reset', component: reset, hidden: true },
{ path: '/404', component: Err404, hidden: true }, { path: '/404', component: Err404, hidden: true },
{ path: '/401', component: Err401, hidden: true }, { { path: '/401', component: Err401, hidden: true },
path: '/', {
component: Layout, path: '/',
redirect: '/dashboard', component: Layout,
name: '首页', redirect: '/dashboard',
hidden: true, name: '首页',
children: [{ path: 'dashboard', component: dashboard }] hidden: true,
}, { children: [{ path: 'dashboard', component: dashboard }]
path: '/introduction', },
component: Layout, {
redirect: '/introduction/index', path: '/introduction',
icon: 'xinrenzhinan', component: Layout,
noDropdown: true, redirect: '/introduction/index',
children: [ icon: 'xinrenzhinan',
{ path: 'index', component: Introduction, name: '简述' } noDropdown: true,
] children: [{ path: 'index', component: Introduction, name: '简述' }]
}, { },
path: '/permission', {
component: Layout, path: '/permission',
redirect: '/permission/index', component: Layout,
name: '权限测试', redirect: '/permission/index',
icon: 'quanxian', name: '权限测试',
meta: { role: ['admin'] }, icon: 'quanxian',
noDropdown: true, meta: { role: ['admin'] },
children: [ noDropdown: true,
{ path: 'index', component: Permission, name: '权限测试页', meta: { role: ['admin'] } } children: [{ path: 'index', component: Permission, name: '权限测试页', meta: { role: ['admin'] } }]
] },
}, { {
path: '/components', path: '/components',
component: Layout, component: Layout,
redirect: '/components/index', redirect: '/components/index',
name: '组件', name: '组件',
icon: 'zujian', icon: 'zujian',
children: [ children: [
{ path: 'index', component: componentsIndex, name: '介绍 ' }, { path: 'index', component: componentsIndex, name: '介绍 ' },
{ path: 'tinymce', component: Tinymce, name: '富文本编辑器' }, { path: 'tinymce', component: Tinymce, name: '富文本编辑器' },
{ path: 'markdown', component: Markdown, name: 'Markdown' }, { path: 'markdown', component: Markdown, name: 'Markdown' },
...@@ -118,88 +124,75 @@ export default new Router({ ...@@ -118,88 +124,75 @@ export default new Router({
{ path: 'sticky', component: Sticky, name: 'Sticky' }, { path: 'sticky', component: Sticky, name: 'Sticky' },
{ path: 'countto', component: CountTo, name: 'CountTo' }, { path: 'countto', component: CountTo, name: 'CountTo' },
{ path: 'mixin', component: Mixin, name: '小组件' } { path: 'mixin', component: Mixin, name: '小组件' }
] ]
}, { },
path: '/charts', {
component: Layout, path: '/charts',
redirect: '/charts/index', component: Layout,
name: '图表', redirect: '/charts/index',
icon: 'tubiaoleixingzhengchang', name: '图表',
children: [ icon: 'tubiaoleixingzhengchang',
children: [
{ path: 'index', component: chartIndex, name: '介绍' }, { path: 'index', component: chartIndex, name: '介绍' },
{ path: 'keyboard', component: KeyboardChart, name: '键盘图表' }, { path: 'keyboard', component: KeyboardChart, name: '键盘图表' },
{ path: 'keyboard2', component: KeyboardChart2, name: '键盘图表2' }, { path: 'keyboard2', component: KeyboardChart2, name: '键盘图表2' },
{ path: 'line', component: LineMarker, name: '折线图' }, { path: 'line', component: LineMarker, name: '折线图' },
{ path: 'mixchart', component: MixChart, name: '混合图表' } { path: 'mixchart', component: MixChart, name: '混合图表' }
] ]
}, { },
path: '/errorpage', {
component: Layout, path: '/errorpage',
redirect: 'noredirect', component: Layout,
name: '错误页面', redirect: 'noredirect',
icon: '404', name: '错误页面',
children: [ icon: '404',
children: [
{ path: '401', component: Err401, name: '401' }, { path: '401', component: Err401, name: '401' },
{ path: '404', component: Err404, name: '404' } { path: '404', component: Err404, name: '404' }
] ]
}, { },
path: '/errlog', {
component: Layout, path: '/errlog',
redirect: 'noredirect', component: Layout,
name: 'errlog', redirect: 'noredirect',
icon: 'bug', name: 'errlog',
noDropdown: true, icon: 'bug',
children: [ noDropdown: true,
{ path: 'log', component: ErrorLog, name: '错误日志' } children: [{ path: 'log', component: ErrorLog, name: '错误日志' }]
] },
}, { {
path: '/excel', path: '/excel',
component: Layout, component: Layout,
redirect: 'noredirect', redirect: 'noredirect',
name: 'excel', name: 'excel',
icon: 'EXCEL', icon: 'EXCEL',
noDropdown: true, noDropdown: true,
children: [ children: [{ path: 'download', component: ExcelDownload, name: '导出excel' }]
{ path: 'download', component: ExcelDownload, name: '导出excel' } },
] {
}, { path: '/theme',
path: '/theme', component: Layout,
component: Layout, redirect: 'noredirect',
redirect: 'noredirect', name: 'theme',
name: 'theme', icon: 'theme',
icon: 'theme', noDropdown: true,
noDropdown: true, children: [{ path: 'index', component: Theme, name: '换肤' }]
children: [ },
{ path: 'index', component: Theme, name: '换肤' } {
] path: '/example',
}, { component: Layout,
path: '/example', redirect: 'noredirect',
component: Layout, name: '综合实例',
redirect: 'noredirect', icon: 'zonghe',
name: '综合实例', children: [
icon: 'zonghe',
children: [
{ path: 'dynamictable', component: DynamicTable, name: '动态table' }, { path: 'dynamictable', component: DynamicTable, name: '动态table' },
{ path: 'dragtable', component: DragTable, name: '拖拽table' }, { path: 'dragtable', component: DragTable, name: '拖拽table' },
{ path: 'inline_edit_table', component: InlineEditTable, name: 'table内编辑' }, { path: 'inline_edit_table', component: InlineEditTable, name: 'table内编辑' },
{ path: 'table', component: Table, name: '综合table' }, { path: 'table', component: Table, name: '综合table' },
{ path: 'form1', component: Form1, name: '综合form1' } { path: 'form1', component: Form1, name: '综合form1' }
// { path: 'form2', component: Form2, name: '综合form2' } ]
] },
},
// { { path: '*', redirect: '/404', hidden: true }
// path: '/admin',
// component: Layout,
// redirect: 'noredirect',
// name: '后台管理',
// icon: 'geren1',
// children: [
// { path: 'createuser', component: AdminCreateUser, name: '管理员', meta: { role: ['admin'] } },
// { path: 'list', component: UsersList, name: '后台用户列表', meta: { role: ['super_editor', 'product', 'author_assistant'] } },
// { path: 'qicklyCreate', component: QuicklyCreateUser, name: '一键创建账户', meta: { role: ['super_editor', 'gold_editor', 'weex_editor', 'wscn_editor', 'author_assistant', 'product'] } },
// { path: 'profile', component: UserProfile, name: '个人' }
// ]
// },
{ path: '*', redirect: '/404', hidden: true }
] ]
}); });
<template>
<div class="app-container">
<h1 class="page-heading">
创建后台用户
</h1>
<el-form ref="createForm" :rules="createRules" label-position="left" style='width:80%' :model="form" label-width="100px">
<el-form-item label="用户邮箱" prop="email">
<el-input v-model="form.email" placeholder="公司邮箱"></el-input>
</el-form-item>
<el-form-item label="权限选择" >
<el-select style="width: 100%" v-model="form.role" multiple placeholder="请选择">
<el-option
v-for="item in roleList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="loading" @click.native.prevent="onSubmit">立即创建</el-button>
<el-button>
<router-link class="normal_link" to="/index">
取消
</router-link>
</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { createNewUser, getRoleList } from 'api/adminUser';
import { isWscnEmail } from 'utils/validate';
export default{
name: 'createUser',
data() {
const validateEmail = (rule, value, callback) => {
if (!isWscnEmail(value)) {
callback(new Error('邮箱错误'));
} else {
callback();
}
};
return {
roleList: [],
loading: false,
form: {
email: '',
role: ''
},
createRules: {
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{ validator: validateEmail }
]
}
};
},
methods: {
onSubmit() {
this.$refs.createForm.validate(valid => {
if (valid) {
this.loading = true;
const data = {
email: this.form.email,
roles: this.form.role
};
createNewUser(data).then(() => {
this.$message.success('创建成功');
});
} else {
this.$message.error('error submit!!');
}
this.loading = false;
});
}
},
created() {
getRoleList().then(response => {
const roleMap = response.data.role_map;
const keyArr = Object.keys(roleMap);
this.roleList = keyArr.map(v => ({ value: v, label: roleMap[v] }));
});
}
};
</script>
This diff is collapsed.
<template>
<div class="app-container quicklyCreateUser-container">
<el-form ref="form" :rules="rules" :model="form" label-position="left" label-width="60px">
<el-card style=" margin-top: 50px;width: 600px;">
<div slot="header" class="clearfix">
<el-row :gutter="20">
<el-col :span="20">
<el-form-item label="昵称" prop="display_name">
<el-input v-model="form.display_name"></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button type="success" @click="onSubmit">立即创建</el-button>
</el-col>
</el-row>
</div>
<el-row>
<el-col :span="12">
<el-button style="height: 150px;width: 150px;" @click="handleImagecropper" type="primary">上传头像
</el-button>
</el-col>
<el-col :span="12">
<img style=" float:right;width: 150px;height: 150px;border-radius: 50%;margin-left: 50px;"
:src="form.image">
</el-col>
</el-row>
</el-card>
</el-form>
<el-tooltip style="position: absolute;margin-left: 750px;top: 380px" placement="top">
<el-button>Tooltip</el-button>
<div slot="content">昵称为必填项<br/><br/>一键创建只能创建后台虚拟账号<br/><br/>没有任何实际操作能力</div>
</el-tooltip>
<ImageCropper field="img"
:width="300"
:height="300"
url="/upload"
@crop-upload-success="cropSuccess"
:key="imagecropperKey"
v-show="imagecropperShow">
</ImageCropper>
</div>
</template>
<script>
import { createNewUser } from 'api/adminUser';
import ImageCropper from 'components/ImageCropper';
export default{
name: 'quicklyCreateUser',
components: { ImageCropper },
data() {
return {
form: {
display_name: '',
image: '',
role: ['virtual_editor']
},
imagecropperShow: false,
imagecropperKey: 0,
rules: {
display_name: [{ required: true, message: '昵称必填', trigger: 'blur' }]
}
}
},
methods: {
onSubmit() {
this.$refs.form.validate(valid => {
if (valid) {
createNewUser(this.form).then(() => {
this.$message.success('创建成功')
});
} else {
console.log('error submit!!');
return false;
}
});
},
handleImagecropper() {
this.imagecropperShow = true;
this.imagecropperKey = this.imagecropperKey + 1;
},
cropSuccess(url) {
this.imagecropperShow = false;
this.form.image = url
}
}
}
</script>
<template>
<div class="app-container adminUsers-list-container">
<div class="filter-container">
<el-input @keyup.enter.native="handleFilter" style="width:135px;" class="filter-item" placeholder="ID" type="number" v-model="listQuery.uid">
</el-input>
<el-input style="width:135px;" class="filter-item" placeholder="Name" @keyup.enter.native="handleFilter" v-model="listQuery.display_name">
</el-input>
<el-input class="filter-item" style="width:300px;display: inline-table" placeholder="email" @keyup.enter.native="handleFilter"
v-model="listQuery.email">
<template slot="append">@wallstreetcn.com</template>
</el-input>
</el-input>
<el-select style="width: 250px" class="filter-item" v-model="listQuery.role" clearable placeholder="权限">
<el-option v-for="item in roleOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-button class="filter-item" type="primary" icon="search" @click="handleFilter">
搜索
</el-button>
<el-button class="filter-item" type="danger" @click="resetFilter">重置筛选项</el-button>
</div>
<el-table :data="list" v-loading.body="listLoading" border fit highlight-current-row>
<el-table-column label="ID" width="130">
<template scope="scope">
<span>{{scope.row.uid}}</span>
</template>
</el-table-column>
<el-table-column label="Name">
<template scope="scope">
<span>{{scope.row.display_name}}</span>
</template>
</el-table-column>
<el-table-column label="Email">
<template scope="scope">
<span>{{scope.row.email}}</span>
</template>
</el-table-column>
<el-table-column label="Role">
<template scope="scope">
<el-tag style="margin-right: 5px;" v-for='item in scope.row.roles' :key='item+scope.row.uid' type="primary">
{{item}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="170">
<template scope="scope">
<el-button size="small" type="success" @click="handleEdit(scope.row)">编辑权限</el-button>
<el-button size="small" v-if='scope.row.roles.indexOf("virtual_editor")>=0||hasRoleEdit' type="primary" @click="handleInfo(scope.row)">修改</el-button>
</template>
</el-table-column>
</el-table>
<div v-show="!listLoading" class="pagination-container">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listQuery.page" :page-sizes="[10,20,30, 50]"
:page-size="listQuery.limit" layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
<el-dialog title="编辑" v-model="dialogFormVisible" size='small'>
<el-form :model="tempForm" label-position="left" label-width="70px">
<el-form-item label="权限">
<el-select style="width: 100%" v-model="tempForm.roles" multiple placeholder="请选择">
<el-option v-for="item in roleOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="updateUser">确 定</el-button>
</div>
</el-dialog>
<el-dialog title="编辑简介" v-model="dialogInfoVisible">
<el-form :model="infoForm">
<el-form-item label="昵称">
<el-input v-model="infoForm.display_name"></el-input>
</el-form-item>
<el-form-item label="简介">
<el-input type="textarea" :autosize="{ minRows: 2}" v-model="infoForm.introduction"></el-input>
</el-form-item>
<el-form-item label="头像">
</el-form-item>
<div style='width:200px;height:200px;'>
<singleImageUpload2 v-model="infoForm.image"></singleImageUpload2>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogInfoVisible = false">取 消</el-button>
<el-button type="primary" @click="submitInfo">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import { getRoleList, updateInfo } from 'api/adminUser';
import { getUserList } from 'api/remoteSearch';
import { objectMerge } from 'utils';
import singleImageUpload2 from 'components/Upload/singleImage2';
export default {
name: 'adminUsersList',
components: { singleImageUpload2 },
data() {
return {
list: null,
total: null,
listLoading: true,
listQuery: {
page: 1,
limit: 20,
role: '',
uid: undefined,
display_name: ''
},
roleOptions: [],
dialogFormVisible: false,
tempForm: {
uid: null,
roles: []
},
dialogInfoVisible: false,
infoForm: {
uid: null,
image: '',
display_name: '',
introduction: ''
}
}
},
computed: {
...mapGetters([
'roles'
]),
hasRoleEdit() {
if (this.roles.indexOf('admin') >= 0) {
return true;
} else {
return false;
}
}
},
created() {
this.getList();
this.getAdminRoleList();
},
methods: {
getList() {
getUserList(this.listQuery).then(response => {
const data = response.data;
this.list = data.items;
this.total = data.count;
this.listLoading = false;
})
},
resetFilter() {
this.listQuery = {
page: 1,
limit: 20,
role: '',
uid: undefined,
display_name: ''
}
this.getList();
},
handleSizeChange(val) {
this.listQuery.limit = val;
this.getList();
},
handleCurrentChange(val) {
this.listQuery.page = val;
this.getList();
},
handleFilter() {
this.getList();
},
getAdminRoleList() {
getRoleList().then(response => {
const roleMap = response.data.role_map;
const keyArr = Object.keys(roleMap);
this.roleOptions = keyArr.map(v => ({ value: v, label: roleMap[v] }));
})
},
handleEdit(row) {
this.dialogFormVisible = true;
objectMerge(this.tempForm, row);
},
updateUser() {
updateInfo(this.tempForm).then(() => {
this.$notify({
title: '成功',
message: '修改成功',
type: 'success'
});
for (const item of this.list) {
if (item.uid === this.tempForm.uid) {
const index = this.list.indexOf(item);
this.list[index] = objectMerge(this.list[index], this.tempForm);
break
}
}
this.dialogFormVisible = false;
});
},
handleInfo(row) {
this.dialogInfoVisible = true;
objectMerge(this.infoForm, row);
},
submitInfo() {
updateInfo(this.infoForm).then(() => {
this.$notify({
title: '成功',
message: '修改成功',
type: 'success'
});
for (const item of this.list) {
if (item.uid === this.infoForm.uid) {
const index = this.list.indexOf(item);
this.list[index] = objectMerge(this.list[index], this.infoForm);
break
}
}
this.dialogInfoVisible = false;
});
}
}
}
</script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment