From 7bdd1a6c8a5198a023e9069963f73803488f51c1 Mon Sep 17 00:00:00 2001
From: shilixia <2309368887@qq.com>
Date: Mon, 13 Dec 2021 10:48:19 +0800
Subject: [PATCH] =?UTF-8?q?=E5=92=A8=E8=AF=A2=E8=B5=84=E6=96=99=E5=88=86?=
=?UTF-8?q?=E4=BA=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
client/.env.development | 4 +-
client/package.json | 1 +
client/src/api/consulting.js | 31 ++
client/src/api/policy.js | 31 ++
client/src/api/professional.js | 31 ++
client/src/api/validation.js | 31 ++
client/src/router/index.js | 32 ++
client/src/views/consulting/policy.vue | 269 +++++++++++++++
client/src/views/consulting/professional.vue | 270 +++++++++++++++
client/src/views/consulting/regulatory.vue | 325 ++++++++++++++++++
client/src/views/consulting/validation.vue | 270 +++++++++++++++
client/src/views/supervision/mytask.vue | 2 +-
server/apps/consulting/__init__.py | 0
server/apps/consulting/admin.py | 3 +
server/apps/consulting/apps.py | 5 +
.../consulting/migrations/0001_initial.py | 39 +++
.../migrations/0002_professional.py | 36 ++
.../migrations/0003_policy_validation.py | 54 +++
server/apps/consulting/migrations/__init__.py | 0
server/apps/consulting/models.py | 47 +++
server/apps/consulting/serializers.py | 47 +++
server/apps/consulting/tests.py | 3 +
server/apps/consulting/urls.py | 13 +
server/apps/consulting/views.py | 51 +++
server/server/settings.py | 4 +-
server/server/urls.py | 2 +
26 files changed, 1597 insertions(+), 4 deletions(-)
create mode 100644 client/src/api/consulting.js
create mode 100644 client/src/api/policy.js
create mode 100644 client/src/api/professional.js
create mode 100644 client/src/api/validation.js
create mode 100644 client/src/views/consulting/policy.vue
create mode 100644 client/src/views/consulting/professional.vue
create mode 100644 client/src/views/consulting/regulatory.vue
create mode 100644 client/src/views/consulting/validation.vue
create mode 100644 server/apps/consulting/__init__.py
create mode 100644 server/apps/consulting/admin.py
create mode 100644 server/apps/consulting/apps.py
create mode 100644 server/apps/consulting/migrations/0001_initial.py
create mode 100644 server/apps/consulting/migrations/0002_professional.py
create mode 100644 server/apps/consulting/migrations/0003_policy_validation.py
create mode 100644 server/apps/consulting/migrations/__init__.py
create mode 100644 server/apps/consulting/models.py
create mode 100644 server/apps/consulting/serializers.py
create mode 100644 server/apps/consulting/tests.py
create mode 100644 server/apps/consulting/urls.py
create mode 100644 server/apps/consulting/views.py
diff --git a/client/.env.development b/client/.env.development
index aacde3e..c5200d4 100644
--- a/client/.env.development
+++ b/client/.env.development
@@ -3,8 +3,8 @@ ENV = 'development'
# base api
#VUE_APP_BASE_API = 'http://10.0.11.127:8000/api'
-#VUE_APP_BASE_API = 'http://127.0.0.1:8000/api'
-VUE_APP_BASE_API = 'https://testsearch.ctc.ac.cn/api'
+VUE_APP_BASE_API = 'http://127.0.0.1:8000/api'
+#VUE_APP_BASE_API = 'https://testsearch.ctc.ac.cn/api'
#VUE_APP_BASE_API = 'http://47.95.0.242:9101/api'
diff --git a/client/package.json b/client/package.json
index a7eed94..80319cf 100644
--- a/client/package.json
+++ b/client/package.json
@@ -17,6 +17,7 @@
"dependencies": {
"@riophae/vue-treeselect": "^0.4.0",
"axios": "0.18.1",
+ "element-china-area-data": "^5.0.2",
"element-ui": "2.13.0",
"file-saver": "^2.0.2",
"js-cookie": "2.2.0",
diff --git a/client/src/api/consulting.js b/client/src/api/consulting.js
new file mode 100644
index 0000000..6e595cf
--- /dev/null
+++ b/client/src/api/consulting.js
@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+
+export function createRegulatory(data) {
+ return request({
+ url: '/consulting/regulatory/',
+ method: 'post',
+ data
+ })
+}
+
+export function getRegulatoryList(query) {
+ return request({
+ url: '/consulting/regulatory/',
+ method: 'get',
+ params: query
+ })
+}
+export function deleteRegulatory(id) {
+ return request({
+ url: `/consulting/regulatory/${id}/`,
+ method: 'delete'
+ })
+}
+export function updateRegulatory(id, data) {
+ return request({
+ url: `/consulting/regulatory/${id}/`,
+ method: 'put',
+ data
+ })
+}
\ No newline at end of file
diff --git a/client/src/api/policy.js b/client/src/api/policy.js
new file mode 100644
index 0000000..3e437a2
--- /dev/null
+++ b/client/src/api/policy.js
@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+
+export function createPolicy(data) {
+ return request({
+ url: '/consulting/policy/',
+ method: 'post',
+ data
+ })
+}
+
+export function getPolicyList(query) {
+ return request({
+ url: '/consulting/policy/',
+ method: 'get',
+ params: query
+ })
+}
+export function deletePolicy(id) {
+ return request({
+ url: `/consulting/policy/${id}/`,
+ method: 'delete'
+ })
+}
+export function updatePolicy(id, data) {
+ return request({
+ url: `/consulting/policy/${id}/`,
+ method: 'put',
+ data
+ })
+}
\ No newline at end of file
diff --git a/client/src/api/professional.js b/client/src/api/professional.js
new file mode 100644
index 0000000..42bfca7
--- /dev/null
+++ b/client/src/api/professional.js
@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+
+export function createProfessional(data) {
+ return request({
+ url: '/consulting/professional/',
+ method: 'post',
+ data
+ })
+}
+
+export function getProfessionalList(query) {
+ return request({
+ url: '/consulting/professional/',
+ method: 'get',
+ params: query
+ })
+}
+export function deleteProfessional(id) {
+ return request({
+ url: `/consulting/professional/${id}/`,
+ method: 'delete'
+ })
+}
+export function updateProfessional(id, data) {
+ return request({
+ url: `/consulting/professional/${id}/`,
+ method: 'put',
+ data
+ })
+}
\ No newline at end of file
diff --git a/client/src/api/validation.js b/client/src/api/validation.js
new file mode 100644
index 0000000..3276f92
--- /dev/null
+++ b/client/src/api/validation.js
@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+
+export function createValidation(data) {
+ return request({
+ url: '/consulting/validation/',
+ method: 'post',
+ data
+ })
+}
+
+export function getValidationList(query) {
+ return request({
+ url: '/consulting/validation/',
+ method: 'get',
+ params: query
+ })
+}
+export function deleteValidation(id) {
+ return request({
+ url: `/consulting/validation/${id}/`,
+ method: 'delete'
+ })
+}
+export function updateValidation(id, data) {
+ return request({
+ url: `/consulting/validation/${id}/`,
+ method: 'put',
+ data
+ })
+}
\ No newline at end of file
diff --git a/client/src/router/index.js b/client/src/router/index.js
index aaba5cb..19bd7ba 100644
--- a/client/src/router/index.js
+++ b/client/src/router/index.js
@@ -136,6 +136,38 @@ export const asyncRoutes = [
},
]
+ }
+ ,
+ {
+ path: '/consulting',
+ component: Layout,
+ redirect: '/consulting/',
+ name: 'consulting',
+ meta: { title: '咨询资料分享', icon: 'guide', perms: ['regulatory_views'] },
+ alwaysShow: true,
+ children: [
+ {
+ path: 'regulatory',
+ name: 'regulatory',
+ component: () => import('@/views/consulting/regulatory.vue'),
+ meta: { title: '监管信息', perms: ['regulatory_view'] }
+ }, {
+ path: 'professional',
+ name: 'professional',
+ component: () => import('@/views/consulting/professional.vue'),
+ meta: { title: '专业领域要求', perms: ['professional_view'] }
+ }, {
+ path: 'policy',
+ name: 'policy',
+ component: () => import('@/views/consulting/policy.vue'),
+ meta: { title: '政策咨询', perms: ['policy_view'] }
+ }, {
+ path: 'validation',
+ name: 'validation',
+ component: () => import('@/views/consulting/validation.vue'),
+ meta: { title: '能力验证', perms: ['validation_view'] }
+ },
+ ]
},
{
path: '/supervision',
diff --git a/client/src/views/consulting/policy.vue b/client/src/views/consulting/policy.vue
new file mode 100644
index 0000000..5c62a84
--- /dev/null
+++ b/client/src/views/consulting/policy.vue
@@ -0,0 +1,269 @@
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+
+ {{ scope.row.file_.name }}
+
+
+
+ {{ scope.row.description }}
+
+
+ {{ scope.row.create_time }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传文件
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
diff --git a/client/src/views/consulting/professional.vue b/client/src/views/consulting/professional.vue
new file mode 100644
index 0000000..902db87
--- /dev/null
+++ b/client/src/views/consulting/professional.vue
@@ -0,0 +1,270 @@
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+
+ {{ scope.row.file_.name }}
+
+
+
+ {{ scope.row.description }}
+
+
+ {{ scope.row.create_time }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传文件
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
diff --git a/client/src/views/consulting/regulatory.vue b/client/src/views/consulting/regulatory.vue
new file mode 100644
index 0000000..94196f3
--- /dev/null
+++ b/client/src/views/consulting/regulatory.vue
@@ -0,0 +1,325 @@
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+ {{ type_[scope.row.type] }}
+
+
+ {{ scope.row.provinces }}
+
+
+
+ {{ scope.row.file_.name }}
+
+
+
+ {{ scope.row.description }}
+
+
+ {{ scope.row.create_time }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 通知
+ 结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传文件
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
diff --git a/client/src/views/consulting/validation.vue b/client/src/views/consulting/validation.vue
new file mode 100644
index 0000000..f1bc81c
--- /dev/null
+++ b/client/src/views/consulting/validation.vue
@@ -0,0 +1,270 @@
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+
+ {{ scope.row.file_.name }}
+
+
+
+ {{ scope.row.description }}
+
+
+ {{ scope.row.create_time }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传文件
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
diff --git a/client/src/views/supervision/mytask.vue b/client/src/views/supervision/mytask.vue
index 60ff3b1..9149fad 100644
--- a/client/src/views/supervision/mytask.vue
+++ b/client/src/views/supervision/mytask.vue
@@ -136,7 +136,7 @@ export default {
},
handleFilter() {
this.listQuery.page = 1;
-
+
this.getList();
},
handleDo(val){
diff --git a/server/apps/consulting/__init__.py b/server/apps/consulting/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/consulting/admin.py b/server/apps/consulting/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/server/apps/consulting/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/server/apps/consulting/apps.py b/server/apps/consulting/apps.py
new file mode 100644
index 0000000..b3c0c5a
--- /dev/null
+++ b/server/apps/consulting/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class QualityConfig(AppConfig):
+ name = 'consulting'
diff --git a/server/apps/consulting/migrations/0001_initial.py b/server/apps/consulting/migrations/0001_initial.py
new file mode 100644
index 0000000..1c067e9
--- /dev/null
+++ b/server/apps/consulting/migrations/0001_initial.py
@@ -0,0 +1,39 @@
+# Generated by Django 3.0.5 on 2021-12-13 01:56
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0018_auto_20210430_1156'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Regulatory',
+ 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=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('provinces', models.CharField(default='', max_length=100, verbose_name='省份')),
+ ('type', models.CharField(choices=[(1, '通知'), (2, '结果')], default=1, max_length=50, verbose_name='材料类别')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='regulatory_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='regulatory_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '监管信息',
+ 'verbose_name_plural': '监管信息',
+ },
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/0002_professional.py b/server/apps/consulting/migrations/0002_professional.py
new file mode 100644
index 0000000..a784eca
--- /dev/null
+++ b/server/apps/consulting/migrations/0002_professional.py
@@ -0,0 +1,36 @@
+# Generated by Django 3.0.5 on 2021-12-13 02:11
+
+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', '0018_auto_20210430_1156'),
+ ('consulting', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Professional',
+ 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=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='professional_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='professional_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '专业领域要求',
+ 'verbose_name_plural': '专业领域要求',
+ },
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/0003_policy_validation.py b/server/apps/consulting/migrations/0003_policy_validation.py
new file mode 100644
index 0000000..10e2407
--- /dev/null
+++ b/server/apps/consulting/migrations/0003_policy_validation.py
@@ -0,0 +1,54 @@
+# Generated by Django 3.0.5 on 2021-12-13 02:34
+
+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', '0018_auto_20210430_1156'),
+ ('consulting', '0002_professional'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Validation',
+ 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=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='validation_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='validation_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '政策咨询',
+ 'verbose_name_plural': '政策咨询',
+ },
+ ),
+ migrations.CreateModel(
+ name='Policy',
+ 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=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='policy_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='policy_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '政策咨询',
+ 'verbose_name_plural': '政策咨询',
+ },
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/__init__.py b/server/apps/consulting/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/consulting/models.py b/server/apps/consulting/models.py
new file mode 100644
index 0000000..91c6ee1
--- /dev/null
+++ b/server/apps/consulting/models.py
@@ -0,0 +1,47 @@
+from django.db import models
+from utils.model import BaseModel
+from apps.system.models import CommonAModel, File
+# Create your models here.
+
+
+class Regulatory(CommonAModel):
+ type_choices = (
+ (1, '通知'),
+ (2, '结果')
+ )
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+ provinces=models.CharField('省份', max_length=100, default="",)
+ type = models.CharField('材料类别', max_length=50,
+ choices=type_choices, default=1)
+ class Meta:
+ verbose_name = '监管信息'
+ verbose_name_plural = verbose_name
+class Professional(CommonAModel):
+
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+
+ class Meta:
+ verbose_name = '专业领域要求'
+ verbose_name_plural = verbose_name
+class Policy(CommonAModel):
+
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+
+ class Meta:
+ verbose_name = '政策咨询'
+ verbose_name_plural = verbose_name
+class Validation(CommonAModel):
+
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+
+ class Meta:
+ verbose_name = '政策咨询'
+ verbose_name_plural = verbose_name
\ No newline at end of file
diff --git a/server/apps/consulting/serializers.py b/server/apps/consulting/serializers.py
new file mode 100644
index 0000000..f8a589e
--- /dev/null
+++ b/server/apps/consulting/serializers.py
@@ -0,0 +1,47 @@
+from re import template
+from django.db.models.base import Model
+from rest_framework import serializers
+from .models import *
+from apps.system.serializers import FileSerializer
+from rest_framework.exceptions import ParseError, APIException
+
+class RegulatorySerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Regulatory
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
+class ProfessionalSerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Professional
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
+class PolicySerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Policy
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
+class ValidationSerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Validation
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
\ No newline at end of file
diff --git a/server/apps/consulting/tests.py b/server/apps/consulting/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/server/apps/consulting/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/server/apps/consulting/urls.py b/server/apps/consulting/urls.py
new file mode 100644
index 0000000..fc59a21
--- /dev/null
+++ b/server/apps/consulting/urls.py
@@ -0,0 +1,13 @@
+from django.urls import path, include
+from rest_framework import routers
+from .views import RegulatoryViewSet,ProfessionalViewSet,PolicyViewSet,ValidationViewSet
+
+router = routers.DefaultRouter()
+router.register('regulatory', RegulatoryViewSet, basename='regulatory')
+router.register('professional', ProfessionalViewSet, basename='professional')
+router.register('policy', PolicyViewSet, basename='policy')
+router.register('validation', ValidationViewSet, basename='validation')
+urlpatterns = [
+ path('', include(router.urls))
+]
+
diff --git a/server/apps/consulting/views.py b/server/apps/consulting/views.py
new file mode 100644
index 0000000..f28fc63
--- /dev/null
+++ b/server/apps/consulting/views.py
@@ -0,0 +1,51 @@
+from django.conf import settings
+from django.core.cache import cache
+from django.db.models import Count, Q
+from django.db.models.query import QuerySet
+from django.http import request
+from django.shortcuts import render
+from django.utils import timezone
+from rest_framework import status
+from rest_framework.decorators import action, permission_classes
+from rest_framework.exceptions import PermissionDenied
+from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin
+from rest_framework.permissions import IsAdminUser
+from rest_framework.response import Response
+from rest_framework.viewsets import GenericViewSet, ModelViewSet
+from utils.pagination import PageOrNot
+
+from apps.system.mixins import CreateUpdateCustomMixin, CreateUpdateModelAMixin, OptimizationMixin
+from apps.system.models import Organization
+from apps.system.permission import get_permission_list, has_permission
+from apps.system.permission_data import RbacFilterSet
+
+from .models import *
+from .serializers import *
+# Create your views here.
+class RegulatoryViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'regulatory_create',
+ 'put': 'regulatory_update', 'delete': 'regulatory_delete'}
+ queryset = Regulatory.objects.all()
+ serializer_class = RegulatorySerializer
+ ordering = ['-id']
+ search_fields = ['provinces']
+ ordering_fields = ['provinces']
+ filterset_fields = ['provinces']
+class ProfessionalViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'professional_create',
+ 'put': 'professional_update', 'delete': 'professional_delete'}
+ queryset = Professional.objects.all()
+ serializer_class = ProfessionalSerializer
+ ordering = ['-id']
+class PolicyViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'policy_create',
+ 'put': 'policy_update', 'delete': 'policy_delete'}
+ queryset = Policy.objects.all()
+ serializer_class = PolicySerializer
+ ordering = ['-id']
+class ValidationViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'validation_create',
+ 'put': 'policy_update', 'delete': 'validation_delete'}
+ queryset = Validation.objects.all()
+ serializer_class = ValidationSerializer
+ ordering = ['-id']
diff --git a/server/server/settings.py b/server/server/settings.py
index a822c57..8ef3c8a 100644
--- a/server/server/settings.py
+++ b/server/server/settings.py
@@ -46,7 +46,9 @@ INSTALLED_APPS = [
'apps.ability',
'apps.supervision',
'apps.quality',
- 'apps.vod'
+ 'apps.vod',
+ 'apps.consulting'
+
]
MIDDLEWARE = [
diff --git a/server/server/urls.py b/server/server/urls.py
index 6eb991f..3140f0b 100644
--- a/server/server/urls.py
+++ b/server/server/urls.py
@@ -48,6 +48,8 @@ urlpatterns = [
path('api/supervision/', include('apps.supervision.urls')),
path('api/quality/', include('apps.quality.urls')),
path('api/vod/', include('apps.vod.urls')),
+ path('api/consulting/', include('apps.consulting.urls')),
+
path('api/docs/', include_docs_urls(title="接口文档",authentication_classes=[], permission_classes=[])),
path('api/', include(router.urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)