1. 新增:微信小程序端新增微信手机号登录功能(必须为企业认证小程序) 2. 新增:加入动态更新常见问题 3. 新增:新增小程序分享功能 4. 新增:小程序新增第一次登录需要修改密码 5. 新增:新增接口权限控制 6. 新增:用户新增is_staff用来判断是否为工作人员 7. 新增:软删除新增is_delete字段来判断,delete_datetime当前主要来记录时间 8. 更新:部分接口删除功能已更新,需要试用软删除的才会试用软删除 9. 更新:更新系统配置缓存功能 10. 更新:接口认证依赖项更新 11. 更新:获取系统基础配置信息与用户协议与隐私协议更新 12. 优化:优化接口与数据库操作
169 lines
6.0 KiB
Python
169 lines
6.0 KiB
Python
#!/usr/bin/python
|
||
# -*- coding: utf-8 -*-
|
||
# @version : 1.0
|
||
# @Creaet Time : 2021/10/18 22:18
|
||
# @File : crud.py
|
||
# @IDE : PyCharm
|
||
# @desc : 数据库 增删改查操作
|
||
|
||
# sqlalchemy 查询操作:https://segmentfault.com/a/1190000016767008
|
||
# sqlalchemy 关联查询:https://www.jianshu.com/p/dfad7c08c57a
|
||
# sqlalchemy 关联查询详细:https://blog.csdn.net/u012324798/article/details/103940527
|
||
import json
|
||
import os
|
||
from typing import List, Union
|
||
|
||
from aioredis import Redis
|
||
from sqlalchemy import select, update
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
from sqlalchemy.orm import joinedload
|
||
from application.settings import STATIC_ROOT
|
||
from utils.file.file_manage import FileManage
|
||
from . import models, schemas
|
||
from core.crud import DalBase
|
||
|
||
|
||
class DictTypeDal(DalBase):
|
||
|
||
def __init__(self, db: AsyncSession):
|
||
super(DictTypeDal, self).__init__(db, models.VadminDictType, schemas.DictTypeSimpleOut)
|
||
|
||
async def get_dicts_details(self, dict_types: List[str]) -> dict:
|
||
"""
|
||
获取多个字典类型下的字典元素列表
|
||
"""
|
||
data = {}
|
||
options = [joinedload(self.model.details)]
|
||
objs = await DictTypeDal(self.db).\
|
||
get_datas(limit=0, v_return_objs=True, v_options=options, dict_type=("in", dict_types))
|
||
for obj in objs:
|
||
if not obj:
|
||
data[obj.dict_type] = []
|
||
continue
|
||
else:
|
||
data[obj.dict_type] = [schemas.DictDetailsSimpleOut.from_orm(i).dict() for i in obj.details]
|
||
return data
|
||
|
||
async def get_select_datas(self):
|
||
"""获取选择数据,全部数据"""
|
||
sql = select(self.model)
|
||
queryset = await self.db.execute(sql)
|
||
return [schemas.DictTypeSelectOut.from_orm(i).dict() for i in queryset.scalars().all()]
|
||
|
||
|
||
class DictDetailsDal(DalBase):
|
||
|
||
def __init__(self, db: AsyncSession):
|
||
super(DictDetailsDal, self).__init__(db, models.VadminDictDetails, schemas.DictDetailsSimpleOut)
|
||
|
||
|
||
class SettingsDal(DalBase):
|
||
|
||
def __init__(self, db: AsyncSession):
|
||
super(SettingsDal, self).__init__(db, models.VadminSystemSettings, schemas.SettingsSimpleOut)
|
||
|
||
async def get_tab_values(self, tab_id: int) -> dict:
|
||
"""
|
||
获取系统配置标签下的信息
|
||
"""
|
||
datas = await self.get_datas(limit=0, tab_id=tab_id, v_return_objs=True)
|
||
result = {}
|
||
for data in datas:
|
||
if not data.disabled:
|
||
result[data.config_key] = data.config_value
|
||
return result
|
||
|
||
async def update_datas(self, datas: dict, rd: Redis):
|
||
"""
|
||
更新系统配置信息
|
||
|
||
更新ico图标步骤:先将文件上传到本地,然后点击提交后,获取到文件地址,将上传的新文件覆盖原有文件
|
||
原因:ico图标的路径是在前端的index.html中固定的,所以目前只能改变图片,不改变路径
|
||
"""
|
||
for key, value in datas.items():
|
||
if key == "web_ico":
|
||
continue
|
||
elif key == "web_ico_local_path":
|
||
if not value:
|
||
continue
|
||
ico = await self.get_data(config_key="web_ico", tab_id=1)
|
||
web_ico = datas.get("web_ico")
|
||
if ico.config_value == web_ico:
|
||
continue
|
||
# 将上传的ico路径替换到static/system/favicon.ico文件
|
||
FileManage.copy(value, os.path.join(STATIC_ROOT, "system/favicon.ico"))
|
||
sql = update(self.model).where(self.model.config_key == "web_ico").values(config_value=web_ico)
|
||
await self.db.execute(sql)
|
||
else:
|
||
sql = update(self.model).where(self.model.config_key == key).values(config_value=value)
|
||
await self.db.execute(sql)
|
||
if "wx_server_app_id" in datas:
|
||
await rd.client().set("wx_server", json.dumps(datas))
|
||
|
||
async def get_base_config(self):
|
||
"""
|
||
获取系统基本信息
|
||
"""
|
||
ignore_configs = ["wx_server_app_id", "wx_server_app_secret"]
|
||
datas = await self.get_datas(limit=0, tab_id=("in", ["1", "9"]), disabled=False, v_return_objs=True)
|
||
result = {}
|
||
for config in datas:
|
||
if config.config_key not in ignore_configs:
|
||
result[config.config_key] = config.config_value
|
||
return result
|
||
|
||
|
||
class SettingsTabDal(DalBase):
|
||
|
||
def __init__(self, db: AsyncSession):
|
||
super(SettingsTabDal, self).__init__(db, models.VadminSystemSettingsTab, schemas.SettingsTabSimpleOut)
|
||
|
||
async def get_classify_tab_values(self, classify: List[str], hidden: Union[bool, None] = False):
|
||
"""
|
||
获取系统配置分类下的标签信息
|
||
"""
|
||
model = models.VadminSystemSettingsTab
|
||
options = [joinedload(model.settings)]
|
||
datas = await self.get_datas(
|
||
limit=0,
|
||
v_options=options,
|
||
classify=("in", classify),
|
||
disabled=False,
|
||
v_return_objs=True,
|
||
hidden=hidden
|
||
)
|
||
return self.generate_values(datas)
|
||
|
||
async def get_tab_name_values(self, tab_names: List[str], hidden: Union[bool, None] = False):
|
||
"""
|
||
获取系统配置标签下的标签信息
|
||
"""
|
||
model = models.VadminSystemSettingsTab
|
||
options = [joinedload(model.settings)]
|
||
datas = await self.get_datas(
|
||
limit=0,
|
||
v_options=options,
|
||
tab_name=("in", tab_names),
|
||
disabled=False,
|
||
v_return_objs=True,
|
||
hidden=hidden
|
||
)
|
||
return self.generate_values(datas)
|
||
|
||
@classmethod
|
||
def generate_values(cls, datas: List[models.VadminSystemSettingsTab]):
|
||
"""
|
||
生成字典值
|
||
"""
|
||
result = {}
|
||
for tab in datas:
|
||
tabs = {}
|
||
for item in tab.settings:
|
||
if not item.disabled:
|
||
tabs[item.config_key] = item.config_value
|
||
result[tab.tab_name] = tabs
|
||
return result
|
||
|
||
|
||
|