From 5ded2347b7495a526e9842c2bd0674e130faf480 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 1 Jun 2023 17:12:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE=E4=B8=BAjson=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + apps/system/urls.py | 4 ++- apps/system/views.py | 74 +++++++++++++++++++++++++++++++++++++++----- apps/utils/sms.py | 7 ++--- apps/utils/tasks.py | 3 +- server/settings.py | 16 +++++----- 6 files changed, 84 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index d00cbb5c..7164076f 100755 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ celerybeat-schedule.dir db.sqlite3 server/conf*.py server/conf.ini +server/conf.json sh/* temp/* nohup.out \ No newline at end of file diff --git a/apps/system/urls.py b/apps/system/urls.py index 7e2cab10..83150314 100755 --- a/apps/system/urls.py +++ b/apps/system/urls.py @@ -3,7 +3,7 @@ from django.urls import path, include from .views import ApkViewSet, FileViewSet, PTaskViewSet, PTaskResultViewSet, PostRoleViewSet, TaskList, \ UserPostViewSet, UserViewSet, DeptViewSet, \ PermissionViewSet, RoleViewSet, PostViewSet, \ - DictTypeViewSet, DictViewSet + DictTypeViewSet, DictViewSet, SysConfigView, SysBaseConfigView from rest_framework import routers API_BASE_URL = 'api/system/' @@ -31,5 +31,7 @@ router2.register('file', FileViewSet, basename='file') urlpatterns = [ path(API_BASE_URL, include(router.urls)), path(API_BASE_URL + 'task/', TaskList.as_view()), + path(API_BASE_URL + 'base_config/', SysBaseConfigView.as_view()), + path(API_BASE_URL + 'config/', SysConfigView.as_view()), path('api/', include(router2.urls)), ] diff --git a/apps/system/views.py b/apps/system/views.py index aa9d6f02..ac40d750 100755 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -40,6 +40,8 @@ from .serializers import (ApkSerializer, DeptCreateUpdateSerializer, DeptSeriali from rest_framework.viewsets import GenericViewSet from cron_descriptor import get_description import locale +from drf_yasg.utils import swagger_auto_schema +from server.settings import SYSCONF, SYS_JSON_PATH # logger.info('请求成功! response_code:{};response_headers:{}; # response_body:{}'.format(response_code, response_headers, response_body[:251])) @@ -656,9 +658,7 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe 获取apk信息 """ - config.read(filename, encoding='utf-8') - file = config.get('apk', 'file') - return Response({'version': config.get('apk', 'version'), 'file': file}) + return Response({'version': SYSCONF['apk']['apk_version'], 'file': SYSCONF['apk']['apk_file']}) def create(self, request, *args, **kwargs): """ @@ -669,13 +669,11 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe sr = ApkSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data - config.read(filename, encoding='utf-8') - config.set("apk", "version", vdata['version']) - config.set("apk", "file", vdata['file']) - with open(os.path.join(settings.BASE_DIR, 'server/conf.ini'), 'w') as f: - config.write(f) from shutil import copyfile copyfile(settings.BASE_DIR + vdata['file'], settings.BASE_DIR + '/media/zc_ehs.apk') + SYSCONF['apk']['apk_version'] = vdata['version'] + SYSCONF['apk']['apk_file'] = vdata['file'] + SysConfigView.save_sysconf() return Response() @@ -721,3 +719,63 @@ class MyScheduleViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, Cus obj.name = self.get_chinese_description('crontab', vdata) obj.crontab = crontab obj.save() + + +class SysBaseConfigView(APIView): + authentication_classes = [] + permission_classes = [] + read_keys = ['base', 'apk'] + + def get(self, request, format=None): + """ + 获取系统基本信息 + + 获取系统基本信息 + """ + base_dict = {key: SYSCONF[key] for key in self.read_keys if key in SYSCONF} + return Response(base_dict) + +class SysConfigView(MyLoggingMixin, APIView): + perms_map = {'get': 'sysconfig.view', 'put': 'sysconfig.update'} + + def update_dict(self, dict1, dict2): + for key, value in dict2.items(): + if key == 'apk_file': # apk_file拷贝到固定位置 + from shutil import copyfile + copyfile(settings.BASE_DIR + value, settings.BASE_DIR + '/media/zc_ehs.apk') + else: + if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict): + self.update_dict(dict1[key], value) + else: + dict1[key] = value + + @staticmethod + def save_sysconf(): + with open(SYS_JSON_PATH, 'wb') as f: + f.write(json.dumps(SYSCONF, indent=4, ensure_ascii=False).encode('utf-8')) + + def get(self, request, format=None): + """ + 获取config json + + 获取config json + """ + return Response(SYSCONF) + + @swagger_auto_schema(request_body=Serializer) + def put(self, request, format=None): + """ + 修改config json + + 修改config json + """ + data = request.data + global SYSCONF + old_sysconf = SYSCONF + try: + self.update_dict(SYSCONF, data) + self.save_sysconf() + except: + SYSCONF = old_sysconf + raise + return Response() \ No newline at end of file diff --git a/apps/utils/sms.py b/apps/utils/sms.py index 965bf61b..dd9b40dd 100644 --- a/apps/utils/sms.py +++ b/apps/utils/sms.py @@ -1,9 +1,8 @@ from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest -from django.conf import settings import json import logging -from apps.utils.myconfig import myConfig +from server.settings import SYSCONF from apps.utils.decorators import auto_log # 实例化myLogger @@ -11,7 +10,7 @@ myLogger = logging.getLogger('log') @auto_log(name='阿里云短信', raise_exception=False, send_mail=True) def send_sms(phone: str, template_code: int, template_param: dict): - client = AcsClient(myConfig.get_option_value('sms', 'xn_key'), myConfig.get_option_value('sms', 'xn_secret'), 'default') + client = AcsClient(SYSCONF['sms']['xn_key'], SYSCONF['sms']['xn_secret'], 'default') request = CommonRequest() # 固定json request.set_accept_format('json') @@ -28,7 +27,7 @@ def send_sms(phone: str, template_code: int, template_param: dict): # 手机号码 request.add_query_param('PhoneNumbers', phone) # 签名名称 - request.add_query_param('SignName', settings.PROJECT_NAME) + request.add_query_param('SignName', SYSCONF['sms']['xn_sign']) # 模板CODE request.add_query_param('TemplateCode', template_code) # 如果有模板参数 填写模板参数 如果无 无须填写 diff --git a/apps/utils/tasks.py b/apps/utils/tasks.py index ea80d19b..cb09a73b 100644 --- a/apps/utils/tasks.py +++ b/apps/utils/tasks.py @@ -3,6 +3,7 @@ from celery import Task from celery import shared_task import logging from django.conf import settings +from server.settings import SYSCONF # 实例化myLogger myLogger = logging.getLogger('log') @@ -12,7 +13,7 @@ myLogger = logging.getLogger('log') def send_mail_task(**args): if settings.DEBUG is False: from django.core.mail import send_mail - args['subject'] = '{}:{}_{}_{}'.format(settings.SYS_NAME, settings.SYS_VERSION, settings.PROJECT_NAME, args.get('subject', '500')) + args['subject'] = '{}:{}_{}_{}'.format(settings.SYS_NAME, settings.SYS_VERSION, SYSCONF['base']['base_name_short'], args.get('subject', '500')) args['from_email'] = args.get('from_email', settings.EMAIL_HOST_USER) args['recipient_list'] = args.get('recipient_list', [settings.EMAIL_HOST_USER]) send_mail(**args) diff --git a/server/settings.py b/server/settings.py index cdae72cf..aad9cc09 100755 --- a/server/settings.py +++ b/server/settings.py @@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/3.0/ref/settings/ from datetime import datetime, timedelta import os +import json from . import conf # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -20,6 +21,13 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ +# 读取配置文件 +SYS_JSON_PATH = os.path.join(BASE_DIR, 'server/conf.json') +if not os.path.exists(SYS_JSON_PATH): + raise SystemError('未找到配置文件') +with open(SYS_JSON_PATH, 'r', encoding='utf-8') as f: + SYSCONF = json.loads(f.read()) + # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = conf.SECRET_KEY @@ -30,7 +38,6 @@ ALLOWED_HOSTS = ['*'] SYS_NAME = 'XT_EHS' SYS_VERSION = '2.2.1' -PROJECT_NAME = conf.PROJECT_NAME # Application definition @@ -164,7 +171,7 @@ EMAIL_HOST = conf.EMAIL_HOST EMAIL_PORT = conf.EMAIL_PORT EMAIL_HOST_USER = conf.EMAIL_HOST_USER EMAIL_HOST_PASSWORD = conf.EMAIL_HOST_PASSWORD -EMAIL_SUBJECT_PREFIX = conf.EMAIL_SUBJECT_PREFIX +EMAIL_SUBJECT_PREFIX = SYSCONF['base']['base_name_short'] EMAIL_USE_TLS = conf.EMAIL_USE_TLS # 默认主键 @@ -388,11 +395,6 @@ BACKUP_PATH = conf.BACKUP_PATH SH_PATH = conf.SH_PATH -# 小牛短信 -XNIU_SMS_KEY = conf.XNIU_SMS_KEY -XNIU_SMS_SECRET = conf.XNIU_SMS_SECRET - - # 百度语音 BD_SP_ID = conf.BD_SP_ID BD_SP_KEY = conf.BD_SP_KEY