permission_data加入性能优化
This commit is contained in:
parent
b1449ea7ad
commit
8cfa767c56
|
@ -36,4 +36,35 @@ export function deleteImplementRule(id) {
|
||||||
url: `/certset/implementrule/${id}/`,
|
url: `/certset/implementrule/${id}/`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getUnitTypeList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/certset/unittype/',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createUnitType(data) {
|
||||||
|
return request({
|
||||||
|
url: '/certset/unittype/',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateUnitType(id, data) {
|
||||||
|
return request({
|
||||||
|
url: `/certset/unittype/${id}/`,
|
||||||
|
method: 'put',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteUnitType(id) {
|
||||||
|
return request({
|
||||||
|
url: `/certset/unittype/${id}/`,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
}
|
}
|
|
@ -1,144 +1,149 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-row :gutter="10">
|
<el-tabs type="border-card">
|
||||||
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
|
<el-tab-pane label="规则信息">
|
||||||
<el-col :span="18">
|
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
|
||||||
<el-form-item label="认证类型" prop="cert_type">
|
<el-row>
|
||||||
<el-select
|
<el-col :span="8">
|
||||||
v-model="formData.cert_type"
|
<el-form-item label="认证类型" prop="cert_type">
|
||||||
placeholder="请选择认证类型"
|
<el-select
|
||||||
clearable
|
v-model="formData.cert_type"
|
||||||
:style="{width: '100%'}"
|
placeholder="请选择认证类型"
|
||||||
>
|
clearable
|
||||||
<el-option
|
:style="{width: '100%'}"
|
||||||
v-for="(item, index) in cert_typeOptions"
|
>
|
||||||
:key="index"
|
<el-option
|
||||||
:label="item.label"
|
v-for="(item, index) in cert_typeOptions"
|
||||||
:value="item.value"
|
:key="index"
|
||||||
:disabled="item.disabled"
|
:label="item.label"
|
||||||
></el-option>
|
:value="item.value"
|
||||||
</el-select>
|
:disabled="item.disabled"
|
||||||
</el-form-item>
|
></el-option>
|
||||||
</el-col>
|
</el-select>
|
||||||
<el-col :span="18">
|
</el-form-item>
|
||||||
<el-form-item label="规则编号" prop="code">
|
</el-col>
|
||||||
<el-input
|
<el-col :span="8">
|
||||||
v-model="formData.code"
|
<el-form-item label="规则编号" prop="code">
|
||||||
placeholder="请输入规则编号"
|
<el-input
|
||||||
clearable
|
v-model="formData.code"
|
||||||
:style="{width: '100%'}"
|
placeholder="请输入规则编号"
|
||||||
></el-input>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
></el-input>
|
||||||
<el-col :span="18">
|
</el-form-item>
|
||||||
<el-form-item label="规则名称" prop="name">
|
</el-col>
|
||||||
<el-input
|
<el-col :span="8">
|
||||||
v-model="formData.name"
|
<el-form-item label="规则名称" prop="name">
|
||||||
placeholder="请输入规则名称"
|
<el-input
|
||||||
clearable
|
v-model="formData.name"
|
||||||
:style="{width: '100%'}"
|
placeholder="请输入规则名称"
|
||||||
></el-input>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
></el-input>
|
||||||
<el-col :span="18">
|
</el-form-item>
|
||||||
<el-form-item label="认证模式" prop="cert_pattern">
|
</el-col>
|
||||||
<el-select
|
</el-row>
|
||||||
v-model="formData.cert_pattern"
|
|
||||||
placeholder="请选择认证模式"
|
<el-col :span="24">
|
||||||
clearable
|
<el-form-item label="认证模式" prop="cert_pattern">
|
||||||
:style="{width: '100%'}"
|
<el-select
|
||||||
:multiple="true"
|
v-model="formData.cert_pattern"
|
||||||
>
|
placeholder="请选择认证模式"
|
||||||
<el-option
|
clearable
|
||||||
v-for="(item, index) in cert_patternOptions"
|
:style="{width: '100%'}"
|
||||||
:key="index"
|
:multiple="true"
|
||||||
:label="item.fullname"
|
>
|
||||||
:value="item.value"
|
<el-option
|
||||||
:disabled="item.disabled"
|
v-for="(item, index) in cert_patternOptions"
|
||||||
></el-option>
|
:key="index"
|
||||||
</el-select>
|
:label="item.fullname"
|
||||||
</el-form-item>
|
:value="item.value"
|
||||||
</el-col>
|
:disabled="item.disabled"
|
||||||
<el-col :span="18" v-if="formData.cert_type =='pv'">
|
></el-option>
|
||||||
<el-form-item label="产品领域" prop="pv_scope">
|
</el-select>
|
||||||
<el-select
|
</el-form-item>
|
||||||
v-model="formData.pv_scope"
|
</el-col>
|
||||||
placeholder="请选择产品领域"
|
<el-col :span="24" v-if="formData.cert_type =='pv'">
|
||||||
clearable
|
<el-form-item label="产品领域" prop="pv_scope">
|
||||||
:style="{width: '100%'}"
|
<el-select
|
||||||
>
|
v-model="formData.pv_scope"
|
||||||
<el-option
|
placeholder="请选择产品领域"
|
||||||
v-for="(item, index) in pv_scopeOptions"
|
clearable
|
||||||
:key="index"
|
:style="{width: '100%'}"
|
||||||
:label="item.fullname"
|
>
|
||||||
:value="item.value"
|
<el-option
|
||||||
:disabled="item.disabled"
|
v-for="(item, index) in pv_scopeOptions"
|
||||||
></el-option>
|
:key="index"
|
||||||
</el-select>
|
:label="item.fullname"
|
||||||
</el-form-item>
|
:value="item.value"
|
||||||
</el-col>
|
:disabled="item.disabled"
|
||||||
<el-col :span="18" v-if="formData.cert_type =='pv'">
|
></el-option>
|
||||||
<el-form-item label="产品分类" prop="pv_class">
|
</el-select>
|
||||||
<treeselect
|
</el-form-item>
|
||||||
v-model="formData.pv_class"
|
</el-col>
|
||||||
placeholder="请选择产品分类"
|
<el-col :span="24" v-if="formData.cert_type =='pv'">
|
||||||
clearable
|
<el-form-item label="产品分类" prop="pv_class">
|
||||||
:style="{width: '100%'}"
|
<treeselect
|
||||||
:options="pv_classOptions"
|
v-model="formData.pv_class"
|
||||||
:multiple="false"
|
placeholder="请选择产品分类"
|
||||||
></treeselect>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
:options="pv_classOptions"
|
||||||
<el-col :span="18" v-if="formData.cert_type =='ccc'">
|
:multiple="false"
|
||||||
<el-form-item label="产品分类" prop="ccc_list">
|
></treeselect>
|
||||||
<treeselect
|
</el-form-item>
|
||||||
v-model="formData.ccc_list"
|
</el-col>
|
||||||
placeholder="请选择产品分类"
|
<el-col :span="24" v-if="formData.cert_type =='ccc'">
|
||||||
clearable
|
<el-form-item label="产品分类" prop="ccc_list">
|
||||||
:style="{width: '100%'}"
|
<treeselect
|
||||||
:options="ccc_listOptions"
|
v-model="formData.ccc_list"
|
||||||
:multiple="true"
|
placeholder="请选择产品分类"
|
||||||
></treeselect>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
:options="ccc_listOptions"
|
||||||
<el-col :span="18">
|
:multiple="true"
|
||||||
<el-form-item label="文件" prop="path">
|
></treeselect>
|
||||||
<el-upload
|
</el-form-item>
|
||||||
:on-preview="handlePreview"
|
</el-col>
|
||||||
:on-success="handleSuccess"
|
<el-col :span="24">
|
||||||
:action="upUrl"
|
<el-form-item label="文件" prop="path">
|
||||||
:headers="upHeaders"
|
<el-upload
|
||||||
:limit="1"
|
:on-preview="handlePreview"
|
||||||
:file-list="fileList"
|
:on-success="handleSuccess"
|
||||||
>
|
:action="upUrl"
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
:headers="upHeaders"
|
||||||
</el-upload>
|
:limit="1"
|
||||||
</el-form-item>
|
:file-list="fileList"
|
||||||
</el-col>
|
>
|
||||||
<el-col :span="24">
|
<el-button size="small" type="primary">点击上传</el-button>
|
||||||
<el-form-item size="large">
|
</el-upload>
|
||||||
<el-button type="primary" @click="submitForm">创建</el-button>
|
</el-form-item>
|
||||||
<el-button
|
</el-col>
|
||||||
type="primary"
|
<el-col :span="24" style="margin-top:4px">
|
||||||
@click="submitForm2"
|
<el-form-item size="large">
|
||||||
v-if="formData.cert_type =='ccc'|| formData.cert_type == 'pv'"
|
<el-button type="primary" @click="submitForm">保存</el-button>
|
||||||
>创建并继续单元划分</el-button>
|
<el-button @click="resetForm">重置</el-button>
|
||||||
<el-button @click="resetForm">重置</el-button>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
</el-form>
|
||||||
</el-form>
|
</el-tab-pane>
|
||||||
</el-row>
|
<el-tab-pane label="单元类型划分" v-if="(formData.cert_type =='ccc'|| formData.cert_type == 'pv')&&(formData.id)">
|
||||||
|
<Unittype :implementrule="formData.id"></Unittype>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getDictList } from "@/api/dict";
|
import { getDictList } from "@/api/dict";
|
||||||
import { createImplementRule } from "@/api/implementrule";
|
import { createImplementRule, getImplementRule } from "@/api/implementrule";
|
||||||
import { genTree } from "@/utils";
|
import { genTree } from "@/utils";
|
||||||
import Treeselect from "@riophae/vue-treeselect";
|
import Treeselect from "@riophae/vue-treeselect";
|
||||||
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
|
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
|
||||||
import { upUrl, upHeaders } from "@/api/file";
|
import { upUrl, upHeaders } from "@/api/file";
|
||||||
|
import Unittype from "@/views/implementrule/unittype";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { Treeselect },
|
components: { Treeselect, Unittype },
|
||||||
props: [],
|
props: [],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -200,18 +205,10 @@ export default {
|
||||||
value: "sys"
|
value: "sys"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
pv_scopeOptions: [
|
pv_scopeOptions: [],
|
||||||
|
pv_classOptions: [],
|
||||||
],
|
ccc_listOptions: [],
|
||||||
pv_classOptions: [
|
cert_patternOptions: []
|
||||||
|
|
||||||
],
|
|
||||||
ccc_listOptions: [
|
|
||||||
|
|
||||||
],
|
|
||||||
cert_patternOptions: [
|
|
||||||
|
|
||||||
]
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {},
|
computed: {},
|
||||||
|
@ -219,10 +216,10 @@ export default {
|
||||||
"formData.cert_type": "changeRules"
|
"formData.cert_type": "changeRules"
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.getPvscope()
|
this.getPvscope();
|
||||||
this.getPvclass()
|
this.getPvclass();
|
||||||
this.getCccList()
|
this.getCccList();
|
||||||
this.getCertpattern()
|
this.getCertpattern();
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted() {},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -252,8 +249,7 @@ export default {
|
||||||
trigger: "change"
|
trigger: "change"
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
this.rules.ccc_list = []
|
this.rules.ccc_list = [];
|
||||||
this.formData.ccc_list = []
|
|
||||||
} else if (this.formData.cert_type == "ccc") {
|
} else if (this.formData.cert_type == "ccc") {
|
||||||
this.rules.ccc_list = [
|
this.rules.ccc_list = [
|
||||||
{
|
{
|
||||||
|
@ -262,19 +258,19 @@ export default {
|
||||||
trigger: "change"
|
trigger: "change"
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
this.rules.pv_class = []
|
this.rules.pv_class = [];
|
||||||
this.rules.pv_scope = []
|
this.rules.pv_scope = [];
|
||||||
this.formData.pv_scope = null
|
|
||||||
this.formData.pv_class = null
|
|
||||||
} else {
|
} else {
|
||||||
this.rules.pv_class = []
|
this.rules.pv_class = [];
|
||||||
this.rules.pv_scope = []
|
this.rules.pv_scope = [];
|
||||||
this.rules.ccc_list = []
|
this.rules.ccc_list = [];
|
||||||
this.formData.pv_scope = null
|
|
||||||
this.formData.pv_class = null
|
|
||||||
this.formData.ccc_list = []
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getRule() {
|
||||||
|
getImplementRule(this.formData.id).then(response => {
|
||||||
|
this.formData = response.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
getPvscope() {
|
getPvscope() {
|
||||||
getDictList({ type__code: "pv_scope" }).then(response => {
|
getDictList({ type__code: "pv_scope" }).then(response => {
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
|
@ -308,16 +304,10 @@ export default {
|
||||||
if (!valid) return;
|
if (!valid) return;
|
||||||
// TODO 提交表单
|
// TODO 提交表单
|
||||||
createImplementRule(this.formData).then(response => {
|
createImplementRule(this.formData).then(response => {
|
||||||
this.$router.go(-1);
|
this.$message({
|
||||||
});
|
type: 'success',
|
||||||
});
|
message: '成功!'
|
||||||
},
|
})
|
||||||
submitForm2() {
|
|
||||||
this.$refs["elForm"].validate(valid => {
|
|
||||||
if (!valid) return;
|
|
||||||
// TODO 提交表单
|
|
||||||
createImplementRule(this.formData).then(response => {
|
|
||||||
//this.$router.go(-1);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,144 +1,149 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-row :gutter="10">
|
<el-tabs type="border-card">
|
||||||
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
|
<el-tab-pane label="规则信息">
|
||||||
<el-col :span="18">
|
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
|
||||||
<el-form-item label="认证类型" prop="cert_type">
|
<el-row>
|
||||||
<el-select
|
<el-col :span="8">
|
||||||
v-model="formData.cert_type"
|
<el-form-item label="认证类型" prop="cert_type">
|
||||||
placeholder="请选择认证类型"
|
<el-select
|
||||||
clearable
|
v-model="formData.cert_type"
|
||||||
:style="{width: '100%'}"
|
placeholder="请选择认证类型"
|
||||||
>
|
clearable
|
||||||
<el-option
|
:style="{width: '100%'}"
|
||||||
v-for="(item, index) in cert_typeOptions"
|
>
|
||||||
:key="index"
|
<el-option
|
||||||
:label="item.label"
|
v-for="(item, index) in cert_typeOptions"
|
||||||
:value="item.value"
|
:key="index"
|
||||||
:disabled="item.disabled"
|
:label="item.label"
|
||||||
></el-option>
|
:value="item.value"
|
||||||
</el-select>
|
:disabled="item.disabled"
|
||||||
</el-form-item>
|
></el-option>
|
||||||
</el-col>
|
</el-select>
|
||||||
<el-col :span="18">
|
</el-form-item>
|
||||||
<el-form-item label="规则编号" prop="code">
|
</el-col>
|
||||||
<el-input
|
<el-col :span="8">
|
||||||
v-model="formData.code"
|
<el-form-item label="规则编号" prop="code">
|
||||||
placeholder="请输入规则编号"
|
<el-input
|
||||||
clearable
|
v-model="formData.code"
|
||||||
:style="{width: '100%'}"
|
placeholder="请输入规则编号"
|
||||||
></el-input>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
></el-input>
|
||||||
<el-col :span="18">
|
</el-form-item>
|
||||||
<el-form-item label="规则名称" prop="name">
|
</el-col>
|
||||||
<el-input
|
<el-col :span="8">
|
||||||
v-model="formData.name"
|
<el-form-item label="规则名称" prop="name">
|
||||||
placeholder="请输入规则名称"
|
<el-input
|
||||||
clearable
|
v-model="formData.name"
|
||||||
:style="{width: '100%'}"
|
placeholder="请输入规则名称"
|
||||||
></el-input>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
></el-input>
|
||||||
<el-col :span="18">
|
</el-form-item>
|
||||||
<el-form-item label="认证模式" prop="cert_pattern">
|
</el-col>
|
||||||
<el-select
|
</el-row>
|
||||||
v-model="formData.cert_pattern"
|
|
||||||
placeholder="请选择认证模式"
|
<el-col :span="24">
|
||||||
clearable
|
<el-form-item label="认证模式" prop="cert_pattern">
|
||||||
:style="{width: '100%'}"
|
<el-select
|
||||||
:multiple="true"
|
v-model="formData.cert_pattern"
|
||||||
>
|
placeholder="请选择认证模式"
|
||||||
<el-option
|
clearable
|
||||||
v-for="(item, index) in cert_patternOptions"
|
:style="{width: '100%'}"
|
||||||
:key="index"
|
:multiple="true"
|
||||||
:label="item.fullname"
|
>
|
||||||
:value="item.value"
|
<el-option
|
||||||
:disabled="item.disabled"
|
v-for="(item, index) in cert_patternOptions"
|
||||||
></el-option>
|
:key="index"
|
||||||
</el-select>
|
:label="item.fullname"
|
||||||
</el-form-item>
|
:value="item.value"
|
||||||
</el-col>
|
:disabled="item.disabled"
|
||||||
<el-col :span="18" v-if="formData.cert_type =='pv'">
|
></el-option>
|
||||||
<el-form-item label="产品领域" prop="pv_scope">
|
</el-select>
|
||||||
<el-select
|
</el-form-item>
|
||||||
v-model="formData.pv_scope"
|
</el-col>
|
||||||
placeholder="请选择产品领域"
|
<el-col :span="24" v-if="formData.cert_type =='pv'">
|
||||||
clearable
|
<el-form-item label="产品领域" prop="pv_scope">
|
||||||
:style="{width: '100%'}"
|
<el-select
|
||||||
>
|
v-model="formData.pv_scope"
|
||||||
<el-option
|
placeholder="请选择产品领域"
|
||||||
v-for="(item, index) in pv_scopeOptions"
|
clearable
|
||||||
:key="index"
|
:style="{width: '100%'}"
|
||||||
:label="item.fullname"
|
>
|
||||||
:value="item.value"
|
<el-option
|
||||||
:disabled="item.disabled"
|
v-for="(item, index) in pv_scopeOptions"
|
||||||
></el-option>
|
:key="index"
|
||||||
</el-select>
|
:label="item.fullname"
|
||||||
</el-form-item>
|
:value="item.value"
|
||||||
</el-col>
|
:disabled="item.disabled"
|
||||||
<el-col :span="18" v-if="formData.cert_type =='pv'">
|
></el-option>
|
||||||
<el-form-item label="产品分类" prop="pv_class">
|
</el-select>
|
||||||
<treeselect
|
</el-form-item>
|
||||||
v-model="formData.pv_class"
|
</el-col>
|
||||||
placeholder="请选择产品分类"
|
<el-col :span="24" v-if="formData.cert_type =='pv'">
|
||||||
clearable
|
<el-form-item label="产品分类" prop="pv_class">
|
||||||
:style="{width: '100%'}"
|
<treeselect
|
||||||
:options="pv_classOptions"
|
v-model="formData.pv_class"
|
||||||
:multiple="false"
|
placeholder="请选择产品分类"
|
||||||
></treeselect>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
:options="pv_classOptions"
|
||||||
<el-col :span="18" v-if="formData.cert_type =='ccc'">
|
:multiple="false"
|
||||||
<el-form-item label="产品分类" prop="ccc_list">
|
></treeselect>
|
||||||
<treeselect
|
</el-form-item>
|
||||||
v-model="formData.ccc_list"
|
</el-col>
|
||||||
placeholder="请选择产品分类"
|
<el-col :span="24" v-if="formData.cert_type =='ccc'">
|
||||||
clearable
|
<el-form-item label="产品分类" prop="ccc_list">
|
||||||
:style="{width: '100%'}"
|
<treeselect
|
||||||
:options="ccc_listOptions"
|
v-model="formData.ccc_list"
|
||||||
:multiple="true"
|
placeholder="请选择产品分类"
|
||||||
></treeselect>
|
clearable
|
||||||
</el-form-item>
|
:style="{width: '100%'}"
|
||||||
</el-col>
|
:options="ccc_listOptions"
|
||||||
<el-col :span="18">
|
:multiple="true"
|
||||||
<el-form-item label="文件" prop="path">
|
></treeselect>
|
||||||
<el-upload
|
</el-form-item>
|
||||||
:on-preview="handlePreview"
|
</el-col>
|
||||||
:on-success="handleSuccess"
|
<el-col :span="24">
|
||||||
:action="upUrl"
|
<el-form-item label="文件" prop="path">
|
||||||
:headers="upHeaders"
|
<el-upload
|
||||||
:limit="1"
|
:on-preview="handlePreview"
|
||||||
:file-list="fileList"
|
:on-success="handleSuccess"
|
||||||
>
|
:action="upUrl"
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
:headers="upHeaders"
|
||||||
</el-upload>
|
:limit="1"
|
||||||
</el-form-item>
|
:file-list="fileList"
|
||||||
</el-col>
|
>
|
||||||
<el-col :span="24">
|
<el-button size="small" type="primary">点击上传</el-button>
|
||||||
<el-form-item size="large">
|
</el-upload>
|
||||||
<el-button type="primary" @click="submitForm">保存</el-button>
|
</el-form-item>
|
||||||
<el-button
|
</el-col>
|
||||||
type="primary"
|
<el-col :span="24" style="margin-top:4px">
|
||||||
@click="submitForm2"
|
<el-form-item size="large">
|
||||||
v-if="formData.cert_type =='ccc'|| formData.cert_type == 'pv'"
|
<el-button type="primary" @click="submitForm">保存</el-button>
|
||||||
>保存并继续单元划分</el-button>
|
<el-button @click="resetForm">重置</el-button>
|
||||||
<el-button @click="resetForm">重置</el-button>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
</el-form>
|
||||||
</el-form>
|
</el-tab-pane>
|
||||||
</el-row>
|
<el-tab-pane label="单元类型划分" v-if="(formData.cert_type =='ccc'|| formData.cert_type == 'pv')&&(formData.id)">
|
||||||
|
<Unittype :implementrule="formData.id"></Unittype>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getDictList } from "@/api/dict";
|
import { getDictList } from "@/api/dict";
|
||||||
import { createImplementRule, getImplementRule } from "@/api/implementrule";
|
import { updateImplementRule, getImplementRule } from "@/api/implementrule";
|
||||||
import { genTree } from "@/utils";
|
import { genTree } from "@/utils";
|
||||||
import Treeselect from "@riophae/vue-treeselect";
|
import Treeselect from "@riophae/vue-treeselect";
|
||||||
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
|
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
|
||||||
import { upUrl, upHeaders } from "@/api/file";
|
import { upUrl, upHeaders } from "@/api/file";
|
||||||
|
import Unittype from "@/views/implementrule/unittype";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { Treeselect },
|
components: { Treeselect, Unittype },
|
||||||
props: [],
|
props: [],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -200,18 +205,10 @@ export default {
|
||||||
value: "sys"
|
value: "sys"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
pv_scopeOptions: [
|
pv_scopeOptions: [],
|
||||||
|
pv_classOptions: [],
|
||||||
],
|
ccc_listOptions: [],
|
||||||
pv_classOptions: [
|
cert_patternOptions: []
|
||||||
|
|
||||||
],
|
|
||||||
ccc_listOptions: [
|
|
||||||
|
|
||||||
],
|
|
||||||
cert_patternOptions: [
|
|
||||||
|
|
||||||
]
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {},
|
computed: {},
|
||||||
|
@ -219,12 +216,12 @@ export default {
|
||||||
"formData.cert_type": "changeRules"
|
"formData.cert_type": "changeRules"
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.formData.id = this.$route.query.id //接收参数
|
this.formData.id = this.$route.query.id; //接收参数
|
||||||
this.getRule();
|
this.getRule();
|
||||||
this.getPvscope()
|
this.getPvscope();
|
||||||
this.getPvclass()
|
this.getPvclass();
|
||||||
this.getCccList()
|
this.getCccList();
|
||||||
this.getCertpattern()
|
this.getCertpattern();
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted() {},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -273,8 +270,8 @@ export default {
|
||||||
},
|
},
|
||||||
getRule() {
|
getRule() {
|
||||||
getImplementRule(this.formData.id).then(response => {
|
getImplementRule(this.formData.id).then(response => {
|
||||||
this.formData = response.data
|
this.formData = response.data;
|
||||||
})
|
});
|
||||||
},
|
},
|
||||||
getPvscope() {
|
getPvscope() {
|
||||||
getDictList({ type__code: "pv_scope" }).then(response => {
|
getDictList({ type__code: "pv_scope" }).then(response => {
|
||||||
|
@ -308,17 +305,11 @@ export default {
|
||||||
this.$refs["elForm"].validate(valid => {
|
this.$refs["elForm"].validate(valid => {
|
||||||
if (!valid) return;
|
if (!valid) return;
|
||||||
// TODO 提交表单
|
// TODO 提交表单
|
||||||
createImplementRule(this.formData).then(response => {
|
updateImplementRule(this.formData.id, this.formData).then(response => {
|
||||||
this.$router.go(-1);
|
this.$message({
|
||||||
});
|
type: 'success',
|
||||||
});
|
message: '成功!'
|
||||||
},
|
})
|
||||||
submitForm2() {
|
|
||||||
this.$refs["elForm"].validate(valid => {
|
|
||||||
if (!valid) return;
|
|
||||||
// TODO 提交表单
|
|
||||||
createImplementRule(this.formData).then(response => {
|
|
||||||
//this.$router.go(-1);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,190 @@
|
||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<div>
|
||||||
|
<el-button type="primary" icon="el-icon-plus" @click="handleCreate">新增</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table
|
||||||
|
v-loading="listLoading"
|
||||||
|
:data="unitList"
|
||||||
|
style="width: 100%;margin-top:10px;"
|
||||||
|
border
|
||||||
|
fit
|
||||||
|
stripe
|
||||||
|
highlight-current-row
|
||||||
|
max-height="600"
|
||||||
|
>
|
||||||
|
<el-table-column type="index" width="50" />
|
||||||
|
<el-table-column align="center" label="类型名称">
|
||||||
|
<template slot-scope="scope">{{ scope.row.name }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="描述">
|
||||||
|
<template slot-scope="scope">{{ scope.row.description }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="采用标准">
|
||||||
|
<template slot-scope="scope">{{ scope.row.standard_.code }} {{ scope.row.standard_.name }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="操作" width="260px">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
:disabled="!checkPermission(['implementrule_update'])"
|
||||||
|
@click="handleUpdate(scope)"
|
||||||
|
>编辑</el-button>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
size="small"
|
||||||
|
:disabled="!checkPermission(['implementrule_delete'])"
|
||||||
|
@click="handleDelete(scope)"
|
||||||
|
>删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<el-dialog :visible.sync="dialogVisible" :title="dialogType==='update'?'编辑':'新增'">
|
||||||
|
<el-form
|
||||||
|
ref="Form"
|
||||||
|
:model="unittype"
|
||||||
|
label-width="80px"
|
||||||
|
label-position="right"
|
||||||
|
:rules="rule1"
|
||||||
|
>
|
||||||
|
<el-form-item label="名称" prop="name">
|
||||||
|
<el-input v-model="unittype.name" placeholder="名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="描述" prop="description">
|
||||||
|
<el-input v-model="unittype.description" placeholder="描述" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="采用标准" prop="standard">
|
||||||
|
<el-button type="primary" @click="chooseVisible=true" >选择</el-button>
|
||||||
|
<el-link
|
||||||
|
type="primary"
|
||||||
|
:href="unittype.standard_.path"
|
||||||
|
target="_blank"
|
||||||
|
v-if="unittype.standard"
|
||||||
|
>{{ unittype.standard_.code }} {{ unittype.standard_.name }}</el-link>
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div style="text-align:right;">
|
||||||
|
<el-button type="danger" @click="dialogVisible=false">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirm('Form')">确认</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<Standardchoose :chooseVisible="chooseVisible" @chooseComplete="chooseComplete"></Standardchoose>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { getUnitTypeList, createUnitType, updateUnitType, deleteUnitType} from "@/api/implementrule"
|
||||||
|
import Pagination from "@/components/Pagination"
|
||||||
|
import checkPermission from '@/utils/permission'
|
||||||
|
import Standardchoose from '@/views/standard/standardchoose'
|
||||||
|
export default {
|
||||||
|
name:'Unittype',
|
||||||
|
components: { Pagination, Standardchoose },
|
||||||
|
props:['implementrule'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
unittype:{},
|
||||||
|
unitList: [],
|
||||||
|
listLoading: true,
|
||||||
|
listQuery: {
|
||||||
|
implementrule:this.implementrule
|
||||||
|
},
|
||||||
|
rule1: {
|
||||||
|
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
|
||||||
|
//description: [{ required: true, message: '请输入描述', trigger: 'blur' }]
|
||||||
|
},
|
||||||
|
dialogVisible:false,
|
||||||
|
dialogType:'create',
|
||||||
|
standardOptions:[],
|
||||||
|
chooseVisible:false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
checkPermission,
|
||||||
|
getList() {
|
||||||
|
this.listLoading = true;
|
||||||
|
getUnitTypeList(this.listQuery).then(response => {
|
||||||
|
if (response.data) {
|
||||||
|
this.unitList = response.data
|
||||||
|
}
|
||||||
|
this.listLoading = false
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleCreate() {
|
||||||
|
this.unittype = {
|
||||||
|
id: null,
|
||||||
|
name: null,
|
||||||
|
description: null,
|
||||||
|
standard:null,
|
||||||
|
implementrule:this.implementrule
|
||||||
|
}
|
||||||
|
this.dialogType = 'create'
|
||||||
|
this.dialogVisible = true
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs['Form'].clearValidate()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleUpdate(scope) {
|
||||||
|
this.unittype = Object.assign({}, scope.row) // copy obj
|
||||||
|
this.dialogType = 'update'
|
||||||
|
this.dialogVisible = true
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs['Form'].clearValidate()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleDelete(scope){
|
||||||
|
deleteUnitType(scope.row.id).then(res=>{
|
||||||
|
this.$notify({
|
||||||
|
title: '成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 2000
|
||||||
|
})
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
chooseComplete(val){
|
||||||
|
if(val){
|
||||||
|
this.unittype.standard_ = val
|
||||||
|
this.unittype.standard = val.id
|
||||||
|
}
|
||||||
|
this.chooseVisible = false
|
||||||
|
},
|
||||||
|
async confirm(form) {
|
||||||
|
this.$refs[form].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
const isEdit = this.dialogType === 'update'
|
||||||
|
if (isEdit) {
|
||||||
|
updateUnitType(this.unittype.id, this.unittype).then(() => {
|
||||||
|
this.getList()
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.$notify({
|
||||||
|
title: '成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 2000
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
createUnitType(this.unittype).then(res => {
|
||||||
|
this.getList()
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.$notify({
|
||||||
|
title: '成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 2000
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -0,0 +1,150 @@
|
||||||
|
<template>
|
||||||
|
<el-dialog title="选取标准" :visible.sync="chooseVisible_" width="80%">
|
||||||
|
<div>
|
||||||
|
<el-select
|
||||||
|
v-model="listQuery.type"
|
||||||
|
placeholder="标准状态"
|
||||||
|
clearable
|
||||||
|
style="width: 200px"
|
||||||
|
class="filter-item"
|
||||||
|
@change="handleFilter"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in statusOptions"
|
||||||
|
:key="item.key"
|
||||||
|
:label="item.display_name"
|
||||||
|
:value="item.key"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
<el-input
|
||||||
|
v-model="listQuery.search"
|
||||||
|
placeholder="编号/名称"
|
||||||
|
style="width: 300px;"
|
||||||
|
class="filter-item"
|
||||||
|
@keyup.enter.native="handleFilter"
|
||||||
|
/>
|
||||||
|
<el-button class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">搜索</el-button>
|
||||||
|
<el-button
|
||||||
|
class="filter-item"
|
||||||
|
style="margin-left: 10px;"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-refresh-left"
|
||||||
|
@click="resetFilter"
|
||||||
|
>刷新重置</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table
|
||||||
|
v-loading="listLoading"
|
||||||
|
:data="standardList.results"
|
||||||
|
style="width: 100%;margin-top:10px;"
|
||||||
|
border
|
||||||
|
fit
|
||||||
|
stripe
|
||||||
|
highlight-current-row
|
||||||
|
max-height="400"
|
||||||
|
@row-dblclick="chooseComplete"
|
||||||
|
>
|
||||||
|
<el-table-column type="index" width="50" />
|
||||||
|
<el-table-column label="标准编号">
|
||||||
|
<template slot-scope="scope">{{ scope.row.code }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="标准名称">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-link
|
||||||
|
type="primary"
|
||||||
|
:href="scope.row.path"
|
||||||
|
target="_blank"
|
||||||
|
v-if="scope.row.path"
|
||||||
|
>{{ scope.row.name }}</el-link>
|
||||||
|
<span v-else>{{ scope.row.name }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="发布日期">
|
||||||
|
<template slot-scope="scope">{{ scope.row.publish_date }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="实施日期">
|
||||||
|
<template slot-scope="scope">{{ scope.row.implement_date }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="状态">
|
||||||
|
<template slot-scope="scope">{{ scope.row.status }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination
|
||||||
|
v-show="standardList.count>0"
|
||||||
|
:total="standardList.count"
|
||||||
|
:page.sync="listQuery.page"
|
||||||
|
:limit.sync="listQuery.page_size"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getStandardList,
|
||||||
|
createStandard,
|
||||||
|
updateStandard,
|
||||||
|
deleteStandard
|
||||||
|
} from "@/api/standard";
|
||||||
|
import Pagination from "@/components/Pagination";
|
||||||
|
export default {
|
||||||
|
name: "Standardchoose",
|
||||||
|
components: { Pagination },
|
||||||
|
props:['chooseVisible'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
standardList: { count: 0 },
|
||||||
|
listLoading: true,
|
||||||
|
listQuery: {
|
||||||
|
page: 1,
|
||||||
|
page_size: 20
|
||||||
|
},
|
||||||
|
statusOptions: [
|
||||||
|
{ key: "现行", display_name: "现行" },
|
||||||
|
{ key: "即将实施", display_name: "即将实施" },
|
||||||
|
{ key: "作废", display_name: "作废" },
|
||||||
|
{ key: "废止", display_name: "废止" }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed:{
|
||||||
|
chooseVisible_: {
|
||||||
|
get() {
|
||||||
|
return this.chooseVisible;
|
||||||
|
},
|
||||||
|
set(val) {
|
||||||
|
this.$emit('chooseComplete',false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getList() {
|
||||||
|
this.listLoading = true;
|
||||||
|
getStandardList(this.listQuery).then(response => {
|
||||||
|
if (response.data) {
|
||||||
|
this.standardList = response.data;
|
||||||
|
}
|
||||||
|
this.listLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
resetFilter() {
|
||||||
|
this.listQuery = {
|
||||||
|
page: 1,
|
||||||
|
page_size: 20
|
||||||
|
};
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
handleFilter() {
|
||||||
|
this.listQuery.page = 1;
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
chooseComplete(row) {
|
||||||
|
console.log(row)
|
||||||
|
this.$emit('chooseComplete',row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -203,10 +203,7 @@ export default {
|
||||||
search:'',
|
search:'',
|
||||||
dictList: [],
|
dictList: [],
|
||||||
listLoading: true,
|
listLoading: true,
|
||||||
listQuery: {
|
listQuery: {},
|
||||||
page: 1,
|
|
||||||
page_size: 20
|
|
||||||
},
|
|
||||||
dgV1: false,
|
dgV1: false,
|
||||||
dgT1: 'new',
|
dgT1: 'new',
|
||||||
rule1: {
|
rule1: {
|
||||||
|
@ -239,7 +236,6 @@ export default {
|
||||||
return data.label.indexOf(value) !== -1
|
return data.label.indexOf(value) !== -1
|
||||||
},
|
},
|
||||||
handleDictTypeClick(obj, node, vue) {
|
handleDictTypeClick(obj, node, vue) {
|
||||||
this.listQuery.page = 1
|
|
||||||
this.listQuery.type = obj.id
|
this.listQuery.type = obj.id
|
||||||
this.getList()
|
this.getList()
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.0.7 on 2020-06-29 08:46
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('certset', '0006_implementrule_path'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='unittype',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(max_length=1000, unique=True, verbose_name='单元类型名'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -55,7 +55,7 @@ class ImplementRule(CommonAModel):
|
||||||
|
|
||||||
|
|
||||||
class UnitType(CommonAModel):
|
class UnitType(CommonAModel):
|
||||||
name = models.CharField('单元类型名', max_length=1000)
|
name = models.CharField('单元类型名', max_length=1000, unique=True)
|
||||||
standard = models.ForeignKey(Standard, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='采用标准', related_name='unittype_standard')
|
standard = models.ForeignKey(Standard, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='采用标准', related_name='unittype_standard')
|
||||||
implementrule = models.ForeignKey(ImplementRule, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='所属规则', related_name='unittype_implementrule')
|
implementrule = models.ForeignKey(ImplementRule, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='所属规则', related_name='unittype_implementrule')
|
||||||
description = models.TextField('描述', null=True, blank=True)
|
description = models.TextField('描述', null=True, blank=True)
|
||||||
|
|
|
@ -32,6 +32,13 @@ class ImplementRuleListSerializer(serializers.ModelSerializer):
|
||||||
return obj.get_cert_type_display()
|
return obj.get_cert_type_display()
|
||||||
|
|
||||||
class UnitTypeSerializer(serializers.ModelSerializer):
|
class UnitTypeSerializer(serializers.ModelSerializer):
|
||||||
|
standard_ = StandardSerializer(source='standard', read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UnitType
|
model = UnitType
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def setup_eager_loading(queryset):
|
||||||
|
""" Perform necessary eager loading of data. """
|
||||||
|
queryset = queryset.select_related('standard','implementrule')
|
||||||
|
return queryset
|
|
@ -40,5 +40,19 @@ class UnitTypedViewSet(ModelViewSet):
|
||||||
queryset = UnitType.objects
|
queryset = UnitType.objects
|
||||||
serializer_class = UnitTypeSerializer
|
serializer_class = UnitTypeSerializer
|
||||||
search_fields = ['name']
|
search_fields = ['name']
|
||||||
filterset_fields = ['name']
|
filterset_fields = ['name','implementrule']
|
||||||
ordering = ['-create_time']
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
def paginate_queryset(self, queryset):
|
||||||
|
"""
|
||||||
|
如果查询参数里没有page且含有参数implementrule则不分页,否则请求分页
|
||||||
|
"""
|
||||||
|
if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('implementrule', None))) or (self.paginator is None):
|
||||||
|
return None
|
||||||
|
return self.paginator.paginate_queryset(queryset, self.request, view=self)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
queryset = self.queryset
|
||||||
|
if hasattr(self.get_serializer_class(), 'setup_eager_loading'):
|
||||||
|
queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化
|
||||||
|
return queryset
|
|
@ -11,4 +11,4 @@ class EntBaseInfoViewSet(ModelViewSet):
|
||||||
serializer_class = StandardSerializer
|
serializer_class = StandardSerializer
|
||||||
search_fields = ['name', 'code', 'status', 'implement_date']
|
search_fields = ['name', 'code', 'status', 'implement_date']
|
||||||
filterset_fields = ['status']
|
filterset_fields = ['status']
|
||||||
ordering = ['-create_time']
|
ordering = ['-create_time']
|
|
@ -1,6 +1,7 @@
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
|
from django.db.models.query import QuerySet
|
||||||
|
|
||||||
class CreateUpdateModelAMixin:
|
class CreateUpdateModelAMixin:
|
||||||
"""
|
"""
|
||||||
|
@ -22,4 +23,29 @@ class CreateUpdateModelBMixin:
|
||||||
def perform_update(self, serializer):
|
def perform_update(self, serializer):
|
||||||
serializer.save(update_by = self.request.user)
|
serializer.save(update_by = self.request.user)
|
||||||
|
|
||||||
|
class CreateUpdateCustomMixin:
|
||||||
|
"""
|
||||||
|
整合
|
||||||
|
"""
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
if hasattr(self.queryset.model, 'belong_dept'):
|
||||||
|
serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
|
||||||
|
else:
|
||||||
|
serializer.save(create_by = self.request.user)
|
||||||
|
def perform_update(self, serializer):
|
||||||
|
serializer.save(update_by = self.request.user)
|
||||||
|
|
||||||
|
class OptimizationMixin:
|
||||||
|
"""
|
||||||
|
性能优化,需要在序列化器里定义setup_eager_loading,可在必要的View下继承
|
||||||
|
"""
|
||||||
|
def get_queryset(self):
|
||||||
|
queryset = self.queryset
|
||||||
|
if isinstance(queryset, QuerySet):
|
||||||
|
# Ensure queryset is re-evaluated on each request.
|
||||||
|
queryset = queryset.all()
|
||||||
|
if hasattr(self.get_serializer_class(), 'setup_eager_loading'):
|
||||||
|
queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,8 @@ def get_permission_list(user):
|
||||||
perms = perms | i.perms.all()
|
perms = perms | i.perms.all()
|
||||||
perms_list = perms.values_list('method', flat=True)
|
perms_list = perms.values_list('method', flat=True)
|
||||||
perms_list = list(set(perms_list))
|
perms_list = list(set(perms_list))
|
||||||
cache.set(user.username, perms_list)
|
cache.set(user.username + '__perms', perms_list)
|
||||||
cache.persist(user.username)
|
# cache.persist(user.username)
|
||||||
return perms_list
|
return perms_list
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ class RbacPermission(BasePermission):
|
||||||
:param view:
|
:param view:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
perms = cache.get(request.user)
|
perms = cache.get(request.user.username + '__perms')
|
||||||
if not perms:
|
if not perms:
|
||||||
perms = get_permission_list(request.user)
|
perms = get_permission_list(request.user)
|
||||||
if perms:
|
if perms:
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.db.models.query import QuerySet
|
from django.db.models.query import QuerySet
|
||||||
from rest_framework.generics import GenericAPIView
|
from rest_framework.generics import GenericAPIView
|
||||||
|
from apps.system.mixins import CreateUpdateModelBMixin
|
||||||
from utils.queryset import get_child_queryset2
|
from utils.queryset import get_child_queryset2
|
||||||
|
|
||||||
|
|
||||||
class RbacFilterSet(GenericAPIView):
|
class RbacFilterSet(CreateUpdateModelBMixin, GenericAPIView):
|
||||||
"""
|
"""
|
||||||
数据权限控权返回的queryset
|
数据权限控权返回的queryset
|
||||||
在必须的View下继承
|
在必须的View下继承
|
||||||
需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人)
|
需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人)
|
||||||
|
带性能优化
|
||||||
|
包括必要的创建和编辑操作
|
||||||
"""
|
"""
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
assert self.queryset is not None, (
|
assert self.queryset is not None, (
|
||||||
|
@ -47,7 +49,8 @@ class RbacFilterSet(GenericAPIView):
|
||||||
elif '仅本人' in data_range:
|
elif '仅本人' in data_range:
|
||||||
queryset = queryset.filter(Q(create_by=user)|Q(update_by=user))
|
queryset = queryset.filter(Q(create_by=user)|Q(update_by=user))
|
||||||
return queryset
|
return queryset
|
||||||
|
if hasattr(self.get_serializer_class(), 'setup_eager_loading'):
|
||||||
|
queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -85,8 +85,8 @@ class UserListSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = ('id', 'name', 'phone', 'email', 'position',
|
fields = ['id', 'name', 'phone', 'email', 'position',
|
||||||
'username', 'is_active', 'date_joined', 'dept_name', 'dept', 'roles', 'avatar')
|
'username', 'is_active', 'date_joined', 'dept_name', 'dept', 'roles', 'avatar']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def setup_eager_loading(queryset):
|
def setup_eager_loading(queryset):
|
||||||
|
|
|
@ -83,9 +83,11 @@ class DictViewSet(ModelViewSet):
|
||||||
|
|
||||||
def paginate_queryset(self, queryset):
|
def paginate_queryset(self, queryset):
|
||||||
"""
|
"""
|
||||||
如果查询参数里有type或type__code,则不分页,否则请求分页
|
如果查询参数里没有page但有type或type__code时则不分页,否则请求分页
|
||||||
"""
|
"""
|
||||||
if (self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None)) or (self.paginator is None):
|
if self.paginator is None:
|
||||||
|
return None
|
||||||
|
if (not self.request.query_params.get('page', None)) and ((self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None))):
|
||||||
return None
|
return None
|
||||||
return self.paginator.paginate_queryset(queryset, self.request, view=self)
|
return self.paginator.paginate_queryset(queryset, self.request, view=self)
|
||||||
|
|
||||||
|
@ -158,7 +160,7 @@ class UserViewSet(ModelViewSet):
|
||||||
"""
|
"""
|
||||||
perms_map = {'get': '*', 'post': 'user_create',
|
perms_map = {'get': '*', 'post': 'user_create',
|
||||||
'put': 'user_update', 'delete': 'user_delete'}
|
'put': 'user_update', 'delete': 'user_delete'}
|
||||||
queryset = User.objects.order_by('-id')
|
queryset = User.objects
|
||||||
serializer_class = UserListSerializer
|
serializer_class = UserListSerializer
|
||||||
filterset_class = UserFilter
|
filterset_class = UserFilter
|
||||||
search_fields = ['username', 'name', 'phone', 'email']
|
search_fields = ['username', 'name', 'phone', 'email']
|
||||||
|
|
|
@ -45,7 +45,7 @@ def get_child_queryset2(obj, hasParent=True):
|
||||||
'''
|
'''
|
||||||
获取所有子集
|
获取所有子集
|
||||||
obj实例
|
obj实例
|
||||||
数据表需包含pid字段
|
数据表需包含parent字段
|
||||||
是否包含父默认True
|
是否包含父默认True
|
||||||
'''
|
'''
|
||||||
cls = type(obj)
|
cls = type(obj)
|
||||||
|
|
Loading…
Reference in New Issue