This commit is contained in:
Li xia 2025-01-09 09:36:43 +08:00
commit 4a539505c2
16 changed files with 280 additions and 29 deletions

View File

@ -15,9 +15,8 @@ import load from "./dynamicLoadScript";
import { upUrl, upHeaders } from "@/api/file"; import { upUrl, upHeaders } from "@/api/file";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one // why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
const tinymceCDN = const tinymceCDN ="http://lib.baomitu.com/tinymce/4.9.3/tinymce.min.js";
"https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js"; // "https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/tinymce/4.9.3/tinymce.min.js";
export default { export default {
name: "Tinymce", name: "Tinymce",
props: { props: {

View File

@ -0,0 +1,47 @@
# Generated by Django 3.2.12 on 2024-09-14 03:03
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('cms', '0014_auto_20231207_2146'),
]
operations = [
migrations.CreateModel(
name='CompanyInfo',
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_delete', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('company_name', models.CharField(max_length=50, verbose_name='父公司名称')),
('edu_points', models.FloatField(blank=True, null=True, verbose_name='教育积分')),
('co_sponsor_points', models.FloatField(blank=True, null=True, verbose_name='协办大赛积分')),
('sum_points', models.FloatField(blank=True, null=True, verbose_name='总积分')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='ChildrenCompany',
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_delete', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('child_company_name', models.CharField(max_length=50, verbose_name='子公司名称')),
('child_edu_points', models.FloatField(blank=True, null=True, verbose_name='教育积分')),
('child_co_sponsor_points', models.FloatField(blank=True, null=True, verbose_name='协办大赛积分')),
('parent_compnay', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cms.companyinfo', verbose_name='父公司')),
],
options={
'abstract': False,
},
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2024-09-14 06:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cms', '0015_auto_20240914_1103'),
]
operations = [
migrations.RenameField(
model_name='childrencompany',
old_name='parent_compnay',
new_name='parent_comany',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2024-09-14 06:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cms', '0016_auto_20240914_1403'),
]
operations = [
migrations.RenameField(
model_name='childrencompany',
old_name='parent_comany',
new_name='parent_company',
)
]

View File

@ -0,0 +1,22 @@
# Generated by Django 3.2.12 on 2024-09-18 03:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cms', '0017_auto_20240914_1405'),
]
operations = [
migrations.RemoveField(
model_name='childrencompany',
name='child_company_name',
),
migrations.AddField(
model_name='article',
name='type',
field=models.IntegerField(default=0, verbose_name='类型'),
),
]

View File

@ -11,6 +11,7 @@ class Article(CommonModel):
content = models.TextField(verbose_name='内容', blank=True) content = models.TextField(verbose_name='内容', blank=True)
ifrom = models.CharField(max_length=60, verbose_name='来源') ifrom = models.CharField(max_length=60, verbose_name='来源')
is_top = models.BooleanField('置顶', default=False) is_top = models.BooleanField('置顶', default=False)
type = models.IntegerField('类型', default=0)
class Meta: class Meta:
verbose_name = '文章' verbose_name = '文章'
@ -63,5 +64,26 @@ class Threshold(CommonModel):
cas = models.CharField('cas号', max_length=20) cas = models.CharField('cas号', max_length=20)
class CompanyInfo(CommonModel):
company_name = models.CharField('父公司名称', max_length=50)
edu_points = models.FloatField('教育积分', null=True, blank=True)
co_sponsor_points = models.FloatField('协办大赛积分', null=True, blank=True)
sum_points = models.FloatField('总积分', null=True, blank=True)
def __str__(self):
return self.company_name
class ChildrenCompany(CommonModel):
child_edu_points = models.FloatField('教育积分', null=True, blank=True)
child_co_sponsor_points = models.FloatField('协办大赛积分', null=True, blank=True)
parent_company = models.ForeignKey(CompanyInfo, verbose_name='父公司', on_delete=models.CASCADE)
def __str__(self):
return self.child_company_name

View File

@ -1,5 +1,5 @@
from rest_framework import serializers from rest_framework import serializers
from .models import Article, Material, Source, Threshold from .models import Article, Material, Source, Threshold, CompanyInfo, ChildrenCompany
from utils.constants import EXCLUDE_FIELDS_BASE from utils.constants import EXCLUDE_FIELDS_BASE
@ -47,4 +47,65 @@ class ThresholdSerializer(serializers.ModelSerializer):
class PathSerializer(serializers.Serializer): class PathSerializer(serializers.Serializer):
path = serializers.CharField(label='文件地址') path = serializers.CharField(label='文件地址')
class CompanyInfoSerializer(serializers.ModelSerializer):
# children_companies = serializers.SerializerMethodField()
class Meta:
model = CompanyInfo
fields = '__all__'
# def get_children_companies(self, obj):
# children = ChildrenCompany.objects.filter(parent_company=obj)
# return ChildrenCompanySerializer(children, many=True).data
def create(self, validated_data):
instance = super().create(validated_data)
instance.sum_points = validated_data["edu_points"] + validated_data["co_sponsor_points"]
instance.save()
return instance
class ChildrenCompanySerializer(serializers.ModelSerializer):
parent_company_name = serializers.StringRelatedField(source='parent_company.company_name', read_only=True)
class Meta:
model = ChildrenCompany
fields = '__all__'
def create(self, validated_data):
instance = super().create(validated_data)
parent_company = instance.parent_company
children = ChildrenCompany.objects.filter(parent_company=parent_company)
total_edu = sum(c.child_edu_points or 0 for c in children)
total_sponsor = sum(c.child_co_sponsor_points or 0 for c in children)
# 加上未保存的分数
parent_company.edu_points = total_edu
parent_company.co_sponsor_points = total_sponsor
parent_company.sum_points = parent_company.edu_points + parent_company.co_sponsor_points
parent_company.save()
return instance
# # # 定义信号处理器
# from django.db.models.signals import pre_save
# from django.dispatch import receiver
# from .models import ChildrenCompany, CompanyInfo
# @receiver(pre_save, sender=ChildrenCompany)
# def update_parent_sum_points(sender, instance, **kwargs):
# parent_company = instance.parent_company
# child_companies = ChildrenCompany.objects.filter(parent_company=parent_company)
# # 计算子公司的积分
# child_edu_sum = sum(c.child_edu_points or 0 for c in child_companies)
# child_co_sponsor_sum = sum(c.child_co_sponsor_points or 0 for c in child_companies)
# # 更新父公司的总积分
# parent_company.edu_points = child_edu_sum
# parent_company.co_sponsor_points = child_co_sponsor_sum
# parent_company.sum_points = child_edu_sum + child_co_sponsor_sum
# parent_company.save()

View File

@ -1,5 +1,5 @@
from django.urls import path,include from django.urls import path,include
from .views import ArticleViewSet, MaterialViewSet, SourceViewSet, ThresholdViewSet from .views import ArticleViewSet, MaterialViewSet, SourceViewSet, ThresholdViewSet, ConpamyInfoViewSet, ChildrenCompanyViewSet
from rest_framework import routers from rest_framework import routers
@ -8,6 +8,8 @@ router.register('article', ArticleViewSet, basename="article")
router.register('material', MaterialViewSet, basename="material") router.register('material', MaterialViewSet, basename="material")
router.register('source', SourceViewSet, basename='source') router.register('source', SourceViewSet, basename='source')
router.register('threshold', ThresholdViewSet, basename='threshold') router.register('threshold', ThresholdViewSet, basename='threshold')
router.register('company', ConpamyInfoViewSet, basename='company')
router.register('childcomany', ChildrenCompanyViewSet, basename='child_company')
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),

View File

@ -11,8 +11,8 @@ from openpyxl import load_workbook, Workbook
from django.db import transaction from django.db import transaction
# Create your views here. # Create your views here.
from .models import Article, Material, Source, Threshold from .models import Article, Material, Source, Threshold, CompanyInfo, ChildrenCompany
from .serializers import ArticelSerializer, ArticelListSerializer, MaterialSerializer, SourceSerializer, ThresholdSerializer, PathSerializer from .serializers import ArticelSerializer, ArticelListSerializer, MaterialSerializer, SourceSerializer, ThresholdSerializer, PathSerializer, CompanyInfoSerializer, ChildrenCompanySerializer
from utils.custom import CommonPagination from utils.custom import CommonPagination
class ArticleViewSet(ModelViewSet): class ArticleViewSet(ModelViewSet):
""" """
@ -25,9 +25,10 @@ class ArticleViewSet(ModelViewSet):
serializer_class = ArticelSerializer serializer_class = ArticelSerializer
pagination_class = CommonPagination pagination_class = CommonPagination
filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter] filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
search_fields = ['title','content'] search_fields = ['title','content', 'types']
ordering_fields = ['title','update_time'] ordering_fields = ['title','update_time']
ordering = ['-is_top', '-update_time'] ordering = ['-is_top', '-update_time']
filterset_fields = ['type']
def get_serializer_class(self): def get_serializer_class(self):
if self.action=='list': if self.action=='list':
@ -45,6 +46,38 @@ class ArticleViewSet(ModelViewSet):
instance.save() instance.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
class ConpamyInfoViewSet(ModelViewSet):
"""
父公司增删改查
"""
perms_map = [
{'get': '*'}, {'post': 'article_create'},
{'put': 'article_update'}, {'delete': 'article_delete'}]
queryset = CompanyInfo.objects.filter(is_delete=0).all()
serializer_class = CompanyInfoSerializer
pagination_class = CommonPagination
filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
search_fields = ['company_name']
ordering_fields = ['update_time']
ordering = ['-sum_points']
class ChildrenCompanyViewSet(ModelViewSet):
"""
子公司增删改查
"""
perms_map = [
{'get': '*'}, {'post': 'article_create'},
{'put': 'article_update'}, {'delete': 'article_delete'}]
queryset = ChildrenCompany.objects.filter(is_delete=0).all()
serializer_class = ChildrenCompanySerializer
pagination_class = CommonPagination
filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
filterset_fields = ['parent_company']
ordering_fields = ['update_time']
ordering = ['-update_time']
class MaterialViewSet(ModelViewSet): class MaterialViewSet(ModelViewSet):
""" """
资料增删改查 资料增删改查

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.12 on 2024-09-19 08:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('crm', '0046_auto_20230407_1012'),
]
operations = [
migrations.AddField(
model_name='candidate',
name='gender',
field=models.CharField(blank=True, max_length=10, null=True, verbose_name='性别'),
),
migrations.AddField(
model_name='candidate',
name='opllevel',
field=models.CharField(blank=True, max_length=60, null=True, verbose_name='职业等级'),
),
]

View File

@ -129,6 +129,8 @@ class Candidate(CommonModel):
train_start_date = models.DateField('培训开始日期', null=True) train_start_date = models.DateField('培训开始日期', null=True)
train_end_date = models.DateField('培训结束日期', null=True) train_end_date = models.DateField('培训结束日期', null=True)
create_admin = models.ForeignKey(UserProfile, verbose_name="创建管理员", null=True, blank=True, on_delete=models.SET_NULL) create_admin = models.ForeignKey(UserProfile, verbose_name="创建管理员", null=True, blank=True, on_delete=models.SET_NULL)
gender = models.CharField('性别', max_length=10, null=True, blank=True)
opllevel = models.CharField('职业等级',max_length=60, null=True, blank=True)
class Meta: class Meta:
verbose_name = '证书' verbose_name = '证书'

View File

@ -5,6 +5,8 @@ from rest_framework.permissions import IsAuthenticated
from django.core.cache import cache from django.core.cache import cache
from django.utils import timezone from django.utils import timezone
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.core.cache import cache
from rbac.permission import get_permission_list
# 学员接口列表 # 学员接口列表
ConsumerPerms = [ ConsumerPerms = [
'paper_view', 'paper_view',
@ -53,11 +55,13 @@ class MyPermission(RbacPermission):
:return: :return:
""" """
perms = [] perms = []
# if 'perms' in request.session:
# perms = request.session['perms']
if isinstance(request.user, UserProfile): # 如果是管理员表 if isinstance(request.user, UserProfile): # 如果是管理员表
# perms = get_permission_list(request.user) if request.user.is_superuser:
return True return True
perms = cache.get(f'{request.user.id}_perms', None)
if perms is None:
perms = get_permission_list(request.user)
perms.extend(ConsumerPerms)
elif isinstance(request.user, Consumer): # 如果是客户 elif isinstance(request.user, Consumer): # 如果是客户
perms = cache.get('cperms_'+str(request.user.id), None) perms = cache.get('cperms_'+str(request.user.id), None)
if not perms: if not perms:

View File

@ -29,7 +29,7 @@ class SubjectViewSet(ModelViewSet):
学科分类增删改查 学科分类增删改查
""" """
perms_map = ( perms_map = (
{'get': 'subject_view'}, {'post': 'subject_create'}, {'get': '*'}, {'post': 'subject_create'},
{'put': 'subject_update'}, {'delete': 'subject_delete'}) {'put': 'subject_update'}, {'delete': 'subject_delete'})
queryset = Questioncat.objects.filter(is_subject=True,is_delete=0).all().order_by("id") queryset = Questioncat.objects.filter(is_subject=True,is_delete=0).all().order_by("id")
serializer_class = SubjectSerializer serializer_class = SubjectSerializer
@ -44,7 +44,7 @@ class QuestioncatViewSet(ModelViewSet):
题库分类增删改查 题库分类增删改查
""" """
perms_map = ( perms_map = (
{'get': 'questioncat_view'}, {'post': 'questioncat_create'}, {'get': '*'}, {'post': 'questioncat_create'},
{'put': 'questioncat_update'}, {'delete': 'questioncat_delete'}) {'put': 'questioncat_update'}, {'delete': 'questioncat_delete'})
queryset = Questioncat.objects.filter(is_delete=0,is_subject=False).all() queryset = Questioncat.objects.filter(is_delete=0,is_subject=False).all()
serializer_class = QuestioncatSerializerDefault serializer_class = QuestioncatSerializerDefault

View File

@ -1,5 +1,6 @@
from rest_framework.permissions import BasePermission from rest_framework.permissions import BasePermission
from .models import Menu from .models import Menu
from django.core.cache import cache
def get_all_menu_queryset(user): def get_all_menu_queryset(user):
@ -19,11 +20,13 @@ def get_permission_list(user):
menus = get_all_menu_queryset(user) menus = get_all_menu_queryset(user)
perms_list = menus.values_list('method',flat=True) perms_list = menus.values_list('method',flat=True)
perms_list = list(perms_list) perms_list = list(perms_list)
if user.is_superuser: perms_l = []
perms_list.append('admin')
if perms_list: if perms_list:
return list(perms_list) perms_l = perms_list
return ['basic'] else:
perms_l = ['basic']
cache.set(f'{user.id}_perms', perms_l, timeout=None)
return perms_l
class RbacPermission(BasePermission): class RbacPermission(BasePermission):
""" """
@ -38,14 +41,11 @@ class RbacPermission(BasePermission):
:return: :return:
""" """
perms = [] perms = []
if 'perms' in request.session: perms = cache.get(f'{request.user.id}_perms', None)
perms = request.session['perms'] if perms is None:
else:
perms = get_permission_list(request.user) perms = get_permission_list(request.user)
if perms: if perms:
if 'admin' in perms: if request.user.is_superuser:
return True
elif request.user.is_superuser:
return True return True
elif not hasattr(view, 'perms_map'): elif not hasattr(view, 'perms_map'):
return True return True

View File

@ -30,6 +30,7 @@ from ..serializers.user_serializer import (UserCreateSerializer,
from server.conf import * from server.conf import *
from rest_framework_jwt.serializers import jwt_encode_handler from rest_framework_jwt.serializers import jwt_encode_handler
from crm.views import my_payload_handler from crm.views import my_payload_handler
from django.core.cache import cache
class UserLogoutView(APIView): class UserLogoutView(APIView):
authentication_classes = () authentication_classes = ()
@ -46,7 +47,6 @@ class UserInfoView(APIView):
if request.user.id is not None: if request.user.id is not None:
user = request.user user = request.user
perms = get_permission_list(user) perms = get_permission_list(user)
request.session['perms'] = perms # 存到session表中
data = { data = {
'id': user.id, 'id': user.id,
'username': user.username, 'username': user.username,
@ -73,7 +73,7 @@ class UserViewSet(PageOrNot, ModelViewSet):
""" """
用户管理增删改查 用户管理增删改查
""" """
perms_map = ({'get': 'user_list'}, {'post': 'user_create'}, {'put': 'user_update'}, perms_map = ({'get': 'user_view'}, {'post': 'user_create'}, {'put': 'user_update'},
{'delete': 'user_delete'}) {'delete': 'user_delete'})
queryset = UserProfile.objects.filter(is_delete=0).all() queryset = UserProfile.objects.filter(is_delete=0).all()
serializer_class = UserListSerializer serializer_class = UserListSerializer

View File

@ -143,9 +143,9 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'dist/static')
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [ 'DEFAULT_AUTHENTICATION_CLASSES': [
'crm.authentication.MyTokenAuthentication',
'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.SessionAuthentication',
'crm.authentication.MyTokenAuthentication'
], ],
'DEFAULT_PERMISSION_CLASSES':[ 'DEFAULT_PERMISSION_CLASSES':[
'crm.permission.MyPermission' 'crm.permission.MyPermission'