原型搭建基本完成

This commit is contained in:
caoqianming 2021-06-04 09:18:11 +08:00
parent 870ba7ef21
commit 8071f27a3b
8 changed files with 229 additions and 13 deletions

View File

@ -1,24 +1,41 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.admin.decorators import register from django.contrib.admin.decorators import register
from .models import BaseInfo, WorkExperience, Paper, Project, Award from .models import Expert, WorkExperience, Paper, Project, Award
from simple_history.admin import SimpleHistoryAdmin
# Register your models here. # Register your models here.
class WorkExperienceInline(admin.StackedInline):
model = WorkExperience
extra = 0
fields = ('expert', 'name','start_date', 'post')
@admin.register(BaseInfo) @admin.register(Expert)
class BaseInfoAdmin(admin.ModelAdmin): class ExpertAdmin(SimpleHistoryAdmin):
pass date_hierarchy = 'create_time'
list_display = ('name', 'gender','idnumber', 'create_time')
search_fields = ("name", "workexperience_expert__name", "paper_expert__name", "project_expert__name", "award_expert__name")
inlines = [
WorkExperienceInline,
]
@admin.register(WorkExperience) @admin.register(WorkExperience)
class WorkExperienceAdmin(admin.ModelAdmin): class WorkExperienceAdmin(admin.ModelAdmin):
pass date_hierarchy = 'start_date'
list_display = ('expert', 'name','start_date', 'post')
@admin.register(Paper) @admin.register(Paper)
class PaperAdmin(admin.ModelAdmin): class PaperAdmin(admin.ModelAdmin):
pass date_hierarchy = 'publish_date'
list_display = ('expert', 'name','is_leader', 'publish_date')
list_filter = ('is_leader',)
@admin.register(Project) @admin.register(Project)
class ProjectAdmin(admin.ModelAdmin): class ProjectAdmin(admin.ModelAdmin):
pass date_hierarchy = 'start_date'
list_display = ('expert', 'name','number', 'content', 'start_date')
@admin.register(Award) @admin.register(Award)
class AwardAdmin(admin.ModelAdmin): class AwardAdmin(admin.ModelAdmin):
pass date_hierarchy = 'issue_date'
list_display = ('expert', 'name','level', 'issue_date')
list_filter = ('level',)

View File

@ -0,0 +1,128 @@
# Generated by Django 3.1.8 on 2021-06-03 05:22
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 = [
('system', '0002_auto_20210602_1459'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('expert', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Award',
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='名称')),
('level', models.CharField(choices=[('省部级', '省部级')], max_length=60, verbose_name='级别')),
('issue_date', models.DateField(verbose_name='颁发日期')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='award_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
],
options={
'verbose_name': '专家获奖/荣誉',
'verbose_name_plural': '专家获奖/荣誉',
},
),
migrations.CreateModel(
name='Expert',
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='姓名')),
('gender', models.CharField(choices=[('', ''), ('', '')], default='', max_length=10, verbose_name='性别')),
('idnumber', models.CharField(max_length=40, verbose_name='身份证号')),
('paddress', models.TextField(verbose_name='通讯地址')),
('photo', models.CharField(blank=True, max_length=100, null=True, verbose_name='证件照')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expert_belong_dept', to='system.organization', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expert_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expert_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='expert_user', to=settings.AUTH_USER_MODEL, verbose_name='关联账户')),
],
options={
'verbose_name': '专家基本信息',
'verbose_name_plural': '专家基本信息',
},
),
migrations.CreateModel(
name='Paper',
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='名称')),
('is_leader', models.BooleanField(default=True, verbose_name='是否第一作者')),
('publish_date', models.DateField(verbose_name='发表日期')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paper_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('expert', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='paper_expert', to='expert.expert', verbose_name='所属专家')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paper_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '专家论文/著作',
'verbose_name_plural': '专家论文/著作',
},
),
migrations.CreateModel(
name='Project',
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='名称')),
('number', models.CharField(max_length=100, verbose_name='项目编号')),
('start_date', models.DateField(verbose_name='开始日期')),
('content', models.TextField(verbose_name='主要工作内容')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='project_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('expert', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='project_expert', to='expert.expert', verbose_name='所属专家')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='project_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '专家项目',
'verbose_name_plural': '专家项目',
},
),
migrations.CreateModel(
name='WorkExperience',
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='单位名')),
('start_date', models.DateField(verbose_name='开始日期')),
('post', models.CharField(max_length=100, verbose_name='职务/岗位')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='workexperience_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('expert', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workexperience_expert', to='expert.expert', verbose_name='所属专家')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='workexperience_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '专家工作经历',
'verbose_name_plural': '专家工作经历',
},
),
migrations.DeleteModel(
name='BaseInfo',
),
migrations.AddField(
model_name='award',
name='expert',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='award_expert', to='expert.expert', verbose_name='所属专家'),
),
migrations.AddField(
model_name='award',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='award_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
]

View File

@ -0,0 +1,48 @@
# Generated by Django 3.1.8 on 2021-06-03 07:09
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import simple_history.models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('system', '0002_auto_20210602_1459'),
('expert', '0002_auto_20210603_1322'),
]
operations = [
migrations.CreateModel(
name='HistoricalExpert',
fields=[
('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(blank=True, editable=False, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('name', models.CharField(max_length=100, verbose_name='姓名')),
('gender', models.CharField(choices=[('', ''), ('', '')], default='', max_length=10, verbose_name='性别')),
('idnumber', models.CharField(max_length=40, verbose_name='身份证号')),
('paddress', models.TextField(verbose_name='通讯地址')),
('photo', models.CharField(blank=True, max_length=100, null=True, verbose_name='证件照')),
('history_id', models.AutoField(primary_key=True, serialize=False)),
('history_date', models.DateTimeField()),
('history_change_reason', models.CharField(max_length=100, null=True)),
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
('belong_dept', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='system.organization', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
('update_by', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
('user', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='关联账户')),
],
options={
'verbose_name': 'historical 专家基本信息',
'ordering': ('-history_date', '-history_id'),
'get_latest_by': 'history_date',
},
bases=(simple_history.models.HistoricalChanges, models.Model),
),
]

View File

@ -1,21 +1,23 @@
from django.db import models from django.db import models
from utils.model import SoftModel, BaseModel from utils.model import SoftModel, BaseModel
from apps.system.models import CommonAModel, CommonBModel, User from apps.system.models import CommonAModel, CommonBModel, User
from simple_history.models import HistoricalRecords
# Create your models here. # Create your models here.
class BaseInfo(CommonBModel): class Expert(CommonBModel):
gender_choices = ( gender_choices = (
('', ''), ('', ''),
('', ''), ('', ''),
) )
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name="关联账户") user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name="关联账户", related_name="expert_user")
name = models.CharField(verbose_name="姓名", max_length=100) name = models.CharField(verbose_name="姓名", max_length=100)
gender = models.CharField(verbose_name="性别",choices=gender_choices, default='', max_length=10) gender = models.CharField(verbose_name="性别",choices=gender_choices, default='', max_length=10)
idnumber = models.CharField(verbose_name="身份证号", max_length=40) idnumber = models.CharField(verbose_name="身份证号", max_length=40)
paddress = models.TextField(verbose_name="通讯地址") paddress = models.TextField(verbose_name="通讯地址")
photo = models.CharField(verbose_name="证件照", max_length=100, null=True, blank=True) photo = models.CharField(verbose_name="证件照", max_length=100, null=True, blank=True)
history = HistoricalRecords()
class Meta: class Meta:
verbose_name = '专家基本信息' verbose_name = '专家基本信息'
@ -27,6 +29,9 @@ class BaseInfo(CommonBModel):
class WorkExperience(CommonAModel): class WorkExperience(CommonAModel):
name = models.CharField(verbose_name="单位名", max_length=100) name = models.CharField(verbose_name="单位名", max_length=100)
start_date = models.DateField(verbose_name="开始日期")
post = models.CharField(verbose_name="职务/岗位", max_length=100)
expert = models.ForeignKey(Expert, on_delete=models.CASCADE, verbose_name="所属专家", related_name="workexperience_expert")
class Meta: class Meta:
verbose_name = '专家工作经历' verbose_name = '专家工作经历'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
@ -37,6 +42,10 @@ class WorkExperience(CommonAModel):
class Project(CommonAModel): class Project(CommonAModel):
name = models.CharField(verbose_name="名称", max_length=100) name = models.CharField(verbose_name="名称", max_length=100)
number = models.CharField(verbose_name="项目编号", max_length=100)
start_date = models.DateField(verbose_name="开始日期")
content = models.TextField(verbose_name="主要工作内容")
expert = models.ForeignKey(Expert, on_delete=models.CASCADE, verbose_name="所属专家", related_name="project_expert")
class Meta: class Meta:
verbose_name = '专家项目' verbose_name = '专家项目'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
@ -47,6 +56,9 @@ class Project(CommonAModel):
class Paper(CommonAModel): class Paper(CommonAModel):
name = models.CharField(verbose_name="名称", max_length=100) name = models.CharField(verbose_name="名称", max_length=100)
is_leader = models.BooleanField(verbose_name="是否第一作者", default=True)
publish_date = models.DateField(verbose_name="发表日期")
expert = models.ForeignKey(Expert, on_delete=models.CASCADE, verbose_name="所属专家", related_name="paper_expert")
class Meta: class Meta:
verbose_name = '专家论文/著作' verbose_name = '专家论文/著作'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
@ -57,7 +69,14 @@ class Paper(CommonAModel):
class Award(CommonAModel): class Award(CommonAModel):
level_choices = (
('省部级', '省部级'),
)
name = models.CharField(verbose_name="名称", max_length=100) name = models.CharField(verbose_name="名称", max_length=100)
level = models.CharField(verbose_name="级别", choices=level_choices, max_length=60)
issue_date = models.DateField(verbose_name="颁发日期")
expert = models.ForeignKey(Expert, on_delete=models.CASCADE, verbose_name="所属专家", related_name="award_expert")
class Meta: class Meta:
verbose_name = '专家获奖/荣誉' verbose_name = '专家获奖/荣誉'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name

View File

@ -3,7 +3,7 @@ from simple_history.admin import SimpleHistoryAdmin
from .models import User, Organization, Role, Permission, DictType, Dict, File from .models import User, Organization, Role, Permission, DictType, Dict, File
# Register your models here. # Register your models here.
admin.site.site_header = '专家库管理系统' admin.site.site_header = '专家库开发系统'
admin.site.site_title = '专家库' admin.site.site_title = '专家库'
admin.site.index_title = '后台管理' admin.site.index_title = '后台管理'

Binary file not shown.

View File

@ -32,6 +32,7 @@ ALLOWED_HOSTS = ['*']
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
'simpleui',
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
@ -189,7 +190,8 @@ CELERYD_MAX_TASKS_PER_CHILD = 100 # 每个worker最多执行300个任务就会
CELERY_TIMEZONE = 'Asia/Shanghai' # 设置时区 CELERY_TIMEZONE = 'Asia/Shanghai' # 设置时区
CELERY_ENABLE_UTC = True # 启动时区设置 CELERY_ENABLE_UTC = True # 启动时区设置
SIMPLEUI_HOME_INFO = False
SIMPLEUI_ANALYSIS = False
# 日志配置 # 日志配置
# 创建日志的路径 # 创建日志的路径
LOG_PATH = os.path.join(BASE_DIR, 'log') LOG_PATH = os.path.join(BASE_DIR, 'log')

View File

@ -42,13 +42,15 @@ schema_view = get_schema_view(
urlpatterns = [ urlpatterns = [
path('admin/doc/', include('django.contrib.admindocs.urls')), path('admin/doc/', include('django.contrib.admindocs.urls')),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
# api
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('token/black/', LogoutView.as_view(), name='token_black'), path('token/black/', LogoutView.as_view(), name='token_black'),
path('system/', include('apps.system.urls')), path('system/', include('apps.system.urls')),
path('monitor/', include('apps.monitor.urls')), path('monitor/', include('apps.monitor.urls')),
# api文档
path('docs/', include_docs_urls(title="接口文档", authentication_classes=[], permission_classes=[])), path('docs/', include_docs_urls(title="接口文档", authentication_classes=[], permission_classes=[])),
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),