diff --git a/ce_client/src/api/expert.js b/ce_client/src/api/expert.js new file mode 100644 index 0000000..8d196a2 --- /dev/null +++ b/ce_client/src/api/expert.js @@ -0,0 +1,29 @@ +import request from '@/utils/request' + +export function getExpertList(query) { + return request({ + url: '/expert/expert/', + method: 'get', + params: query + }) +} +export function createExpert(data) { + return request({ + url: '/expert/expert/', + method: 'post', + data + }) +} +export function updateExpert(id, data) { + return request({ + url: `/expert/expert/${id}/`, + method: 'put', + data + }) +} +export function deleteExpert(id) { + return request({ + url: `/expert/expert/${id}/`, + method: 'delete' + }) +} diff --git a/ce_client/src/components/Pagination/index.vue b/ce_client/src/components/Pagination/index.vue index e316e20..8160e61 100644 --- a/ce_client/src/components/Pagination/index.vue +++ b/ce_client/src/components/Pagination/index.vue @@ -35,7 +35,7 @@ export default { pageSizes: { type: Array, default() { - return [10, 20, 30, 50] + return [12, 24, 36, 48] } }, layout: { diff --git a/ce_client/src/layout/components/Navbar.vue b/ce_client/src/layout/components/Navbar.vue index d053e87..d9379ab 100644 --- a/ce_client/src/layout/components/Navbar.vue +++ b/ce_client/src/layout/components/Navbar.vue @@ -52,7 +52,8 @@ export default { computed: { ...mapGetters([ 'sidebar', - 'avatar' + 'avatar', + 'name' ]) }, methods: { diff --git a/ce_client/src/layout/components/Sidebar/Logo.vue b/ce_client/src/layout/components/Sidebar/Logo.vue index 7121590..6df567c 100644 --- a/ce_client/src/layout/components/Sidebar/Logo.vue +++ b/ce_client/src/layout/components/Sidebar/Logo.vue @@ -24,7 +24,7 @@ export default { }, data() { return { - title: 'Django Vue Admin', + title: '总院专家库', logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png' } } diff --git a/ce_client/src/router/index.js b/ce_client/src/router/index.js index 8d33a62..64cd587 100644 --- a/ce_client/src/router/index.js +++ b/ce_client/src/router/index.js @@ -78,6 +78,17 @@ export const constantRoutes = [ * the routes that need to be dynamically loaded based on user perms */ export const asyncRoutes = [ + { + path: '/search', + component: Layout, + redirect: '/search', + children: [{ + path: 'search', + name: 'Search', + component: () => import('@/views/search/index'), + meta: { title: '专家检索', icon: 'search' } + }] + }, { path: '/system', component: Layout, diff --git a/ce_client/src/settings.js b/ce_client/src/settings.js index 585109b..bd052f7 100644 --- a/ce_client/src/settings.js +++ b/ce_client/src/settings.js @@ -1,6 +1,6 @@ module.exports = { - title: '管理系统', + title: '总院专家库', /** * @type {boolean} true | false diff --git a/ce_client/src/styles/index.scss b/ce_client/src/styles/index.scss index 059de63..476a0dc 100644 --- a/ce_client/src/styles/index.scss +++ b/ce_client/src/styles/index.scss @@ -10,6 +10,7 @@ body { -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; + background-color: #f0f2f5; } label { diff --git a/ce_client/src/utils/get-page-title.js b/ce_client/src/utils/get-page-title.js index cfe5800..4e63417 100644 --- a/ce_client/src/utils/get-page-title.js +++ b/ce_client/src/utils/get-page-title.js @@ -1,6 +1,6 @@ import defaultSettings from '@/settings' -const title = defaultSettings.title || '认证系统' +const title = defaultSettings.title || '总院专家库' export default function getPageTitle(pageTitle) { if (pageTitle) { diff --git a/ce_client/src/views/login/index.vue b/ce_client/src/views/login/index.vue index 2568652..be45b75 100644 --- a/ce_client/src/views/login/index.vue +++ b/ce_client/src/views/login/index.vue @@ -3,7 +3,7 @@
-

系统登陆

+

总院专家库

diff --git a/ce_client/src/views/search/index.vue b/ce_client/src/views/search/index.vue new file mode 100644 index 0000000..db2948e --- /dev/null +++ b/ce_client/src/views/search/index.vue @@ -0,0 +1,294 @@ + + + \ No newline at end of file diff --git a/ce_server/apps/expert/migrations/0004_auto_20210708_1043.py b/ce_server/apps/expert/migrations/0004_auto_20210708_1043.py new file mode 100644 index 0000000..94492b4 --- /dev/null +++ b/ce_server/apps/expert/migrations/0004_auto_20210708_1043.py @@ -0,0 +1,21 @@ +# Generated by Django 3.1.8 on 2021-07-08 02:43 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('expert', '0003_historicalexpert'), + ] + + operations = [ + migrations.AlterModelOptions( + name='expert', + options={'verbose_name': '专家信息', 'verbose_name_plural': '专家信息'}, + ), + migrations.AlterModelOptions( + name='historicalexpert', + options={'get_latest_by': 'history_date', 'ordering': ('-history_date', '-history_id'), 'verbose_name': 'historical 专家信息'}, + ), + ] diff --git a/ce_server/apps/expert/migrations/0005_delete_historicalexpert.py b/ce_server/apps/expert/migrations/0005_delete_historicalexpert.py new file mode 100644 index 0000000..e5e1c1e --- /dev/null +++ b/ce_server/apps/expert/migrations/0005_delete_historicalexpert.py @@ -0,0 +1,16 @@ +# Generated by Django 3.1.8 on 2021-07-08 02:44 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('expert', '0004_auto_20210708_1043'), + ] + + operations = [ + migrations.DeleteModel( + name='HistoricalExpert', + ), + ] diff --git a/ce_server/apps/expert/migrations/0006_expert_hdegree.py b/ce_server/apps/expert/migrations/0006_expert_hdegree.py new file mode 100644 index 0000000..8c0cc80 --- /dev/null +++ b/ce_server/apps/expert/migrations/0006_expert_hdegree.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.8 on 2021-07-08 08:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('expert', '0005_delete_historicalexpert'), + ] + + operations = [ + migrations.AddField( + model_name='expert', + name='Hdegree', + field=models.CharField(choices=[('男', '男'), ('女', '女')], default='本科', max_length=10, verbose_name='最高学历'), + ), + ] diff --git a/ce_server/apps/expert/migrations/0007_auto_20210708_1627.py b/ce_server/apps/expert/migrations/0007_auto_20210708_1627.py new file mode 100644 index 0000000..9f68a6a --- /dev/null +++ b/ce_server/apps/expert/migrations/0007_auto_20210708_1627.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.8 on 2021-07-08 08:27 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('expert', '0006_expert_hdegree'), + ] + + operations = [ + migrations.RenameField( + model_name='expert', + old_name='Hdegree', + new_name='hdegree', + ), + ] diff --git a/ce_server/apps/expert/models.py b/ce_server/apps/expert/models.py index b015356..3e561aa 100644 --- a/ce_server/apps/expert/models.py +++ b/ce_server/apps/expert/models.py @@ -10,6 +10,12 @@ class Expert(CommonBModel): ('男', '男'), ('女', '女'), ) + degree_choices = ( + ('大专', '大专'), + ('本科', '本科'), + ('硕士研究生', '硕士研究生'), + ('博士研究生', '博士研究生'), + ) 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) @@ -17,7 +23,7 @@ class Expert(CommonBModel): idnumber = models.CharField(verbose_name="身份证号", max_length=40) paddress = models.TextField(verbose_name="通讯地址") photo = models.CharField(verbose_name="证件照", max_length=100, null=True, blank=True) - history = HistoricalRecords() + hdegree = models.CharField(verbose_name="最高学历",choices=gender_choices, default='本科', max_length=10) class Meta: verbose_name = '专家信息' diff --git a/ce_server/apps/expert/serializers.py b/ce_server/apps/expert/serializers.py new file mode 100644 index 0000000..ee5b69f --- /dev/null +++ b/ce_server/apps/expert/serializers.py @@ -0,0 +1,37 @@ +from rest_framework.serializers import ModelSerializer +from .models import Award, Expert, Paper, Project, WorkExperience + +class WorkExperienceSimpleSerializer(ModelSerializer): + class Meta: + model = WorkExperience + fields = ['id', 'name'] + +class ProjectSimpleSerializer(ModelSerializer): + class Meta: + model = Project + fields = ['id', 'name'] + +class PaperSimpleSerializer(ModelSerializer): + class Meta: + model = Paper + fields = ['id', 'name'] + +class AwardSimpleSerializer(ModelSerializer): + class Meta: + model = Award + fields = ['id', 'name'] + +class ExpertListSerializer(ModelSerializer): + workexperience_ = WorkExperienceSimpleSerializer(source='workexperience_expert', many=True, read_only=True) + project_ = ProjectSimpleSerializer(source='project_expert', many=True, read_only=True) + paper_ = PaperSimpleSerializer(source='paper_expert', many=True, read_only=True) + award_ = AwardSimpleSerializer(source='award_expert', many=True, read_only=True) + class Meta: + model = Expert + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.prefetch_related('workexperience_expert','project_expert', 'paper_expert', 'award_expert') + return queryset \ No newline at end of file diff --git a/ce_server/apps/expert/urls.py b/ce_server/apps/expert/urls.py new file mode 100644 index 0000000..944364d --- /dev/null +++ b/ce_server/apps/expert/urls.py @@ -0,0 +1,10 @@ +from django.urls import path, include +from .views import ExpertViewSet +from rest_framework import routers + +router = routers.DefaultRouter() +router.register('expert', ExpertViewSet, basename="expert") + +urlpatterns = [ + path('', include(router.urls)), +] \ No newline at end of file diff --git a/ce_server/apps/expert/views.py b/ce_server/apps/expert/views.py index 91ea44a..e647e31 100644 --- a/ce_server/apps/expert/views.py +++ b/ce_server/apps/expert/views.py @@ -1,3 +1,14 @@ from django.shortcuts import render - +from rest_framework.viewsets import ModelViewSet +from .models import Expert +from .serializers import ExpertListSerializer +from apps.system.mixins import OptimizationMixin # Create your views here. + +class ExpertViewSet(OptimizationMixin, ModelViewSet): + perms_map={'get':'expert_view'} + queryset = Expert.objects.all() + search_fields = ['name', 'workexperience_expert__name', 'project_expert__name', 'paper_expert__name', 'award_expert__name'] + filterset_fields = ['hdegree'] + serializer_class = ExpertListSerializer + ordering = ['-create_time'] \ No newline at end of file diff --git a/ce_server/media/default/photo.png b/ce_server/media/default/photo.png new file mode 100644 index 0000000..196e5e9 Binary files /dev/null and b/ce_server/media/default/photo.png differ diff --git a/ce_server/server/urls.py b/ce_server/server/urls.py index afdfd9a..9d46f67 100644 --- a/ce_server/server/urls.py +++ b/ce_server/server/urls.py @@ -49,6 +49,7 @@ urlpatterns = [ path('token/black/', LogoutView.as_view(), name='token_black'), path('system/', include('apps.system.urls')), path('monitor/', include('apps.monitor.urls')), + path('expert/', include('apps.expert.urls')), # api文档 path('docs/', include_docs_urls(title="接口文档", authentication_classes=[], permission_classes=[])),