From 52bb1ca367e1a54f51820e6148d9626fef8f74a0 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 9 Jun 2023 09:41:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/system/views.py | 47 ++++++++++++-------------------------------- apps/utils/sms.py | 7 ++++--- apps/utils/sql.py | 27 ++++++++++++++++++++++++- apps/utils/tasks.py | 5 +++-- requirements.txt | 1 + server/settings.py | 37 ++++++++++++++++++++++++++++------ 6 files changed, 78 insertions(+), 46 deletions(-) diff --git a/apps/system/views.py b/apps/system/views.py index 7dc89a45..12754009 100755 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -41,7 +41,7 @@ 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 +from server.settings import get_sysconfig, update_sysconfig # logger.info('请求成功! response_code:{};response_headers:{}; # response_body:{}'.format(response_code, response_headers, response_body[:251])) @@ -653,7 +653,8 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe 获取apk信息 """ - return Response({'version': SYSCONF['apk']['apk_version'], 'file': SYSCONF['apk']['apk_file']}) + config = get_sysconfig() + return Response({'version': config['apk']['apk_version'], 'file': config['apk']['apk_file']}) def create(self, request, *args, **kwargs): """ @@ -664,12 +665,12 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe sr = ApkSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data - from shutil import copyfile - copyfile(settings.BASE_DIR + vdata['file'], settings.BASE_DIR + '/media/zc_ehs.apk') - global SYSCONF - SYSCONF['apk']['apk_version'] = vdata['version'] - SYSCONF['apk']['apk_file'] = vdata['file'] - SysConfigView.save_sysconf() + update_sysconfig({ + "apk":{ + "apk_version": vdata['version'], + "apk_file": vdata['file'] + } + }) return Response() @@ -728,27 +729,12 @@ class SysBaseConfigView(APIView): 获取系统基本信息 """ - base_dict = {key: SYSCONF[key] for key in self.read_keys if key in SYSCONF} + config = get_sysconfig() + base_dict = {key: config[key] for key in self.read_keys if key in config} 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): """ @@ -756,7 +742,7 @@ class SysConfigView(MyLoggingMixin, APIView): 获取config json """ - return Response(SYSCONF) + return Response(get_sysconfig()) @swagger_auto_schema(request_body=Serializer) def put(self, request, format=None): @@ -766,12 +752,5 @@ class SysConfigView(MyLoggingMixin, APIView): 修改config json """ data = request.data - global SYSCONF - old_sysconf = SYSCONF - try: - self.update_dict(SYSCONF, data) - self.save_sysconf() - except: - SYSCONF = old_sysconf - raise + update_sysconfig(data) return Response() \ No newline at end of file diff --git a/apps/utils/sms.py b/apps/utils/sms.py index dd9b40dd..070fd6fb 100644 --- a/apps/utils/sms.py +++ b/apps/utils/sms.py @@ -2,7 +2,7 @@ from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest import json import logging -from server.settings import SYSCONF +from server.settings import get_sysconfig from apps.utils.decorators import auto_log # 实例化myLogger @@ -10,7 +10,8 @@ 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(SYSCONF['sms']['xn_key'], SYSCONF['sms']['xn_secret'], 'default') + config = get_sysconfig() + client = AcsClient(config['sms']['xn_key'], config['sms']['xn_secret'], 'default') request = CommonRequest() # 固定json request.set_accept_format('json') @@ -27,7 +28,7 @@ def send_sms(phone: str, template_code: int, template_param: dict): # 手机号码 request.add_query_param('PhoneNumbers', phone) # 签名名称 - request.add_query_param('SignName', SYSCONF['sms']['xn_sign']) + request.add_query_param('SignName', config['sms']['xn_sign']) # 模板CODE request.add_query_param('TemplateCode', template_code) # 如果有模板参数 填写模板参数 如果无 无须填写 diff --git a/apps/utils/sql.py b/apps/utils/sql.py index 06567427..c919ab80 100644 --- a/apps/utils/sql.py +++ b/apps/utils/sql.py @@ -50,4 +50,29 @@ def query_one_dict(sql, params=None): cursor.execute(sql) columns = [desc[0] for desc in cursor.description] row = cursor.fetchone() - return dict(zip(columns, row)) \ No newline at end of file + return dict(zip(columns, row)) + +import pymysql + +class DbConnection: + def __init__(self, host, user, password, database): + self.host = host + self.user = user + self.password = password + self.database = database + self.conn = None + self.cursor = None + + def __enter__(self): + self.conn = pymysql.connect( + host=self.host, + user=self.user, + password=self.password, + database=self.database + ) + self.cursor = self.conn.cursor() + return self.cursor + + def __exit__(self, exc_type, exc_val, exc_tb): + self.cursor.close() + self.conn.close() \ No newline at end of file diff --git a/apps/utils/tasks.py b/apps/utils/tasks.py index cb09a73b..6460e9d3 100644 --- a/apps/utils/tasks.py +++ b/apps/utils/tasks.py @@ -3,7 +3,7 @@ from celery import Task from celery import shared_task import logging from django.conf import settings -from server.settings import SYSCONF +from server.settings import get_sysconfig # 实例化myLogger myLogger = logging.getLogger('log') @@ -11,9 +11,10 @@ myLogger = logging.getLogger('log') @shared_task def send_mail_task(**args): + config = get_sysconfig() if settings.DEBUG is False: from django.core.mail import send_mail - args['subject'] = '{}:{}_{}_{}'.format(settings.SYS_NAME, settings.SYS_VERSION, SYSCONF['base']['base_name_short'], args.get('subject', '500')) + args['subject'] = '{}:{}_{}_{}'.format(settings.SYS_NAME, settings.SYS_VERSION, config['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/requirements.txt b/requirements.txt index 27ca1466..4930cfae 100755 --- a/requirements.txt +++ b/requirements.txt @@ -29,3 +29,4 @@ aliyun-python-sdk-core==2.13.36 xlwt==1.3.0 openpyxl==3.1.0 cron-descriptor==1.2.35 +pymysql==1.0.3 diff --git a/server/settings.py b/server/settings.py index eb7fbdcd..ef1f11c2 100755 --- a/server/settings.py +++ b/server/settings.py @@ -14,6 +14,7 @@ from datetime import datetime, timedelta import os import json from . import conf +from django.core.cache import cache # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -21,13 +22,38 @@ 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()) +def get_sysconfig(reload=False): + config = cache.get('system_config') + if config is None or reload: + # 读取配置文件 + if not os.path.exists(SYS_JSON_PATH): + raise SystemError('未找到配置文件') + with open(SYS_JSON_PATH, 'r', encoding='utf-8') as f: + config = json.loads(f.read()) + cache.set('system_config', config) + return config + return config + +def update_dict(dict1, dict2): + for key, value in dict2.items(): + if key == 'apk_file': # apk_file拷贝到固定位置 + from shutil import copyfile + copyfile(BASE_DIR + value, BASE_DIR + '/media/zc_ehs.apk') + else: + if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict): + update_dict(dict1[key], value) + else: + dict1[key] = value + +def update_sysconfig(new_dict): + config = get_sysconfig() + update_dict(config, new_dict) + with open(SYS_JSON_PATH, 'wb') as f: + f.write(json.dumps(config, indent=4, ensure_ascii=False).encode('utf-8')) + cache.set('system_config', config) + # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = conf.SECRET_KEY @@ -172,7 +198,6 @@ 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 = SYSCONF['base']['base_name_short'] EMAIL_USE_TLS = conf.EMAIL_USE_TLS # 默认主键