From f5b1b13a631927df1821e31b73f59f7ab950e4ab Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 6 Jan 2026 14:19:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0rem=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rem/__init__.py | 0 apps/rem/admin.py | 3 +++ apps/rem/apps.py | 6 +++++ apps/rem/migrations/0001_initial.py | 41 +++++++++++++++++++++++++++++ apps/rem/migrations/__init__.py | 0 apps/rem/models.py | 15 +++++++++++ apps/rem/serializers.py | 17 ++++++++++++ apps/rem/tests.py | 3 +++ apps/rem/urls.py | 12 +++++++++ apps/rem/views.py | 12 +++++++++ server/settings.py | 1 + server/urls.py | 1 + 12 files changed, 111 insertions(+) create mode 100644 apps/rem/__init__.py create mode 100644 apps/rem/admin.py create mode 100644 apps/rem/apps.py create mode 100644 apps/rem/migrations/0001_initial.py create mode 100644 apps/rem/migrations/__init__.py create mode 100644 apps/rem/models.py create mode 100644 apps/rem/serializers.py create mode 100644 apps/rem/tests.py create mode 100644 apps/rem/urls.py create mode 100644 apps/rem/views.py diff --git a/apps/rem/__init__.py b/apps/rem/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/rem/admin.py b/apps/rem/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/rem/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/rem/apps.py b/apps/rem/apps.py new file mode 100644 index 00000000..00b8212e --- /dev/null +++ b/apps/rem/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class RemConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.rem' diff --git a/apps/rem/migrations/0001_initial.py b/apps/rem/migrations/0001_initial.py new file mode 100644 index 00000000..9792300a --- /dev/null +++ b/apps/rem/migrations/0001_initial.py @@ -0,0 +1,41 @@ +# Generated by Django 3.2.12 on 2026-01-06 01:49 + +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 = [ + ('system', '0006_auto_20241213_1249'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, 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.TextField(verbose_name='项目名称')), + ('description', models.TextField(verbose_name='项目介绍')), + ('start_date', models.DateField(verbose_name='开始日期')), + ('end_date', models.DateField(verbose_name='结束日期')), + ('participants', models.TextField(blank=True, null=True, verbose_name='项目成员')), + ('note', models.TextField(blank=True, null=True, 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='创建人')), + ('files', models.ManyToManyField(blank=True, to='system.File', verbose_name='附件')), + ('leader', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, 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='project_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/rem/migrations/__init__.py b/apps/rem/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/rem/models.py b/apps/rem/models.py new file mode 100644 index 00000000..05b218ad --- /dev/null +++ b/apps/rem/models.py @@ -0,0 +1,15 @@ +from django.db import models +from apps.utils.models import CommonADModel +from apps.system.models import User, File +# Create your models here. + +class Project(CommonADModel): + name = models.TextField("项目名称") + description = models.TextField("项目介绍") + start_date = models.DateField("开始日期") + end_date = models.DateField("结束日期") + leader = models.ForeignKey(User, verbose_name="项目负责人", on_delete=models.CASCADE) + participants = models.TextField("项目成员", blank=True, null=True) + files = models.ManyToManyField(File, verbose_name="附件", blank=True) + note = models.TextField("备注", blank=True, null=True) + \ No newline at end of file diff --git a/apps/rem/serializers.py b/apps/rem/serializers.py new file mode 100644 index 00000000..8052891c --- /dev/null +++ b/apps/rem/serializers.py @@ -0,0 +1,17 @@ +from apps.rem.models import Project +from apps.utils.serializers import CustomModelSerializer +from apps.system.serializers import FileSerializer +from rest_framework import serializers + + +class ProjectSerializer(CustomModelSerializer): + leader_name = serializers.CharField(source="leader.name", read_only=True) + files_ = FileSerializer(source="files", many=True, read_only=True) + class Meta: + model = Project + fields = '__all__' + +class ProjectUpdateSerializer(CustomModelSerializer): + class Meta: + model = Project + fields = ["id", "participants", "files", "note"] \ No newline at end of file diff --git a/apps/rem/tests.py b/apps/rem/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/rem/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/rem/urls.py b/apps/rem/urls.py new file mode 100644 index 00000000..24393a13 --- /dev/null +++ b/apps/rem/urls.py @@ -0,0 +1,12 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import ProjectViewSet + +API_BASE_URL = 'api/rem/' +HTML_BASE_URL = 'dhtml/rem/' + +router = DefaultRouter() +router.register('project', ProjectViewSet, basename='research_project') +urlpatterns = [ + path(API_BASE_URL, include(router.urls)), +] \ No newline at end of file diff --git a/apps/rem/views.py b/apps/rem/views.py new file mode 100644 index 00000000..1bda3639 --- /dev/null +++ b/apps/rem/views.py @@ -0,0 +1,12 @@ +from django.shortcuts import render +from apps.utils.viewsets import CustomModelViewSet +from apps.rem.models import Project +from apps.rem.serializers import ProjectSerializer, ProjectUpdateSerializer +# Create your views here. + +class ProjectViewSet(CustomModelViewSet): + queryset = Project.objects.all() + serializer_class = ProjectSerializer + update_serializer_class = ProjectUpdateSerializer + select_related_fields = ['leader'] + search_fields = ["name", "description", "leader__name"] \ No newline at end of file diff --git a/server/settings.py b/server/settings.py index b6b8b02e..a1ee9235 100755 --- a/server/settings.py +++ b/server/settings.py @@ -88,6 +88,7 @@ INSTALLED_APPS = [ 'apps.ofm', 'apps.srm', 'apps.asm', + 'apps.rem' ] MIDDLEWARE = [ diff --git a/server/urls.py b/server/urls.py index d83709ff..431852a8 100755 --- a/server/urls.py +++ b/server/urls.py @@ -78,6 +78,7 @@ urlpatterns = [ path('', include('apps.ofm.urls')), path('', include('apps.srm.urls')), path('', include('apps.asm.urls')), + path('', include('apps.rem.urls')), # 前端页面入口 path('', TemplateView.as_view(template_name="index.html")),