feat: 更改部分系统配置为json自定义

This commit is contained in:
caoqianming 2023-06-01 17:12:07 +08:00
parent 313005eb5c
commit 5ded2347b7
6 changed files with 84 additions and 21 deletions

1
.gitignore vendored
View File

@ -16,6 +16,7 @@ celerybeat-schedule.dir
db.sqlite3 db.sqlite3
server/conf*.py server/conf*.py
server/conf.ini server/conf.ini
server/conf.json
sh/* sh/*
temp/* temp/*
nohup.out nohup.out

View File

@ -3,7 +3,7 @@ from django.urls import path, include
from .views import ApkViewSet, FileViewSet, PTaskViewSet, PTaskResultViewSet, PostRoleViewSet, TaskList, \ from .views import ApkViewSet, FileViewSet, PTaskViewSet, PTaskResultViewSet, PostRoleViewSet, TaskList, \
UserPostViewSet, UserViewSet, DeptViewSet, \ UserPostViewSet, UserViewSet, DeptViewSet, \
PermissionViewSet, RoleViewSet, PostViewSet, \ PermissionViewSet, RoleViewSet, PostViewSet, \
DictTypeViewSet, DictViewSet DictTypeViewSet, DictViewSet, SysConfigView, SysBaseConfigView
from rest_framework import routers from rest_framework import routers
API_BASE_URL = 'api/system/' API_BASE_URL = 'api/system/'
@ -31,5 +31,7 @@ router2.register('file', FileViewSet, basename='file')
urlpatterns = [ urlpatterns = [
path(API_BASE_URL, include(router.urls)), path(API_BASE_URL, include(router.urls)),
path(API_BASE_URL + 'task/', TaskList.as_view()), 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)), path('api/', include(router2.urls)),
] ]

View File

@ -40,6 +40,8 @@ from .serializers import (ApkSerializer, DeptCreateUpdateSerializer, DeptSeriali
from rest_framework.viewsets import GenericViewSet from rest_framework.viewsets import GenericViewSet
from cron_descriptor import get_description from cron_descriptor import get_description
import locale import locale
from drf_yasg.utils import swagger_auto_schema
from server.settings import SYSCONF, SYS_JSON_PATH
# logger.info('请求成功! response_code:{}response_headers:{} # logger.info('请求成功! response_code:{}response_headers:{}
# response_body:{}'.format(response_code, response_headers, response_body[:251])) # response_body:{}'.format(response_code, response_headers, response_body[:251]))
@ -656,9 +658,7 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe
获取apk信息 获取apk信息
""" """
config.read(filename, encoding='utf-8') return Response({'version': SYSCONF['apk']['apk_version'], 'file': SYSCONF['apk']['apk_file']})
file = config.get('apk', 'file')
return Response({'version': config.get('apk', 'version'), 'file': file})
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
""" """
@ -669,13 +669,11 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe
sr = ApkSerializer(data=request.data) sr = ApkSerializer(data=request.data)
sr.is_valid(raise_exception=True) sr.is_valid(raise_exception=True)
vdata = sr.validated_data 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 from shutil import copyfile
copyfile(settings.BASE_DIR + vdata['file'], settings.BASE_DIR + '/media/zc_ehs.apk') 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() return Response()
@ -721,3 +719,63 @@ class MyScheduleViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, Cus
obj.name = self.get_chinese_description('crontab', vdata) obj.name = self.get_chinese_description('crontab', vdata)
obj.crontab = crontab obj.crontab = crontab
obj.save() 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()

View File

@ -1,9 +1,8 @@
from aliyunsdkcore.client import AcsClient from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest from aliyunsdkcore.request import CommonRequest
from django.conf import settings
import json import json
import logging import logging
from apps.utils.myconfig import myConfig from server.settings import SYSCONF
from apps.utils.decorators import auto_log from apps.utils.decorators import auto_log
# 实例化myLogger # 实例化myLogger
@ -11,7 +10,7 @@ myLogger = logging.getLogger('log')
@auto_log(name='阿里云短信', raise_exception=False, send_mail=True) @auto_log(name='阿里云短信', raise_exception=False, send_mail=True)
def send_sms(phone: str, template_code: int, template_param: dict): 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() request = CommonRequest()
# 固定json # 固定json
request.set_accept_format('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('PhoneNumbers', phone)
# 签名名称 # 签名名称
request.add_query_param('SignName', settings.PROJECT_NAME) request.add_query_param('SignName', SYSCONF['sms']['xn_sign'])
# 模板CODE # 模板CODE
request.add_query_param('TemplateCode', template_code) request.add_query_param('TemplateCode', template_code)
# 如果有模板参数 填写模板参数 如果无 无须填写 # 如果有模板参数 填写模板参数 如果无 无须填写

View File

@ -3,6 +3,7 @@ from celery import Task
from celery import shared_task from celery import shared_task
import logging import logging
from django.conf import settings from django.conf import settings
from server.settings import SYSCONF
# 实例化myLogger # 实例化myLogger
myLogger = logging.getLogger('log') myLogger = logging.getLogger('log')
@ -12,7 +13,7 @@ myLogger = logging.getLogger('log')
def send_mail_task(**args): def send_mail_task(**args):
if settings.DEBUG is False: if settings.DEBUG is False:
from django.core.mail import send_mail 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['from_email'] = args.get('from_email', settings.EMAIL_HOST_USER)
args['recipient_list'] = args.get('recipient_list', [settings.EMAIL_HOST_USER]) args['recipient_list'] = args.get('recipient_list', [settings.EMAIL_HOST_USER])
send_mail(**args) send_mail(**args)

View File

@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/3.0/ref/settings/
from datetime import datetime, timedelta from datetime import datetime, timedelta
import os import os
import json
from . import conf from . import conf
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 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 # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ # 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! # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = conf.SECRET_KEY SECRET_KEY = conf.SECRET_KEY
@ -30,7 +38,6 @@ ALLOWED_HOSTS = ['*']
SYS_NAME = 'XT_EHS' SYS_NAME = 'XT_EHS'
SYS_VERSION = '2.2.1' SYS_VERSION = '2.2.1'
PROJECT_NAME = conf.PROJECT_NAME
# Application definition # Application definition
@ -164,7 +171,7 @@ EMAIL_HOST = conf.EMAIL_HOST
EMAIL_PORT = conf.EMAIL_PORT EMAIL_PORT = conf.EMAIL_PORT
EMAIL_HOST_USER = conf.EMAIL_HOST_USER EMAIL_HOST_USER = conf.EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = conf.EMAIL_HOST_PASSWORD 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 EMAIL_USE_TLS = conf.EMAIL_USE_TLS
# 默认主键 # 默认主键
@ -388,11 +395,6 @@ BACKUP_PATH = conf.BACKUP_PATH
SH_PATH = conf.SH_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_ID = conf.BD_SP_ID
BD_SP_KEY = conf.BD_SP_KEY BD_SP_KEY = conf.BD_SP_KEY