提交 dd00816e authored 作者: 王鹏飞's avatar 王鹏飞

chore: 支持资源管理系统

上级 be8f6c06
...@@ -41,3 +41,8 @@ export function getPermissions(params) { ...@@ -41,3 +41,8 @@ export function getPermissions(params) {
export function getAllProjects(params) { export function getAllProjects(params) {
return httpRequest.get('/api/xedu/admin/v2/project/all', { params }) return httpRequest.get('/api/xedu/admin/v2/project/all', { params })
} }
// 搜索紫荆用户
export function userSearch(params) {
return httpRequest.get('/api/permissions/admin/v1/system/search-sso-users', { params })
}
<template>
<div class="user-autocomplete">
<el-select v-model="searchType" style="width: 120px">
<el-option label="用户名" value="username"></el-option>
<el-option label="手机号" value="mobile"></el-option>
<el-option label="邮箱" value="email"></el-option>
<el-option label="昵称" value="nickname"></el-option>
</el-select>
<el-select
placeholder="搜索"
filterable
remote
style="width: 100%"
:remote-method="fetchUserList"
:loading="loading"
@change="handleChange"
clearable
v-bind="$attrs"
v-on="$listeners"
>
<el-option :label="user.realname || user.nickname" :value="user.id" v-for="user in userList" :key="user.id">
<div style="display: flex">
<span>
{{ user.realname || user.nickname }}
<template v-if="user.mobile">(手机号:{{ user.mobile }})</template>
</span>
<span class="t1" v-if="user.email">邮箱:{{ user.email }}</span>
<span class="t1" v-else>ID:{{ user.id }}</span>
</div>
</el-option>
</el-select>
</div>
</template>
<script>
import { userSearch } from '@/api/base'
export default {
data() {
return {
searchType: 'nickname',
userList: [],
loading: false
}
},
methods: {
fetchUserList(searchValue) {
const params = {}
params[this.searchType] = searchValue
this.loading = true
userSearch(params)
.then(response => {
this.userList = response.data.items
})
.finally(() => {
this.loading = false
})
},
handleChange(userId) {
const user = this.userList.find(user => user.id === userId)
this.$emit('change', userId, user)
}
}
}
</script>
<style lang="scss">
.user-autocomplete {
display: flex;
.el-select + .el-select {
margin-left: 10px;
}
.t1 {
color: #8492a6;
font-size: 13px;
margin: 0 20px 0 10px;
}
}
</style>
<template>
<el-dialog v-bind="$attrs" v-on="$listeners" append-to-body title="选择成员" width="60%">
<app-list v-bind="tableOptions" ref="list" @select="select" @selection-change="handleSelectionChange"></app-list>
<div class="dialog-footer">
<el-button @click="handleCancel">取 消</el-button>
<el-button type="primary" @click="handlePrimary">确 定</el-button>
</div>
</el-dialog>
</template>
<script>
import { getUserList } from '@/api/base.js'
export default {
props: { multiple: { type: Boolean, default: true }, role_id: { type: String } },
data() {
return {
dialogVisible: false,
multipleSelection: [], // 选择的数据
selected: [] // 确定选中的
}
},
computed: {
// 列表配置
tableOptions() {
return {
remote: {
httpRequest: getUserList,
params: { role_id: this.role_id }
},
columns: [
{ type: 'selection' },
{ label: '姓名', prop: 'sso_user.realname' },
{ label: '昵称', prop: 'sso_user.nickname' },
{ label: '手机号', prop: 'sso_user.mobile' },
{ label: '邮箱', prop: 'sso_user.email' }
]
}
}
},
methods: {
// 选择
select(selection, row) {
if (!this.multiple && selection.length > 1) {
const selected = !!selection.find(item => item.id === row.id)
this.$refs.list.table.clearSelection()
this.$nextTick(function () {
this.$refs.list.table.toggleRowSelection(row, selected)
})
}
},
// 选择
handleSelectionChange(value) {
this.multipleSelection = value
},
// 取消
handleCancel() {
this.$emit('update:visible', false)
},
// 确定
handlePrimary() {
this.$emit('primary', this.multipleSelection)
}
}
}
</script>
<style lang="scss" scoped>
.dialog-footer {
position: sticky;
bottom: 0;
text-align: center;
z-index: 118;
padding: 20px 0;
border-top: 0.5px solid rgba(0, 0, 0, 0.05);
background-color: rgba(255, 255, 255, 0.95);
}
</style>
...@@ -4,40 +4,40 @@ import httpRequest from '@/utils/axios' ...@@ -4,40 +4,40 @@ import httpRequest from '@/utils/axios'
* 获取权限列表 * 获取权限列表
*/ */
export function getPermissionList(params) { export function getPermissionList(params) {
return httpRequest.get('/api/xedu/admin/v2/permissions', { params }) return httpRequest.get('/api/xedu/admin/v3/permissions', { params })
} }
/** /**
* 获取权限详情 * 获取权限详情
*/ */
export function getPermission(params) { export function getPermission(params) {
return httpRequest.get(`/api/xedu/admin/v2/permission/${params.id}`, { params }) return httpRequest.get(`/api/xedu/admin/v3/permission/${params.id}`, { params })
} }
/** /**
* 创建权限 * 创建权限
*/ */
export function createPermission(data) { export function createPermission(data) {
return httpRequest.post('/api/xedu/admin/v2/permission', data) return httpRequest.post('/api/xedu/admin/v3/permission', data)
} }
/** /**
* 修改权限 * 修改权限
*/ */
export function updatePermission(data) { export function updatePermission(data) {
return httpRequest.put(`/api/xedu/admin/v2/permission/${data.id}`, data) return httpRequest.put(`/api/xedu/admin/v3/permission/${data.id}`, data)
} }
/** /**
* 删除权限 * 删除权限
*/ */
export function deletePermission(data) { export function deletePermission(data) {
return httpRequest.delete(`/api/xedu/admin/v2/permission/${data.id}`, data) return httpRequest.delete(`/api/xedu/admin/v3/permission/${data.id}`, data)
} }
/** /**
* 复制权限 * 复制权限
*/ */
export function clonePermission(data) { export function clonePermission(data) {
return httpRequest.post('/api/xedu/admin/v2/permission/copy', data) return httpRequest.post('/api/xedu/admin/v3/permission/copy', data)
} }
...@@ -14,9 +14,7 @@ ...@@ -14,9 +14,7 @@
</el-form-item> </el-form-item>
<el-form-item label="所属系统" prop="system_tags"> <el-form-item label="所属系统" prop="system_tags">
<el-checkbox-group v-model="form.system_tags"> <el-checkbox-group v-model="form.system_tags">
<el-checkbox :label="1">学校端</el-checkbox> <el-checkbox v-for="item in systemList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox>
<!-- <el-checkbox :label="2">教师端</el-checkbox> -->
<el-checkbox :label="3">学生端</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
</el-form> </el-form>
...@@ -28,11 +26,12 @@ ...@@ -28,11 +26,12 @@
</template> </template>
<script> <script>
// lodash
import { clonePermission } from '../api.js' import { clonePermission } from '../api.js'
import { systemList } from '@/utils/dictionary.js'
export default { export default {
data() { data() {
return { return {
systemList,
form: { form: {
current_project_id: this.$store.state.activeProject.id, current_project_id: this.$store.state.activeProject.id,
select_project_id: '', select_project_id: '',
......
...@@ -15,9 +15,7 @@ ...@@ -15,9 +15,7 @@
</el-form-item> </el-form-item>
<el-form-item label="所属系统" prop="system_tag"> <el-form-item label="所属系统" prop="system_tag">
<el-radio-group v-model="form.system_tag" :disabled="isEdit"> <el-radio-group v-model="form.system_tag" :disabled="isEdit">
<el-radio :label="1">学校端</el-radio> <el-radio v-for="item in systemList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>
<!-- <el-radio :label="2">教师端</el-radio> -->
<el-radio :label="3">学生端</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="路由" prop="effect_uris"> <el-form-item label="路由" prop="effect_uris">
...@@ -38,6 +36,7 @@ ...@@ -38,6 +36,7 @@
// lodash // lodash
import { createPermission, updatePermission } from '../api.js' import { createPermission, updatePermission } from '../api.js'
import { pick } from 'lodash' import { pick } from 'lodash'
import { systemList } from '@/utils/dictionary.js'
export default { export default {
props: { props: {
isEdit: { type: Boolean, default: false }, isEdit: { type: Boolean, default: false },
...@@ -45,6 +44,7 @@ export default { ...@@ -45,6 +44,7 @@ export default {
}, },
data() { data() {
return { return {
systemList,
form: { parent_id: '0', type: 1, name: '', tag: '', system_tag: '', desc: '', effect_uris: '' }, form: { parent_id: '0', type: 1, name: '', tag: '', system_tag: '', desc: '', effect_uris: '' },
rules: { rules: {
name: [{ required: true, message: '请输入权限名称', trigger: 'blur' }], name: [{ required: true, message: '请输入权限名称', trigger: 'blur' }],
......
...@@ -6,12 +6,7 @@ ...@@ -6,12 +6,7 @@
<el-button type="warning" @click="cloneVisible = true">复制权限</el-button> <el-button type="warning" @click="cloneVisible = true">复制权限</el-button>
</template> </template>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane <el-tab-pane :label="item.label" :name="item.value" v-for="(item, index) in typeList" :key="index"></el-tab-pane>
:label="item.label"
:name="item.value"
v-for="(item, index) in typeList"
:key="index"
></el-tab-pane>
</el-tabs> </el-tabs>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<el-button type="text" @click="handleCreate(row)">创建子权限</el-button><br /> <el-button type="text" @click="handleCreate(row)">创建子权限</el-button><br />
...@@ -19,13 +14,7 @@ ...@@ -19,13 +14,7 @@
<el-button type="text" @click="onRemove(row)">删除</el-button> <el-button type="text" @click="onRemove(row)">删除</el-button>
</template> </template>
</app-list> </app-list>
<editform <editform :visible.sync="visible" :isEdit="isEdit" :data="editRaw" @success="handleSuccess" v-if="visible"></editform>
:visible.sync="visible"
:isEdit="isEdit"
:data="editRaw"
@success="handleSuccess"
v-if="visible"
></editform>
<ClonePermissions :visible.sync="cloneVisible" @success="handleSuccess" v-if="cloneVisible"></ClonePermissions> <ClonePermissions :visible.sync="cloneVisible" @success="handleSuccess" v-if="cloneVisible"></ClonePermissions>
</app-card> </app-card>
</template> </template>
...@@ -33,6 +22,7 @@ ...@@ -33,6 +22,7 @@
<script> <script>
// 接口 // 接口
import { getPermissionList, deletePermission } from '../api' import { getPermissionList, deletePermission } from '../api'
import { system, systemList } from '@/utils/dictionary.js'
export default { export default {
components: { components: {
...@@ -73,11 +63,7 @@ export default { ...@@ -73,11 +63,7 @@ export default {
type: 'select', type: 'select',
prop: 'system_tag', prop: 'system_tag',
placeholder: '所属系统', placeholder: '所属系统',
options: [ options: systemList
{ label: '学校端', value: '1' },
// { label: '教师端', value: '2' },
{ label: '学生端', value: '3' }
]
} }
], ],
columns: [ columns: [
...@@ -87,8 +73,7 @@ export default { ...@@ -87,8 +73,7 @@ export default {
label: '所属系统', label: '所属系统',
prop: 'system_tag', prop: 'system_tag',
computed({ row }) { computed({ row }) {
const map = { 1: '学校端', 2: '教师端', 3: '学生端' } return system[row.system_tag] || row.system_tag
return map[row.system_tag] || row.system_tag
} }
}, },
{ {
......
...@@ -40,3 +40,10 @@ export function updateProjectStatus(data) { ...@@ -40,3 +40,10 @@ export function updateProjectStatus(data) {
export function deleteProject(data) { export function deleteProject(data) {
return httpRequest.delete(`/api/xedu/admin/v2/${data.id}/project`, data) return httpRequest.delete(`/api/xedu/admin/v2/${data.id}/project`, data)
} }
/**
* 初始化机构用户角色
*/
export function initUserRole(data) {
return httpRequest.post('/api/xedu/admin/v3/role/init-user-role', data)
}
...@@ -8,33 +8,21 @@ ...@@ -8,33 +8,21 @@
<el-tag>{{ row.role_name }}</el-tag> <el-tag>{{ row.role_name }}</el-tag>
</template> </template>
<template v-slot:table-status="{ row }"> <template v-slot:table-status="{ row }">
<el-switch <el-switch v-model="row.status" :active-value="1" :inactive-value="2" active-text="启用" inactive-text="停用" @change="handleStatus(row)"></el-switch>
v-model="row.status"
:active-value="1"
:inactive-value="2"
active-text="启用"
inactive-text="停用"
@change="handleStatus(row)"
></el-switch>
</template> </template>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<el-button type="primary" plain @click="handleUpdate(row)">编辑</el-button> <el-button type="primary" plain @click="handleUpdate(row)">编辑</el-button>
<el-button type="info" plain @click="handleInitUserRole(row)">初始化用户角色</el-button>
</template> </template>
</app-list> </app-list>
<!-- 创建/编辑 --> <!-- 创建/编辑 -->
<editform <editform :visible.sync="visible" :isEdit="isEdit" :data="editRaw" @success="handleSuccess" v-if="visible"></editform>
:visible.sync="visible"
:isEdit="isEdit"
:data="editRaw"
@success="handleSuccess"
v-if="visible"
></editform>
</app-card> </app-card>
</template> </template>
<script> <script>
// 接口 // 接口
import { getProjectList, deleteProject, updateProjectStatus } from '../api' import { getProjectList, deleteProject, updateProjectStatus, initUserRole } from '../api'
export default { export default {
components: { components: {
...@@ -85,7 +73,7 @@ export default { ...@@ -85,7 +73,7 @@ export default {
}, },
{ label: '创建时间', prop: 'created_at' }, { label: '创建时间', prop: 'created_at' },
{ label: '状态', prop: 'status', slots: 'table-status' }, { label: '状态', prop: 'status', slots: 'table-status' },
{ label: '操作', slots: 'table-x', align: 'right', width: '80', fixed: 'right' } { label: '操作', slots: 'table-x', align: 'right', width: '220', fixed: 'right' }
] ]
} }
} }
...@@ -129,6 +117,12 @@ export default { ...@@ -129,6 +117,12 @@ export default {
updateProjectStatus({ id: row.id, status: row.status }).then(res => { updateProjectStatus({ id: row.id, status: row.status }).then(res => {
this.$message({ type: 'success', message: '修改成功' }) this.$message({ type: 'success', message: '修改成功' })
}) })
},
// 初始化用户角色
handleInitUserRole(row) {
initUserRole({ project_id: row.id }).then(res => {
this.$message({ type: 'success', message: '初始化角色成功' })
})
} }
} }
} }
......
...@@ -4,54 +4,54 @@ import httpRequest from '@/utils/axios' ...@@ -4,54 +4,54 @@ import httpRequest from '@/utils/axios'
* 获取角色列表 * 获取角色列表
*/ */
export function getRoleList(params) { export function getRoleList(params) {
return httpRequest.get('/api/xedu/admin/v2/roles', { params }) return httpRequest.get('/api/xedu/admin/v3/roles', { params })
} }
/** /**
* 获取角色详情 * 获取角色详情
*/ */
export function getRole(params) { export function getRole(params) {
return httpRequest.get(`/api/xedu/admin/v2/role/${params.id}`, { params }) return httpRequest.get(`/api/xedu/admin/v3/role/${params.id}`, { params })
} }
/** /**
* 创建角色 * 创建角色
*/ */
export function createRole(data) { export function createRole(data) {
return httpRequest.post('/api/xedu/admin/v2/role', data) return httpRequest.post('/api/xedu/admin/v3/role', data)
} }
/** /**
* 修改角色 * 修改角色
*/ */
export function updateRole(data) { export function updateRole(data) {
return httpRequest.put(`/api/xedu/admin/v2/role/${data.id}`, data) return httpRequest.put(`/api/xedu/admin/v3/role/${data.id}`, data)
} }
/** /**
* 删除角色 * 删除角色
*/ */
export function deleteRole(data) { export function deleteRole(data) {
return httpRequest.delete(`/api/xedu/admin/v2/role/${data.id}`, data) return httpRequest.delete(`/api/xedu/admin/v3/role/${data.id}`, data)
} }
/** /**
* 获取权限列表 * 获取权限列表
*/ */
export function getPermissionList(params) { export function getPermissionList(params) {
return httpRequest.get('/api/xedu/admin/v2/permissions', { params }) return httpRequest.get('/api/xedu/admin/v3/permissions', { params })
} }
/** /**
* 获取角色所有权限 * 获取角色所有权限
*/ */
export function getRolePermissions(params) { export function getRolePermissions(params) {
return httpRequest.get(`/api/xedu/admin/v2/assign/${params.role_id}/permissions`, { params }) return httpRequest.get(`/api/xedu/admin/v3/assign/${params.role_id}/permissions`, { params })
} }
/** /**
* 更新角色权限 * 更新角色权限
*/ */
export function updateRolePermissions(data) { export function updateRolePermissions(data) {
return httpRequest.post('/api/xedu/admin/v2/assign/permissions-to-role', data) return httpRequest.post('/api/xedu/admin/v3/assign/permissions-to-role', data)
} }
/** /**
* 获取课程列表 * 获取课程列表
......
<template> <template>
<el-dialog :title="title" :close-on-click-modal="false" v-bind="$attrs" v-on="$listeners" width="500px"> <el-dialog :title="title" :close-on-click-modal="false" v-bind="$attrs" v-on="$listeners" width="500px">
<el-form ref="form" :model="form" :rules="rules" label-position="top"> <el-form ref="form" :model="form" :rules="rules" label-position="top">
<el-form-item label="角色用途" prop="purpose">
<el-radio-group v-model="form.purpose">
<el-radio v-for="item in roleTypeList" :label="item.value" :key="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="角色名称" prop="name"> <el-form-item label="角色名称" prop="name">
<el-input v-model="form.name" clearable></el-input> <el-input v-model="form.name" clearable></el-input>
</el-form-item> </el-form-item>
...@@ -18,6 +25,8 @@ ...@@ -18,6 +25,8 @@
<script> <script>
import { createRole, updateRole } from '../api.js' import { createRole, updateRole } from '../api.js'
import { pick } from 'lodash' import { pick } from 'lodash'
import { roleTypeList } from '@/utils/dictionary.js'
export default { export default {
props: { props: {
isEdit: { type: Boolean, default: false }, isEdit: { type: Boolean, default: false },
...@@ -25,8 +34,10 @@ export default { ...@@ -25,8 +34,10 @@ export default {
}, },
data() { data() {
return { return {
form: { name: '', tag: '', desc: '' }, roleTypeList,
form: { name: '', purpose: '', desc: '' },
rules: { rules: {
purpose: [{ required: true, message: '请选择角色用途', trigger: 'change' }],
name: [{ required: true, message: '请输入角色名称', trigger: 'blur' }], name: [{ required: true, message: '请输入角色名称', trigger: 'blur' }],
desc: [{ required: true, message: '请输入角色描述', trigger: 'blur' }] desc: [{ required: true, message: '请输入角色描述', trigger: 'blur' }]
} }
...@@ -53,7 +64,7 @@ export default { ...@@ -53,7 +64,7 @@ export default {
// 确定 // 确定
onPrimary() { onPrimary() {
this.$refs.form.validate().then(() => { this.$refs.form.validate().then(() => {
const params = pick(this.form, ['id', 'name', 'desc']) const params = pick(this.form, ['id', 'name', 'desc', 'purpose'])
this.isEdit ? this.edit(params) : this.create(params) this.isEdit ? this.edit(params) : this.create(params)
}) })
}, },
......
...@@ -15,9 +15,7 @@ ...@@ -15,9 +15,7 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="课程列表"> <el-form-item label="课程列表">
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"> <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"> 全选 </el-checkbox>
全选
</el-checkbox>
<el-checkbox-group v-model="form.course_ids"> <el-checkbox-group v-model="form.course_ids">
<div v-for="item in courses" :key="item.id"> <div v-for="item in courses" :key="item.id">
<el-checkbox :label="item.id">{{ item.course_name }}</el-checkbox> <el-checkbox :label="item.id">{{ item.course_name }}</el-checkbox>
...@@ -34,11 +32,21 @@ ...@@ -34,11 +32,21 @@
<script> <script>
import { getPermissionList, getRolePermissions, updateRolePermissions, getCourseList } from '../api.js' import { getPermissionList, getRolePermissions, updateRolePermissions, getCourseList } from '../api.js'
import { systemList } from '@/utils/dictionary.js'
export default { export default {
props: { props: {
data: { type: Object, default: () => ({}) } data: { type: Object, default: () => ({}) }
}, },
data() { data() {
const options = systemList.map(item => {
return {
system_tag: item.value,
name: item.label,
permissions: [],
value: []
}
})
return { return {
loading: true, loading: true,
form: { form: {
...@@ -51,11 +59,7 @@ export default { ...@@ -51,11 +59,7 @@ export default {
permissions: [], // 所有权限 permissions: [], // 所有权限
defaultProps: { label: 'name', value: 'id', multiple: true, expandTrigger: 'hover', emitPath: false }, defaultProps: { label: 'name', value: 'id', multiple: true, expandTrigger: 'hover', emitPath: false },
submitLoading: false, submitLoading: false,
options: [ options,
{ name: '学校端', system_tag: 1, permissions: [], value: [] },
// { name: '教师端', system_tag: 2, permissions: [], value: [] },
{ name: '学生端', system_tag: 3, permissions: [], value: [] }
],
courses: [], // 所有课程 courses: [], // 所有课程
checkAll: false checkAll: false
} }
......
...@@ -11,13 +11,7 @@ ...@@ -11,13 +11,7 @@
</template> </template>
</app-list> </app-list>
<!-- 创建/编辑 --> <!-- 创建/编辑 -->
<editform <editform :visible.sync="visible" :isEdit="isEdit" :data="editRaw" @success="handleSuccess" v-if="visible"></editform>
:visible.sync="visible"
:isEdit="isEdit"
:data="editRaw"
@success="handleSuccess"
v-if="visible"
></editform>
<!-- 权限配置 --> <!-- 权限配置 -->
<permissions :visible.sync="permisssionVisible" :data="editRaw" v-if="permisssionVisible"></permissions> <permissions :visible.sync="permisssionVisible" :data="editRaw" v-if="permisssionVisible"></permissions>
</app-card> </app-card>
...@@ -26,6 +20,8 @@ ...@@ -26,6 +20,8 @@
<script> <script>
// 接口 // 接口
import { getRoleList, deleteRole } from '../api' import { getRoleList, deleteRole } from '../api'
import { roleType, roleTypeList } from '@/utils/dictionary.js'
export default { export default {
components: { components: {
Editform: () => import('../components/Editform.vue'), Editform: () => import('../components/Editform.vue'),
...@@ -45,12 +41,22 @@ export default { ...@@ -45,12 +41,22 @@ export default {
return { return {
remote: { remote: {
httpRequest: getRoleList, httpRequest: getRoleList,
params: { name: '', tag: '' } params: { name: '', purpose: '' }
}, },
filters: [{ type: 'input', prop: 'name', placeholder: '角色名称' }], filters: [
{ type: 'input', prop: 'name', placeholder: '角色名称' },
{ type: 'select', prop: 'purpose', placeholder: '角色用途', options: roleTypeList }
],
columns: [ columns: [
{ label: '角色名称', prop: 'name' }, { label: '角色名称', prop: 'name' },
{ label: '角色描述', prop: 'desc' }, { label: '角色描述', prop: 'desc' },
{
label: '角色用途',
prop: 'purpose',
computed({ row }) {
return roleType[row.purpose] || row.purpose
}
},
{ label: '创建时间', prop: 'created_at' }, { label: '创建时间', prop: 'created_at' },
{ label: '操作', slots: 'table-x', align: 'right', width: 240, fixed: 'right' } { label: '操作', slots: 'table-x', align: 'right', width: 240, fixed: 'right' }
] ]
......
...@@ -39,7 +39,7 @@ export function deleteOrg(data) { ...@@ -39,7 +39,7 @@ export function deleteOrg(data) {
* 获取角色列表 * 获取角色列表
*/ */
export function getRoleList(params) { export function getRoleList(params) {
return httpRequest.get('/api/xedu/admin/v2/roles', { params }) return httpRequest.get(`/api/xedu/admin/v3/role/all/${params.project_id}`, { params })
} }
/** /**
...@@ -48,3 +48,37 @@ export function getRoleList(params) { ...@@ -48,3 +48,37 @@ export function getRoleList(params) {
export function getAllOrgList(params) { export function getAllOrgList(params) {
return httpRequest.get(`/api/xedu/admin/v2/organization/children/${params.project_id}`, { params }) return httpRequest.get(`/api/xedu/admin/v2/organization/children/${params.project_id}`, { params })
} }
/**
*
* 用户Start
* */
/**
* 获取机构用户列表
*/
export function getOrgUserList(params) {
return httpRequest.get('/api/xedu/admin/v3/org/users', { params })
}
/**
* 创建机构用户
*/
export function createOrgUser(data) {
return httpRequest.post('/api/xedu/admin/v3/org/users', data)
}
/**
* 修改机构用户
*/
export function updateOrgUser(data) {
return httpRequest.put(`/api/xedu/admin/v3/org/user/${data.id}`, data)
}
/**
* 删除机构用户
*/
export function deleteOrgUser(data) {
return httpRequest.post('/api/xedu/admin/v3/org/user/batch-delete', data)
}
/**
*
* 用户End
* */
...@@ -24,13 +24,7 @@ ...@@ -24,13 +24,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="有效期" prop="validity_date"> <el-form-item label="有效期" prop="validity_date">
<el-date-picker <el-date-picker v-model="form.validity_date" type="date" value-format="yyyy-MM-dd" :picker-options="pickerOptions" placeholder="请选择该机构有效期" />
v-model="form.validity_date"
type="date"
value-format="yyyy-MM-dd"
:picker-options="pickerOptions"
placeholder="请选择该机构有效期"
/>
</el-form-item> </el-form-item>
<el-form-item label="二级机构" prop="children_ids"> <el-form-item label="二级机构" prop="children_ids">
<el-select v-model="form.children_ids" multiple clearable placeholder="请选择二级机构" style="width: 100%"> <el-select v-model="form.children_ids" multiple clearable placeholder="请选择二级机构" style="width: 100%">
...@@ -111,8 +105,8 @@ export default { ...@@ -111,8 +105,8 @@ export default {
methods: { methods: {
// 获取角色列表 // 获取角色列表
getRoleList() { getRoleList() {
getRoleList({ limit: 100 }).then(res => { getRoleList({ project_id: this.activeProject.id, purpose: 2 }).then(res => {
this.roleList = res.data.data this.roleList = res.data
}) })
}, },
// 获取所有机构列表 // 获取所有机构列表
...@@ -129,16 +123,7 @@ export default { ...@@ -129,16 +123,7 @@ export default {
// 确定 // 确定
onPrimary() { onPrimary() {
this.$refs.form.validate().then(() => { this.$refs.form.validate().then(() => {
const params = pick(this.form, [ const params = pick(this.form, ['id', 'login_mobile', 'name', 'contact_name', 'contact_information', 'role_id', 'validity_date', 'children_ids'])
'id',
'login_mobile',
'name',
'contact_name',
'contact_information',
'role_id',
'validity_date',
'children_ids'
])
this.isEdit ? this.edit(params) : this.create(params) this.isEdit ? this.edit(params) : this.create(params)
}) })
}, },
......
<template>
<el-dialog :title="title" :close-on-click-modal="false" v-bind="$attrs" v-on="$listeners" width="622px">
<el-form ref="form" :model="form" :rules="rules" label-position="top">
<el-form-item label="手机号" prop="mobile" v-if="!isEdit">
<el-input v-model="form.mobile"></el-input>
</el-form-item>
<el-form-item label="所属角色" prop="role_ids">
<el-transfer v-bind="transferOptions" v-model="form.role_ids" :data="roles"></el-transfer>
</el-form-item>
</el-form>
<template #footer>
<el-button type="text" @click="onCancel">取消</el-button>&nbsp;&nbsp;
<el-button type="primary" size="medium" @click="onPrimary">保存</el-button>
</template>
</el-dialog>
</template>
<script>
import { getRoleList, createOrgUser, updateOrgUser } from '../api.js'
export default {
props: {
isEdit: { type: Boolean, default: false },
data: { type: Object, default: () => ({}) }
},
data() {
return {
roles: [], // 角色列表
transferOptions: {
props: { key: 'id', label: 'name' },
titles: ['未选择', '已选择']
},
form: { organization_id: this.$route.query.id, mobile: '', role_ids: [] },
rules: {
mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }]
}
}
},
watch: {
data: {
immediate: true,
handler(data) {
this.form = Object.assign({}, this.form, data)
if (data && data.roles) {
this.form.role_ids = data.roles.map(item => item.id)
}
}
}
},
computed: {
activeProject() {
return this.$store.state.activeProject || {}
},
title() {
return this.isEdit ? '修改用户' : '添加用户'
}
},
beforeMount() {
this.getRoleList()
},
methods: {
getRoleList() {
getRoleList({ project_id: this.activeProject.id, purpose: 1 }).then(res => {
this.roles = res.data
})
},
// 取消
onCancel() {
this.$emit('update:visible', false)
},
// 确定
onPrimary() {
this.$refs.form.validate().then(() => {
this.isEdit ? this.edit() : this.create()
})
},
// 添加用户
create() {
const params = Object.assign({ project_id: this.activeProject.id }, this.form)
createOrgUser(params).then(res => {
this.$message.success('添加成功')
this.$emit('update:visible', false)
this.$emit('success', res.data)
})
},
// 编辑用户
edit() {
const params = Object.assign({}, this.form)
updateOrgUser(params).then(res => {
this.$message.success('修改成功')
this.$emit('update:visible', false)
this.$emit('success', res.data)
})
}
}
}
</script>
<style></style>
<template>
<app-card title="机构用户">
<app-list v-bind="tableOptions" ref="list" @selection-change="handleSelectionChange">
<template #header-aside>
<el-button type="primary" icon="el-icon-plus" @click="handleCreate">添加用户</el-button>
</template>
<template v-slot:table-roles="{ row }">
<el-tag v-for="item in row.roles" :key="item.id" style="margin: 0 5px 5px 0">{{ item.name }}</el-tag>
</template>
<template v-slot:table-x="{ row }"> <el-button type="primary" plain @click="handleUpdate(row)">编辑</el-button>&nbsp; </template>
<template #footer>
<el-button type="primary" @click="onRemove" :disabled="!multipleSelection.length">删除</el-button>
</template>
</app-list>
<!-- 创建/编辑 -->
<editform :visible.sync="visible" :isEdit="isEdit" :data="editRaw" @success="handleSuccess" v-if="visible"></editform>
</app-card>
</template>
<script>
import { getOrgUserList, deleteOrgUser } from '../api'
export default {
components: {
Editform: () => import('../components/UserEditform.vue')
},
data() {
return {
visible: false,
isEdit: false, // 是否是编辑状态
editRaw: {}, // 编辑的数据
multipleSelection: [] // 已选择的数据
}
},
computed: {
tableOptions() {
return {
remote: {
httpRequest: getOrgUserList,
params: { organization_id: this.$route.query.id }
},
columns: [
{ type: 'selection' },
{ label: 'ID', prop: 'id' },
{
label: '用户名',
prop: 'sso_user.realname',
computed({ row }) {
return row.sso_user.realname || row.sso_user.nickname || row.sso_user.username
}
},
{ label: '手机号', prop: 'sso_user.mobile' },
{ label: '角色', prop: 'roles', slots: 'table-roles' },
{ label: '操作', align: 'right', slots: 'table-x' }
]
}
}
},
methods: {
// 选择
handleSelectionChange(value) {
this.multipleSelection = value
},
// 创建成功刷新列表
handleSuccess() {
this.$refs.list.refetch()
},
// 创建
handleCreate() {
this.isEdit = false
this.editRaw = {}
this.visible = true
},
// 编辑
handleUpdate(row) {
this.isEdit = true
this.editRaw = row
this.visible = true
},
// 删除
onRemove() {
this.$confirm('用户删除请谨慎操作,确定删除?', '删除用户', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(this.handleRemove)
},
// 删除
handleRemove() {
const ids = this.multipleSelection.map(item => item.id)
deleteOrgUser({ ids }).then(res => {
this.$message({ type: 'success', message: '删除成功' })
this.$refs.list.refetch()
})
}
}
}
</script>
...@@ -21,13 +21,7 @@ ...@@ -21,13 +21,7 @@
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<!-- 编辑 --> <!-- 编辑 -->
<editform <editform :visible.sync="visible" :isEdit="true" :data="detail" @success="handleUpdateSuccess" v-if="visible"></editform>
:visible.sync="visible"
:isEdit="true"
:data="detail"
@success="handleUpdateSuccess"
v-if="visible"
></editform>
</app-card> </app-card>
<app-card title="二级机构"> <app-card title="二级机构">
<app-list v-bind="tableOptions" ref="list"> <app-list v-bind="tableOptions" ref="list">
...@@ -42,14 +36,16 @@ ...@@ -42,14 +36,16 @@
</template> </template>
</app-list> </app-list>
</app-card> </app-card>
<Users></Users>
</div> </div>
</template> </template>
<script> <script>
import { getOrg } from '../api.js' import { getOrg } from '../api.js'
import Users from '../components/Users.vue'
export default { export default {
components: { components: {
Users,
Editform: () => import('../components/Editform.vue') Editform: () => import('../components/Editform.vue')
}, },
data() { data() {
......
...@@ -20,13 +20,7 @@ ...@@ -20,13 +20,7 @@
</template> </template>
</app-list> </app-list>
<!-- 创建/编辑 --> <!-- 创建/编辑 -->
<editform <editform :visible.sync="visible" :isEdit="isEdit" :data="editRaw" @success="handleSuccess" v-if="visible"></editform>
:visible.sync="visible"
:isEdit="isEdit"
:data="editRaw"
@success="handleSuccess"
v-if="visible"
></editform>
</app-card> </app-card>
</template> </template>
...@@ -47,6 +41,9 @@ export default { ...@@ -47,6 +41,9 @@ export default {
} }
}, },
computed: { computed: {
activeProject() {
return this.$store.state.activeProject || {}
},
// 列表配置 // 列表配置
tableOptions() { tableOptions() {
return { return {
...@@ -119,8 +116,8 @@ export default { ...@@ -119,8 +116,8 @@ export default {
}, },
methods: { methods: {
getRoleList() { getRoleList() {
getRoleList({ limit: 100 }).then(res => { getRoleList({ project_id: this.activeProject.id }).then(res => {
this.roleList = res.data.data this.roleList = res.data
}) })
}, },
// 创建成功刷新列表 // 创建成功刷新列表
......
// json to array
export const json2Array = function (data) {
return Object.keys(data).map(value => ({ label: data[value], value: parseInt(value) }))
}
// 角色用途 // 角色用途
export const roleType = { export const roleType = {
1: '用户使用', 1: '用户使用',
2: '机构使用' 2: '机构使用'
} }
// 角色用途列表
export const roleTypeList = json2Array(roleType)
// 所属系统
export const system = {
1: '学校端',
// 2: '教师端',
3: '学生端',
4: '资源管理系统'
}
// 所属系统列表
export const systemList = json2Array(system)
// 角色用途
export const permissionType = {
1: '菜单',
2: '按钮'
// 3: '功能'
}
// 角色用途列表
export const permissionTypeList = json2Array(roleType)
...@@ -7,12 +7,7 @@ import checker from 'vite-plugin-checker' ...@@ -7,12 +7,7 @@ import checker from 'vite-plugin-checker'
export default defineConfig(({ mode }) => { export default defineConfig(({ mode }) => {
return { return {
base: mode === 'prod' ? 'https://webapp-pub.ezijing.com/website/prod/x-school-admin/' : '/', base: mode === 'prod' ? 'https://webapp-pub.ezijing.com/website/prod/x-school-admin/' : '/',
plugins: [ plugins: [createVuePlugin(), checker({ eslint: { lintCommand: 'eslint "./src/**/*.{vue,js,jsx,ts,tsx}"' } })],
checker({
eslint: { lintCommand: 'eslint "./src/**/*.{vue,js,jsx,ts,tsx}"' }
}),
createVuePlugin()
],
server: { server: {
open: true, open: true,
host: 'dev.ezijing.com', host: 'dev.ezijing.com',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论