增加管理员权限

This commit is contained in:
曹前明 2022-07-11 22:27:46 +08:00
parent 9d483b942d
commit 1d7dfda3a3
5 changed files with 128 additions and 109 deletions

View File

@ -157,7 +157,7 @@ export const asyncRoutes = [
component: Layout, component: Layout,
redirect: '/Qmanage/question', redirect: '/Qmanage/question',
name: 'Qmanage', name: 'Qmanage',
meta: { title: '题库管理', icon: 'table', perms: []}, meta: { title: '题库管理', icon: 'table'},
children: [ children: [
{ {
path: 'subject', path: 'subject',
@ -175,7 +175,7 @@ export const asyncRoutes = [
path: 'question', path: 'question',
name: 'question', name: 'question',
component: () => import('@/views/question/question.vue'), component: () => import('@/views/question/question.vue'),
meta: { title: '题目列表', icon: '', perms: ['question_manage'] } meta: { title: '题目列表', icon: '', perms: ['question_view'] }
}, },
{ {
path: 'question/create', path: 'question/create',
@ -279,7 +279,7 @@ export const asyncRoutes = [
path: 'issue', path: 'issue',
name: 'issue', name: 'issue',
component: () => import('@/views/exam/issue.vue'), component: () => import('@/views/exam/issue.vue'),
meta: { title: '出证记录', perms: ['candidate_view'] } meta: { title: '出证记录', perms: ['certificate_view'] }
}, },
] ]
}, },

View File

@ -18,7 +18,7 @@
<el-button <el-button
type="primary" type="primary"
@click="handleAdd" @click="handleAdd"
v-if="checkPermission(['candidate_create'])" v-if="checkPermission(['certificate_create'])"
>手动创建</el-button >手动创建</el-button
> >
</div> </div>
@ -68,17 +68,21 @@
</el-table-column> </el-table-column>
<el-table-column align="center" label="操作" fixed="right"> <el-table-column align="center" label="操作" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" size="small" @click="handleView(scope)" icon="el-icon-more" plain=true
></el-button
>
<el-button <el-button
type="primary" type="primary"
size="small" size="small"
plain=true @click="handleView(scope)"
@click="handleEdit(scope)" icon="el-icon-more"
icon="el-icon-edit" plain="true"
v-if="checkPermission(['candidate_update'])" ></el-button>
></el-button> <el-button
type="primary"
size="small"
plain="true"
@click="handleEdit(scope)"
icon="el-icon-edit"
v-if="checkPermission(['certificate_update'])"
></el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -89,7 +93,10 @@
:limit.sync="listQuery.limit" :limit.sync="listQuery.limit"
@pagination="getList" @pagination="getList"
/> />
<el-dialog :visible.sync="dialogVisible" :title="dialogType === 'update' ? '编辑' : '新增'"> <el-dialog
:visible.sync="dialogVisible"
:title="dialogType === 'update' ? '编辑' : '新增'"
>
<el-form <el-form
:model="candidate" :model="candidate"
label-width="80px" label-width="80px"
@ -97,78 +104,87 @@
:rules="candidateRule" :rules="candidateRule"
ref="candidateForm" ref="candidateForm"
> >
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="报告单号" prop="number"> <el-form-item label="报告单号" prop="number">
<el-input v-model="candidate.number" placeholder="报告单号" /> <el-input v-model="candidate.number" placeholder="报告单号" />
</el-form-item> </el-form-item>
<el-form-item label="姓名" prop="consumer_name"> <el-form-item label="姓名" prop="consumer_name">
<el-input v-model="candidate.consumer_name" placeholder="姓名" /> <el-input v-model="candidate.consumer_name" placeholder="姓名" />
</el-form-item> </el-form-item>
<el-form-item label="身份证号" prop="ID_number"> <el-form-item label="身份证号" prop="ID_number">
<el-input v-model="candidate.ID_number" placeholder="身份证号" /> <el-input v-model="candidate.ID_number" placeholder="身份证号" />
</el-form-item> </el-form-item>
<el-form-item label="工作类别" prop="workscope_name"> <el-form-item label="工作类别" prop="workscope_name">
<el-input v-model="candidate.workscope_name" placeholder="工作类别" /> <el-input
</el-form-item> v-model="candidate.workscope_name"
<el-form-item label="单位" prop="company_name"> placeholder="工作类别"
<el-input v-model="candidate.company_name" placeholder="单位" /> />
</el-form-item> </el-form-item>
<el-form-item label="部门" prop="deptname"> <el-form-item label="单位" prop="company_name">
<el-input v-model="candidate.deptname" placeholder="部门" /> <el-input v-model="candidate.company_name" placeholder="单位" />
</el-form-item> </el-form-item>
</el-col> <el-form-item label="部门" prop="deptname">
<el-col :span="12"> <el-input v-model="candidate.deptname" placeholder="部门" />
<el-form-item label="发证日期" prop="issue_date"> </el-form-item>
<el-date-picker </el-col>
v-model="candidate.issue_date" <el-col :span="12">
type="date" <el-form-item label="发证日期" prop="issue_date">
placeholder="选择日期" <el-date-picker
value-format="yyyy-MM-dd"> v-model="candidate.issue_date"
</el-date-picker> type="date"
</el-form-item> placeholder="选择日期"
<el-form-item label="有效期始" prop="start_date"> value-format="yyyy-MM-dd"
<el-date-picker >
v-model="candidate.start_date" </el-date-picker>
type="date" </el-form-item>
placeholder="选择日期" <el-form-item label="有效期始" prop="start_date">
value-format="yyyy-MM-dd"> <el-date-picker
</el-date-picker> v-model="candidate.start_date"
</el-form-item> type="date"
<el-form-item label="有效期止" prop="end_date"> placeholder="选择日期"
<el-date-picker value-format="yyyy-MM-dd"
v-model="candidate.end_date" >
type="date" </el-date-picker>
placeholder="选择日期" </el-form-item>
value-format="yyyy-MM-dd"> <el-form-item label="有效期止" prop="end_date">
</el-date-picker> <el-date-picker
</el-form-item> v-model="candidate.end_date"
<el-form-item label="考试时间" prop="examtest_date"> type="date"
<el-date-picker placeholder="选择日期"
v-model="candidate.examtest_date" value-format="yyyy-MM-dd"
type="date" >
placeholder="选择日期" </el-date-picker>
value-format="yyyy-MM-dd"> </el-form-item>
</el-date-picker> <el-form-item label="考试时间" prop="examtest_date">
</el-form-item> <el-date-picker
<el-form-item label="照片" prop="photo"> v-model="candidate.examtest_date"
<el-upload type="date"
class="avatar-uploader" placeholder="选择日期"
:action="upUrl" value-format="yyyy-MM-dd"
accept="image/jpeg, image/gif, image/png, image/bmp" >
:show-file-list="false" </el-date-picker>
:on-success="handleAvatarSuccess" </el-form-item>
:before-upload="beforeAvatarUpload" <el-form-item label="照片" prop="photo">
:headers="upHeaders" <el-upload
> class="avatar-uploader"
<img v-if="candidate.photo" :src="candidate.photo" class="avatar" /> :action="upUrl"
<i v-else class="el-icon-plus avatar-uploader-icon"></i> accept="image/jpeg, image/gif, image/png, image/bmp"
</el-upload> :show-file-list="false"
</el-form-item> :on-success="handleAvatarSuccess"
</el-col> :before-upload="beforeAvatarUpload"
</el-row> :headers="upHeaders"
>
<img
v-if="candidate.photo"
:src="candidate.photo"
class="avatar"
/>
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div style="text-align: right"> <div style="text-align: right">
<el-button type="danger" @click="dialogVisible = false">取消</el-button> <el-button type="danger" @click="dialogVisible = false">取消</el-button>
@ -205,9 +221,13 @@
} }
</style> </style>
<script> <script>
import { getCandidateList, createCandidate, updateCandidate } from "@/api/candidate"; import {
getCandidateList,
createCandidate,
updateCandidate,
} from "@/api/candidate";
import { deepClone } from "@/utils"; import { deepClone } from "@/utils";
import { upUrl, upHeaders } from "@/api/file" import { upUrl, upHeaders } from "@/api/file";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
@ -227,7 +247,7 @@ export default {
listLoading: true, listLoading: true,
dialogVisible: false, dialogVisible: false,
dialogType: "create", dialogType: "create",
candidate: {photo:''}, candidate: { photo: "" },
candidateRule: { candidateRule: {
number: [{ required: true, message: "请输入编号", trigger: "blur" }], number: [{ required: true, message: "请输入编号", trigger: "blur" }],
}, },
@ -240,7 +260,7 @@ export default {
methods: { methods: {
checkPermission, checkPermission,
handleAvatarSuccess(res, file) { handleAvatarSuccess(res, file) {
this.candidate.photo = res.data.path this.candidate.photo = res.data.path;
}, },
beforeAvatarUpload(file) { beforeAvatarUpload(file) {
const isLt2M = file.size / 1024 / 1024 < 2; const isLt2M = file.size / 1024 / 1024 < 2;
@ -281,8 +301,8 @@ export default {
this.$refs["candidateForm"].clearValidate(); this.$refs["candidateForm"].clearValidate();
}); });
}, },
handleEdit(scope){ handleEdit(scope) {
this.candidate = scope.row this.candidate = scope.row;
this.dialogType = "update"; this.dialogType = "update";
this.dialogVisible = true; this.dialogVisible = true;
this.$nextTick(() => { this.$nextTick(() => {
@ -293,20 +313,19 @@ export default {
this.$refs[form].validate((valid) => { this.$refs[form].validate((valid) => {
if (valid) { if (valid) {
const isEdit = this.dialogType === "update"; const isEdit = this.dialogType === "update";
if(isEdit){ if (isEdit) {
updateCandidate(this.candidate.id, this.candidate).then(() => { updateCandidate(this.candidate.id, this.candidate).then(() => {
this.getList();
this.dialogVisible = false;
this.$message.success("成功");
});
} else {
createCandidate(this.candidate).then((res) => {
this.getList(); this.getList();
this.dialogVisible = false; this.dialogVisible = false;
this.$message.success("成功"); this.$message.success("成功");
}); });
}else{
createCandidate(this.candidate).then((res) => {
this.getList();
this.dialogVisible = false;
this.$message.success("成功");
});
} }
} else { } else {
return false; return false;
} }

View File

@ -43,14 +43,14 @@
@click="resetFilter" @click="resetFilter"
>刷新重置</el-button> >刷新重置</el-button>
<div style="margin-top:10px"> <div style="margin-top:10px">
<el-button type="primary" slot="reference" @click="handleAdd()">新增</el-button> <el-button type="primary" slot="reference" @click="handleAdd()" v-if="checkPermission(['question_create'])">新增</el-button>
<el-button <el-button
@click="handleEnabled" @click="handleEnabled"
>启用</el-button> >启用</el-button>
<el-popover <el-popover
placement="top" placement="top"
width="160" width="160"
v-if="checkPermission(['consumer_import'])" v-if="checkPermission(['question_import'])"
v-model="popovervisible" v-model="popovervisible"
> >
<p>导入题目前,请下载模板并按格式录入.</p> <p>导入题目前,请下载模板并按格式录入.</p>
@ -69,7 +69,7 @@
<el-button slot="reference">Excel导入</el-button> <el-button slot="reference">Excel导入</el-button>
</el-popover> </el-popover>
<el-button type="primary" icon="el-icon-download" @click="exportQuestion">导出Excel</el-button> <el-button type="primary" icon="el-icon-download" @click="exportQuestion" v-if="checkPermission(['export_question'])">导出Excel</el-button>
<el-button <el-button
type="danger" type="danger"
@click="handleDeletes(scope)" @click="handleDeletes(scope)"
@ -127,7 +127,7 @@
size="small" size="small"
@click="handleEdit(scope)" @click="handleEdit(scope)"
icon="el-icon-edit" icon="el-icon-edit"
:disabled="!checkPermission(['question_edit'])" :disabled="!checkPermission(['question_update'])"
></el-button> ></el-button>
<el-button <el-button
type="danger" type="danger"

View File

@ -715,8 +715,8 @@ class CandidateViewSet(RetrieveModelMixin, ListModelMixin, CreateModelMixin, Upd
出征记录:列表 出征记录:列表
""" """
perms_map = [ perms_map = [
{'get': '*'}, {'post': 'candidate_create'}, {'get': '*'}, {'post': 'certificate_create'},
{'put': 'candidate_update'}, {'delete': 'candidate_delete'}] {'put': 'certificate_update'}, {'delete': 'certificate_delete'}]
queryset = Candidate.objects.filter(number__isnull=False) queryset = Candidate.objects.filter(number__isnull=False)
serializer_class = CandidateSerializer serializer_class = CandidateSerializer
pagination_class = CommonPagination pagination_class = CommonPagination

View File

@ -94,7 +94,7 @@ class Menu(SoftCommonModel):
def __str__(self): def __str__(self):
return self.name return self.name + '-' + str(self.sort)
class Meta: class Meta:
verbose_name = '功能权限表' verbose_name = '功能权限表'