This commit is contained in:
caoqianming 2020-06-16 16:50:34 +08:00
parent b160e93cb5
commit 2a317a1806
12 changed files with 533 additions and 29 deletions

View File

@ -1,7 +1,7 @@
import { getToken } from "@/utils/auth"
import request from '@/utils/request'
export function uploadUrl() {
export function upUrl() {
return process.env.VUE_APP_BASE_API + '/file/'
}

View File

@ -0,0 +1,32 @@
import request from '@/utils/request'
export function getImplementRuleList(query) {
return request({
url: '/certset/implementrule/',
method: 'get',
params: query
})
}
export function createImplementRule(data) {
return request({
url: '/certset/implementrule/',
method: 'post',
data
})
}
export function updateImplementRule(id, data) {
return request({
url: `/certset/implementrule/${id}/`,
method: 'put',
data
})
}
export function deleteImplementRule(id) {
return request({
url: `/certset/implementrule/${id}/`,
method: 'delete'
})
}

View File

@ -0,0 +1,32 @@
import request from '@/utils/request'
export function getStandardList(query) {
return request({
url: '/certset/standard/',
method: 'get',
params: query
})
}
export function createStandard(data) {
return request({
url: '/certset/standard/',
method: 'post',
data
})
}
export function updateStandard(id, data) {
return request({
url: `/certset/standard/${id}/`,
method: 'put',
data
})
}
export function deleteStandard(id) {
return request({
url: `/certset/standard/${id}/`,
method: 'delete'
})
}

View File

@ -61,6 +61,27 @@ export const constantRoutes = [
* the routes that need to be dynamically loaded based on user perms
*/
export const asyncRoutes = [
{
path: '/certset',
component: Layout,
redirect: '/certset/implementrule',
name: 'certset',
meta: { title: '认证配置', icon: 'example'},
children: [
{
path: 'implementrule',
name: 'ImplementRule',
component: () => import('@/views/implementrule/implementrule'),
meta: { title: '认证规则', icon: 'example', perms: ['implementrule_manage'] }
},
{
path: 'standard',
name: 'Standard',
component: () => import('@/views/standard/standard'),
meta: { title: '标准库', icon: 'example', perms: ['standard_manage'] }
}
]
},
{
path: '/system',
component: Layout,
@ -71,7 +92,7 @@ export const asyncRoutes = [
{
path: 'user',
name: 'User',
component: () => import('@/views/system/user.vue'),
component: () => import('@/views/system/user'),
meta: { title: '用户管理', icon: 'user', perms: ['user_manage'] }
},
{

View File

@ -0,0 +1,132 @@
<template>
<div class="app-container">
<div>
<el-select
v-model="listQuery.type"
placeholder="文件类型"
clearable
style="width: 200px"
class="filter-item"
@change="handleFilter"
>
<el-option
v-for="item in enabledOptions"
: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="fileList.results"
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">
<el-link type="primary" :href="scope.row.file" target="_blank">{{ scope.row.name }}</el-link>
</template>
</el-table-column>
<el-table-column align="header-center" label="类型">
<template slot-scope="scope">{{ scope.row.type }}</template>
</el-table-column>
<el-table-column align="header-center" label="格式">
<template slot-scope="scope">{{ scope.row.mime }}</template>
</el-table-column>
<el-table-column align="header-center" label="大小(B)">
<template slot-scope="scope">{{ scope.row.size }}</template>
</el-table-column>
<el-table-column align="header-center" label="地址">
<template slot-scope="scope">{{ scope.row.path }}</template>
</el-table-column>
<el-table-column label="上传日期">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
</el-table>
<pagination
v-show="fileList.count>0"
:total="fileList.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
</div>
</template>
<script>
import { getFileList } from "@/api/file"
import Pagination from "@/components/Pagination"
export default {
components: { Pagination },
data() {
return {
fileList: {count:0},
listLoading: true,
listQuery: {
page: 1,
page_size: 20
},
enabledOptions: [
{ key: "文档", display_name: "文档" },
{ key: "图片", display_name: "图片" },
{ key: "音频", display_name: "音频" },
{ key: "视频", display_name: "视频" },
{ key: "其它", display_name: "其它" }
],
};
},
created() {
this.getList();
},
methods: {
getList() {
this.listLoading = true;
getFileList(this.listQuery).then(response => {
if (response.data) {
this.fileList = response.data
}
this.listLoading = false;
});
},
resetFilter() {
this.listQuery = {
page: 1,
page_size: 20
};
this.getList();
},
handleFilter() {
this.listQuery.page = 1;
this.getList();
},
}
};
</script>

View File

@ -0,0 +1,215 @@
<template>
<div class="app-container">
<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>
<div style="margin-top:6px">
<el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</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="600"
>
<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 :visible.sync="dialogVisible" :title="dialogType==='update'?'编辑标准':'新增标准'">
<el-form
ref="Form"
:model="standard"
label-width="80px"
label-position="right"
:rules="rule1"
>
<el-form-item label="状态" prop="status">
<el-select
v-model="standard.status"
>
<el-option
v-for="item in statusOptions"
:key="item.key"
:label="item.display_name"
:value="item.key"
/>
</el-select>
</el-form-item>
<el-form-item label="编号" prop="code">
<el-input v-model="standard.code" placeholder="编号" />
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="standard.name" placeholder="名称" />
</el-form-item>
<el-form-item label="发布日期" prop="publish_date">
<el-date-picker
v-model="standard.publish_date"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
<el-form-item label="实施日期" prop="implement_date">
<el-date-picker
v-model="standard.implement_date"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-form>
<el-form-item label="文件" prop="path">
<el-upload
v-if="standard.path"
:action="upUrl"
:headers="upHeaders"
:show-file-list="false"
:limit="1"
>
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</el-form-item>
<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>
</div>
</template>
<script>
import { getStandardList } from "@/api/standard"
import { upUrl, upHeaders} from "@/api/file"
import Pagination from "@/components/Pagination"
const defaultStandard = {
id:null,
code:null,
name:null,
publish_date:null,
implement_date:null,
status:'现行'
}
export default {
components: { Pagination },
data() {
return {
upHeaders: upHeaders(),
upUrl: upUrl(),
standardList: {count:0},
standard:Object.assign({}, defaultStandard),
listLoading: true,
listQuery: {
page: 1,
page_size: 20
},
statusOptions: [
{ key: "现行", display_name: "现行" },
{ key: "即将实施", display_name: "即将实施" },
{ key: "作废", display_name: "作废" },
{ key: "废止", display_name: "废止" }
],
dialogVisible:false,
dialogType:'create',
rule1:{
code: [{ required: true, message: "请输入编号", trigger: "blur" }],
name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
publish_date: [{ required: true, message: "请输入发布日期", trigger: "change" }],
implement_date: [{ required: true, message: "请输入实施日期", trigger: "change" }],
status: [{ required: true, message: "请选择状态", trigger: "change" }]
}
};
},
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();
},
handleAdd() {
this.standard = Object.assign({}, defaultStandard);
this.dialogType = "create";
this.dialogVisible = true;
this.$nextTick(() => {
this.$refs["Form"].clearValidate();
});
},
}
};
</script>

View File

@ -143,7 +143,7 @@
<el-form-item label="头像" prop="dept">
<el-upload
class="avatar-uploader"
:action="uploadUrl"
:action="upUrl"
accept="image/jpeg, image/gif, image/png, image/bmp"
:show-file-list="false"
:on-success="handleAvatarSuccess"
@ -193,7 +193,7 @@ import { getOrgAll } from "@/api/org"
import { getRoleAll } from "@/api/role"
import { genTree } from "@/utils"
import checkPermission from "@/utils/permission"
import { uploadUrl, upHeaders } from "@/api/file"
import { upUrl, upHeaders } from "@/api/file"
import Pagination from "@/components/Pagination" // secondary package based on el-pagination
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
@ -210,7 +210,7 @@ export default {
return {
user: defaultUser,
upHeaders: upHeaders(),
uploadUrl: uploadUrl(),
upUrl: upUrl(),
userList: {count:0},
roles: [],
listLoading: true,

View File

@ -0,0 +1,70 @@
# Generated by Django 3.0.7 on 2020-06-16 03:58
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('system', '0019_auto_20200612_1448'),
('certset', '0002_auto_20200615_1707'),
]
operations = [
migrations.CreateModel(
name='UnitType',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('name', models.CharField(max_length=1000, verbose_name='单元类型名')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unittype_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
],
options={
'verbose_name': '单元类型',
'verbose_name_plural': '单元类型',
},
),
migrations.RemoveField(
model_name='implementrule',
name='units',
),
migrations.AddField(
model_name='implementrule',
name='ccc_list',
field=models.ManyToManyField(blank=True, related_name='implementrule_ccc_list', to='system.Dict', verbose_name='CCC产品认证目录'),
),
migrations.AlterField(
model_name='implementrule',
name='pv_scope',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='implementrule_pv_scope', to='system.Dict', verbose_name='自愿性产品认证领域'),
),
migrations.AlterField(
model_name='implementrule',
name='standards',
field=models.ManyToManyField(blank=True, related_name='implementrules_standards', to='certset.Standard', verbose_name='依据标准'),
),
migrations.DeleteModel(
name='Unit',
),
migrations.AddField(
model_name='unittype',
name='implementrule',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unittype_implementrule', to='certset.ImplementRule', verbose_name='所属规则'),
),
migrations.AddField(
model_name='unittype',
name='standard',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unittype_standard', to='certset.Standard', verbose_name='采用标准'),
),
migrations.AddField(
model_name='unittype',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unittype_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
]

View File

@ -24,23 +24,14 @@ class Standard(CommonAModel):
def __str__(self):
return self.name
class Unit(CommonAModel):
name = models.CharField('单元名称', max_length=1000)
class Meta:
verbose_name = '产品单元'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class ImplementRule(CommonAModel):
name = models.CharField('规则名称', max_length=1000)
code = models.CharField('编号', max_length=30, unique=True)
units = models.ManyToManyField(Unit, blank=True, verbose_name='单元划分', related_name='implementrule_units')
standards = models.ManyToManyField(Standard, blank=True, verbose_name='依据标准', related_name='implementrule_standards')
pv_scope = models.ForeignKey(Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='认证领域', related_name= 'implementrule_pv_scope')
standards = models.ManyToManyField(Standard, blank=True, verbose_name='依据标准', related_name='implementrules_standards')
ccc_list = models.ManyToManyField(Dict, blank=True, verbose_name='CCC产品认证目录', related_name= 'implementrule_ccc_list')
pv_scope = models.ForeignKey(Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='自愿性产品认证领域', related_name= 'implementrule_pv_scope')
pv_class = models.ForeignKey(Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='自愿性产品认证产品', related_name= 'implementrule_pv_class')
cnas_scope = models.ManyToManyField(Dict, blank=True, verbose_name='CNAS业务范围', related_name= 'implementrule_cnas_scope')
economy_class = models.ManyToManyField(Dict, blank=True, verbose_name='国民经济分类', related_name= 'implementrule_economy_class')
@ -54,5 +45,16 @@ class ImplementRule(CommonAModel):
return self.name
class UnitType(CommonAModel):
name = models.CharField('单元类型名', max_length=1000)
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')
description = models.TextField('描述', null=True, blank=True)
class Meta:
verbose_name = '单元类型'
verbose_name_plural = verbose_name
def __str__(self):
return self.name

View File

@ -1,6 +1,6 @@
from rest_framework import serializers
from .models import Standard, Unit, ImplementRule
from .models import Standard, UnitType, ImplementRule
class StandardSerializer(serializers.ModelSerializer):
@ -13,7 +13,7 @@ class ImplementRuleSerializer(serializers.ModelSerializer):
model = ImplementRule
fields = '__all__'
class UnitSerializer(serializers.ModelSerializer):
class UnitTypeSerializer(serializers.ModelSerializer):
class Meta:
model = Unit
model = UnitType
fields = '__all__'

View File

@ -1,10 +1,10 @@
from django.urls import path, include
from .views import StandardViewSet, UnitdViewSet, ImplementRuleViewSet
from .views import StandardViewSet, UnitTypedViewSet, ImplementRuleViewSet
from rest_framework import routers
router = routers.DefaultRouter()
router.register('standard', StandardViewSet, basename="standard")
router.register('unit', UnitdViewSet, basename="unit")
router.register('unittype', UnitTypedViewSet, basename="unittype")
router.register('implementrule', ImplementRuleViewSet, basename="implementrule")
urlpatterns = [

View File

@ -1,7 +1,7 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from .models import Standard, Unit, ImplementRule
from .serializers import StandardSerializer, ImplementRuleSerializer, UnitSerializer
from .models import Standard, UnitType, ImplementRule
from .serializers import StandardSerializer, ImplementRuleSerializer, UnitTypeSerializer
# Create your views here.
class StandardViewSet(ModelViewSet):
@ -22,11 +22,11 @@ class ImplementRuleViewSet(ModelViewSet):
filterset_fields = ['pv_scope']
ordering = ['-create_time']
class UnitdViewSet(ModelViewSet):
perms_map = {'get': '*', 'post': 'unit_create',
'put': 'unit_update', 'delete': 'unit_delete'}
queryset = Unit.objects
serializer_class = UnitSerializer
class UnitTypedViewSet(ModelViewSet):
perms_map = {'get': '*', 'post': 'unittype_create',
'put': 'unittype_update', 'delete': 'unittype_delete'}
queryset = UnitType.objects
serializer_class = UnitTypeSerializer
search_fields = ['name']
filterset_fields = ['name']
ordering = ['-create_time']