[更新] 完成基础role和user管理

This commit is contained in:
kdyq007 2019-11-19 21:49:51 +08:00
parent 224a48a5f3
commit 8d1517d550
8 changed files with 48 additions and 80 deletions

View File

@ -33,7 +33,6 @@ class UserView(APIView):
page_size = get_page_size(request.values.get('page_size')) page_size = get_page_size(request.values.get('page_size'))
q = request.values.get("q") q = request.values.get("q")
numfound, users = UserCRUD.search(q, page, page_size) numfound, users = UserCRUD.search(q, page, page_size)
id2parents = RoleRelationCRUD.get_parents(uids=[i.uid for i in users]) id2parents = RoleRelationCRUD.get_parents(uids=[i.uid for i in users])
users = [i.to_dict() for i in users] users = [i.to_dict() for i in users]

View File

@ -13,7 +13,7 @@ export function searchUser (params) {
return axios({ return axios({
url: urlPrefix + `/users`, url: urlPrefix + `/users`,
method: 'GET', method: 'GET',
data: params params: params
}) })
} }

View File

@ -16,7 +16,7 @@
label="角色列表" label="角色列表"
> >
<a-select name="otherID" v-decorator="['otherID', {rules: [{ required: true, message: '请选择另一个角色'}]} ]"> <a-select name="otherID" v-decorator="['otherID', {rules: [{ required: true, message: '请选择另一个角色'}]} ]">
<a-select-option v-for="role in allRoles" :key="role.id">{{ role.name }}</a-select-option> <a-select-option v-for="role in allRoles" v-if="role.id != current_record.id" :key="role.id">{{ role.name }}</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
@ -65,7 +65,8 @@ export default {
drawerTitle: '角色关联', drawerTitle: '角色关联',
drawerVisible: false, drawerVisible: false,
formLayout: 'vertical', formLayout: 'vertical',
allRoles: [] allRoles: [],
current_record: null
} }
}, },
@ -105,6 +106,7 @@ export default {
this.drawerVisible = false this.drawerVisible = false
}, },
handleAddRoleRelation (record) { handleAddRoleRelation (record) {
this.current_record = record
this.drawerVisible = true this.drawerVisible = true
this.$nextTick(() => { this.$nextTick(() => {
this.getAllRoles() this.getAllRoles()

View File

@ -21,15 +21,7 @@
v-decorator="['name', {rules: [{ required: true, message: '请输入资源名'}]} ]" v-decorator="['name', {rules: [{ required: true, message: '请输入资源名'}]} ]"
/> />
</a-form-item> </a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="应用列表"
>
<a-select name="app_id" default-value="1" v-decorator="['app_id', {rules: []} ]">
<a-select-option value="1">默认应用</a-select-option>
</a-select>
</a-form-item>
<a-form-item <a-form-item
:label-col="formItemLayout.labelCol" :label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol" :wrapper-col="formItemLayout.wrapperCol"
@ -40,6 +32,14 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item>
<a-input
name="app_id"
type="hidden"
v-decorator="['app_id', {rules: []} ]"
/>
</a-form-item>
<a-form-item> <a-form-item>
<a-input <a-input
name="id" name="id"
@ -137,7 +137,7 @@ export default {
this.form.setFieldsValue({ this.form.setFieldsValue({
id: record.id, id: record.id,
name: record.name, name: record.name,
app_id: record.app_id, app_id: this.$store.state.app.name,
resource_type_id: record.resource_type_id resource_type_id: record.resource_type_id
}) })
}) })

View File

@ -21,16 +21,6 @@
v-decorator="['name', {rules: [{ required: true, message: '请输入角色名'}]} ]" v-decorator="['name', {rules: [{ required: true, message: '请输入角色名'}]} ]"
/> />
</a-form-item> </a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="应用列表"
>
<a-select name="app_id" default-value="1" v-decorator="['app_id', {rules: []} ]">
<a-select-option value="1">默认应用</a-select-option>
</a-select>
</a-form-item>
<a-form-item <a-form-item
:label-col="horizontalFormItemLayout.labelCol" :label-col="horizontalFormItemLayout.labelCol"
:wrapper-col="horizontalFormItemLayout.wrapperCol" :wrapper-col="horizontalFormItemLayout.wrapperCol"
@ -43,6 +33,14 @@
/> />
</a-form-item> </a-form-item>
<a-form-item>
<a-input
name="app_id"
type="hidden"
v-decorator="['app_id', {rules: []} ]"
/>
</a-form-item>
<a-form-item> <a-form-item>
<a-input <a-input
name="id" name="id"
@ -140,7 +138,7 @@ export default {
this.form.setFieldsValue({ this.form.setFieldsValue({
id: record.id, id: record.id,
name: record.name, name: record.name,
app_id: record.app_id, app_id: this.$store.state.app.name,
is_app_admin: record.is_app_admin is_app_admin: record.is_app_admin
}) })
}) })

View File

@ -61,7 +61,7 @@
> >
<a-input <a-input
name="email" name="email"
v-decorator="['email', {rules: [{ required: true, message: '请输入邮箱'},{message: '请输入正确的邮箱', pattern: RegExp('^\w+@\w+\.\w+$')}]} ]" v-decorator="['email', {rules: [{ required: true, message: '请输入邮箱'},{message: '请输入正确的邮箱', pattern: /^\w+\@\w+(\.\w+)+$/}]} ]"
/> />
</a-form-item> </a-form-item>
@ -72,7 +72,7 @@
> >
<a-input <a-input
name="mobile" name="mobile"
v-decorator="['mobile', {rules: [{message: '请输入正确的手机号码', pattern: RegExp('^1\d{10}$')}]} ]" v-decorator="['mobile', {rules: [{message: '请输入正确的手机号码', pattern: /^1\d{10}$/ }]} ]"
/> />
</a-form-item> </a-form-item>
@ -183,7 +183,7 @@ export default {
console.log(record) console.log(record)
this.$nextTick(() => { this.$nextTick(() => {
this.form.setFieldsValue({ this.form.setFieldsValue({
uid: record.uid, id: record.uid,
username: record.username, username: record.username,
nickname: record.nickname, nickname: record.nickname,
department: record.department, department: record.department,

View File

@ -1,21 +1,9 @@
<template> <template>
<a-card :bordered="false"> <a-card :bordered="false">
<a-form layout="inline">
<a-row :gutter="48">
<a-col :md="3" :sm="24">
<div class="action-btn"> <div class="action-btn">
<a-button @click="handleCreate" type="primary" style="margin-right: 0.3rem;">{{ btnName }}</a-button> <a-button @click="handleCreate" type="primary" style="margin-right: 0.3rem;">{{ btnName }}</a-button>
</div> </div>
</a-col>
<a-col :md="8" :sm="24">
<a-form-item label="应用列表">
<a-select placeholder="请选择" v-model="queryParam.app_id">
<a-select-option v-for="app in appList" :key="app.id" :label="app.name" :value="app.id">{{ app.name }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
</a-form>
<s-table <s-table
:alert="options.alert" :alert="options.alert"
@ -65,10 +53,6 @@
<template v-else>{{ text }}</template> <template v-else>{{ text }}</template>
</template> </template>
<span slot="app_id" slot-scope="text">
<template>{{ text }}</template>
</span>
<span slot="resource_type_id" slot-scope="text"> <span slot="resource_type_id" slot-scope="text">
<a-icon type="check" v-if="text"/> <a-icon type="check" v-if="text"/>
</span> </span>
@ -145,13 +129,6 @@ export default {
} }
} }
}, },
{
title: '应用',
dataIndex: 'app_id',
width: 50,
sorter: false,
scopedSlots: { customRender: 'app_id' }
},
{ {
title: '资源类型', title: '资源类型',
dataIndex: 'resource_type_id', dataIndex: 'resource_type_id',
@ -169,6 +146,7 @@ export default {
} }
], ],
loadData: parameter => { loadData: parameter => {
parameter.app_id = this.$store.state.app.name
parameter.page = parameter.pageNo parameter.page = parameter.pageNo
parameter.page_size = parameter.pageSize parameter.page_size = parameter.pageSize
delete parameter.pageNo delete parameter.pageNo
@ -214,10 +192,6 @@ export default {
this.form = this.$form.createForm(this) this.form = this.$form.createForm(this)
}, },
created () {
this.queryParam.app_id = this.appList[0].id
},
computed: { computed: {
formItemLayout () { formItemLayout () {
@ -243,7 +217,6 @@ export default {
}, },
mounted () { mounted () {
this.searchResources(this.queryParam)
this.setScrollY() this.setScrollY()
}, },
inject: ['reload'], inject: ['reload'],
@ -260,11 +233,6 @@ export default {
this.columnSearchText[column.dataIndex] = '' this.columnSearchText[column.dataIndex] = ''
this.queryParam[column.dataIndex] = '' this.queryParam[column.dataIndex] = ''
}, },
searchResources (params) {
searchResource(params).then(res => {
this.allResources = res.resources
})
},
setScrollY () { setScrollY () {
this.scroll.y = window.innerHeight - this.$refs.table.$el.offsetTop - 200 this.scroll.y = window.innerHeight - this.$refs.table.$el.offsetTop - 200

View File

@ -9,7 +9,7 @@
:alert="options.alert" :alert="options.alert"
:columns="columns" :columns="columns"
:data="loadData" :data="loadData"
:rowKey="record=>record.id" :rowKey="record=>record.uid"
:rowSelection="options.rowSelection" :rowSelection="options.rowSelection"
:scroll="scroll" :scroll="scroll"
:pagination="{ showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条记录`, pageSizeOptions: pageSizeOptions}" :pagination="{ showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条记录`, pageSizeOptions: pageSizeOptions}"
@ -123,7 +123,7 @@ export default {
title: '用户名', title: '用户名',
dataIndex: 'username', dataIndex: 'username',
sorter: false, sorter: false,
width: 250, width: 150,
scopedSlots: { scopedSlots: {
customRender: 'usernameSearchRender', customRender: 'usernameSearchRender',
filterDropdown: 'filterDropdown', filterDropdown: 'filterDropdown',
@ -142,7 +142,7 @@ export default {
title: '中文名', title: '中文名',
dataIndex: 'nickname', dataIndex: 'nickname',
sorter: false, sorter: false,
width: 250, width: 150,
scopedSlots: { scopedSlots: {
customRender: 'nicknameSearchRender', customRender: 'nicknameSearchRender',
filterDropdown: 'filterDropdown', filterDropdown: 'filterDropdown',
@ -160,7 +160,7 @@ export default {
{ {
title: '部门', title: '部门',
dataIndex: 'department', dataIndex: 'department',
width: 50, width: 200,
sorter: false, sorter: false,
scopedSlots: { customRender: 'department' } scopedSlots: { customRender: 'department' }
@ -169,7 +169,7 @@ export default {
title: '小组', title: '小组',
dataIndex: 'catalog', dataIndex: 'catalog',
sorter: false, sorter: false,
width: 50, width: 200,
scopedSlots: { customRender: 'catalog' } scopedSlots: { customRender: 'catalog' }
}, },
@ -177,7 +177,7 @@ export default {
title: '邮箱', title: '邮箱',
dataIndex: 'email', dataIndex: 'email',
sorter: false, sorter: false,
width: 50, width: 200,
scopedSlots: { customRender: 'email' } scopedSlots: { customRender: 'email' }
}, },
@ -185,7 +185,7 @@ export default {
title: '手机', title: '手机',
dataIndex: 'mobile', dataIndex: 'mobile',
sorter: false, sorter: false,
width: 50, width: 200,
scopedSlots: { customRender: 'mobile' } scopedSlots: { customRender: 'mobile' }
}, },
@ -193,7 +193,7 @@ export default {
title: '锁定', title: '锁定',
dataIndex: 'block', dataIndex: 'block',
sorter: false, sorter: false,
width: 50, width: 100,
scopedSlots: { customRender: 'block' } scopedSlots: { customRender: 'block' }
}, },
@ -203,6 +203,13 @@ export default {
sorter: false, sorter: false,
scopedSlots: { customRender: 'date_joined' } scopedSlots: { customRender: 'date_joined' }
},
{
title: '操作',
dataIndex: 'action',
width: 100,
fixed: 'right',
scopedSlots: { customRender: 'action' }
} }
], ],
loadData: parameter => { loadData: parameter => {
@ -276,7 +283,6 @@ export default {
}, },
mounted () { mounted () {
this.searchUsers()
this.setScrollY() this.setScrollY()
}, },
inject: ['reload'], inject: ['reload'],
@ -293,11 +299,6 @@ export default {
this.columnSearchText[column.dataIndex] = '' this.columnSearchText[column.dataIndex] = ''
this.queryParam[column.dataIndex] = '' this.queryParam[column.dataIndex] = ''
}, },
searchUsers () {
searchUser().then(res => {
this.allUsers = res.users
})
},
setScrollY () { setScrollY () {
this.scroll.y = window.innerHeight - this.$refs.table.$el.offsetTop - 200 this.scroll.y = window.innerHeight - this.$refs.table.$el.offsetTop - 200
@ -307,7 +308,7 @@ export default {
this.$refs.userForm.handleEdit(record) this.$refs.userForm.handleEdit(record)
}, },
handleDelete (record) { handleDelete (record) {
this.deleteUserById(record.id) this.deleteUser(record.uid)
}, },
handleOk () { handleOk () {
this.$refs.table.refresh() this.$refs.table.refresh()