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

feat: 新增管理员管理

上级 43ad3b34
......@@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="https://zws-imgs-pub.ezijing.com/pc/base/favicon.ico" />
<!-- <link rel="icon" href="https://zws-imgs-pub.ezijing.com/pc/base/favicon.ico" /> -->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>
</head>
......
......@@ -8,7 +8,13 @@
export default {
metaInfo() {
return {
title: this.$store.state.appConfig.title
title: this.$store.state.appConfig.title,
link: [
{
rel: 'icon',
href: this.$store.state.appConfig.favicon || 'https://zws-imgs-pub.ezijing.com/pc/base/favicon.ico'
}
]
}
}
}
......
......@@ -8,8 +8,10 @@ export default [
{
name: '金融数据合规管理',
tenant: 'financial',
title: '金融数据合规管理系统-紫荆教育',
logo: 'https://webapp-pub.ezijing.com/x-training-new/fd-logo2.png',
title: '金融数据合规管理系统',
logo: 'https://webapp-pub.ezijing.com/project_online/fdc/fdc_header_logo.png',
logoStyle: 'height:64px;background:#fff;margin-left:-20px;padding-left:20px;',
favicon: 'https://webapp-pub.ezijing.com/project_online/fdc/favico.svg',
hosts: ['fd-admin', 'fd-admin2', 'fdc-admin', 'fdc-admin2']
}
]
......@@ -9,8 +9,7 @@
:index="subitem.path"
v-for="subitem in item.children"
:key="subitem.path"
v-permission="subitem.tag"
>
v-permission="subitem.tag">
<template v-if="subitem.href">
<a :href="subitem.href" target="_blank">{{ subitem.name }}</a>
</template>
......@@ -65,6 +64,7 @@ export default {
icon: 'el-icon-user',
tag: 'menu_school',
children: [
{ name: '管理员管理', path: '/personnel/admin', tag: 'menu_school_admin' },
{ name: '教师管理', path: '/personnel/teacher', tag: 'menu_school_teacher' },
{ name: '学员管理', path: '/personnel/student', tag: 'menu_school_students' }
]
......
......@@ -2,11 +2,14 @@
<header class="app-header">
<div class="logo">
<router-link to="/">
<img width="110px" src="https://zws-imgs-pub.ezijing.com/pc/base/ezijing-logo-white.svg" />
<img
height="40px"
:src="logoUrl || 'https://zws-imgs-pub.ezijing.com/pc/base/ezijing-logo-white.svg'"
:style="logoStyle" />
</router-link>
<template v-if="logoUrl">
<!-- <template v-if="logoUrl">
<img :src="logoUrl" class="sub-logo" />
</template>
</template> -->
</div>
<div class="app-header-right">
<el-dropdown>
......@@ -41,6 +44,9 @@ export default {
},
logoUrl() {
return this.$store.state.appConfig?.logo
},
logoStyle() {
return this.$store.state.appConfig?.logoStyle
}
},
methods: {
......@@ -62,7 +68,8 @@ export default {
height: 64px;
background-color: #3276fc;
color: #fff;
box-shadow: 0 0 29px #0000001a;
z-index: 1000;
.logo {
height: 100%;
display: flex;
......
import httpRequest from '@/utils/axios'
/**
* 获取管理员列表
*/
export function getAdminList(params) {
return httpRequest.get('/api/zy-admin/school/admin/list', { params })
}
/**
* 获取管理员详情
*/
export function getAdminDetail(params) {
return httpRequest.get('/api/zy-admin/school/admin/view', { params })
}
/**
* 管理员添加/创建
*/
export function createAdmin(data) {
return httpRequest.post('/api/zy-admin/school/admin/add', data)
}
/**
* 修改管理员
*/
export function updateAdmin(data) {
return httpRequest.post('/api/zy-admin/school/admin/update', data)
}
/**
* 删除管理员
*/
export function deleteAdmin(data) {
return httpRequest.post('/api/zy-admin/school/admin/delete', data)
}
/**
* 获取班级列表
*/
export function getClassList(params) {
return httpRequest.get('/api/zy-admin/school/class/list', { params })
}
const routes = [
{
path: '/personnel',
component: () => import('@/components/layout/Index.vue'),
children: [
{
name: 'admin',
path: 'admin',
component: () => import('./views/List.vue'),
meta: { title: '管理员管理' }
},
{
path: 'admin/view',
component: () => import('./views/Detail.vue'),
props: true,
meta: { title: '管理员管理' }
},
{
name: 'addAdmin',
path: 'admin/update',
component: () => import('./views/Update.vue'),
props: true,
meta: { title: '管理员管理' }
}
]
}
]
export { routes }
<template>
<app-card>
<el-form :model="form" label-width="120px" disabled>
<!-- 姓名 -->
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="form.personal_name"></el-input>
</el-form-item>
<!-- 手机号 -->
<el-form-item label="手机号" prop="telephone">
<el-input v-model="form.telephone"></el-input>
</el-form-item>
<el-form-item label="绑定班级" prop="classes_id">
<el-tag v-for="(item, index) in form.classes_id" :key="index" size="default">
{{ item.name }}
</el-tag>
</el-form-item>
<!-- 邮箱 -->
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email"></el-input>
</el-form-item>
<!--密码 -->
<el-form-item label="创建日期" prop="created_time">
<el-input v-model="form.created_time"></el-input>
</el-form-item>
<!-- 工号 -->
<el-form-item label="更新日期" prop="updated_time">
<el-input v-model="form.updated_time"></el-input>
</el-form-item>
</el-form>
</app-card>
</template>
<script>
import AppCard from '../../../../components/base/AppCard.vue'
import { getAdminDetail } from '../api'
export default {
components: { AppCard },
data() {
return {
form: {}
}
},
mounted() {
this.getDetail()
},
methods: {
getDetail() {
getAdminDetail({ id: this.$route.query.id }).then(res => {
this.form = res.data
})
}
}
}
</script>
<style>
.my-label {
width: 200px;
}
.el-tag {
margin-right: 10px;
}
</style>
<template>
<app-card>
<app-list v-bind="tableOptions" ref="list">
<template>
<el-row style="margin-bottom: 20px">
<el-button type="primary" icon="el-icon-plus" @click="add" size="mini" v-permission="'menu_school_admin_add'"
>新建</el-button
>
</el-row>
</template>
<template #table-class="{ row }">{{ row.classes_id?.length }}</template>
<template v-slot:table-x="{ row }">
<router-link :to="{ path: 'admin/view', query: { id: row.id } }" v-permission="'menu_school_admin_view'">
<el-button type="primary" size="mini" plain>查看</el-button>
</router-link>
<router-link :to="{ path: 'admin/update', query: { id: row.id } }" v-permission="'menu_school_admin_update'">
<el-button type="success" style="margin-left: 10px" size="mini" plain>更新</el-button>
</router-link>
<el-button
type="danger"
style="margin-left: 10px"
size="mini"
plain
@click="onRemove(row)"
v-permission="'menu_school_admin_delete'"
>删除</el-button
>
</template>
</app-list>
</app-card>
</template>
<script>
// 接口
import { getAdminList, deleteAdmin } from '../api'
export default {
data() {
return {}
},
computed: {
// 列表配置
tableOptions() {
return {
remote: {
httpRequest: getAdminList,
params: {
personal_name: '',
telephone: '',
id: '',
job_number: ''
}
},
filters: [
{
type: 'input',
prop: 'personal_name',
placeholder: '姓名'
},
{
type: 'input',
prop: 'telephone',
placeholder: '手机号'
},
{
type: 'input',
prop: 'email',
placeholder: '邮箱'
}
],
columns: [
{ label: '姓名', align: 'center', prop: 'personal_name' },
{ label: '手机号', align: 'center', prop: 'telephone' },
{ label: '绑定班级数', align: 'center', slots: 'table-class' },
{ label: '邮箱', align: 'center', prop: 'email' },
{ label: '创建日期', align: 'center', prop: 'created_time' },
{ label: '操作', slots: 'table-x', align: 'center', width: '300', fixed: 'right' }
]
}
}
},
methods: {
add() {
this.$router.push({ path: 'admin/update' })
},
// 删除
onRemove(row) {
this.$confirm('你确定要删除此项吗', '确认提示', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.handleRemove(row)
})
},
// 删除
handleRemove(row) {
deleteAdmin({ id: row.id }).then(() => {
this.$message({ type: 'success', message: '删除成功' })
this.$refs.list.refetch()
})
}
}
}
</script>
<template>
<app-card>
<el-form :model="form" label-width="120px" ref="form" :rules="rules">
<!-- 姓名 -->
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="form.personal_name" maxlength="40"></el-input>
</el-form-item>
<!-- 手机号 -->
<el-form-item label="手机号" prop="telephone">
<el-input v-model="form.telephone" maxlength="11"></el-input>
</el-form-item>
<el-form-item label="绑定班级" prop="classes_id">
<el-tag
v-for="(item, index) in form.classes_id"
:key="index"
size="default"
closable
disable-transitions
@close="handleClose(index)">
{{ item.name }}
</el-tag>
<el-autocomplete
class="input-new-tag"
v-if="inputVisible"
v-model="inputValue"
ref="saveTagInput"
value-key="class_name"
popper-class="popper-new-tag"
:fetch-suggestions="querySearchAsync"
@select="handleSelect"
@blur="handleBlur">
</el-autocomplete>
<el-button v-else class="button-new-tag" @click="showInput">添加</el-button>
</el-form-item>
<!--密码 -->
<el-form-item label="密码" prop="password" v-if="!this.id">
<el-input v-model="form.password" type="password" show-password></el-input>
</el-form-item>
<!-- 邮箱 -->
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email"></el-input>
</el-form-item>
<el-form-item>
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="submit">提交</el-button>
</el-form-item>
</el-form>
</app-card>
</template>
<script>
import { getAdminDetail, createAdmin, updateAdmin, getClassList } from '../api'
export default {
data() {
return {
form: {
personal_name: '',
telephone: '',
password: '',
email: '',
classes_id: []
},
rules: {
personal_name: [
{ required: true, message: '请输入姓名', trigger: 'blur' },
{ min: 0, max: 40, message: '您最多可输入40 个字符', trigger: 'blur' }
],
telephone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
classes_id: [{ required: true, message: '请绑定班级', trigger: 'change' }]
},
inputValue: '',
inputVisible: false
}
},
computed: {
id() {
return this.$route.query.id
}
},
mounted() {
if (this.id) {
this.getDetail() // 获取班级详情信息
}
},
methods: {
getDetail() {
getAdminDetail({ id: this.id }).then(res => {
this.form = res.data
})
},
cancel() {
this.$router.go(-1)
},
submit() {
this.$refs.form.validate().then(() => {
this.id ? this.edit() : this.create()
})
},
// 创建管理员
create() {
const classIds = this.form.classes_id.map(item => item.id)
const params = Object.assign({}, this.form, { classes_id: classIds.join(',') })
createAdmin(params).then(() => {
this.$message.success('创建成功')
this.$router.push({ name: 'admin' })
})
},
// 编辑管理员
edit() {
const classIds = this.form.classes_id.map(item => item.id)
const params = Object.assign({ id: this.id }, this.form, { classes_id: classIds.join(',') })
updateAdmin(params).then(() => {
this.$message.success('更新成功')
this.$router.push({ name: 'admin' })
})
},
handleClose(index) {
this.form.classes_id.splice(index, 1)
},
showInput() {
this.inputVisible = true
this.$nextTick(() => {
this.$refs.saveTagInput.$refs.input.focus()
})
},
querySearchAsync(queryString, cb) {
getClassList({ class_name: queryString }).then(res => {
const list = res.data.list
cb(list.filter(data => !this.form.classes_id.find(item => item.id === data.id)))
})
},
handleSelect(data) {
this.form.classes_id.push({ id: data.id, name: data.class_name })
this.inputVisible = false
this.inputValue = ''
},
handleBlur() {
setTimeout(() => {
this.inputVisible = false
this.inputValue = ''
}, 200)
}
}
}
</script>
<style scoped>
.el-tag {
margin-right: 10px;
}
.button-new-tag {
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 100px;
vertical-align: bottom;
}
</style>
<style>
.popper-new-tag {
min-width: 100px;
width: auto !important;
}
</style>
......@@ -13,8 +13,7 @@
type="date"
value-format="yyyy-MM-dd"
placeholder="开始日期"
style="width: 140px"
>
style="width: 140px">
</el-date-picker>
<span style="padding-left: 10px; color: #606266">-</span>
</template>
......@@ -24,34 +23,31 @@
type="date"
value-format="yyyy-MM-dd"
placeholder="结束日期"
style="width: 140px"
>
style="width: 140px">
</el-date-picker>
</template>
<div style="margin-bottom: 20px">
<el-button type="primary" @click="importDialogVisible = true">更新证书</el-button>
</div>
<template v-slot:table-x="{ row }">
<router-link
:to="{ path: './cert/details', query: { id: row.student_id, name: row.personal_name } }"
target="_blank"
v-permission="'menu_certificate_view'"
>
v-permission="'menu_certificate_view'">
<el-button type="primary" size="mini" plain>查看</el-button>
</router-link>
</template>
<div class="buttons" v-permission="'menu_certificate_download'">
<a :href="exportUrl" download target="_blank">
<el-button type="primary" icon="el-icon-download">导出</el-button>
</a>
<span style="font-size: 12px; padding: 0 10px; color: #606266">导出当前搜索结果</span>
</div>
<el-row type="flex" justify="space-between" style="margin-bottom: 20px">
<div class="buttons" v-permission="'menu_certificate_download'">
<a :href="exportUrl" download target="_blank">
<el-button type="primary" icon="el-icon-download">导出</el-button>
</a>
<span style="font-size: 12px; padding: 0 10px; color: #606266">导出当前搜索结果</span>
</div>
<el-button type="primary" @click="importDialogVisible = true">更新证书</el-button>
</el-row>
</app-list>
<import-people
@cancel="importDialogVisible = false"
width="400px"
:visible.sync="importDialogVisible"
></import-people>
:visible.sync="importDialogVisible"></import-people>
</app-card>
</template>
......
......@@ -12,17 +12,17 @@
</el-form-item>
<el-form-item label="证书类型" prop="certificate_type">
<div class="cert-item">
<div :class="form.certificate_type == '1' ? 'item active' : 'item'" @click="changeType('1')">
<div
class="item"
:class="{ active: form.certificate_type == item.type }"
@click="changeType(item.type)"
v-for="item in certList"
:key="item.type">
<img :src="item.image_url" />
<p>{{ item.title }}</p>
<div class="pop">
<i class="el-icon-success"></i>
</div>
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/project/fd/zs-admin.png" />
</div>
<div :class="form.certificate_type == '2' ? 'item active' : 'item'" @click="changeType('2')">
<div class="pop">
<i class="el-icon-success"></i>
</div>
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/project/fd/zs2.png" />
</div>
</div>
</el-form-item>
......@@ -57,7 +57,24 @@ export default {
class_number: [{ min: 0, max: 40, message: '您最多可输入40 个字符', trigger: 'blur' }],
class_describe: [{ min: 0, max: 100, message: '您最多可输入50个字符', trigger: 'blur' }],
certificate_type: { required: true, message: '' }
}
},
certList: [
{
type: '1',
image_url: 'https://webapp-pub.ezijing.com/project/fd/zs-admin.png',
title: '单章40课时'
},
{
type: '2',
image_url: 'https://webapp-pub.ezijing.com/project/fd/zs2.png',
title: '双章18课时'
},
{
type: '3',
image_url: 'https://webapp-pub.ezijing.com/project/fd/zs-admin.png',
title: '单章18课时'
}
]
}
},
watch: {
......@@ -139,11 +156,11 @@ export default {
}
.pop {
opacity: 0;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 30px;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
......@@ -157,6 +174,11 @@ export default {
width: 100%;
display: block;
}
p {
color: #f00;
line-height: 30px;
text-align: center;
}
}
}
</style>
<template>
<app-card>
<el-form :model="form" label-width="120px">
<el-form :model="form" label-width="120px" disabled>
<!-- 姓名 -->
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="form.personal_name" disabled></el-input>
<el-input v-model="form.personal_name"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-input v-model="form.gender" disabled></el-input>
<el-input v-model="form.gender"></el-input>
</el-form-item>
<!-- 手机号 -->
<el-form-item label="手机号" prop="telephone">
<el-input type="number" v-model="form.telephone" disabled></el-input>
<el-input v-model="form.telephone"></el-input>
</el-form-item>
<!--学号 -->
<el-form-item label="学号" prop="sno">
<el-input v-model="form.sno" disabled></el-input>
<el-input v-model="form.sno"></el-input>
</el-form-item>
<!-- 邮箱 -->
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" disabled></el-input>
<el-input v-model="form.email"></el-input>
</el-form-item>
<el-form-item label="身份证号" prop="id_number">
<el-input v-model="form.id_number" disabled></el-input>
<el-input v-model="form.id_number"></el-input>
</el-form-item>
<el-form-item label="公司" prop="school">
<el-input v-model="form.school" disabled></el-input>
<el-input v-model="form.school"></el-input>
</el-form-item>
<el-form-item label="课程有效期" prop="expiration_time">
<el-date-picker v-model="form.expiration_time" type="date" disabled> </el-date-picker>
<el-date-picker v-model="form.expiration_time" type="date"> </el-date-picker>
</el-form-item>
</el-form>
</app-card>
......
......@@ -19,7 +19,7 @@
</el-form-item>
<!-- 手机号 -->
<el-form-item label="电话" prop="telephone">
<el-input v-model="form.telephone" maxlength="11" type="number"></el-input>
<el-input v-model="form.telephone" maxlength="11"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password" v-if="!this.id">
<el-input v-model="form.password" show-password></el-input>
......
<template>
<app-card>
<el-form :model="form" label-width="120px">
<el-form :model="form" label-width="120px" disabled>
<!-- 姓名 -->
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="form.personal_name" disabled></el-input>
<el-input v-model="form.personal_name"></el-input>
</el-form-item>
<!-- 手机号 -->
<el-form-item label="手机号" prop="telephone">
<el-input type="number" v-model="form.telephone" disabled></el-input>
<el-input v-model="form.telephone"></el-input>
</el-form-item>
<!-- 邮箱 -->
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" disabled></el-input>
<el-input v-model="form.email"></el-input>
</el-form-item>
<!--密码 -->
<el-form-item label="创建日期" prop="created_time">
<el-input v-model="form.created_time" disabled></el-input>
<el-input v-model="form.created_time"></el-input>
</el-form-item>
<!-- 工号 -->
<el-form-item label="更新日期" prop="updated_time">
<el-input v-model="form.updated_time" disabled></el-input>
<el-input v-model="form.updated_time"></el-input>
</el-form-item>
</el-form>
</app-card>
......
......@@ -7,7 +7,7 @@
</el-form-item>
<!-- 手机号 -->
<el-form-item label="手机号" prop="telephone">
<el-input type="number" v-model="form.telephone" maxlength="11"></el-input>
<el-input v-model="form.telephone" maxlength="11"></el-input>
</el-form-item>
<!--密码 -->
<el-form-item label="密码" prop="password" v-if="!this.id">
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论