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

feat: 机构管理

上级 cb1d1aba
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<div class="table-list-hd"> <div class="table-list-hd">
<!-- 筛选 --> <!-- 筛选 -->
<div class="table-list-filter" v-if="filters.length"> <div class="table-list-filter" v-if="filters.length">
<el-form :inline="true" :model="params" ref="filterForm"> <el-form :inline="true" :model="params" ref="filterForm" @submit.native.prevent>
<template v-for="item in filters"> <template v-for="item in filters">
<el-form-item :label="item.label" :prop="item.prop" :key="item.prop"> <el-form-item :label="item.label" :prop="item.prop" :key="item.prop">
<template v-if="item.slots"> <template v-if="item.slots">
...@@ -11,7 +11,13 @@ ...@@ -11,7 +11,13 @@
</template> </template>
<template v-else> <template v-else>
<!-- input --> <!-- input -->
<el-input v-model="params[item.prop]" v-bind="item" clearable v-if="item.type === 'input'" /> <el-input
v-model="params[item.prop]"
v-bind="item"
clearable
v-if="item.type === 'input'"
@keyup.native.enter="search"
/>
<!-- select --> <!-- select -->
<el-select <el-select
v-model="params[item.prop]" v-model="params[item.prop]"
......
...@@ -5,9 +5,9 @@ ...@@ -5,9 +5,9 @@
<el-button type="primary" icon="el-icon-plus" @click="handleCreate">添加角色</el-button> <el-button type="primary" icon="el-icon-plus" @click="handleCreate">添加角色</el-button>
</template> </template>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<el-button type="text" @click="handleUpdate(row)">修改</el-button> <el-button type="primary" @click="handleUpdate(row)">修改</el-button>
<el-button type="text" @click="onRemove(row)">删除</el-button> <el-button type="danger" @click="onRemove(row)">删除</el-button>
<el-button type="text" @click="handlePermission(row)">权限配置</el-button>&nbsp; <el-button type="info" @click="handlePermission(row)">权限配置</el-button>&nbsp;
</template> </template>
</app-list> </app-list>
<!-- 创建/编辑 --> <!-- 创建/编辑 -->
...@@ -52,7 +52,7 @@ export default { ...@@ -52,7 +52,7 @@ export default {
{ label: '角色名称', prop: 'name' }, { label: '角色名称', prop: 'name' },
{ label: '角色描述', prop: 'desc' }, { label: '角色描述', prop: 'desc' },
{ label: '创建时间', prop: 'created_at' }, { label: '创建时间', prop: 'created_at' },
{ label: '操作', slots: 'table-x', align: 'right', width: 200, fixed: 'right' } { label: '操作', slots: 'table-x', align: 'right', width: 240, fixed: 'right' }
] ]
} }
} }
......
...@@ -4,7 +4,7 @@ import httpRequest from '@/utils/axios' ...@@ -4,7 +4,7 @@ import httpRequest from '@/utils/axios'
* 获取机构列表 * 获取机构列表
*/ */
export function getOrgList(params) { export function getOrgList(params) {
return httpRequest.get('/api/xedu/admin/v1/organization', { params }) return httpRequest.get('/api/xedu/admin/v1/organizations', { params })
} }
/** /**
...@@ -34,3 +34,10 @@ export function updateOrg(data) { ...@@ -34,3 +34,10 @@ export function updateOrg(data) {
export function deleteOrg(data) { export function deleteOrg(data) {
return httpRequest.delete(`/api/xedu/admin/v1/organization/${data.id}`, data) return httpRequest.delete(`/api/xedu/admin/v1/organization/${data.id}`, data)
} }
/**
* 获取角色列表
*/
export function getRoleList(params) {
return httpRequest.get('/api/xedu/admin/v1/roles', { params })
}
<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="account"> <el-form-item label="登录手机号" prop="login_mobile">
<el-input v-model="form.account" clearable placeholder="请输入登录手机号" /> <el-input v-model="form.login_mobile" clearable placeholder="请输入登录手机号" />
</el-form-item> </el-form-item>
<el-form-item label="机构名称" prop="name"> <el-form-item label="机构名称" prop="name">
<el-input v-model="form.name" clearable placeholder="请输入机构名称" /> <el-input v-model="form.name" clearable placeholder="请输入机构名称" />
...@@ -20,13 +20,14 @@ ...@@ -20,13 +20,14 @@
</el-form-item> </el-form-item>
<el-form-item label="机构角色" prop="role_id"> <el-form-item label="机构角色" prop="role_id">
<el-select v-model="form.role_id" clearable placeholder="请选择机构角色" style="width: 100%"> <el-select v-model="form.role_id" clearable placeholder="请选择机构角色" style="width: 100%">
<el-option v-for="item in contentPermission" :label="item.label" :value="item.value" :key="item.value" /> <el-option v-for="item in roleList" :label="item.name" :value="item.id" :key="item.id" />
</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" v-model="form.validity_date"
type="date" type="date"
value-format="yyyy-MM-dd"
:picker-options="pickerOptions" :picker-options="pickerOptions"
placeholder="请选择该机构有效期" placeholder="请选择该机构有效期"
/> />
...@@ -40,7 +41,7 @@ ...@@ -40,7 +41,7 @@
</template> </template>
<script> <script>
import { createOrg, updateOrg } from '../api.js' import { createOrg, updateOrg, getRoleList } from '../api.js'
export default { export default {
props: { props: {
isEdit: { type: Boolean, default: false }, isEdit: { type: Boolean, default: false },
...@@ -49,7 +50,7 @@ export default { ...@@ -49,7 +50,7 @@ export default {
data() { data() {
return { return {
form: { form: {
account: '', login_mobile: '',
name: '', name: '',
contact_name: '', contact_name: '',
contact_information: '', contact_information: '',
...@@ -58,7 +59,7 @@ export default { ...@@ -58,7 +59,7 @@ export default {
validity_date: '' validity_date: ''
}, },
rules: { rules: {
account: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入登录手机号', trigger: 'blur' }], login_mobile: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入登录手机号', trigger: 'blur' }],
name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }], name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
contact_name: [{ required: true, message: '请输入联系人', trigger: 'blur' }], contact_name: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
contact_information: [{ required: true, message: '请输入联系方式', trigger: 'blur' }], contact_information: [{ required: true, message: '请输入联系方式', trigger: 'blur' }],
...@@ -66,14 +67,15 @@ export default { ...@@ -66,14 +67,15 @@ export default {
role_id: [{ required: true, message: '请选择机构角色', trigger: 'change' }] role_id: [{ required: true, message: '请选择机构角色', trigger: 'change' }]
}, },
contentPermission: [ contentPermission: [
{ label: '免费内容', value: '1' }, { label: '付费内容', value: 1 },
{ label: '付费内容', value: '2' } { label: '免费内容', value: 2 }
], ],
pickerOptions: { pickerOptions: {
disabledDate(time) { disabledDate(time) {
return time.getTime() < Date.now() return time.getTime() < Date.now()
} }
} },
roleList: [] // 角色列表
} }
}, },
watch: { watch: {
...@@ -89,7 +91,15 @@ export default { ...@@ -89,7 +91,15 @@ export default {
return this.isEdit ? '编辑机构' : '添加机构' return this.isEdit ? '编辑机构' : '添加机构'
} }
}, },
beforeMount() {
this.getRoleList()
},
methods: { methods: {
getRoleList() {
getRoleList({ limit: 100 }).then(res => {
this.roleList = res.data.data
})
},
// 取消 // 取消
onCancel() { onCancel() {
this.$emit('update:visible', false) this.$emit('update:visible', false)
......
<template> <template>
<app-card title="机构信息"> <app-card :title="detail.name">
<template #header-aside> <template #header-aside>
<el-button type="primary" @click="visible = true">编辑</el-button> <el-button type="primary" @click="visible = true">编辑</el-button>
</template> </template>
<el-descriptions :title="detail.name" :column="1"> <el-descriptions :column="1" size="medium">
<!-- <el-descriptions-item label="机构名称">{{ detail.name }}</el-descriptions-item> --> <!-- <el-descriptions-item label="机构名称">{{ detail.name }}</el-descriptions-item> -->
<el-descriptions-item label="联系人">{{ detail.contact_name }}</el-descriptions-item> <el-descriptions-item label="联系人">{{ detail.contact_name }}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{ detail.contact_information }}</el-descriptions-item> <el-descriptions-item label="联系方式">{{ detail.contact_information }}</el-descriptions-item>
<el-descriptions-item label="机构内容权限"> <el-descriptions-item label="机构内容权限">
<el-tag size="small">{{ detail.content_permissions }}</el-tag> <el-tag>{{ contentPermissionName(detail.content_permissions) }}</el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="机构角色"> <el-descriptions-item label="机构角色">
<el-tag size="small">{{ detail.role_id }}</el-tag> <el-tag>{{ detail.role_name }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="有效期"
>{{ detail.validity_date }}
<el-tag v-if="detail.is_valid">未过期</el-tag>
<el-tag type="danger" v-else>已过期</el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="有效期">{{ detail.validity_date }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<!-- 编辑 --> <!-- 编辑 -->
<editform <editform
...@@ -30,6 +34,9 @@ ...@@ -30,6 +34,9 @@
import { getOrg } from '../api.js' import { getOrg } from '../api.js'
export default { export default {
components: {
Editform: () => import('../components/Editform.vue')
},
data() { data() {
return { return {
visible: false, visible: false,
...@@ -38,7 +45,7 @@ export default { ...@@ -38,7 +45,7 @@ export default {
}, },
computed: { computed: {
id() { id() {
return this.$route.params.id return this.$route.query.id
} }
}, },
beforeMount() { beforeMount() {
...@@ -46,13 +53,17 @@ export default { ...@@ -46,13 +53,17 @@ export default {
}, },
methods: { methods: {
getDetail() { getDetail() {
getOrg(this.id).then(res => { getOrg({ id: this.id }).then(res => {
this.detail = res.data this.detail = res.data
}) })
}, },
// 更新成功 // 更新成功
handleUpdateSuccess(data) { handleUpdateSuccess(data) {
this.getDetail() this.getDetail()
},
contentPermissionName(value) {
const map = { 1: '付费内容', 2: '免费内容' }
return map[value] || value
} }
} }
} }
......
...@@ -4,12 +4,19 @@ ...@@ -4,12 +4,19 @@
<template #header-aside> <template #header-aside>
<el-button type="primary" icon="el-icon-plus" @click="handleCreate">添加机构</el-button> <el-button type="primary" icon="el-icon-plus" @click="handleCreate">添加机构</el-button>
</template> </template>
<template v-slot:table-role="{ row }">
<el-tag>{{ row.role_name }}</el-tag>
</template>
<template v-slot:table-status="{ row }">
<el-tag v-if="row.is_valid">未过期</el-tag>
<el-tag type="danger" v-else>已过期</el-tag>
</template>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<router-link :to="{ path: 'class/view', query: { id: row.id } }" target="_blank"> <router-link :to="{ path: 'school/view', query: { id: row.id } }" target="_blank" style="margin-right: 10px">
<el-button type="text">查看</el-button> <el-button>查看</el-button>
</router-link> </router-link>
<el-button type="text" @click="handleUpdate(row)">编辑</el-button> <el-button type="primary" @click="handleUpdate(row)">编辑</el-button>
<el-button type="text" @click="onRemove(row)">删除</el-button> <el-button type="danger" @click="onRemove(row)">删除</el-button>
</template> </template>
</app-list> </app-list>
<!-- 创建/编辑 --> <!-- 创建/编辑 -->
...@@ -25,7 +32,7 @@ ...@@ -25,7 +32,7 @@
<script> <script>
// 接口 // 接口
import { getOrgList, deleteOrg } from '../api' import { getOrgList, deleteOrg, getRoleList } from '../api'
export default { export default {
components: { components: {
...@@ -35,7 +42,8 @@ export default { ...@@ -35,7 +42,8 @@ export default {
return { return {
visible: false, visible: false,
isEdit: false, // 是否是编辑状态 isEdit: false, // 是否是编辑状态
editRaw: {} // 编辑的数据 editRaw: {}, // 编辑的数据
roleList: [] // 角色列表
} }
}, },
computed: { computed: {
...@@ -44,9 +52,14 @@ export default { ...@@ -44,9 +52,14 @@ export default {
return { return {
remote: { remote: {
httpRequest: getOrgList, httpRequest: getOrgList,
params: {} params: { id: '', name: '', content_permissions: '', role_id: '' }
}, },
filters: [ filters: [
{
type: 'input',
prop: 'id',
placeholder: '机构ID'
},
{ {
type: 'input', type: 'input',
prop: 'name', prop: 'name',
...@@ -54,34 +67,62 @@ export default { ...@@ -54,34 +67,62 @@ export default {
}, },
{ {
type: 'select', type: 'select',
prop: 'permission', prop: 'content_permissions',
placeholder: '机构内容权限', placeholder: '机构内容权限',
options: [ options: [
{ label: '免费内容', value: '1' }, { label: '付费内容', value: 1 },
{ label: '付费内容', value: '2' } { label: '免费内容', value: 2 }
] ]
}, },
{ {
type: 'select', type: 'select',
prop: 'role', prop: 'role_id',
placeholder: '机构角色' placeholder: '机构角色',
options: this.roleList,
labelKey: 'name',
valueKey: 'id'
} }
], ],
columns: [ columns: [
{ label: '机构ID', prop: 'id' }, { label: '机构ID', prop: 'id' },
{ label: '机构名称', prop: 'name' }, { label: '机构名称', prop: 'name' },
{ label: '机构内容权限', prop: 'permission' }, {
{ label: '机构角色', prop: 'role' }, label: '机构内容权限',
{ label: '创建人', prop: 'create' }, prop: 'content_permissions',
{ label: '机构内用户数', prop: 'count' }, computed({ row }) {
{ label: '创建时间', prop: 'date' }, const map = { 1: '付费内容', 2: '免费内容' }
{ label: '状态', prop: 'status' }, return map[row.content_permissions] || row.content_permissions
{ label: '操作', slots: 'table-x', align: 'right', width: '120', fixed: 'right' } }
},
{ label: '机构角色', prop: 'role_name', slots: 'table-role' },
{
label: '创建人',
prop: 'created_by.realname',
computed({ row }) {
return row.created_by.realname || row.created_by.username
}
},
{ label: '机构内用户数', prop: 'edu_staff_count' },
{ label: '创建时间', prop: 'created_at' },
{
label: '状态',
prop: 'is_valid',
slots: 'table-status'
},
{ label: '操作', slots: 'table-x', align: 'right', width: '220', fixed: 'right' }
] ]
} }
} }
}, },
beforeMount() {
this.getRoleList()
},
methods: { methods: {
getRoleList() {
getRoleList({ limit: 100 }).then(res => {
this.roleList = res.data.data
})
},
// 创建成功刷新列表 // 创建成功刷新列表
handleSuccess() { handleSuccess() {
this.$refs.list.refetch() this.$refs.list.refetch()
...@@ -100,7 +141,7 @@ export default { ...@@ -100,7 +141,7 @@ export default {
}, },
// 删除 // 删除
onRemove(row) { onRemove(row) {
this.$confirm('班级删除请谨慎操作,确定删除?', '删除班级', { this.$confirm('机构删除请谨慎操作,确定删除?', '删除机构', {
confirmButtonText: '删除', confirmButtonText: '删除',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论