From f9380c6330ac9dade261b5698b09d85ea49eb5a8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 28 Aug 2024 16:59:38 +0800 Subject: [PATCH 001/229] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=962.0.?= =?UTF-8?q?0=E7=89=88=E6=9C=AC=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/.env.dev | 2 +- dash-fastapi-backend/.env.prod | 4 +- dash-fastapi-backend/app.py | 107 +- .../caches/avatar/admin/admin_avatar.jpeg | Bin 201942 -> 0 bytes .../caches/avatar/ry/ry_avatar.jpeg | Bin 216574 -> 0 bytes dash-fastapi-backend/config/constant.py | 152 ++ dash-fastapi-backend/config/database.py | 26 +- dash-fastapi-backend/config/enums.py | 51 + dash-fastapi-backend/config/env.py | 84 +- dash-fastapi-backend/config/get_db.py | 21 +- dash-fastapi-backend/config/get_redis.py | 42 +- dash-fastapi-backend/config/get_scheduler.py | 178 +- dash-fastapi-backend/exceptions/exception.py | 58 + dash-fastapi-backend/exceptions/handle.py | 71 + .../middlewares/cors_middleware.py | 25 + .../middlewares/gzip_middleware.py | 12 + dash-fastapi-backend/middlewares/handle.py | 13 + .../module_admin/annotation/log_annotation.py | 322 +++- .../annotation/pydantic_annotation.py | 81 + .../module_admin/aspect/data_scope.py | 78 +- .../module_admin/aspect/interface_auth.py | 41 +- .../controller/cache_controller.py | 145 +- .../controller/captcha_controller.py | 49 +- .../controller/common_controller.py | 109 +- .../controller/config_controller.py | 244 ++- .../controller/dept_controller.py | 243 +-- .../controller/dict_controller.py | 477 +++--- .../module_admin/controller/job_controller.py | 388 +++-- .../module_admin/controller/log_controller.py | 310 ++-- .../controller/login_controller.py | 249 +-- .../controller/menu_controller.py | 222 +-- .../controller/notice_controller.py | 179 +- .../controller/online_controller.py | 95 +- .../module_admin/controller/post_controler.py | 221 ++- .../controller/role_controller.py | 479 +++--- .../controller/server_controller.py | 31 +- .../controller/user_controller.py | 662 ++++---- .../module_admin/dao/config_dao.py | 99 +- .../module_admin/dao/dept_dao.py | 295 ++-- .../module_admin/dao/dict_dao.py | 207 ++- .../module_admin/dao/job_dao.py | 92 +- .../module_admin/dao/job_log_dao.py | 70 +- .../module_admin/dao/log_dao.py | 163 +- .../module_admin/dao/login_dao.py | 26 +- .../module_admin/dao/menu_dao.py | 241 +-- .../module_admin/dao/notice_dao.py | 92 +- .../module_admin/dao/post_dao.py | 117 +- .../module_admin/dao/role_dao.py | 287 +++- .../module_admin/dao/user_dao.py | 610 ++++--- .../module_admin/entity/do/config_do.py | 7 +- .../module_admin/entity/do/dept_do.py | 5 +- .../module_admin/entity/do/dict_do.py | 10 +- .../module_admin/entity/do/job_do.py | 33 +- .../module_admin/entity/do/log_do.py | 10 +- .../module_admin/entity/do/menu_do.py | 6 +- .../module_admin/entity/do/notice_do.py | 5 +- .../module_admin/entity/do/post_do.py | 5 +- .../module_admin/entity/do/role_do.py | 13 +- .../module_admin/entity/do/user_do.py | 7 +- .../module_admin/entity/vo/cache_vo.py | 29 +- .../module_admin/entity/vo/common_vo.py | 26 + .../module_admin/entity/vo/config_vo.py | 84 +- .../module_admin/entity/vo/dept_vo.py | 88 +- .../module_admin/entity/vo/dict_vo.py | 168 +- .../module_admin/entity/vo/job_vo.py | 158 +- .../module_admin/entity/vo/log_vo.py | 158 +- .../module_admin/entity/vo/login_vo.py | 92 +- .../module_admin/entity/vo/menu_vo.py | 125 +- .../module_admin/entity/vo/notice_vo.py | 77 +- .../module_admin/entity/vo/online_vo.py | 54 +- .../module_admin/entity/vo/post_vo.py | 76 +- .../module_admin/entity/vo/role_vo.py | 177 +- .../module_admin/entity/vo/server_vo.py | 80 +- .../module_admin/entity/vo/user_vo.py | 359 ++--- .../module_admin/service/cache_service.py | 66 +- .../module_admin/service/captcha_service.py | 16 +- .../module_admin/service/common_service.py | 87 +- .../module_admin/service/config_service.py | 215 ++- .../module_admin/service/dept_service.py | 306 ++-- .../module_admin/service/dict_service.py | 434 +++-- .../module_admin/service/job_log_service.py | 144 +- .../module_admin/service/job_service.py | 249 ++- .../module_admin/service/log_service.py | 264 +-- .../module_admin/service/login_service.py | 876 ++++++---- .../module_admin/service/menu_service.py | 241 +-- .../module_admin/service/notice_service.py | 127 +- .../module_admin/service/online_service.py | 43 +- .../module_admin/service/post_service.py | 187 ++- .../module_admin/service/role_service.py | 370 +++-- .../module_admin/service/server_service.py | 77 +- .../module_admin/service/user_service.py | 716 +++++--- dash-fastapi-backend/module_task/__init__.py | 2 +- .../module_task/scheduler_test.py | 2 +- dash-fastapi-backend/ruff.toml | 4 + dash-fastapi-backend/server.py | 83 + dash-fastapi-backend/sql/dash-fastapi.sql | 1433 ++++++++--------- .../sub_applications/handle.py | 10 + .../sub_applications/staticfiles.py | 10 + dash-fastapi-backend/utils/common_util.py | 137 +- dash-fastapi-backend/utils/cron_util.py | 172 ++ dash-fastapi-backend/utils/log_util.py | 2 +- dash-fastapi-backend/utils/message_util.py | 2 +- dash-fastapi-backend/utils/page_util.py | 130 +- dash-fastapi-backend/utils/pwd_util.py | 4 +- dash-fastapi-backend/utils/response_util.py | 293 ++-- dash-fastapi-backend/utils/string_util.py | 101 ++ .../utils/time_format_util.py | 1 + dash-fastapi-backend/utils/upload_util.py | 105 ++ 108 files changed, 10030 insertions(+), 6501 deletions(-) delete mode 100644 dash-fastapi-backend/caches/avatar/admin/admin_avatar.jpeg delete mode 100644 dash-fastapi-backend/caches/avatar/ry/ry_avatar.jpeg create mode 100644 dash-fastapi-backend/config/constant.py create mode 100644 dash-fastapi-backend/config/enums.py create mode 100644 dash-fastapi-backend/exceptions/exception.py create mode 100644 dash-fastapi-backend/exceptions/handle.py create mode 100644 dash-fastapi-backend/middlewares/cors_middleware.py create mode 100644 dash-fastapi-backend/middlewares/gzip_middleware.py create mode 100644 dash-fastapi-backend/middlewares/handle.py create mode 100644 dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py create mode 100644 dash-fastapi-backend/module_admin/entity/vo/common_vo.py create mode 100644 dash-fastapi-backend/ruff.toml create mode 100644 dash-fastapi-backend/server.py create mode 100644 dash-fastapi-backend/sub_applications/handle.py create mode 100644 dash-fastapi-backend/sub_applications/staticfiles.py create mode 100644 dash-fastapi-backend/utils/cron_util.py create mode 100644 dash-fastapi-backend/utils/string_util.py create mode 100644 dash-fastapi-backend/utils/upload_util.py diff --git a/dash-fastapi-backend/.env.dev b/dash-fastapi-backend/.env.dev index 840a1ab..931468f 100644 --- a/dash-fastapi-backend/.env.dev +++ b/dash-fastapi-backend/.env.dev @@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0' # 应用端口 APP_PORT = 9099 # 应用版本 -APP_VERSION= '1.4.2' +APP_VERSION= '2.0.0' # 应用是否开启热重载 APP_RELOAD = true # 应用是否开启IP归属区域查询 diff --git a/dash-fastapi-backend/.env.prod b/dash-fastapi-backend/.env.prod index ea8f2b6..c812b1d 100644 --- a/dash-fastapi-backend/.env.prod +++ b/dash-fastapi-backend/.env.prod @@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0' # 应用端口 APP_PORT = 9099 # 应用版本 -APP_VERSION= '1.4.2' +APP_VERSION= '2.0.0' # 应用是否开启热重载 APP_RELOAD = false # 应用是否开启IP归属区域查询 @@ -37,7 +37,7 @@ DB_PORT = 3306 # 数据库用户名 DB_USERNAME = 'root' # 数据库密码 -DB_PASSWORD = 'mysqlroot' +DB_PASSWORD = 'root' # 数据库名称 DB_DATABASE = 'dash-fastapi' # 是否开启sqlalchemy日志 diff --git a/dash-fastapi-backend/app.py b/dash-fastapi-backend/app.py index 81d0bce..1ee7695 100644 --- a/dash-fastapi-backend/app.py +++ b/dash-fastapi-backend/app.py @@ -1,113 +1,12 @@ -from fastapi import FastAPI, Request import uvicorn -from fastapi.exceptions import HTTPException -from fastapi.middleware.cors import CORSMiddleware -from module_admin.controller.login_controller import loginController -from module_admin.controller.captcha_controller import captchaController -from module_admin.controller.user_controller import userController -from module_admin.controller.menu_controller import menuController -from module_admin.controller.dept_controller import deptController -from module_admin.controller.role_controller import roleController -from module_admin.controller.post_controler import postController -from module_admin.controller.dict_controller import dictController -from module_admin.controller.config_controller import configController -from module_admin.controller.notice_controller import noticeController -from module_admin.controller.log_controller import logController -from module_admin.controller.online_controller import onlineController -from module_admin.controller.job_controller import jobController -from module_admin.controller.server_controller import serverController -from module_admin.controller.cache_controller import cacheController -from module_admin.controller.common_controller import commonController -from config.env import AppConfig -from config.get_redis import RedisUtil -from config.get_db import init_create_table -from config.get_scheduler import SchedulerUtil -from utils.response_util import * -from utils.log_util import logger -from utils.common_util import worship +from server import app, AppConfig # noqa: F401 -app = FastAPI( - title=AppConfig.app_name, - description=f'{AppConfig.app_name}接口文档', - version=AppConfig.app_version, - root_path=AppConfig.app_root_path, -) - -# 前端页面url -origins = [ - "http://localhost:8088", - "http://127.0.0.1:8088", -] - -# 后台api允许跨域 -app.add_middleware( - CORSMiddleware, - allow_origins=origins, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - - -@app.on_event("startup") -async def startup_event(): - logger.info(f"{AppConfig.app_name}开始启动") - worship() - await init_create_table() - app.state.redis = await RedisUtil.create_redis_pool() - await RedisUtil.init_sys_dict(app.state.redis) - await RedisUtil.init_sys_config(app.state.redis) - await SchedulerUtil.init_system_scheduler() - logger.info(f"{AppConfig.app_name}启动成功") - - -@app.on_event("shutdown") -async def shutdown_event(): - await RedisUtil.close_redis_pool(app) - await SchedulerUtil.close_system_scheduler() - - -# 自定义token检验异常 -@app.exception_handler(AuthException) -async def auth_exception_handler(request: Request, exc: AuthException): - return response_401(data=exc.data, message=exc.message) - - -# 自定义权限检验异常 -@app.exception_handler(PermissionException) -async def permission_exception_handler(request: Request, exc: PermissionException): - return response_403(data=exc.data, message=exc.message) - - -@app.exception_handler(HTTPException) -async def http_exception_handler(request: Request, exc: HTTPException): - return JSONResponse( - content=jsonable_encoder({"message": exc.detail, "code": exc.status_code}), - status_code=exc.status_code - ) - - -app.include_router(loginController, prefix="/login", tags=['登录模块']) -app.include_router(captchaController, prefix="/captcha", tags=['验证码模块']) -app.include_router(userController, prefix="/system", tags=['系统管理-用户管理']) -app.include_router(menuController, prefix="/system", tags=['系统管理-菜单管理']) -app.include_router(deptController, prefix="/system", tags=['系统管理-部门管理']) -app.include_router(roleController, prefix="/system", tags=['系统管理-角色管理']) -app.include_router(postController, prefix="/system", tags=['系统管理-岗位管理']) -app.include_router(dictController, prefix="/system", tags=['系统管理-字典管理']) -app.include_router(configController, prefix="/system", tags=['系统管理-参数管理']) -app.include_router(noticeController, prefix="/system", tags=['系统管理-通知公告管理']) -app.include_router(logController, prefix="/system", tags=['系统管理-日志管理']) -app.include_router(onlineController, prefix="/monitor", tags=['系统监控-在线用户']) -app.include_router(jobController, prefix="/monitor", tags=['系统监控-定时任务']) -app.include_router(serverController, prefix="/monitor", tags=['系统监控-服务监控']) -app.include_router(cacheController, prefix="/monitor", tags=['系统监控-缓存监控']) -app.include_router(commonController, prefix="/common", tags=['通用模块']) if __name__ == '__main__': uvicorn.run( app='app:app', host=AppConfig.app_host, port=AppConfig.app_port, - reload=AppConfig.app_reload + root_path=AppConfig.app_root_path, + reload=AppConfig.app_reload, ) diff --git a/dash-fastapi-backend/caches/avatar/admin/admin_avatar.jpeg b/dash-fastapi-backend/caches/avatar/admin/admin_avatar.jpeg deleted file mode 100644 index 6fda0548459e5a43be8be8dfa745bfaabbad6b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201942 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 z


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

#XJb-*raW0xZtGMMXM$7&txYqPGec7Q9SCH zqVK12zPZ5+xJ6ddftGk1i7vx<#{BXocIGmgi&5c>BM$}h+D3#T9v#I#VbDbGr zrDpKyaMEIMa3qJRHe4V&8^^W9J6`yv$!EG)#hH*xNt}ez^*W>5ka?72!)A2T zgzXU_aBnGA{GqQgVt~5?FYO_mili3;r1S8GJ7nR8Qu#LY(x=|SAWxmj5o_xIM=X%pv+PGO`tqyX}13g$Y<&51(Uv6z*B5ul@}NJC!9CnRQBzKXeMJ}q6{ z>p*XFdVii<5;+a2xd(4_@N)2i!W>sW(QI2(=}tdIt@yx8Qpw081j9YiNNDFstG67e zh~!9O9r>`IlX=&^AR1=YvC_hHox;L9vQ0T?YfAg5;MvVC+|p7{YKf`l&{nzCfoRKI zIGp^6neuC{jj8P?RcM^?-e%)-zmA>7i@D5unDbByqdAczzH@?z4?3bb-o8iwoeyo% zhL*Y?indr-a<*!Ck@O7*x}REDlV6m91}IsUxD83KGijd{$D(}1Z~m+=6eU1G1x#-V zwnt?ih+qv1lh7yH`8Sel-i=I`P`TC6#Bo~Zd5vXGCv&I{ewM|G5Nz{HD4S}o!d{v8 zgn>{%TabU2X2I2nC*p2JX+r0+hsC|ASGg|y*?r?W(>BMj;j_rM{%aL) zlBTk<>YmmuYPxOVdxz}rWFFMqFH2~3Hn92|;GzCTIZL=0_ik;wVy>!5S|jUi zgf7x@;9x*D6pf_fJ9MIBJ$Y1RH;=XK_d{L#8X+U;sU>@TMMp}gSCK1s^Y;8^`(?7c z%*hu#oZK>BQo>?;QUqm^-*k{9JB~7~6L2s&yq7wt1tWjp5jr87Pb=aqI7_=`s*5&r zMnfkhzL}q z$OI(JS}}9q#$>O@%(P;xCr(K{{5s5Wnez3{?qfJ6DOJ#b#fM0(B-uLJl z;HiG}WRrCHbK)*B>EXT)KKNZfo=)%rmeYm#%~$8J?)_)^-jL98?XGwPZ_w>A?gwqL zkB=%ykGG3S)qW!2iGjBt(eZ~mW^Kzq+EBgK-pKBoF%$un>~-Yp(a76f-IRC~BsU?$ zXa1Yzei?Jq-%Qu$zxBp7_OILIL48*OIbAG|4*5U_;!%i!*&ljxf-}qf{w(fPS5Jwd zC%P?I3?VmM;L~iP=OgocnrqJQ_pS>1)4I|qfN5%vq11F+Hw$eMZ_|%JKk|i_hd+h{ zCtevYGF#-bTzzGjn45B$3}UG@GaVi&M#ib}tM%N2KuOXWVH~cZAiI4idI`K2}t*s?AYX>R3CJGS}bs3*-y2e3>e&UYPOwQ>+_K zOpctP`Lt3*!RF^XHhG$Qh(xPx@qOd@;AV-8ZA>I;9AwSE_j0_1;t}?b{sj{Ls(ISO z1h{{gS`A>D(1U@~Yfx_c0k%piLwcf@hr4f<0YO4#SOk*FOK8;!xW9nm)65JNL~#<*MDorl%_?MEjHsHmaT z>mXI5f%e2>)TciM0GQ|-X1v(t{xP&1`mD+nwE8*2PwtyY45a58^)dW+gMmr|D(b$5 z{=?}QqZ!Gy@A}GqnwFAQamKY)-i0LI2r{uDbV}uM=}X_+D~H6OJpOCU%$?i#5{QLd z1|jfFXnuCHh=?T2ZnRlnjHv2J3MH>db$Tl(0%u2emX_L4HX5Kk?df#{E=p0o3gs&4 zP(b6sMUzmd3(57q5uz5JL_O2nYXp@sIPdw&_tXYa{0HB#ta2<@yZ){qK)2!Zk-P06 z{13U&7+w40rsOrtO6czWWoPR~s5_3x4E`6s5vo}t-(l``*?&wqT0spaF2r^5KQ4X! z6GP}6B7k1L`ug@54{YNQ===K@^wI`ANT+bh0^k!A>;S*+Ydr?knm$SWhQG!3#*sLG zlT}+eo#QY-65gtivFvN&d*j_NmekAjNI30#y5bV- zw>mXZ>5x0iBj$vHuay};&iSRrq8|%(a!OH8NW0F7&ewKj1OAj32k{j#q*);=ScE5S zY!KZ+d(V51k+14klqu6%tsm+&dIUSX!D_TfF>g}p9qW!=0>jd1$5Xv0ia%vRsB^60F)xouRijLApKbG{FBrkuQ&y=M})WmN^o7ehXy!Ji<> z#k(c$#$r!3QNtKrtQ=nR-7%loT-k~o_vUpTurbcHE3Pcx%$v9TtTHX3(GA*wmih}I zWpe;c`;;7vnS&>Z0nJlsRdxK#^}CfMA(*hT6x2FLMECwbR(9TAnQn_q>Nc-dv(+@w zs&r+hz^Mu82v^@MVdbJbDp~6``ISsk2oPQn@~vZd+aMdS`%pxVswNKfezoz%4!7@P z+Z$hdVh3`?jCQ##ci7xgsh#QNVu9PZc|<}ulB6bHNq_`Pv~GT@u(Ie)WvO-K(~svl z>o=ZEL=Z^lhy_el0#x34Z51vrtTLBv+3IF(xL{U(;vm88k(erD&!(~{DFJ1rRp;ny zj$U@tn!GbegJl)_%Oizmy=TD-VsCGT9@FC)Gub28ii(Od7ssRlfoE$?=O7O_yze-} zk@uJdGC4k|{TfWZH@j1*;Mp%DKri)t?B3(*FJP^DW7pul>PaN$8uaBE+y#_n@2RY&U$_N=J=Q zDP^i#q~36Lu~#9P$HjTf*WHMF$(qqLw6AoITq6St_)7L>?fvTE_0w%>S>hPcsoxbu zpE7|4Ps0I7kb)UJcpRg$Kq%efF#n*AGMy9}XrOpGcnYC(efKwR^R{$bwXM>gVa-WO zYiF-0pUQI_3)8>u+Q4khd{WM3K#x$#NOA$W56Ns&NFzAENDTpOwMUeD{}h;duB-_* zc|#KtAXiz_NiZy(FG>c|wF66`Q&liDm~4FSBfodm ztTbE2zX`W|su?W&n2=)Pt1y)xI1tL90NqM(akXAdTmXNK|LAR@dWw}FYo@YG@4>xB zSmMR;&i5K-eiIQy)=hpKo^j%vGjD5AytLDnY`Jj&>{>wVOHxi!sPAW=&Ea|SN~-Q_ z)bjVAu=E4pSQxZV(gde6SGbWM>mSWF=1g->%)Hw+%C*4GjMR4Z1!>WrKd>V9r4r~f z@mxlJrS^p6dyIuV{sov!u18(KAvEg<^x>(K4M?`2xUK5A6dZ8IW^b4+@+IA8Biib_6CI(7QrEVrI>1_zvOy#y+;Dw*z55Bn zeA|Rbzz&M&mUTTr(dR4tO-}Ro>~`zyqs%;=J7@QAwq1~lh2IquAWs%DIgSZe226h} zpPBXh2)?@A$!wIn zpJQq>568`+=gjW%GT(ECGeMxN)8krS4YLa(gA>(iE=Li;9bY~7?q(u^)>MKNM4fi>Mrq?=4mYE=hN3

w-N=*&I!dF-#>eKlhBd!MjBSReRU$0RLebd}CP5g`h?i7K&zjT+FTEbw_ zb4<+VFRMUxjY{Y;Pk+8Q9~3lt;3w;$6}*3yt95nK9>za{?>Vl9oQ0o<8?9E63=J~V zQiq#>Ogv&A700(@yh0#Fe!*Ws#Ic*o)M_nt=tVwEyLS(`GneCq2CIILyf+z zIcL>93Ua|=XY(T#(ndVsD$IO0wnZSPIv8O*MPB2DGMU%~r5Kpk@TS5CT(lw(EU<(< zo_;^Y^!^9=8Y#)|-ua4ZNhiz@63FrVk}nFU9OxIXkK2{{;`uxjEUbEfFVQ>5B|g&9 z^9J5X7z$XiT@y8e`}TehVspDHr?gOWrK|xPF(&PIxQRNHSf~WPJcLa`Fka>ecGs*U zty;Q;Me?BywIYRC0YZ72TBh?~l!NPX|9E|av4G;dZpS?_RBhr!rk&O?Itd?Tx;Erc zU|O3=o4W7fNC;=`sZ6Vm0z#(sp+1)iedb&Cmg0!9P)@!(?qDZ}s$q7E48frYbwu@6 zrwQLY+_X12vr26K+>GUFucY3WN?kfI*GVmWNFEYkw70t-OJz0z9gZ{5F|bmO^gG6X z7~gwwl(habX1BA%p{*yQCz6veR6dl9U!AV0`{% zJZm3FFlVV3V1AK7qZkET!YGsYCygoxS!wp&y5;&>#$&iykbf^V91(>k_rijG>K z^A)7~n;(a*2?s^%G1HRZD~+^v8rABS0WQ`vuFK~#VzdN2XFrn!5vZ~c<20$BDQg(f zn=SBpxm@SS%KyY7o%zMSO1(!)+E*|Hd+&iEd3v1FmLnDcH9U8F7)D94-N3!CGtEP3 zw{Sg;@?wp6(bwNvzJEZWQ%`kXFXO{Jfdd;N02U~P<4+08CAeEMIG-(;a80F*G{X*P zN_Wu3SSlKaO=0XER*%0LTE!(v6yq6Z1b|;4^6B^yUIm`S3bZ-NEcEXIzgizsBgmHP zKfVqB-50k-`?V$QKb;>gi1HT@+8_i6g2iHR1n***TVnll$iW{41}C^O?OO9$AwA@? zB)GIbb7jN#Ip?1h9l!W_%)Q1=29A_?i-H!zuej#^!RFr+h$LA!<(Yw&NRQ^=YHrPB zY+}@hMY#XMEP>FlPM_*$A*ynvL8S=6EYrSUhFI86pw-4;@pg(>E(`)H#ryIEQN#Y5 z+j&w$c~j;a4{NmR_vX7xFIQXZW>uFKA5*@O+nG(e6eOf7(SWF;=q0H_peS!+1cwnx z5k|guFFe-R2oRBhllz&v2}NnOh;`Xi+jIi!3l-Hor=O8#y+ z*Og*-l)t!n^de!2-g-jqKBD;fMQAe)REaeU_l;^>=>)(Dc;mfQuXL@TBG-0`2H`&DDs8>dHAgH2JhoeZ4^hQF zzmnxu%G72Cr3SQL+|+@7W)410Hd4pW;b?ZJba~tZZ+Wq<%NGla0jUg%A<^HN0fC-p zyM}QgMUuT^X9A6k+GwAUt%mWq$B%&uM((ESQDt=ZZt7KT3YLRqGs6>0mS9Kb=ofsH z(V&7oBxalgFvYz|w!qq^+B?_@k5YZIC@waHTXI8?8VyYw>i57;hz0Y***}X@YsVl+ z0Qkaw;vQr&mok)a^EQuOayW#ISw4<6J9qqD09x#lQceQ!A+%Hs@8)#@T!+51#-BmO z@*PHQk_x#bNZ`!fp5b21&L5@Bsr5C>hZMJUN7-1U;u1*gAMQsahqSBJI37kniR;XF z_Z%5JeX^E$8gaAVG-#vqTEEoJJceRd{Z&z63k<11Arp}+&*z=(V=1MPtp1^@%E6>` z-N)S9+8kL;fbTK1i}Ed=)3z-hM}9(U4a!Ffg3jD#4>SlziBh` zxWZvr%qUhdhe=^+FP(@p8&^SV>A{R}l4c@$``UVZ@X(A^NG+8CaEYqx*pqRJ>vGd( z9@k%gk>1*GI>yT>bu4&GnGn(pvIRnC2DqNZydBGuK1CycMI}mYvZecm)Syqe=e)WZ zQzg~L+idUIxv92^(?T~{nOP#uhM>MWuuvr(Xde)auy3~j|K}W6HbY@cKG7|bP7~Ji zo{_!u{Tx;Ag460_lq2lEX6Zy)D8kiLA}vWW8vyG@50cA}6A6=tGxv8NtLObX$6V5U z!ZMp5#M3qO)@R3 z!)6Xo;$zd4_=RYXf^|4EpI^kisY{|=8y*NcM=5yZ$t&VHX~u)6QMsHr6j;BC9kUyT ziYzq2Lno4a=h_%8b76XE;6000svk%qpa@sDd7Wc}BaCYO^xaGwSy8g5R$7y8 z&Md_YYCo3gt5R3IA=B}+r1oh!_d(XX;YMwa8K?`*UX7jgeL95EkHecYyJp&QS*EY3 z8qZzoTeQNK37a$y85D>BM}xSM=?uoAL$bn%QV-ZV@Z&5C@16kX&*1@?{Y5 z^Syr-;5geeW8Rj6(d7J>=$9jsK6O*61UL;xSUJ~R$H^o(imIg^;$gYDUCpFTj7y2k zt6fW)X5X}#6xzyMvr0>*l*Nj0U~6GXD#WNk$Z#fk9#1k28?`1jBRpXF3Vvv(q_zf6T#Qrse)4b=o%tEC{pvQUT^=5IF? zk-r7-W;J-X&Ryd%q_Dfool4Msx@6Mnw^K-vTvaKFBGAY`K4cvV4lGN^1wMd zH+0iJyZ!DSLoz36cD{x-2v7#g^la|vZIoxz*N0D2rhdlp0-&j+c9g8v&fc}ra1O7K zISll_fDT00+v}S?LVS#GqVI(mKp{n^PgmMd0R8otRtv#RDH#8O&##2!m-G7#LGY+@ z_Ja+fQqD@w5wkSux4+i4Xi*3AH_Dk!3(~=7^9?^W5QIOjTf$D)S#aJNiOIts88W6e zN*R9UzBr~e);SVesa)K{+`p%|zgxyBJVvTKXV1KgSzC;L@O{HTu6QPLtJgF>7knt< z0rR&1xxAT^DKX?bjcfN+Qsb}}c;a&Be`D;2O-?{7_xKuSa4nYQboqAQ^#9|qqN!=X zhIqU@@Bh=fhyJUA!ON5eCV7ZQv}?~a{72ovdhze@99nL`f)}mWhZ2SnA_`;6EdhM0 z)#9&m^_YJ&ic}W={6?l{Q)i-W**q)+kDXlCKiYL(#)_c~uS8MD=Nd1xw)7J^CX|a< z)7g?E)-t4Ykc@c}Q3)hSy1`Ks%V1Z0n6{A0y225_pSq zMwKpzL}pe=B}crvK-i*L-}rStw{-_wt+|SJzud7DtYrSA$zOnrXo-8%dh}o`{}eDl zmwNm3(?dC!x%#)&)5!gj*}B{K%96?RBz8|#Q)){sA_Bur3R;D%<)B;u)$EuPP>lh8 zqC1ib*U$vIa-3M|hUF`9)XLNqcD`|c?UCGZ#ZDJF6*3R)3RI239G@=%{o*QPXr z-$R|*w}}GH3i)nTkL$yetyUy+I$bkyFr7{}fF98x5C04xA$<yEO;~vNp`_A%_0U zsXcW%>@&Z>mG6yOmIe;mK0p?ijnFH3dyn}-=s$OX@`OjN*)OX86ZSvy-1=+vml}a_ z|9y3X)&j~|5=h^GJRfh}eIAvOiV~8_B@|Lkk!WD*+PS@`&VK|xQR9KZg+yrrW;JG{ zq%WuC_04Dts>0QYOLsK{9K{%;^2sH;X?++U4Wd7?W+zmngNi&NR_5=|et$>p;2;?! z!}22|gF7Q84I+{b?1ow_HP!&YZj-$o`3U|Pj<{mInBZdt{pRegwIQwGLxKs&DLBdf z8Vj$Ce9hT;dwuNxI03DP|6DQG<24u-`=Hi7&;Xf&phC%>ATX5w?KmtYM?&CE;Q(z~ z3L45`&3Kk$ew7y-=swaX`qf7;Qt!CK_p;w{z;6ColL8Bw*wvi`rTxVd2~8OCZg7tk zgG$I%P}ijo?%eU4d%Pz3G%IZjTHE|po{+-kn4a7De{fI)V1YObZoDS_N4{bKT9xT7 zvXlZ-xSoGY7?}-f`2==@X(>sZkZ^o@JrbHk-7y5Z6GI`m%I=n4;-P0AGbUqLP*N?-BxgF}ER+qrBXgWF@E`y5i{8VEKkIZ&djQ8g# zOcn@Ur}21t8zRYM)nC2(ChSUc5%_EbD=c))=b>}^~ly*erZ{CzC~FFI!Vw^X)b>Vn?_P0 zGfuUk=!)mh%1!5Xn91S#y;`cPlqH-C4UG~&QcrDl@p~mLT=GbQi4gGI>_tkbttqe-66x`)?d-0Gf7Z8lneUg*A~d~?%bD? zF1D4=*^qw4GnUy(qfize0ZYCIpdpPvdk~0cw)AnC$KyQg=bFuLNQqz)j;}_{(uI5A z-)th+Pd8V^u3rYa#kSUOU1DzH!ntanYL4|bS{hsa8w3SQtAEyy5vqa{=zbHuk{D7jG%WunMax-D2;+a&1eyhO>ir0x7Bp{0O|~k=ZF;k9g1i{O&^m z@{Fv?`%e+wxwc4Gr%pcYj`+wbxhAGvItP6v3}Y*38$rAx1?vDv;g%<&8^@v~&gAj7 zxa)1)_iTIFR=r{TW@ak3)PwE!$o7XG{$H1N8qJ#~7O73fjh3n13{4FlVia}`ZR)}y zl)9$LbWBegk00o=$UuyPT^iA>tl@FGOU{`nQu@6&h{pOVB)y(l} z!~!h=$2#Q8`dDgh%mHkMm?#JuM=XZ0>Do5=$rAJtGIU)$?1 z2{J#J^0x84dwp)Ti>BMK-cu)=s@e(d%DPf5b*&A>C{}df;YDH~27?DBeg&7^NiW_d zM7)O-JYP8*i<(M6=4j*L3N+~ zG>H5E*~7W{Rq{$1ec(KT1^`K*jHERd-UX`=_?c7Cl`vfRjgbz2+{l35`aP<+U{e3a|0K!pxA2PO^o4zaIdfD8d1rj?aGKi=H2- zFp?_P-zlqN0{U6`92Z0{A#5Y-N^ajIgzV`=r0%1u-k5#sX*d$^AC*#eZ7QCJJ5#L-8_=oa=I>^6|0TjP>n_Q94Jo zMYYw`0($HePo|^_A{t+wE!k8thi;{{-$i>$QMK)S_uzL3t>r5-c7dvR%pH$HYNxwV zmr0>UDg3F{ZWq;s2`Hy}@6P~E>NNw!SNrF|5+ z>!wH8HqKL>@EEbG^$zQC2adQAp0O$n`bhu>JV@$lEfHWg^gi%r6YqztNutoKj|`9A z!O+TB+n#v|q}>R;mCoy9KgZi4+9FjK0W`dn0Ab$2QNqj6J(<{q%2Z#4y4N$V$;X%t zycm1$Tw}HMqyaTi*f#f-*j?b9S>OdeDJYK6NP@xm>BX3w!#IiS#%ks1F7{)J=}gXH zDuzB`DkL=Cg%Bn^U;WvLY}`8fv@lu~aCB_K*&DGg9?dG}rx6sdznpLJ9 zsVxbZcyP4PaG8N5uC3S6&vrOnq5v89Lyd@LRRl_I)Q%ooQOT2`%{l*9ik{t(*4V$ZNh3OEK_&45vpRHmT zL3AGY7^Idul$tz5Km6u7Onr~~SoXmEAE24sxy7xFtA9?!72|i~^C+#6DnLfOU=1F6 zgKX=%zPJwYKXYvG3IPrLlc$e>&c_EV>?GuV|H|92gFegXjkWykQ~0~aP5fq`r^mj4 z=D2_Bb2zZAJD)@jq?n!y@~`Ess9X36;YK zRyrkelX!f>FGC~oC#GG|lN1w55}nAt^b7Cv{{;}B52ocV`%1malQS|Kl)W!?57FQ# zLd%|&FKnN}36b{pXxQh3``1{o$ANBJWK3~RCr@_tsC1YMzKfEG(W;kY;(UG?eRO`2 zSVC7eDx`!e+hv=|zmB-IMC3tu(O5(3XgCT=!I-px>v4WI2*T)0R>MS1&&mqxq~L_- zm+Q60B?(G*ews&c?1X$nvn8IE4;Z8W@25sCnyo{*G@fTt;`PTcBJp#3%l^d2n(TBO z8v7CXYU+(Jp8m9!ud>3@2KW2hEF8JAR=L~JFG>Exe17BlF&(t8KcN-&q^Wcr&1D0ykxs9{H={Y$0l~P#h2>j)UK zUqA$RUHRrk=3r}CrUeS=@h6HRX%iGyNGVF&kwqe(=ANdt{9!NU6byP;D*~<5;t{91 zzOu5yLq*X@5wW1+5@&)C*SI&yEp^?)6&iDSWw~7lm1^Vi11L3BlUWr8IIT>d&rS6l zkylh5YX;kjLp@$YQh9Py9DOL(HS}#Fg=I1ho}jnPIeAzAm%8pGXn*lWjjmUPm7L zXilYQ`cg6Pg_$#*0z-yNKT5)RYGtxpw^!LK%1Y0C- z(VGS!OV*(<`v`}lw_sQn#9v|dR_9o3>V90O^G)evc1v1r(ddg+((Usx1ImC12pC?6H5ioBraaLA8wb=~G<<==o!J|<6a0>~N*uJW(Ncg)otZj@@P*zp@fjy7 zabESEX{K#1HoRmJ`jams#vTEVUv-x0Q5n7O1NAqZI7{3a!;|H(%QNn z$G5p$K_`tZ>g1P>bD!IK^;fUd=cMK~>$}#j<4@XTO{F?A)YPi9Sa^~kJ*so-W+`~` z&F!&%jr+dsji`k(MY0yh=r+pT3?sIj$7YLW1e*q$MWJ#_MVd`1I7G$*3_RT4XQL14 zq?CX?L&xBAT-%3tu}@r%idv&PySzhlZQ8FhoS)OKo@ghmUTJgs1q-H|#Z>x~&kD<` zM338{q@@6bO(bRa=stX7u_hqcwo;e0!hi{B37WU&) zY^$2<^XQTpcQ3p56^$Ho-Zr%ot57fw$Fb)k+A_PW&QsngXYB9J;VDM(+{oJa9{b^R zURS?)ZVCZ6H)m@-HGTsPL^Z5<7-iK~hw?}T8n6d7u%2!|m|X~nVypbY+@zY+RY^K) zjI%-sW16pQ#;uG!qHU+r1BEUlHbL@T7&@3bM$W6fS!l? zO>$a4(x5jX9e?B#&&}FGjyu{AslQ z0-6lvsRlpz8bnP&yumUHNCf2xNl5^xVfW|w2<#ZN7`Z@}u3U=LPq=EG z4?pesjyw$l!EuzAHY?0L%zz^H+lIx2)yMD9gvX!V%#53q_5xj!V8bPE(1YL>GfkzX zm)g+~${)}{MCN1VQ$SFldwuL1d8g}31UXfi!EoB6&{}T6Cd0*1iYL@Wd8JWbqTvV; z8UlfIAm}%V^UyE(7uAyqrOI)9^+t9!k^=sgq)h3?YY-{pmsxx<- z9dHsVrYjwiI=f8dvq*<@kkO}jfy5~IQ|1}zMV^t9!J>$1>YkDt-<{k!r)udYt~TG|K>~#RoT>_)64po!P7ym z_qo(-HA3Ec3`#yvW0gKu{+-6d&3|X)LtL-3@cbQ2?Vh379WRV_LdOv(#C(0gzOk!)qE!r%jI^tihZPySGPdix7NNA*pA%?F9I$v=C6_;Rab^W2h8@Rdx6 zWgFw8G5nI^NB7!h&-0M1l_wgwe9Q8a zm-g#VWDyvzp?;~R3f~mEKv04e*u3yPI|~z*Op%uwwJr%U zYA8yZ^boY==u>`*WsrAy*E><V{d=KWB*om4YOW=8n}@e?KZC5x-JdUqrP4P8I;axLQp> zjUqJNLfW`z?3GqF!8W@)n&;rhl~if6@UkB38X=Q8Hb-cC3X>vp@c#OnxZUqF>rc@W zhUZYRN#oO4u+wW*J)7Dk+cnXj?ww_l0^j)1*J7ST);SQj_05n%G4B(;>wSFb#GgNg zIMly8_kNpShYNukf}X5|n8lph((@ASzWThT5<8sk8BX*Yf@#es`l$|{=3CfKt63gW0i%3=AZq;yfHHfQGpz9KUK1Py< z6vu}j4(wDO`G0~NcGB^kovp9c`+O*e@i$2d6uM?fY);nrf9QevKQY z+|3J*_n}|4TWcBkP*Io#H9jZFy}9;JAz#rk-ku|N)O3&4cz@Fs&+z{hA*q>A5+In5 zujvDWyo|&c>Ba9FtDdd59rv41st>K{^wXu}JFb{o$K zJUpzY`3{Y*jGaQ_F5$1h`0i&8CmO_t3}=N31#@OX4cDYFO_WG{jZ8zq6Y~%xTTYHj z*T?R-fI@8{onz4!N}WmxkxZKi_>=Mee84x-q&_27xhv$_q9d8&o&e{jrTtz$+e0_V z8}!EPCSOeg{_iZOJ4=<)$N;HPW>AG$+Z}pYI|| zlLSFo4r6z|zwRC0Vy%}u=dK)Qi>5B9EYs1^IJ0=Rg!0PbGeiGMAkT3(#zb8?e2({w zU75Gjla3;E=dRtW@PrMOu>nP%P36=1zQ_ZT2C2;5w@nmIBFyqb~CD-zXcjq znkuk~_}=e=j?CoM)hLiT+I8eBX_ew>&bA4e!_5l|+a#t(mXGrTc4N0hyn8%g6h&3i&h!<=x2Ph&d7kjw=Y2S(_NeVa^`k zHFIZ6ZOQiBraR*}ZiPZ2%LS`lK{}klWSr=XjmH=Cb#C8p0y+wk0EtQ0w=eYS9}3G! zdS=n&8>OzWP+7FCTTRc8Lkd1Vlks;UslM?4@+$m`jot9aK^VHLNbC5o0*;hF+wq$e zmX>;z#M2n)6ADt>Qc|cv8G+MUyl*U@g~$A3wB;^FD7#A(AL{#*Wc@bvW_Z6(K8_aK zJ$}t^Uw61+Y86}mW@^DFY(PTGWhA_^W;U-=o2tBY#EtOzbSzJC{o?BfN4oK&f$8U1 zIhAWxZFsBV7#coul~G0rqK8i5!BPr|;gOHY-uYl_*#prF)RrA*^)kE~kEW?mcx6%e zr%kN@MWI;LBoWD_VfTKIbbeFGj9GzD$Hvl2G~!z_YsL+vwqR@4D!!GrN)YFoz))d} zbn8CrrcE8WCSj#3Qu}ZUsFLPT^FRqL5tN9#?dBBH!a`OU&$+63m)qS$c`a~|`QY!T z`1?9|-Por)-k7OsGdHcS+?>U_MO>GV?Ey2Uki<>cjRC6$X9d$j}<74G@cl~nV>WR8;n(kg}1;5TOH#O}iHDZOFn&>(Fz75B^62do0 zS^~CE5E__&=@NCeNibaPD#dA}RU<{fJ!ZFA1Fo>Bd(tMLfOp>e@MsCU3# zE{^pC(YgQQuLff~44a=YfJ?73#FRU;I&BlWS+Ku$)8Y$t^+F%s$9eNc!hYSNO- zkirJV$@>agoKM~4J+{rZx9jI#EZf<&r%WMn01vB`s6wEl^Ngh;R~+Tqrf8+OGrf;i&!sc8r}hQ|aD@@BacqhAY8Zi6_|lI!Yd&TSS5ofc!_5;n2qd zJT6DvZjYGm@EfL7Bgko`P*VLg+cw+qWyXS`7jF)BlmK^TBl1;b2puW;{e%Qpa^*Nt zqFo(^=NjjyzJnF33;~b>Vl@8S%~{4?xSZ=7I4p^}7&vwh?=yO}nby0pZ*c%XHhr=m!w@kmGEl~&Q^-gB6%*YEqQx8 zM#7SU1jokeGIE8pHx1>*!p?zbBoZ7LFem!R(-<2}N(7Sc3-+<90CwnShOO)5Mmb-} zQ1%@4cT@OWV*J!fIEUfql}+NB7x27ELnl+%^;5dl zHdw<65I-ST8I&YIV{XxjPOgroH>qPV{W3{2`!ahaPDC1l;pP53G}9z7gWo>kbQg2` zJ^SPV-dE@Um^!Plw$`p|1BGJ6rMSBm_u?%sA-KCspt!rcyA%!X?(P&P6t`lZ9&y4Tx@UgWl z#Chd$%$vpG#=X6n_xFMM3CVp&QE@dlT38mPoF-<yU=QPw%FR zV%vz3)R{+HHt0;S*AK!BdgZzGownt#or-@xhoxQWH(r&}8jt#NdW z*08^=RsHH=0poqa**K5EIy@3;pE)?W$uagiKc&LyB`(7R!5Yb$2BOc*F@=ln;^#jsnK%3S$0<4HvQ+@N3lbVb^j^P8zDkStP3LozJw*UwzefMmF~6 zKz_(#;-s&wN#{2fg^tLk?IE~n6kDX9ECvt>w5SG<^F{UE#~eKJ2?FY53+OU!j3xR> zgF+$$tw;Y86!HmD{^JE=ZQ$)a41O!P{IbhX;0r;jOeiUMS@7IhL`ue_`&Fjzw7lB@ zwNpE?YPezeDb1;_;nB)`{j-b|;KQ9CuSX1?93W+q8Ggh%MVKf#ODRf(^W7H6eawQV;6D1Bm7gU?K?RdbBP600w)?>qQ^Hr9B?;mBR4&%Mfo@rRz{ zL()OZ^|d}+gsKOwcn#VJMur;*->Y{$Wd~Kh-I-$)T1H2S^D^p46ML`C z=VRoqK^qs6be0S~fyC}&Sg5z_wF*yo5Chx9jxa!nqH72f)V-U5N?=Ul5~weU{%roj=H zNG#Z-qah5OnaWarzxbCIGPPPFFM~2aqG(l4K#Y;|R*<|!+E2?-xMN0@=_^!5hM5cd5#Am@8&3hN89R1)D zQLCI$8qDLWe*6#2mh)-O4$6lO9GJYF#Xgb8ru2Ar{z2pdzv4V5fBqY5zCmT6YNIDV zv>clAN*bW8id-&(De=<)i$+(UCWn9ITwzCDxB#b+``6t(O?U(Pdy6hL1d_XK|8sFk z8-J0Nu?$Zk6r9rIp%O>WlJ6;oI`yzC<=}^XPKzDnWZQ4(edikEkHblj-p4 zimESeml~sFZLmQk!iKZ^lnA$c+3)czv~%9XrXxnt26y2k?)9s4PwCg(Ir_|@(x2Rxc=c{2U*TC})_Ko0`Ruh~OxdKn zzvL(+?RWrxn>iIT4^xIQ@e62yBwof!4sNvb2Dxf|tvZY7cQ5yZ^QiV@7N}(cFutQ~ zR8TnNA%;V;>-9-Eq#kZR;dz;KV-wzJh|K7OQaAsvx8?nN_&YfyHqQne`l-UosR62L z2eB9pgtH}9S-Vqd!GG$!sO=oaUs=5_t4d0cmi_tA+k-js!sU&B=J)rZyGcmyTuAPx zzLqc)$5C4F~>AleZ?rtUYw4*Mx*uHc0LjUPs^j{2g{8 zQot)B#Mqiir=Rg9idtczvREQz4%D`*5QxA8EA|J8AR)G(zT)Oct1SC+v8f;_h`%fj z{$&T5e9&@L(!w{+x2fgGs^vR-RpnZ48cnSUEib|+c0+LIB z47?$BGIz5URvz2)2yt^K8L+uLFk8D^ss5LPVs^83_7Z{srJO3KR0#cs43%q)>wigm zi`07D;y)P7Ps4ieZ2sY?nyn)T&bc{jQ6~zmb}gJets>(a<)u1H8lPpf_2~~Wzr*Px z6Xh?8^LyIZ5hjLPyggt z#Pe8(qo}E-FQw3y6v{pnev=ujfhI8k?NfIgNVW-e`w7L^jnAdewsY4l8Cw6Q{KuQX z*vcb*hK_p}6HtKFC{~qV(pPN^y-u`fQ3)RWk_-_A!NAVM&e ze42a8--FA!7eA7VpO?W~Unl=gdeyY%YZe7|UH$l^mP$aLv4bqZ9|MEi0GkWD&!H=z zlyrucwMw$P*SMb`&W(|Nv}qxPH`B=E^Bl}R!~)Hg{%nTj4X6#!$lB7r>|x`Zk?dU-t|59ZrQPCI6` zfM7}PTAy3jNow!>tB=qpUlvB_^ZvM5XAP+du78NQ91bgz-=qo>WUdM!Vv@+A=IjWaU7E}#J` z>f*2TmSu~j&z!#y~l9u|g|cdIW`d@&=xfEu+7)n3tDC3}pMo8vO z@D~ICDE|%@L<3eJ)M#s8qk|DcTp-qXa)}AI4xq&!`uwN-U`Mjibr2JCufrMko9yMq zNGP!wl4S=_Flbh1Yw8=a44uhlx-AKMUCNA$3HC105+_f4=357P&Jku|gme#rAYNJ9aj%693*so0Y7hU|8~fK|Aqd{?T^bTd~l$y+ufNp(RbDwG`(U-ti$yLb*%2 z=_Q8v-@re-qdupHUB;tr`N?;!Ta_wIX&ZEdIx!<`MAYKT_(k~N*Z;uyjK)z_0mIwq zEBmp9oOF@i*N!ZLVpBVc;Q8Pu;)1w)5-UEwf$+qDMD?LC*~aK@*L>_v#C)0j=?$)h z$TUd=T5vqSzW9vC3p*F1Y#X#a4G_Ad=|{TTw%7JDSpHrc&EhO=qw*-wr@N08KX@@t zr43(XKzrUd_(cbd>}L}%n2qgv*=~Mq*3)ARDp8y=px^P!DK>6qQV};ny&OAH?zROr zuu2ohki@Iz$go@5C%-p$`^HS*LdL3QITx#NgD952ln_MsDI~x)KbZ`! zVp3M`96%*!8!5%@Xweq4UXLyw7oDzuzD@mIXOXwZ9#ND0u7IkcTgY9gM}hqHiiG!Q z=JA?rUKK}%AjvQ@Ug?bT76#;ZX*AL*0`cu02XlU^rNzbd+~B&!!>~Y0Wv+K^=G;xd z&!C~Si7T5#W|ai-d7+!-{)irAoQMr(xOIMb*qe-R8ad(WUb^tNcH`o7Y-y+!0@3R&E$lnU>w)l*X0Gm<6)Su=hgBFv1j@5cIJ(&AfBR+rlq>gJ8I>}R zdJYw}pE`r+X7JBTxafz^qqfAH$aIB&JXd>2HyK3kyv+`>JJi~B5;iP6`c%*ec4ev9 zJ&#_DZ-0Zxpo9$N$Y0EdGz{7jXMZv7Y!C1nTk_U~2G?zl7>|Kj8YCVe^8n}#=O7gd zpU3W@B?Gtj89SpM*Y*?0$8$8@Eq}O?w(a9Hct6*;2(oc*kHV?2#FJ@4Anl4}Enh(j zjVwftf)4yHv-6;SENh4mi>QM&9V?w-fRS=#v zMygB@t=R8qLPRR+xqA*F5KVXeL{Hv19IvE%Hg|5h^@#KDj+*qQhpg9ZVX8Ny z;aclC*Bm9O{h--Ro@VPRQ1gryU-w0A^uzDn$CU#i#x5@TJ$|pp&n2WvsO{99Jan0 z!)1V28?_eoPSkj|@KUG7PTtJjt7Nu9cv@*WBmJnM=ro$Q!wcWai-38%w5!I#FN@oy z-I7*>FLF$b-n2n*N$MBaz6&^>gVw8u_3%XR_9>p^Lx43GI544d7@}Ugw1hp|#zIF? z7H_%=#eEI`MMtvB7vzW_$AwY!vc{>pbIT)N$5hkF`;bW-#7Q3KRpP7bK=0gtV1jLU zb6wZ9fu+`{N5?MV}oM#9iI-@x?KOLhT65K(;e!Oy)~a=ycN z>4x@e-h5LRnx@ix`)7AT2K3^VrnWe|f|s9>6dA`NtMNqs;Zx^%Dm0j@>D6d&p5Mju z!}*#wm3!=ii`S}4rz?{4_eYXauT)jA%ND~h(>6$K5TyPX5%3>DWl?wTuvhw>6a8fs`aAFZRtmKUK*BAKU}P7ukvPV-;D7tKJ&pd9IXC7} z?0VaDYTEGYw||_(K3pxy3afy~%a%pR{p)?Lb*-Dym&w8>?JxXXnc(_RC9Mhe4?2K|Dtl}#(>ze9{Op4z`p+V&d8smodB2R0yise3co1y%gVoi%?i zkG`RxHBA}T(v3r9BY_i`K zHKnf^WokBxrdE_zz%h=Jz0CL;a!FovN1eS8sdN2Q*|ef*Nj;90{LGQX2hGOYA1U^S z%`{O5YL~&7W*MK81co~vch$mt2(mPO?Y^}IWmbNsNlal1HC~r-%NIl?3 zra9<+M7ecJ$oPjv%i?aN_U|0j-f=DgW=z_RiKLvNIj_ARI zq=Gls(;Bt;swNW5dEtm*`8*v^p!iX{+0(&j!|!`ex7>OvOEo2>-TkGWq%t-wr4&+k z{k%nj?Z%PT#MBy!EbA!rK*5$o&RfFoL(f`vjz3>**&5&df~B*dO%x<&*0KUmYwt%4 zcPnr=+u?NE9zmW#E<%Q0Pgddnv$M4yZxzS&*vFXdcK5zh+|=BCfw)UxxVwcgtBr>4up4&nTJfxVFHi^o(1tPEhnlqM;1kK*~h* z9_jYqcxJa`mrm-mmA0}<-8G0NnX43I--B6Dwb>?mSG%bIgqj5T!sUR7G*DbzF+gN{ zr1j+ZSRBE>Xyl!%_QxHW#*jAD84>A%y?r?K%n@|N8UklDWjO~4cNbWDG}<5Jbb z>CSEUPZE}R@J|wt!G`zSt7!Inzbf-1hHM5B#VWg zVjvjFP}5aM4HVH%mFT1Sr1!F*Ia8PBto zG$LItA_|!0mj$@V&w->+I@=0c22x-2D3jrQZRKswk3H;KP`gAUX~BeC5{k4s_E29c z>i>jS0 z&1E>tW&xKl0z5)shcZcFjy?}%lsxAer!W+piIsmPk0=uzN_Xv@Z$Y)*nr%26WCJ@V zrY`hA^v;+_QY(<gS= zgQ33MDJp91IK%EUHQ_dy%}(1r0>YGxvXTphPn2NiQWDpGt_uU@vDtXT2!edf9nnnH zW|`t*tc&7ncB3=!UeNQ<%^chetJ!bPCGrtrhr5mLg1DaU#iI!$Y}*0pZhxI(<%0HmqhjW+%XA=d^3dN0Yx!x+{kg9wr2^*R)$;MK6p3#p_q`6`&`1l3 z?x-!1#^q@0>1LD}9X<8WWjUWq>MY6bsVFMxrrq-5d8MO8%7L}CG{0_1J2JABEFBW8 zh-|BZRK^M@nSYs19`X2d4c@5CpFx|q1UE#xhEQCyAC4`%KxwrY9te|o>v8r>K{AnX zr~>Q>>B+v=NVvIFb7M(A>rBVU^hq|Vd6>4K}FoaDsEWM+!4aqd{XHQuV)1aL@@87Ybi+$}hodX_k6zWJ>5;pN5 zv8MGAf!!nCn(8kCyQYMq zFS6h=TBgQNtTwJ4VvDyeKc1FQrMW{p;lU^HfS~rC9xOv4oJKr{vnAOnu%W(Olp;Nm zMglel40gfCARqQp_Tnj}9rysPeXbP}>O~;1TrSD*?^ynnhGUZ# z=XBF%sf%i=2EPzq1uguiChi~!M z)K7x9_lZD2+LH>ag^ z;1Ss28k%6yucAOmL@H>~VzF49<}7mJdyuExBqRZlccj7e&x}z zkJ*d%be6px(-|7(nVM#Bxn)+?dTeZ&9a%+yVjhZuD^@)-)KIOP;ed?ffEpgh$Dbo# znbP?V6_C@vTsR^ksfE)u4YWg;HHGf&*U@t91xj2IbUhW-LXVh898}i|DJp2ioFWwh zJ-JFrbyNU0T%9`=@$97eJY3?8Isuy3*`l3S984`-Ki0vJ*u@o9^QwipbHRpIUHLf1 zCP4#WNCm7EqZAXKkxV2(c|I*o+DeJ*!_q|}D`1p-mh9Q z6t$ZtYP|v>pJDAwQIgjSk@xmgV65QZkcQN05KY)EaSyMo*TT%&!{3PJN$NLLN*t8W zf5o=F@c7ZlPupB8rbAAap%=_O=sL?Ds$Z}pz6%(G8E;GYK}wk!^4SDqDV%@Z4rh@L z?SMldjdY*fgq_;xAy~YHP#0a*9uKR`v#HHMZMv`lS7bjl6<$^$fL=R>hj=;+^qX9z z+1B>-nE0mahHb4w2Xbo>+cKg1gRVp!tt6mxtC<-}v%54L+V}mrNyj?Zl>Xe`dV(lo z!eIU~51zUCG#bsPXwF{&AXei+c0~{tLsGK=m=@+~foM}uTe^yL2m)Z?SFrLN=3dWc zY&Jae>z0A z4BDrqGzZZXGYYGELre`(XK2f;Wbsr?jc{2tLESULx~=y{bPB8*>PR-rGY*~^o`!2D zENjb5^Tk(%jLD3AB#|HKT)T3;2Rp}kRfLB;d*(`L2U?SCC2*0uJqBh%jShx)b6uJIfCv^#K;%-=_kx}``9e3mT)^!<&7Qvy?9Ln#sMAxNXX%XO= z`}y$t_du!w?c(Cx(n3XZF)n|42B;wvi8D3Ssa!lk37?2Dy`u=2D6ysDtaa+A`n2gs zD;hl8jDFf$-JI0+ z&V+3zx?MZVT6TtT{*LikHab>bb+pCU?J0(5f^&9I=Ve$24<4@@%`HRgT0P^a)PN9iFVUa@7B zi%VlC8P_)$G*GJeZglqMR@>8_Ihj11%lR5@Y2ewXlxoFUn>0sq+9-uTK85QOfkolvlgdpDI1>FaJXowG!PwhBv)sNP+LH-i$B_; z?8NnKk_z`Hy)m^(Pi4zyEc0Bo&`!Yfuv|<-=7sb5jZwtw;b8>H(JvU< z2BXnQ!NSaF|Jl8Jev=K^fBiLLn#6d&kiN*B%Gy+30?S4-4iHBUq}$gy1W}vACm{BA zP=jUZavpCuXiwct?HY62Cv2T#iYj?4l&oc@m8?~j9^R&bldN64qyT=gZ4?Go6t_Au!5ZyRry3F)=w~7*AOdU z4kraO*46N6?lH6VJdSVVd*?EeP^l++Yd<`5u-XoNr`FBiK73@j=ABdckL8~gqQ5Uc zss~B(h~GtG3MMe}0i9BGm#V#I)9@(j2v(*Z#XsOyy2A%}KfT$<1<-9?pTa{QCK?*~ z^HOhb7~+`)D}f}Z@bt_$nD)*VLWlG#3Q|F^lz=8!fA4`^|^HLZ8VI=P{5$)_a2{~_rJHeUcqSq+&Btg0@eOF7OAqrf5s=pBP~;TD@A`aQe8jP zud|1}Cg7Ha(m**p6gj~2S_+6?>_ZbHasspx2^btT-s^d^YjR{JE7UafLC=P`M^NqC zU##>4Zfj%e2Be2y^E^$br)^UIvO(tawQtx;i|bn4(pjs;v^}SuQwt1A9a99HSz;kR z(K=qIoUB}f33_OX@LtH9{O1bcK!2^syup{=Szbq37Y_1a-E2kd&~KhAW8m;Qos6NN|Or86Ex}EzwcYaBr zOG(Mz-$Gd9W*(5UnBqzZOU+Z%xquUZJZ|omG1XMM@1G**Oj95?G_294wY;Mm$Diy! zcv)%T)0M`+*07S?TD;Hcs)|c&5dRSH(o%r)7WIG~BdF(lAvW2SVcsyg!|R^r7@_rf z5QD4My;>=Y9FAMp-**h=GoOgUJ#2d7n$E-dF87?tz$h%m%D@;$NE5s`UGI^Jz*pni z>%-S%Z=Km#L6Go`mr_#DfLcT8PA#)pQQgGQuVUphr0s+RP?kXx>zdhheGmdH+U6l0 zN!`=B@ojB=xVaE5vu&+LaZFM@iGvw~ z$hA~{rP<_WLXbkUJH>yxFmX@@v0JcrH*aP+&zlv}OtN?~A@pG=Ine~{`pYr^0EO^q z(s%nHMufOe4zIgeM%fMQo)it}my~~#WIXD7&6S5|J+kri<|(|r4-rcu#h(_QFk zJ~6V2nKl<>u8}JqU@9KTIaV#L-P~pCjkr7BZ^Sy7BiCT3pm#X%qHRa_IJe}WnoSi~ z+Dw96P~!T0hR)JPlO22{PL|(zzjehqAZt_yu+5H9_FS$-gBH%A z@^nh-`rcHKYp@qR&*UvxkJGHMCCMN(7qi7XfdAuV zay7R9Z1Cc6>A*92y0+1rDQy18tOonjHPCPn>mVU%AkE=rg<#1?bZyj93=LS{U%ua| zySlsUK3s`f(y13-KFFzPh+5+&mF{#tkM6+_{CT8M9u zTT;i@oA9y|Ut@%Phgq|hb$6!mN@reOeNzPcus+HPyS}^q zUF2m}UeTye?Zzlhx6X=+Vj~wRS`RIBw+~oZ-h7r#LOq+*uIu6%G%-cl%r$bAvMMSv ztcB75S$r7cQz{UhfpFLEp2hirf)={>?`!{0+#FK6Nn2@e5BgbZ2Lj8Axyxoe7@*RM zXTi}tHR*BX-ahdJ76RTpIDCi*tp?VHX~Vtek0Ed={bi=NJYBUpZsZt(?5Ek zl!AA^#N|2Uz@k1ly3y1t10bx)Ro7X{{-z-STp2sybmX0xAhY-HA#PF29^Y zxfn%%4u50;YNHU(m3wU%mXKWvuuv}9eI;6g-1a)^9Ae+2+3L-un*PgfLvAoL(0uVe z%2f{Kq0LCPJu-P>AzUY|pk^7_^dy z!ddxK%_gH%TMdQ zSIB@qCKci_$mx;zzo4Wcl)k%s=HgXakcfb9{;?d^dcA8p-f7wxmE!LDbNfh-6N{A- zt)gI>5u)Nr%M>`uC%zIW;ZS2}YbwcXB{kG?H~iRRS?u{>eQ!3j@FUTX>}#3Oz(!MT zC>!@Ra1CEJG9o{p{VozPpCco%{IDEL82KWQ_$=m*Q6inkM@NbvQif7$7P6iJb4toO zcXCVc%j7EeHt)C7M+pGO2h8c@1r-KtW+!zUYGl}{q@ zZ(Omi1QG6S6Qt7{sac0U_+tH+s?+!+laS7}aq;e{WGlWzPhDlA?J>CIi9a|GI@EpMNIfUVD`eJqQS6Q`qR8A z86F>k7C|(MUnf+r-$bcAE27+^N3PhwQrBV`D{sJZ!L=r*a|acP3sMQ=sCQX+${#;z z*c(>nzy5M()E%;5pX;|;ZEB%J&ko=|wSBF2WC1cAMP5ZCTQhyg&a+^`xH?`-(Z-jAB{j#|VA@y??7Xm&!R$9}tLzjZk~_;!Hph^{{?olJn~q zjKreHx16U}bfoW4?=taTA<6doBs?W$taKa|ao54%MXBi)Ct?odwQO%ElIk@+FboPe zh@djIu{K_eU#R#aVjX5-m|pcSg7&L!D;Q8oK&i5(B`g7jfFb1@$_#(oU_Ydpi%!^! zD`M&V>Tt4(<@0L$8L^G1?%iO}9H0_FbKS~*RKuZbFg3|E_A(mY5-)!CR#3rMDWrb9 znD58M#at+D%Y;JWLmys1|LgK7BrSd9ZR)B3MYWt(UncfemtWD*BrPg!cK|c^0)&?U zgXJP9VRkbZEkmH1u@avmg1>PF>WFz^U)39E{$cm)%bT;lPlujuYzVe&IGjWXoIv!b zp4{qyeh#enRmoK^|2fQOAK{JNVNQ}4=T36X6fdi9sjKN-giFW&`t-Dmh+WGq52Ww^&hWkwYXzC^@ zU{grSDJA73(owMz*@k!{ndLH-KVGf>+uU((-l~1tPrG+_7Cs9g(P7&Vk=sUI`D_CPF0{iIQ1SbPn{@J6~rtqu3Li%ivrW1$YqCx zZGu3h>9MHG_1o9KHC~;Xa}3w&3DUR*R44S-l$-(k={v-Hq~p$RzW% zWYi@nT@vsgxfoz2o->piNH~WJ|{!91=!mnL*C;ha2UVJe!fz_DU@bUBZf~$$MPXmRt(Ltk1 z?C>aOzjb^U`vS+-mwKa3>tG6kP{G*62neW~$|G-EGt|>El}r5smhkj80RUup&s-7R zoxP|>ii#lqWdCbXN+03>P{=`eKbS(21ZKlQgI~lukj{3cMpvPYqSksr50SC>0~iaE52CRqM{eO}1d2Qi#mXqK56Sou-9HoVeEzo^tf8v*g%5S^ zU4-y1t)XFK9ta)}c8UkLhRDnolV+`#N6$<5|i=5*a>ox z$$q_#d5F!3i(OVf2i`%|tHBOjS<$FM5ee&D2J3$p8rS`Q_!U~^7vG9l5=2%~&PapL zV-+2%Y|Qs2XYf5sC(rKmb$J9{E@(3l80AZl)z4`N$UtHL7J*0HaI6*3Q<$>WY#a{S zyA4@%vgCkM4%TM0RpnaY0DDl|vv2mUSt zT5tV#jv2aNFFY~vo&xU^_IMH%<=3zMTNCLEeKrj9XHC0w2yyr zU9~@b;8=P8lOcrl&FIs1xBM5pk>$bMS^~~3v+9krv{g$5&3#~dwt6#NO@y13jt+W< z$QaBfotmu=h{y~)N5&dz{d5&<_h_RHLxWKf*i4eBlNPy`^f%dEn_(Sr`G{hH!J!Y3xyeL7Y}x3~pyZ{`6&7!H-EOdabO2v$}e9Diw^9 z6}F_9tE&111^16Am{=Bp%jtVOiwnWul`}#>)VvCz60+r#{xQk3Mf*oklHhlv6YTk7 z^l@usWKOe7$bjo{xOsU@g@Yr(_(n!-@JSlWJ#76D&I}n^_!gUgLwl&`{>i4bLYSVo zy#vL4>?I=+6H5Ww>*dL0jBI6Ngy?mP*cPh7qG=E&DM!r7)YU)6eD@hraY zy7Dq<&DHpKaBz+cq?Xk2!^uNbz~V&Yzvlwhte83u8t(##R!)-b_wZq@`;-rm`w>OXSe2nZfzB3>Q}y za3Mq;7TRmQ_%$aVg(M*j<$oUS93h;@Jw9^)oLuWAe>u-DwQ4B_R#CmuU;3bh+H)3+@Ya{XJ69Pb0XF*3xg*Ezy37D zrRfL4IQaP_r8%Yc|mJ4a!o%87TI`4R~_F%>Ly*ZV8O?PQ6PFLZkW~J?%s~>lU)`g{7 z2I(_-F`=Ldu=oPzQAF@%`HOG!+6NQ0f;L(Il4uTA6W@onuQSB9i5Bg{B5YnILb~4p z5XL2yIDDLeLJ~#(f+UMwq3W?NK0BoCD;%SBZEKpAkXG-PBZHJy;>LB1{If$%UF{Te zff7p-h>8uvu?B>)Q;Z?jacgV5q78aPaT70pR^5&wM-b+;Pb!c4a)kbI{mf!wv2L0< zn>P8Y$0J~ahl~3Z8OsSXK?VjJ!zo66nnpzVH)x>y*NJbe2-}2?q~Qs^sa*EU3{h3< z4`SFRyd`c$jYDElmC-KUpZ}IRjls}FPZzPy>hY##)q7c-OV(=jLM$dLw#0|f_IJ9z zagd6D`CPhlk|~NO-KhCzZ|s`cTUDAEm4tW9%L7#6Xt4%(VukC8>;@9FM=VKPYZBq_ zgXLJHqu;bYB(@!o;B;0)&P$+-=p*9R+Jednm$UW+99@m{3XNv&H5#|Lk`J5IA%>kJ z9S(B^xNzX1t=LnK8_@_M;Oi3F&I6XO$6$P0zP0}Sizrj0WnRhDDQDSlwK!nMh8)D6 zH3=fA&L}GbZ_N~nDmG*-lolEmezd1Dfn{Xe5*-VALa{~W+U$*0&PmC?35>~<8Tv(<35fMFvvKG;qrHaYC&;M{&?~IE5_Xg*VTJ3QfJgl znHCS6Q~6&Ymd+hNLKcpqCyrBgjO86*n2kgE>#9w5AKfk0bM8bpFzL#Eys^p8#Z+#P z-1w0TT}`#PI9}&&E}1Jg>nmpQq^ct{9ih6ym9VfjV`hk>Ac$cL-j1pzZ6^%Xv)$t@ z6)l)*!-%4EI~vgQpQM&i(HM zAmGy-9!jOe5#ipauAO=ygz zX#eeUy`oH7$W_l;R=9uPzV`WP`#(Sm=8f$QwPu#^wo3$Fp4%m@IyNs;3tVlX9V>y&sDtP>I}BMbz|4XJl< zY-Jfs`nY$m_)LYsA5-~nXT_IUI-P|~oQKqSf10RZFk^oV?i@^KF?WkZkmnBql?a~B zD!7y8H_nXZ^c&fO(t&1#c& zwed~RR*J;T(^-6Cx)HhHXcA!$+b8$Kb7z%Q((V4?%bK3+sJi=w-+zbBc?Y;M4~T!& z5Zg93qfBxBVC!a569_c4R}w=_T*ED51$&yRH{SbQf0OchRLdurJ=ZT`q!nWjvD3;v zt#wB#WvaEiu(e-M2d;>Ay-qak4+BLarg2k%En{yE1Ls5V$W$N>k^FX50C~QDj=FyY z{nwjQ>{c^TJROnF)!)_CyN-xfoIXeFC5&L3s6wSyjlJ0RrV zpH7kA8SZfu=gYraS4x;(KKwuH8H^$=J5s2Dkvi73UuM55EM zC?rTo zRPW>b=(yFcXi;}$B6@ucd;WnjFwG-R!pi34$wH(xGdwiR0Ir{mQm z-d$b1JBfdkr4**rxxHx}+_A%yaN+%87%PDYWfF>`aV{2kbSUT7szSlnS%z~y{yv!E zFUateTqK%{zR>T+@7ot$x{qfo3Htfef`mnrw?;}|F#iTSgTdV^^?40a67DhW$;he!vnIqX5hMI`O$YFd+cMkj z3@eBMYdj;k+iBbI$lR|g+IZ&i#6-oWs-ioYQU;VvW{i{6oj%GDBUdmMlIw(Ki+Udw zY=pjsUel4FWlZBJ-Jn-X!4D^F^ zp950U#CCVzXkxvzpg1mA88xO166j5c3A@M_{{wMN=R~0+6Rf_>Rt@1yN%&M8_(7Fw z+chxUO-}y!)1*9u#y+vx5r1UQ;tP24K3|0Rdpdv;TxJacyYf(;w;ve{%+we*gF1z1{XM%g;y+dF>9Bm}`8fC#mO z%{-A?9qk%#O@JG!OU*q8QFM7wU7DnlsW9-O3SwEm3hoTgqKi|s%~V5GP*wKCYmPAM z*354+hq##|^G7z5&OY6=WojxlxL;4CLawSp@E9Usu>C@NGmH}22AZdiskW%&%!$}MVH4;R|Ahvdqr%Kj-7v@I2KvJ;Q-x1CIb=Dh|RGWeIz z{H?0;ZS?mY3blE@O`YY(F=eGY`TJC%$I zVlaGa=Fs83HR~QyS=FNWU`&&MFq6&)MY}`wE;5@YCg1@xkGGrPqX7%fszqt7n~+~@ ztD+tdxB{4uaxTK^yP0k&DSdxH0F`XfakVVm%=BTXo%d#C` zvovx0KQOmlyP2(j78inIZy73v1@+(OCUinV3=Hf_%(1e?9M zta=Dka`ViE{)bf8ts5~?c8cp^eyme4Hp#Xi)m2qpLSIzsNDNMrETmvi@2&&sh>R9m@JjsxU5&V zF)8YSvq8~n0CEIfU0b{B)KjGP_SWp5aRN~lSqu%H3O>Y!GG!2fCS#_Qc-LFspChUD z9rqUX!=-Y|xM4gsBPcAYaTvrwbjk;pyI9&G@b{PSL3gtZUs$Fi$_*_ z)(1in(M;<>pnh^$lI!-!AU_#GAeJbhD!OzG1i={|BxQE<$1El;^5O&zLOdJa z*(W*9+O_G54bHz%0~hlxZzh#llBHxG_8wzQ6_NtMJP9)SO|grAq3+bLc!oXxqymkV z$@{5;J`*eT)*m=p+IY~Ky9}FM5@0DwgF-av>@tXCdOMS)Q$w&KQ|Mfcf67}H2eDd{ z3A)yw?P^5Mc1%AVtSQbP%emXn9k>I*fW>hcdhJF`5%wz}lh4!cIHBg`w^nH)t62k; z6a7dS>SDSdnY&I>&KCJI9qF?cIii}GKYSlP1Y~_bRm)5xXZl3pT{ZH9Jw`vpF_Y_y zjkaiz5ATy*qg78Hll(ZSykU~kv3xk?Agi*#Kik7F0=t+3<_btomdK20_Od_EW#1zu z;_B8=hj+72B6uThGMU{`g=$qINQz}Sx-nF-+UYk4fV~6RU;ZFNc1o5d2>2F|#5KR_ zB7d<5Jcy{cuG%M2YO$k-3MbER@$!3C(-kd6RV0X&$z<$$aiv)(^GT?n zjwp#!V-f-{q%n0TA1Ss;>-$=IMRHeoOs%;r9k}Ao-y^sznRS%g^lBv<+fsQj_d$B( z)OspTjNwboRMeuIsfi@*M6vupSy_8gm^4e?;WssPvV&Bm3NhlzRS(5n$xxjm8kwYD zE9F7dN(t%rdgniJo!+M?K4n%oJj#+)X9l^G{Dh`GE8`g^ot6P-HeH$P5c}`eba$W+ zS4-NE_O0}vYTn#il)rzHN>8WBBAY&&__+ECR0_w^DMQQ!h^QDAa8u0Yh~S=c|GN(5vk0j1JfOLar7M=kzG zG4Gb+JA@YU9nv@!?`WLiRJ@}~aD%St?$q;|4WzN8?svM7TJCEGiBrWw`FRcHtPyvV zP3oDG4MATigpC^NuU6zxdS$@zFpAd%2J&>Rwbt}MsZ+$;#^}A?WWQE#(-^mOlxiob zs1;l;fjLSCrc!H$$l~$mf*s4i&QRy2+Af8*pcqZcSQ}sAW|YGvd0nn{-U82+@R2(jInIMT*MkZQ$WRsJppiZv{B4j7dwQ&wb^9;*$+2?-;7NmCU+>|6`gaPsXF%>qdM7ubN|__Dink>pUh*M0XLK z=;6$^^f7@6cchUk6^t{J;5uccOKzgOzZ7>{6JgVI=`?$I`N@{MjfhNQ3l@#LpvjIu z<3tH3?2Uob;h>xN1r&|okovg2d!-lctO*cskta!AYu>;Rnpk+ShpxM@HaMT z+;7j~uBBo8bXto9`#uk$EsFM8PLCzSa9*E7{-7zXUk#f?{wH=qE||8dL|Xa2_*l2TqDqX;E99)aaKn@3gwo6IZJVeMO8-3~ivS0f)OCB-NG`v8Cn zIEw~j&C28y#BL~RE}&23ilXZjoz)QZ7^dl?b`Wah= zSvwnTC!H{Qcz+yh48Php@Aosb$9_XIx&hwolNg%oJ|;P*OwvXv1n%l}JLn`HlA#^M z^@LZ`H)a$Je|xOc>Aybhv6yr`(wgYFp{9-Unt|d zemEh*TyIqSR*0_Rvgo%tjQmIU0}@wbQdH@J2xcA+&8=x6=ilN11T|mV)}G8=u|r=M z-2|vUU}zD1vhJh*uqU{$UO!iSfS9YrWUXgC+vz2ON8tbN@q0gS=y2QLR4h$fyswy( zU#=zEsGP1W6b2V1=)ecd!Sk4X773ir035Ev1Q#hIl{3#Zt6w#@`t7$kyz7701p?{d zK3$Qhc(2rr;_&Ok1QnSpFThKd_KO&#jRrk@B4U$PQJ3&lrV$nDbw!+b9(asf>Nh~( zctxzsWy(}wKGb$brxqY$$K|_=@AcUy6od*kNHd}b?Y+3h!8Ohr;Ot#|B$2-IX3@xgScKZyHRctV)ZMhw#=||zMW@0SRxZ)kK+(g=JOA^+`z0m zlb0rq&Tjp$6==Ha?I-BO77J!Mv}vswbHhB|n4xLZKv@_s8P+RL+Zo>7Lq)0|J9)m- zrcpZ}WR4=vQUp#-yOHm{66fj;<4fuR+UqE%pq3?e*e0>$LLwJyUxhFfaT{naB5@87pa@dtg9@~T^y&GHNobN`DxP$mkt{h&t|=T zzBAW40ongb6n74D&o!zR*uhtkRN<~3++oq>DCzTRy-{)k|iT; z*6%rD-uo|bD17vdIfq5OUQ3HE@cH$-0&bilzWAn{7?Tn;qF=drLzw;Cyrv z)-idRECLg@WNb8|2D}74X)EM;%+P63AnL9)w|^i;-0Jk)#fJ^|m-FQGhCh|jCC$Z) z3j(X>uM)2ldm_ltY_b9khHN54h;i;$&901~wbC&BFD(HFJ0D1%eFV#Ts$Bhl*o{ax z=nBe;>o#X)m`l`Wr*By@Lhw|iSz^j1P(M4sCT18W&I9J0k{@+->TrFfhXHE`scFR! z`$e=bJR$6$-a`bx^K;Ba@A;iz-Xwc{<%DM!Eqiol0L{{BW->-jY7ni=g1juKULZkL zYnpN&3~AHK!1h7RbC4Olw_)@*eB8@G?yl(JBSO*a#xNC%_VPBF#sqIEJIrJU{=yUJ zQHr6+%z|hfR@&2TYU-HeMMl%8=;hV7jjOH=etVA?2X=0q%IUM@2%Ca3>%BoXo9A_;(gEM&dBVN5+bTHRLd^Oj33K~_ozQQ zJyvni2NVz}=Y@Dh5 zni{PMqzCjf0eY#(jaT3X3Y`g+@`=*|tZ!K5Zg7{wXsocX)EHF6F{A?Sc<$gYoZD*( z#@fd7?B4Zr=D1UridM>P>2MboC%}su>FrtIL?|H4h!h7KHMwYXSlk$%zx1a`;4`f) zz@;+k%QaY$mcsUzg9&m+!-jLG|JOZWO~s_GS_!8rNMm2IxrQ15_X+EF;j@X*N+V4P z8C?U@=i{WOpqUKIi?~WzqZUq`lC?O3-q%gL0tnJnRqg9tns}=`+d^D>XdDy_+TJoA z@$>BT+H^p&f@mrA!(dr{MANIU4X{WTHtDJ;V#B z8Wd)tdpn%gXoSqGi3ljh(g2cqd96N5525n{eC38|_UWV>;T zY}AJFB>&vq+s!9;Wha8j(JpER#?gs3UGL&w#alEv(y4W4&JP+m8yJ|2S=LHtuY~<@ z26JB&R)O3vGK&L1bWZFYi3>Ky}W2B~&rD%-Q?g41! zpm+wRHF0XDUt?AK_MYQ9zD{zR=AA!YEj6zp%pSROX7#$we@HN|sj+&0YEQ#RH;tCp zXRW2PoCRwPT`uL$v7hZm#L|Lfjr6vvbk4kNANhr5A6GoO*fS5tTskHybu1=8YHDfB zK`e#Pl%X**d5rN~d4qRBpZVS9v=+uuO-g0~fkG>&=juieLnP1)3PC=oJ@T1l!{!Rr+};=0yHe8h*p zP*_pI4x`P?>`GM@5ygW znW(Xnl82^25g=cS!M*I_n0|j2E8UO03F)*Dw*e_9^6U-3KXiKrehx1YgzwsJ5W>En zF3HDNp{gK5XQPpK8s|Ek*d?JcEUX;5DK)8~ip+NG2k4Kh#1 zQCt{}6D-5@B3B(?#>*sX9%dMa!_>YV$n!sPp0`t_Dp=&fU2dyGHMxDtg0NruI1h6= zs-{j(=-9T$Q+pT2E)1NK~lqI@SF z3AcKc^tE%(^OrTiOSpO9@;p?rO=K$CILuxOk%pL@5r*Qo?OWD?bQF-DR*P+X=dkgW z>spz^qkr_DS(b@Po5u9{Lvvgk%#y~<;KHgCjMfN807kF!~xD0HkW+ z=zBK0g-SEkDp(e5W8;cIXn3M)Ee7*b=YYnsEHIyXSmz%LUBcqUoklAko@+~$J|D-a zRFq=j$RThW$y`I=V<hyK&mnw79jQQHmX^#kkrcu2uKyD~ zMmPNQBOkK#aK|5!xim|q4*&GdrL_E}n7zkW?L~?d-GweBMX*)8Mw#qEO~$}O^~-ch z_tVn9EBWmoS&G82em9QMLG!mR28Ein^yzKeBuY*^

g|u?^$(J%W(R!*93Y;93Y) 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⪻z9t5n%w< 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 S-`jkFc1;iYtCsZd*Z%_*jH)OA diff --git a/dash-fastapi-backend/caches/avatar/ry/ry_avatar.jpeg b/dash-fastapi-backend/caches/avatar/ry/ry_avatar.jpeg deleted file mode 100644 index 7a683af3b9fceb35b19a74c94ce5da212b2b89e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216574 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

XMAFL2 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 diff --git a/dash-fastapi-backend/config/constant.py b/dash-fastapi-backend/config/constant.py new file mode 100644 index 0000000..6db32da --- /dev/null +++ b/dash-fastapi-backend/config/constant.py @@ -0,0 +1,152 @@ +class CommonConstant: + """ + 常用常量 + + WWW: www主域 + HTTP: http请求 + HTTPS: https请求 + LOOKUP_RMI: RMI远程方法调用 + LOOKUP_LDAP: LDAP远程方法调用 + LOOKUP_LDAPS: LDAPS远程方法调用 + YES: 是否为系统默认(是) + NO: 是否为系统默认(否) + DEPT_NORMAL: 部门正常状态 + DEPT_DISABLE: 部门停用状态 + UNIQUE: 校验是否唯一的返回标识(是) + NOT_UNIQUE: 校验是否唯一的返回标识(否) + """ + + WWW = 'www.' + HTTP = 'http://' + HTTPS = 'https://' + LOOKUP_RMI = 'rmi:' + LOOKUP_LDAP = 'ldap:' + LOOKUP_LDAPS = 'ldaps:' + YES = 'Y' + NO = 'N' + DEPT_NORMAL = '0' + DEPT_DISABLE = '1' + UNIQUE = True + NOT_UNIQUE = False + + +class HttpStatusConstant: + """ + 返回状态码 + + SUCCESS: 操作成功 + CREATED: 对象创建成功 + ACCEPTED: 请求已经被接受 + NO_CONTENT: 操作已经执行成功,但是没有返回数据 + MOVED_PERM: 资源已被移除 + SEE_OTHER: 重定向 + NOT_MODIFIED: 资源没有被修改 + BAD_REQUEST: 参数列表错误(缺少,格式不匹配) + UNAUTHORIZED: 未授权 + FORBIDDEN: 访问受限,授权过期 + NOT_FOUND: 资源,服务未找到 + BAD_METHOD: 不允许的http方法 + CONFLICT: 资源冲突,或者资源被锁 + UNSUPPORTED_TYPE: 不支持的数据,媒体类型 + ERROR: 系统内部错误 + NOT_IMPLEMENTED: 接口未实现 + WARN: 系统警告消息 + """ + + SUCCESS = 200 + CREATED = 201 + ACCEPTED = 202 + NO_CONTENT = 204 + MOVED_PERM = 301 + SEE_OTHER = 303 + NOT_MODIFIED = 304 + BAD_REQUEST = 400 + UNAUTHORIZED = 401 + FORBIDDEN = 403 + NOT_FOUND = 404 + BAD_METHOD = 405 + CONFLICT = 409 + UNSUPPORTED_TYPE = 415 + ERROR = 500 + NOT_IMPLEMENTED = 501 + WARN = 601 + + +class JobConstant: + """ + 定时任务常量 + + JOB_ERROR_LIST: 定时任务禁止调用模块及违规字符串列表 + JOB_WHITE_LIST: 定时任务允许调用模块列表 + """ + + JOB_ERROR_LIST = [ + 'app', + 'config', + 'exceptions', + 'import ', + 'middlewares', + 'module_admin', + 'open(', + 'os.', + 'server', + 'sub_applications', + 'subprocess.', + 'sys.', + 'utils', + 'while ', + '__import__', + '"', + "'", + ',', + '?', + ':', + ';', + '/', + '|', + '+', + '-', + '=', + '~', + '!', + '#', + '$', + '%', + '^', + '&', + '*', + '<', + '>', + '(', + ')', + '[', + ']', + '{', + '}', + ' ', + ] + JOB_WHITE_LIST = ['module_task'] + + +class MenuConstant: + """ + 菜单常量 + + TYPE_DIR: 菜单类型(目录) + TYPE_MENU: 菜单类型(菜单) + TYPE_BUTTON: 菜单类型(按钮) + YES_FRAME: 是否菜单外链(是) + NO_FRAME: 是否菜单外链(否) + LAYOUT: Layout组件标识 + PARENT_VIEW: ParentView组件标识 + INNER_LINK: InnerLink组件标识 + """ + + TYPE_DIR = 'M' + TYPE_MENU = 'C' + TYPE_BUTTON = 'F' + YES_FRAME = 0 + NO_FRAME = 1 + LAYOUT = 'Layout' + PARENT_VIEW = 'ParentView' + INNER_LINK = 'InnerLink' diff --git a/dash-fastapi-backend/config/database.py b/dash-fastapi-backend/config/database.py index cb871ec..14c5a80 100644 --- a/dash-fastapi-backend/config/database.py +++ b/dash-fastapi-backend/config/database.py @@ -1,19 +1,25 @@ -from sqlalchemy import create_engine -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy.ext.asyncio import async_sessionmaker +from sqlalchemy.ext.asyncio import AsyncAttrs +from sqlalchemy.orm import DeclarativeBase from urllib.parse import quote_plus from config.env import DataBaseConfig -SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DataBaseConfig.db_username}:{quote_plus(DataBaseConfig.db_password)}@" \ - f"{DataBaseConfig.db_host}:{DataBaseConfig.db_port}/{DataBaseConfig.db_database}" +ASYNC_SQLALCHEMY_DATABASE_URL = ( + f'mysql+asyncmy://{DataBaseConfig.db_username}:{quote_plus(DataBaseConfig.db_password)}@' + f'{DataBaseConfig.db_host}:{DataBaseConfig.db_port}/{DataBaseConfig.db_database}' +) -engine = create_engine( - SQLALCHEMY_DATABASE_URL, +async_engine = create_async_engine( + ASYNC_SQLALCHEMY_DATABASE_URL, echo=DataBaseConfig.db_echo, max_overflow=DataBaseConfig.db_max_overflow, pool_size=DataBaseConfig.db_pool_size, pool_recycle=DataBaseConfig.db_pool_recycle, - pool_timeout=DataBaseConfig.db_pool_timeout + pool_timeout=DataBaseConfig.db_pool_timeout, ) -SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) -Base = declarative_base() +AsyncSessionLocal = async_sessionmaker(autocommit=False, autoflush=False, bind=async_engine) + + +class Base(AsyncAttrs, DeclarativeBase): + pass diff --git a/dash-fastapi-backend/config/enums.py b/dash-fastapi-backend/config/enums.py new file mode 100644 index 0000000..0df6238 --- /dev/null +++ b/dash-fastapi-backend/config/enums.py @@ -0,0 +1,51 @@ +from enum import Enum + + +class BusinessType(Enum): + """ + 业务操作类型 + + OTHER: 其它 + INSERT: 新增 + UPDATE: 修改 + DELETE: 删除 + GRANT: 授权 + EXPORT: 导出 + IMPORT: 导入 + FORCE: 强退 + GENCODE: 生成代码 + CLEAN: 清空数据 + """ + + OTHER = 0 + INSERT = 1 + UPDATE = 2 + DELETE = 3 + GRANT = 4 + EXPORT = 5 + IMPORT = 6 + FORCE = 7 + GENCODE = 8 + CLEAN = 9 + + +class RedisInitKeyConfig(Enum): + """ + 系统内置Redis键名 + """ + + @property + def key(self): + return self.value.get('key') + + @property + def remark(self): + return self.value.get('remark') + + ACCESS_TOKEN = {'key': 'access_token', 'remark': '登录令牌信息'} + SYS_DICT = {'key': 'sys_dict', 'remark': '数据字典'} + SYS_CONFIG = {'key': 'sys_config', 'remark': '配置信息'} + CAPTCHA_CODES = {'key': 'captcha_codes', 'remark': '图片验证码'} + ACCOUNT_LOCK = {'key': 'account_lock', 'remark': '用户锁定'} + PASSWORD_ERROR_COUNT = {'key': 'password_error_count', 'remark': '密码错误次数'} + SMS_CODE = {'key': 'sms_code', 'remark': '短信验证码'} diff --git a/dash-fastapi-backend/config/env.py b/dash-fastapi-backend/config/env.py index 863719a..e232a13 100644 --- a/dash-fastapi-backend/config/env.py +++ b/dash-fastapi-backend/config/env.py @@ -1,21 +1,22 @@ +import argparse import os import sys -import argparse -from pydantic import BaseSettings -from functools import lru_cache from dotenv import load_dotenv +from functools import lru_cache +from pydantic_settings import BaseSettings class AppSettings(BaseSettings): """ 应用配置 """ + app_env: str = 'dev' app_name: str = 'Dash-FasAPI-Admin' app_root_path: str = '/dev-api' app_host: str = '0.0.0.0' app_port: int = 9099 - app_version: str = '1.4.0' + app_version: str = '2.0.0' app_reload: bool = True app_ip_location_query: bool = True app_same_time_login: bool = True @@ -25,6 +26,7 @@ class JwtSettings(BaseSettings): """ Jwt配置 """ + jwt_secret_key: str = 'b01c66dc2c58dc6a0aabfe2144256be36226de378bf87f72c0c795dda67f4d55' jwt_algorithm: str = 'HS256' jwt_expire_minutes: int = 1440 @@ -35,11 +37,12 @@ class DataBaseSettings(BaseSettings): """ 数据库配置 """ + db_host: str = '127.0.0.1' db_port: int = 3306 db_username: str = 'root' db_password: str = 'mysqlroot' - db_database: str = 'dash-fastapi' + db_database: str = 'ruoyi-fastapi' db_echo: bool = True db_max_overflow: int = 10 db_pool_size: int = 50 @@ -51,6 +54,7 @@ class RedisSettings(BaseSettings): """ Redis配置 """ + redis_host: str = '127.0.0.1' redis_port: int = 6379 redis_username: str = '' @@ -58,25 +62,59 @@ class RedisSettings(BaseSettings): redis_database: int = 2 -class CachePathConfig: +class UploadSettings: """ - 缓存目录配置 + 上传配置 """ - PATH = os.path.join(os.path.abspath(os.getcwd()), 'caches') - PATHSTR = 'caches' + UPLOAD_PREFIX = '/profile' + UPLOAD_PATH = 'df_admin/upload_path' + UPLOAD_MACHINE = 'A' + DEFAULT_ALLOWED_EXTENSION = [ + # 图片 + 'bmp', + 'gif', + 'jpg', + 'jpeg', + 'png', + # word excel powerpoint + 'doc', + 'docx', + 'xls', + 'xlsx', + 'ppt', + 'pptx', + 'html', + 'htm', + 'txt', + # 压缩文件 + 'rar', + 'zip', + 'gz', + 'bz2', + # 视频格式 + 'mp4', + 'avi', + 'rmvb', + # pdf + 'pdf', + ] + DOWNLOAD_PATH = 'df_admin/download_path' -class RedisInitKeyConfig: + def __init__(self): + if not os.path.exists(self.UPLOAD_PATH): + os.makedirs(self.UPLOAD_PATH) + if not os.path.exists(self.DOWNLOAD_PATH): + os.makedirs(self.DOWNLOAD_PATH) + + +class CachePathConfig: """ - 系统内置Redis键名 + 缓存目录配置 """ - ACCESS_TOKEN = {'key': 'access_token', 'remark': '登录令牌信息'} - SYS_DICT = {'key': 'sys_dict', 'remark': '数据字典'} - SYS_CONFIG = {'key': 'sys_config', 'remark': '配置信息'} - CAPTCHA_CODES = {'key': 'captcha_codes', 'remark': '图片验证码'} - ACCOUNT_LOCK = {'key': 'account_lock', 'remark': '用户锁定'} - PASSWORD_ERROR_COUNT = {'key': 'password_error_count', 'remark': '密码错误次数'} - SMS_CODE = {'key': 'sms_code', 'remark': '短信验证码'} + + PATH = os.path.join(os.path.abspath(os.getcwd()), 'caches') + PATHSTR = 'caches' class GetConfig: @@ -119,6 +157,14 @@ class GetConfig: # 实例化Redis配置模型 return RedisSettings() + @lru_cache() + def get_upload_config(self): + """ + 获取数据库配置 + """ + # 实例上传配置 + return UploadSettings() + @staticmethod def parse_cli_args(): """ @@ -156,3 +202,5 @@ JwtConfig = get_config.get_jwt_config() DataBaseConfig = get_config.get_database_config() # Redis配置 RedisConfig = get_config.get_redis_config() +# 上传配置 +UploadConfig = get_config.get_upload_config() diff --git a/dash-fastapi-backend/config/get_db.py b/dash-fastapi-backend/config/get_db.py index 6d3a9cf..20986ae 100644 --- a/dash-fastapi-backend/config/get_db.py +++ b/dash-fastapi-backend/config/get_db.py @@ -1,27 +1,24 @@ -from config.database import * +from config.database import async_engine, AsyncSessionLocal, Base from utils.log_util import logger -def get_db_pro(): +async def get_db(): """ 每一个请求处理完毕后会关闭当前连接,不同的请求使用不同的连接 + :return: """ - current_db = SessionLocal() - try: + async with AsyncSessionLocal() as current_db: yield current_db - finally: - current_db.close() async def init_create_table(): """ 应用启动时初始化数据库连接 + :return: """ - logger.info("初始化数据库连接...") - Base.metadata.create_all(bind=engine) - logger.info("数据库连接成功") - - -get_db = get_db_pro + logger.info('初始化数据库连接...') + async with async_engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + logger.info('数据库连接成功') diff --git a/dash-fastapi-backend/config/get_redis.py b/dash-fastapi-backend/config/get_redis.py index 4c3ef80..9d78cad 100644 --- a/dash-fastapi-backend/config/get_redis.py +++ b/dash-fastapi-backend/config/get_redis.py @@ -1,9 +1,9 @@ from redis import asyncio as aioredis from redis.exceptions import AuthenticationError, TimeoutError, RedisError -from module_admin.service.dict_service import DictDataService -from module_admin.service.config_service import ConfigService +from config.database import AsyncSessionLocal from config.env import RedisConfig -from config.database import SessionLocal +from module_admin.service.config_service import ConfigService +from module_admin.service.dict_service import DictDataService from utils.log_util import logger @@ -16,62 +16,62 @@ class RedisUtil: async def create_redis_pool(cls) -> aioredis.Redis: """ 应用启动时初始化redis连接 + :return: Redis连接对象 """ - logger.info("开始连接redis...") + logger.info('开始连接redis...') redis = await aioredis.from_url( - url=f"redis://{RedisConfig.redis_host}", + url=f'redis://{RedisConfig.redis_host}', port=RedisConfig.redis_port, username=RedisConfig.redis_username, password=RedisConfig.redis_password, db=RedisConfig.redis_database, - encoding="utf-8", - decode_responses=True + encoding='utf-8', + decode_responses=True, ) try: connection = await redis.ping() if connection: - logger.info("redis连接成功") + logger.info('redis连接成功') else: - logger.error("redis连接失败") + logger.error('redis连接失败') except AuthenticationError as e: - logger.error(f"redis用户名或密码错误,详细错误信息:{e}") + logger.error(f'redis用户名或密码错误,详细错误信息:{e}') except TimeoutError as e: - logger.error(f"redis连接超时,详细错误信息:{e}") + logger.error(f'redis连接超时,详细错误信息:{e}') except RedisError as e: - logger.error(f"redis连接错误,详细错误信息:{e}") + logger.error(f'redis连接错误,详细错误信息:{e}') return redis @classmethod async def close_redis_pool(cls, app): """ 应用关闭时关闭redis连接 + :param app: fastapi对象 :return: """ await app.state.redis.close() - logger.info("关闭redis连接成功") + logger.info('关闭redis连接成功') @classmethod async def init_sys_dict(cls, redis): """ 应用启动时缓存字典表 + :param redis: redis对象 :return: """ - session = SessionLocal() - await DictDataService.init_cache_sys_dict_services(session, redis) - - session.close() + async with AsyncSessionLocal() as session: + await DictDataService.init_cache_sys_dict_services(session, redis) @classmethod async def init_sys_config(cls, redis): """ 应用启动时缓存参数配置表 + :param redis: redis对象 :return: """ - session = SessionLocal() - await ConfigService.init_cache_sys_config_services(session, redis) - - session.close() + async with AsyncSessionLocal() as session: + await ConfigService.init_cache_sys_config_services(session, redis) diff --git a/dash-fastapi-backend/config/get_scheduler.py b/dash-fastapi-backend/config/get_scheduler.py index 2e51af4..589e457 100644 --- a/dash-fastapi-backend/config/get_scheduler.py +++ b/dash-fastapi-backend/config/get_scheduler.py @@ -1,24 +1,28 @@ +import json +from apscheduler.events import EVENT_ALL +from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor from apscheduler.schedulers.background import BackgroundScheduler -from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore from apscheduler.jobstores.memory import MemoryJobStore from apscheduler.jobstores.redis import RedisJobStore -from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor +from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore from apscheduler.triggers.cron import CronTrigger -from apscheduler.events import EVENT_ALL -import json from datetime import datetime, timedelta -from config.database import engine, SQLALCHEMY_DATABASE_URL, SessionLocal -from config.env import RedisConfig -from module_admin.service.job_log_service import JobLogService, JobLogModel -from module_admin.dao.job_dao import Session, JobDao +from sqlalchemy.engine import create_engine +from sqlalchemy.orm import sessionmaker +from typing import Union +from config.database import AsyncSessionLocal, quote_plus +from config.env import DataBaseConfig, RedisConfig +from module_admin.dao.job_dao import JobDao +from module_admin.entity.vo.job_vo import JobLogModel, JobModel +from module_admin.service.job_log_service import JobLogService from utils.log_util import logger -import module_task +import module_task # noqa: F401 # 重写Cron定时 class MyCronTrigger(CronTrigger): @classmethod - def from_crontab(cls, expr, timezone=None): + def from_crontab(cls, expr: str, timezone=None): values = expr.split() if len(values) != 6 and len(values) != 7: raise ValueError('Wrong number of fields; got {}, expected 6 or 7'.format(len(values))) @@ -46,11 +50,20 @@ class MyCronTrigger(CronTrigger): else: day_of_week = None year = values[6] if len(values) == 7 else None - return cls(second=second, minute=minute, hour=hour, day=day, month=month, week=week, - day_of_week=day_of_week, year=year, timezone=timezone) + return cls( + second=second, + minute=minute, + hour=hour, + day=day, + month=month, + week=week, + day_of_week=day_of_week, + year=year, + timezone=timezone, + ) @classmethod - def __find_recent_workday(cls, day): + def __find_recent_workday(cls, day: int): now = datetime.now() date = datetime(now.year, now.month, day) if date.weekday() < 5: @@ -65,6 +78,19 @@ class MyCronTrigger(CronTrigger): diff += 1 +SQLALCHEMY_DATABASE_URL = ( + f'mysql+pymysql://{DataBaseConfig.db_username}:{quote_plus(DataBaseConfig.db_password)}@' + f'{DataBaseConfig.db_host}:{DataBaseConfig.db_port}/{DataBaseConfig.db_database}' +) +engine = create_engine( + SQLALCHEMY_DATABASE_URL, + echo=DataBaseConfig.db_echo, + max_overflow=DataBaseConfig.db_max_overflow, + pool_size=DataBaseConfig.db_pool_size, + pool_recycle=DataBaseConfig.db_pool_recycle, + pool_timeout=DataBaseConfig.db_pool_timeout, +) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) job_stores = { 'default': MemoryJobStore(), 'sqlalchemy': SQLAlchemyJobStore(url=SQLALCHEMY_DATABASE_URL, engine=engine), @@ -74,18 +100,12 @@ job_stores = { port=RedisConfig.redis_port, username=RedisConfig.redis_username, password=RedisConfig.redis_password, - db=RedisConfig.redis_database + db=RedisConfig.redis_database, ) - ) -} -executors = { - 'default': ThreadPoolExecutor(20), - 'processpool': ProcessPoolExecutor(5) -} -job_defaults = { - 'coalesce': False, - 'max_instance': 1 + ), } +executors = {'default': ThreadPoolExecutor(20), 'processpool': ProcessPoolExecutor(5)} +job_defaults = {'coalesce': False, 'max_instance': 1} scheduler = BackgroundScheduler() scheduler.configure(jobstores=job_stores, executors=executors, job_defaults=job_defaults) @@ -96,36 +116,39 @@ class SchedulerUtil: """ @classmethod - async def init_system_scheduler(cls, result_db: Session = SessionLocal()): + async def init_system_scheduler(cls): """ 应用启动时初始化定时任务 + :return: """ - logger.info("开始启动定时任务...") + logger.info('开始启动定时任务...') scheduler.start() - job_list = JobDao.get_job_list_for_scheduler(result_db) - for item in job_list: - query_job = cls.get_scheduler_job(job_id=str(item.job_id)) - if query_job: - cls.remove_scheduler_job(job_id=str(item.job_id)) - cls.add_scheduler_job(item) - result_db.close() + async with AsyncSessionLocal() as session: + job_list = await JobDao.get_job_list_for_scheduler(session) + for item in job_list: + query_job = cls.get_scheduler_job(job_id=str(item.job_id)) + if query_job: + cls.remove_scheduler_job(job_id=str(item.job_id)) + cls.add_scheduler_job(item) scheduler.add_listener(cls.scheduler_event_listener, EVENT_ALL) - logger.info("系统初始定时任务加载成功") + logger.info('系统初始定时任务加载成功') @classmethod async def close_system_scheduler(cls): """ 应用关闭时关闭定时任务 + :return: """ scheduler.shutdown() - logger.info("关闭定时任务成功") + logger.info('关闭定时任务成功') @classmethod - def get_scheduler_job(cls, job_id): + def get_scheduler_job(cls, job_id: Union[str, int]): """ 根据任务id获取任务对象 + :param job_id: 任务id :return: 任务对象 """ @@ -134,9 +157,10 @@ class SchedulerUtil: return query_job @classmethod - def add_scheduler_job(cls, job_info): + def add_scheduler_job(cls, job_info: JobModel): """ 根据输入的任务对象信息添加任务 + :param job_info: 任务对象信息 :return: """ @@ -151,13 +175,14 @@ class SchedulerUtil: coalesce=True if job_info.misfire_policy == '2' else False, max_instances=3 if job_info.concurrent == '0' else 1, jobstore=job_info.job_group, - executor=job_info.job_executor + executor=job_info.job_executor, ) @classmethod - def execute_scheduler_job_once(cls, job_info): + def execute_scheduler_job_once(cls, job_info: JobModel): """ 根据输入的任务对象执行一次任务 + :param job_info: 任务对象信息 :return: """ @@ -173,13 +198,14 @@ class SchedulerUtil: coalesce=True if job_info.misfire_policy == '2' else False, max_instances=3 if job_info.concurrent == '0' else 1, jobstore=job_info.job_group, - executor=job_info.job_executor + executor=job_info.job_executor, ) @classmethod - def remove_scheduler_job(cls, job_id): + def remove_scheduler_job(cls, job_id: Union[str, int]): """ 根据任务id移除任务 + :param job_id: 任务id :return: """ @@ -195,38 +221,40 @@ class SchedulerUtil: if event_type == 'JobExecutionEvent' and event.exception: exception_info = str(event.exception) status = '1' - job_id = event.job_id - query_job = cls.get_scheduler_job(job_id=job_id) - if query_job: - query_job_info = query_job.__getstate__() - # 获取任务名称 - job_name = query_job_info.get('name') - # 获取任务组名 - job_group = query_job._jobstore_alias - # 获取任务执行器 - job_executor = query_job_info.get('executor') - # 获取调用目标字符串 - invoke_target = query_job_info.get('func') - # 获取调用函数位置参数 - job_args = ','.join(query_job_info.get('args')) - # 获取调用函数关键字参数 - job_kwargs = json.dumps(query_job_info.get('kwargs')) - # 获取任务触发器 - job_trigger = str(query_job_info.get('trigger')) - # 构造日志消息 - job_message = f"事件类型: {event_type}, 任务ID: {job_id}, 任务名称: {job_name}, 执行于{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" - job_log = dict( - job_name=job_name, - job_group=job_group, - job_executor=job_executor, - invoke_target=invoke_target, - job_args=job_args, - job_kwargs=job_kwargs, - job_trigger=job_trigger, - job_message=job_message, - status=status, - exception_info=exception_info - ) - session = SessionLocal() - JobLogService.add_job_log_services(session, JobLogModel(**job_log)) - session.close() + if hasattr(event, 'job_id'): + job_id = event.job_id + query_job = cls.get_scheduler_job(job_id=job_id) + if query_job: + query_job_info = query_job.__getstate__() + # 获取任务名称 + job_name = query_job_info.get('name') + # 获取任务组名 + job_group = query_job._jobstore_alias + # 获取任务执行器 + job_executor = query_job_info.get('executor') + # 获取调用目标字符串 + invoke_target = query_job_info.get('func') + # 获取调用函数位置参数 + job_args = ','.join(query_job_info.get('args')) + # 获取调用函数关键字参数 + job_kwargs = json.dumps(query_job_info.get('kwargs')) + # 获取任务触发器 + job_trigger = str(query_job_info.get('trigger')) + # 构造日志消息 + job_message = f"事件类型: {event_type}, 任务ID: {job_id}, 任务名称: {job_name}, 执行于{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" + job_log = JobLogModel( + jobName=job_name, + jobGroup=job_group, + jobExecutor=job_executor, + invokeTarget=invoke_target, + jobArgs=job_args, + jobKwargs=job_kwargs, + jobTrigger=job_trigger, + jobMessage=job_message, + status=status, + exceptionInfo=exception_info, + createTime=datetime.now(), + ) + session = SessionLocal() + JobLogService.add_job_log_services(session, job_log) + session.close() diff --git a/dash-fastapi-backend/exceptions/exception.py b/dash-fastapi-backend/exceptions/exception.py new file mode 100644 index 0000000..b86f50d --- /dev/null +++ b/dash-fastapi-backend/exceptions/exception.py @@ -0,0 +1,58 @@ +class LoginException(Exception): + """ + 自定义登录异常LoginException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class AuthException(Exception): + """ + 自定义令牌异常AuthException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class PermissionException(Exception): + """ + 自定义权限异常PermissionException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class ServiceException(Exception): + """ + 自定义服务异常ServiceException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class ServiceWarning(Exception): + """ + 自定义服务警告ServiceWarning + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class ModelValidatorException(Exception): + """ + 自定义模型校验异常ModelValidatorException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message diff --git a/dash-fastapi-backend/exceptions/handle.py b/dash-fastapi-backend/exceptions/handle.py new file mode 100644 index 0000000..dec516a --- /dev/null +++ b/dash-fastapi-backend/exceptions/handle.py @@ -0,0 +1,71 @@ +from fastapi import FastAPI, Request +from fastapi.exceptions import HTTPException +from pydantic_validation_decorator import FieldValidationError +from exceptions.exception import ( + AuthException, + LoginException, + ModelValidatorException, + PermissionException, + ServiceException, + ServiceWarning, +) +from utils.log_util import logger +from utils.response_util import jsonable_encoder, JSONResponse, ResponseUtil + + +def handle_exception(app: FastAPI): + """ + 全局异常处理 + """ + + # 自定义token检验异常 + @app.exception_handler(AuthException) + async def auth_exception_handler(request: Request, exc: AuthException): + return ResponseUtil.unauthorized(data=exc.data, msg=exc.message) + + # 自定义登录检验异常 + @app.exception_handler(LoginException) + async def login_exception_handler(request: Request, exc: LoginException): + return ResponseUtil.failure(data=exc.data, msg=exc.message) + + # 自定义模型检验异常 + @app.exception_handler(ModelValidatorException) + async def model_validator_exception_handler(request: Request, exc: ModelValidatorException): + logger.warning(exc.message) + return ResponseUtil.failure(data=exc.data, msg=exc.message) + + # 自定义字段检验异常 + @app.exception_handler(FieldValidationError) + async def field_validation_error_handler(request: Request, exc: FieldValidationError): + logger.warning(exc.message) + return ResponseUtil.failure(msg=exc.message) + + # 自定义权限检验异常 + @app.exception_handler(PermissionException) + async def permission_exception_handler(request: Request, exc: PermissionException): + return ResponseUtil.forbidden(data=exc.data, msg=exc.message) + + # 自定义服务异常 + @app.exception_handler(ServiceException) + async def service_exception_handler(request: Request, exc: ServiceException): + logger.error(exc.message) + return ResponseUtil.error(data=exc.data, msg=exc.message) + + # 自定义服务警告 + @app.exception_handler(ServiceWarning) + async def service_warning_handler(request: Request, exc: ServiceWarning): + logger.warning(exc.message) + return ResponseUtil.failure(data=exc.data, msg=exc.message) + + # 处理其他http请求异常 + @app.exception_handler(HTTPException) + async def http_exception_handler(request: Request, exc: HTTPException): + return JSONResponse( + content=jsonable_encoder({'code': exc.status_code, 'msg': exc.detail}), status_code=exc.status_code + ) + + # 处理其他异常 + @app.exception_handler(Exception) + async def exception_handler(request: Request, exc: Exception): + logger.exception(exc) + return ResponseUtil.error(msg=str(exc)) diff --git a/dash-fastapi-backend/middlewares/cors_middleware.py b/dash-fastapi-backend/middlewares/cors_middleware.py new file mode 100644 index 0000000..55508e7 --- /dev/null +++ b/dash-fastapi-backend/middlewares/cors_middleware.py @@ -0,0 +1,25 @@ +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + + +def add_cors_middleware(app: FastAPI): + """ + 添加跨域中间件 + + :param app: FastAPI对象 + :return: + """ + # 前端页面url + origins = [ + 'http://localhost:80', + 'http://127.0.0.1:80', + ] + + # 后台api允许跨域 + app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=['*'], + allow_headers=['*'], + ) diff --git a/dash-fastapi-backend/middlewares/gzip_middleware.py b/dash-fastapi-backend/middlewares/gzip_middleware.py new file mode 100644 index 0000000..eb371ce --- /dev/null +++ b/dash-fastapi-backend/middlewares/gzip_middleware.py @@ -0,0 +1,12 @@ +from fastapi import FastAPI +from starlette.middleware.gzip import GZipMiddleware + + +def add_gzip_middleware(app: FastAPI): + """ + 添加gzip压缩中间件 + + :param app: FastAPI对象 + :return: + """ + app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=9) diff --git a/dash-fastapi-backend/middlewares/handle.py b/dash-fastapi-backend/middlewares/handle.py new file mode 100644 index 0000000..ea447d4 --- /dev/null +++ b/dash-fastapi-backend/middlewares/handle.py @@ -0,0 +1,13 @@ +from fastapi import FastAPI +from middlewares.cors_middleware import add_cors_middleware +from middlewares.gzip_middleware import add_gzip_middleware + + +def handle_middleware(app: FastAPI): + """ + 全局中间件处理 + """ + # 加载跨域中间件 + add_cors_middleware(app) + # 加载gzip压缩中间件 + add_gzip_middleware(app) diff --git a/dash-fastapi-backend/module_admin/annotation/log_annotation.py b/dash-fastapi-backend/module_admin/annotation/log_annotation.py index 7c1f162..1f3e220 100644 --- a/dash-fastapi-backend/module_admin/annotation/log_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/log_annotation.py @@ -1,28 +1,226 @@ -from functools import wraps, lru_cache -from fastapi import Request -from fastapi.responses import JSONResponse, ORJSONResponse, UJSONResponse import inspect -import os import json +import os +import requests import time +import warnings from datetime import datetime -import requests +from fastapi import Request +from fastapi.responses import JSONResponse, ORJSONResponse, UJSONResponse +from functools import lru_cache, wraps +from typing import Literal, Optional, Union from user_agents import parse -from typing import Optional -from module_admin.service.login_service import get_current_user -from module_admin.service.log_service import OperationLogService, LoginLogService -from module_admin.entity.vo.log_vo import OperLogModel, LogininforModel +from module_admin.entity.vo.log_vo import LogininforModel, OperLogModel +from module_admin.service.log_service import LoginLogService, OperationLogService +from module_admin.service.login_service import LoginService +from config.enums import BusinessType from config.env import AppConfig +from exceptions.exception import LoginException, ServiceException, ServiceWarning +from utils.response_util import ResponseUtil + + +class Log: + """ + 日志装饰器 + """ + + def __init__( + self, + title: str, + business_type: BusinessType, + log_type: Optional[Literal['login', 'operation']] = 'operation', + ): + """ + 日志装饰器 + + :param title: 当前日志装饰器装饰的模块标题 + :param business_type: 业务类型(OTHER其它 INSERT新增 UPDATE修改 DELETE删除 GRANT授权 EXPORT导出 IMPORT导入 FORCE强退 GENCODE生成代码 CLEAN清空数据) + :param log_type: 日志类型(login表示登录日志,operation表示为操作日志) + :return: + """ + self.title = title + self.business_type = business_type.value + self.log_type = log_type + + def __call__(self, func): + @wraps(func) + async def wrapper(*args, **kwargs): + start_time = time.time() + # 获取被装饰函数的文件路径 + file_path = inspect.getfile(func) + # 获取项目根路径 + project_root = os.getcwd() + # 处理文件路径,去除项目根路径部分 + relative_path = os.path.relpath(file_path, start=project_root)[0:-2].replace('\\', '.') + # 获取当前被装饰函数所在路径 + func_path = f'{relative_path}{func.__name__}()' + # 获取上下文信息 + request: Request = kwargs.get('request') + token = request.headers.get('Authorization') + query_db = kwargs.get('query_db') + request_method = request.method + operator_type = 0 + user_agent = request.headers.get('User-Agent') + if 'Windows' in user_agent or 'Macintosh' in user_agent or 'Linux' in user_agent: + operator_type = 1 + if 'Mobile' in user_agent or 'Android' in user_agent or 'iPhone' in user_agent: + operator_type = 2 + # 获取请求的url + oper_url = request.url.path + # 获取请求的ip及ip归属区域 + oper_ip = request.headers.get('X-Forwarded-For') + oper_location = '内网IP' + if AppConfig.app_ip_location_query: + oper_location = get_ip_location(oper_ip) + # 根据不同的请求类型使用不同的方法获取请求参数 + content_type = request.headers.get('Content-Type') + if content_type and ( + 'multipart/form-data' in content_type or 'application/x-www-form-urlencoded' in content_type + ): + payload = await request.form() + oper_param = '\n'.join([f'{key}: {value}' for key, value in payload.items()]) + else: + payload = await request.body() + # 通过 request.path_params 直接访问路径参数 + path_params = request.path_params + oper_param = {} + if payload: + oper_param.update(json.loads(str(payload, 'utf-8'))) + if path_params: + oper_param.update(path_params) + oper_param = json.dumps(oper_param, ensure_ascii=False) + # 日志表请求参数字段长度最大为2000,因此在此处判断长度 + if len(oper_param) > 2000: + oper_param = '请求参数过长' + + # 获取操作时间 + oper_time = datetime.now() + # 此处在登录之前向原始函数传递一些登录信息,用于监测在线用户的相关信息 + login_log = {} + if self.log_type == 'login': + user_agent_info = parse(user_agent) + browser = f'{user_agent_info.browser.family}' + system_os = f'{user_agent_info.os.family}' + if user_agent_info.browser.version != (): + browser += f' {user_agent_info.browser.version[0]}' + if user_agent_info.os.version != (): + system_os += f' {user_agent_info.os.version[0]}' + login_log = dict( + ipaddr=oper_ip, + loginLocation=oper_location, + browser=browser, + os=system_os, + loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'), + ) + kwargs['form_data'].login_info = login_log + try: + # 调用原始函数 + result = await func(*args, **kwargs) + except LoginException as e: + result = ResponseUtil.failure(data=e.data, msg=e.message) + except ServiceException as e: + result = ResponseUtil.error(data=e.data, msg=e.message) + except ServiceWarning as e: + result = ResponseUtil.failure(data=e.data, msg=e.message) + except Exception as e: + result = ResponseUtil.error(msg=str(e)) + # 获取请求耗时 + cost_time = float(time.time() - start_time) * 100 + # 判断请求是否来自api文档 + request_from_swagger = ( + request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False + ) + request_from_redoc = ( + request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False + ) + # 根据响应结果的类型使用不同的方法获取响应结果参数 + if ( + isinstance(result, JSONResponse) + or isinstance(result, ORJSONResponse) + or isinstance(result, UJSONResponse) + ): + result_dict = json.loads(str(result.body, 'utf-8')) + else: + if request_from_swagger or request_from_redoc: + result_dict = {} + else: + if result.status_code == 200: + result_dict = {'code': result.status_code, 'message': '获取成功'} + else: + result_dict = {'code': result.status_code, 'message': '获取失败'} + json_result = json.dumps(result_dict, ensure_ascii=False) + # 根据响应结果获取响应状态及异常信息 + status = 1 + error_msg = '' + if result_dict.get('code') == 200: + status = 0 + else: + error_msg = result_dict.get('msg') + # 根据日志类型向对应的日志表插入数据 + if self.log_type == 'login': + # 登录请求来自于api文档时不记录登录日志,其余情况则记录 + if request_from_swagger or request_from_redoc: + pass + else: + user = kwargs.get('form_data') + user_name = user.username + login_log['loginTime'] = oper_time + login_log['userName'] = user_name + login_log['status'] = str(status) + login_log['msg'] = result_dict.get('msg') + await LoginLogService.add_login_log_services(query_db, LogininforModel(**login_log)) + else: + current_user = await LoginService.get_current_user(request, token, query_db) + oper_name = current_user.user.user_name + dept_name = current_user.user.dept.dept_name if current_user.user.dept else None + operation_log = OperLogModel( + title=self.title, + businessType=self.business_type, + method=func_path, + requestMethod=request_method, + operatorType=operator_type, + operName=oper_name, + deptName=dept_name, + operUrl=oper_url, + operIp=oper_ip, + operLocation=oper_location, + operParam=oper_param, + jsonResult=json_result, + status=status, + errorMsg=error_msg, + operTime=oper_time, + costTime=int(cost_time), + ) + await OperationLogService.add_operation_log_services(query_db, operation_log) + + return result -def log_decorator(title: str, business_type: int, log_type: Optional[str] = 'operation'): + return wrapper + + +def log_decorator( + title: str, + business_type: Union[Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], BusinessType], + log_type: Optional[Literal['login', 'operation']] = 'operation', +): """ 日志装饰器 - :param log_type: 日志类型(login表示登录日志,为空表示为操作日志) + :param title: 当前日志装饰器装饰的模块标题 :param business_type: 业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8生成代码 9清空数据) + :param log_type: 日志类型(login表示登录日志,operation表示为操作日志) :return: """ + warnings.simplefilter('always', category=DeprecationWarning) + if isinstance(business_type, BusinessType): + business_type = business_type.value + warnings.warn( + '未来版本将会移除@log_decorator装饰器,请使用@Log装饰器', + category=DeprecationWarning, + stacklevel=2, + ) + def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): @@ -42,31 +240,40 @@ def log_decorator(title: str, business_type: int, log_type: Optional[str] = 'ope request_method = request.method operator_type = 0 user_agent = request.headers.get('User-Agent') - if "Windows" in user_agent or "Macintosh" in user_agent or "Linux" in user_agent: + if 'Windows' in user_agent or 'Macintosh' in user_agent or 'Linux' in user_agent: operator_type = 1 - if "Mobile" in user_agent or "Android" in user_agent or "iPhone" in user_agent: + if 'Mobile' in user_agent or 'Android' in user_agent or 'iPhone' in user_agent: operator_type = 2 # 获取请求的url oper_url = request.url.path # 获取请求的ip及ip归属区域 - oper_ip = request.headers.get('remote_addr') if request.headers.get('is_browser') == 'no' else request.headers.get('X-Forwarded-For') + oper_ip = request.headers.get('X-Forwarded-For') oper_location = '内网IP' if AppConfig.app_ip_location_query: oper_location = get_ip_location(oper_ip) # 根据不同的请求类型使用不同的方法获取请求参数 - content_type = request.headers.get("Content-Type") - if content_type and ("multipart/form-data" in content_type or 'application/x-www-form-urlencoded' in content_type): + content_type = request.headers.get('Content-Type') + if content_type and ( + 'multipart/form-data' in content_type or 'application/x-www-form-urlencoded' in content_type + ): payload = await request.form() - oper_param = "\n".join([f"{key}: {value}" for key, value in payload.items()]) + oper_param = '\n'.join([f'{key}: {value}' for key, value in payload.items()]) else: payload = await request.body() - oper_param = json.dumps(json.loads(str(payload, 'utf-8')), ensure_ascii=False) + # 通过 request.path_params 直接访问路径参数 + path_params = request.path_params + oper_param = {} + if payload: + oper_param.update(json.loads(str(payload, 'utf-8'))) + if path_params: + oper_param.update(path_params) + oper_param = json.dumps(oper_param, ensure_ascii=False) # 日志表请求参数字段长度最大为2000,因此在此处判断长度 if len(oper_param) > 2000: oper_param = '请求参数过长' # 获取操作时间 - oper_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + oper_time = datetime.now() # 此处在登录之前向原始函数传递一些登录信息,用于监测在线用户的相关信息 login_log = {} if log_type == 'login': @@ -79,21 +286,38 @@ def log_decorator(title: str, business_type: int, log_type: Optional[str] = 'ope system_os += f' {user_agent_info.os.version[0]}' login_log = dict( ipaddr=oper_ip, - login_location=oper_location, + loginLocation=oper_location, browser=browser, os=system_os, - login_time=oper_time + loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'), ) kwargs['form_data'].login_info = login_log - # 调用原始函数 - result = await func(*args, **kwargs) + try: + # 调用原始函数 + result = await func(*args, **kwargs) + except LoginException as e: + result = ResponseUtil.failure(data=e.data, msg=e.message) + except ServiceException as e: + result = ResponseUtil.error(data=e.data, msg=e.message) + except ServiceWarning as e: + result = ResponseUtil.failure(data=e.data, msg=e.message) + except Exception as e: + result = ResponseUtil.error(msg=str(e)) # 获取请求耗时 cost_time = float(time.time() - start_time) * 100 # 判断请求是否来自api文档 - request_from_swagger = request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False - request_from_redoc = request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False + request_from_swagger = ( + request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False + ) + request_from_redoc = ( + request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False + ) # 根据响应结果的类型使用不同的方法获取响应结果参数 - if isinstance(result, JSONResponse) or isinstance(result, ORJSONResponse) or isinstance(result, UJSONResponse): + if ( + isinstance(result, JSONResponse) + or isinstance(result, ORJSONResponse) + or isinstance(result, UJSONResponse) + ): result_dict = json.loads(str(result.body, 'utf-8')) else: if request_from_swagger or request_from_redoc: @@ -103,14 +327,14 @@ def log_decorator(title: str, business_type: int, log_type: Optional[str] = 'ope result_dict = {'code': result.status_code, 'message': '获取成功'} else: result_dict = {'code': result.status_code, 'message': '获取失败'} - json_result = json.dumps(dict(code=result_dict.get('code'), message=result_dict.get('message')), ensure_ascii=False) + json_result = json.dumps(result_dict, ensure_ascii=False) # 根据响应结果获取响应状态及异常信息 status = 1 error_msg = '' if result_dict.get('code') == 200: status = 0 else: - error_msg = result_dict.get('message') + error_msg = result_dict.get('msg') # 根据日志类型向对应的日志表插入数据 if log_type == 'login': # 登录请求来自于api文档时不记录登录日志,其余情况则记录 @@ -119,34 +343,35 @@ def log_decorator(title: str, business_type: int, log_type: Optional[str] = 'ope else: user = kwargs.get('form_data') user_name = user.username - login_log['user_name'] = user_name + login_log['loginTime'] = oper_time + login_log['userName'] = user_name login_log['status'] = str(status) - login_log['msg'] = result_dict.get('message') + login_log['msg'] = result_dict.get('msg') - LoginLogService.add_login_log_services(query_db, LogininforModel(**login_log)) + await LoginLogService.add_login_log_services(query_db, LogininforModel(**login_log)) else: - current_user = await get_current_user(request, token, query_db) + current_user = await LoginService.get_current_user(request, token, query_db) oper_name = current_user.user.user_name - dept_name = current_user.dept.dept_name if current_user.dept else None - operation_log = dict( + dept_name = current_user.user.dept.dept_name if current_user.user.dept else None + operation_log = OperLogModel( title=title, - business_type=business_type, + businessType=business_type, method=func_path, - request_method=request_method, - operator_type=operator_type, - oper_name=oper_name, - dept_name=dept_name, - oper_url=oper_url, - oper_ip=oper_ip, - oper_location=oper_location, - oper_param=oper_param, - json_result=json_result, + requestMethod=request_method, + operatorType=operator_type, + operName=oper_name, + deptName=dept_name, + operUrl=oper_url, + operIp=oper_ip, + operLocation=oper_location, + operParam=oper_param, + jsonResult=json_result, status=status, - error_msg=error_msg, - oper_time=oper_time, - cost_time=cost_time + errorMsg=error_msg, + operTime=oper_time, + costTime=int(cost_time), ) - OperationLogService.add_operation_log_services(query_db, OperLogModel(**operation_log)) + await OperationLogService.add_operation_log_services(query_db, operation_log) return result @@ -159,6 +384,7 @@ def log_decorator(title: str, business_type: int, log_type: Optional[str] = 'ope def get_ip_location(oper_ip: str): """ 查询ip归属区域 + :param oper_ip: 需要查询的ip :return: ip归属区域 """ diff --git a/dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py b/dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py new file mode 100644 index 0000000..0799f66 --- /dev/null +++ b/dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py @@ -0,0 +1,81 @@ +import inspect +from fastapi import Form, Query +from pydantic import BaseModel +from pydantic.fields import FieldInfo +from typing import Type + + +def as_query(cls: Type[BaseModel]): + """ + pydantic模型查询参数装饰器,将pydantic模型用于接收查询参数 + """ + new_parameters = [] + + for field_name, model_field in cls.model_fields.items(): + model_field: FieldInfo # type: ignore + + if not model_field.is_required(): + new_parameters.append( + inspect.Parameter( + model_field.alias, + inspect.Parameter.POSITIONAL_ONLY, + default=Query(default=model_field.default, description=model_field.description), + annotation=model_field.annotation, + ) + ) + else: + new_parameters.append( + inspect.Parameter( + model_field.alias, + inspect.Parameter.POSITIONAL_ONLY, + default=Query(..., description=model_field.description), + annotation=model_field.annotation, + ) + ) + + async def as_query_func(**data): + return cls(**data) + + sig = inspect.signature(as_query_func) + sig = sig.replace(parameters=new_parameters) + as_query_func.__signature__ = sig # type: ignore + setattr(cls, 'as_query', as_query_func) + return cls + + +def as_form(cls: Type[BaseModel]): + """ + pydantic模型表单参数装饰器,将pydantic模型用于接收表单参数 + """ + new_parameters = [] + + for field_name, model_field in cls.model_fields.items(): + model_field: FieldInfo # type: ignore + + if not model_field.is_required(): + new_parameters.append( + inspect.Parameter( + model_field.alias, + inspect.Parameter.POSITIONAL_ONLY, + default=Form(default=model_field.default, description=model_field.description), + annotation=model_field.annotation, + ) + ) + else: + new_parameters.append( + inspect.Parameter( + model_field.alias, + inspect.Parameter.POSITIONAL_ONLY, + default=Form(..., description=model_field.description), + annotation=model_field.annotation, + ) + ) + + async def as_form_func(**data): + return cls(**data) + + sig = inspect.signature(as_form_func) + sig = sig.replace(parameters=new_parameters) + as_form_func.__signature__ = sig # type: ignore + setattr(cls, 'as_form', as_form_func) + return cls diff --git a/dash-fastapi-backend/module_admin/aspect/data_scope.py b/dash-fastapi-backend/module_admin/aspect/data_scope.py index 24f4525..5a7afbb 100644 --- a/dash-fastapi-backend/module_admin/aspect/data_scope.py +++ b/dash-fastapi-backend/module_admin/aspect/data_scope.py @@ -1,37 +1,75 @@ from fastapi import Depends -from module_admin.entity.vo.user_vo import CurrentUserInfoServiceResponse -from module_admin.service.login_service import get_current_user from typing import Optional +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.login_service import LoginService class GetDataScope: """ 获取当前用户数据权限对应的查询sql语句 """ - def __init__(self, query_alias: Optional[str] = '', db_alias: Optional[str] = 'db', user_alias: Optional[str] = 'user_id', dept_alias: Optional[str] = 'dept_id'): + + DATA_SCOPE_ALL = '1' + DATA_SCOPE_CUSTOM = '2' + DATA_SCOPE_DEPT = '3' + DATA_SCOPE_DEPT_AND_CHILD = '4' + DATA_SCOPE_SELF = '5' + + def __init__( + self, + query_alias: Optional[str] = '', + db_alias: Optional[str] = 'db', + user_alias: Optional[str] = 'user_id', + dept_alias: Optional[str] = 'dept_id', + ): + """ + 获取当前用户数据权限对应的查询sql语句 + + :param query_alias: 所要查询表对应的sqlalchemy模型名称,默认为'' + :param db_alias: orm对象别名,默认为'db' + :param user_alias: 用户id字段别名,默认为'user_id' + :param dept_alias: 部门id字段别名,默认为'dept_id' + """ self.query_alias = query_alias self.db_alias = db_alias self.user_alias = user_alias self.dept_alias = dept_alias - def __call__(self, current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): + def __call__(self, current_user: CurrentUserModel = Depends(LoginService.get_current_user)): user_id = current_user.user.user_id dept_id = current_user.user.dept_id - role_datascope_list = [dict(role_id=item.role_id, data_scope=int(item.data_scope)) for item in current_user.role] - max_data_scope_dict = min(role_datascope_list, key=lambda x: x['data_scope']) - max_role_id = max_data_scope_dict['role_id'] - max_data_scope = max_data_scope_dict['data_scope'] - if self.query_alias == '' or max_data_scope == 1 or user_id == 1: - param_sql = '1 == 1' - elif max_data_scope == 2: - param_sql = f"{self.query_alias}.{self.dept_alias}.in_({self.db_alias}.query(SysRoleDept.dept_id).filter(SysRoleDept.role_id == {max_role_id})) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1" - elif max_data_scope == 3: - param_sql = f"{self.query_alias}.{self.dept_alias} == {dept_id} if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1" - elif max_data_scope == 4: - param_sql = f"{self.query_alias}.{self.dept_alias}.in_({self.db_alias}.query(SysDept.dept_id).filter(or_(SysDept.dept_id == {dept_id}, func.find_in_set({dept_id}, SysDept.ancestors)))) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1" - elif max_data_scope == 5: - param_sql = f"{self.query_alias}.{self.user_alias} == {user_id} if hasattr({self.query_alias}, '{self.user_alias}') else 1 == 1" - else: - param_sql = '1 == 0' + custom_data_scope_role_id_list = [ + item.role_id for item in current_user.user.role if item.data_scope == self.DATA_SCOPE_CUSTOM + ] + param_sql_list = [] + for role in current_user.user.role: + if current_user.user.admin or role.data_scope == self.DATA_SCOPE_ALL: + param_sql_list = ['1 == 1'] + break + elif role.data_scope == self.DATA_SCOPE_CUSTOM: + if len(custom_data_scope_role_id_list) > 1: + param_sql_list.append( + f"{self.query_alias}.{self.dept_alias}.in_(select(SysRoleDept.dept_id).where(SysRoleDept.role_id.in_({custom_data_scope_role_id_list}))) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 0" + ) + else: + param_sql_list.append( + f"{self.query_alias}.{self.dept_alias}.in_(select(SysRoleDept.dept_id).where(SysRoleDept.role_id == {role.role_id})) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 0" + ) + elif role.data_scope == self.DATA_SCOPE_DEPT: + param_sql_list.append( + f"{self.query_alias}.{self.dept_alias} == {dept_id} if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 0" + ) + elif role.data_scope == self.DATA_SCOPE_DEPT_AND_CHILD: + param_sql_list.append( + f"{self.query_alias}.{self.dept_alias}.in_(select(SysDept.dept_id).where(or_(SysDept.dept_id == {dept_id}, func.find_in_set({dept_id}, SysDept.ancestors)))) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 0" + ) + elif role.data_scope == self.DATA_SCOPE_SELF: + param_sql_list.append( + f"{self.query_alias}.{self.user_alias} == {user_id} if hasattr({self.query_alias}, '{self.user_alias}') else 1 == 0" + ) + else: + param_sql_list.append('1 == 0') + param_sql_list = list(dict.fromkeys(param_sql_list)) + param_sql = f"or_({', '.join(param_sql_list)})" return param_sql diff --git a/dash-fastapi-backend/module_admin/aspect/interface_auth.py b/dash-fastapi-backend/module_admin/aspect/interface_auth.py index e17f324..8f8349d 100644 --- a/dash-fastapi-backend/module_admin/aspect/interface_auth.py +++ b/dash-fastapi-backend/module_admin/aspect/interface_auth.py @@ -1,23 +1,29 @@ from fastapi import Depends -from typing import Union, List -from module_admin.entity.vo.user_vo import CurrentUserInfoServiceResponse -from module_admin.service.login_service import get_current_user -from utils.response_util import PermissionException +from typing import List, Union +from exceptions.exception import PermissionException +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.login_service import LoginService class CheckUserInterfaceAuth: """ 校验当前用户是否具有相应的接口权限 - :param perm: 权限标识 - :param is_strict: 当传入的权限标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个权限标识,所有的校验结果都需要为True才会通过 """ + def __init__(self, perm: Union[str, List], is_strict: bool = False): + """ + 校验当前用户是否具有相应的接口权限 + + :param perm: 权限标识 + :param is_strict: 当传入的权限标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个权限标识,所有的校验结果都需要为True才会通过 + """ self.perm = perm self.is_strict = is_strict - def __call__(self, current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - user_auth_list = [item.perms for item in current_user.menu] - user_auth_list.append('common') + def __call__(self, current_user: CurrentUserModel = Depends(LoginService.get_current_user)): + user_auth_list = current_user.permissions + if '*:*:*' in user_auth_list: + return True if isinstance(self.perm, str): if self.perm in user_auth_list: return True @@ -28,21 +34,26 @@ class CheckUserInterfaceAuth: else: if any([perm_str in user_auth_list for perm_str in self.perm]): return True - raise PermissionException(data="", message="该用户无此接口权限") + raise PermissionException(data='', message='该用户无此接口权限') class CheckRoleInterfaceAuth: """ 根据角色校验当前用户是否具有相应的接口权限 - :param role_key: 角色标识 - :param is_strict: 当传入的角色标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个角色标识,所有的校验结果都需要为True才会通过 """ + def __init__(self, role_key: Union[str, List], is_strict: bool = False): + """ + 根据角色校验当前用户是否具有相应的接口权限 + + :param role_key: 角色标识 + :param is_strict: 当传入的角色标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个角色标识,所有的校验结果都需要为True才会通过 + """ self.role_key = role_key self.is_strict = is_strict - def __call__(self, current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - user_role_list = current_user.role + def __call__(self, current_user: CurrentUserModel = Depends(LoginService.get_current_user)): + user_role_list = current_user.user.role user_role_key_list = [role.role_key for role in user_role_list] if isinstance(self.role_key, str): if self.role_key in user_role_key_list: @@ -54,4 +65,4 @@ class CheckRoleInterfaceAuth: else: if any([role_key_str in user_role_key_list for role_key_str in self.role_key]): return True - raise PermissionException(data="", message="该用户无此接口权限") + raise PermissionException(data='', message='该用户无此接口权限') diff --git a/dash-fastapi-backend/module_admin/controller/cache_controller.py b/dash-fastapi-backend/module_admin/controller/cache_controller.py index 76426a5..9e72713 100644 --- a/dash-fastapi-backend/module_admin/controller/cache_controller.py +++ b/dash-fastapi-backend/module_admin/controller/cache_controller.py @@ -1,94 +1,89 @@ -from fastapi import APIRouter -from fastapi import Depends -from module_admin.service.login_service import get_current_user -from module_admin.service.cache_service import * -from utils.response_util import * -from utils.log_util import * +from fastapi import APIRouter, Depends, Request +from typing import List from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.entity.vo.cache_vo import CacheInfoModel, CacheMonitorModel +from module_admin.service.cache_service import CacheService +from module_admin.service.login_service import LoginService +from utils.log_util import logger +from utils.response_util import ResponseUtil -cacheController = APIRouter(prefix='/cache', dependencies=[Depends(get_current_user)]) +cacheController = APIRouter(prefix='/monitor/cache', dependencies=[Depends(LoginService.get_current_user)]) -@cacheController.post("/statisticalInfo", response_model=CacheMonitorModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) +@cacheController.get( + '', response_model=CacheMonitorModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))] +) async def get_monitor_cache_info(request: Request): - try: - # 获取全量数据 - cache_info_query_result = await CacheService.get_cache_monitor_statistical_info_services(request) - logger.info('获取成功') - return response_200(data=cache_info_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + # 获取全量数据 + cache_info_query_result = await CacheService.get_cache_monitor_statistical_info_services(request) + logger.info('获取成功') + return ResponseUtil.success(data=cache_info_query_result) -@cacheController.post("/getNames", response_model=List[CacheInfoModel], dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) + +@cacheController.get( + '/getNames', + response_model=List[CacheInfoModel], + dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))], +) async def get_monitor_cache_name(request: Request): - try: - # 获取全量数据 - cache_name_list_result = CacheService.get_cache_monitor_cache_name_services() - logger.info('获取成功') - return response_200(data=cache_name_list_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + # 获取全量数据 + cache_name_list_result = await CacheService.get_cache_monitor_cache_name_services() + logger.info('获取成功') + + return ResponseUtil.success(data=cache_name_list_result) -@cacheController.post("/getKeys/{cache_name}", response_model=List[str], dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) +@cacheController.get( + '/getKeys/{cache_name}', + response_model=List[str], + dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))], +) async def get_monitor_cache_key(request: Request, cache_name: str): - try: - # 获取全量数据 - cache_key_list_result = await CacheService.get_cache_monitor_cache_key_services(request, cache_name) - logger.info('获取成功') - return response_200(data=cache_key_list_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + # 获取全量数据 + cache_key_list_result = await CacheService.get_cache_monitor_cache_key_services(request, cache_name) + logger.info('获取成功') + + return ResponseUtil.success(data=cache_key_list_result) -@cacheController.post("/getValue/{cache_name}/{cache_key}", response_model=CacheInfoModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) +@cacheController.get( + '/getValue/{cache_name}/{cache_key}', + response_model=CacheInfoModel, + dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))], +) async def get_monitor_cache_value(request: Request, cache_name: str, cache_key: str): - try: - # 获取全量数据 - cache_value_list_result = await CacheService.get_cache_monitor_cache_value_services(request, cache_name, cache_key) - logger.info('获取成功') - return response_200(data=cache_value_list_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + # 获取全量数据 + cache_value_list_result = await CacheService.get_cache_monitor_cache_value_services(request, cache_name, cache_key) + logger.info('获取成功') + return ResponseUtil.success(data=cache_value_list_result) -@cacheController.post("/clearCacheName/{cache_name}", response_model=CrudCacheResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) + +@cacheController.delete( + '/clearCacheName/{cache_name}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))] +) async def clear_monitor_cache_name(request: Request, cache_name: str): - try: - clear_cache_name_result = await CacheService.clear_cache_monitor_cache_name_services(request, cache_name) - if clear_cache_name_result.is_success: - logger.info(clear_cache_name_result.message) - return response_200(data=clear_cache_name_result, message=clear_cache_name_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@cacheController.post("/clearCacheKey/{cache_name}/{cache_key}", response_model=CrudCacheResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) -async def clear_monitor_cache_key(request: Request, cache_name: str, cache_key: str): - try: - clear_cache_key_result = await CacheService.clear_cache_monitor_cache_key_services(request, cache_name, cache_key) - if clear_cache_key_result.is_success: - logger.info(clear_cache_key_result.message) - return response_200(data=clear_cache_key_result, message=clear_cache_key_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@cacheController.post("/clearCacheAll", response_model=CrudCacheResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) + clear_cache_name_result = await CacheService.clear_cache_monitor_cache_name_services(request, cache_name) + logger.info(clear_cache_name_result.message) + + return ResponseUtil.success(msg=clear_cache_name_result.message) + + +@cacheController.delete( + '/clearCacheKey/{cache_key}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))] +) +async def clear_monitor_cache_key(request: Request, cache_key: str): + clear_cache_key_result = await CacheService.clear_cache_monitor_cache_key_services(request, cache_key) + logger.info(clear_cache_key_result.message) + + return ResponseUtil.success(msg=clear_cache_key_result.message) + + +@cacheController.delete('/clearCacheAll', dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))]) async def clear_monitor_cache_all(request: Request): - try: - clear_cache_all_result = await CacheService.clear_cache_monitor_all_services(request) - if clear_cache_all_result.is_success: - logger.info(clear_cache_all_result.message) - return response_200(data=clear_cache_all_result, message=clear_cache_all_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + clear_cache_all_result = await CacheService.clear_cache_monitor_all_services(request) + logger.info(clear_cache_all_result.message) + + return ResponseUtil.success(msg=clear_cache_all_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/captcha_controller.py b/dash-fastapi-backend/module_admin/controller/captcha_controller.py index 22cbe06..83d35b8 100644 --- a/dash-fastapi-backend/module_admin/controller/captcha_controller.py +++ b/dash-fastapi-backend/module_admin/controller/captcha_controller.py @@ -1,25 +1,40 @@ import uuid -from fastapi import APIRouter, Request -from config.env import RedisInitKeyConfig -from module_admin.service.captcha_service import * -from utils.response_util import * -from utils.log_util import * from datetime import timedelta +from fastapi import APIRouter, Request +from config.enums import RedisInitKeyConfig +from module_admin.entity.vo.login_vo import CaptchaCode +from module_admin.service.captcha_service import CaptchaService +from utils.response_util import ResponseUtil +from utils.log_util import logger captchaController = APIRouter() -@captchaController.post("/captchaImage") +@captchaController.get('/captchaImage') async def get_captcha_image(request: Request): - try: - session_id = str(uuid.uuid4()) - captcha_result = CaptchaService.create_captcha_image_service() - image = captcha_result[0] - computed_result = captcha_result[1] - await request.app.state.redis.set(f"{RedisInitKeyConfig.CAPTCHA_CODES.get('key')}:{session_id}", computed_result, ex=timedelta(minutes=2)) - logger.info(f'编号为{session_id}的会话获取图片验证码成功') - return response_200(data={'image': image, 'session_id': session_id}, message='获取验证码成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + captcha_enabled = ( + True + if await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.captchaEnabled') + == 'true' + else False + ) + register_enabled = ( + True + if await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.registerUser') == 'true' + else False + ) + session_id = str(uuid.uuid4()) + captcha_result = await CaptchaService.create_captcha_image_service() + image = captcha_result[0] + computed_result = captcha_result[1] + await request.app.state.redis.set( + f'{RedisInitKeyConfig.CAPTCHA_CODES.key}:{session_id}', computed_result, ex=timedelta(minutes=2) + ) + logger.info(f'编号为{session_id}的会话获取图片验证码成功') + + return ResponseUtil.success( + model_content=CaptchaCode( + captchaEnabled=captcha_enabled, registerEnabled=register_enabled, img=image, uuid=session_id + ) + ) diff --git a/dash-fastapi-backend/module_admin/controller/common_controller.py b/dash-fastapi-backend/module_admin/controller/common_controller.py index adec809..d2fd621 100644 --- a/dash-fastapi-backend/module_admin/controller/common_controller.py +++ b/dash-fastapi-backend/module_admin/controller/common_controller.py @@ -1,93 +1,36 @@ -from fastapi import APIRouter, Request -from fastapi import Depends, File, Form -from sqlalchemy.orm import Session -from config.env import CachePathConfig -from config.get_db import get_db -from module_admin.service.login_service import get_current_user -from module_admin.service.common_service import * -from module_admin.service.config_service import ConfigService -from utils.response_util import * -from utils.log_util import * -from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from typing import Optional +from fastapi import APIRouter, BackgroundTasks, Depends, File, Query, Request, UploadFile +from module_admin.service.common_service import CommonService +from module_admin.service.login_service import LoginService +from utils.log_util import logger +from utils.response_util import ResponseUtil +commonController = APIRouter(prefix='/common', dependencies=[Depends(LoginService.get_current_user)]) -commonController = APIRouter() +@commonController.post('/upload') +async def common_upload(request: Request, file: UploadFile = File(...)): + upload_result = await CommonService.upload_service(request, file) + logger.info('上传成功') -@commonController.post("/upload", dependencies=[Depends(get_current_user), Depends(CheckUserInterfaceAuth('common'))]) -async def common_upload(request: Request, taskPath: str = Form(), uploadId: str = Form(), file: UploadFile = File(...)): - try: - try: - os.makedirs(os.path.join(CachePathConfig.PATH, taskPath, uploadId)) - except FileExistsError: - pass - CommonService.upload_service(CachePathConfig.PATH, taskPath, uploadId, file) - logger.info('上传成功') - return response_200(data={'filename': file.filename, 'path': f'/common/{CachePathConfig.PATHSTR}?taskPath={taskPath}&taskId={uploadId}&filename={file.filename}'}, message="上传成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + return ResponseUtil.success(model_content=upload_result.result) -@commonController.post("/uploadForEditor", dependencies=[Depends(get_current_user), Depends(CheckUserInterfaceAuth('common'))]) -async def editor_upload(request: Request, baseUrl: str = Form(), uploadId: str = Form(), taskPath: str = Form(), file: UploadFile = File(...)): - try: - try: - os.makedirs(os.path.join(CachePathConfig.PATH, taskPath, uploadId)) - except FileExistsError: - pass - CommonService.upload_service(CachePathConfig.PATH, taskPath, uploadId, file) - logger.info('上传成功') - return JSONResponse( - status_code=status.HTTP_200_OK, - content=jsonable_encoder( - { - 'errno': 0, - 'data': { - 'url': f'{baseUrl}/common/{CachePathConfig.PATHSTR}?taskPath={taskPath}&taskId={uploadId}&filename={file.filename}' - }, - } - ) - ) - except Exception as e: - logger.exception(e) - return JSONResponse( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - content=jsonable_encoder( - { - 'errno': 1, - 'message': str(e), - } - ) - ) +@commonController.get('/download') +async def common_download( + request: Request, + background_tasks: BackgroundTasks, + file_name: str = Query(alias='fileName'), + delete: bool = Query(), +): + download_result = await CommonService.download_services(background_tasks, file_name, delete) + logger.info(download_result.message) + return ResponseUtil.streaming(data=download_result.result) -@commonController.get(f"/{CachePathConfig.PATHSTR}") -async def common_download(request: Request, taskPath: str, taskId: str, filename: str, token: Optional[str] = None, query_db: Session = Depends(get_db)): - try: - def generate_file(): - with open(os.path.join(CachePathConfig.PATH, taskPath, taskId, filename), 'rb') as response_file: - yield from response_file - if taskPath not in ['notice']: - current_user = await get_current_user(request, token, query_db) - if current_user: - logger.info('获取成功') - return streaming_response_200(data=generate_file()) - logger.info('获取成功') - return streaming_response_200(data=generate_file()) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +@commonController.get('/download/resource') +async def common_download_resource(request: Request, resource: str = Query()): + download_resource_result = await CommonService.download_resource_services(resource) + logger.info(download_resource_result.message) -@commonController.get("/config/query/{config_key}") -async def query_system_config(request: Request, config_key: str): - try: - # 获取全量数据 - config_query_result = await ConfigService.query_config_list_from_cache_services(request.app.state.redis, config_key) - logger.info('获取成功') - return response_200(data=config_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + return ResponseUtil.streaming(data=download_resource_result.result) diff --git a/dash-fastapi-backend/module_admin/controller/config_controller.py b/dash-fastapi-backend/module_admin/controller/config_controller.py index a146fcf..d594da8 100644 --- a/dash-fastapi-backend/module_admin/controller/config_controller.py +++ b/dash-fastapi-backend/module_admin/controller/config_controller.py @@ -1,125 +1,123 @@ -from fastapi import APIRouter -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, CurrentUserInfoServiceResponse -from module_admin.service.config_service import * -from module_admin.entity.vo.config_vo import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj -from utils.common_util import bytes2file_response +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -configController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@configController.post("/config/get", response_model=ConfigPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:config:list'))]) -async def get_system_config_list(request: Request, config_page_query: ConfigPageObject, query_db: Session = Depends(get_db)): - try: - config_query = ConfigQueryModel(**config_page_query.dict()) - # 获取全量数据 - config_query_result = ConfigService.get_config_list_services(query_db, config_query) - # 分页操作 - config_page_query_result = get_page_obj(config_query_result, config_page_query.page_num, config_page_query.page_size) - logger.info('获取成功') - return response_200(data=config_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@configController.post("/config/add", response_model=CrudConfigResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:config:add'))]) -@log_decorator(title='参数管理', business_type=1) -async def add_system_config(request: Request, add_config: ConfigModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_config.create_by = current_user.user.user_name - add_config.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_config.update_by = current_user.user.user_name - add_config.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_config_result = await ConfigService.add_config_services(request, query_db, add_config) - if add_config_result.is_success: - logger.info(add_config_result.message) - return response_200(data=add_config_result, message=add_config_result.message) - else: - logger.warning(add_config_result.message) - return response_400(data="", message=add_config_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@configController.patch("/config/edit", response_model=CrudConfigResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:config:edit'))]) -@log_decorator(title='参数管理', business_type=2) -async def edit_system_config(request: Request, edit_config: ConfigModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_config.update_by = current_user.user.user_name - edit_config.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_config_result = await ConfigService.edit_config_services(request, query_db, edit_config) - if edit_config_result.is_success: - logger.info(edit_config_result.message) - return response_200(data=edit_config_result, message=edit_config_result.message) - else: - logger.warning(edit_config_result.message) - return response_400(data="", message=edit_config_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@configController.post("/config/delete", response_model=CrudConfigResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) -@log_decorator(title='参数管理', business_type=3) -async def delete_system_config(request: Request, delete_config: DeleteConfigModel, query_db: Session = Depends(get_db)): - try: - delete_config_result = await ConfigService.delete_config_services(request, query_db, delete_config) - if delete_config_result.is_success: - logger.info(delete_config_result.message) - return response_200(data=delete_config_result, message=delete_config_result.message) - else: - logger.warning(delete_config_result.message) - return response_400(data="", message=delete_config_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@configController.get("/config/{config_id}", response_model=ConfigModel, dependencies=[Depends(CheckUserInterfaceAuth('system:config:query'))]) -async def query_detail_system_config(request: Request, config_id: int, query_db: Session = Depends(get_db)): - try: - detail_config_result = ConfigService.detail_config_services(query_db, config_id) - logger.info(f'获取config_id为{config_id}的信息成功') - return response_200(data=detail_config_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@configController.post("/config/export", dependencies=[Depends(CheckUserInterfaceAuth('system:config:export'))]) -@log_decorator(title='参数管理', business_type=5) -async def export_system_config_list(request: Request, config_query: ConfigQueryModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - config_query_result = ConfigService.get_config_list_services(query_db, config_query) - config_export_result = ConfigService.export_config_list_services(config_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(config_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@configController.post("/config/refresh", response_model=CrudConfigResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:config:edit'))]) -@log_decorator(title='参数管理', business_type=2) -async def refresh_system_config(request: Request, query_db: Session = Depends(get_db)): - try: - refresh_config_result = await ConfigService.refresh_sys_config_services(request, query_db) - if refresh_config_result.is_success: - logger.info(refresh_config_result.message) - return response_200(data=refresh_config_result, message=refresh_config_result.message) - else: - logger.warning(refresh_config_result.message) - return response_400(data="", message=refresh_config_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel, DeleteConfigModel +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.config_service import ConfigService +from module_admin.service.login_service import LoginService +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +configController = APIRouter(prefix='/system/config', dependencies=[Depends(LoginService.get_current_user)]) + + +@configController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:config:list'))] +) +async def get_system_config_list( + request: Request, + config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + config_page_query_result = await ConfigService.get_config_list_services(query_db, config_page_query, is_page=True) + logger.info('获取成功') + + return ResponseUtil.success(model_content=config_page_query_result) + + +@configController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:config:add'))]) +@ValidateFields(validate_model='add_config') +@Log(title='参数管理', business_type=BusinessType.INSERT) +async def add_system_config( + request: Request, + add_config: ConfigModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_config.create_by = current_user.user.user_name + add_config.create_time = datetime.now() + add_config.update_by = current_user.user.user_name + add_config.update_time = datetime.now() + add_config_result = await ConfigService.add_config_services(request, query_db, add_config) + logger.info(add_config_result.message) + + return ResponseUtil.success(msg=add_config_result.message) + + +@configController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:config:edit'))]) +@ValidateFields(validate_model='edit_config') +@Log(title='参数管理', business_type=BusinessType.UPDATE) +async def edit_system_config( + request: Request, + edit_config: ConfigModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_config.update_by = current_user.user.user_name + edit_config.update_time = datetime.now() + edit_config_result = await ConfigService.edit_config_services(request, query_db, edit_config) + logger.info(edit_config_result.message) + + return ResponseUtil.success(msg=edit_config_result.message) + + +@configController.delete('/refreshCache', dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) +@Log(title='参数管理', business_type=BusinessType.UPDATE) +async def refresh_system_config(request: Request, query_db: AsyncSession = Depends(get_db)): + refresh_config_result = await ConfigService.refresh_sys_config_services(request, query_db) + logger.info(refresh_config_result.message) + + return ResponseUtil.success(msg=refresh_config_result.message) + + +@configController.delete('/{config_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) +@Log(title='参数管理', business_type=BusinessType.DELETE) +async def delete_system_config(request: Request, config_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_config = DeleteConfigModel(configIds=config_ids) + delete_config_result = await ConfigService.delete_config_services(request, query_db, delete_config) + logger.info(delete_config_result.message) + + return ResponseUtil.success(msg=delete_config_result.message) + + +@configController.get( + '/{config_id}', response_model=ConfigModel, dependencies=[Depends(CheckUserInterfaceAuth('system:config:query'))] +) +async def query_detail_system_config(request: Request, config_id: int, query_db: AsyncSession = Depends(get_db)): + config_detail_result = await ConfigService.config_detail_services(query_db, config_id) + logger.info(f'获取config_id为{config_id}的信息成功') + + return ResponseUtil.success(data=config_detail_result) + + +@configController.get('/configKey/{config_key}') +async def query_system_config(request: Request, config_key: str): + # 获取全量数据 + config_query_result = await ConfigService.query_config_list_from_cache_services(request.app.state.redis, config_key) + logger.info('获取成功') + + return ResponseUtil.success(msg=config_query_result) + + +@configController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('system:config:export'))]) +@Log(title='参数管理', business_type=BusinessType.EXPORT) +async def export_system_config_list( + request: Request, + config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + config_query_result = await ConfigService.get_config_list_services(query_db, config_page_query, is_page=False) + config_export_result = await ConfigService.export_config_list_services(config_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(config_export_result)) diff --git a/dash-fastapi-backend/module_admin/controller/dept_controller.py b/dash-fastapi-backend/module_admin/controller/dept_controller.py index 6b0171f..2943206 100644 --- a/dash-fastapi-backend/module_admin/controller/dept_controller.py +++ b/dash-fastapi-backend/module_admin/controller/dept_controller.py @@ -1,115 +1,132 @@ -from fastapi import APIRouter, Request -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, CurrentUserInfoServiceResponse -from module_admin.service.dept_service import * -from module_admin.entity.vo.dept_vo import * -from module_admin.dao.dept_dao import * -from utils.response_util import * -from utils.log_util import * -from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.annotation.log_annotation import Log from module_admin.aspect.data_scope import GetDataScope -from module_admin.annotation.log_annotation import log_decorator - - -deptController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@deptController.post("/dept/tree", response_model=DeptTree, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_dept_tree(request: Request, dept_query: DeptModel, query_db: Session = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept'))): - try: - dept_query_result = DeptService.get_dept_tree_services(query_db, dept_query, data_scope_sql) - logger.info('获取成功') - return response_200(data=dept_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@deptController.post("/dept/forEditOption", response_model=DeptTree, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_dept_tree_for_edit_option(request: Request, dept_query: DeptModel, query_db: Session = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept'))): - try: - dept_query_result = DeptService.get_dept_tree_for_edit_option_services(query_db, dept_query, data_scope_sql) - logger.info('获取成功') - return response_200(data=dept_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@deptController.post("/dept/get", response_model=DeptResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dept:list'))]) -async def get_system_dept_list(request: Request, dept_query: DeptModel, query_db: Session = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept'))): - try: - dept_query_result = DeptService.get_dept_list_services(query_db, dept_query, data_scope_sql) - logger.info('获取成功') - return response_200(data=dept_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@deptController.post("/dept/add", response_model=CrudDeptResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dept:add'))]) -@log_decorator(title='部门管理', business_type=1) -async def add_system_dept(request: Request, add_dept: DeptModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_dept.create_by = current_user.user.user_name - add_dept.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_dept.update_by = current_user.user.user_name - add_dept.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_dept_result = DeptService.add_dept_services(query_db, add_dept) - if add_dept_result.is_success: - logger.info(add_dept_result.message) - return response_200(data=add_dept_result, message=add_dept_result.message) - else: - logger.warning(add_dept_result.message) - return response_400(data="", message=add_dept_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@deptController.patch("/dept/edit", response_model=CrudDeptResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dept:edit'))]) -@log_decorator(title='部门管理', business_type=2) -async def edit_system_dept(request: Request, edit_dept: DeptModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_dept.update_by = current_user.user.user_name - edit_dept.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_dept_result = DeptService.edit_dept_services(query_db, edit_dept) - if edit_dept_result.is_success: - logger.info(edit_dept_result.message) - return response_200(data=edit_dept_result, message=edit_dept_result.message) - else: - logger.warning(edit_dept_result.message) - return response_400(data="", message=edit_dept_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@deptController.post("/dept/delete", response_model=CrudDeptResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dept:remove'))]) -@log_decorator(title='部门管理', business_type=3) -async def delete_system_dept(request: Request, delete_dept: DeleteDeptModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - delete_dept.update_by = current_user.user.user_name - delete_dept.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - delete_dept_result = DeptService.delete_dept_services(query_db, delete_dept) - if delete_dept_result.is_success: - logger.info(delete_dept_result.message) - return response_200(data=delete_dept_result, message=delete_dept_result.message) - else: - logger.warning(delete_dept_result.message) - return response_400(data="", message=delete_dept_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@deptController.get("/dept/{dept_id}", response_model=DeptModel, dependencies=[Depends(CheckUserInterfaceAuth('system:dept:query'))]) -async def query_detail_system_dept(request: Request, dept_id: int, query_db: Session = Depends(get_db)): - try: - detail_dept_result = DeptService.detail_dept_services(query_db, dept_id) - logger.info(f'获取dept_id为{dept_id}的信息成功') - return response_200(data=detail_dept_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.entity.vo.dept_vo import DeleteDeptModel, DeptModel, DeptQueryModel +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.dept_service import DeptService +from module_admin.service.login_service import LoginService +from utils.log_util import logger +from utils.response_util import ResponseUtil + + +deptController = APIRouter(prefix='/system/dept', dependencies=[Depends(LoginService.get_current_user)]) + + +@deptController.get( + '/list/exclude/{dept_id}', + response_model=List[DeptModel], + dependencies=[Depends(CheckUserInterfaceAuth('system:dept:list'))], +) +async def get_system_dept_tree_for_edit_option( + request: Request, + dept_id: int, + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + dept_query = DeptModel(deptId=dept_id) + dept_query_result = await DeptService.get_dept_for_edit_option_services(query_db, dept_query, data_scope_sql) + logger.info('获取成功') + + return ResponseUtil.success(data=dept_query_result) + + +@deptController.get( + '/list', response_model=List[DeptModel], dependencies=[Depends(CheckUserInterfaceAuth('system:dept:list'))] +) +async def get_system_dept_list( + request: Request, + dept_query: DeptQueryModel = Depends(DeptQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + dept_query_result = await DeptService.get_dept_list_services(query_db, dept_query, data_scope_sql) + logger.info('获取成功') + + return ResponseUtil.success(data=dept_query_result) + + +@deptController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:dept:add'))]) +@ValidateFields(validate_model='add_dept') +@Log(title='部门管理', business_type=BusinessType.INSERT) +async def add_system_dept( + request: Request, + add_dept: DeptModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_dept.create_by = current_user.user.user_name + add_dept.create_time = datetime.now() + add_dept.update_by = current_user.user.user_name + add_dept.update_time = datetime.now() + add_dept_result = await DeptService.add_dept_services(query_db, add_dept) + logger.info(add_dept_result.message) + + return ResponseUtil.success(data=add_dept_result) + + +@deptController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:dept:edit'))]) +@ValidateFields(validate_model='edit_dept') +@Log(title='部门管理', business_type=BusinessType.UPDATE) +async def edit_system_dept( + request: Request, + edit_dept: DeptModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + if not current_user.user.admin: + await DeptService.check_dept_data_scope_services(query_db, edit_dept.dept_id, data_scope_sql) + edit_dept.update_by = current_user.user.user_name + edit_dept.update_time = datetime.now() + edit_dept_result = await DeptService.edit_dept_services(query_db, edit_dept) + logger.info(edit_dept_result.message) + + return ResponseUtil.success(msg=edit_dept_result.message) + + +@deptController.delete('/{dept_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:dept:remove'))]) +@Log(title='部门管理', business_type=BusinessType.DELETE) +async def delete_system_dept( + request: Request, + dept_ids: str, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + dept_id_list = dept_ids.split(',') if dept_ids else [] + if dept_id_list: + for dept_id in dept_id_list: + if not current_user.user.admin: + await DeptService.check_dept_data_scope_services(query_db, int(dept_id), data_scope_sql) + delete_dept = DeleteDeptModel(deptIds=dept_ids) + delete_dept.update_by = current_user.user.user_name + delete_dept.update_time = datetime.now() + delete_dept_result = await DeptService.delete_dept_services(query_db, delete_dept) + logger.info(delete_dept_result.message) + + return ResponseUtil.success(msg=delete_dept_result.message) + + +@deptController.get( + '/{dept_id}', response_model=DeptModel, dependencies=[Depends(CheckUserInterfaceAuth('system:dept:query'))] +) +async def query_detail_system_dept( + request: Request, + dept_id: int, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + if not current_user.user.admin: + await DeptService.check_dept_data_scope_services(query_db, dept_id, data_scope_sql) + detail_dept_result = await DeptService.dept_detail_services(query_db, dept_id) + logger.info(f'获取dept_id为{dept_id}的信息成功') + + return ResponseUtil.success(data=detail_dept_result) diff --git a/dash-fastapi-backend/module_admin/controller/dict_controller.py b/dash-fastapi-backend/module_admin/controller/dict_controller.py index 293f8e3..f86dbac 100644 --- a/dash-fastapi-backend/module_admin/controller/dict_controller.py +++ b/dash-fastapi-backend/module_admin/controller/dict_controller.py @@ -1,242 +1,239 @@ -from fastapi import APIRouter -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, CurrentUserInfoServiceResponse -from module_admin.service.dict_service import * -from module_admin.entity.vo.dict_vo import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj -from utils.common_util import bytes2file_response +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -dictController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@dictController.post("/dictType/get", response_model=DictTypePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:list'))]) -async def get_system_dict_type_list(request: Request, dict_type_page_query: DictTypePageObject, query_db: Session = Depends(get_db)): - try: - dict_type_query = DictTypeQueryModel(**dict_type_page_query.dict()) - # 获取全量数据 - dict_type_query_result = DictTypeService.get_dict_type_list_services(query_db, dict_type_query) - # 分页操作 - dict_type_page_query_result = get_page_obj(dict_type_query_result, dict_type_page_query.page_num, dict_type_page_query.page_size) - logger.info('获取成功') - return response_200(data=dict_type_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictType/all", dependencies=[Depends(CheckUserInterfaceAuth('system:dict:list'))]) -async def get_system_all_dict_type(request: Request, dict_type_query: DictTypeQueryModel, query_db: Session = Depends(get_db)): - try: - dict_type_query_result = DictTypeService.get_all_dict_type_services(query_db) - logger.info('获取成功') - return response_200(data=dict_type_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictType/add", response_model=CrudDictResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:add'))]) -@log_decorator(title='字典管理', business_type=1) -async def add_system_dict_type(request: Request, add_dict_type: DictTypeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_dict_type.create_by = current_user.user.user_name - add_dict_type.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_dict_type.update_by = current_user.user.user_name - add_dict_type.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_dict_type_result = await DictTypeService.add_dict_type_services(request, query_db, add_dict_type) - if add_dict_type_result.is_success: - logger.info(add_dict_type_result.message) - return response_200(data=add_dict_type_result, message=add_dict_type_result.message) - else: - logger.warning(add_dict_type_result.message) - return response_400(data="", message=add_dict_type_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.patch("/dictType/edit", response_model=CrudDictResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:edit'))]) -@log_decorator(title='字典管理', business_type=2) -async def edit_system_dict_type(request: Request, edit_dict_type: DictTypeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_dict_type.update_by = current_user.user.user_name - edit_dict_type.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_dict_type_result = await DictTypeService.edit_dict_type_services(request, query_db, edit_dict_type) - if edit_dict_type_result.is_success: - logger.info(edit_dict_type_result.message) - return response_200(data=edit_dict_type_result, message=edit_dict_type_result.message) - else: - logger.warning(edit_dict_type_result.message) - return response_400(data="", message=edit_dict_type_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictType/delete", response_model=CrudDictResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:remove'))]) -@log_decorator(title='字典管理', business_type=3) -async def delete_system_dict_type(request: Request, delete_dict_type: DeleteDictTypeModel, query_db: Session = Depends(get_db)): - try: - delete_dict_type_result = await DictTypeService.delete_dict_type_services(request, query_db, delete_dict_type) - if delete_dict_type_result.is_success: - logger.info(delete_dict_type_result.message) - return response_200(data=delete_dict_type_result, message=delete_dict_type_result.message) - else: - logger.warning(delete_dict_type_result.message) - return response_400(data="", message=delete_dict_type_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.get("/dictType/{dict_id}", response_model=DictTypeModel, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:query'))]) -async def query_detail_system_dict_type(request: Request, dict_id: int, query_db: Session = Depends(get_db)): - try: - detail_dict_type_result = DictTypeService.detail_dict_type_services(query_db, dict_id) - logger.info(f'获取dict_id为{dict_id}的信息成功') - return response_200(data=detail_dict_type_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictType/export", dependencies=[Depends(CheckUserInterfaceAuth('system:dict:export'))]) -@log_decorator(title='字典管理', business_type=5) -async def export_system_dict_type_list(request: Request, dict_type_query: DictTypeQueryModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - dict_type_query_result = DictTypeService.get_dict_type_list_services(query_db, dict_type_query) - dict_type_export_result = DictTypeService.export_dict_type_list_services(dict_type_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(dict_type_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictType/refresh", response_model=CrudDictResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:edit'))]) -@log_decorator(title='字典管理', business_type=2) -async def refresh_system_dict(request: Request, query_db: Session = Depends(get_db)): - try: - refresh_dict_result = await DictTypeService.refresh_sys_dict_services(request, query_db) - if refresh_dict_result.is_success: - logger.info(refresh_dict_result.message) - return response_200(data=refresh_dict_result, message=refresh_dict_result.message) - else: - logger.warning(refresh_dict_result.message) - return response_400(data="", message=refresh_dict_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictData/get", response_model=DictDataPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:list'))]) -async def get_system_dict_data_list(request: Request, dict_data_page_query: DictDataPageObject, query_db: Session = Depends(get_db)): - try: - dict_data_query = DictDataModel(**dict_data_page_query.dict()) - # 获取全量数据 - dict_data_query_result = DictDataService.get_dict_data_list_services(query_db, dict_data_query) - # 分页操作 - dict_data_page_query_result = get_page_obj(dict_data_query_result, dict_data_page_query.page_num, dict_data_page_query.page_size) - logger.info('获取成功') - return response_200(data=dict_data_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.get("/dictData/query/{dict_type}", dependencies=[Depends(CheckUserInterfaceAuth('system:dict:list'))]) -async def query_system_dict_data_list(request: Request, dict_type: str, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - dict_data_query_result = await DictDataService.query_dict_data_list_from_cache_services(request.app.state.redis, dict_type) - logger.info('获取成功') - return response_200(data=dict_data_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictData/add", response_model=CrudDictResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:add'))]) -@log_decorator(title='字典管理', business_type=1) -async def add_system_dict_data(request: Request, add_dict_data: DictDataModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_dict_data.create_by = current_user.user.user_name - add_dict_data.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_dict_data.update_by = current_user.user.user_name - add_dict_data.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_dict_data_result = await DictDataService.add_dict_data_services(request, query_db, add_dict_data) - if add_dict_data_result.is_success: - logger.info(add_dict_data_result.message) - return response_200(data=add_dict_data_result, message=add_dict_data_result.message) - else: - logger.warning(add_dict_data_result.message) - return response_400(data="", message=add_dict_data_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.patch("/dictData/edit", response_model=CrudDictResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:edit'))]) -@log_decorator(title='字典管理', business_type=2) -async def edit_system_dict_data(request: Request, edit_dict_data: DictDataModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_dict_data.update_by = current_user.user.user_name - edit_dict_data.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_dict_data_result = await DictDataService.edit_dict_data_services(request, query_db, edit_dict_data) - if edit_dict_data_result.is_success: - logger.info(edit_dict_data_result.message) - return response_200(data=edit_dict_data_result, message=edit_dict_data_result.message) - else: - logger.warning(edit_dict_data_result.message) - return response_400(data="", message=edit_dict_data_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictData/delete", response_model=CrudDictResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:remove'))]) -@log_decorator(title='字典管理', business_type=3) -async def delete_system_dict_data(request: Request, delete_dict_data: DeleteDictDataModel, query_db: Session = Depends(get_db)): - try: - delete_dict_data_result = await DictDataService.delete_dict_data_services(request, query_db, delete_dict_data) - if delete_dict_data_result.is_success: - logger.info(delete_dict_data_result.message) - return response_200(data=delete_dict_data_result, message=delete_dict_data_result.message) - else: - logger.warning(delete_dict_data_result.message) - return response_400(data="", message=delete_dict_data_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.get("/dictData/{dict_code}", response_model=DictDataModel, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:query'))]) -async def query_detail_system_dict_data(request: Request, dict_code: int, query_db: Session = Depends(get_db)): - try: - detail_dict_data_result = DictDataService.detail_dict_data_services(query_db, dict_code) - logger.info(f'获取dict_code为{dict_code}的信息成功') - return response_200(data=detail_dict_data_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@dictController.post("/dictData/export", dependencies=[Depends(CheckUserInterfaceAuth('system:dict:export'))]) -@log_decorator(title='字典管理', business_type=5) -async def export_system_dict_data_list(request: Request, dict_data_query: DictDataModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - dict_data_query_result = DictDataService.get_dict_data_list_services(query_db, dict_data_query) - dict_data_export_result = DictDataService.export_dict_data_list_services(dict_data_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(dict_data_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.dict_vo import ( + DeleteDictDataModel, + DeleteDictTypeModel, + DictDataModel, + DictDataPageQueryModel, + DictTypeModel, + DictTypePageQueryModel, +) +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.dict_service import DictDataService, DictTypeService +from module_admin.service.login_service import LoginService +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +dictController = APIRouter(prefix='/system/dict', dependencies=[Depends(LoginService.get_current_user)]) + + +@dictController.get( + '/type/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:list'))] +) +async def get_system_dict_type_list( + request: Request, + dict_type_page_query: DictTypePageQueryModel = Depends(DictTypePageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + dict_type_page_query_result = await DictTypeService.get_dict_type_list_services( + query_db, dict_type_page_query, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=dict_type_page_query_result) + + +@dictController.post('/type', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:add'))]) +@ValidateFields(validate_model='add_dict_type') +@Log(title='字典类型', business_type=BusinessType.INSERT) +async def add_system_dict_type( + request: Request, + add_dict_type: DictTypeModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_dict_type.create_by = current_user.user.user_name + add_dict_type.create_time = datetime.now() + add_dict_type.update_by = current_user.user.user_name + add_dict_type.update_time = datetime.now() + add_dict_type_result = await DictTypeService.add_dict_type_services(request, query_db, add_dict_type) + logger.info(add_dict_type_result.message) + + return ResponseUtil.success(msg=add_dict_type_result.message) + + +@dictController.put('/type', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:edit'))]) +@ValidateFields(validate_model='edit_dict_type') +@Log(title='字典类型', business_type=BusinessType.UPDATE) +async def edit_system_dict_type( + request: Request, + edit_dict_type: DictTypeModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_dict_type.update_by = current_user.user.user_name + edit_dict_type.update_time = datetime.now() + edit_dict_type_result = await DictTypeService.edit_dict_type_services(request, query_db, edit_dict_type) + logger.info(edit_dict_type_result.message) + + return ResponseUtil.success(msg=edit_dict_type_result.message) + + +@dictController.delete('/type/refreshCache', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:remove'))]) +@Log(title='字典类型', business_type=BusinessType.UPDATE) +async def refresh_system_dict(request: Request, query_db: AsyncSession = Depends(get_db)): + refresh_dict_result = await DictTypeService.refresh_sys_dict_services(request, query_db) + logger.info(refresh_dict_result.message) + + return ResponseUtil.success(msg=refresh_dict_result.message) + + +@dictController.delete('/type/{dict_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:remove'))]) +@Log(title='字典类型', business_type=BusinessType.DELETE) +async def delete_system_dict_type(request: Request, dict_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_dict_type = DeleteDictTypeModel(dictIds=dict_ids) + delete_dict_type_result = await DictTypeService.delete_dict_type_services(request, query_db, delete_dict_type) + logger.info(delete_dict_type_result.message) + + return ResponseUtil.success(msg=delete_dict_type_result.message) + + +@dictController.get('/type/optionselect', response_model=List[DictTypeModel]) +async def query_system_dict_type_options(request: Request, query_db: AsyncSession = Depends(get_db)): + dict_type_query_result = await DictTypeService.get_dict_type_list_services( + query_db, DictTypePageQueryModel(**dict()), is_page=False + ) + logger.info('获取成功') + + return ResponseUtil.success(data=dict_type_query_result) + + +@dictController.get( + '/type/{dict_id}', response_model=DictTypeModel, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:query'))] +) +async def query_detail_system_dict_type(request: Request, dict_id: int, query_db: AsyncSession = Depends(get_db)): + dict_type_detail_result = await DictTypeService.dict_type_detail_services(query_db, dict_id) + logger.info(f'获取dict_id为{dict_id}的信息成功') + + return ResponseUtil.success(data=dict_type_detail_result) + + +@dictController.post('/type/export', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:export'))]) +@Log(title='字典类型', business_type=BusinessType.EXPORT) +async def export_system_dict_type_list( + request: Request, + dict_type_page_query: DictTypePageQueryModel = Depends(DictTypePageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + dict_type_query_result = await DictTypeService.get_dict_type_list_services( + query_db, dict_type_page_query, is_page=False + ) + dict_type_export_result = await DictTypeService.export_dict_type_list_services(dict_type_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(dict_type_export_result)) + + +@dictController.get('/data/type/{dict_type}') +async def query_system_dict_type_data(request: Request, dict_type: str, query_db: AsyncSession = Depends(get_db)): + # 获取全量数据 + dict_data_query_result = await DictDataService.query_dict_data_list_from_cache_services( + request.app.state.redis, dict_type + ) + logger.info('获取成功') + + return ResponseUtil.success(data=dict_data_query_result) + + +@dictController.get( + '/data/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:dict:list'))] +) +async def get_system_dict_data_list( + request: Request, + dict_data_page_query: DictDataPageQueryModel = Depends(DictDataPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + dict_data_page_query_result = await DictDataService.get_dict_data_list_services( + query_db, dict_data_page_query, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=dict_data_page_query_result) + + +@dictController.post('/data', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:add'))]) +@ValidateFields(validate_model='add_dict_data') +@Log(title='字典数据', business_type=BusinessType.INSERT) +async def add_system_dict_data( + request: Request, + add_dict_data: DictDataModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_dict_data.create_by = current_user.user.user_name + add_dict_data.create_time = datetime.now() + add_dict_data.update_by = current_user.user.user_name + add_dict_data.update_time = datetime.now() + add_dict_data_result = await DictDataService.add_dict_data_services(request, query_db, add_dict_data) + logger.info(add_dict_data_result.message) + + return ResponseUtil.success(msg=add_dict_data_result.message) + + +@dictController.put('/data', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:edit'))]) +@ValidateFields(validate_model='edit_dict_data') +@Log(title='字典数据', business_type=BusinessType.UPDATE) +async def edit_system_dict_data( + request: Request, + edit_dict_data: DictDataModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_dict_data.update_by = current_user.user.user_name + edit_dict_data.update_time = datetime.now() + edit_dict_data_result = await DictDataService.edit_dict_data_services(request, query_db, edit_dict_data) + logger.info(edit_dict_data_result.message) + + return ResponseUtil.success(msg=edit_dict_data_result.message) + + +@dictController.delete('/data/{dict_codes}', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:remove'))]) +@Log(title='字典数据', business_type=BusinessType.DELETE) +async def delete_system_dict_data(request: Request, dict_codes: str, query_db: AsyncSession = Depends(get_db)): + delete_dict_data = DeleteDictDataModel(dictCodes=dict_codes) + delete_dict_data_result = await DictDataService.delete_dict_data_services(request, query_db, delete_dict_data) + logger.info(delete_dict_data_result.message) + + return ResponseUtil.success(msg=delete_dict_data_result.message) + + +@dictController.get( + '/data/{dict_code}', + response_model=DictDataModel, + dependencies=[Depends(CheckUserInterfaceAuth('system:dict:query'))], +) +async def query_detail_system_dict_data(request: Request, dict_code: int, query_db: AsyncSession = Depends(get_db)): + detail_dict_data_result = await DictDataService.dict_data_detail_services(query_db, dict_code) + logger.info(f'获取dict_code为{dict_code}的信息成功') + + return ResponseUtil.success(data=detail_dict_data_result) + + +@dictController.post('/data/export', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:export'))]) +@Log(title='字典数据', business_type=BusinessType.EXPORT) +async def export_system_dict_data_list( + request: Request, + dict_data_page_query: DictDataPageQueryModel = Depends(DictDataPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + dict_data_query_result = await DictDataService.get_dict_data_list_services( + query_db, dict_data_page_query, is_page=False + ) + dict_data_export_result = await DictDataService.export_dict_data_list_services(dict_data_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(dict_data_export_result)) diff --git a/dash-fastapi-backend/module_admin/controller/job_controller.py b/dash-fastapi-backend/module_admin/controller/job_controller.py index a2dc90c..0c08fff 100644 --- a/dash-fastapi-backend/module_admin/controller/job_controller.py +++ b/dash-fastapi-backend/module_admin/controller/job_controller.py @@ -1,198 +1,194 @@ -from fastapi import APIRouter -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, CurrentUserInfoServiceResponse -from module_admin.service.job_service import * -from module_admin.service.job_log_service import * -from module_admin.entity.vo.job_vo import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj -from utils.common_util import bytes2file_response +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -jobController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@jobController.post("/job/get", response_model=JobPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:list'))]) -async def get_system_job_list(request: Request, job_page_query: JobPageObject, query_db: Session = Depends(get_db)): - try: - job_query = JobModel(**job_page_query.dict()) - # 获取全量数据 - job_query_result = JobService.get_job_list_services(query_db, job_query) - # 分页操作 - notice_page_query_result = get_page_obj(job_query_result, job_page_query.page_num, job_page_query.page_size) - logger.info('获取成功') - return response_200(data=notice_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/job/add", response_model=CrudJobResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:add'))]) -@log_decorator(title='定时任务管理', business_type=1) -async def add_system_job(request: Request, add_job: JobModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_job.create_by = current_user.user.user_name - add_job.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_job.update_by = current_user.user.user_name - add_job.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_job_result = JobService.add_job_services(query_db, add_job) - if add_job_result.is_success: - logger.info(add_job_result.message) - return response_200(data=add_job_result, message=add_job_result.message) - else: - logger.warning(add_job_result.message) - return response_400(data="", message=add_job_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.patch("/job/edit", response_model=CrudJobResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:edit'))]) -@log_decorator(title='定时任务管理', business_type=2) -async def edit_system_job(request: Request, edit_job: EditJobModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_job.update_by = current_user.user.user_name - edit_job.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_job_result = JobService.edit_job_services(query_db, edit_job) - if edit_job_result.is_success: - logger.info(edit_job_result.message) - return response_200(data=edit_job_result, message=edit_job_result.message) - else: - logger.warning(edit_job_result.message) - return response_400(data="", message=edit_job_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/job/changeStatus", response_model=CrudJobResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:changeStatus'))]) -@log_decorator(title='定时任务管理', business_type=2) -async def execute_system_job(request: Request, execute_job: JobModel, query_db: Session = Depends(get_db)): - try: - execute_job_result = JobService.execute_job_once_services(query_db, execute_job) - if execute_job_result.is_success: - logger.info(execute_job_result.message) - return response_200(data=execute_job_result, message=execute_job_result.message) - else: - logger.warning(execute_job_result.message) - return response_400(data="", message=execute_job_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/job/delete", response_model=CrudJobResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) -@log_decorator(title='定时任务管理', business_type=3) -async def delete_system_job(request: Request, delete_job: DeleteJobModel, query_db: Session = Depends(get_db)): - try: - delete_job_result = JobService.delete_job_services(query_db, delete_job) - if delete_job_result.is_success: - logger.info(delete_job_result.message) - return response_200(data=delete_job_result, message=delete_job_result.message) - else: - logger.warning(delete_job_result.message) - return response_400(data="", message=delete_job_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.get("/job/{job_id}", response_model=JobModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:query'))]) -async def query_detail_system_job(request: Request, job_id: int, query_db: Session = Depends(get_db)): - try: - detail_job_result = JobService.detail_job_services(query_db, job_id) - logger.info(f'获取job_id为{job_id}的信息成功') - return response_200(data=detail_job_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/job/export", dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:export'))]) -@log_decorator(title='定时任务管理', business_type=5) -async def export_system_job_list(request: Request, job_query: JobModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - job_query_result = JobService.get_job_list_services(query_db, job_query) - job_export_result = await JobService.export_job_list_services(request, job_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(job_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/jobLog/get", response_model=JobLogPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:list'))]) -async def get_system_job_log_list(request: Request, job_log_page_query: JobLogPageObject, query_db: Session = Depends(get_db)): - try: - job_log_query = JobLogQueryModel(**job_log_page_query.dict()) - # 获取全量数据 - job_log_query_result = JobLogService.get_job_log_list_services(query_db, job_log_query) - # 分页操作 - notice_page_query_result = get_page_obj(job_log_query_result, job_log_page_query.page_num, job_log_page_query.page_size) - logger.info('获取成功') - return response_200(data=notice_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/jobLog/delete", response_model=CrudJobResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) -@log_decorator(title='定时任务日志管理', business_type=3) -async def delete_system_job_log(request: Request, delete_job_log: DeleteJobLogModel, query_db: Session = Depends(get_db)): - try: - delete_job_log_result = JobLogService.delete_job_log_services(query_db, delete_job_log) - if delete_job_log_result.is_success: - logger.info(delete_job_log_result.message) - return response_200(data=delete_job_log_result, message=delete_job_log_result.message) - else: - logger.warning(delete_job_log_result.message) - return response_400(data="", message=delete_job_log_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/jobLog/clear", response_model=CrudJobResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) -@log_decorator(title='定时任务日志管理', business_type=9) -async def clear_system_job_log(request: Request, clear_job_log: ClearJobLogModel, query_db: Session = Depends(get_db)): - try: - clear_job_log_result = JobLogService.clear_job_log_services(query_db, clear_job_log) - if clear_job_log_result.is_success: - logger.info(clear_job_log_result.message) - return response_200(data=clear_job_log_result, message=clear_job_log_result.message) - else: - logger.warning(clear_job_log_result.message) - return response_400(data="", message=clear_job_log_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.get("/jobLog/{job_log_id}", response_model=JobLogModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:query'))]) -async def query_detail_system_job_log(request: Request, job_log_id: int, query_db: Session = Depends(get_db)): - try: - detail_job_log_result = JobLogService.detail_job_log_services(query_db, job_log_id) - logger.info(f'获取job_log_id为{job_log_id}的信息成功') - return response_200(data=detail_job_log_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@jobController.post("/jobLog/export", dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:export'))]) -@log_decorator(title='定时任务日志管理', business_type=5) -async def export_system_job_log_list(request: Request, job_log_query: JobLogQueryModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - job_log_query_result = JobLogService.get_job_log_list_services(query_db, job_log_query) - job_log_export_result = JobLogService.export_job_log_list_services(query_db, job_log_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(job_log_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.job_vo import ( + DeleteJobLogModel, + DeleteJobModel, + EditJobModel, + JobLogPageQueryModel, + JobModel, + JobPageQueryModel, +) +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.job_log_service import JobLogService +from module_admin.service.job_service import JobService +from module_admin.service.login_service import LoginService +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +jobController = APIRouter(prefix='/monitor', dependencies=[Depends(LoginService.get_current_user)]) + + +@jobController.get( + '/job/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:list'))] +) +async def get_system_job_list( + request: Request, + job_page_query: JobPageQueryModel = Depends(JobPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + notice_page_query_result = await JobService.get_job_list_services(query_db, job_page_query, is_page=True) + logger.info('获取成功') + + return ResponseUtil.success(model_content=notice_page_query_result) + + +@jobController.post('/job', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:add'))]) +@ValidateFields(validate_model='add_job') +@Log(title='定时任务', business_type=BusinessType.INSERT) +async def add_system_job( + request: Request, + add_job: JobModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_job.create_by = current_user.user.user_name + add_job.create_time = datetime.now() + add_job.update_by = current_user.user.user_name + add_job.update_time = datetime.now() + add_job_result = await JobService.add_job_services(query_db, add_job) + logger.info(add_job_result.message) + + return ResponseUtil.success(msg=add_job_result.message) + + +@jobController.put('/job', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:edit'))]) +@ValidateFields(validate_model='edit_job') +@Log(title='定时任务', business_type=BusinessType.UPDATE) +async def edit_system_job( + request: Request, + edit_job: EditJobModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_job.update_by = current_user.user.user_name + edit_job.update_time = datetime.now() + edit_job_result = await JobService.edit_job_services(query_db, edit_job) + logger.info(edit_job_result.message) + + return ResponseUtil.success(msg=edit_job_result.message) + + +@jobController.put('/job/changeStatus', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:changeStatus'))]) +@Log(title='定时任务', business_type=BusinessType.UPDATE) +async def change_system_job_status( + request: Request, + change_job: EditJobModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_job = EditJobModel( + jobId=change_job.job_id, + status=change_job.status, + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + type='status', + ) + edit_job_result = await JobService.edit_job_services(query_db, edit_job) + logger.info(edit_job_result.message) + + return ResponseUtil.success(msg=edit_job_result.message) + + +@jobController.put('/job/run', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:changeStatus'))]) +@Log(title='定时任务', business_type=BusinessType.UPDATE) +async def execute_system_job(request: Request, execute_job: JobModel, query_db: AsyncSession = Depends(get_db)): + execute_job_result = await JobService.execute_job_once_services(query_db, execute_job) + logger.info(execute_job_result.message) + + return ResponseUtil.success(msg=execute_job_result.message) + + +@jobController.delete('/job/{job_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) +@Log(title='定时任务', business_type=BusinessType.DELETE) +async def delete_system_job(request: Request, job_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_job = DeleteJobModel(jobIds=job_ids) + delete_job_result = await JobService.delete_job_services(query_db, delete_job) + logger.info(delete_job_result.message) + + return ResponseUtil.success(msg=delete_job_result.message) + + +@jobController.get( + '/job/{job_id}', response_model=JobModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:query'))] +) +async def query_detail_system_job(request: Request, job_id: int, query_db: AsyncSession = Depends(get_db)): + job_detail_result = await JobService.job_detail_services(query_db, job_id) + logger.info(f'获取job_id为{job_id}的信息成功') + + return ResponseUtil.success(data=job_detail_result) + + +@jobController.post('/job/export', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:export'))]) +@Log(title='定时任务', business_type=BusinessType.EXPORT) +async def export_system_job_list( + request: Request, + job_page_query: JobPageQueryModel = Depends(JobPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + job_query_result = await JobService.get_job_list_services(query_db, job_page_query, is_page=False) + job_export_result = await JobService.export_job_list_services(request, job_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(job_export_result)) + + +@jobController.get( + '/jobLog/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:list'))] +) +async def get_system_job_log_list( + request: Request, + job_log_page_query: JobLogPageQueryModel = Depends(JobLogPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + job_log_page_query_result = await JobLogService.get_job_log_list_services( + query_db, job_log_page_query, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=job_log_page_query_result) + + +@jobController.delete('/jobLog/clean', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) +@Log(title='定时任务调度日志', business_type=BusinessType.CLEAN) +async def clear_system_job_log(request: Request, query_db: AsyncSession = Depends(get_db)): + clear_job_log_result = await JobLogService.clear_job_log_services(query_db) + logger.info(clear_job_log_result.message) + + return ResponseUtil.success(msg=clear_job_log_result.message) + + +@jobController.delete('/jobLog/{job_log_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) +@Log(title='定时任务调度日志', business_type=BusinessType.DELETE) +async def delete_system_job_log(request: Request, job_log_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_job_log = DeleteJobLogModel(jobLogIds=job_log_ids) + delete_job_log_result = await JobLogService.delete_job_log_services(query_db, delete_job_log) + logger.info(delete_job_log_result.message) + + return ResponseUtil.success(msg=delete_job_log_result.message) + + +@jobController.post('/jobLog/export', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:export'))]) +@Log(title='定时任务调度日志', business_type=BusinessType.EXPORT) +async def export_system_job_log_list( + request: Request, + job_log_page_query: JobLogPageQueryModel = Depends(JobLogPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + job_log_query_result = await JobLogService.get_job_log_list_services(query_db, job_log_page_query, is_page=False) + job_log_export_result = await JobLogService.export_job_log_list_services(request, job_log_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(job_log_export_result)) diff --git a/dash-fastapi-backend/module_admin/controller/log_controller.py b/dash-fastapi-backend/module_admin/controller/log_controller.py index 3e7175c..4d0b55c 100644 --- a/dash-fastapi-backend/module_admin/controller/log_controller.py +++ b/dash-fastapi-backend/module_admin/controller/log_controller.py @@ -1,164 +1,150 @@ -from fastapi import APIRouter -from fastapi import Depends +from fastapi import APIRouter, Depends, Request +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user -from module_admin.service.log_service import * -from module_admin.entity.vo.log_vo import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj -from utils.common_util import bytes2file_response +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -logController = APIRouter(prefix='/log', dependencies=[Depends(get_current_user)]) - - -@logController.post("/operation/get", response_model=OperLogPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:list'))]) -async def get_system_operation_log_list(request: Request, operation_log_page_query: OperLogPageObject, query_db: Session = Depends(get_db)): - try: - operation_log_query = OperLogQueryModel(**operation_log_page_query.dict()) - # 获取全量数据 - operation_log_query_result = OperationLogService.get_operation_log_list_services(query_db, operation_log_query) - # 分页操作 - operation_log_page_query_result = get_page_obj(operation_log_query_result, operation_log_page_query.page_num, operation_log_page_query.page_size) - logger.info('获取成功') - return response_200(data=operation_log_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/operation/delete", response_model=CrudLogResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) -@log_decorator(title='操作日志管理', business_type=3) -async def delete_system_operation_log(request: Request, delete_operation_log: DeleteOperLogModel, query_db: Session = Depends(get_db)): - try: - delete_operation_log_result = OperationLogService.delete_operation_log_services(query_db, delete_operation_log) - if delete_operation_log_result.is_success: - logger.info(delete_operation_log_result.message) - return response_200(data=delete_operation_log_result, message=delete_operation_log_result.message) - else: - logger.warning(delete_operation_log_result.message) - return response_400(data="", message=delete_operation_log_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/operation/clear", response_model=CrudLogResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) -@log_decorator(title='操作日志管理', business_type=9) -async def clear_system_operation_log(request: Request, clear_operation_log: ClearOperLogModel, query_db: Session = Depends(get_db)): - try: - clear_operation_log_result = OperationLogService.clear_operation_log_services(query_db, clear_operation_log) - if clear_operation_log_result.is_success: - logger.info(clear_operation_log_result.message) - return response_200(data=clear_operation_log_result, message=clear_operation_log_result.message) - else: - logger.warning(clear_operation_log_result.message) - return response_400(data="", message=clear_operation_log_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.get("/operation/{oper_id}", response_model=OperLogModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:query'))]) -async def query_detail_system_operation_log(request: Request, oper_id: int, query_db: Session = Depends(get_db)): - try: - detail_operation_log_result = OperationLogService.detail_operation_log_services(query_db, oper_id) - logger.info(f'获取oper_id为{oper_id}的信息成功') - return response_200(data=detail_operation_log_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/operation/export", dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:export'))]) -@log_decorator(title='操作日志管理', business_type=5) -async def export_system_operation_log_list(request: Request, operation_log_query: OperLogQueryModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - operation_log_query_result = OperationLogService.get_operation_log_list_services(query_db, operation_log_query) - operation_log_export_result = await OperationLogService.export_operation_log_list_services(request, operation_log_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(operation_log_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/login/get", response_model=LoginLogPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:list'))]) -async def get_system_login_log_list(request: Request, login_log_page_query: LoginLogPageObject, query_db: Session = Depends(get_db)): - try: - login_log_query = LoginLogQueryModel(**login_log_page_query.dict()) - # 获取全量数据 - login_log_query_result = LoginLogService.get_login_log_list_services(query_db, login_log_query) - # 分页操作 - login_log_page_query_result = get_page_obj(login_log_query_result, login_log_page_query.page_num, login_log_page_query.page_size) - logger.info('获取成功') - return response_200(data=login_log_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/login/delete", response_model=CrudLogResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))]) -@log_decorator(title='登录日志管理', business_type=3) -async def delete_system_login_log(request: Request, delete_login_log: DeleteLoginLogModel, query_db: Session = Depends(get_db)): - try: - delete_login_log_result = LoginLogService.delete_login_log_services(query_db, delete_login_log) - if delete_login_log_result.is_success: - logger.info(delete_login_log_result.message) - return response_200(data=delete_login_log_result, message=delete_login_log_result.message) - else: - logger.warning(delete_login_log_result.message) - return response_400(data="", message=delete_login_log_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/login/clear", response_model=CrudLogResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))]) -@log_decorator(title='登录日志管理', business_type=9) -async def clear_system_login_log(request: Request, clear_login_log: ClearLoginLogModel, query_db: Session = Depends(get_db)): - try: - clear_login_log_result = LoginLogService.clear_login_log_services(query_db, clear_login_log) - if clear_login_log_result.is_success: - logger.info(clear_login_log_result.message) - return response_200(data=clear_login_log_result, message=clear_login_log_result.message) - else: - logger.warning(clear_login_log_result.message) - return response_400(data="", message=clear_login_log_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/login/unlock", response_model=CrudLogResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:unlock'))]) -@log_decorator(title='登录日志管理', business_type=0) -async def clear_system_login_log(request: Request, unlock_user: UnlockUser, query_db: Session = Depends(get_db)): - try: - unlock_user_result = await LoginLogService.unlock_user_services(request, unlock_user) - if unlock_user_result.is_success: - logger.info(unlock_user_result.message) - return response_200(data=unlock_user_result, message=unlock_user_result.message) - else: - logger.warning(unlock_user_result.message) - return response_400(data="", message=unlock_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@logController.post("/login/export", dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:export'))]) -@log_decorator(title='登录日志管理', business_type=5) -async def export_system_login_log_list(request: Request, login_log_query: LoginLogQueryModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - login_log_query_result = LoginLogService.get_login_log_list_services(query_db, login_log_query) - login_log_export_result = LoginLogService.export_login_log_list_services(login_log_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(login_log_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.log_vo import ( + DeleteLoginLogModel, + DeleteOperLogModel, + LoginLogPageQueryModel, + OperLogPageQueryModel, + UnlockUser, +) +from module_admin.service.log_service import LoginLogService, OperationLogService +from module_admin.service.login_service import LoginService +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +logController = APIRouter(prefix='/monitor', dependencies=[Depends(LoginService.get_current_user)]) + + +@logController.get( + '/operlog/list', + response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:list'))], +) +async def get_system_operation_log_list( + request: Request, + operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + operation_log_page_query_result = await OperationLogService.get_operation_log_list_services( + query_db, operation_log_page_query, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=operation_log_page_query_result) + + +@logController.delete('/operlog/clean', dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) +@Log(title='操作日志', business_type=BusinessType.CLEAN) +async def clear_system_operation_log(request: Request, query_db: AsyncSession = Depends(get_db)): + clear_operation_log_result = await OperationLogService.clear_operation_log_services(query_db) + logger.info(clear_operation_log_result.message) + + return ResponseUtil.success(msg=clear_operation_log_result.message) + + +@logController.delete('/operlog/{oper_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) +@Log(title='操作日志', business_type=BusinessType.DELETE) +async def delete_system_operation_log(request: Request, oper_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_operation_log = DeleteOperLogModel(operIds=oper_ids) + delete_operation_log_result = await OperationLogService.delete_operation_log_services( + query_db, delete_operation_log + ) + logger.info(delete_operation_log_result.message) + + return ResponseUtil.success(msg=delete_operation_log_result.message) + + +@logController.post('/operlog/export', dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:export'))]) +@Log(title='操作日志', business_type=BusinessType.EXPORT) +async def export_system_operation_log_list( + request: Request, + operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + operation_log_query_result = await OperationLogService.get_operation_log_list_services( + query_db, operation_log_page_query, is_page=False + ) + operation_log_export_result = await OperationLogService.export_operation_log_list_services( + request, operation_log_query_result + ) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(operation_log_export_result)) + + +@logController.get( + '/logininfor/list', + response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:list'))], +) +async def get_system_login_log_list( + request: Request, + login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + login_log_page_query_result = await LoginLogService.get_login_log_list_services( + query_db, login_log_page_query, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=login_log_page_query_result) + + +@logController.delete('/logininfor/clean', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))]) +@Log(title='登录日志', business_type=BusinessType.CLEAN) +async def clear_system_login_log(request: Request, query_db: AsyncSession = Depends(get_db)): + clear_login_log_result = await LoginLogService.clear_login_log_services(query_db) + logger.info(clear_login_log_result.message) + + return ResponseUtil.success(msg=clear_login_log_result.message) + + +@logController.delete( + '/logininfor/{info_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))] +) +@Log(title='登录日志', business_type=BusinessType.DELETE) +async def delete_system_login_log(request: Request, info_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_login_log = DeleteLoginLogModel(infoIds=info_ids) + delete_login_log_result = await LoginLogService.delete_login_log_services(query_db, delete_login_log) + logger.info(delete_login_log_result.message) + + return ResponseUtil.success(msg=delete_login_log_result.message) + + +@logController.get( + '/logininfor/unlock/{user_name}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:unlock'))] +) +@Log(title='账户解锁', business_type=BusinessType.OTHER) +async def unlock_system_user(request: Request, user_name: str, query_db: AsyncSession = Depends(get_db)): + unlock_user = UnlockUser(userName=user_name) + unlock_user_result = await LoginLogService.unlock_user_services(request, unlock_user) + logger.info(unlock_user_result.message) + + return ResponseUtil.success(msg=unlock_user_result.message) + + +@logController.post('/logininfor/export', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:export'))]) +@Log(title='登录日志', business_type=BusinessType.EXPORT) +async def export_system_login_log_list( + request: Request, + login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + login_log_query_result = await LoginLogService.get_login_log_list_services( + query_db, login_log_page_query, is_page=False + ) + login_log_export_result = await LoginLogService.export_login_log_list_services(login_log_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(login_log_export_result)) diff --git a/dash-fastapi-backend/module_admin/controller/login_controller.py b/dash-fastapi-backend/module_admin/controller/login_controller.py index 23f7b94..6d13fcc 100644 --- a/dash-fastapi-backend/module_admin/controller/login_controller.py +++ b/dash-fastapi-backend/module_admin/controller/login_controller.py @@ -1,119 +1,148 @@ -from fastapi import APIRouter -from module_admin.service.login_service import * -from module_admin.entity.vo.login_vo import * -from module_admin.dao.login_dao import * -from config.env import JwtConfig, RedisInitKeyConfig -from utils.response_util import * -from utils.log_util import * -from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator -from datetime import timedelta +import jwt +import uuid +from datetime import datetime, timedelta +from fastapi import APIRouter, Depends, Request +from sqlalchemy.ext.asyncio import AsyncSession +from typing import Optional +from config.enums import BusinessType, RedisInitKeyConfig +from config.env import AppConfig, JwtConfig +from config.get_db import get_db +from module_admin.annotation.log_annotation import Log +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.login_vo import UserLogin, UserRegister, Token +from module_admin.entity.vo.user_vo import CurrentUserModel, EditUserModel +from module_admin.service.login_service import CustomOAuth2PasswordRequestForm, LoginService, oauth2_scheme +from module_admin.service.user_service import UserService +from utils.log_util import logger +from utils.response_util import ResponseUtil loginController = APIRouter() -@loginController.post("/loginByAccount", response_model=Token) -@log_decorator(title='用户登录', business_type=0, log_type='login') -async def login(request: Request, form_data: CustomOAuth2PasswordRequestForm = Depends(), query_db: Session = Depends(get_db)): - captcha_enabled = True if await request.app.state.redis.get(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:sys.account.captchaEnabled") == 'true' else False +@loginController.post('/login', response_model=Token) +@Log(title='用户登录', business_type=BusinessType.OTHER, log_type='login') +async def login( + request: Request, form_data: CustomOAuth2PasswordRequestForm = Depends(), query_db: AsyncSession = Depends(get_db) +): + captcha_enabled = ( + True + if await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.captchaEnabled') + == 'true' + else False + ) user = UserLogin( - **dict( - user_name=form_data.username, - password=form_data.password, - captcha=form_data.captcha, - session_id=form_data.session_id, - login_info=form_data.login_info, - captcha_enabled=captcha_enabled - ) + userName=form_data.username, + password=form_data.password, + code=form_data.code, + uuid=form_data.uuid, + loginInfo=form_data.login_info, + captchaEnabled=captcha_enabled, + ) + result = await LoginService.authenticate_user(request, query_db, user) + access_token_expires = timedelta(minutes=JwtConfig.jwt_expire_minutes) + session_id = str(uuid.uuid4()) + access_token = await LoginService.create_access_token( + data={ + 'user_id': str(result[0].user_id), + 'user_name': result[0].user_name, + 'dept_name': result[1].dept_name if result[1] else None, + 'session_id': session_id, + 'login_info': user.login_info, + }, + expires_delta=access_token_expires, ) - try: - result = await authenticate_user(request, query_db, user) - except LoginException as e: - return response_400(data="", message=e.message) - try: - access_token_expires = timedelta(minutes=JwtConfig.jwt_expire_minutes) - session_id = str(uuid.uuid4()) - access_token = create_access_token( - data={ - "user_id": str(result[0].user_id), - "user_name": result[0].user_name, - "dept_name": result[1].dept_name if result[1] else None, - "session_id": session_id, - "login_info": user.login_info - }, - expires_delta=access_token_expires + if AppConfig.app_same_time_login: + await request.app.state.redis.set( + f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{session_id}', + access_token, + ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes), ) - if AppConfig.app_same_time_login: - await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{session_id}", access_token, - ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) - else: - # 此方法可实现同一账号同一时间只能登录一次 - await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{result[0].user_id}", access_token, - ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) - logger.info('登录成功') - # 判断请求是否来自于api文档,如果是返回指定格式的结果,用于修复api文档认证成功后token显示undefined的bug - request_from_swagger = request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False - request_from_redoc = request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False - if request_from_swagger or request_from_redoc: - return {'access_token': access_token, 'token_type': 'Bearer'} - return response_200( - data={'access_token': access_token, 'token_type': 'Bearer'}, - message='登录成功' + else: + # 此方法可实现同一账号同一时间只能登录一次 + await request.app.state.redis.set( + f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{result[0].user_id}', + access_token, + ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes), ) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@loginController.post("/getSmsCode", response_model=SmsCode) -async def get_sms_code(request: Request, user: ResetUserModel, query_db: Session = Depends(get_db)): - try: - sms_result = await get_sms_code_services(request, query_db, user) - if sms_result.is_success: - logger.info('获取成功') - return response_200(data=sms_result, message='获取成功') - else: - logger.warning(sms_result.message) - return response_400(data='', message=sms_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@loginController.post("/forgetPwd", response_model=CrudUserResponse) -async def forget_user_pwd(request: Request, forget_user: ResetUserModel, query_db: Session = Depends(get_db)): - try: - forget_user_result = await forget_user_services(request, query_db, forget_user) - if forget_user_result.is_success: - logger.info(forget_user_result.message) - return response_200(data=forget_user_result, message=forget_user_result.message) - else: - logger.warning(forget_user_result.message) - return response_400(data="", message=forget_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@loginController.post("/getLoginUserInfo", response_model=CurrentUserInfoServiceResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_login_user_info(request: Request, current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - logger.info('获取成功') - return response_200(data=current_user, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@loginController.post("/logout", dependencies=[Depends(get_current_user), Depends(CheckUserInterfaceAuth('common'))]) -async def logout(request: Request, token: Optional[str] = Depends(oauth2_scheme), query_db: Session = Depends(get_db)): - try: - payload = jwt.decode(token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm]) - session_id: str = payload.get("session_id") - await logout_services(request, session_id) - logger.info('退出成功') - return response_200(data="", message="退出成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + await UserService.edit_user_services( + query_db, EditUserModel(userId=result[0].user_id, loginDate=datetime.now(), type='status') + ) + logger.info('登录成功') + # 判断请求是否来自于api文档,如果是返回指定格式的结果,用于修复api文档认证成功后token显示undefined的bug + request_from_swagger = request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False + request_from_redoc = request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False + if request_from_swagger or request_from_redoc: + return {'access_token': access_token, 'token_type': 'Bearer'} + return ResponseUtil.success(msg='登录成功', dict_content={'token': access_token}) + + +@loginController.get('/getInfo', response_model=CurrentUserModel) +async def get_login_user_info( + request: Request, current_user: CurrentUserModel = Depends(LoginService.get_current_user) +): + logger.info('获取成功') + + return ResponseUtil.success(model_content=current_user) + + +@loginController.get('/getRouters') +async def get_login_user_routers( + request: Request, + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + query_db: AsyncSession = Depends(get_db), +): + logger.info('获取成功') + user_routers = await LoginService.get_current_user_routers(current_user.user.user_id, query_db) + + return ResponseUtil.success(data=user_routers) + + +@loginController.post('/register', response_model=CrudResponseModel) +async def register_user(request: Request, user_register: UserRegister, query_db: AsyncSession = Depends(get_db)): + user_register_result = await LoginService.register_user_services(request, query_db, user_register) + logger.info(user_register_result.message) + + return ResponseUtil.success(data=user_register_result, msg=user_register_result.message) + + +# @loginController.post("/getSmsCode", response_model=SmsCode) +# async def get_sms_code(request: Request, user: ResetUserModel, query_db: AsyncSession = Depends(get_db)): +# try: +# sms_result = await LoginService.get_sms_code_services(request, query_db, user) +# if sms_result.is_success: +# logger.info('获取成功') +# return ResponseUtil.success(data=sms_result) +# else: +# logger.warning(sms_result.message) +# return ResponseUtil.failure(msg=sms_result.message) +# except Exception as e: +# logger.exception(e) +# return ResponseUtil.error(msg=str(e)) +# +# +# @loginController.post("/forgetPwd", response_model=CrudResponseModel) +# async def forget_user_pwd(request: Request, forget_user: ResetUserModel, query_db: AsyncSession = Depends(get_db)): +# try: +# forget_user_result = await LoginService.forget_user_services(request, query_db, forget_user) +# if forget_user_result.is_success: +# logger.info(forget_user_result.message) +# return ResponseUtil.success(data=forget_user_result, msg=forget_user_result.message) +# else: +# logger.warning(forget_user_result.message) +# return ResponseUtil.failure(msg=forget_user_result.message) +# except Exception as e: +# logger.exception(e) +# return ResponseUtil.error(msg=str(e)) + + +@loginController.post('/logout') +async def logout(request: Request, token: Optional[str] = Depends(oauth2_scheme)): + payload = jwt.decode( + token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm], options={'verify_exp': False} + ) + session_id: str = payload.get('session_id') + await LoginService.logout_services(request, session_id) + logger.info('退出成功') + + return ResponseUtil.success(msg='退出成功') diff --git a/dash-fastapi-backend/module_admin/controller/menu_controller.py b/dash-fastapi-backend/module_admin/controller/menu_controller.py index c2630d8..0e3124e 100644 --- a/dash-fastapi-backend/module_admin/controller/menu_controller.py +++ b/dash-fastapi-backend/module_admin/controller/menu_controller.py @@ -1,112 +1,114 @@ -from fastapi import APIRouter, Request -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user -from module_admin.service.menu_service import * -from module_admin.entity.vo.menu_vo import * -from module_admin.dao.menu_dao import * -from utils.response_util import * -from utils.log_util import * +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -menuController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@menuController.post("/menu/tree", response_model=MenuTree, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_menu_tree(request: Request, menu_query: MenuTreeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - menu_query_result = MenuService.get_menu_tree_services(query_db, menu_query, current_user) - logger.info('获取成功') - return response_200(data=menu_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@menuController.post("/menu/forEditOption", response_model=MenuTree, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_menu_tree_for_edit_option(request: Request, menu_query: MenuModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - menu_query_result = MenuService.get_menu_tree_for_edit_option_services(query_db, menu_query, current_user) - logger.info('获取成功') - return response_200(data=menu_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@menuController.post("/menu/get", response_model=MenuResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:menu:list'))]) -async def get_system_menu_list(request: Request, menu_query: MenuModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - menu_query_result = MenuService.get_menu_list_services(query_db, menu_query, current_user) - logger.info('获取成功') - return response_200(data=menu_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@menuController.post("/menu/add", response_model=CrudMenuResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:menu:add'))]) -@log_decorator(title='菜单管理', business_type=1) -async def add_system_menu(request: Request, add_menu: MenuModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_menu.create_by = current_user.user.user_name - add_menu.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_menu.update_by = current_user.user.user_name - add_menu.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_menu_result = MenuService.add_menu_services(query_db, add_menu) - if add_menu_result.is_success: - logger.info(add_menu_result.message) - return response_200(data=add_menu_result, message=add_menu_result.message) - else: - logger.warning(add_menu_result.message) - return response_400(data="", message=add_menu_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@menuController.patch("/menu/edit", response_model=CrudMenuResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:menu:edit'))]) -@log_decorator(title='菜单管理', business_type=2) -async def edit_system_menu(request: Request, edit_menu: MenuModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_menu.update_by = current_user.user.user_name - edit_menu.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_menu_result = MenuService.edit_menu_services(query_db, edit_menu) - if edit_menu_result.is_success: - logger.info(edit_menu_result.message) - return response_200(data=edit_menu_result, message=edit_menu_result.message) - else: - logger.warning(edit_menu_result.message) - return response_400(data="", message=edit_menu_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@menuController.post("/menu/delete", response_model=CrudMenuResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:menu:remove'))]) -@log_decorator(title='菜单管理', business_type=3) -async def delete_system_menu(request: Request, delete_menu: DeleteMenuModel, query_db: Session = Depends(get_db)): - try: - delete_menu_result = MenuService.delete_menu_services(query_db, delete_menu) - if delete_menu_result.is_success: - logger.info(delete_menu_result.message) - return response_200(data=delete_menu_result, message=delete_menu_result.message) - else: - logger.warning(delete_menu_result.message) - return response_400(data="", message=delete_menu_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@menuController.get("/menu/{menu_id}", response_model=MenuModel, dependencies=[Depends(CheckUserInterfaceAuth('system:menu:query'))]) -async def query_detail_system_menu(request: Request, menu_id: int, query_db: Session = Depends(get_db)): - try: - detail_menu_result = MenuService.detail_menu_services(query_db, menu_id) - logger.info(f'获取menu_id为{menu_id}的信息成功') - return response_200(data=detail_menu_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.menu_vo import DeleteMenuModel, MenuModel, MenuQueryModel +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.login_service import LoginService +from module_admin.service.menu_service import MenuService +from utils.log_util import logger +from utils.response_util import ResponseUtil + + +menuController = APIRouter(prefix='/system/menu', dependencies=[Depends(LoginService.get_current_user)]) + + +@menuController.get('/treeselect') +async def get_system_menu_tree( + request: Request, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + menu_query_result = await MenuService.get_menu_tree_services(query_db, current_user) + logger.info('获取成功') + + return ResponseUtil.success(data=menu_query_result) + + +@menuController.get('/roleMenuTreeselect/{role_id}') +async def get_system_role_menu_tree( + request: Request, + role_id: int, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + role_menu_query_result = await MenuService.get_role_menu_tree_services(query_db, role_id, current_user) + logger.info('获取成功') + + return ResponseUtil.success(model_content=role_menu_query_result) + + +@menuController.get( + '/list', response_model=List[MenuModel], dependencies=[Depends(CheckUserInterfaceAuth('system:menu:list'))] +) +async def get_system_menu_list( + request: Request, + menu_query: MenuQueryModel = Depends(MenuQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + menu_query_result = await MenuService.get_menu_list_services(query_db, menu_query, current_user) + logger.info('获取成功') + + return ResponseUtil.success(data=menu_query_result) + + +@menuController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:menu:add'))]) +@ValidateFields(validate_model='add_menu') +@Log(title='菜单管理', business_type=BusinessType.INSERT) +async def add_system_menu( + request: Request, + add_menu: MenuModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_menu.create_by = current_user.user.user_name + add_menu.create_time = datetime.now() + add_menu.update_by = current_user.user.user_name + add_menu.update_time = datetime.now() + add_menu_result = await MenuService.add_menu_services(query_db, add_menu) + logger.info(add_menu_result.message) + + return ResponseUtil.success(msg=add_menu_result.message) + + +@menuController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:menu:edit'))]) +@ValidateFields(validate_model='edit_menu') +@Log(title='菜单管理', business_type=BusinessType.UPDATE) +async def edit_system_menu( + request: Request, + edit_menu: MenuModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_menu.update_by = current_user.user.user_name + edit_menu.update_time = datetime.now() + edit_menu_result = await MenuService.edit_menu_services(query_db, edit_menu) + logger.info(edit_menu_result.message) + + return ResponseUtil.success(msg=edit_menu_result.message) + + +@menuController.delete('/{menu_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:menu:remove'))]) +@Log(title='菜单管理', business_type=BusinessType.DELETE) +async def delete_system_menu(request: Request, menu_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_menu = DeleteMenuModel(menuIds=menu_ids) + delete_menu_result = await MenuService.delete_menu_services(query_db, delete_menu) + logger.info(delete_menu_result.message) + + return ResponseUtil.success(msg=delete_menu_result.message) + + +@menuController.get( + '/{menu_id}', response_model=MenuModel, dependencies=[Depends(CheckUserInterfaceAuth('system:menu:query'))] +) +async def query_detail_system_menu(request: Request, menu_id: int, query_db: AsyncSession = Depends(get_db)): + menu_detail_result = await MenuService.menu_detail_services(query_db, menu_id) + logger.info(f'获取menu_id为{menu_id}的信息成功') + + return ResponseUtil.success(data=menu_detail_result) diff --git a/dash-fastapi-backend/module_admin/controller/notice_controller.py b/dash-fastapi-backend/module_admin/controller/notice_controller.py index f23c625..e1e4aa1 100644 --- a/dash-fastapi-backend/module_admin/controller/notice_controller.py +++ b/dash-fastapi-backend/module_admin/controller/notice_controller.py @@ -1,94 +1,89 @@ -from fastapi import APIRouter, Request -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, CurrentUserInfoServiceResponse -from module_admin.service.notice_service import * -from module_admin.entity.vo.notice_vo import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -noticeController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@noticeController.post("/notice/get", response_model=NoticePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:notice:list'))]) -async def get_system_notice_list(request: Request, notice_page_query: NoticePageObject, query_db: Session = Depends(get_db)): - try: - notice_query = NoticeQueryModel(**notice_page_query.dict()) - # 获取全量数据 - notice_query_result = NoticeService.get_notice_list_services(query_db, notice_query) - # 分页操作 - notice_page_query_result = get_page_obj(notice_query_result, notice_page_query.page_num, notice_page_query.page_size) - logger.info('获取成功') - return response_200(data=notice_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@noticeController.post("/notice/add", response_model=CrudNoticeResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:notice:add'))]) -@log_decorator(title='通知公告管理', business_type=1) -async def add_system_notice(request: Request, add_notice: NoticeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_notice.create_by = current_user.user.user_name - add_notice.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_notice.update_by = current_user.user.user_name - add_notice.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_notice_result = NoticeService.add_notice_services(query_db, add_notice) - if add_notice_result.is_success: - logger.info(add_notice_result.message) - return response_200(data=add_notice_result, message=add_notice_result.message) - else: - logger.warning(add_notice_result.message) - return response_400(data="", message=add_notice_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@noticeController.patch("/notice/edit", response_model=CrudNoticeResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:notice:edit'))]) -@log_decorator(title='通知公告管理', business_type=2) -async def edit_system_notice(request: Request, edit_notice: NoticeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_notice.update_by = current_user.user.user_name - edit_notice.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_notice_result = NoticeService.edit_notice_services(query_db, edit_notice) - if edit_notice_result.is_success: - logger.info(edit_notice_result.message) - return response_200(data=edit_notice_result, message=edit_notice_result.message) - else: - logger.warning(edit_notice_result.message) - return response_400(data="", message=edit_notice_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@noticeController.post("/notice/delete", response_model=CrudNoticeResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:notice:remove'))]) -@log_decorator(title='通知公告管理', business_type=3) -async def delete_system_notice(request: Request, delete_notice: DeleteNoticeModel, query_db: Session = Depends(get_db)): - try: - delete_notice_result = NoticeService.delete_notice_services(query_db, delete_notice) - if delete_notice_result.is_success: - logger.info(delete_notice_result.message) - return response_200(data=delete_notice_result, message=delete_notice_result.message) - else: - logger.warning(delete_notice_result.message) - return response_400(data="", message=delete_notice_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@noticeController.get("/notice/{notice_id}", response_model=NoticeModel, dependencies=[Depends(CheckUserInterfaceAuth('system:notice:query'))]) -async def query_detail_system_post(request: Request, notice_id: int, query_db: Session = Depends(get_db)): - try: - detail_notice_result = NoticeService.detail_notice_services(query_db, notice_id) - logger.info(f'获取notice_id为{notice_id}的信息成功') - return response_200(data=detail_notice_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.notice_vo import DeleteNoticeModel, NoticeModel, NoticePageQueryModel +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.login_service import LoginService +from module_admin.service.notice_service import NoticeService +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +noticeController = APIRouter(prefix='/system/notice', dependencies=[Depends(LoginService.get_current_user)]) + + +@noticeController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:notice:list'))] +) +async def get_system_notice_list( + request: Request, + notice_page_query: NoticePageQueryModel = Depends(NoticePageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + notice_page_query_result = await NoticeService.get_notice_list_services(query_db, notice_page_query, is_page=True) + logger.info('获取成功') + + return ResponseUtil.success(model_content=notice_page_query_result) + + +@noticeController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:notice:add'))]) +@ValidateFields(validate_model='add_notice') +@Log(title='通知公告', business_type=BusinessType.INSERT) +async def add_system_notice( + request: Request, + add_notice: NoticeModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_notice.create_by = current_user.user.user_name + add_notice.create_time = datetime.now() + add_notice.update_by = current_user.user.user_name + add_notice.update_time = datetime.now() + add_notice_result = await NoticeService.add_notice_services(query_db, add_notice) + logger.info(add_notice_result.message) + + return ResponseUtil.success(msg=add_notice_result.message) + + +@noticeController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:notice:edit'))]) +@ValidateFields(validate_model='edit_notice') +@Log(title='通知公告', business_type=BusinessType.UPDATE) +async def edit_system_notice( + request: Request, + edit_notice: NoticeModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_notice.update_by = current_user.user.user_name + edit_notice.update_time = datetime.now() + edit_notice_result = await NoticeService.edit_notice_services(query_db, edit_notice) + logger.info(edit_notice_result.message) + + return ResponseUtil.success(msg=edit_notice_result.message) + + +@noticeController.delete('/{notice_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:notice:remove'))]) +@Log(title='通知公告', business_type=BusinessType.DELETE) +async def delete_system_notice(request: Request, notice_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_notice = DeleteNoticeModel(noticeIds=notice_ids) + delete_notice_result = await NoticeService.delete_notice_services(query_db, delete_notice) + logger.info(delete_notice_result.message) + + return ResponseUtil.success(msg=delete_notice_result.message) + + +@noticeController.get( + '/{notice_id}', response_model=NoticeModel, dependencies=[Depends(CheckUserInterfaceAuth('system:notice:query'))] +) +async def query_detail_system_post(request: Request, notice_id: int, query_db: AsyncSession = Depends(get_db)): + notice_detail_result = await NoticeService.notice_detail_services(query_db, notice_id) + logger.info(f'获取notice_id为{notice_id}的信息成功') + + return ResponseUtil.success(data=notice_detail_result) diff --git a/dash-fastapi-backend/module_admin/controller/online_controller.py b/dash-fastapi-backend/module_admin/controller/online_controller.py index 9390c8b..bf65c8f 100644 --- a/dash-fastapi-backend/module_admin/controller/online_controller.py +++ b/dash-fastapi-backend/module_admin/controller/online_controller.py @@ -1,59 +1,40 @@ -from fastapi import APIRouter -from fastapi import Depends +from fastapi import APIRouter, Depends, Request +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, Session -from module_admin.service.online_service import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -onlineController = APIRouter(prefix='/online', dependencies=[Depends(get_current_user)]) - - -@onlineController.post("/get", response_model=OnlinePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:list'))]) -async def get_monitor_online_list(request: Request, online_page_query: OnlinePageObject): - try: - # 获取全量数据 - online_query_result = await OnlineService.get_online_list_services(request, online_page_query) - # 分页操作 - online_page_query_result = get_page_obj(online_query_result, online_page_query.page_num, online_page_query.page_size) - logger.info('获取成功') - return response_200(data=online_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@onlineController.post("/forceLogout", response_model=CrudOnlineResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:forceLogout'))]) -@log_decorator(title='在线用户', business_type=7) -async def delete_monitor_online(request: Request, delete_online: DeleteOnlineModel, query_db: Session = Depends(get_db)): - try: - delete_online_result = await OnlineService.delete_online_services(request, delete_online) - if delete_online_result.is_success: - logger.info(delete_online_result.message) - return response_200(data=delete_online_result, message=delete_online_result.message) - else: - logger.warning(delete_online_result.message) - return response_400(data="", message=delete_online_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@onlineController.post("/batchLogout", response_model=CrudOnlineResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:batchLogout'))]) -@log_decorator(title='在线用户', business_type=7) -async def delete_monitor_online(request: Request, delete_online: DeleteOnlineModel, query_db: Session = Depends(get_db)): - try: - delete_online_result = await OnlineService.delete_online_services(request, delete_online) - if delete_online_result.is_success: - logger.info(delete_online_result.message) - return response_200(data=delete_online_result, message=delete_online_result.message) - else: - logger.warning(delete_online_result.message) - return response_400(data="", message=delete_online_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.online_vo import DeleteOnlineModel, OnlineQueryModel +from module_admin.service.login_service import LoginService +from module_admin.service.online_service import OnlineService +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +onlineController = APIRouter(prefix='/monitor/online', dependencies=[Depends(LoginService.get_current_user)]) + + +@onlineController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:list'))] +) +async def get_monitor_online_list( + request: Request, online_page_query: OnlineQueryModel = Depends(OnlineQueryModel.as_query) +): + # 获取全量数据 + online_query_result = await OnlineService.get_online_list_services(request, online_page_query) + logger.info('获取成功') + + return ResponseUtil.success( + model_content=PageResponseModel(rows=online_query_result, total=len(online_query_result)) + ) + + +@onlineController.delete('/{token_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:forceLogout'))]) +@Log(title='在线用户', business_type=BusinessType.FORCE) +async def delete_monitor_online(request: Request, token_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_online = DeleteOnlineModel(tokenIds=token_ids) + delete_online_result = await OnlineService.delete_online_services(request, delete_online) + logger.info(delete_online_result.message) + + return ResponseUtil.success(msg=delete_online_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/post_controler.py b/dash-fastapi-backend/module_admin/controller/post_controler.py index 33180db..4219076 100644 --- a/dash-fastapi-backend/module_admin/controller/post_controler.py +++ b/dash-fastapi-backend/module_admin/controller/post_controler.py @@ -1,120 +1,105 @@ -from fastapi import APIRouter, Request -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, CurrentUserInfoServiceResponse -from module_admin.service.post_service import * -from module_admin.entity.vo.post_vo import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj -from utils.common_util import bytes2file_response +from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -postController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@postController.post("/post/forSelectOption", response_model=PostSelectOptionResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_post_select(request: Request, query_db: Session = Depends(get_db)): - try: - role_query_result = PostService.get_post_select_option_services(query_db) - logger.info('获取成功') - return response_200(data=role_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@postController.post("/post/get", response_model=PostPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:post:list'))]) -async def get_system_post_list(request: Request, post_page_query: PostPageObject, query_db: Session = Depends(get_db)): - try: - post_query = PostModel(**post_page_query.dict()) - # 获取全量数据 - post_query_result = PostService.get_post_list_services(query_db, post_query) - # 分页操作 - post_page_query_result = get_page_obj(post_query_result, post_page_query.page_num, post_page_query.page_size) - logger.info('获取成功') - return response_200(data=post_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@postController.post("/post/add", response_model=CrudPostResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:post:add'))]) -@log_decorator(title='岗位管理', business_type=1) -async def add_system_post(request: Request, add_post: PostModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_post.create_by = current_user.user.user_name - add_post.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_post.update_by = current_user.user.user_name - add_post.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_post_result = PostService.add_post_services(query_db, add_post) - if add_post_result.is_success: - logger.info(add_post_result.message) - return response_200(data=add_post_result, message=add_post_result.message) - else: - logger.warning(add_post_result.message) - return response_400(data="", message=add_post_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@postController.patch("/post/edit", response_model=CrudPostResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:post:edit'))]) -@log_decorator(title='岗位管理', business_type=2) -async def edit_system_post(request: Request, edit_post: PostModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_post.update_by = current_user.user.user_name - edit_post.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_post_result = PostService.edit_post_services(query_db, edit_post) - if edit_post_result.is_success: - logger.info(edit_post_result.message) - return response_200(data=edit_post_result, message=edit_post_result.message) - else: - logger.warning(edit_post_result.message) - return response_400(data="", message=edit_post_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@postController.post("/post/delete", response_model=CrudPostResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))]) -@log_decorator(title='岗位管理', business_type=3) -async def delete_system_post(request: Request, delete_post: DeletePostModel, query_db: Session = Depends(get_db)): - try: - delete_post_result = PostService.delete_post_services(query_db, delete_post) - if delete_post_result.is_success: - logger.info(delete_post_result.message) - return response_200(data=delete_post_result, message=delete_post_result.message) - else: - logger.warning(delete_post_result.message) - return response_400(data="", message=delete_post_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@postController.get("/post/{post_id}", response_model=PostModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:query'))]) -async def query_detail_system_post(request: Request, post_id: int, query_db: Session = Depends(get_db)): - try: - detail_post_result = PostService.detail_post_services(query_db, post_id) - logger.info(f'获取post_id为{post_id}的信息成功') - return response_200(data=detail_post_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@postController.post("/post/export", dependencies=[Depends(CheckUserInterfaceAuth('system:post:export'))]) -@log_decorator(title='岗位管理', business_type=5) -async def export_system_post_list(request: Request, post_query: PostModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - post_query_result = PostService.get_post_list_services(query_db, post_query) - post_export_result = PostService.export_post_list_services(post_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(post_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.service.login_service import LoginService +from module_admin.service.post_service import PostService +from module_admin.entity.vo.post_vo import DeletePostModel, PostModel, PostPageQueryModel +from module_admin.entity.vo.user_vo import CurrentUserModel +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +postController = APIRouter(prefix='/system/post', dependencies=[Depends(LoginService.get_current_user)]) + + +@postController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:list'))] +) +async def get_system_post_list( + request: Request, + post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + post_page_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=True) + logger.info('获取成功') + + return ResponseUtil.success(model_content=post_page_query_result) + + +@postController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:post:add'))]) +@ValidateFields(validate_model='add_post') +@Log(title='岗位管理', business_type=BusinessType.INSERT) +async def add_system_post( + request: Request, + add_post: PostModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_post.create_by = current_user.user.user_name + add_post.create_time = datetime.now() + add_post.update_by = current_user.user.user_name + add_post.update_time = datetime.now() + add_post_result = await PostService.add_post_services(query_db, add_post) + logger.info(add_post_result.message) + + return ResponseUtil.success(msg=add_post_result.message) + + +@postController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:post:edit'))]) +@ValidateFields(validate_model='edit_post') +@Log(title='岗位管理', business_type=BusinessType.UPDATE) +async def edit_system_post( + request: Request, + edit_post: PostModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_post.update_by = current_user.user.user_name + edit_post.update_time = datetime.now() + edit_post_result = await PostService.edit_post_services(query_db, edit_post) + logger.info(edit_post_result.message) + + return ResponseUtil.success(msg=edit_post_result.message) + + +@postController.delete('/{post_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))]) +@Log(title='岗位管理', business_type=BusinessType.DELETE) +async def delete_system_post(request: Request, post_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_post = DeletePostModel(postIds=post_ids) + delete_post_result = await PostService.delete_post_services(query_db, delete_post) + logger.info(delete_post_result.message) + + return ResponseUtil.success(msg=delete_post_result.message) + + +@postController.get( + '/{post_id}', response_model=PostModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:query'))] +) +async def query_detail_system_post(request: Request, post_id: int, query_db: AsyncSession = Depends(get_db)): + post_detail_result = await PostService.post_detail_services(query_db, post_id) + logger.info(f'获取post_id为{post_id}的信息成功') + + return ResponseUtil.success(data=post_detail_result) + + +@postController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('system:post:export'))]) +@Log(title='岗位管理', business_type=BusinessType.EXPORT) +async def export_system_post_list( + request: Request, + post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + post_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=False) + post_export_result = await PostService.export_post_list_services(post_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(post_export_result)) diff --git a/dash-fastapi-backend/module_admin/controller/role_controller.py b/dash-fastapi-backend/module_admin/controller/role_controller.py index e43e841..e092bcc 100644 --- a/dash-fastapi-backend/module_admin/controller/role_controller.py +++ b/dash-fastapi-backend/module_admin/controller/role_controller.py @@ -1,200 +1,283 @@ -from fastapi import APIRouter, Request -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import get_current_user, CurrentUserInfoServiceResponse -from module_admin.service.role_service import * -from module_admin.service.user_service import UserService, UserRoleQueryModel, UserRolePageObject, UserRolePageObjectResponse, CrudUserRoleModel -from module_admin.entity.vo.role_vo import * -from utils.response_util import * -from utils.log_util import * -from utils.page_util import get_page_obj -from utils.common_util import bytes2file_response +from module_admin.annotation.log_annotation import Log +from module_admin.aspect.data_scope import GetDataScope from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator - - -roleController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@roleController.post("/role/forSelectOption", response_model=RoleSelectOptionResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_role_select(request: Request, query_db: Session = Depends(get_db)): - try: - role_query_result = RoleService.get_role_select_option_services(query_db) - logger.info('获取成功') - return response_200(data=role_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/get", response_model=RolePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:list'))]) -async def get_system_role_list(request: Request, role_page_query: RolePageObject, query_db: Session = Depends(get_db)): - try: - role_query = RoleQueryModel(**role_page_query.dict()) - role_query_result = RoleService.get_role_list_services(query_db, role_query) - # 分页操作 - role_page_query_result = get_page_obj(role_query_result, role_page_query.page_num, role_page_query.page_size) - logger.info('获取成功') - return response_200(data=role_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/add", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:add'))]) -@log_decorator(title='角色管理', business_type=1) -async def add_system_role(request: Request, add_role: AddRoleModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_role.create_by = current_user.user.user_name - add_role.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_role.update_by = current_user.user.user_name - add_role.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_role_result = RoleService.add_role_services(query_db, add_role) - if add_role_result.is_success: - logger.info(add_role_result.message) - return response_200(data=add_role_result, message=add_role_result.message) - else: - logger.warning(add_role_result.message) - return response_400(data="", message=add_role_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.patch("/role/edit", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) -@log_decorator(title='角色管理', business_type=2) -async def edit_system_role(request: Request, edit_role: AddRoleModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_role.update_by = current_user.user.user_name - edit_role.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_role_result = RoleService.edit_role_services(query_db, edit_role) - if edit_role_result.is_success: - logger.info(edit_role_result.message) - return response_200(data=edit_role_result, message=edit_role_result.message) - else: - logger.warning(edit_role_result.message) - return response_400(data="", message=edit_role_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.patch("/role/dataScope", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) -@log_decorator(title='角色管理', business_type=4) -async def edit_system_role_datascope(request: Request, role_data_scope: RoleDataScopeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - role_data_scope.update_by = current_user.user.user_name - role_data_scope.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - role_data_scope_result = RoleService.role_datascope_services(query_db, role_data_scope) - if role_data_scope_result.is_success: - logger.info(role_data_scope_result.message) - return response_200(data=role_data_scope_result, message=role_data_scope_result.message) - else: - logger.warning(role_data_scope_result.message) - return response_400(data="", message=role_data_scope_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/delete", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:remove'))]) -@log_decorator(title='角色管理', business_type=3) -async def delete_system_role(request: Request, delete_role: DeleteRoleModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - delete_role.update_by = current_user.user.user_name - delete_role.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - delete_role_result = RoleService.delete_role_services(query_db, delete_role) - if delete_role_result.is_success: - logger.info(delete_role_result.message) - return response_200(data=delete_role_result, message=delete_role_result.message) - else: - logger.warning(delete_role_result.message) - return response_400(data="", message=delete_role_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.get("/role/{role_id}", response_model=RoleDetailModel, dependencies=[Depends(CheckUserInterfaceAuth('system:role:query'))]) -async def query_detail_system_role(request: Request, role_id: int, query_db: Session = Depends(get_db)): - try: - delete_role_result = RoleService.detail_role_services(query_db, role_id) - logger.info(f'获取role_id为{role_id}的信息成功') - return response_200(data=delete_role_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/export", dependencies=[Depends(CheckUserInterfaceAuth('system:role:export'))]) -@log_decorator(title='角色管理', business_type=5) -async def export_system_role_list(request: Request, role_query: RoleQueryModel, query_db: Session = Depends(get_db)): - try: - # 获取全量数据 - role_query_result = RoleService.get_role_list_services(query_db, role_query) - role_export_result = RoleService.export_role_list_services(role_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(role_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/authUser/allocatedList", response_model=UserRolePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_allocated_user_list(request: Request, user_role: UserRolePageObject, query_db: Session = Depends(get_db)): - try: - user_role_query = UserRoleQueryModel(**user_role.dict()) - user_role_allocated_query_result = UserService.get_user_role_allocated_list_services(query_db, user_role_query) - # 分页操作 - user_role_allocated_page_query_result = get_page_obj(user_role_allocated_query_result, user_role.page_num, user_role.page_size) - logger.info('获取成功') - return response_200(data=user_role_allocated_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/authUser/unallocatedList", response_model=UserRolePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_unallocated_user_list(request: Request, user_role: UserRolePageObject, query_db: Session = Depends(get_db)): - try: - user_role_query = UserRoleQueryModel(**user_role.dict()) - user_role_unallocated_query_result = UserService.get_user_role_unallocated_list_services(query_db, user_role_query) - # 分页操作 - user_role_unallocated_page_query_result = get_page_obj(user_role_unallocated_query_result, user_role.page_num, user_role.page_size) - logger.info('获取成功') - return response_200(data=user_role_unallocated_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/authUser/selectAll", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) -@log_decorator(title='角色管理', business_type=4) -async def add_system_role_user(request: Request, add_user_role: CrudUserRoleModel, query_db: Session = Depends(get_db)): - try: - add_user_role_result = UserService.add_user_role_services(query_db, add_user_role) - if add_user_role_result.is_success: - logger.info(add_user_role_result.message) - return response_200(data=add_user_role_result, message=add_user_role_result.message) - else: - logger.warning(add_user_role_result.message) - return response_400(data="", message=add_user_role_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@roleController.post("/role/authUser/cancel", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) -@log_decorator(title='角色管理', business_type=4) -async def cancel_system_role_user(request: Request, cancel_user_role: CrudUserRoleModel, query_db: Session = Depends(get_db)): - try: - cancel_user_role_result = UserService.delete_user_role_services(query_db, cancel_user_role) - if cancel_user_role_result.is_success: - logger.info(cancel_user_role_result.message) - return response_200(data=cancel_user_role_result, message=cancel_user_role_result.message) - else: - logger.warning(cancel_user_role_result.message) - return response_400(data="", message=cancel_user_role_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) +from module_admin.entity.vo.dept_vo import DeptModel +from module_admin.entity.vo.role_vo import AddRoleModel, DeleteRoleModel, RoleModel, RolePageQueryModel +from module_admin.entity.vo.user_vo import CrudUserRoleModel, CurrentUserModel, UserRolePageQueryModel +from module_admin.service.dept_service import DeptService +from module_admin.service.login_service import LoginService +from module_admin.service.role_service import RoleService +from module_admin.service.user_service import UserService +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + +roleController = APIRouter(prefix='/system/role', dependencies=[Depends(LoginService.get_current_user)]) + + +@roleController.get('/deptTree/{role_id}', dependencies=[Depends(CheckUserInterfaceAuth('system:role:query'))]) +async def get_system_role_dept_tree( + request: Request, + role_id: int, + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + dept_query_result = await DeptService.get_dept_tree_services(query_db, DeptModel(**{}), data_scope_sql) + role_dept_query_result = await RoleService.get_role_dept_tree_services(query_db, role_id) + role_dept_query_result.depts = dept_query_result + logger.info('获取成功') + + return ResponseUtil.success(model_content=role_dept_query_result) + + +@roleController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:role:list'))] +) +async def get_system_role_list( + request: Request, + role_page_query: RolePageQueryModel = Depends(RolePageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + role_page_query_result = await RoleService.get_role_list_services( + query_db, role_page_query, data_scope_sql, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=role_page_query_result) + + +@roleController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:role:add'))]) +@ValidateFields(validate_model='add_role') +@Log(title='角色管理', business_type=BusinessType.INSERT) +async def add_system_role( + request: Request, + add_role: AddRoleModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_role.create_by = current_user.user.user_name + add_role.create_time = datetime.now() + add_role.update_by = current_user.user.user_name + add_role.update_time = datetime.now() + add_role_result = await RoleService.add_role_services(query_db, add_role) + logger.info(add_role_result.message) + + return ResponseUtil.success(msg=add_role_result.message) + + +@roleController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) +@ValidateFields(validate_model='edit_role') +@Log(title='角色管理', business_type=BusinessType.UPDATE) +async def edit_system_role( + request: Request, + edit_role: AddRoleModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + await RoleService.check_role_allowed_services(edit_role) + if not current_user.user.admin: + await RoleService.check_role_data_scope_services(query_db, str(edit_role.role_id), data_scope_sql) + edit_role.update_by = current_user.user.user_name + edit_role.update_time = datetime.now() + edit_role_result = await RoleService.edit_role_services(query_db, edit_role) + logger.info(edit_role_result.message) + + return ResponseUtil.success(msg=edit_role_result.message) + + +@roleController.put('/dataScope', dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) +@Log(title='角色管理', business_type=BusinessType.GRANT) +async def edit_system_role_datascope( + request: Request, + role_data_scope: AddRoleModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + await RoleService.check_role_allowed_services(role_data_scope) + if not current_user.user.admin: + await RoleService.check_role_data_scope_services(query_db, str(role_data_scope.role_id), data_scope_sql) + edit_role = AddRoleModel( + roleId=role_data_scope.role_id, + dataScope=role_data_scope.data_scope, + deptIds=role_data_scope.dept_ids, + deptCheckStrictly=role_data_scope.dept_check_strictly, + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + ) + role_data_scope_result = await RoleService.role_datascope_services(query_db, edit_role) + logger.info(role_data_scope_result.message) + + return ResponseUtil.success(msg=role_data_scope_result.message) + + +@roleController.delete('/{role_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:role:remove'))]) +@Log(title='角色管理', business_type=BusinessType.DELETE) +async def delete_system_role( + request: Request, + role_ids: str, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + role_id_list = role_ids.split(',') if role_ids else [] + if role_id_list: + for role_id in role_id_list: + await RoleService.check_role_allowed_services(RoleModel(roleId=int(role_id))) + if not current_user.user.admin: + await RoleService.check_role_data_scope_services(query_db, role_id, data_scope_sql) + delete_role = DeleteRoleModel(roleIds=role_ids, updateBy=current_user.user.user_name, updateTime=datetime.now()) + delete_role_result = await RoleService.delete_role_services(query_db, delete_role) + logger.info(delete_role_result.message) + + return ResponseUtil.success(msg=delete_role_result.message) + + +@roleController.get( + '/{role_id}', response_model=RoleModel, dependencies=[Depends(CheckUserInterfaceAuth('system:role:query'))] +) +async def query_detail_system_role( + request: Request, + role_id: int, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + if not current_user.user.admin: + await RoleService.check_role_data_scope_services(query_db, str(role_id), data_scope_sql) + role_detail_result = await RoleService.role_detail_services(query_db, role_id) + logger.info(f'获取role_id为{role_id}的信息成功') + + return ResponseUtil.success(data=role_detail_result.model_dump(by_alias=True)) + + +@roleController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('system:role:export'))]) +@Log(title='角色管理', business_type=BusinessType.EXPORT) +async def export_system_role_list( + request: Request, + role_page_query: RolePageQueryModel = Depends(RolePageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + # 获取全量数据 + role_query_result = await RoleService.get_role_list_services( + query_db, role_page_query, data_scope_sql, is_page=False + ) + role_export_result = await RoleService.export_role_list_services(role_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(role_export_result)) + + +@roleController.put('/changeStatus', dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) +@Log(title='角色管理', business_type=BusinessType.UPDATE) +async def reset_system_role_status( + request: Request, + change_role: AddRoleModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + await RoleService.check_role_allowed_services(change_role) + if not current_user.user.admin: + await RoleService.check_role_data_scope_services(query_db, str(change_role.role_id), data_scope_sql) + edit_role = AddRoleModel( + roleId=change_role.role_id, + status=change_role.status, + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + type='status', + ) + edit_role_result = await RoleService.edit_role_services(query_db, edit_role) + logger.info(edit_role_result.message) + + return ResponseUtil.success(msg=edit_role_result.message) + + +@roleController.get( + '/authUser/allocatedList', + response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('system:role:list'))], +) +async def get_system_allocated_user_list( + request: Request, + user_role: UserRolePageQueryModel = Depends(UserRolePageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + role_user_allocated_page_query_result = await RoleService.get_role_user_allocated_list_services( + query_db, user_role, data_scope_sql, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=role_user_allocated_page_query_result) + + +@roleController.get( + '/authUser/unallocatedList', + response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('system:role:list'))], +) +async def get_system_unallocated_user_list( + request: Request, + user_role: UserRolePageQueryModel = Depends(UserRolePageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + role_user_unallocated_page_query_result = await RoleService.get_role_user_unallocated_list_services( + query_db, user_role, data_scope_sql, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=role_user_unallocated_page_query_result) + + +@roleController.put('/authUser/selectAll', dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) +@Log(title='角色管理', business_type=BusinessType.GRANT) +async def add_system_role_user( + request: Request, + add_role_user: CrudUserRoleModel = Depends(CrudUserRoleModel.as_query), + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + if not current_user.user.admin: + await RoleService.check_role_data_scope_services(query_db, str(add_role_user.role_id), data_scope_sql) + add_role_user_result = await UserService.add_user_role_services(query_db, add_role_user) + logger.info(add_role_user_result.message) + + return ResponseUtil.success(msg=add_role_user_result.message) + + +@roleController.put('/authUser/cancel', dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) +@Log(title='角色管理', business_type=BusinessType.GRANT) +async def cancel_system_role_user( + request: Request, cancel_user_role: CrudUserRoleModel, query_db: AsyncSession = Depends(get_db) +): + cancel_user_role_result = await UserService.delete_user_role_services(query_db, cancel_user_role) + logger.info(cancel_user_role_result.message) + + return ResponseUtil.success(msg=cancel_user_role_result.message) + + +@roleController.put('/authUser/cancelAll', dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))]) +@Log(title='角色管理', business_type=BusinessType.GRANT) +async def batch_cancel_system_role_user( + request: Request, + batch_cancel_user_role: CrudUserRoleModel = Depends(CrudUserRoleModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + batch_cancel_user_role_result = await UserService.delete_user_role_services(query_db, batch_cancel_user_role) + logger.info(batch_cancel_user_role_result.message) + + return ResponseUtil.success(msg=batch_cancel_user_role_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/server_controller.py b/dash-fastapi-backend/module_admin/controller/server_controller.py index 0119f9f..f63fdf8 100644 --- a/dash-fastapi-backend/module_admin/controller/server_controller.py +++ b/dash-fastapi-backend/module_admin/controller/server_controller.py @@ -1,22 +1,21 @@ -from fastapi import APIRouter, Request -from fastapi import Depends -from module_admin.service.login_service import get_current_user -from module_admin.service.server_service import * -from utils.response_util import * -from utils.log_util import * +from fastapi import APIRouter, Depends, Request from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.entity.vo.server_vo import ServerMonitorModel +from module_admin.service.login_service import LoginService +from module_admin.service.server_service import ServerService +from utils.response_util import ResponseUtil +from utils.log_util import logger -serverController = APIRouter(prefix='/server', dependencies=[Depends(get_current_user)]) +serverController = APIRouter(prefix='/monitor/server', dependencies=[Depends(LoginService.get_current_user)]) -@serverController.post("/statisticalInfo", response_model=ServerMonitorModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:server:list'))]) +@serverController.get( + '', response_model=ServerMonitorModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:server:list'))] +) async def get_monitor_server_info(request: Request): - try: - # 获取全量数据 - server_info_query_result = ServerService.get_server_monitor_info() - logger.info('获取成功') - return response_200(data=server_info_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + # 获取全量数据 + server_info_query_result = await ServerService.get_server_monitor_info() + logger.info('获取成功') + + return ResponseUtil.success(data=server_info_query_result) diff --git a/dash-fastapi-backend/module_admin/controller/user_controller.py b/dash-fastapi-backend/module_admin/controller/user_controller.py index c14d4d2..253535c 100644 --- a/dash-fastapi-backend/module_admin/controller/user_controller.py +++ b/dash-fastapi-backend/module_admin/controller/user_controller.py @@ -1,275 +1,399 @@ -from fastapi import APIRouter, Request -from fastapi import Depends -import base64 +import os +from datetime import datetime +from fastapi import APIRouter, Depends, File, Query, Request, UploadFile +from sqlalchemy.ext.asyncio import AsyncSession +from typing import Optional, Union +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db -from module_admin.service.login_service import get_current_user -from module_admin.service.user_service import * -from module_admin.entity.vo.user_vo import * -from module_admin.dao.user_dao import * -from utils.page_util import get_page_obj -from utils.response_util import * -from utils.log_util import * -from utils.common_util import bytes2file_response -from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from config.env import UploadConfig +from module_admin.annotation.log_annotation import Log from module_admin.aspect.data_scope import GetDataScope -from module_admin.annotation.log_annotation import log_decorator - - -userController = APIRouter(dependencies=[Depends(get_current_user)]) - - -@userController.post("/user/get", response_model=UserPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:user:list'))]) -async def get_system_user_list(request: Request, user_page_query: UserPageObject, query_db: Session = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysUser'))): - try: - user_query = UserQueryModel(**user_page_query.dict()) - # 获取全量数据 - user_query_result = UserService.get_user_list_services(query_db, user_query, data_scope_sql) - # 分页操作 - user_page_query_result = get_page_obj(user_query_result, user_page_query.page_num, user_page_query.page_size) - logger.info('获取成功') - return response_200(data=user_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/add", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:user:add'))]) -@log_decorator(title='用户管理', business_type=1) -async def add_system_user(request: Request, add_user: AddUserModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - add_user.password = PwdUtil.get_password_hash(add_user.password) - add_user.create_by = current_user.user.user_name - add_user.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_user.update_by = current_user.user.user_name - add_user.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - add_user_result = UserService.add_user_services(query_db, add_user) - if add_user_result.is_success: - logger.info(add_user_result.message) - return response_200(data=add_user_result, message=add_user_result.message) - else: - logger.warning(add_user_result.message) - return response_400(data="", message=add_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.patch("/user/edit", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:user:edit'))]) -@log_decorator(title='用户管理', business_type=2) -async def edit_system_user(request: Request, edit_user: AddUserModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_user.update_by = current_user.user.user_name - edit_user.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_user_result = UserService.edit_user_services(query_db, edit_user) - if edit_user_result.is_success: - logger.info(edit_user_result.message) - return response_200(data=edit_user_result, message=edit_user_result.message) - else: - logger.warning(edit_user_result.message) - return response_400(data="", message=edit_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/delete", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:user:remove'))]) -@log_decorator(title='用户管理', business_type=3) -async def delete_system_user(request: Request, delete_user: DeleteUserModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - delete_user.update_by = current_user.user.user_name - delete_user.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - delete_user_result = UserService.delete_user_services(query_db, delete_user) - if delete_user_result.is_success: - logger.info(delete_user_result.message) - return response_200(data=delete_user_result, message=delete_user_result.message) - else: - logger.warning(delete_user_result.message) - return response_400(data="", message=delete_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.get("/user/{user_id}", response_model=UserDetailModel, dependencies=[Depends(CheckUserInterfaceAuth('system:user:query'))]) -async def query_detail_system_user(request: Request, user_id: int, query_db: Session = Depends(get_db)): - try: - delete_user_result = UserService.detail_user_services(query_db, user_id) - logger.info(f'获取user_id为{user_id}的信息成功') - return response_200(data=delete_user_result, message='获取成功') - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.patch("/user/profile/changeAvatar", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -@log_decorator(title='个人信息', business_type=2) -async def change_system_user_profile_avatar(request: Request, edit_user: AddUserModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - avatar = edit_user.avatar - # 去除 base64 字符串中的头部信息(data:image/jpeg;base64, 等等) - base64_string = avatar.split(',', 1)[1] - # 解码 base64 字符串 - file_data = base64.b64decode(base64_string) - dir_path = os.path.join(CachePathConfig.PATH, 'avatar', current_user.user.user_name) +from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.entity.vo.dept_vo import DeptModel +from module_admin.entity.vo.user_vo import ( + AddUserModel, + CrudUserRoleModel, + CurrentUserModel, + DeleteUserModel, + EditUserModel, + ResetPasswordModel, + ResetUserModel, + UserDetailModel, + UserInfoModel, + UserModel, + UserPageQueryModel, + UserProfileModel, + UserRoleQueryModel, + UserRoleResponseModel, +) +from module_admin.service.login_service import LoginService +from module_admin.service.user_service import UserService +from module_admin.service.role_service import RoleService +from module_admin.service.dept_service import DeptService +from config.enums import BusinessType +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.pwd_util import PwdUtil +from utils.response_util import ResponseUtil +from utils.upload_util import UploadUtil + + +userController = APIRouter(prefix='/system/user', dependencies=[Depends(LoginService.get_current_user)]) + + +@userController.get('/deptTree', dependencies=[Depends(CheckUserInterfaceAuth('system:user:list'))]) +async def get_system_dept_tree( + request: Request, query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept')) +): + dept_query_result = await DeptService.get_dept_tree_services(query_db, DeptModel(**{}), data_scope_sql) + logger.info('获取成功') + + return ResponseUtil.success(data=dept_query_result) + + +@userController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:user:list'))] +) +async def get_system_user_list( + request: Request, + user_page_query: UserPageQueryModel = Depends(UserPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + # 获取分页数据 + user_page_query_result = await UserService.get_user_list_services( + query_db, user_page_query, data_scope_sql, is_page=True + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=user_page_query_result) + + +@userController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:user:add'))]) +@ValidateFields(validate_model='add_user') +@Log(title='用户管理', business_type=BusinessType.INSERT) +async def add_system_user( + request: Request, + add_user: AddUserModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + dept_data_scope_sql: str = Depends(GetDataScope('SysDept')), + role_data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + if not current_user.user.admin: + await DeptService.check_dept_data_scope_services(query_db, add_user.dept_id, dept_data_scope_sql) + await RoleService.check_role_data_scope_services( + query_db, ','.join([str(item) for item in add_user.role_ids]), role_data_scope_sql + ) + add_user.password = PwdUtil.get_password_hash(add_user.password) + add_user.create_by = current_user.user.user_name + add_user.create_time = datetime.now() + add_user.update_by = current_user.user.user_name + add_user.update_time = datetime.now() + add_user_result = await UserService.add_user_services(query_db, add_user) + logger.info(add_user_result.message) + + return ResponseUtil.success(msg=add_user_result.message) + + +@userController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:user:edit'))]) +@ValidateFields(validate_model='edit_user') +@Log(title='用户管理', business_type=BusinessType.UPDATE) +async def edit_system_user( + request: Request, + edit_user: EditUserModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + user_data_scope_sql: str = Depends(GetDataScope('SysUser')), + dept_data_scope_sql: str = Depends(GetDataScope('SysDept')), + role_data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + await UserService.check_user_allowed_services(edit_user) + if not current_user.user.admin: + await UserService.check_user_data_scope_services(query_db, edit_user.user_id, user_data_scope_sql) + await DeptService.check_dept_data_scope_services(query_db, edit_user.dept_id, dept_data_scope_sql) + await RoleService.check_role_data_scope_services( + query_db, ','.join([str(item) for item in edit_user.role_ids]), role_data_scope_sql + ) + edit_user.update_by = current_user.user.user_name + edit_user.update_time = datetime.now() + edit_user_result = await UserService.edit_user_services(query_db, edit_user) + logger.info(edit_user_result.message) + + return ResponseUtil.success(msg=edit_user_result.message) + + +@userController.delete('/{user_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:user:remove'))]) +@Log(title='用户管理', business_type=BusinessType.DELETE) +async def delete_system_user( + request: Request, + user_ids: str, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + user_id_list = user_ids.split(',') if user_ids else [] + if user_id_list: + if current_user.user.user_id in user_id_list: + logger.warning('当前登录用户不能删除') + + return ResponseUtil.failure(msg='当前登录用户不能删除') + for user_id in user_id_list: + await UserService.check_user_allowed_services(UserModel(userId=int(user_id))) + if not current_user.user.admin: + await UserService.check_user_data_scope_services(query_db, int(user_id), data_scope_sql) + delete_user = DeleteUserModel(userIds=user_ids, updateBy=current_user.user.user_name, updateTime=datetime.now()) + delete_user_result = await UserService.delete_user_services(query_db, delete_user) + logger.info(delete_user_result.message) + + return ResponseUtil.success(msg=delete_user_result.message) + + +@userController.put('/resetPwd', dependencies=[Depends(CheckUserInterfaceAuth('system:user:resetPwd'))]) +@Log(title='用户管理', business_type=BusinessType.UPDATE) +async def reset_system_user_pwd( + request: Request, + reset_user: EditUserModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + await UserService.check_user_allowed_services(reset_user) + if not current_user.user.admin: + await UserService.check_user_data_scope_services(query_db, reset_user.user_id, data_scope_sql) + edit_user = EditUserModel( + userId=reset_user.user_id, + password=PwdUtil.get_password_hash(reset_user.password), + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + type='pwd', + ) + edit_user_result = await UserService.edit_user_services(query_db, edit_user) + logger.info(edit_user_result.message) + + return ResponseUtil.success(msg=edit_user_result.message) + + +@userController.put('/changeStatus', dependencies=[Depends(CheckUserInterfaceAuth('system:user:edit'))]) +@Log(title='用户管理', business_type=BusinessType.UPDATE) +async def change_system_user_status( + request: Request, + change_user: EditUserModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + await UserService.check_user_allowed_services(change_user) + if not current_user.user.admin: + await UserService.check_user_data_scope_services(query_db, change_user.user_id, data_scope_sql) + edit_user = EditUserModel( + userId=change_user.user_id, + status=change_user.status, + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + type='status', + ) + edit_user_result = await UserService.edit_user_services(query_db, edit_user) + logger.info(edit_user_result.message) + + return ResponseUtil.success(msg=edit_user_result.message) + + +@userController.get('/profile', response_model=UserProfileModel) +async def query_detail_system_user_profile( + request: Request, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + profile_user_result = await UserService.user_profile_services(query_db, current_user.user.user_id) + logger.info(f'获取user_id为{current_user.user.user_id}的信息成功') + + return ResponseUtil.success(model_content=profile_user_result) + + +@userController.get( + '/{user_id}', response_model=UserDetailModel, dependencies=[Depends(CheckUserInterfaceAuth('system:user:query'))] +) +@userController.get( + '/', response_model=UserDetailModel, dependencies=[Depends(CheckUserInterfaceAuth('system:user:query'))] +) +async def query_detail_system_user( + request: Request, + user_id: Optional[Union[int, str]] = '', + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + if user_id and not current_user.user.admin: + await UserService.check_user_data_scope_services(query_db, user_id, data_scope_sql) + detail_user_result = await UserService.user_detail_services(query_db, user_id) + logger.info(f'获取user_id为{user_id}的信息成功') + + return ResponseUtil.success(model_content=detail_user_result) + + +@userController.post('/profile/avatar') +@Log(title='个人信息', business_type=BusinessType.UPDATE) +async def change_system_user_profile_avatar( + request: Request, + avatarfile: bytes = File(), + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + if avatarfile: + relative_path = ( + f'avatar/{datetime.now().strftime("%Y")}/{datetime.now().strftime("%m")}/{datetime.now().strftime("%d")}' + ) + dir_path = os.path.join(UploadConfig.UPLOAD_PATH, relative_path) try: os.makedirs(dir_path) except FileExistsError: pass - filepath = os.path.join(dir_path, f'{current_user.user.user_name}_avatar.jpeg') - with open(filepath, 'wb') as f: - f.write(file_data) - edit_user.user_id = current_user.user.user_id - edit_user.avatar = f'/common/{CachePathConfig.PATHSTR}?taskPath=avatar&taskId={current_user.user.user_name}&filename={current_user.user.user_name}_avatar.jpeg' - edit_user.update_by = current_user.user.user_name - edit_user.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_user_result = UserService.edit_user_services(query_db, edit_user) - if edit_user_result.is_success: - logger.info(edit_user_result.message) - return response_200(data=edit_user_result, message=edit_user_result.message) - else: - logger.warning(edit_user_result.message) - return response_400(data="", message=edit_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.patch("/user/profile/changeInfo", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -@log_decorator(title='个人信息', business_type=2) -async def change_system_user_profile_info(request: Request, edit_user: AddUserModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - edit_user.user_id = current_user.user.user_id - edit_user.update_by = current_user.user.user_name - edit_user.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - edit_user_result = UserService.edit_user_services(query_db, edit_user) - if edit_user_result.is_success: - logger.info(edit_user_result.message) - return response_200(data=edit_user_result, message=edit_user_result.message) - else: - logger.warning(edit_user_result.message) - return response_400(data="", message=edit_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.patch("/user/profile/resetPwd", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -@log_decorator(title='个人信息', business_type=2) -async def reset_system_user_password(request: Request, reset_user: ResetUserModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - if not reset_user.user_id and reset_user.old_password: - reset_user.user_id = current_user.user.user_id - reset_user.password = PwdUtil.get_password_hash(reset_user.password) - reset_user.update_by = current_user.user.user_name - reset_user.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - reset_user_result = UserService.reset_user_services(query_db, reset_user) - if reset_user_result.is_success: - logger.info(reset_user_result.message) - return response_200(data=reset_user_result, message=reset_user_result.message) - else: - logger.warning(reset_user_result.message) - return response_400(data="", message=reset_user_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/importData", dependencies=[Depends(CheckUserInterfaceAuth('system:user:import'))]) -@log_decorator(title='用户管理', business_type=6) -async def batch_import_system_user(request: Request, user_import: ImportUserModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)): - try: - batch_import_result = UserService.batch_import_user_services(query_db, user_import, current_user) - if batch_import_result.is_success: - logger.info(batch_import_result.message) - return response_200(data=batch_import_result, message=batch_import_result.message) - else: - logger.warning(batch_import_result.message) - return response_400(data="", message=batch_import_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/importTemplate", dependencies=[Depends(CheckUserInterfaceAuth('system:user:import'))]) -async def export_system_user_template(request: Request, query_db: Session = Depends(get_db)): - try: - user_import_template_result = UserService.get_user_import_template_services() - logger.info('获取成功') - return streaming_response_200(data=bytes2file_response(user_import_template_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/export", dependencies=[Depends(CheckUserInterfaceAuth('system:user:export'))]) -@log_decorator(title='用户管理', business_type=5) -async def export_system_user_list(request: Request, user_query: UserQueryModel, query_db: Session = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysUser'))): - try: - # 获取全量数据 - user_query_result = UserService.get_user_list_services(query_db, user_query, data_scope_sql) - user_export_result = UserService.export_user_list_services(user_query_result) - logger.info('导出成功') - return streaming_response_200(data=bytes2file_response(user_export_result)) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/authRole/allocatedList", response_model=UserRolePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_allocated_role_list(request: Request, user_role: UserRolePageObject, query_db: Session = Depends(get_db)): - try: - user_role_query = UserRoleQueryModel(**user_role.dict()) - user_role_allocated_query_result = UserService.get_user_role_allocated_list_services(query_db, user_role_query) - # 分页操作 - user_role_allocated_page_query_result = get_page_obj(user_role_allocated_query_result, user_role.page_num, user_role.page_size) - logger.info('获取成功') - return response_200(data=user_role_allocated_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/authRole/unallocatedList", response_model=UserRolePageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('common'))]) -async def get_system_unallocated_role_list(request: Request, user_role: UserRolePageObject, query_db: Session = Depends(get_db)): - try: - user_role_query = UserRoleQueryModel(**user_role.dict()) - user_role_unallocated_query_result = UserService.get_user_role_unallocated_list_services(query_db, user_role_query) - # 分页操作 - user_role_unallocated_page_query_result = get_page_obj(user_role_unallocated_query_result, user_role.page_num, user_role.page_size) - logger.info('获取成功') - return response_200(data=user_role_unallocated_page_query_result, message="获取成功") - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/authRole/selectAll", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:user:edit'))]) -@log_decorator(title='用户管理', business_type=4) -async def add_system_role_user(request: Request, add_user_role: CrudUserRoleModel, query_db: Session = Depends(get_db)): - try: - add_user_role_result = UserService.add_user_role_services(query_db, add_user_role) - if add_user_role_result.is_success: - logger.info(add_user_role_result.message) - return response_200(data=add_user_role_result, message=add_user_role_result.message) - else: - logger.warning(add_user_role_result.message) - return response_400(data="", message=add_user_role_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) - - -@userController.post("/user/authRole/cancel", response_model=CrudUserResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:user:edit'))]) -@log_decorator(title='用户管理', business_type=4) -async def cancel_system_role_user(request: Request, cancel_user_role: CrudUserRoleModel, query_db: Session = Depends(get_db)): - try: - cancel_user_role_result = UserService.delete_user_role_services(query_db, cancel_user_role) - if cancel_user_role_result.is_success: - logger.info(cancel_user_role_result.message) - return response_200(data=cancel_user_role_result, message=cancel_user_role_result.message) - else: - logger.warning(cancel_user_role_result.message) - return response_400(data="", message=cancel_user_role_result.message) - except Exception as e: - logger.exception(e) - return response_500(data="", message=str(e)) + avatar_name = f'avatar_{datetime.now().strftime("%Y%m%d%H%M%S")}{UploadConfig.UPLOAD_MACHINE}{UploadUtil.generate_random_number()}.png' + avatar_path = os.path.join(dir_path, avatar_name) + with open(avatar_path, 'wb') as f: + f.write(avatarfile) + edit_user = EditUserModel( + userId=current_user.user.user_id, + avatar=f'{UploadConfig.UPLOAD_PREFIX}/{relative_path}/{avatar_name}', + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + type='avatar', + ) + edit_user_result = await UserService.edit_user_services(query_db, edit_user) + logger.info(edit_user_result.message) + + return ResponseUtil.success(dict_content={'imgUrl': edit_user.avatar}, msg=edit_user_result.message) + return ResponseUtil.failure(msg='上传图片异常,请联系管理员') + + +@userController.put('/profile') +@Log(title='个人信息', business_type=BusinessType.UPDATE) +async def change_system_user_profile_info( + request: Request, + user_info: UserInfoModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_user = EditUserModel( + **user_info.model_dump(exclude_unset=True, by_alias=True, exclude={'role_ids', 'post_ids'}), + userId=current_user.user.user_id, + userName=current_user.user.user_name, + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + roleIds=current_user.user.role_ids.split(',') if current_user.user.role_ids else [], + postIds=current_user.user.post_ids.split(',') if current_user.user.post_ids else [], + role=current_user.user.role, + ) + edit_user_result = await UserService.edit_user_services(query_db, edit_user) + logger.info(edit_user_result.message) + + return ResponseUtil.success(msg=edit_user_result.message) + + +@userController.put('/profile/updatePwd') +@Log(title='个人信息', business_type=BusinessType.UPDATE) +async def reset_system_user_password( + request: Request, + reset_password: ResetPasswordModel = Depends(ResetPasswordModel.as_query), + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + reset_user = ResetUserModel( + userId=current_user.user.user_id, + oldPassword=reset_password.old_password, + password=reset_password.new_password, + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + ) + reset_user_result = await UserService.reset_user_services(query_db, reset_user) + logger.info(reset_user_result.message) + + return ResponseUtil.success(msg=reset_user_result.message) + + +@userController.post('/importData', dependencies=[Depends(CheckUserInterfaceAuth('system:user:import'))]) +@Log(title='用户管理', business_type=BusinessType.IMPORT) +async def batch_import_system_user( + request: Request, + file: UploadFile = File(...), + update_support: bool = Query(alias='updateSupport'), + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + user_data_scope_sql: str = Depends(GetDataScope('SysUser')), + dept_data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + batch_import_result = await UserService.batch_import_user_services( + request, query_db, file, update_support, current_user, user_data_scope_sql, dept_data_scope_sql + ) + logger.info(batch_import_result.message) + + return ResponseUtil.success(msg=batch_import_result.message) + + +@userController.post('/importTemplate', dependencies=[Depends(CheckUserInterfaceAuth('system:user:import'))]) +async def export_system_user_template(request: Request, query_db: AsyncSession = Depends(get_db)): + user_import_template_result = await UserService.get_user_import_template_services() + logger.info('获取成功') + + return ResponseUtil.streaming(data=bytes2file_response(user_import_template_result)) + + +@userController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('system:user:export'))]) +@Log(title='用户管理', business_type=BusinessType.EXPORT) +async def export_system_user_list( + request: Request, + user_page_query: UserPageQueryModel = Depends(UserPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), + data_scope_sql: str = Depends(GetDataScope('SysUser')), +): + # 获取全量数据 + user_query_result = await UserService.get_user_list_services( + query_db, user_page_query, data_scope_sql, is_page=False + ) + user_export_result = await UserService.export_user_list_services(user_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(user_export_result)) + + +@userController.get( + '/authRole/{user_id}', + response_model=UserRoleResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('system:user:query'))], +) +async def get_system_allocated_role_list(request: Request, user_id: int, query_db: AsyncSession = Depends(get_db)): + user_role_query = UserRoleQueryModel(userId=user_id) + user_role_allocated_query_result = await UserService.get_user_role_allocated_list_services( + query_db, user_role_query + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=user_role_allocated_query_result) + + +@userController.put( + '/authRole', + response_model=UserRoleResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('system:user:edit'))], +) +@Log(title='用户管理', business_type=BusinessType.GRANT) +async def update_system_role_user( + request: Request, + user_id: int = Query(alias='userId'), + role_ids: str = Query(alias='roleIds'), + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + user_data_scope_sql: str = Depends(GetDataScope('SysUser')), + role_data_scope_sql: str = Depends(GetDataScope('SysDept')), +): + if not current_user.user.admin: + await UserService.check_user_data_scope_services(query_db, user_id, user_data_scope_sql) + await RoleService.check_role_data_scope_services(query_db, role_ids, role_data_scope_sql) + add_user_role_result = await UserService.add_user_role_services( + query_db, CrudUserRoleModel(userId=user_id, roleIds=role_ids) + ) + logger.info(add_user_role_result.message) + + return ResponseUtil.success(msg=add_user_role_result.message) diff --git a/dash-fastapi-backend/module_admin/dao/config_dao.py b/dash-fastapi-backend/module_admin/dao/config_dao.py index a7fb473..7b3c067 100644 --- a/dash-fastapi-backend/module_admin/dao/config_dao.py +++ b/dash-fastapi-backend/module_admin/dao/config_dao.py @@ -1,8 +1,9 @@ -from sqlalchemy.orm import Session -from module_admin.entity.do.config_do import SysConfig -from module_admin.entity.vo.config_vo import ConfigModel, ConfigQueryModel -from utils.time_format_util import list_format_datetime from datetime import datetime, time +from sqlalchemy import delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession +from module_admin.entity.do.config_do import SysConfig +from module_admin.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel +from utils.page_util import PageUtil class ConfigDao: @@ -11,100 +12,104 @@ class ConfigDao: """ @classmethod - def get_config_detail_by_id(cls, db: Session, config_id: int): + async def get_config_detail_by_id(cls, db: AsyncSession, config_id: int): """ 根据参数配置id获取参数配置详细信息 + :param db: orm对象 :param config_id: 参数配置id :return: 参数配置信息对象 """ - config_info = db.query(SysConfig) \ - .filter(SysConfig.config_id == config_id) \ - .first() + config_info = (await db.execute(select(SysConfig).where(SysConfig.config_id == config_id))).scalars().first() return config_info @classmethod - def get_config_detail_by_info(cls, db: Session, config: ConfigModel): + async def get_config_detail_by_info(cls, db: AsyncSession, config: ConfigModel): """ 根据参数配置参数获取参数配置信息 + :param db: orm对象 :param config: 参数配置参数对象 :return: 参数配置信息对象 """ - config_info = db.query(SysConfig) \ - .filter(SysConfig.config_key == config.config_key if config.config_key else True, - SysConfig.config_value == config.config_value if config.config_value else True) \ + config_info = ( + ( + await db.execute( + select(SysConfig).where( + SysConfig.config_key == config.config_key if config.config_key else True, + SysConfig.config_value == config.config_value if config.config_value else True, + ) + ) + ) + .scalars() .first() + ) return config_info @classmethod - def get_all_config(cls, db: Session): - """ - 获取所有的参数配置信息 - :param db: orm对象 - :return: 参数配置信息列表对象 - """ - config_info = db.query(SysConfig).all() - - return list_format_datetime(config_info) - - @classmethod - def get_config_list(cls, db: Session, query_object: ConfigQueryModel): + async def get_config_list(cls, db: AsyncSession, query_object: ConfigPageQueryModel, is_page: bool = False): """ 根据查询参数获取参数配置列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 参数配置列表信息对象 """ - config_list = db.query(SysConfig) \ - .filter(SysConfig.config_name.like(f'%{query_object.config_name}%') if query_object.config_name else True, - SysConfig.config_key.like(f'%{query_object.config_key}%') if query_object.config_key else True, - SysConfig.config_type == query_object.config_type if query_object.config_type else True, - SysConfig.create_time.between( - datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.create_time_start and query_object.create_time_end else True - ) \ - .distinct().all() - - return list_format_datetime(config_list) + query = ( + select(SysConfig) + .where( + SysConfig.config_name.like(f'%{query_object.config_name}%') if query_object.config_name else True, + SysConfig.config_key.like(f'%{query_object.config_key}%') if query_object.config_key else True, + SysConfig.config_type == query_object.config_type if query_object.config_type else True, + SysConfig.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() + ) + config_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + return config_list @classmethod - def add_config_dao(cls, db: Session, config: ConfigModel): + async def add_config_dao(cls, db: AsyncSession, config: ConfigModel): """ 新增参数配置数据库操作 + :param db: orm对象 :param config: 参数配置对象 :return: """ - db_config = SysConfig(**config.dict()) + db_config = SysConfig(**config.model_dump()) db.add(db_config) - db.flush() + await db.flush() return db_config @classmethod - def edit_config_dao(cls, db: Session, config: dict): + async def edit_config_dao(cls, db: AsyncSession, config: dict): """ 编辑参数配置数据库操作 + :param db: orm对象 :param config: 需要更新的参数配置字典 :return: """ - db.query(SysConfig) \ - .filter(SysConfig.config_id == config.get('config_id')) \ - .update(config) + await db.execute(update(SysConfig), [config]) @classmethod - def delete_config_dao(cls, db: Session, config: ConfigModel): + async def delete_config_dao(cls, db: AsyncSession, config: ConfigModel): """ 删除参数配置数据库操作 + :param db: orm对象 :param config: 参数配置对象 :return: """ - db.query(SysConfig) \ - .filter(SysConfig.config_id == config.config_id) \ - .delete() + await db.execute(delete(SysConfig).where(SysConfig.config_id.in_([config.config_id]))) diff --git a/dash-fastapi-backend/module_admin/dao/dept_dao.py b/dash-fastapi-backend/module_admin/dao/dept_dao.py index 32d85ab..f450210 100644 --- a/dash-fastapi-backend/module_admin/dao/dept_dao.py +++ b/dash-fastapi-backend/module_admin/dao/dept_dao.py @@ -1,9 +1,11 @@ -from sqlalchemy import or_, func -from sqlalchemy.orm import Session -from module_admin.entity.do.role_do import SysRoleDept +from sqlalchemy import bindparam, func, or_, select, update # noqa: F401 +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.util import immutabledict +from typing import List from module_admin.entity.do.dept_do import SysDept -from module_admin.entity.vo.dept_vo import DeptModel, DeptResponse, CrudDeptResponse -from utils.time_format_util import list_format_datetime +from module_admin.entity.do.role_do import SysRoleDept # noqa: F401 +from module_admin.entity.do.user_do import SysUser +from module_admin.entity.vo.dept_vo import DeptModel class DeptDao: @@ -12,189 +14,294 @@ class DeptDao: """ @classmethod - def get_dept_by_id(cls, db: Session, dept_id: int): + async def get_dept_by_id(cls, db: AsyncSession, dept_id: int): """ 根据部门id获取在用部门信息 - :param db: orm对象 - :param dept_id: 部门id - :return: 在用部门信息对象 - """ - dept_info = db.query(SysDept) \ - .filter(SysDept.dept_id == dept_id, - SysDept.status == 0, - SysDept.del_flag == 0) \ - .first() - return dept_info - - @classmethod - def get_dept_by_id_for_list(cls, db: Session, dept_id: int): - """ - 用于获取部门列表的工具方法 :param db: orm对象 :param dept_id: 部门id - :return: 部门id对应的信息对象 + :return: 在用部门信息对象 """ - dept_info = db.query(SysDept) \ - .filter(SysDept.dept_id == dept_id, - SysDept.del_flag == 0) \ - .first() + dept_info = (await db.execute(select(SysDept).where(SysDept.dept_id == dept_id))).scalars().first() return dept_info @classmethod - def get_dept_detail_by_id(cls, db: Session, dept_id: int): + async def get_dept_detail_by_id(cls, db: AsyncSession, dept_id: int): """ 根据部门id获取部门详细信息 + :param db: orm对象 :param dept_id: 部门id :return: 部门信息对象 """ - dept_info = db.query(SysDept) \ - .filter(SysDept.dept_id == dept_id, - SysDept.del_flag == 0) \ + dept_info = ( + (await db.execute(select(SysDept).where(SysDept.dept_id == dept_id, SysDept.del_flag == '0'))) + .scalars() .first() + ) return dept_info @classmethod - def get_dept_detail_by_info(cls, db: Session, dept: DeptModel): + async def get_dept_detail_by_info(cls, db: AsyncSession, dept: DeptModel): """ 根据部门参数获取部门信息 + :param db: orm对象 :param dept: 部门参数对象 :return: 部门信息对象 """ - dept_info = db.query(SysDept) \ - .filter(SysDept.parent_id == dept.parent_id if dept.parent_id else True, - SysDept.dept_name == dept.dept_name if dept.dept_name else True) \ + dept_info = ( + ( + await db.execute( + select(SysDept).where( + SysDept.parent_id == dept.parent_id if dept.parent_id else True, + SysDept.dept_name == dept.dept_name if dept.dept_name else True, + ) + ) + ) + .scalars() .first() + ) return dept_info @classmethod - def get_dept_info_for_edit_option(cls, db: Session, dept_info: DeptModel, data_scope_sql: str): + async def get_dept_info_for_edit_option(cls, db: AsyncSession, dept_info: DeptModel, data_scope_sql: str): """ 获取部门编辑对应的在用部门列表信息 + :param db: orm对象 :param dept_info: 部门对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 部门列表信息 """ - dept_result = db.query(SysDept) \ - .filter(SysDept.dept_id != dept_info.dept_id, - SysDept.parent_id != dept_info.dept_id, - SysDept.del_flag == 0, SysDept.status == 0, - eval(data_scope_sql)) \ - .order_by(SysDept.order_num) \ - .distinct().all() + dept_result = ( + ( + await db.execute( + select(SysDept) + .where( + SysDept.dept_id != dept_info.dept_id, + ~SysDept.dept_id.in_( + select(SysDept.dept_id).where(func.find_in_set(dept_info.dept_id, SysDept.ancestors)) + ), + SysDept.del_flag == '0', + SysDept.status == '0', + eval(data_scope_sql), + ) + .order_by(SysDept.order_num) + .distinct() + ) + ) + .scalars() + .all() + ) - return list_format_datetime(dept_result) + return dept_result @classmethod - def get_children_dept(cls, db: Session, dept_id: int): + async def get_children_dept_dao(cls, db: AsyncSession, dept_id: int): """ 根据部门id查询当前部门的子部门列表信息 + :param db: orm对象 :param dept_id: 部门id :return: 子部门信息列表 """ - dept_result = db.query(SysDept) \ - .filter(SysDept.parent_id == dept_id, - SysDept.del_flag == 0) \ - .all() - - return list_format_datetime(dept_result) - - @classmethod - def get_dept_all_ancestors(cls, db: Session): - """ - 获取所有部门的ancestors信息 - :param db: orm对象 - :return: ancestors信息列表 - """ - ancestors = db.query(SysDept.ancestors)\ - .filter(SysDept.del_flag == 0)\ - .all() + dept_result = ( + (await db.execute(select(SysDept).where(func.find_in_set(dept_id, SysDept.ancestors)))).scalars().all() + ) - return ancestors + return dept_result @classmethod - def get_dept_list_for_tree(cls, db: Session, dept_info: DeptModel, data_scope_sql: str): + async def get_dept_list_for_tree(cls, db: AsyncSession, dept_info: DeptModel, data_scope_sql: str): """ 获取所有在用部门列表信息 + :param db: orm对象 :param dept_info: 部门对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 在用部门列表信息 """ - dept_result = db.query(SysDept) \ - .filter(SysDept.status == 0, - SysDept.del_flag == 0, - SysDept.dept_name.like(f'%{dept_info.dept_name}%') if dept_info.dept_name else True, - eval(data_scope_sql)) \ - .order_by(SysDept.order_num) \ - .distinct().all() + dept_result = ( + ( + await db.execute( + select(SysDept) + .where( + SysDept.status == '0', + SysDept.del_flag == '0', + SysDept.dept_name.like(f'%{dept_info.dept_name}%') if dept_info.dept_name else True, + eval(data_scope_sql), + ) + .order_by(SysDept.order_num) + .distinct() + ) + ) + .scalars() + .all() + ) - return list_format_datetime(dept_result) + return dept_result @classmethod - def get_dept_list(cls, db: Session, page_object: DeptModel, data_scope_sql: str): + async def get_dept_list(cls, db: AsyncSession, page_object: DeptModel, data_scope_sql: str): """ 根据查询参数获取部门列表信息 + :param db: orm对象 :param page_object: 不分页查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 部门列表信息对象 """ - dept_result = db.query(SysDept) \ - .filter(SysDept.del_flag == 0, - SysDept.status == page_object.status if page_object.status else True, - SysDept.dept_name.like(f'%{page_object.dept_name}%') if page_object.dept_name else True, - eval(data_scope_sql)) \ - .order_by(SysDept.order_num) \ - .distinct().all() - - result = dict( - rows=list_format_datetime(dept_result), + dept_result = ( + ( + await db.execute( + select(SysDept) + .where( + SysDept.del_flag == '0', + SysDept.dept_id == page_object.dept_id if page_object.dept_id is not None else True, + SysDept.status == page_object.status if page_object.status else True, + SysDept.dept_name.like(f'%{page_object.dept_name}%') if page_object.dept_name else True, + eval(data_scope_sql), + ) + .order_by(SysDept.order_num) + .distinct() + ) + ) + .scalars() + .all() ) - return DeptResponse(**result) + return dept_result @classmethod - def add_dept_dao(cls, db: Session, dept: DeptModel): + async def add_dept_dao(cls, db: AsyncSession, dept: DeptModel): """ 新增部门数据库操作 + :param db: orm对象 :param dept: 部门对象 :return: 新增校验结果 """ - db_dept = SysDept(**dept.dict()) + db_dept = SysDept(**dept.model_dump()) db.add(db_dept) - db.flush() + await db.flush() return db_dept @classmethod - def edit_dept_dao(cls, db: Session, dept: dict): + async def edit_dept_dao(cls, db: AsyncSession, dept: dict): """ 编辑部门数据库操作 + :param db: orm对象 :param dept: 需要更新的部门字典 :return: 编辑校验结果 """ - db.query(SysDept) \ - .filter(SysDept.dept_id == dept.get('dept_id')) \ - .update(dept) + await db.execute(update(SysDept), [dept]) @classmethod - def delete_dept_dao(cls, db: Session, dept: DeptModel): + async def update_dept_children_dao(cls, db: AsyncSession, update_dept: List): + """ + 更新子部门信息 + + :param db: orm对象 + :param update_dept: 需要更新的部门列表 + :return: + """ + await db.execute( + update(SysDept) + .where(SysDept.dept_id == bindparam('dept_id')) + .values( + { + 'dept_id': bindparam('dept_id'), + 'ancestors': bindparam('ancestors'), + } + ), + update_dept, + execution_options=immutabledict({'synchronize_session': None}), + ) + + @classmethod + async def update_dept_status_normal_dao(cls, db: AsyncSession, dept_id_list: List): + """ + 批量更新部门状态为正常 + + :param db: orm对象 + :param dept_id_list: 部门id列表 + :return: + """ + await db.execute(update(SysDept).where(SysDept.dept_id.in_(dept_id_list)).values(status='0')) + + @classmethod + async def delete_dept_dao(cls, db: AsyncSession, dept: DeptModel): """ 删除部门数据库操作 + :param db: orm对象 :param dept: 部门对象 :return: """ - db.query(SysDept) \ - .filter(SysDept.dept_id == dept.dept_id) \ - .update({SysDept.del_flag: '2', SysDept.update_by: dept.update_by, SysDept.update_time: dept.update_time}) + await db.execute( + update(SysDept) + .where(SysDept.dept_id == dept.dept_id) + .values(del_flag='2', update_by=dept.update_by, update_time=dept.update_time) + ) + + @classmethod + async def count_normal_children_dept_dao(cls, db: AsyncSession, dept_id: int): + """ + 根据部门id查询查询所有子部门(正常状态)的数量 + + :param db: orm对象 + :param dept_id: 部门id + :return: 所有子部门(正常状态)的数量 + """ + normal_children_dept_count = ( + await db.execute( + select(func.count('*')) + .select_from(SysDept) + .where(SysDept.status == '0', SysDept.del_flag == '0', func.find_in_set(dept_id, SysDept.ancestors)) + ) + ).scalar() + + return normal_children_dept_count + + @classmethod + async def count_children_dept_dao(cls, db: AsyncSession, dept_id: int): + """ + 根据部门id查询查询所有子部门(所有状态)的数量 + + :param db: orm对象 + :param dept_id: 部门id + :return: 所有子部门(所有状态)的数量 + """ + children_dept_count = ( + await db.execute( + select(func.count('*')) + .select_from(SysDept) + .where(SysDept.del_flag == '0', SysDept.parent_id == dept_id) + .limit(1) + ) + ).scalar() + + return children_dept_count + + @classmethod + async def count_dept_user_dao(cls, db: AsyncSession, dept_id: int): + """ + 根据部门id查询查询部门下的用户数量 + + :param db: orm对象 + :param dept_id: 部门id + :return: 部门下的用户数量 + """ + dept_user_count = ( + await db.execute( + select(func.count('*')).select_from(SysUser).where(SysUser.dept_id == dept_id, SysUser.del_flag == '0') + ) + ).scalar() + + return dept_user_count diff --git a/dash-fastapi-backend/module_admin/dao/dict_dao.py b/dash-fastapi-backend/module_admin/dao/dict_dao.py index 30312fd..8f4aab2 100644 --- a/dash-fastapi-backend/module_admin/dao/dict_dao.py +++ b/dash-fastapi-backend/module_admin/dao/dict_dao.py @@ -1,9 +1,10 @@ -from sqlalchemy import and_ -from sqlalchemy.orm import Session +from datetime import datetime, time +from sqlalchemy import and_, delete, func, select, update +from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.dict_do import SysDictType, SysDictData -from module_admin.entity.vo.dict_vo import DictTypeModel, DictTypeQueryModel, DictDataModel +from module_admin.entity.vo.dict_vo import DictDataModel, DictDataPageQueryModel, DictTypeModel, DictTypePageQueryModel +from utils.page_util import PageUtil from utils.time_format_util import list_format_datetime -from datetime import datetime, time class DictTypeDao: @@ -12,103 +13,119 @@ class DictTypeDao: """ @classmethod - def get_dict_type_detail_by_id(cls, db: Session, dict_id: int): + async def get_dict_type_detail_by_id(cls, db: AsyncSession, dict_id: int): """ 根据字典类型id获取字典类型详细信息 + :param db: orm对象 :param dict_id: 字典类型id :return: 字典类型信息对象 """ - dict_type_info = db.query(SysDictType) \ - .filter(SysDictType.dict_id == dict_id) \ - .first() + dict_type_info = (await db.execute(select(SysDictType).where(SysDictType.dict_id == dict_id))).scalars().first() return dict_type_info @classmethod - def get_dict_type_detail_by_info(cls, db: Session, dict_type: DictTypeModel): + async def get_dict_type_detail_by_info(cls, db: AsyncSession, dict_type: DictTypeModel): """ 根据字典类型参数获取字典类型信息 + :param db: orm对象 :param dict_type: 字典类型参数对象 :return: 字典类型信息对象 """ - dict_type_info = db.query(SysDictType) \ - .filter(SysDictType.dict_type == dict_type.dict_type if dict_type.dict_type else True, - SysDictType.dict_name == dict_type.dict_name if dict_type.dict_name else True) \ + dict_type_info = ( + ( + await db.execute( + select(SysDictType).where( + SysDictType.dict_type == dict_type.dict_type if dict_type.dict_type else True, + SysDictType.dict_name == dict_type.dict_name if dict_type.dict_name else True, + ) + ) + ) + .scalars() .first() + ) return dict_type_info @classmethod - def get_all_dict_type(cls, db: Session): + async def get_all_dict_type(cls, db: AsyncSession): """ 获取所有的字典类型信息 + :param db: orm对象 :return: 字典类型信息列表对象 """ - dict_type_info = db.query(SysDictType).all() + dict_type_info = (await db.execute(select(SysDictType))).scalars().all() return list_format_datetime(dict_type_info) @classmethod - def get_dict_type_list(cls, db: Session, query_object: DictTypeQueryModel): + async def get_dict_type_list(cls, db: AsyncSession, query_object: DictTypePageQueryModel, is_page: bool = False): """ 根据查询参数获取字典类型列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 字典类型列表信息对象 """ - dict_type_list = db.query(SysDictType) \ - .filter(SysDictType.dict_name.like(f'%{query_object.dict_name}%') if query_object.dict_name else True, - SysDictType.dict_type.like(f'%{query_object.dict_type}%') if query_object.dict_type else True, - SysDictType.status == query_object.status if query_object.status else True, - SysDictType.create_time.between( - datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.create_time_start and query_object.create_time_end else True - ) \ - .distinct().all() + query = ( + select(SysDictType) + .where( + SysDictType.dict_name.like(f'%{query_object.dict_name}%') if query_object.dict_name else True, + SysDictType.dict_type.like(f'%{query_object.dict_type}%') if query_object.dict_type else True, + SysDictType.status == query_object.status if query_object.status else True, + SysDictType.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() + ) + dict_type_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return list_format_datetime(dict_type_list) + return dict_type_list @classmethod - def add_dict_type_dao(cls, db: Session, dict_type: DictTypeModel): + async def add_dict_type_dao(cls, db: AsyncSession, dict_type: DictTypeModel): """ 新增字典类型数据库操作 + :param db: orm对象 :param dict_type: 字典类型对象 :return: """ - db_dict_type = SysDictType(**dict_type.dict()) + db_dict_type = SysDictType(**dict_type.model_dump()) db.add(db_dict_type) - db.flush() + await db.flush() return db_dict_type @classmethod - def edit_dict_type_dao(cls, db: Session, dict_type: dict): + async def edit_dict_type_dao(cls, db: AsyncSession, dict_type: dict): """ 编辑字典类型数据库操作 + :param db: orm对象 :param dict_type: 需要更新的字典类型字典 :return: """ - db.query(SysDictType) \ - .filter(SysDictType.dict_id == dict_type.get('dict_id')) \ - .update(dict_type) + await db.execute(update(SysDictType), [dict_type]) @classmethod - def delete_dict_type_dao(cls, db: Session, dict_type: DictTypeModel): + async def delete_dict_type_dao(cls, db: AsyncSession, dict_type: DictTypeModel): """ 删除字典类型数据库操作 + :param db: orm对象 :param dict_type: 字典类型对象 :return: """ - db.query(SysDictType) \ - .filter(SysDictType.dict_id == dict_type.dict_id) \ - .delete() + await db.execute(delete(SysDictType).where(SysDictType.dict_id.in_([dict_type.dict_id]))) class DictDataDao: @@ -117,103 +134,147 @@ class DictDataDao: """ @classmethod - def get_dict_data_detail_by_id(cls, db: Session, dict_code: int): + async def get_dict_data_detail_by_id(cls, db: AsyncSession, dict_code: int): """ 根据字典数据id获取字典数据详细信息 + :param db: orm对象 :param dict_code: 字典数据id :return: 字典数据信息对象 """ - dict_data_info = db.query(SysDictData) \ - .filter(SysDictData.dict_code == dict_code) \ - .first() + dict_data_info = ( + (await db.execute(select(SysDictData).where(SysDictData.dict_code == dict_code))).scalars().first() + ) return dict_data_info @classmethod - def get_dict_data_detail_by_info(cls, db: Session, dict_data: DictDataModel): + async def get_dict_data_detail_by_info(cls, db: AsyncSession, dict_data: DictDataModel): """ 根据字典数据参数获取字典数据信息 + :param db: orm对象 :param dict_data: 字典数据参数对象 :return: 字典数据信息对象 """ - dict_data_info = db.query(SysDictData) \ - .filter(SysDictData.dict_type == dict_data.dict_type if dict_data.dict_type else True, - SysDictData.dict_label == dict_data.dict_label if dict_data.dict_label else True, - SysDictData.dict_value == dict_data.dict_value if dict_data.dict_value else True) \ + dict_data_info = ( + ( + await db.execute( + select(SysDictData).where( + SysDictData.dict_type == dict_data.dict_type, + SysDictData.dict_label == dict_data.dict_label, + SysDictData.dict_value == dict_data.dict_value, + ) + ) + ) + .scalars() .first() + ) return dict_data_info @classmethod - def get_dict_data_list(cls, db: Session, query_object: DictDataModel): + async def get_dict_data_list(cls, db: AsyncSession, query_object: DictDataPageQueryModel, is_page: bool = False): """ 根据查询参数获取字典数据列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 字典数据列表信息对象 """ - dict_data_list = db.query(SysDictData) \ - .filter(SysDictData.dict_type == query_object.dict_type if query_object.dict_type else True, - SysDictData.dict_label.like(f'%{query_object.dict_label}%') if query_object.dict_label else True, - SysDictData.status == query_object.status if query_object.status else True - ) \ - .order_by(SysDictData.dict_sort) \ - .distinct().all() + query = ( + select(SysDictData) + .where( + SysDictData.dict_type == query_object.dict_type if query_object.dict_type else True, + SysDictData.dict_label.like(f'%{query_object.dict_label}%') if query_object.dict_label else True, + SysDictData.status == query_object.status if query_object.status else True, + ) + .order_by(SysDictData.dict_sort) + .distinct() + ) + dict_data_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return list_format_datetime(dict_data_list) + return dict_data_list @classmethod - def query_dict_data_list(cls, db: Session, dict_type: str): + async def query_dict_data_list(cls, db: AsyncSession, dict_type: str): """ 根据查询参数获取字典数据列表信息 + :param db: orm对象 :param dict_type: 字典类型 :return: 字典数据列表信息对象 """ - dict_data_list = db.query(SysDictData).select_from(SysDictType) \ - .filter(SysDictType.dict_type == dict_type if dict_type else True, SysDictType.status == 0) \ - .outerjoin(SysDictData, and_(SysDictType.dict_type == SysDictData.dict_type, SysDictData.status == 0)) \ - .order_by(SysDictData.dict_sort) \ - .distinct().all() + dict_data_list = ( + ( + await db.execute( + select(SysDictData) + .select_from(SysDictType) + .where(SysDictType.dict_type == dict_type if dict_type else True, SysDictType.status == '0') + .join( + SysDictData, + and_(SysDictType.dict_type == SysDictData.dict_type, SysDictData.status == '0'), + isouter=True, + ) + .order_by(SysDictData.dict_sort) + .distinct() + ) + ) + .scalars() + .all() + ) - return list_format_datetime(dict_data_list) + return dict_data_list @classmethod - def add_dict_data_dao(cls, db: Session, dict_data: DictDataModel): + async def add_dict_data_dao(cls, db: AsyncSession, dict_data: DictDataModel): """ 新增字典数据数据库操作 + :param db: orm对象 :param dict_data: 字典数据对象 :return: """ - db_data_type = SysDictData(**dict_data.dict()) + db_data_type = SysDictData(**dict_data.model_dump()) db.add(db_data_type) - db.flush() + await db.flush() return db_data_type @classmethod - def edit_dict_data_dao(cls, db: Session, dict_data: dict): + async def edit_dict_data_dao(cls, db: AsyncSession, dict_data: dict): """ 编辑字典数据数据库操作 + :param db: orm对象 :param dict_data: 需要更新的字典数据字典 :return: """ - db.query(SysDictData) \ - .filter(SysDictData.dict_code == dict_data.get('dict_code')) \ - .update(dict_data) + await db.execute(update(SysDictData), [dict_data]) @classmethod - def delete_dict_data_dao(cls, db: Session, dict_data: DictDataModel): + async def delete_dict_data_dao(cls, db: AsyncSession, dict_data: DictDataModel): """ 删除字典数据数据库操作 + :param db: orm对象 :param dict_data: 字典数据对象 :return: """ - db.query(SysDictData) \ - .filter(SysDictData.dict_code == dict_data.dict_code) \ - .delete() + await db.execute(delete(SysDictData).where(SysDictData.dict_code.in_([dict_data.dict_code]))) + + @classmethod + async def count_dict_data_dao(cls, db: AsyncSession, dict_type: str): + """ + 根据字典类型查询字典类型关联的字典数据数量 + + :param db: orm对象 + :param dict_type: 字典类型 + :return: 字典类型关联的字典数据数量 + """ + dict_data_count = ( + await db.execute(select(func.count('*')).select_from(SysDictData).where(SysDictData.dict_type == dict_type)) + ).scalar() + + return dict_data_count diff --git a/dash-fastapi-backend/module_admin/dao/job_dao.py b/dash-fastapi-backend/module_admin/dao/job_dao.py index ca318c8..7f4f4a3 100644 --- a/dash-fastapi-backend/module_admin/dao/job_dao.py +++ b/dash-fastapi-backend/module_admin/dao/job_dao.py @@ -1,7 +1,8 @@ -from sqlalchemy.orm import Session +from sqlalchemy import delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.job_do import SysJob -from module_admin.entity.vo.job_vo import JobModel -from utils.time_format_util import list_format_datetime, object_format_datetime +from module_admin.entity.vo.job_vo import JobModel, JobPageQueryModel +from utils.page_util import PageUtil class JobDao: @@ -10,100 +11,115 @@ class JobDao: """ @classmethod - def get_job_detail_by_id(cls, db: Session, job_id: int): + async def get_job_detail_by_id(cls, db: AsyncSession, job_id: int): """ 根据定时任务id获取定时任务详细信息 + :param db: orm对象 :param job_id: 定时任务id :return: 定时任务信息对象 """ - job_info = db.query(SysJob) \ - .filter(SysJob.job_id == job_id) \ - .first() + job_info = (await db.execute(select(SysJob).where(SysJob.job_id == job_id))).scalars().first() - return object_format_datetime(job_info) + return job_info @classmethod - def get_job_detail_by_info(cls, db: Session, job: JobModel): + async def get_job_detail_by_info(cls, db: AsyncSession, job: JobModel): """ 根据定时任务参数获取定时任务信息 + :param db: orm对象 :param job: 定时任务参数对象 :return: 定时任务信息对象 """ - job_info = db.query(SysJob) \ - .filter(SysJob.job_name == job.job_name if job.job_name else True, - SysJob.job_group == job.job_group if job.job_group else True, - SysJob.invoke_target == job.invoke_target if job.invoke_target else True, - SysJob.cron_expression == job.cron_expression if job.cron_expression else True) \ + job_info = ( + ( + await db.execute( + select(SysJob).where( + SysJob.job_name == job.job_name, + SysJob.job_group == job.job_group, + SysJob.job_executor == job.job_executor, + SysJob.invoke_target == job.invoke_target, + SysJob.job_args == job.job_args, + SysJob.job_kwargs == job.job_kwargs, + SysJob.cron_expression == job.cron_expression, + ) + ) + ) + .scalars() .first() + ) return job_info @classmethod - def get_job_list(cls, db: Session, query_object: JobModel): + async def get_job_list(cls, db: AsyncSession, query_object: JobPageQueryModel, is_page: bool = False): """ 根据查询参数获取定时任务列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 定时任务列表信息对象 """ - job_list = db.query(SysJob) \ - .filter(SysJob.job_name.like(f'%{query_object.job_name}%') if query_object.job_name else True, - SysJob.job_group == query_object.job_group if query_object.job_group else True, - SysJob.status == query_object.status if query_object.status else True - ) \ - .distinct().all() + query = ( + select(SysJob) + .where( + SysJob.job_name.like(f'%{query_object.job_name}%') if query_object.job_name else True, + SysJob.job_group == query_object.job_group if query_object.job_group else True, + SysJob.status == query_object.status if query_object.status else True, + ) + .distinct() + ) + job_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return list_format_datetime(job_list) + return job_list @classmethod - def get_job_list_for_scheduler(cls, db: Session): + async def get_job_list_for_scheduler(cls, db: AsyncSession): """ 获取定时任务列表信息 + :param db: orm对象 :return: 定时任务列表信息对象 """ - job_list = db.query(SysJob) \ - .filter(SysJob.status == 0) \ - .distinct().all() + job_list = (await db.execute(select(SysJob).where(SysJob.status == '0').distinct())).scalars().all() - return list_format_datetime(job_list) + return job_list @classmethod - def add_job_dao(cls, db: Session, job: JobModel): + async def add_job_dao(cls, db: AsyncSession, job: JobModel): """ 新增定时任务数据库操作 + :param db: orm对象 :param job: 定时任务对象 :return: """ - db_job = SysJob(**job.dict()) + db_job = SysJob(**job.model_dump()) db.add(db_job) - db.flush() + await db.flush() return db_job @classmethod - def edit_job_dao(cls, db: Session, job: dict): + async def edit_job_dao(cls, db: AsyncSession, job: dict): """ 编辑定时任务数据库操作 + :param db: orm对象 :param job: 需要更新的定时任务字典 :return: """ - db.query(SysJob) \ - .filter(SysJob.job_id == job.get('job_id')) \ - .update(job) + await db.execute(update(SysJob), [job]) @classmethod - def delete_job_dao(cls, db: Session, job: JobModel): + async def delete_job_dao(cls, db: AsyncSession, job: JobModel): """ 删除定时任务数据库操作 + :param db: orm对象 :param job: 定时任务对象 :return: """ - db.query(SysJob) \ - .filter(SysJob.job_id == job.job_id) \ - .delete() + await db.execute(delete(SysJob).where(SysJob.job_id.in_([job.job_id]))) diff --git a/dash-fastapi-backend/module_admin/dao/job_log_dao.py b/dash-fastapi-backend/module_admin/dao/job_log_dao.py index b3cd75c..730be5a 100644 --- a/dash-fastapi-backend/module_admin/dao/job_log_dao.py +++ b/dash-fastapi-backend/module_admin/dao/job_log_dao.py @@ -1,8 +1,10 @@ +from datetime import datetime, time +from sqlalchemy import delete, select +from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import Session from module_admin.entity.do.job_do import SysJobLog -from module_admin.entity.vo.job_vo import JobLogModel, JobLogQueryModel -from utils.time_format_util import list_format_datetime, object_format_datetime -from datetime import datetime, time +from module_admin.entity.vo.job_vo import JobLogModel, JobLogPageQueryModel +from utils.page_util import PageUtil class JobLogDao: @@ -11,72 +13,66 @@ class JobLogDao: """ @classmethod - def get_job_log_detail_by_id(cls, db: Session, job_log_id: int): - """ - 根据定时任务日志id获取定时任务日志详细信息 - :param db: orm对象 - :param job_log_id: 定时任务日志id - :return: 定时任务日志信息对象 - """ - job_log_info = db.query(SysJobLog) \ - .filter(SysJobLog.job_log_id == job_log_id) \ - .first() - - return object_format_datetime(job_log_info) - - @classmethod - def get_job_log_list(cls, db: Session, query_object: JobLogQueryModel): + async def get_job_log_list(cls, db: AsyncSession, query_object: JobLogPageQueryModel, is_page: bool = False): """ 根据查询参数获取定时任务日志列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 定时任务日志列表信息对象 """ - job_log_list = db.query(SysJobLog) \ - .filter(SysJobLog.job_name.like(f'%{query_object.job_name}%') if query_object.job_name else True, - SysJobLog.job_group == query_object.job_group if query_object.job_group else True, - SysJobLog.status == query_object.status if query_object.status else True, - SysJobLog.create_time.between( - datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.create_time_start and query_object.create_time_end else True - ) \ - .distinct().all() + query = ( + select(SysJobLog) + .where( + SysJobLog.job_name.like(f'%{query_object.job_name}%') if query_object.job_name else True, + SysJobLog.job_group == query_object.job_group if query_object.job_group else True, + SysJobLog.status == query_object.status if query_object.status else True, + SysJobLog.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() + ) + job_log_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return list_format_datetime(job_log_list) + return job_log_list @classmethod def add_job_log_dao(cls, db: Session, job_log: JobLogModel): """ 新增定时任务日志数据库操作 + :param db: orm对象 :param job_log: 定时任务日志对象 :return: """ - db_job_log = SysJobLog(**job_log.dict()) + db_job_log = SysJobLog(**job_log.model_dump()) db.add(db_job_log) db.flush() return db_job_log @classmethod - def delete_job_log_dao(cls, db: Session, job_log: JobLogModel): + async def delete_job_log_dao(cls, db: AsyncSession, job_log: JobLogModel): """ 删除定时任务日志数据库操作 + :param db: orm对象 :param job_log: 定时任务日志对象 :return: """ - db.query(SysJobLog) \ - .filter(SysJobLog.job_log_id == job_log.job_log_id) \ - .delete() + await db.execute(delete(SysJobLog).where(SysJobLog.job_log_id.in_([job_log.job_log_id]))) @classmethod - def clear_job_log_dao(cls, db: Session): + async def clear_job_log_dao(cls, db: AsyncSession): """ 清除定时任务日志数据库操作 + :param db: orm对象 :return: """ - db.query(SysJobLog) \ - .delete() + await db.execute(delete(SysJobLog)) diff --git a/dash-fastapi-backend/module_admin/dao/log_dao.py b/dash-fastapi-backend/module_admin/dao/log_dao.py index c5ee91b..1e4ad41 100644 --- a/dash-fastapi-backend/module_admin/dao/log_dao.py +++ b/dash-fastapi-backend/module_admin/dao/log_dao.py @@ -1,9 +1,10 @@ -from sqlalchemy import asc, desc -from sqlalchemy.orm import Session -from module_admin.entity.do.log_do import SysOperLog, SysLogininfor -from module_admin.entity.vo.log_vo import OperLogModel, LogininforModel, OperLogQueryModel, LoginLogQueryModel -from utils.time_format_util import object_format_datetime, list_format_datetime from datetime import datetime, time +from sqlalchemy import asc, delete, desc, select +from sqlalchemy.ext.asyncio import AsyncSession +from module_admin.entity.do.log_do import SysLogininfor, SysOperLog +from module_admin.entity.vo.log_vo import LogininforModel, LoginLogPageQueryModel, OperLogModel, OperLogPageQueryModel +from utils.common_util import SnakeCaseUtil +from utils.page_util import PageUtil class OperationLogDao: @@ -12,82 +13,79 @@ class OperationLogDao: """ @classmethod - def get_operation_log_detail_by_id(cls, db: Session, oper_id: int): - """ - 根据操作日志id获取操作日志详细信息 - :param db: orm对象 - :param oper_id: 操作日志id - :return: 操作日志信息对象 - """ - operation_log_info = db.query(SysOperLog) \ - .filter(SysOperLog.oper_id == oper_id) \ - .first() - - return object_format_datetime(operation_log_info) - - @classmethod - def get_operation_log_list(cls, db: Session, query_object: OperLogQueryModel): + async def get_operation_log_list(cls, db: AsyncSession, query_object: OperLogPageQueryModel, is_page: bool = False): """ 根据查询参数获取操作日志列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 操作日志列表信息对象 """ - if query_object.is_asc == 'ascend': - order_by_column = asc(getattr(SysOperLog, query_object.order_by_column, None)) - elif query_object.is_asc == 'descend': - order_by_column = desc(getattr(SysOperLog, query_object.order_by_column, None)) + if query_object.is_asc == 'ascending': + order_by_column = asc(getattr(SysOperLog, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None)) + elif query_object.is_asc == 'descending': + order_by_column = desc( + getattr(SysOperLog, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None) + ) else: - order_by_column = asc(SysOperLog.oper_time) - operation_log_list = db.query(SysOperLog) \ - .filter(SysOperLog.title.like(f'%{query_object.title}%') if query_object.title else True, - SysOperLog.oper_name.like(f'%{query_object.oper_name}%') if query_object.oper_name else True, - SysOperLog.business_type == query_object.business_type if query_object.business_type else True, - SysOperLog.status == query_object.status if query_object.status else True, - SysOperLog.oper_time.between( - datetime.combine(datetime.strptime(query_object.oper_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.oper_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.oper_time_start and query_object.oper_time_end else True - )\ - .distinct().order_by(order_by_column).all() - - return list_format_datetime(operation_log_list) + order_by_column = desc(SysOperLog.oper_time) + query = ( + select(SysOperLog) + .where( + SysOperLog.title.like(f'%{query_object.title}%') if query_object.title else True, + SysOperLog.oper_name.like(f'%{query_object.oper_name}%') if query_object.oper_name else True, + SysOperLog.business_type == query_object.business_type if query_object.business_type else True, + SysOperLog.status == query_object.status if query_object.status else True, + SysOperLog.oper_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() + .order_by(order_by_column) + ) + operation_log_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + return operation_log_list @classmethod - def add_operation_log_dao(cls, db: Session, operation_log: OperLogModel): + async def add_operation_log_dao(cls, db: AsyncSession, operation_log: OperLogModel): """ 新增操作日志数据库操作 + :param db: orm对象 :param operation_log: 操作日志对象 :return: 新增校验结果 """ - db_operation_log = SysOperLog(**operation_log.dict()) + db_operation_log = SysOperLog(**operation_log.model_dump()) db.add(db_operation_log) - db.flush() + await db.flush() return db_operation_log @classmethod - def delete_operation_log_dao(cls, db: Session, operation_log: OperLogModel): + async def delete_operation_log_dao(cls, db: AsyncSession, operation_log: OperLogModel): """ 删除操作日志数据库操作 + :param db: orm对象 :param operation_log: 操作日志对象 :return: """ - db.query(SysOperLog) \ - .filter(SysOperLog.oper_id == operation_log.oper_id) \ - .delete() + await db.execute(delete(SysOperLog).where(SysOperLog.oper_id.in_([operation_log.oper_id]))) @classmethod - def clear_operation_log_dao(cls, db: Session): + async def clear_operation_log_dao(cls, db: AsyncSession): """ 清除操作日志数据库操作 + :param db: orm对象 :return: """ - db.query(SysOperLog) \ - .delete() + await db.execute(delete(SysOperLog)) class LoginLogDao: @@ -96,64 +94,77 @@ class LoginLogDao: """ @classmethod - def get_login_log_list(cls, db: Session, query_object: LoginLogQueryModel): + async def get_login_log_list(cls, db: AsyncSession, query_object: LoginLogPageQueryModel, is_page: bool = False): """ 根据查询参数获取登录日志列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 登录日志列表信息对象 """ - if query_object.is_asc == 'ascend': - order_by_column = asc(getattr(SysLogininfor, query_object.order_by_column, None)) - elif query_object.is_asc == 'descend': - order_by_column = desc(getattr(SysLogininfor, query_object.order_by_column, None)) + if query_object.is_asc == 'ascending': + order_by_column = asc( + getattr(SysLogininfor, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None) + ) + elif query_object.is_asc == 'descending': + order_by_column = desc( + getattr(SysLogininfor, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None) + ) else: - order_by_column = asc(SysLogininfor.login_time) - login_log_list = db.query(SysLogininfor) \ - .filter(SysLogininfor.ipaddr.like(f'%{query_object.ipaddr}%') if query_object.ipaddr else True, - SysLogininfor.user_name.like(f'%{query_object.user_name}%') if query_object.user_name else True, - SysLogininfor.status == query_object.status if query_object.status else True, - SysLogininfor.login_time.between( - datetime.combine(datetime.strptime(query_object.login_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.login_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.login_time_start and query_object.login_time_end else True - )\ - .distinct().order_by(order_by_column).all() - - return list_format_datetime(login_log_list) + order_by_column = desc(SysLogininfor.login_time) + query = ( + select(SysLogininfor) + .where( + SysLogininfor.ipaddr.like(f'%{query_object.ipaddr}%') if query_object.ipaddr else True, + SysLogininfor.user_name.like(f'%{query_object.user_name}%') if query_object.user_name else True, + SysLogininfor.status == query_object.status if query_object.status else True, + SysLogininfor.login_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() + .order_by(order_by_column) + ) + login_log_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + return login_log_list @classmethod - def add_login_log_dao(cls, db: Session, login_log: LogininforModel): + async def add_login_log_dao(cls, db: AsyncSession, login_log: LogininforModel): """ 新增登录日志数据库操作 + :param db: orm对象 :param login_log: 登录日志对象 :return: 新增校验结果 """ - db_login_log = SysLogininfor(**login_log.dict()) + db_login_log = SysLogininfor(**login_log.model_dump()) db.add(db_login_log) - db.flush() + await db.flush() return db_login_log @classmethod - def delete_login_log_dao(cls, db: Session, login_log: LogininforModel): + async def delete_login_log_dao(cls, db: AsyncSession, login_log: LogininforModel): """ 删除登录日志数据库操作 + :param db: orm对象 :param login_log: 登录日志对象 :return: """ - db.query(SysLogininfor) \ - .filter(SysLogininfor.info_id == login_log.info_id) \ - .delete() + await db.execute(delete(SysLogininfor).where(SysLogininfor.info_id.in_([login_log.info_id]))) @classmethod - def clear_login_log_dao(cls, db: Session): + async def clear_login_log_dao(cls, db: AsyncSession): """ 清除登录日志数据库操作 + :param db: orm对象 :return: """ - db.query(SysLogininfor) \ - .delete() + await db.execute(delete(SysLogininfor)) diff --git a/dash-fastapi-backend/module_admin/dao/login_dao.py b/dash-fastapi-backend/module_admin/dao/login_dao.py index b932bc1..9764a4a 100644 --- a/dash-fastapi-backend/module_admin/dao/login_dao.py +++ b/dash-fastapi-backend/module_admin/dao/login_dao.py @@ -1,20 +1,28 @@ -from sqlalchemy.orm import Session -from sqlalchemy import and_ -from module_admin.entity.do.user_do import SysUser +from sqlalchemy import and_, select +from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.dept_do import SysDept +from module_admin.entity.do.user_do import SysUser -def login_by_account(db: Session, user_name: str): +async def login_by_account(db: AsyncSession, user_name: str): """ 根据用户名查询用户信息 + :param db: orm对象 :param user_name: 用户名 :return: 用户对象 """ - user = db.query(SysUser, SysDept)\ - .filter(SysUser.user_name == user_name, SysUser.del_flag == '0') \ - .outerjoin(SysDept, and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \ - .distinct() \ - .first() + user = ( + await db.execute( + select(SysUser, SysDept) + .where(SysUser.user_name == user_name, SysUser.del_flag == '0') + .join( + SysDept, + and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == '0', SysDept.del_flag == '0'), + isouter=True, + ) + .distinct() + ) + ).first() return user diff --git a/dash-fastapi-backend/module_admin/dao/menu_dao.py b/dash-fastapi-backend/module_admin/dao/menu_dao.py index 6409572..19831e0 100644 --- a/dash-fastapi-backend/module_admin/dao/menu_dao.py +++ b/dash-fastapi-backend/module_admin/dao/menu_dao.py @@ -1,10 +1,9 @@ -from sqlalchemy import and_ -from sqlalchemy.orm import Session +from sqlalchemy import and_, delete, func, select, update +from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.menu_do import SysMenu -from module_admin.entity.do.user_do import SysUser, SysUserRole from module_admin.entity.do.role_do import SysRole, SysRoleMenu -from module_admin.entity.vo.menu_vo import MenuModel, MenuResponse -from utils.time_format_util import list_format_datetime +from module_admin.entity.do.user_do import SysUser, SysUserRole +from module_admin.entity.vo.menu_vo import MenuModel, MenuQueryModel class MenuDao: @@ -13,104 +12,92 @@ class MenuDao: """ @classmethod - def get_menu_detail_by_id(cls, db: Session, menu_id: int): + async def get_menu_detail_by_id(cls, db: AsyncSession, menu_id: int): """ 根据菜单id获取菜单详细信息 + :param db: orm对象 :param menu_id: 菜单id :return: 菜单信息对象 """ - menu_info = db.query(SysMenu) \ - .filter(SysMenu.menu_id == menu_id) \ - .first() + menu_info = (await db.execute(select(SysMenu).where(SysMenu.menu_id == menu_id))).scalars().first() return menu_info @classmethod - def get_menu_detail_by_info(cls, db: Session, menu: MenuModel): + async def get_menu_detail_by_info(cls, db: AsyncSession, menu: MenuModel): """ 根据菜单参数获取菜单信息 + :param db: orm对象 :param menu: 菜单参数对象 :return: 菜单信息对象 """ - menu_info = db.query(SysMenu) \ - .filter(SysMenu.parent_id == menu.parent_id if menu.parent_id else True, - SysMenu.menu_name == menu.menu_name if menu.menu_name else True, - SysMenu.menu_type == menu.menu_type if menu.menu_type else True) \ + menu_info = ( + ( + await db.execute( + select(SysMenu).where( + SysMenu.parent_id == menu.parent_id if menu.parent_id else True, + SysMenu.menu_name == menu.menu_name if menu.menu_name else True, + SysMenu.menu_type == menu.menu_type if menu.menu_type else True, + ) + ) + ) + .scalars() .first() + ) return menu_info @classmethod - def get_menu_info_for_edit_option(cls, db: Session, menu_info: MenuModel, user_id: int, role: list): + async def get_menu_list_for_tree(cls, db: AsyncSession, user_id: int, role: list): """ - 根据角色信息获取菜单编辑对应的在用菜单列表信息 + 根据角色信息获取所有在用菜单列表信息 + :param db: orm对象 - :param menu_info: 菜单对象 :param user_id: 用户id :param role: 用户角色列表信息 :return: 菜单列表信息 """ role_id_list = [item.role_id for item in role] if 1 in role_id_list: - menu_result = db.query(SysMenu) \ - .filter(SysMenu.menu_id != menu_info.menu_id, SysMenu.parent_id != menu_info.menu_id, - SysMenu.status == 0) \ + menu_query_all = ( + (await db.execute(select(SysMenu).where(SysMenu.status == '0').order_by(SysMenu.order_num).distinct())) + .scalars() .all() + ) else: - menu_result = db.query(SysMenu).select_from(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserRole, SysUser.user_id == SysUserRole.user_id) \ - .outerjoin(SysRole, - and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == 0, SysRole.del_flag == 0)) \ - .outerjoin(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id) \ - .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, - SysMenu.menu_id != menu_info.menu_id, - SysMenu.parent_id != menu_info.menu_id, - SysMenu.status == 0)) \ - .order_by(SysMenu.order_num) \ - .distinct().all() - - return list_format_datetime(menu_result) + menu_query_all = ( + ( + await db.execute( + select(SysMenu) + .select_from(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) + .join( + SysRole, + and_( + SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0' + ), + isouter=True, + ) + .join(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id, isouter=True) + .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == '0')) + .order_by(SysMenu.order_num) + .distinct() + ) + ) + .scalars() + .all() + ) - @classmethod - def get_menu_list_for_tree(cls, db: Session, menu_info: MenuModel, user_id: int, role: list): - """ - 根据角色信息获取所有在用菜单列表信息 - :param db: orm对象 - :param menu_info: 菜单对象 - :param user_id: 用户id - :param role: 用户角色列表信息 - :return: 菜单列表信息 - """ - role_id_list = [item.role_id for item in role] - if 1 in role_id_list: - menu_query_all = db.query(SysMenu) \ - .filter(SysMenu.status == 0, - SysMenu.menu_name.like(f'%{menu_info.menu_name}%') if menu_info.menu_name else True) \ - .order_by(SysMenu.order_num) \ - .distinct().all() - else: - menu_query_all = db.query(SysMenu).select_from(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserRole, SysUser.user_id == SysUserRole.user_id) \ - .outerjoin(SysRole, - and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == 0, SysRole.del_flag == 0)) \ - .outerjoin(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id) \ - .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, - SysMenu.status == 0, - SysMenu.menu_name.like( - f'%{menu_info.menu_name}%') if menu_info.menu_name else True)) \ - .order_by(SysMenu.order_num) \ - .distinct().all() - - return list_format_datetime(menu_query_all) + return menu_query_all @classmethod - def get_menu_list(cls, db: Session, page_object: MenuModel, user_id: int, role: list): + async def get_menu_list(cls, db: AsyncSession, page_object: MenuQueryModel, user_id: int, role: list): """ 根据查询参数获取菜单列表信息 + :param db: orm对象 :param page_object: 不分页查询参数对象 :param user_id: 用户id @@ -119,66 +106,118 @@ class MenuDao: """ role_id_list = [item.role_id for item in role] if 1 in role_id_list: - menu_query_all = db.query(SysMenu) \ - .filter(SysMenu.status == page_object.status if page_object.status else True, - SysMenu.menu_name.like( - f'%{page_object.menu_name}%') if page_object.menu_name else True) \ - .order_by(SysMenu.order_num) \ - .distinct().all() + menu_query_all = ( + ( + await db.execute( + select(SysMenu) + .where( + SysMenu.status == page_object.status if page_object.status else True, + SysMenu.menu_name.like(f'%{page_object.menu_name}%') if page_object.menu_name else True, + ) + .order_by(SysMenu.order_num) + .distinct() + ) + ) + .scalars() + .all() + ) else: - menu_query_all = db.query(SysMenu).select_from(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserRole, SysUser.user_id == SysUserRole.user_id) \ - .outerjoin(SysRole, - and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == 0, SysRole.del_flag == 0)) \ - .outerjoin(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id) \ - .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, - SysMenu.status == page_object.status if page_object.status else True, - SysMenu.menu_name.like( - f'%{page_object.menu_name}%') if page_object.menu_name else True)) \ - .order_by(SysMenu.order_num) \ - .distinct().all() - - result = dict( - rows=list_format_datetime(menu_query_all), - ) + menu_query_all = ( + ( + await db.execute( + select(SysMenu) + .select_from(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) + .join( + SysRole, + and_( + SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0' + ), + isouter=True, + ) + .join(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id, isouter=True) + .join( + SysMenu, + and_( + SysRoleMenu.menu_id == SysMenu.menu_id, + SysMenu.status == page_object.status if page_object.status else True, + SysMenu.menu_name.like(f'%{page_object.menu_name}%') if page_object.menu_name else True, + ), + ) + .order_by(SysMenu.order_num) + .distinct() + ) + ) + .scalars() + .all() + ) - return MenuResponse(**result) + return menu_query_all @classmethod - def add_menu_dao(cls, db: Session, menu: MenuModel): + async def add_menu_dao(cls, db: AsyncSession, menu: MenuModel): """ 新增菜单数据库操作 + :param db: orm对象 :param menu: 菜单对象 :return: """ - db_menu = SysMenu(**menu.dict()) + db_menu = SysMenu(**menu.model_dump()) db.add(db_menu) - db.flush() + await db.flush() return db_menu @classmethod - def edit_menu_dao(cls, db: Session, menu: dict): + async def edit_menu_dao(cls, db: AsyncSession, menu: dict): """ 编辑菜单数据库操作 + :param db: orm对象 :param menu: 需要更新的菜单字典 :return: """ - db.query(SysMenu) \ - .filter(SysMenu.menu_id == menu.get('menu_id')) \ - .update(menu) + await db.execute(update(SysMenu), [menu]) @classmethod - def delete_menu_dao(cls, db: Session, menu: MenuModel): + async def delete_menu_dao(cls, db: AsyncSession, menu: MenuModel): """ 删除菜单数据库操作 + :param db: orm对象 :param menu: 菜单对象 :return: """ - db.query(SysMenu) \ - .filter(SysMenu.menu_id == menu.menu_id) \ - .delete() + await db.execute(delete(SysMenu).where(SysMenu.menu_id.in_([menu.menu_id]))) + + @classmethod + async def has_child_by_menu_id_dao(cls, db: AsyncSession, menu_id: int): + """ + 根据菜单id查询菜单关联子菜单的数量 + + :param db: orm对象 + :param menu_id: 菜单id + :return: 菜单关联子菜单的数量 + """ + menu_count = ( + await db.execute(select(func.count('*')).select_from(SysMenu).where(SysMenu.parent_id == menu_id)) + ).scalar() + + return menu_count + + @classmethod + async def check_menu_exist_role_dao(cls, db: AsyncSession, menu_id: int): + """ + 根据菜单id查询菜单关联角色数量 + + :param db: orm对象 + :param menu_id: 菜单id + :return: 菜单关联角色数量 + """ + role_count = ( + await db.execute(select(func.count('*')).select_from(SysRoleMenu).where(SysRoleMenu.menu_id == menu_id)) + ).scalar() + + return role_count diff --git a/dash-fastapi-backend/module_admin/dao/notice_dao.py b/dash-fastapi-backend/module_admin/dao/notice_dao.py index b72d59f..961a992 100644 --- a/dash-fastapi-backend/module_admin/dao/notice_dao.py +++ b/dash-fastapi-backend/module_admin/dao/notice_dao.py @@ -1,8 +1,9 @@ -from sqlalchemy.orm import Session -from module_admin.entity.do.notice_do import SysNotice -from module_admin.entity.vo.notice_vo import NoticeModel, NoticeQueryModel, CrudNoticeResponse -from utils.time_format_util import list_format_datetime, object_format_datetime from datetime import datetime, time +from sqlalchemy import delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession +from module_admin.entity.do.notice_do import SysNotice +from module_admin.entity.vo.notice_vo import NoticeModel, NoticePageQueryModel +from utils.page_util import PageUtil class NoticeDao: @@ -11,90 +12,105 @@ class NoticeDao: """ @classmethod - def get_notice_detail_by_id(cls, db: Session, notice_id: int): + async def get_notice_detail_by_id(cls, db: AsyncSession, notice_id: int): """ 根据通知公告id获取通知公告详细信息 + :param db: orm对象 :param notice_id: 通知公告id :return: 通知公告信息对象 """ - notice_info = db.query(SysNotice) \ - .filter(SysNotice.notice_id == notice_id) \ - .first() + notice_info = (await db.execute(select(SysNotice).where(SysNotice.notice_id == notice_id))).scalars().first() - return object_format_datetime(notice_info) + return notice_info @classmethod - def get_notice_detail_by_info(cls, db: Session, notice: NoticeModel): + async def get_notice_detail_by_info(cls, db: AsyncSession, notice: NoticeModel): """ 根据通知公告参数获取通知公告信息 + :param db: orm对象 :param notice: 通知公告参数对象 :return: 通知公告信息对象 """ - notice_info = db.query(SysNotice) \ - .filter(SysNotice.notice_title == notice.notice_title if notice.notice_title else True, - SysNotice.notice_type == notice.notice_type if notice.notice_type else True, - SysNotice.notice_content == notice.notice_content if notice.notice_content else True) \ + notice_info = ( + ( + await db.execute( + select(SysNotice).where( + SysNotice.notice_title == notice.notice_title, + SysNotice.notice_type == notice.notice_type, + SysNotice.notice_content == notice.notice_content, + ) + ) + ) + .scalars() .first() + ) return notice_info @classmethod - def get_notice_list(cls, db: Session, query_object: NoticeQueryModel): + async def get_notice_list(cls, db: AsyncSession, query_object: NoticePageQueryModel, is_page: bool = False): """ 根据查询参数获取通知公告列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 通知公告列表信息对象 """ - notice_list = db.query(SysNotice) \ - .filter(SysNotice.notice_title.like(f'%{query_object.notice_title}%') if query_object.notice_title else True, - SysNotice.update_by.like(f'%{query_object.update_by}%') if query_object.update_by else True, - SysNotice.notice_type == query_object.notice_type if query_object.notice_type else True, - SysNotice.create_time.between( - datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.create_time_start and query_object.create_time_end else True - ) \ - .distinct().all() - - return list_format_datetime(notice_list) + query = ( + select(SysNotice) + .where( + SysNotice.notice_title.like(f'%{query_object.notice_title}%') if query_object.notice_title else True, + SysNotice.create_by.like(f'%{query_object.create_by}%') if query_object.create_by else True, + SysNotice.notice_type == query_object.notice_type if query_object.notice_type else True, + SysNotice.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() + ) + notice_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + return notice_list @classmethod - def add_notice_dao(cls, db: Session, notice: NoticeModel): + async def add_notice_dao(cls, db: AsyncSession, notice: NoticeModel): """ 新增通知公告数据库操作 + :param db: orm对象 :param notice: 通知公告对象 :return: """ - db_notice = SysNotice(**notice.dict()) + db_notice = SysNotice(**notice.model_dump()) db.add(db_notice) - db.flush() + await db.flush() return db_notice @classmethod - def edit_notice_dao(cls, db: Session, notice: dict): + async def edit_notice_dao(cls, db: AsyncSession, notice: dict): """ 编辑通知公告数据库操作 + :param db: orm对象 :param notice: 需要更新的通知公告字典 :return: """ - db.query(SysNotice) \ - .filter(SysNotice.notice_id == notice.get('notice_id')) \ - .update(notice) + await db.execute(update(SysNotice), [notice]) @classmethod - def delete_notice_dao(cls, db: Session, notice: NoticeModel): + async def delete_notice_dao(cls, db: AsyncSession, notice: NoticeModel): """ 删除通知公告数据库操作 + :param db: orm对象 :param notice: 通知公告对象 :return: """ - db.query(SysNotice) \ - .filter(SysNotice.notice_id == notice.notice_id) \ - .delete() + await db.execute(delete(SysNotice).where(SysNotice.notice_id.in_([notice.notice_id]))) diff --git a/dash-fastapi-backend/module_admin/dao/post_dao.py b/dash-fastapi-backend/module_admin/dao/post_dao.py index 11fbdc1..7d90088 100644 --- a/dash-fastapi-backend/module_admin/dao/post_dao.py +++ b/dash-fastapi-backend/module_admin/dao/post_dao.py @@ -1,7 +1,9 @@ -from sqlalchemy.orm import Session +from sqlalchemy import delete, func, select, update +from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.post_do import SysPost -from module_admin.entity.vo.post_vo import PostModel -from utils.time_format_util import list_format_datetime +from module_admin.entity.do.user_do import SysUserPost +from module_admin.entity.vo.post_vo import PostModel, PostPageQueryModel +from utils.page_util import PageUtil class PostDao: @@ -10,115 +12,132 @@ class PostDao: """ @classmethod - def get_post_by_id(cls, db: Session, post_id: int): + async def get_post_by_id(cls, db: AsyncSession, post_id: int): """ 根据岗位id获取在用岗位详细信息 + :param db: orm对象 :param post_id: 岗位id :return: 在用岗位信息对象 """ - post_info = db.query(SysPost) \ - .filter(SysPost.post_id == post_id, - SysPost.status == 0) \ + post_info = ( + (await db.execute(select(SysPost).where(SysPost.post_id == post_id, SysPost.status == '0'))) + .scalars() .first() + ) return post_info @classmethod - def get_post_detail_by_id(cls, db: Session, post_id: int): + async def get_post_detail_by_id(cls, db: AsyncSession, post_id: int): """ 根据岗位id获取岗位详细信息 + :param db: orm对象 :param post_id: 岗位id :return: 岗位信息对象 """ - post_info = db.query(SysPost) \ - .filter(SysPost.post_id == post_id) \ - .first() + post_info = (await db.execute(select(SysPost).where(SysPost.post_id == post_id))).scalars().first() return post_info @classmethod - def get_post_detail_by_info(cls, db: Session, post: PostModel): + async def get_post_detail_by_info(cls, db: AsyncSession, post: PostModel): """ 根据岗位参数获取岗位信息 + :param db: orm对象 :param post: 岗位参数对象 :return: 岗位信息对象 """ - post_info = db.query(SysPost) \ - .filter(SysPost.post_name == post.post_name if post.post_name else True, - SysPost.post_code == post.post_code if post.post_code else True, - SysPost.post_sort == post.post_sort if post.post_sort else True) \ + post_info = ( + ( + await db.execute( + select(SysPost).where( + SysPost.post_name == post.post_name if post.post_name else True, + SysPost.post_code == post.post_code if post.post_code else True, + SysPost.post_sort == post.post_sort if post.post_sort else True, + ) + ) + ) + .scalars() .first() + ) return post_info @classmethod - def get_post_select_option_dao(cls, db: Session): - """ - 获取所有在用岗位信息 - :param db: orm对象 - :return: 在用岗位信息列表 - """ - post_info = db.query(SysPost) \ - .filter(SysPost.status == 0) \ - .all() - - return post_info - - @classmethod - def get_post_list(cls, db: Session, query_object: PostModel): + async def get_post_list(cls, db: AsyncSession, query_object: PostPageQueryModel, is_page: bool = False): """ 根据查询参数获取岗位列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 岗位列表信息对象 """ - post_list = db.query(SysPost) \ - .filter(SysPost.post_code.like(f'%{query_object.post_code}%') if query_object.post_code else True, - SysPost.post_name.like(f'%{query_object.post_name}%') if query_object.post_name else True, - SysPost.status == query_object.status if query_object.status else True - ) \ - .order_by(SysPost.post_sort) \ - .distinct().all() + query = ( + select(SysPost) + .where( + SysPost.post_code.like(f'%{query_object.post_code}%') if query_object.post_code else True, + SysPost.post_name.like(f'%{query_object.post_name}%') if query_object.post_name else True, + SysPost.status == query_object.status if query_object.status else True, + ) + .order_by(SysPost.post_sort) + .distinct() + ) + post_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return list_format_datetime(post_list) + return post_list @classmethod - def add_post_dao(cls, db: Session, post: PostModel): + async def add_post_dao(cls, db: AsyncSession, post: PostModel): """ 新增岗位数据库操作 + :param db: orm对象 :param post: 岗位对象 :return: """ - db_post = SysPost(**post.dict()) + db_post = SysPost(**post.model_dump()) db.add(db_post) - db.flush() + await db.flush() return db_post @classmethod - def edit_post_dao(cls, db: Session, post: dict): + async def edit_post_dao(cls, db: AsyncSession, post: dict): """ 编辑岗位数据库操作 + :param db: orm对象 :param post: 需要更新的岗位字典 :return: """ - db.query(SysPost) \ - .filter(SysPost.post_id == post.get('post_id')) \ - .update(post) + await db.execute(update(SysPost), [post]) @classmethod - def delete_post_dao(cls, db: Session, post: PostModel): + async def delete_post_dao(cls, db: AsyncSession, post: PostModel): """ 删除岗位数据库操作 + :param db: orm对象 :param post: 岗位对象 :return: """ - db.query(SysPost) \ - .filter(SysPost.post_id == post.post_id) \ - .delete() + await db.execute(delete(SysPost).where(SysPost.post_id.in_([post.post_id]))) + + @classmethod + async def count_user_post_dao(cls, db: AsyncSession, post_id: int): + """ + 根据岗位id查询岗位关联的用户数量 + + :param db: orm对象 + :param post_id: 岗位id + :return: 岗位关联的用户数量 + """ + user_post_count = ( + await db.execute(select(func.count('*')).select_from(SysUserPost).where(SysUserPost.post_id == post_id)) + ).scalar() + + return user_post_count diff --git a/dash-fastapi-backend/module_admin/dao/role_dao.py b/dash-fastapi-backend/module_admin/dao/role_dao.py index 7e2624f..534c7f3 100644 --- a/dash-fastapi-backend/module_admin/dao/role_dao.py +++ b/dash-fastapi-backend/module_admin/dao/role_dao.py @@ -1,11 +1,12 @@ -from sqlalchemy import and_, desc -from sqlalchemy.orm import Session -from module_admin.entity.do.role_do import SysRole, SysRoleMenu, SysRoleDept +from datetime import datetime, time +from sqlalchemy import and_, delete, desc, func, or_, select, update # noqa: F401 +from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.dept_do import SysDept from module_admin.entity.do.menu_do import SysMenu -from module_admin.entity.vo.role_vo import RoleModel, RoleMenuModel, RoleDeptModel, RoleQueryModel, RoleDetailModel -from utils.time_format_util import list_format_datetime, object_format_datetime -from datetime import datetime, time +from module_admin.entity.do.role_do import SysRole, SysRoleMenu, SysRoleDept +from module_admin.entity.do.user_do import SysUser, SysUserRole +from module_admin.entity.vo.role_vo import RoleDeptModel, RoleMenuModel, RoleModel, RolePageQueryModel +from utils.page_util import PageUtil class RoleDao: @@ -14,181 +15,295 @@ class RoleDao: """ @classmethod - def get_role_by_name(cls, db: Session, role_name: str): + async def get_role_by_name(cls, db: AsyncSession, role_name: str): """ 根据角色名获取在用角色信息 + :param db: orm对象 :param role_name: 角色名 :return: 当前角色名的角色信息对象 """ - query_role_info = db.query(SysRole) \ - .filter(SysRole.status == 0, SysRole.del_flag == 0, SysRole.role_name == role_name) \ - .order_by(desc(SysRole.create_time)).distinct().first() + query_role_info = ( + ( + await db.execute( + select(SysRole) + .where(SysRole.status == '0', SysRole.del_flag == '0', SysRole.role_name == role_name) + .order_by(desc(SysRole.create_time)) + .distinct() + ) + ) + .scalars() + .first() + ) return query_role_info @classmethod - def get_role_by_info(cls, db: Session, role: RoleModel): + async def get_role_by_info(cls, db: AsyncSession, role: RoleModel): """ 根据角色参数获取角色信息 + :param db: orm对象 :param role: 角色参数 :return: 当前角色参数的角色信息对象 """ - query_role_info = db.query(SysRole) \ - .filter(SysRole.del_flag == 0, - SysRole.role_name == role.role_name if role.role_name else True, - SysRole.role_key == role.role_key if role.role_key else True) \ - .order_by(desc(SysRole.create_time)).distinct().first() + query_role_info = ( + ( + await db.execute( + select(SysRole) + .where( + SysRole.del_flag == '0', + SysRole.role_name == role.role_name if role.role_name else True, + SysRole.role_key == role.role_key if role.role_key else True, + ) + .order_by(desc(SysRole.create_time)) + .distinct() + ) + ) + .scalars() + .first() + ) return query_role_info @classmethod - def get_role_by_id(cls, db: Session, role_id: int): + async def get_role_by_id(cls, db: AsyncSession, role_id: int): """ 根据角色id获取在用角色信息 + :param db: orm对象 :param role_id: 角色id :return: 当前角色id的角色信息对象 """ - role_info = db.query(SysRole) \ - .filter(SysRole.role_id == role_id, - SysRole.status == 0, - SysRole.del_flag == 0) \ + role_info = ( + ( + await db.execute( + select(SysRole).where(SysRole.role_id == role_id, SysRole.status == '0', SysRole.del_flag == '0') + ) + ) + .scalars() .first() + ) return role_info @classmethod - def get_role_detail_by_id(cls, db: Session, role_id: int): + async def get_role_detail_by_id(cls, db: AsyncSession, role_id: int): """ 根据role_id获取角色详细信息 + :param db: orm对象 :param role_id: 角色id :return: 当前role_id的角色信息对象 """ - query_role_basic_info = db.query(SysRole) \ - .filter(SysRole.del_flag == 0, SysRole.role_id == role_id) \ - .distinct().first() - query_role_menu_info = db.query(SysMenu).select_from(SysRole) \ - .filter(SysRole.del_flag == 0, SysRole.role_id == role_id) \ - .outerjoin(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id) \ - .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == 0)) \ - .distinct().all() - query_role_dept_info = db.query(SysDept).select_from(SysRole) \ - .filter(SysRole.del_flag == 0, SysRole.role_id == role_id) \ - .outerjoin(SysRoleDept, SysRole.role_id == SysRoleDept.role_id) \ - .join(SysDept, and_(SysRoleDept.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \ - .distinct().all() - results = dict( - role=object_format_datetime(query_role_basic_info), - menu=list_format_datetime(query_role_menu_info), - dept=list_format_datetime(query_role_dept_info), + query_role_info = ( + (await db.execute(select(SysRole).where(SysRole.del_flag == '0', SysRole.role_id == role_id).distinct())) + .scalars() + .first() ) - return RoleDetailModel(**results) + return query_role_info @classmethod - def get_role_select_option_dao(cls, db: Session): + async def get_role_select_option_dao(cls, db: AsyncSession): """ 获取编辑页面对应的在用角色列表信息 + :param db: orm对象 :return: 角色列表信息 """ - role_info = db.query(SysRole) \ - .filter(SysRole.role_id != 1, SysRole.status == 0, SysRole.del_flag == 0) \ + role_info = ( + ( + await db.execute( + select(SysRole).where(SysRole.role_id != 1, SysRole.status == '0', SysRole.del_flag == '0') + ) + ) + .scalars() .all() + ) return role_info @classmethod - def get_role_list(cls, db: Session, query_object: RoleQueryModel): + async def get_role_list( + cls, db: AsyncSession, query_object: RolePageQueryModel, data_scope_sql: str, is_page: bool = False + ): """ 根据查询参数获取角色列表信息 + :param db: orm对象 :param query_object: 查询参数对象 + :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 :return: 角色列表信息对象 """ - role_list = db.query(SysRole) \ - .filter(SysRole.del_flag == 0, - SysRole.role_name.like(f'%{query_object.role_name}%') if query_object.role_name else True, - SysRole.role_key.like(f'%{query_object.role_key}%') if query_object.role_key else True, - SysRole.status == query_object.status if query_object.status else True, - SysRole.create_time.between( - datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.create_time_start and query_object.create_time_end else True - ) \ - .order_by(SysRole.role_sort) \ - .distinct().all() + query = ( + select(SysRole) + .join(SysUserRole, SysUserRole.role_id == SysRole.role_id, isouter=True) + .join(SysUser, SysUser.user_id == SysUserRole.user_id, isouter=True) + .join(SysDept, SysDept.dept_id == SysUser.dept_id, isouter=True) + .where( + SysRole.del_flag == '0', + SysRole.role_id == query_object.role_id if query_object.role_id is not None else True, + SysRole.role_name.like(f'%{query_object.role_name}%') if query_object.role_name else True, + SysRole.role_key.like(f'%{query_object.role_key}%') if query_object.role_key else True, + SysRole.status == query_object.status if query_object.status else True, + SysRole.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + eval(data_scope_sql), + ) + .order_by(SysRole.role_sort) + .distinct() + ) + role_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return list_format_datetime(role_list) + return role_list @classmethod - def add_role_dao(cls, db: Session, role: RoleModel): + async def add_role_dao(cls, db: AsyncSession, role: RoleModel): """ 新增角色数据库操作 + :param db: orm对象 :param role: 角色对象 :return: """ - db_role = SysRole(**role.dict()) + db_role = SysRole(**role.model_dump(exclude={'admin'})) db.add(db_role) - db.flush() + await db.flush() return db_role @classmethod - def edit_role_dao(cls, db: Session, role: dict): + async def edit_role_dao(cls, db: AsyncSession, role: dict): """ 编辑角色数据库操作 + :param db: orm对象 :param role: 需要更新的角色字典 :return: """ - db.query(SysRole) \ - .filter(SysRole.role_id == role.get('role_id')) \ - .update(role) + await db.execute(update(SysRole), [role]) @classmethod - def delete_role_dao(cls, db: Session, role: RoleModel): + async def delete_role_dao(cls, db: AsyncSession, role: RoleModel): """ 删除角色数据库操作 + :param db: orm对象 :param role: 角色对象 :return: """ - db.query(SysRole) \ - .filter(SysRole.role_id == role.role_id) \ - .update({SysRole.del_flag: '2', SysRole.update_by: role.update_by, SysRole.update_time: role.update_time}) + await db.execute( + update(SysRole) + .where(SysRole.role_id == role.role_id) + .values(del_flag='2', update_by=role.update_by, update_time=role.update_time) + ) @classmethod - def add_role_menu_dao(cls, db: Session, role_menu: RoleMenuModel): + async def get_role_menu_dao(cls, db: AsyncSession, role: RoleModel): + """ + 根据角色id获取角色菜单关联列表信息 + + :param db: orm对象 + :param role: 角色对象 + :return: 角色菜单关联列表信息 + """ + role_menu_query_all = ( + ( + await db.execute( + select(SysMenu) + .join(SysRoleMenu, SysRoleMenu.menu_id == SysMenu.menu_id) + .where( + SysRoleMenu.role_id == role.role_id, + ~SysMenu.menu_id.in_( + select(SysMenu.parent_id) + .select_from(SysMenu) + .join( + SysRoleMenu, + and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysRoleMenu.role_id == role.role_id), + ) + ) + if role.menu_check_strictly + else True, + ) + .order_by(SysMenu.parent_id, SysMenu.order_num) + ) + ) + .scalars() + .all() + ) + + return role_menu_query_all + + @classmethod + async def add_role_menu_dao(cls, db: AsyncSession, role_menu: RoleMenuModel): """ 新增角色菜单关联信息数据库操作 + :param db: orm对象 :param role_menu: 用户角色菜单关联对象 :return: """ - db_role_menu = SysRoleMenu(**role_menu.dict()) + db_role_menu = SysRoleMenu(**role_menu.model_dump()) db.add(db_role_menu) @classmethod - def delete_role_menu_dao(cls, db: Session, role_menu: RoleMenuModel): + async def delete_role_menu_dao(cls, db: AsyncSession, role_menu: RoleMenuModel): """ 删除角色菜单关联信息数据库操作 + :param db: orm对象 :param role_menu: 角色菜单关联对象 :return: """ - db.query(SysRoleMenu) \ - .filter(SysRoleMenu.role_id == role_menu.role_id) \ - .delete() + await db.execute(delete(SysRoleMenu).where(SysRoleMenu.role_id.in_([role_menu.role_id]))) @classmethod - def add_role_dept_dao(cls, db: Session, role_dept: RoleDeptModel): + async def get_role_dept_dao(cls, db: AsyncSession, role: RoleModel): + """ + 根据角色id获取角色部门关联列表信息 + + :param db: orm对象 + :param role: 角色对象 + :return: 角色部门关联列表信息 + """ + role_dept_query_all = ( + ( + await db.execute( + select(SysDept) + .join(SysRoleDept, SysRoleDept.dept_id == SysDept.dept_id) + .where( + SysRoleDept.role_id == role.role_id, + ~SysDept.dept_id.in_( + select(SysDept.parent_id) + .select_from(SysDept) + .join( + SysRoleDept, + and_(SysRoleDept.dept_id == SysDept.dept_id, SysRoleDept.role_id == role.role_id), + ) + ) + if role.dept_check_strictly + else True, + ) + .order_by(SysDept.parent_id, SysDept.order_num) + ) + ) + .scalars() + .all() + ) + + return role_dept_query_all + + @classmethod + async def add_role_dept_dao(cls, db: AsyncSession, role_dept: RoleDeptModel): """ 新增角色部门关联信息数据库操作 + :param db: orm对象 :param role_dept: 用户角色部门关联对象 :return: @@ -197,13 +312,27 @@ class RoleDao: db.add(db_role_dept) @classmethod - def delete_role_dept_dao(cls, db: Session, role_dept: RoleDeptModel): + async def delete_role_dept_dao(cls, db: AsyncSession, role_dept: RoleDeptModel): """ 删除角色部门关联信息数据库操作 + :param db: orm对象 :param role_dept: 角色部门关联对象 :return: """ - db.query(SysRoleDept) \ - .filter(SysRoleDept.role_id == role_dept.role_id) \ - .delete() + await db.execute(delete(SysRoleDept).where(SysRoleDept.role_id.in_([role_dept.role_id]))) + + @classmethod + async def count_user_role_dao(cls, db: AsyncSession, role_id: int): + """ + 根据角色id查询角色关联用户数量 + + :param db: orm对象 + :param role_id: 角色id + :return: 角色关联用户数量 + """ + user_count = ( + await db.execute(select(func.count('*')).select_from(SysUserRole).where(SysUserRole.role_id == role_id)) + ).scalar() + + return user_count diff --git a/dash-fastapi-backend/module_admin/dao/user_dao.py b/dash-fastapi-backend/module_admin/dao/user_dao.py index c68b5db..52a088c 100644 --- a/dash-fastapi-backend/module_admin/dao/user_dao.py +++ b/dash-fastapi-backend/module_admin/dao/user_dao.py @@ -1,14 +1,20 @@ -from sqlalchemy import and_, or_, desc, func -from sqlalchemy.orm import Session -from module_admin.entity.do.user_do import SysUser, SysUserRole, SysUserPost -from module_admin.entity.do.role_do import SysRole, SysRoleMenu, SysRoleDept +from datetime import datetime, time +from sqlalchemy import and_, delete, desc, func, or_, select, update +from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.dept_do import SysDept -from module_admin.entity.do.post_do import SysPost from module_admin.entity.do.menu_do import SysMenu -from module_admin.entity.vo.user_vo import UserModel, UserRoleModel, UserPostModel, CurrentUserInfo, UserQueryModel, UserRoleQueryModel -from utils.time_format_util import object_format_datetime, list_format_datetime, format_datetime_dict_list -from datetime import datetime, time -from typing import Union, List +from module_admin.entity.do.post_do import SysPost +from module_admin.entity.do.role_do import SysRole, SysRoleDept, SysRoleMenu # noqa: F401 +from module_admin.entity.do.user_do import SysUser, SysUserPost, SysUserRole +from module_admin.entity.vo.user_vo import ( + UserModel, + UserPageQueryModel, + UserPostModel, + UserRoleModel, + UserRolePageQueryModel, + UserRoleQueryModel, +) +from utils.page_util import PageUtil class UserDao: @@ -17,381 +23,545 @@ class UserDao: """ @classmethod - def get_user_by_name(cls, db: Session, user_name: str): + async def get_user_by_name(cls, db: AsyncSession, user_name: str): """ 根据用户名获取用户信息 + :param db: orm对象 :param user_name: 用户名 :return: 当前用户名的用户信息对象 """ - query_user_info = db.query(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_name == user_name) \ - .order_by(desc(SysUser.create_time)).distinct().first() + query_user_info = ( + ( + await db.execute( + select(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_name == user_name) + .order_by(desc(SysUser.create_time)) + .distinct() + ) + ) + .scalars() + .first() + ) return query_user_info @classmethod - def get_user_by_info(cls, db: Session, user: UserModel): + async def get_user_by_info(cls, db: AsyncSession, user: UserModel): """ 根据用户参数获取用户信息 + :param db: orm对象 :param user: 用户参数 :return: 当前用户参数的用户信息对象 """ - query_user_info = db.query(SysUser) \ - .filter(SysUser.del_flag == 0, - SysUser.user_name == user.user_name) \ - .order_by(desc(SysUser.create_time)).distinct().first() + query_user_info = ( + ( + await db.execute( + select(SysUser) + .where( + SysUser.del_flag == '0', + SysUser.user_name == user.user_name if user.user_name else True, + SysUser.phonenumber == user.phonenumber if user.phonenumber else True, + SysUser.email == user.email if user.email else True, + ) + .order_by(desc(SysUser.create_time)) + .distinct() + ) + ) + .scalars() + .first() + ) return query_user_info @classmethod - def get_user_by_id(cls, db: Session, user_id: int): + async def get_user_by_id(cls, db: AsyncSession, user_id: int): """ 根据user_id获取用户信息 + :param db: orm对象 :param user_id: 用户id :return: 当前user_id的用户信息对象 """ - query_user_basic_info = db.query(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .distinct().first() - query_user_dept_info = db.query(SysDept).select_from(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .join(SysDept, and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \ - .distinct().first() - query_user_role_info = db.query(SysRole).select_from(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserRole, SysUser.user_id == SysUserRole.user_id) \ - .join(SysRole, and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == 0, SysRole.del_flag == 0)) \ - .distinct().all() - query_user_post_info = db.query(SysPost).select_from(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserPost, SysUser.user_id == SysUserPost.user_id) \ - .join(SysPost, and_(SysUserPost.post_id == SysPost.post_id, SysPost.status == 0)) \ - .distinct().all() + query_user_basic_info = ( + ( + await db.execute( + select(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) + .distinct() + ) + ) + .scalars() + .first() + ) + query_user_dept_info = ( + ( + await db.execute( + select(SysDept) + .select_from(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) + .join( + SysDept, + and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == '0', SysDept.del_flag == '0'), + ) + .distinct() + ) + ) + .scalars() + .first() + ) + query_user_role_info = ( + ( + await db.execute( + select(SysRole) + .select_from(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) + .join( + SysRole, + and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0'), + ) + .distinct() + ) + ) + .scalars() + .all() + ) + query_user_post_info = ( + ( + await db.execute( + select(SysPost) + .select_from(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserPost, SysUser.user_id == SysUserPost.user_id, isouter=True) + .join(SysPost, and_(SysUserPost.post_id == SysPost.post_id, SysPost.status == '0')) + .distinct() + ) + ) + .scalars() + .all() + ) role_id_list = [item.role_id for item in query_user_role_info] if 1 in role_id_list: - query_user_menu_info = db.query(SysMenu) \ - .filter(SysMenu.status == 0) \ - .distinct().all() + query_user_menu_info = ( + (await db.execute(select(SysMenu).where(SysMenu.status == '0').distinct())).scalars().all() + ) else: - query_user_menu_info = db.query(SysMenu).select_from(SysUser) \ - .filter(SysUser.status == 0, SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserRole, SysUser.user_id == SysUserRole.user_id) \ - .outerjoin(SysRole, and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == 0, SysRole.del_flag == 0)) \ - .outerjoin(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id) \ - .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == 0)) \ - .order_by(SysMenu.order_num) \ - .distinct().all() + query_user_menu_info = ( + ( + await db.execute( + select(SysMenu) + .select_from(SysUser) + .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) + .join( + SysRole, + and_( + SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0' + ), + isouter=True, + ) + .join(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id, isouter=True) + .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == '0')) + .order_by(SysMenu.order_num) + .distinct() + ) + ) + .scalars() + .all() + ) + results = dict( - user_basic_info=object_format_datetime(query_user_basic_info), - user_dept_info=object_format_datetime(query_user_dept_info), - user_role_info=list_format_datetime(query_user_role_info), - user_post_info=list_format_datetime(query_user_post_info), - user_menu_info=list_format_datetime(query_user_menu_info) + user_basic_info=query_user_basic_info, + user_dept_info=query_user_dept_info, + user_role_info=query_user_role_info, + user_post_info=query_user_post_info, + user_menu_info=query_user_menu_info, ) - return CurrentUserInfo(**results) + return results @classmethod - def get_user_detail_by_id(cls, db: Session, user_id: int): + async def get_user_detail_by_id(cls, db: AsyncSession, user_id: int): """ 根据user_id获取用户详细信息 + :param db: orm对象 :param user_id: 用户id :return: 当前user_id的用户信息对象 """ - query_user_basic_info = db.query(SysUser) \ - .filter(SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .distinct().first() - query_user_dept_info = db.query(SysDept).select_from(SysUser) \ - .filter(SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .join(SysDept, and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \ - .distinct().first() - query_user_role_info = db.query(SysRole).select_from(SysUser) \ - .filter(SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserRole, SysUser.user_id == SysUserRole.user_id) \ - .join(SysRole, and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == 0, SysRole.del_flag == 0)) \ - .distinct().all() - query_user_post_info = db.query(SysPost).select_from(SysUser) \ - .filter(SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserPost, SysUser.user_id == SysUserPost.user_id) \ - .join(SysPost, and_(SysUserPost.post_id == SysPost.post_id, SysPost.status == 0)) \ - .distinct().all() - query_user_menu_info = db.query(SysMenu).select_from(SysUser) \ - .filter(SysUser.del_flag == 0, SysUser.user_id == user_id) \ - .outerjoin(SysUserRole, SysUser.user_id == SysUserRole.user_id) \ - .outerjoin(SysRole, and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == 0, SysRole.del_flag == 0)) \ - .outerjoin(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id) \ - .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == 0)) \ - .distinct().all() + query_user_basic_info = ( + (await db.execute(select(SysUser).where(SysUser.del_flag == '0', SysUser.user_id == user_id).distinct())) + .scalars() + .first() + ) + query_user_dept_info = ( + ( + await db.execute( + select(SysDept) + .select_from(SysUser) + .where(SysUser.del_flag == '0', SysUser.user_id == user_id) + .join( + SysDept, + and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == '0', SysDept.del_flag == '0'), + ) + .distinct() + ) + ) + .scalars() + .first() + ) + query_user_role_info = ( + ( + await db.execute( + select(SysRole) + .select_from(SysUser) + .where(SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) + .join( + SysRole, + and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0'), + ) + .distinct() + ) + ) + .scalars() + .all() + ) + query_user_post_info = ( + ( + await db.execute( + select(SysPost) + .select_from(SysUser) + .where(SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserPost, SysUser.user_id == SysUserPost.user_id, isouter=True) + .join(SysPost, and_(SysUserPost.post_id == SysPost.post_id, SysPost.status == '0')) + .distinct() + ) + ) + .scalars() + .all() + ) + query_user_menu_info = ( + ( + await db.execute( + select(SysMenu) + .select_from(SysUser) + .where(SysUser.del_flag == '0', SysUser.user_id == user_id) + .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) + .join( + SysRole, + and_(SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0'), + isouter=True, + ) + .join(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id, isouter=True) + .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == '0')) + .distinct() + ) + ) + .scalars() + .all() + ) results = dict( - user_basic_info=object_format_datetime(query_user_basic_info), - user_dept_info=object_format_datetime(query_user_dept_info), - user_role_info=list_format_datetime(query_user_role_info), - user_post_info=list_format_datetime(query_user_post_info), - user_menu_info=list_format_datetime(query_user_menu_info) + user_basic_info=query_user_basic_info, + user_dept_info=query_user_dept_info, + user_role_info=query_user_role_info, + user_post_info=query_user_post_info, + user_menu_info=query_user_menu_info, ) - return CurrentUserInfo(**results) + return results @classmethod - def get_user_list(cls, db: Session, query_object: UserQueryModel, data_scope_sql: str): + async def get_user_list( + cls, db: AsyncSession, query_object: UserPageQueryModel, data_scope_sql: str, is_page: bool = False + ): """ 根据查询参数获取用户列表信息 + :param db: orm对象 :param query_object: 查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 :return: 用户列表信息对象 """ - user_list = db.query(SysUser, SysDept) \ - .filter(SysUser.del_flag == 0, - or_(SysUser.dept_id == query_object.dept_id, SysUser.dept_id.in_( - db.query(SysDept.dept_id).filter(func.find_in_set(query_object.dept_id, SysDept.ancestors)) - )) if query_object.dept_id else True, - SysUser.user_name.like(f'%{query_object.user_name}%') if query_object.user_name else True, - SysUser.nick_name.like(f'%{query_object.nick_name}%') if query_object.nick_name else True, - SysUser.email.like(f'%{query_object.email}%') if query_object.email else True, - SysUser.phonenumber.like(f'%{query_object.phonenumber}%') if query_object.phonenumber else True, - SysUser.status == query_object.status if query_object.status else True, - SysUser.sex == query_object.sex if query_object.sex else True, - SysUser.create_time.between( - datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.create_time_start and query_object.create_time_end else True, - eval(data_scope_sql) - ) \ - .outerjoin(SysDept, and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \ - .distinct().all() - - result_list: List[Union[dict, None]] = [] - if user_list: - for item in user_list: - obj = dict( - user_id=item[0].user_id, - dept_id=item[0].dept_id, - dept_name=item[1].dept_name if item[1] else '', - user_name=item[0].user_name, - nick_name=item[0].nick_name, - user_type=item[0].user_type, - email=item[0].email, - phonenumber=item[0].phonenumber, - sex=item[0].sex, - avatar=item[0].avatar, - status=item[0].status, - del_flag=item[0].del_flag, - login_ip=item[0].login_ip, - login_date=item[0].login_date, - create_by=item[0].create_by, - create_time=item[0].create_time, - update_by=item[0].update_by, - update_time=item[0].update_time, - remark=item[0].remark + query = ( + select(SysUser, SysDept) + .where( + SysUser.del_flag == '0', + or_( + SysUser.dept_id == query_object.dept_id, + SysUser.dept_id.in_( + select(SysDept.dept_id).where(func.find_in_set(query_object.dept_id, SysDept.ancestors)) + ), + ) + if query_object.dept_id + else True, + SysUser.user_id == query_object.user_id if query_object.user_id is not None else True, + SysUser.user_name.like(f'%{query_object.user_name}%') if query_object.user_name else True, + SysUser.nick_name.like(f'%{query_object.nick_name}%') if query_object.nick_name else True, + SysUser.email.like(f'%{query_object.email}%') if query_object.email else True, + SysUser.phonenumber.like(f'%{query_object.phonenumber}%') if query_object.phonenumber else True, + SysUser.status == query_object.status if query_object.status else True, + SysUser.sex == query_object.sex if query_object.sex else True, + SysUser.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), ) - result_list.append(obj) + if query_object.begin_time and query_object.end_time + else True, + eval(data_scope_sql), + ) + .join( + SysDept, + and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == '0', SysDept.del_flag == '0'), + isouter=True, + ) + .distinct() + ) + user_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return format_datetime_dict_list(result_list) + return user_list @classmethod - def add_user_dao(cls, db: Session, user: UserModel): + async def add_user_dao(cls, db: AsyncSession, user: UserModel): """ 新增用户数据库操作 + :param db: orm对象 :param user: 用户对象 :return: 新增校验结果 """ - db_user = SysUser(**user.dict()) + db_user = SysUser(**user.model_dump(exclude={'admin'})) db.add(db_user) - db.flush() + await db.flush() return db_user @classmethod - def edit_user_dao(cls, db: Session, user: dict): + async def edit_user_dao(cls, db: AsyncSession, user: dict): """ 编辑用户数据库操作 + :param db: orm对象 :param user: 需要更新的用户字典 :return: 编辑校验结果 """ - db.query(SysUser) \ - .filter(SysUser.user_id == user.get('user_id')) \ - .update(user) + await db.execute(update(SysUser), [user]) @classmethod - def delete_user_dao(cls, db: Session, user: UserModel): + async def delete_user_dao(cls, db: AsyncSession, user: UserModel): """ 删除用户数据库操作 + :param db: orm对象 :param user: 用户对象 :return: """ - db.query(SysUser) \ - .filter(SysUser.user_id == user.user_id) \ - .update({SysUser.del_flag: '2', SysUser.update_by: user.update_by, SysUser.update_time: user.update_time}) + await db.execute( + update(SysUser) + .where(SysUser.user_id == user.user_id) + .values(del_flag='2', update_by=user.update_by, update_time=user.update_time) + ) @classmethod - def get_user_role_allocated_list_by_user_id(cls, db: Session, query_object: UserRoleQueryModel): + async def get_user_role_allocated_list_by_user_id(cls, db: AsyncSession, query_object: UserRoleQueryModel): """ 根据用户id获取用户已分配的角色列表信息数据库操作 + :param db: orm对象 :param query_object: 用户角色查询对象 :return: 用户已分配的角色列表信息 """ - allocated_role_list = db.query(SysRole) \ - .filter( - SysRole.del_flag == 0, - SysRole.role_id != 1, - SysRole.role_name == query_object.role_name if query_object.role_name else True, - SysRole.role_key == query_object.role_key if query_object.role_key else True, - SysRole.role_id.in_( - db.query(SysUserRole.role_id).filter(SysUserRole.user_id == query_object.user_id) - ) - ).distinct().all() - - return list_format_datetime(allocated_role_list) - - @classmethod - def get_user_role_unallocated_list_by_user_id(cls, db: Session, query_object: UserRoleQueryModel): - """ - 根据用户id获取用户未分配的角色列表信息数据库操作 - :param db: orm对象 - :param query_object: 用户角色查询对象 - :return: 用户未分配的角色列表信息 - """ - unallocated_role_list = db.query(SysRole) \ - .filter( - SysRole.del_flag == 0, - SysRole.role_id != 1, - SysRole.role_name == query_object.role_name if query_object.role_name else True, - SysRole.role_key == query_object.role_key if query_object.role_key else True, - ~SysRole.role_id.in_( - db.query(SysUserRole.role_id).filter(SysUserRole.user_id == query_object.user_id) + allocated_role_list = ( + ( + await db.execute( + select(SysRole) + .where( + SysRole.del_flag == '0', + SysRole.role_id != 1, + SysRole.role_name == query_object.role_name if query_object.role_name else True, + SysRole.role_key == query_object.role_key if query_object.role_key else True, + SysRole.role_id.in_( + select(SysUserRole.role_id).where(SysUserRole.user_id == query_object.user_id) + ), + ) + .distinct() + ) ) - ).distinct().all() + .scalars() + .all() + ) - return list_format_datetime(unallocated_role_list) + return allocated_role_list @classmethod - def get_user_role_allocated_list_by_role_id(cls, db: Session, query_object: UserRoleQueryModel): + async def get_user_role_allocated_list_by_role_id( + cls, db: AsyncSession, query_object: UserRolePageQueryModel, data_scope_sql: str, is_page: bool = False + ): """ 根据角色id获取已分配的用户列表信息 + :param db: orm对象 :param query_object: 用户角色查询对象 + :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 :return: 角色已分配的用户列表信息 """ - allocated_user_list = db.query(SysUser) \ - .filter( - SysUser.del_flag == 0, - SysUser.user_id != 1, - SysUser.user_name == query_object.user_name if query_object.user_name else True, - SysUser.phonenumber == query_object.phonenumber if query_object.phonenumber else True, - SysUser.user_id.in_( - db.query(SysUserRole.user_id).filter(SysUserRole.role_id == query_object.role_id) + query = ( + select(SysUser) + .join(SysDept, SysDept.dept_id == SysUser.dept_id, isouter=True) + .join(SysUserRole, SysUserRole.user_id == SysUser.user_id, isouter=True) + .join(SysRole, SysRole.role_id == SysUserRole.role_id, isouter=True) + .where( + SysUser.del_flag == '0', + SysUser.user_name == query_object.user_name if query_object.user_name else True, + SysUser.phonenumber == query_object.phonenumber if query_object.phonenumber else True, + SysRole.role_id == query_object.role_id, + eval(data_scope_sql), ) - ).distinct().all() + .distinct() + ) + allocated_user_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - return list_format_datetime(allocated_user_list) + return allocated_user_list @classmethod - def get_user_role_unallocated_list_by_role_id(cls, db: Session, query_object: UserRoleQueryModel): + async def get_user_role_unallocated_list_by_role_id( + cls, db: AsyncSession, query_object: UserRolePageQueryModel, data_scope_sql: str, is_page: bool = False + ): """ 根据角色id获取未分配的用户列表信息 + :param db: orm对象 :param query_object: 用户角色查询对象 + :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 :return: 角色未分配的用户列表信息 """ - unallocated_user_list = db.query(SysUser) \ - .filter( - SysUser.del_flag == 0, - SysUser.user_id != 1, - SysUser.user_name == query_object.user_name if query_object.user_name else True, - SysUser.phonenumber == query_object.phonenumber if query_object.phonenumber else True, - ~SysUser.user_id.in_( - db.query(SysUserRole.user_id).filter(SysUserRole.role_id == query_object.role_id) + query = ( + select(SysUser) + .join(SysDept, SysDept.dept_id == SysUser.dept_id, isouter=True) + .join(SysUserRole, SysUserRole.user_id == SysUser.user_id, isouter=True) + .join(SysRole, SysRole.role_id == SysUserRole.role_id, isouter=True) + .where( + SysUser.del_flag == '0', + SysUser.user_name == query_object.user_name if query_object.user_name else True, + SysUser.phonenumber == query_object.phonenumber if query_object.phonenumber else True, + or_(SysRole.role_id != query_object.role_id, SysRole.role_id.is_(None)), + ~SysUser.user_id.in_( + select(SysUser.user_id) + .select_from(SysUser) + .join( + SysUserRole, + and_(SysUserRole.user_id == SysUser.user_id, SysUserRole.role_id == query_object.role_id), + ) + ), + eval(data_scope_sql), ) - ).distinct().all() + .distinct() + ) + unallocated_user_list = await PageUtil.paginate( + db, query, query_object.page_num, query_object.page_size, is_page + ) - return list_format_datetime(unallocated_user_list) + return unallocated_user_list @classmethod - def add_user_role_dao(cls, db: Session, user_role: UserRoleModel): + async def add_user_role_dao(cls, db: AsyncSession, user_role: UserRoleModel): """ 新增用户角色关联信息数据库操作 + :param db: orm对象 :param user_role: 用户角色关联对象 :return: """ - db_user_role = SysUserRole(**user_role.dict()) + db_user_role = SysUserRole(**user_role.model_dump()) db.add(db_user_role) @classmethod - def delete_user_role_dao(cls, db: Session, user_role: UserRoleModel): + async def delete_user_role_dao(cls, db: AsyncSession, user_role: UserRoleModel): """ 删除用户角色关联信息数据库操作 + :param db: orm对象 :param user_role: 用户角色关联对象 :return: """ - db.query(SysUserRole) \ - .filter(SysUserRole.user_id == user_role.user_id) \ - .delete() + await db.execute(delete(SysUserRole).where(SysUserRole.user_id.in_([user_role.user_id]))) @classmethod - def delete_user_role_by_user_and_role_dao(cls, db: Session, user_role: UserRoleModel): + async def delete_user_role_by_user_and_role_dao(cls, db: AsyncSession, user_role: UserRoleModel): """ 根据用户id及角色id删除用户角色关联信息数据库操作 + :param db: orm对象 :param user_role: 用户角色关联对象 :return: """ - db.query(SysUserRole) \ - .filter(SysUserRole.user_id == user_role.user_id, SysUserRole.role_id == user_role.role_id) \ - .delete() + await db.execute( + delete(SysUserRole).where( + SysUserRole.user_id == user_role.user_id if user_role.user_id else True, + SysUserRole.role_id == user_role.role_id if user_role.role_id else True, + ) + ) @classmethod - def get_user_role_detail(cls, db: Session, user_role: UserRoleModel): + async def get_user_role_detail(cls, db: AsyncSession, user_role: UserRoleModel): """ 根据用户角色关联获取用户角色关联详细信息 + :param db: orm对象 :param user_role: 用户角色关联对象 :return: 用户角色关联信息 """ - user_role_info = db.query(SysUserRole) \ - .filter(SysUserRole.user_id == user_role.user_id, SysUserRole.role_id == user_role.role_id) \ - .distinct().first() + user_role_info = ( + ( + await db.execute( + select(SysUserRole) + .where(SysUserRole.user_id == user_role.user_id, SysUserRole.role_id == user_role.role_id) + .distinct() + ) + ) + .scalars() + .first() + ) return user_role_info @classmethod - def add_user_post_dao(cls, db: Session, user_post: UserPostModel): + async def add_user_post_dao(cls, db: AsyncSession, user_post: UserPostModel): """ 新增用户岗位关联信息数据库操作 + :param db: orm对象 :param user_post: 用户岗位关联对象 :return: """ - db_user_post = SysUserPost(**user_post.dict()) + db_user_post = SysUserPost(**user_post.model_dump()) db.add(db_user_post) @classmethod - def delete_user_post_dao(cls, db: Session, user_post: UserPostModel): + async def delete_user_post_dao(cls, db: AsyncSession, user_post: UserPostModel): """ 删除用户岗位关联信息数据库操作 + :param db: orm对象 :param user_post: 用户岗位关联对象 :return: """ - db.query(SysUserPost) \ - .filter(SysUserPost.user_id == user_post.user_id) \ - .delete() + await db.execute(delete(SysUserPost).where(SysUserPost.user_id.in_([user_post.user_id]))) @classmethod - def get_user_dept_info(cls, db: Session, dept_id: int): - dept_basic_info = db.query(SysDept) \ - .filter(SysDept.dept_id == dept_id, - SysDept.status == 0, - SysDept.del_flag == 0) \ + async def get_user_dept_info(cls, db: AsyncSession, dept_id: int): + dept_basic_info = ( + ( + await db.execute( + select(SysDept).where(SysDept.dept_id == dept_id, SysDept.status == '0', SysDept.del_flag == '0') + ) + ) + .scalars() .first() + ) return dept_basic_info diff --git a/dash-fastapi-backend/module_admin/entity/do/config_do.py b/dash-fastapi-backend/module_admin/entity/do/config_do.py index 5fb6476..32af3b0 100644 --- a/dash-fastapi-backend/module_admin/entity/do/config_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/config_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysConfig(Base): """ 参数配置表 """ + __tablename__ = 'sys_config' config_id = Column(Integer, primary_key=True, autoincrement=True, comment='参数主键') @@ -18,4 +19,4 @@ class SysConfig(Base): create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间') update_by = Column(String(64), nullable=True, default='', comment='更新者') update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间') - remark = Column(String(500), nullable=True, default='', comment='备注') \ No newline at end of file + remark = Column(String(500), nullable=True, default='', comment='备注') diff --git a/dash-fastapi-backend/module_admin/entity/do/dept_do.py b/dash-fastapi-backend/module_admin/entity/do/dept_do.py index 0572927..96ac8da 100644 --- a/dash-fastapi-backend/module_admin/entity/do/dept_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/dept_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysDept(Base): """ 部门表 """ + __tablename__ = 'sys_dept' dept_id = Column(Integer, primary_key=True, autoincrement=True, comment='部门id') diff --git a/dash-fastapi-backend/module_admin/entity/do/dict_do.py b/dash-fastapi-backend/module_admin/entity/do/dict_do.py index a7d630e..061c88f 100644 --- a/dash-fastapi-backend/module_admin/entity/do/dict_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/dict_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime, UniqueConstraint -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String, UniqueConstraint +from config.database import Base class SysDictType(Base): """ 字典类型表 """ + __tablename__ = 'sys_dict_type' dict_id = Column(Integer, primary_key=True, autoincrement=True, comment='字典主键') @@ -19,15 +20,14 @@ class SysDictType(Base): update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间') remark = Column(String(500), nullable=True, default='', comment='备注') - __table_args__ = ( - UniqueConstraint('dict_type', name='uq_sys_dict_type_dict_type'), - ) + __table_args__ = (UniqueConstraint('dict_type', name='uq_sys_dict_type_dict_type'),) class SysDictData(Base): """ 字典数据表 """ + __tablename__ = 'sys_dict_data' dict_code = Column(Integer, primary_key=True, autoincrement=True, comment='字典编码') diff --git a/dash-fastapi-backend/module_admin/entity/do/job_do.py b/dash-fastapi-backend/module_admin/entity/do/job_do.py index aef168f..c6d671b 100644 --- a/dash-fastapi-backend/module_admin/entity/do/job_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/job_do.py @@ -1,24 +1,36 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysJob(Base): """ 定时任务调度表 """ + __tablename__ = 'sys_job' job_id = Column(Integer, primary_key=True, autoincrement=True, comment='任务ID') job_name = Column(String(64, collation='utf8_general_ci'), nullable=False, comment='任务名称') job_group = Column(String(64, collation='utf8_general_ci'), nullable=False, default='default', comment='任务组名') - job_executor = Column(String(64, collation='utf8_general_ci'), nullable=False, default='default', comment='任务执行器') + job_executor = Column( + String(64, collation='utf8_general_ci'), nullable=False, default='default', comment='任务执行器' + ) invoke_target = Column(String(500, collation='utf8_general_ci'), nullable=False, comment='调用目标字符串') job_args = Column(String(255, collation='utf8_general_ci'), nullable=True, comment='位置参数') job_kwargs = Column(String(255, collation='utf8_general_ci'), nullable=True, comment='关键字参数') - cron_expression = Column(String(255, collation='utf8_general_ci'), nullable=True, default='', comment='cron执行表达式') - misfire_policy = Column(String(20, collation='utf8_general_ci'), nullable=True, default='3', comment='计划执行错误策略(1立即执行 2执行一次 3放弃执行)') - concurrent = Column(String(1, collation='utf8_general_ci'), nullable=True, default='1', comment='是否并发执行(0允许 1禁止)') + cron_expression = Column( + String(255, collation='utf8_general_ci'), nullable=True, default='', comment='cron执行表达式' + ) + misfire_policy = Column( + String(20, collation='utf8_general_ci'), + nullable=True, + default='3', + comment='计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + ) + concurrent = Column( + String(1, collation='utf8_general_ci'), nullable=True, default='1', comment='是否并发执行(0允许 1禁止)' + ) status = Column(String(1, collation='utf8_general_ci'), nullable=True, default='0', comment='状态(0正常 1暂停)') create_by = Column(String(64, collation='utf8_general_ci'), nullable=True, default='', comment='创建者') create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间') @@ -31,17 +43,22 @@ class SysJobLog(Base): """ 定时任务调度日志表 """ + __tablename__ = 'sys_job_log' job_log_id = Column(Integer, primary_key=True, autoincrement=True, comment='任务日志ID') job_name = Column(String(64, collation='utf8_general_ci'), nullable=False, comment='任务名称') job_group = Column(String(64, collation='utf8_general_ci'), nullable=False, comment='任务组名') - job_executor = Column(String(64, collation='utf8_general_ci'), nullable=False, default='default', comment='任务执行器') + job_executor = Column( + String(64, collation='utf8_general_ci'), nullable=False, default='default', comment='任务执行器' + ) invoke_target = Column(String(500, collation='utf8_general_ci'), nullable=False, comment='调用目标字符串') job_args = Column(String(255, collation='utf8_general_ci'), nullable=True, comment='位置参数') job_kwargs = Column(String(255, collation='utf8_general_ci'), nullable=True, comment='关键字参数') job_trigger = Column(String(255, collation='utf8_general_ci'), nullable=True, comment='任务触发器') job_message = Column(String(500, collation='utf8_general_ci'), nullable=True, default='', comment='日志信息') - status = Column(String(1, collation='utf8_general_ci'), nullable=True, default='0', comment='执行状态(0正常 1失败)') + status = Column( + String(1, collation='utf8_general_ci'), nullable=True, default='0', comment='执行状态(0正常 1失败)' + ) exception_info = Column(String(2000, collation='utf8_general_ci'), nullable=True, default='', comment='异常信息') create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间') diff --git a/dash-fastapi-backend/module_admin/entity/do/log_do.py b/dash-fastapi-backend/module_admin/entity/do/log_do.py index 19d2b18..f915207 100644 --- a/dash-fastapi-backend/module_admin/entity/do/log_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/log_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime, Text, BigInteger, Index -from config.database import Base from datetime import datetime +from sqlalchemy import BigInteger, Column, DateTime, Index, Integer, String +from config.database import Base class SysLogininfor(Base): """ 系统访问记录 """ + __tablename__ = 'sys_logininfor' info_id = Column(Integer, primary_key=True, autoincrement=True, comment='访问ID') @@ -15,7 +16,9 @@ class SysLogininfor(Base): login_location = Column(String(255, collation='utf8_general_ci'), nullable=True, default='', comment='登录地点') browser = Column(String(50, collation='utf8_general_ci'), nullable=True, default='', comment='浏览器类型') os = Column(String(50, collation='utf8_general_ci'), nullable=True, default='', comment='操作系统') - status = Column(String(1, collation='utf8_general_ci'), nullable=True, default='0', comment='登录状态(0成功 1失败)') + status = Column( + String(1, collation='utf8_general_ci'), nullable=True, default='0', comment='登录状态(0成功 1失败)' + ) msg = Column(String(255, collation='utf8_general_ci'), nullable=True, default='', comment='提示消息') login_time = Column(DateTime, nullable=True, default=datetime.now(), comment='访问时间') @@ -27,6 +30,7 @@ class SysOperLog(Base): """ 操作日志记录 """ + __tablename__ = 'sys_oper_log' oper_id = Column(BigInteger, primary_key=True, autoincrement=True, comment='日志主键') diff --git a/dash-fastapi-backend/module_admin/entity/do/menu_do.py b/dash-fastapi-backend/module_admin/entity/do/menu_do.py index 8f98be4..d3ccffa 100644 --- a/dash-fastapi-backend/module_admin/entity/do/menu_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/menu_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysMenu(Base): """ 菜单权限表 """ + __tablename__ = 'sys_menu' menu_id = Column(Integer, primary_key=True, autoincrement=True, comment='菜单ID') @@ -16,6 +17,7 @@ class SysMenu(Base): path = Column(String(200), nullable=True, default='', comment='路由地址') component = Column(String(255), nullable=True, default=None, comment='组件路径') query = Column(String(255), nullable=True, default=None, comment='路由参数') + route_name = Column(String(50), nullable=True, default='', comment='路由名称') is_frame = Column(Integer, default=1, comment='是否为外链(0是 1否)') is_cache = Column(Integer, default=0, comment='是否缓存(0缓存 1不缓存)') menu_type = Column(String(1), nullable=True, default='', comment='菜单类型(M目录 C菜单 F按钮)') diff --git a/dash-fastapi-backend/module_admin/entity/do/notice_do.py b/dash-fastapi-backend/module_admin/entity/do/notice_do.py index 3856658..125a40a 100644 --- a/dash-fastapi-backend/module_admin/entity/do/notice_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/notice_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime, LargeBinary -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, LargeBinary, String +from config.database import Base class SysNotice(Base): """ 通知公告表 """ + __tablename__ = 'sys_notice' notice_id = Column(Integer, primary_key=True, autoincrement=True, comment='公告ID') diff --git a/dash-fastapi-backend/module_admin/entity/do/post_do.py b/dash-fastapi-backend/module_admin/entity/do/post_do.py index c6b189b..54ab38d 100644 --- a/dash-fastapi-backend/module_admin/entity/do/post_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/post_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysPost(Base): """ 岗位信息表 """ + __tablename__ = 'sys_post' post_id = Column(Integer, primary_key=True, autoincrement=True, comment='岗位ID') diff --git a/dash-fastapi-backend/module_admin/entity/do/role_do.py b/dash-fastapi-backend/module_admin/entity/do/role_do.py index db29244..fc2e34d 100644 --- a/dash-fastapi-backend/module_admin/entity/do/role_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/role_do.py @@ -1,19 +1,24 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysRole(Base): """ 角色信息表 """ + __tablename__ = 'sys_role' role_id = Column(Integer, primary_key=True, autoincrement=True, comment='角色ID') role_name = Column(String(30, collation='utf8_general_ci'), nullable=False, comment='角色名称') role_key = Column(String(100, collation='utf8_general_ci'), nullable=False, comment='角色权限字符串') role_sort = Column(Integer, nullable=False, comment='显示顺序') - data_scope = Column(String(1, collation='utf8_general_ci'), default='1', comment='数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)') + data_scope = Column( + String(1, collation='utf8_general_ci'), + default='1', + comment='数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + ) menu_check_strictly = Column(Integer, default=1, comment='菜单树选择项是否关联显示') dept_check_strictly = Column(Integer, default=1, comment='部门树选择项是否关联显示') status = Column(String(1, collation='utf8_general_ci'), nullable=False, comment='角色状态(0正常 1停用)') @@ -29,6 +34,7 @@ class SysRoleDept(Base): """ 角色和部门关联表 """ + __tablename__ = 'sys_role_dept' role_id = Column(Integer, primary_key=True, nullable=False, comment='角色ID') @@ -39,6 +45,7 @@ class SysRoleMenu(Base): """ 角色和菜单关联表 """ + __tablename__ = 'sys_role_menu' role_id = Column(Integer, primary_key=True, nullable=False, comment='角色ID') diff --git a/dash-fastapi-backend/module_admin/entity/do/user_do.py b/dash-fastapi-backend/module_admin/entity/do/user_do.py index 9351547..21bba84 100644 --- a/dash-fastapi-backend/module_admin/entity/do/user_do.py +++ b/dash-fastapi-backend/module_admin/entity/do/user_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysUser(Base): """ 用户信息表 """ + __tablename__ = 'sys_user' user_id = Column(Integer, primary_key=True, autoincrement=True, comment='用户ID') @@ -34,6 +35,7 @@ class SysUserRole(Base): """ 用户和角色关联表 """ + __tablename__ = 'sys_user_role' user_id = Column(Integer, primary_key=True, nullable=False, comment='用户ID') @@ -44,6 +46,7 @@ class SysUserPost(Base): """ 用户与岗位关联表 """ + __tablename__ = 'sys_user_post' user_id = Column(Integer, primary_key=True, nullable=False, comment='用户ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py b/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py index 18c2357..79b49fb 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py @@ -1,29 +1,28 @@ -from pydantic import BaseModel -from typing import Optional, List, Any +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from typing import Any, List, Optional class CacheMonitorModel(BaseModel): """ 缓存监控信息对应pydantic模型 """ - command_stats: Optional[List] - db_size: Optional[int] - info: Optional[dict] + + model_config = ConfigDict(alias_generator=to_camel) + + command_stats: Optional[List] = Field(default=[], description='命令统计') + db_size: Optional[int] = Field(default=None, description='Key数量') + info: Optional[dict] = Field(default={}, description='Redis信息') class CacheInfoModel(BaseModel): """ 缓存监控对象对应pydantic模型 """ - cache_key: Optional[str] - cache_name: Optional[str] - cache_value: Optional[Any] - remark: Optional[str] + model_config = ConfigDict(alias_generator=to_camel) -class CrudCacheResponse(BaseModel): - """ - 操作缓存响应模型 - """ - is_success: bool - message: str + cache_key: Optional[str] = Field(default=None, description='缓存键名') + cache_name: Optional[str] = Field(default=None, description='缓存名称') + cache_value: Optional[Any] = Field(default=None, description='缓存内容') + remark: Optional[str] = Field(default=None, description='备注') diff --git a/dash-fastapi-backend/module_admin/entity/vo/common_vo.py b/dash-fastapi-backend/module_admin/entity/vo/common_vo.py new file mode 100644 index 0000000..258be5d --- /dev/null +++ b/dash-fastapi-backend/module_admin/entity/vo/common_vo.py @@ -0,0 +1,26 @@ +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from typing import Any, Optional + + +class CrudResponseModel(BaseModel): + """ + 操作响应模型 + """ + + is_success: bool = Field(description='操作是否成功') + message: str = Field(description='响应信息') + result: Optional[Any] = Field(default=None, description='响应结果') + + +class UploadResponseModel(BaseModel): + """ + 上传响应模型 + """ + + model_config = ConfigDict(alias_generator=to_camel) + + file_name: Optional[str] = Field(default=None, description='新文件映射路径') + new_file_name: Optional[str] = Field(default=None, description='新文件名称') + original_filename: Optional[str] = Field(default=None, description='原文件名称') + url: Optional[str] = Field(default=None, description='新文件url') diff --git a/dash-fastapi-backend/module_admin/entity/vo/config_vo.py b/dash-fastapi-backend/module_admin/entity/vo/config_vo.py index 6ad9c95..c398d23 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/config_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/config_vo.py @@ -1,63 +1,75 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query class ConfigModel(BaseModel): """ 参数配置表对应pydantic模型 """ - config_id: Optional[int] - config_name: Optional[str] - config_key: Optional[str] - config_value: Optional[str] - config_type: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + config_id: Optional[int] = Field(default=None, description='参数主键') + config_name: Optional[str] = Field(default=None, description='参数名称') + config_key: Optional[str] = Field(default=None, description='参数键名') + config_value: Optional[str] = Field(default=None, description='参数键值') + config_type: Optional[Literal['Y', 'N']] = Field(default=None, description='系统内置(Y是 N否)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + + @NotBlank(field_name='config_key', message='参数名称不能为空') + @Size(field_name='config_key', min_length=0, max_length=100, message='参数名称长度不能超过100个字符') + def get_config_key(self): + return self.config_key + + @NotBlank(field_name='config_name', message='参数键名不能为空') + @Size(field_name='config_name', min_length=0, max_length=100, message='参数键名长度不能超过100个字符') + def get_config_name(self): + return self.config_name + + @NotBlank(field_name='config_value', message='参数键值不能为空') + @Size(field_name='config_value', min_length=0, max_length=500, message='参数键值长度不能超过500个字符') + def get_config_value(self): + return self.config_value + + def validate_fields(self): + self.get_config_key() + self.get_config_name() + self.get_config_value() class ConfigQueryModel(ConfigModel): """ 参数配置管理不分页查询模型 """ - create_time_start: Optional[str] - create_time_end: Optional[str] + + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class ConfigPageObject(ConfigQueryModel): +@as_query +@as_form +class ConfigPageQueryModel(ConfigQueryModel): """ 参数配置管理分页查询模型 """ - page_num: int - page_size: int - -class ConfigPageObjectResponse(BaseModel): - """ - 参数配置管理列表分页查询返回模型 - """ - rows: List[Union[ConfigModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeleteConfigModel(BaseModel): """ 删除参数配置模型 """ - config_ids: str + model_config = ConfigDict(alias_generator=to_camel) -class CrudConfigResponse(BaseModel): - """ - 操作参数配置响应模型 - """ - is_success: bool - message: str + config_ids: str = Field(description='需要删除的参数主键') diff --git a/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py b/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py index a2cf228..dcad117 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py @@ -1,53 +1,75 @@ -from pydantic import BaseModel -from typing import Union, Optional, List -from module_admin.entity.vo.user_vo import DeptModel +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import Network, NotBlank, Size +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_query -class DeptPageObject(DeptModel): +class DeptModel(BaseModel): """ - 部门管理分页查询模型 + 部门表对应pydantic模型 """ - page_num: int - page_size: int + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) -class DeptPageObjectResponse(BaseModel): - """ - 用户管理列表分页查询返回模型 - """ - rows: List[Union[DeptModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + dept_id: Optional[int] = Field(default=None, description='部门id') + parent_id: Optional[int] = Field(default=None, description='父部门id') + ancestors: Optional[str] = Field(default=None, description='祖级列表') + dept_name: Optional[str] = Field(default=None, description='部门名称') + order_num: Optional[int] = Field(default=None, description='显示顺序') + leader: Optional[str] = Field(default=None, description='负责人') + phone: Optional[str] = Field(default=None, description='联系电话') + email: Optional[str] = Field(default=None, description='邮箱') + status: Optional[Literal['0', '1']] = Field(default=None, description='部门状态(0正常 1停用)') + del_flag: Optional[Literal['0', '2']] = Field(default=None, description='删除标志(0代表存在 2代表删除)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + @NotBlank(field_name='dept_name', message='部门名称不能为空') + @Size(field_name='dept_name', min_length=0, max_length=30, message='部门名称长度不能超过30个字符') + def get_dept_name(self): + return self.dept_name -class DeptResponse(BaseModel): - """ - 用户管理列表不分页查询返回模型 - """ - rows: List[Union[DeptModel, None]] = [] + @NotBlank(field_name='order_num', message='显示顺序不能为空') + def get_order_num(self): + return self.order_num + @Size(field_name='phone', min_length=0, max_length=11, message='联系电话长度不能超过11个字符') + def get_phone(self): + return self.phone -class DeptTree(BaseModel): - """ - 部门树响应模型 - """ - dept_tree: Union[List, None] + @Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确') + @Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符') + def get_email(self): + return self.email + + def validate_fields(self): + self.get_dept_name() + self.get_order_num() + self.get_phone() + self.get_email() -class CrudDeptResponse(BaseModel): +@as_query +class DeptQueryModel(DeptModel): """ - 操作部门响应模型 + 部门管理不分页查询模型 """ - is_success: bool - message: str + + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') class DeleteDeptModel(BaseModel): """ 删除部门模型 """ - dept_ids: str - update_by: Optional[str] - update_time: Optional[str] + + model_config = ConfigDict(alias_generator=to_camel) + + dept_ids: str = Field(default=None, description='需要删除的部门id') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[str] = Field(default=None, description='更新时间') diff --git a/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py b/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py index 6de3d74..4961674 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py @@ -1,111 +1,151 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Pattern, Size +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query class DictTypeModel(BaseModel): """ 字典类型表对应pydantic模型 """ - dict_id: Optional[int] - dict_name: Optional[str] - dict_type: Optional[str] - status: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + dict_id: Optional[int] = Field(default=None, description='字典主键') + dict_name: Optional[str] = Field(default=None, description='字典名称') + dict_type: Optional[str] = Field(default=None, description='字典类型') + status: Optional[Literal['0', '1']] = Field(default=None, description='状态(0正常 1停用)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + + @NotBlank(field_name='dict_name', message='字典名称不能为空') + @Size(field_name='dict_name', min_length=0, max_length=100, message='字典类型名称长度不能超过100个字符') + def get_dict_name(self): + return self.dict_name + + @NotBlank(field_name='dict_type', message='字典类型不能为空') + @Size(field_name='dict_type', min_length=0, max_length=100, message='字典类型类型长度不能超过100个字符') + @Pattern( + field_name='dict_type', + regexp='^[a-z][a-z0-9_]*$', + message='字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)', + ) + def get_dict_type(self): + return self.dict_type + + def validate_fields(self): + self.get_dict_name() + self.get_dict_type() class DictDataModel(BaseModel): """ 字典数据表对应pydantic模型 """ - dict_code: Optional[int] - dict_sort: Optional[int] - dict_label: Optional[str] - dict_value: Optional[str] - dict_type: Optional[str] - css_class: Optional[str] - list_class: Optional[str] - is_default: Optional[str] - status: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - - class Config: - orm_mode = True + + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + dict_code: Optional[int] = Field(default=None, description='字典编码') + dict_sort: Optional[int] = Field(default=None, description='字典排序') + dict_label: Optional[str] = Field(default=None, description='字典标签') + dict_value: Optional[str] = Field(default=None, description='字典键值') + dict_type: Optional[str] = Field(default=None, description='字典类型') + css_class: Optional[str] = Field(default=None, description='样式属性(其他样式扩展)') + list_class: Optional[str] = Field(default=None, description='表格回显样式') + is_default: Optional[Literal['Y', 'N']] = Field(default=None, description='是否默认(Y是 N否)') + status: Optional[Literal['0', '1']] = Field(default=None, description='状态(0正常 1停用)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + + @NotBlank(field_name='dict_label', message='字典标签不能为空') + @Size(field_name='dict_label', min_length=0, max_length=100, message='字典标签长度不能超过100个字符') + def get_dict_label(self): + return self.dict_label + + @NotBlank(field_name='dict_value', message='字典键值不能为空') + @Size(field_name='dict_value', min_length=0, max_length=100, message='字典键值长度不能超过100个字符') + def get_dict_value(self): + return self.dict_value + + @NotBlank(field_name='dict_type', message='字典类型不能为空') + @Size(field_name='dict_type', min_length=0, max_length=100, message='字典类型长度不能超过100个字符') + def get_dict_type(self): + return self.dict_type + + @Size(field_name='css_class', min_length=0, max_length=100, message='样式属性长度不能超过100个字符') + def get_css_class(self): + return self.css_class + + def validate_fields(self): + self.get_dict_label() + self.get_dict_value() + self.get_dict_type() + self.get_css_class() class DictTypeQueryModel(DictTypeModel): """ 字典类型管理不分页查询模型 """ - create_time_start: Optional[str] - create_time_end: Optional[str] + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class DictTypePageObject(DictTypeQueryModel): + +@as_query +@as_form +class DictTypePageQueryModel(DictTypeQueryModel): """ 字典类型管理分页查询模型 """ - page_num: int - page_size: int - -class DictTypePageObjectResponse(BaseModel): - """ - 字典类型管理列表分页查询返回模型 - """ - rows: List[Union[DictTypeModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeleteDictTypeModel(BaseModel): """ 删除字典类型模型 """ - dict_ids: str + model_config = ConfigDict(alias_generator=to_camel) -class DictDataPageObject(DictDataModel): + dict_ids: str = Field(description='需要删除的字典主键') + + +class DictDataQueryModel(DictDataModel): """ - 字典数据管理分页查询模型 + 字典数据管理不分页查询模型 """ - page_num: int - page_size: int + + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class DictDataPageObjectResponse(BaseModel): +@as_query +@as_form +class DictDataPageQueryModel(DictDataQueryModel): """ - 字典数据管理列表分页查询返回模型 + 字典数据管理分页查询模型 """ - rows: List[Union[DictDataModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeleteDictDataModel(BaseModel): """ 删除字典数据模型 """ - dict_codes: str + model_config = ConfigDict(alias_generator=to_camel) -class CrudDictResponse(BaseModel): - """ - 操作字典响应模型 - """ - is_success: bool - message: str + dict_codes: str = Field(description='需要删除的字典编码') diff --git a/dash-fastapi-backend/module_admin/entity/vo/job_vo.py b/dash-fastapi-backend/module_admin/entity/vo/job_vo.py index 0283b1f..4dd9e38 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/job_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/job_vo.py @@ -1,130 +1,136 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query class JobModel(BaseModel): """ 定时任务调度表对应pydantic模型 """ - job_id: Optional[int] - job_name: Optional[str] - job_group: Optional[str] - job_executor: Optional[str] - invoke_target: Optional[str] - job_args: Optional[str] - job_kwargs: Optional[str] - cron_expression: Optional[str] - misfire_policy: Optional[str] - concurrent: Optional[str] - status: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - - class Config: - orm_mode = True + + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + job_id: Optional[int] = Field(default=None, description='任务ID') + job_name: Optional[str] = Field(default=None, description='任务名称') + job_group: Optional[str] = Field(default=None, description='任务组名') + job_executor: Optional[str] = Field(default=None, description='任务执行器') + invoke_target: Optional[str] = Field(default=None, description='调用目标字符串') + job_args: Optional[str] = Field(default=None, description='位置参数') + job_kwargs: Optional[str] = Field(default=None, description='关键字参数') + cron_expression: Optional[str] = Field(default=None, description='cron执行表达式') + misfire_policy: Optional[Literal['1', '2', '3']] = Field( + default=None, description='计划执行错误策略(1立即执行 2执行一次 3放弃执行)' + ) + concurrent: Optional[Literal['0', '1']] = Field(default=None, description='是否并发执行(0允许 1禁止)') + status: Optional[Literal['0', '1']] = Field(default=None, description='状态(0正常 1暂停)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注信息') + + @NotBlank(field_name='invoke_target', message='调用目标字符串不能为空') + @Size(field_name='invoke_target', min_length=0, max_length=500, message='调用目标字符串长度不能超过500个字符') + def get_invoke_target(self): + return self.invoke_target + + @NotBlank(field_name='cron_expression', message='Cron执行表达式不能为空') + @Size(field_name='cron_expression', min_length=0, max_length=255, message='Cron执行表达式不能超过255个字符') + def get_cron_expression(self): + return self.cron_expression + + def validate_fields(self): + self.get_invoke_target() + self.get_cron_expression() class JobLogModel(BaseModel): """ 定时任务调度日志表对应pydantic模型 """ - job_log_id: Optional[int] - job_name: Optional[str] - job_group: Optional[str] - job_executor: Optional[str] - invoke_target: Optional[str] - job_args: Optional[str] - job_kwargs: Optional[str] - job_trigger: Optional[str] - job_message: Optional[str] - status: Optional[str] - exception_info: Optional[str] - create_time: Optional[str] - - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) -class JobPageObject(JobModel): - """ - 定时任务管理分页查询模型 - """ - page_num: int - page_size: int + job_log_id: Optional[int] = Field(default=None, description='任务日志ID') + job_name: Optional[str] = Field(default=None, description='任务名称') + job_group: Optional[str] = Field(default=None, description='任务组名') + job_executor: Optional[str] = Field(default=None, description='任务执行器') + invoke_target: Optional[str] = Field(default=None, description='调用目标字符串') + job_args: Optional[str] = Field(default=None, description='位置参数') + job_kwargs: Optional[str] = Field(default=None, description='关键字参数') + job_trigger: Optional[str] = Field(default=None, description='任务触发器') + job_message: Optional[str] = Field(default=None, description='日志信息') + status: Optional[Literal['0', '1']] = Field(default=None, description='执行状态(0正常 1失败)') + exception_info: Optional[str] = Field(default=None, description='异常信息') + create_time: Optional[datetime] = Field(default=None, description='创建时间') -class JobPageObjectResponse(BaseModel): +class JobQueryModel(JobModel): """ - 定时任务管理列表分页查询返回模型 + 定时任务管理不分页查询模型 """ - rows: List[Union[JobModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class CrudJobResponse(BaseModel): + +@as_query +@as_form +class JobPageQueryModel(JobQueryModel): """ - 操作定时任务及日志响应模型 + 定时任务管理分页查询模型 """ - is_success: bool - message: str + + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class EditJobModel(JobModel): """ 编辑定时任务模型 """ - type: Optional[str] + + type: Optional[str] = Field(default=None, description='操作类型') class DeleteJobModel(BaseModel): """ 删除定时任务模型 """ - job_ids: str + + model_config = ConfigDict(alias_generator=to_camel) + + job_ids: str = Field(description='需要删除的定时任务ID') class JobLogQueryModel(JobLogModel): """ 定时任务日志不分页查询模型 """ - create_time_start: Optional[str] - create_time_end: Optional[str] + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class JobLogPageObject(JobLogQueryModel): + +@as_query +@as_form +class JobLogPageQueryModel(JobLogQueryModel): """ 定时任务日志管理分页查询模型 """ - page_num: int - page_size: int - -class JobLogPageObjectResponse(BaseModel): - """ - 定时任务日志管理列表分页查询返回模型 - """ - rows: List[Union[JobLogModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeleteJobLogModel(BaseModel): """ 删除定时任务日志模型 """ - job_log_ids: str + model_config = ConfigDict(alias_generator=to_camel) -class ClearJobLogModel(BaseModel): - """ - 清除定时任务日志模型 - """ - oper_type: str + job_log_ids: str = Field(description='需要删除的定时任务日志ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/log_vo.py b/dash-fastapi-backend/module_admin/entity/vo/log_vo.py index a8486e2..1866513 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/log_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/log_vo.py @@ -1,147 +1,133 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query class OperLogModel(BaseModel): """ 操作日志表对应pydantic模型 """ - oper_id: Optional[int] - title: Optional[str] - business_type: Optional[int] - method: Optional[str] - request_method: Optional[str] - operator_type: Optional[int] - oper_name: Optional[str] - dept_name: Optional[str] - oper_url: Optional[str] - oper_ip: Optional[str] - oper_location: Optional[str] - oper_param: Optional[str] - json_result: Optional[str] - status: Optional[int] - error_msg: Optional[str] - oper_time: Optional[str] - cost_time: Optional[int] - - class Config: - orm_mode = True + + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + oper_id: Optional[int] = Field(default=None, description='日志主键') + title: Optional[str] = Field(default=None, description='模块标题') + business_type: Optional[Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']] = ( + Field( + default=None, description='业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8生成代码 9清空数据)' + ) + ) + method: Optional[str] = Field(default=None, description='方法名称') + request_method: Optional[str] = Field(default=None, description='请求方式') + operator_type: Optional[Literal[0, 1, 2]] = Field( + default=None, description='操作类别(0其它 1后台用户 2手机端用户)' + ) + oper_name: Optional[str] = Field(default=None, description='操作人员') + dept_name: Optional[str] = Field(default=None, description='部门名称') + oper_url: Optional[str] = Field(default=None, description='请求URL') + oper_ip: Optional[str] = Field(default=None, description='主机地址') + oper_location: Optional[str] = Field(default=None, description='操作地点') + oper_param: Optional[str] = Field(default=None, description='请求参数') + json_result: Optional[str] = Field(default=None, description='返回参数') + status: Optional[Literal[0, 1, '0', '1']] = Field(default=None, description='操作状态(0正常 1异常)') + error_msg: Optional[str] = Field(default=None, description='错误消息') + oper_time: Optional[datetime] = Field(default=None, description='操作时间') + cost_time: Optional[int] = Field(default=None, description='消耗时间') class LogininforModel(BaseModel): """ 登录日志表对应pydantic模型 """ - info_id: Optional[int] - user_name: Optional[str] - ipaddr: Optional[str] - login_location: Optional[str] - browser: Optional[str] - os: Optional[str] - status: Optional[str] - msg: Optional[str] - login_time: Optional[str] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + info_id: Optional[int] = Field(default=None, description='访问ID') + user_name: Optional[str] = Field(default=None, description='用户账号') + ipaddr: Optional[str] = Field(default=None, description='登录IP地址') + login_location: Optional[str] = Field(default=None, description='登录地点') + browser: Optional[str] = Field(default=None, description='浏览器类型') + os: Optional[str] = Field(default=None, description='操作系统') + status: Optional[Literal['0', '1']] = Field(default=None, description='登录状态(0成功 1失败)') + msg: Optional[str] = Field(default=None, description='提示消息') + login_time: Optional[datetime] = Field(default=None, description='访问时间') class OperLogQueryModel(OperLogModel): """ 操作日志管理不分页查询模型 """ - order_by_column: Optional[str] - is_asc: Optional[str] - oper_time_start: Optional[str] - oper_time_end: Optional[str] + order_by_column: Optional[str] = Field(default=None, description='排序的字段名称') + is_asc: Optional[Literal['ascending', 'descending']] = Field( + default=None, description='排序方式(ascending升序 descending降序)' + ) + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class OperLogPageObject(OperLogQueryModel): + +@as_query +@as_form +class OperLogPageQueryModel(OperLogQueryModel): """ 操作日志管理分页查询模型 """ - page_num: int - page_size: int - -class OperLogPageObjectResponse(BaseModel): - """ - 操作日志列表分页查询返回模型 - """ - rows: List[Union[OperLogModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeleteOperLogModel(BaseModel): """ 删除操作日志模型 """ - oper_ids: str + model_config = ConfigDict(alias_generator=to_camel) -class ClearOperLogModel(BaseModel): - """ - 清除操作日志模型 - """ - oper_type: str + oper_ids: str = Field(description='需要删除的日志主键') class LoginLogQueryModel(LogininforModel): """ 登录日志管理不分页查询模型 """ - order_by_column: Optional[str] - is_asc: Optional[str] - login_time_start: Optional[str] - login_time_end: Optional[str] + order_by_column: Optional[str] = Field(default=None, description='排序的字段名称') + is_asc: Optional[Literal['ascending', 'descending']] = Field( + default=None, description='排序方式(ascending升序 descending降序)' + ) + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class LoginLogPageObject(LoginLogQueryModel): + +@as_query +@as_form +class LoginLogPageQueryModel(LoginLogQueryModel): """ 登录日志管理分页查询模型 """ - page_num: int - page_size: int - -class LoginLogPageObjectResponse(BaseModel): - """ - 登录日志列表分页查询返回模型 - """ - rows: List[Union[LogininforModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeleteLoginLogModel(BaseModel): """ 删除登录日志模型 """ - info_ids: str + model_config = ConfigDict(alias_generator=to_camel) -class ClearLoginLogModel(BaseModel): - """ - 清除登录日志模型 - """ - oper_type: str + info_ids: str = Field(description='需要删除的访问ID') class UnlockUser(BaseModel): """ 解锁用户模型 """ - user_name: str + model_config = ConfigDict(alias_generator=to_camel) -class CrudLogResponse(BaseModel): - """ - 操作各类日志响应模型 - """ - is_success: bool - message: str + user_name: str = Field(description='用户名称') diff --git a/dash-fastapi-backend/module_admin/entity/vo/login_vo.py b/dash-fastapi-backend/module_admin/entity/vo/login_vo.py index 528b3b2..fbd6e07 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/login_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/login_vo.py @@ -1,23 +1,87 @@ -from pydantic import BaseModel -from typing import Optional +import re +from pydantic import BaseModel, ConfigDict, Field, model_validator +from pydantic.alias_generators import to_camel +from typing import List, Optional, Union +from exceptions.exception import ModelValidatorException +from module_admin.entity.vo.menu_vo import MenuModel class UserLogin(BaseModel): - user_name: str - password: str - captcha: Optional[str] - session_id: Optional[str] - login_info: Optional[dict] - captcha_enabled: Optional[bool] + model_config = ConfigDict(alias_generator=to_camel) + + user_name: str = Field(description='用户名称') + password: str = Field(description='用户密码') + code: Optional[str] = Field(default=None, description='验证码') + uuid: Optional[str] = Field(default=None, description='会话编号') + login_info: Optional[dict] = Field(default=None, description='登录信息,前端无需传递') + captcha_enabled: Optional[bool] = Field(default=None, description='是否启用验证码,前端无需传递') + + +class UserRegister(BaseModel): + model_config = ConfigDict(alias_generator=to_camel) + + username: str = Field(description='用户名称') + password: str = Field(description='用户密码') + confirm_password: str = Field(description='用户二次确认密码') + code: Optional[str] = Field(default=None, description='验证码') + uuid: Optional[str] = Field(default=None, description='会话编号') + + @model_validator(mode='after') + def check_password(self) -> 'UserRegister': + pattern = r"""^[^<>"'|\\]+$""" + if self.password is None or re.match(pattern, self.password): + return self + else: + raise ModelValidatorException(message='密码不能包含非法字符:< > " \' \\ |') class Token(BaseModel): - access_token: str - token_type: str + access_token: str = Field(description='token信息') + token_type: str = Field(description='token类型') + + +class CaptchaCode(BaseModel): + model_config = ConfigDict(alias_generator=to_camel) + + captcha_enabled: bool = Field(description='是否启用验证码') + register_enabled: bool = Field(description='是否启用注册') + img: str = Field(description='验证码图片') + uuid: str = Field(description='会话编号') class SmsCode(BaseModel): - is_success: Optional[bool] - sms_code: str - session_id: str - message: Optional[str] + is_success: Optional[bool] = Field(default=None, description='操作是否成功') + sms_code: str = Field(description='短信验证码') + session_id: str = Field(description='会话编号') + message: Optional[str] = Field(default=None, description='响应信息') + + +class MenuTreeModel(MenuModel): + children: Optional[Union[List['MenuTreeModel'], None]] = Field(default=None, description='子菜单') + + +class MetaModel(BaseModel): + model_config = ConfigDict(alias_generator=to_camel) + + title: Optional[str] = Field(default=None, description='设置路由在侧边栏和面包屑中展示的名字') + icon: Optional[str] = Field(default=None, description='设置路由的图标') + no_cache: Optional[bool] = Field(default=None, description='设置为true,则不会被 缓存') + link: Optional[str] = Field(default=None, description='内链地址(http(s)://开头)') + + +class RouterModel(BaseModel): + model_config = ConfigDict(alias_generator=to_camel) + + name: Optional[str] = Field(default=None, description='路由名称') + path: Optional[str] = Field(default=None, description='路由地址') + hidden: Optional[bool] = Field(default=None, description='是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现') + redirect: Optional[str] = Field( + default=None, description='重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击' + ) + component: Optional[str] = Field(default=None, description='组件地址') + query: Optional[str] = Field(default=None, description='路由参数:如 {"id": 1, "name": "ry"}') + always_show: Optional[bool] = Field( + default=None, description='当你一个路由下面的children声明的路由大于1个时,自动会变成嵌套的模式--如组件页面' + ) + meta: Optional[MetaModel] = Field(default=None, description='其他元素') + children: Optional[Union[List['RouterModel'], None]] = Field(default=None, description='子路由') diff --git a/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py b/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py index c0aa5c2..9dc8d75 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py @@ -1,85 +1,88 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_query class MenuModel(BaseModel): """ 菜单表对应pydantic模型 """ - menu_id: Optional[int] - menu_name: Optional[str] - parent_id: Optional[int] - order_num: Optional[int] - path: Optional[str] - component: Optional[str] - query: Optional[str] - is_frame: Optional[int] - is_cache: Optional[int] - menu_type: Optional[str] - visible: Optional[str] - status: Optional[str] - perms: Optional[str] - icon: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - - class Config: - orm_mode = True - - -class MenuTreeModel(MenuModel): - """ - 菜单树查询模型 - """ - type: Optional[str] + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) -class MenuPageObject(MenuModel): - """ - 菜单管理分页查询模型 - """ - page_num: int - page_size: int + menu_id: Optional[int] = Field(default=None, description='菜单ID') + menu_name: Optional[str] = Field(default=None, description='菜单名称') + parent_id: Optional[int] = Field(default=None, description='父菜单ID') + order_num: Optional[int] = Field(default=None, description='显示顺序') + path: Optional[str] = Field(default=None, description='路由地址') + component: Optional[str] = Field(default=None, description='组件路径') + query: Optional[str] = Field(default=None, description='路由参数') + route_name: Optional[str] = Field(default=None, description='路由名称') + is_frame: Optional[Literal[0, 1]] = Field(default=None, description='是否为外链(0是 1否)') + is_cache: Optional[Literal[0, 1]] = Field(default=None, description='是否缓存(0缓存 1不缓存)') + menu_type: Optional[Literal['M', 'C', 'F']] = Field(default=None, description='菜单类型(M目录 C菜单 F按钮)') + visible: Optional[Literal['0', '1']] = Field(default=None, description='菜单状态(0显示 1隐藏)') + status: Optional[Literal['0', '1']] = Field(default=None, description='菜单状态(0正常 1停用)') + perms: Optional[str] = Field(default=None, description='权限标识') + icon: Optional[str] = Field(default=None, description='菜单图标') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + @NotBlank(field_name='menu_name', message='菜单名称不能为空') + @Size(field_name='menu_name', min_length=0, max_length=50, message='菜单名称长度不能超过50个字符') + def get_menu_name(self): + return self.menu_name -class MenuPageObjectResponse(BaseModel): - """ - 菜单管理列表分页查询返回模型 - """ - rows: List[Union[MenuModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + @NotBlank(field_name='order_num', message='显示顺序不能为空') + def get_order_num(self): + return self.order_num + @Size(field_name='path', min_length=0, max_length=200, message='路由地址长度不能超过200个字符') + def get_path(self): + return self.path -class MenuResponse(BaseModel): - """ - 菜单管理列表不分页查询返回模型 - """ - rows: List[Union[MenuModel, None]] = [] + @Size(field_name='component', min_length=0, max_length=255, message='组件路径长度不能超过255个字符') + def get_component(self): + return self.component + @NotBlank(field_name='menu_type', message='菜单类型不能为空') + def get_menu_type(self): + return self.menu_type -class MenuTree(BaseModel): - """ - 菜单树响应模型 - """ - menu_tree: Union[List, None] + @Size(field_name='perms', min_length=0, max_length=100, message='权限标识长度不能超过100个字符') + def get_perms(self): + return self.perms + + def validate_fields(self): + self.get_menu_name() + self.get_order_num() + self.get_path() + self.get_component() + self.get_menu_type() + self.get_perms() -class CrudMenuResponse(BaseModel): +@as_query +class MenuQueryModel(MenuModel): """ - 操作菜单响应模型 + 菜单管理不分页查询模型 """ - is_success: bool - message: str + + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') class DeleteMenuModel(BaseModel): """ 删除菜单模型 """ - menu_ids: str + + model_config = ConfigDict(alias_generator=to_camel) + + menu_ids: str = Field(description='需要删除的菜单ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py b/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py index 7abb8c8..bbf0a07 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py @@ -1,63 +1,64 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size, Xss +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query class NoticeModel(BaseModel): """ 通知公告表对应pydantic模型 """ - notice_id: Optional[int] - notice_title: Optional[str] - notice_type: Optional[str] - notice_content: Optional[bytes] - status: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + notice_id: Optional[int] = Field(default=None, description='公告ID') + notice_title: Optional[str] = Field(default=None, description='公告标题') + notice_type: Optional[Literal['1', '2']] = Field(default=None, description='公告类型(1通知 2公告)') + notice_content: Optional[bytes] = Field(default=None, description='公告内容') + status: Optional[Literal['0', '1']] = Field(default=None, description='公告状态(0正常 1关闭)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + + @Xss(field_name='notice_title', message='公告标题不能包含脚本字符') + @NotBlank(field_name='notice_title', message='公告标题不能为空') + @Size(field_name='notice_title', min_length=0, max_length=50, message='公告标题不能超过50个字符') + def get_notice_title(self): + return self.notice_title + + def validate_fields(self): + self.get_notice_title() class NoticeQueryModel(NoticeModel): """ 通知公告管理不分页查询模型 """ - create_time_start: Optional[str] - create_time_end: Optional[str] - -class NoticePageObject(NoticeQueryModel): - """ - 通知公告管理分页查询模型 - """ - page_num: int - page_size: int + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class NoticePageObjectResponse(BaseModel): +@as_query +@as_form +class NoticePageQueryModel(NoticeQueryModel): """ - 通知公告管理列表分页查询返回模型 + 通知公告管理分页查询模型 """ - rows: List[Union[NoticeModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool - -class CrudNoticeResponse(BaseModel): - """ - 操作通知公告响应模型 - """ - is_success: bool - message: str + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeleteNoticeModel(BaseModel): """ 删除通知公告模型 """ - notice_ids: str + + model_config = ConfigDict(alias_generator=to_camel) + + notice_ids: str = Field(description='需要删除的公告ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py index eeef4d3..ca68f1e 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py @@ -1,50 +1,42 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from typing import Optional +from module_admin.annotation.pydantic_annotation import as_query class OnlineModel(BaseModel): """ 在线用户对应pydantic模型 """ - session_id: Optional[str] - user_name: Optional[str] - dept_name: Optional[str] - ipaddr: Optional[str] - login_location: Optional[str] - browser: Optional[str] - os: Optional[str] - login_time: Optional[str] + model_config = ConfigDict(alias_generator=to_camel) -class OnlinePageObject(OnlineModel): - """ - 在线用户分页查询模型 - """ - page_num: int - page_size: int + token_id: Optional[str] = Field(default=None, description='会话编号') + user_name: Optional[str] = Field(default=None, description='部门名称') + dept_name: Optional[str] = Field(default=None, description='用户名称') + ipaddr: Optional[str] = Field(default=None, description='登录IP地址') + login_location: Optional[str] = Field(default=None, description='登录地址') + browser: Optional[str] = Field(default=None, description='浏览器类型') + os: Optional[str] = Field(default=None, description='操作系统') + login_time: Optional[datetime] = Field(default=None, description='登录时间') -class OnlinePageObjectResponse(BaseModel): +@as_query +class OnlineQueryModel(OnlineModel): """ - 在线用户列表分页查询返回模型 + 岗位管理不分页查询模型 """ - rows: List[Union[OnlineModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool - -class CrudOnlineResponse(BaseModel): - """ - 操作在线用户响应模型 - """ - is_success: bool - message: str + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') class DeleteOnlineModel(BaseModel): """ 强退在线用户模型 """ - session_ids: str + + model_config = ConfigDict(alias_generator=to_camel) + + token_ids: str = Field(description='需要强退的会话编号') diff --git a/dash-fastapi-backend/module_admin/entity/vo/post_vo.py b/dash-fastapi-backend/module_admin/entity/vo/post_vo.py index a7a7abe..ab85103 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/post_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/post_vo.py @@ -1,44 +1,74 @@ -from pydantic import BaseModel -from typing import Union, List -from module_admin.entity.vo.user_vo import PostModel +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query -class PostPageObject(PostModel): +class PostModel(BaseModel): """ - 岗位管理分页查询模型 + 岗位信息表对应pydantic模型 """ - page_num: int - page_size: int + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) -class PostPageObjectResponse(BaseModel): - """ - 岗位管理列表分页查询返回模型 - """ - rows: List[Union[PostModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + post_id: Optional[int] = Field(default=None, description='岗位ID') + post_code: Optional[str] = Field(default=None, description='岗位编码') + post_name: Optional[str] = Field(default=None, description='岗位名称') + post_sort: Optional[int] = Field(default=None, description='显示顺序') + status: Optional[Literal['0', '1']] = Field(default=None, description='状态(0正常 1停用)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + + @NotBlank(field_name='post_code', message='岗位编码不能为空') + @Size(field_name='post_code', min_length=0, max_length=64, message='岗位编码长度不能超过64个字符') + def get_post_code(self): + return self.post_code + + @NotBlank(field_name='post_name', message='岗位名称不能为空') + @Size(field_name='post_name', min_length=0, max_length=50, message='岗位名称长度不能超过50个字符') + def get_post_name(self): + return self.post_name + + @NotBlank(field_name='post_sort', message='显示顺序不能为空') + def get_post_sort(self): + return self.post_sort + def validate_fields(self): + self.get_post_code() + self.get_post_name() + self.get_post_sort() -class PostSelectOptionResponseModel(BaseModel): + +class PostQueryModel(PostModel): """ 岗位管理不分页查询模型 """ - post: List[Union[PostModel, None]] + + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class CrudPostResponse(BaseModel): +@as_query +@as_form +class PostPageQueryModel(PostQueryModel): """ - 操作岗位响应模型 + 岗位管理分页查询模型 """ - is_success: bool - message: str + + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') class DeletePostModel(BaseModel): """ 删除岗位模型 """ - post_ids: str + + model_config = ConfigDict(alias_generator=to_camel) + + post_ids: str = Field(description='需要删除的岗位ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/role_vo.py b/dash-fastapi-backend/module_admin/entity/vo/role_vo.py index 0f94d43..d6f60bc 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/role_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/role_vo.py @@ -1,102 +1,159 @@ -from pydantic import BaseModel -from typing import Union, Optional, List -from module_admin.entity.vo.user_vo import RoleModel -from module_admin.entity.vo.dept_vo import DeptModel -from module_admin.entity.vo.menu_vo import MenuModel +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size +from typing import List, Literal, Optional, Union +from module_admin.annotation.pydantic_annotation import as_form, as_query + + +class RoleModel(BaseModel): + """ + 角色表对应pydantic模型 + """ + + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + role_id: Optional[int] = Field(default=None, description='角色ID') + role_name: Optional[str] = Field(default=None, description='角色名称') + role_key: Optional[str] = Field(default=None, description='角色权限字符串') + role_sort: Optional[int] = Field(default=None, description='显示顺序') + data_scope: Optional[Literal['1', '2', '3', '4', '5']] = Field( + default=None, + description='数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限)', + ) + menu_check_strictly: Optional[Union[int, bool]] = Field(default=None, description='菜单树选择项是否关联显示') + dept_check_strictly: Optional[Union[int, bool]] = Field(default=None, description='部门树选择项是否关联显示') + status: Optional[Literal['0', '1']] = Field(default=None, description='角色状态(0正常 1停用)') + del_flag: Optional[Literal['0', '2']] = Field(default=None, description='删除标志(0代表存在 2代表删除)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + admin: Optional[bool] = Field(default=False, description='是否为admin') + + @field_validator('menu_check_strictly', 'dept_check_strictly') + @classmethod + def check_filed_mapping(cls, v: Union[int, bool]) -> Union[int, bool]: + if v == 1: + v = True + elif v == 0: + v = False + elif v is True: + v = 1 + elif v is False: + v = 0 + return v + + @model_validator(mode='after') + def check_admin(self) -> 'RoleModel': + if self.role_id == 1: + self.admin = True + else: + self.admin = False + return self + + @NotBlank(field_name='role_name', message='角色名称不能为空') + @Size(field_name='role_name', min_length=0, max_length=30, message='角色名称长度不能超过30个字符') + def get_role_name(self): + return self.role_name + + @NotBlank(field_name='role_key', message='权限字符不能为空') + @Size(field_name='role_key', min_length=0, max_length=100, message='权限字符长度不能超过100个字符') + def get_role_key(self): + return self.role_key + + @NotBlank(field_name='role_sort', message='显示顺序不能为空') + def get_role_sort(self): + return self.role_sort + + def validate_fields(self): + self.get_role_name() + self.get_role_key() + self.get_role_sort() class RoleMenuModel(BaseModel): """ 角色和菜单关联表对应pydantic模型 """ - role_id: Optional[int] - menu_id: Optional[int] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + role_id: Optional[int] = Field(default=None, description='角色ID') + menu_id: Optional[int] = Field(default=None, description='菜单ID') class RoleDeptModel(BaseModel): """ 角色和部门关联表对应pydantic模型 """ - role_id: Optional[int] - dept_id: Optional[int] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + role_id: Optional[int] = Field(default=None, description='角色ID') + dept_id: Optional[int] = Field(default=None, description='部门ID') class RoleQueryModel(RoleModel): """ 角色管理不分页查询模型 """ - create_time_start: Optional[str] - create_time_end: Optional[str] + + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class RolePageObject(RoleQueryModel): +@as_query +@as_form +class RolePageQueryModel(RoleQueryModel): """ 角色管理分页查询模型 """ - page_num: int - page_size: int - - -class RolePageObjectResponse(BaseModel): - """ - 角色管理列表分页查询返回模型 - """ - rows: List[Union[RoleModel, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') -class RoleSelectOptionResponseModel(BaseModel): +class RoleMenuQueryModel(BaseModel): """ - 角色管理不分页查询模型 + 角色菜单查询模型 """ - role: List[Union[RoleModel, None]] - - -class CrudRoleResponse(BaseModel): + + model_config = ConfigDict(alias_generator=to_camel) + + menus: List = Field(default=[], description='菜单信息') + checked_keys: List[int] = Field(default=[], description='已选择的菜单ID信息') + + +class RoleDeptQueryModel(BaseModel): """ - 操作角色响应模型 + 角色部门查询模型 """ - is_success: bool - message: str - - + + model_config = ConfigDict(alias_generator=to_camel) + + depts: List = Field(default=[], description='部门信息') + checked_keys: List[int] = Field(default=[], description='已选择的部门ID信息') + + class AddRoleModel(RoleModel): """ 新增角色模型 """ - menu_id: Optional[str] - type: Optional[str] - -class RoleDataScopeModel(RoleModel): - """ - 角色数据权限模型 - """ - dept_id: Optional[str] + dept_ids: List = Field(default=[], description='部门ID信息') + menu_ids: List = Field(default=[], description='菜单ID信息') + type: Optional[str] = Field(default=None, description='操作类型') class DeleteRoleModel(BaseModel): """ 删除角色模型 """ - role_ids: str - update_by: Optional[str] - update_time: Optional[str] - - -class RoleDetailModel(BaseModel): - """ - 获取角色详情信息响应模型 - """ - role: Union[RoleModel, None] - menu: List[Union[MenuModel, None]] - dept: List[Union[DeptModel, None]] + + model_config = ConfigDict(alias_generator=to_camel) + + role_ids: str = Field(description='需要删除的菜单ID') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') diff --git a/dash-fastapi-backend/module_admin/entity/vo/server_vo.py b/dash-fastapi-backend/module_admin/entity/vo/server_vo.py index 3671596..810ecac 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/server_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/server_vo.py @@ -1,53 +1,67 @@ -from pydantic import BaseModel -from typing import Optional, List +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from typing import List, Optional class CpuInfo(BaseModel): - cpu_num: Optional[int] - used: Optional[str] - sys: Optional[str] - free: Optional[str] + model_config = ConfigDict(alias_generator=to_camel) + + cpu_num: Optional[int] = Field(default=None, description='核心数') + used: Optional[float] = Field(default=None, description='CPU用户使用率') + sys: Optional[float] = Field(default=None, description='CPU系统使用率') + free: Optional[float] = Field(default=None, description='CPU当前空闲率') class MemoryInfo(BaseModel): - total: Optional[str] - used: Optional[str] - free: Optional[str] - usage: Optional[str] + model_config = ConfigDict(alias_generator=to_camel) + + total: Optional[str] = Field(default=None, description='内存总量') + used: Optional[str] = Field(default=None, description='已用内存') + free: Optional[str] = Field(default=None, description='剩余内存') + usage: Optional[float] = Field(default=None, description='使用率') class SysInfo(BaseModel): - computer_ip: Optional[str] - computer_name: Optional[str] - os_arch: Optional[str] - os_name: Optional[str] + model_config = ConfigDict(alias_generator=to_camel) + + computer_ip: Optional[str] = Field(default=None, description='服务器IP') + computer_name: Optional[str] = Field(default=None, description='服务器名称') + os_arch: Optional[str] = Field(default=None, description='系统架构') + os_name: Optional[str] = Field(default=None, description='操作系统') + user_dir: Optional[str] = Field(default=None, description='项目路径') + +class PyInfo(MemoryInfo): + model_config = ConfigDict(alias_generator=to_camel) -class PyInfo(BaseModel): - name: Optional[str] - version: Optional[str] - start_time: Optional[str] - run_time: Optional[str] - home: Optional[str] - project_dir: Optional[str] + name: Optional[str] = Field(default=None, description='Python名称') + version: Optional[str] = Field(default=None, description='Python版本') + start_time: Optional[str] = Field(default=None, description='启动时间') + run_time: Optional[str] = Field(default=None, description='运行时长') + home: Optional[str] = Field(default=None, description='安装路径') class SysFiles(BaseModel): - dir_name: Optional[str] - sys_type_name: Optional[str] - disk_name: Optional[str] - total: Optional[str] - used: Optional[str] - free: Optional[str] - usage: Optional[str] + model_config = ConfigDict(alias_generator=to_camel) + + dir_name: Optional[str] = Field(default=None, description='盘符路径') + sys_type_name: Optional[str] = Field(default=None, description='盘符类型') + type_name: Optional[str] = Field(default=None, description='文件类型') + total: Optional[str] = Field(default=None, description='总大小') + used: Optional[str] = Field(default=None, description='已经使用量') + free: Optional[str] = Field(default=None, description='剩余大小') + usage: Optional[str] = Field(default=None, description='资源的使用率') class ServerMonitorModel(BaseModel): """ 服务监控对应pydantic模型 """ - cpu: Optional[CpuInfo] - py: Optional[PyInfo] - mem: Optional[MemoryInfo] - sys: Optional[SysInfo] - sys_files: Optional[List[SysFiles]] + + model_config = ConfigDict(alias_generator=to_camel) + + cpu: Optional[CpuInfo] = Field(description='CPU相关信息') + py: Optional[PyInfo] = Field(description='Python相关信息') + mem: Optional[MemoryInfo] = Field(description='內存相关信息') + sys: Optional[SysInfo] = Field(description='服务器相关信息') + sys_files: Optional[List[SysFiles]] = Field(description='磁盘相关信息') diff --git a/dash-fastapi-backend/module_admin/entity/vo/user_vo.py b/dash-fastapi-backend/module_admin/entity/vo/user_vo.py index ba79c0d..67a1d14 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/user_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/user_vo.py @@ -1,289 +1,284 @@ -from pydantic import BaseModel -from typing import Union, Optional, List +import re +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field, model_validator +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import Network, NotBlank, Size, Xss +from typing import List, Literal, Optional, Union +from exceptions.exception import ModelValidatorException +from module_admin.annotation.pydantic_annotation import as_form, as_query +from module_admin.entity.vo.dept_vo import DeptModel +from module_admin.entity.vo.post_vo import PostModel +from module_admin.entity.vo.role_vo import RoleModel class TokenData(BaseModel): """ token解析结果 """ - user_id: Union[int, None] = None + + user_id: Union[int, None] = Field(default=None, description='用户ID') class UserModel(BaseModel): """ 用户表对应pydantic模型 """ - user_id: Optional[int] - dept_id: Optional[int] - user_name: Optional[str] - nick_name: Optional[str] - user_type: Optional[str] - email: Optional[str] - phonenumber: Optional[str] - sex: Optional[str] - avatar: Optional[str] - password: Optional[str] - status: Optional[str] - del_flag: Optional[str] - login_ip: Optional[str] - login_date: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - - class Config: - orm_mode = True + + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + user_id: Optional[int] = Field(default=None, description='用户ID') + dept_id: Optional[int] = Field(default=None, description='部门ID') + user_name: Optional[str] = Field(default=None, description='用户账号') + nick_name: Optional[str] = Field(default=None, description='用户昵称') + user_type: Optional[str] = Field(default=None, description='用户类型(00系统用户)') + email: Optional[str] = Field(default=None, description='用户邮箱') + phonenumber: Optional[str] = Field(default=None, description='手机号码') + sex: Optional[Literal['0', '1', '2']] = Field(default=None, description='用户性别(0男 1女 2未知)') + avatar: Optional[str] = Field(default=None, description='头像地址') + password: Optional[str] = Field(default=None, description='密码') + status: Optional[Literal['0', '1']] = Field(default=None, description='帐号状态(0正常 1停用)') + del_flag: Optional[Literal['0', '2']] = Field(default=None, description='删除标志(0代表存在 2代表删除)') + login_ip: Optional[str] = Field(default=None, description='最后登录IP') + login_date: Optional[datetime] = Field(default=None, description='最后登录时间') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + remark: Optional[str] = Field(default=None, description='备注') + admin: Optional[bool] = Field(default=False, description='是否为admin') + + @model_validator(mode='after') + def check_password(self) -> 'UserModel': + pattern = r"""^[^<>"'|\\]+$""" + if self.password is None or re.match(pattern, self.password): + return self + else: + raise ModelValidatorException(message='密码不能包含非法字符:< > " \' \\ |') + + @model_validator(mode='after') + def check_admin(self) -> 'UserModel': + if self.user_id == 1: + self.admin = True + else: + self.admin = False + return self + + @Xss(field_name='user_name', message='用户账号不能包含脚本字符') + @NotBlank(field_name='user_name', message='用户账号不能为空') + @Size(field_name='user_name', min_length=0, max_length=30, message='用户账号长度不能超过30个字符') + def get_user_name(self): + return self.user_name + + @Xss(field_name='nick_name', message='用户昵称不能包含脚本字符') + @Size(field_name='nick_name', min_length=0, max_length=30, message='用户昵称长度不能超过30个字符') + def get_nick_name(self): + return self.nick_name + + @Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确') + @Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符') + def get_email(self): + return self.email + + @Size(field_name='phonenumber', min_length=0, max_length=11, message='手机号码长度不能超过11个字符') + def get_phonenumber(self): + return self.phonenumber + + def validate_fields(self): + self.get_user_name() + self.get_nick_name() + self.get_email() + self.get_phonenumber() class UserRoleModel(BaseModel): """ 用户和角色关联表对应pydantic模型 """ - user_id: Optional[int] - role_id: Optional[int] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + user_id: Optional[int] = Field(default=None, description='用户ID') + role_id: Optional[int] = Field(default=None, description='角色ID') class UserPostModel(BaseModel): """ 用户与岗位关联表对应pydantic模型 """ - user_id: Optional[int] - post_id: Optional[int] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + user_id: Optional[int] = Field(default=None, description='用户ID') + post_id: Optional[int] = Field(default=None, description='岗位ID') -class DeptModel(BaseModel): - """ - 部门表对应pydantic模型 - """ - dept_id: Optional[int] - parent_id: Optional[int] - ancestors: Optional[str] - dept_name: Optional[str] - order_num: Optional[int] - leader: Optional[str] - phone: Optional[str] - email: Optional[str] - status: Optional[str] - del_flag: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - class Config: - orm_mode = True +class UserInfoModel(UserModel): + post_ids: Optional[Union[str, None]] = Field(default=None, description='岗位ID信息') + role_ids: Optional[Union[str, None]] = Field(default=None, description='角色ID信息') + dept: Optional[Union[DeptModel, None]] = Field(default=None, description='部门信息') + role: Optional[List[Union[RoleModel, None]]] = Field(default=[], description='角色信息') -class RoleModel(BaseModel): - """ - 角色表对应pydantic模型 - """ - role_id: Optional[int] - role_name: Optional[str] - role_key: Optional[str] - role_sort: Optional[int] - data_scope: Optional[str] - menu_check_strictly: Optional[int] - dept_check_strictly: Optional[int] - status: Optional[str] - del_flag: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] +class CurrentUserModel(BaseModel): + model_config = ConfigDict(alias_generator=to_camel) - class Config: - orm_mode = True + permissions: List = Field(description='权限信息') + roles: List = Field(description='角色信息') + user: Union[UserInfoModel, None] = Field(description='用户信息') -class PostModel(BaseModel): +class UserDetailModel(BaseModel): """ - 岗位信息表对应pydantic模型 + 获取用户详情信息响应模型 """ - post_id: Optional[int] - post_code: Optional[str] - post_name: Optional[str] - post_sort: Optional[int] - status: Optional[str] - create_by: Optional[str] - create_time: Optional[str] - update_by: Optional[str] - update_time: Optional[str] - remark: Optional[str] - class Config: - orm_mode = True + model_config = ConfigDict(alias_generator=to_camel) - -class CurrentUserInfo(BaseModel): - """ - 数据库返回当前用户信息 - """ - user_basic_info: Union[UserModel, None] - user_dept_info: Union[DeptModel, None] - user_role_info: List[Union[RoleModel, None]] - user_post_info: List[Union[PostModel, None]] - user_menu_info: Union[List, None] + data: Optional[Union[UserInfoModel, None]] = Field(default=None, description='用户信息') + post_ids: Optional[List] = Field(default=None, description='岗位ID信息') + posts: List[Union[PostModel, None]] = Field(description='岗位信息') + role_ids: Optional[List] = Field(default=None, description='角色ID信息') + roles: List[Union[RoleModel, None]] = Field(description='角色信息') -class UserDetailModel(BaseModel): +class UserProfileModel(BaseModel): """ - 获取用户详情信息响应模型 + 获取个人信息响应模型 """ - user: Union[UserModel, None] - dept: Union[DeptModel, None] - role: List[Union[RoleModel, None]] - post: List[Union[PostModel, None]] + model_config = ConfigDict(alias_generator=to_camel) -class CurrentUserInfoServiceResponse(UserDetailModel): - """ - 获取当前用户信息响应模型 - """ - menu: Union[List, None] + data: Union[UserInfoModel, None] = Field(description='用户信息') + post_group: Union[str, None] = Field(description='岗位信息') + role_group: Union[str, None] = Field(description='角色信息') class UserQueryModel(UserModel): """ 用户管理不分页查询模型 """ - create_time_start: Optional[str] - create_time_end: Optional[str] + + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') -class UserPageObject(UserQueryModel): +@as_query +@as_form +class UserPageQueryModel(UserQueryModel): """ 用户管理分页查询模型 """ - page_num: int - page_size: int + + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') -class UserInfoJoinDept(UserModel): +class AddUserModel(UserModel): """ - 数据库查询用户列表返回模型 + 新增用户模型 """ - dept_name: Optional[str] + + role_ids: Optional[List] = Field(default=[], description='角色ID信息') + post_ids: Optional[List] = Field(default=[], description='岗位ID信息') + type: Optional[str] = Field(default=None, description='操作类型') -class UserPageObjectResponse(BaseModel): +class EditUserModel(AddUserModel): """ - 用户管理列表分页查询返回模型 + 编辑用户模型 """ - rows: List[Union[UserInfoJoinDept, None]] = [] - page_num: int - page_size: int - total: int - has_next: bool + role: Optional[List] = Field(default=[], description='角色信息') -class AddUserModel(UserModel): + +@as_query +class ResetPasswordModel(BaseModel): """ - 新增用户模型 + 重置密码模型 """ - role_id: Optional[str] - post_id: Optional[str] - type: Optional[str] + + model_config = ConfigDict(alias_generator=to_camel) + + old_password: Optional[str] = Field(default=None, description='旧密码') + new_password: Optional[str] = Field(default=None, description='新密码') + + @model_validator(mode='after') + def check_new_password(self) -> 'ResetPasswordModel': + pattern = r"""^[^<>"'|\\]+$""" + if self.new_password is None or re.match(pattern, self.new_password): + return self + else: + raise ModelValidatorException(message='密码不能包含非法字符:< > " \' \\ |') class ResetUserModel(UserModel): """ 重置用户密码模型 """ - old_password: Optional[str] - sms_code: Optional[str] - session_id: Optional[str] + + old_password: Optional[str] = Field(default=None, description='旧密码') + sms_code: Optional[str] = Field(default=None, description='验证码') + session_id: Optional[str] = Field(default=None, description='会话id') class DeleteUserModel(BaseModel): """ 删除用户模型 """ - user_ids: str - update_by: Optional[str] - update_time: Optional[str] + model_config = ConfigDict(alias_generator=to_camel) + + user_ids: str = Field(description='需要删除的用户ID') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') -class UserRoleQueryModel(UserRoleModel): + +class UserRoleQueryModel(UserModel): """ 用户角色关联管理不分页查询模型 """ - user_name: Optional[str] - phonenumber: Optional[str] - role_name: Optional[str] - role_key: Optional[str] + + role_id: Optional[int] = Field(default=None, description='角色ID') -class UserRolePageObject(UserRoleQueryModel): +@as_query +class UserRolePageQueryModel(UserRoleQueryModel): """ 用户角色关联管理分页查询模型 """ - page_num: int - page_size: int - -class UserRolePageObjectResponse(BaseModel): - """ - 用户角色关联管理列表分页查询返回模型 - """ - rows: List = [] - page_num: int - page_size: int - total: int - has_next: bool + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') -class CrudUserRoleModel(BaseModel): +class SelectedRoleModel(RoleModel): """ - 新增、删除用户关联角色及角色关联用户模型 + 是否选择角色模型 """ - user_ids: Optional[str] - role_ids: Optional[str] - -class ImportUserModel(BaseModel): - """ - 批量导入用户模型 - """ - url: str - is_update: bool + flag: Optional[bool] = Field(default=False, description='选择标识') -class CrudUserResponse(BaseModel): +class UserRoleResponseModel(BaseModel): """ - 操作用户响应模型 + 用户角色关联管理列表返回模型 """ - is_success: bool - message: str + model_config = ConfigDict(alias_generator=to_camel) -class DeptInfo(BaseModel): - """ - 查询部门树 - """ - dept_id: int - dept_name: str - ancestors: str + roles: List[Union[SelectedRoleModel, None]] = Field(default=[], description='角色信息') + user: UserInfoModel = Field(description='用户信息') -class RoleInfo(BaseModel): +@as_query +class CrudUserRoleModel(BaseModel): """ - 用户角色信息 + 新增、删除用户关联角色及角色关联用户模型 """ - role_info: Union[List, None] + model_config = ConfigDict(alias_generator=to_camel) -class MenuList(BaseModel): - """ - 用户菜单信息 - """ - menu_info: Union[List, None] + user_id: Optional[int] = Field(default=None, description='用户ID') + user_ids: Optional[str] = Field(default=None, description='用户ID信息') + role_id: Optional[int] = Field(default=None, description='角色ID') + role_ids: Optional[str] = Field(default=None, description='角色ID信息') diff --git a/dash-fastapi-backend/module_admin/service/cache_service.py b/dash-fastapi-backend/module_admin/service/cache_service.py index 1b0f92b..72212cb 100644 --- a/dash-fastapi-backend/module_admin/service/cache_service.py +++ b/dash-fastapi-backend/module_admin/service/cache_service.py @@ -1,7 +1,8 @@ from fastapi import Request -from module_admin.entity.vo.cache_vo import * -from config.env import RedisInitKeyConfig +from config.enums import RedisInitKeyConfig from config.get_redis import RedisUtil +from module_admin.entity.vo.cache_vo import CacheInfoModel, CacheMonitorModel +from module_admin.entity.vo.common_vo import CrudResponseModel class CacheService: @@ -13,35 +14,37 @@ class CacheService: async def get_cache_monitor_statistical_info_services(cls, request: Request): """ 获取缓存监控信息service + :param request: Request对象 :return: 缓存监控信息 """ info = await request.app.state.redis.info() db_size = await request.app.state.redis.dbsize() command_stats_dict = await request.app.state.redis.info('commandstats') - command_stats = [dict(name=key.split('_')[1], value=str(value.get('calls'))) for key, value in - command_stats_dict.items()] - result = dict(command_stats=command_stats, db_size=db_size, info=info) + command_stats = [ + dict(name=key.split('_')[1], value=str(value.get('calls'))) for key, value in command_stats_dict.items() + ] + result = CacheMonitorModel(commandStats=command_stats, dbSize=db_size, info=info) - return CacheMonitorModel(**result) + return result @classmethod - def get_cache_monitor_cache_name_services(cls): + async def get_cache_monitor_cache_name_services(cls): """ 获取缓存名称列表信息service + :return: 缓存名称列表信息 """ name_list = [] - for attr_name in dir(RedisInitKeyConfig): - if not attr_name.startswith('__') and isinstance(getattr(RedisInitKeyConfig, attr_name), dict): - name_list.append( - CacheInfoModel( - cache_key="", - cache_name=getattr(RedisInitKeyConfig, attr_name).get('key'), - cache_value="", - remark=getattr(RedisInitKeyConfig, attr_name).get('remark') - ) + for key_config in RedisInitKeyConfig: + name_list.append( + CacheInfoModel( + cacheKey='', + cacheName=key_config.key, + cacheValue='', + remark=key_config.remark, ) + ) return name_list @@ -49,12 +52,13 @@ class CacheService: async def get_cache_monitor_cache_key_services(cls, request: Request, cache_name: str): """ 获取缓存键名列表信息service + :param request: Request对象 :param cache_name: 缓存名称 :return: 缓存键名列表信息 """ - cache_keys = await request.app.state.redis.keys(f"{cache_name}*") - cache_key_list = [key.split(':', 1)[1] for key in cache_keys if key.startswith(f"{cache_name}:")] + cache_keys = await request.app.state.redis.keys(f'{cache_name}*') + cache_key_list = [key.split(':', 1)[1] for key in cache_keys if key.startswith(f'{cache_name}:')] return cache_key_list @@ -62,48 +66,51 @@ class CacheService: async def get_cache_monitor_cache_value_services(cls, request: Request, cache_name: str, cache_key: str): """ 获取缓存内容信息service + :param request: Request对象 :param cache_name: 缓存名称 :param cache_key: 缓存键名 :return: 缓存内容信息 """ - cache_value = await request.app.state.redis.get(f"{cache_name}:{cache_key}") + cache_value = await request.app.state.redis.get(f'{cache_name}:{cache_key}') - return CacheInfoModel(cache_key=cache_key, cache_name=cache_name, cache_value=cache_value, remark="") + return CacheInfoModel(cacheKey=cache_key, cacheName=cache_name, cacheValue=cache_value, remark='') @classmethod async def clear_cache_monitor_cache_name_services(cls, request: Request, cache_name: str): """ 清除缓存名称对应所有键值service + :param request: Request对象 :param cache_name: 缓存名称 :return: 操作缓存响应信息 """ - cache_keys = await request.app.state.redis.keys(f"{cache_name}*") + cache_keys = await request.app.state.redis.keys(f'{cache_name}*') if cache_keys: await request.app.state.redis.delete(*cache_keys) - result = dict(is_success=True, message=f"{cache_name}对应键值清除成功") - return CrudCacheResponse(**result) + return CrudResponseModel(is_success=True, message=f'{cache_name}对应键值清除成功') @classmethod - async def clear_cache_monitor_cache_key_services(cls, request: Request, cache_name: str, cache_key: str): + async def clear_cache_monitor_cache_key_services(cls, request: Request, cache_key: str): """ 清除缓存名称对应所有键值service + :param request: Request对象 - :param cache_name: 缓存名称 :param cache_key: 缓存键名 :return: 操作缓存响应信息 """ - await request.app.state.redis.delete(f"{cache_name}:{cache_key}") - result = dict(is_success=True, message=f"{cache_name}:{cache_key}清除成功") + cache_keys = await request.app.state.redis.keys(f'*{cache_key}') + if cache_keys: + await request.app.state.redis.delete(*cache_keys) - return CrudCacheResponse(**result) + return CrudResponseModel(is_success=True, message=f'{cache_key}清除成功') @classmethod async def clear_cache_monitor_all_services(cls, request: Request): """ 清除所有缓存service + :param request: Request对象 :return: 操作缓存响应信息 """ @@ -111,8 +118,7 @@ class CacheService: if cache_keys: await request.app.state.redis.delete(*cache_keys) - result = dict(is_success=True, message="所有缓存清除成功") await RedisUtil.init_sys_dict(request.app.state.redis) await RedisUtil.init_sys_config(request.app.state.redis) - return CrudCacheResponse(**result) + return CrudResponseModel(is_success=True, message='所有缓存清除成功') diff --git a/dash-fastapi-backend/module_admin/service/captcha_service.py b/dash-fastapi-backend/module_admin/service/captcha_service.py index bcad42c..1be8ffb 100644 --- a/dash-fastapi-backend/module_admin/service/captcha_service.py +++ b/dash-fastapi-backend/module_admin/service/captcha_service.py @@ -1,8 +1,8 @@ -from PIL import Image, ImageDraw, ImageFont +import base64 import io import os import random -import base64 +from PIL import Image, ImageDraw, ImageFont class CaptchaService: @@ -11,15 +11,15 @@ class CaptchaService: """ @classmethod - def create_captcha_image_service(cls): + async def create_captcha_image_service(cls): # 创建空白图像 - image = Image.new('RGB', (400, 300), color='#EAEAEA') + image = Image.new('RGB', (160, 60), color='#EAEAEA') # 创建绘图对象 draw = ImageDraw.Draw(image) # 设置字体 - font = ImageFont.truetype(os.path.join(os.path.abspath(os.getcwd()), 'assets', 'font', 'Arial.ttf'), size=100) + font = ImageFont.truetype(os.path.join(os.path.abspath(os.getcwd()), 'assets', 'font', 'Arial.ttf'), size=30) # 生成两个0-9之间的随机整数 num1 = random.randint(0, 9) @@ -35,14 +35,14 @@ class CaptchaService: else: result = num1 * num2 # 绘制文本 - text = f"{num1} {operational_character} {num2} = ?" - draw.text((10, 120), text, fill='blue', font=font) + text = f'{num1} {operational_character} {num2} = ?' + draw.text((25, 15), text, fill='blue', font=font) # 将图像数据保存到内存中 buffer = io.BytesIO() image.save(buffer, format='PNG') # 将图像数据转换为base64字符串 - base64_string = f'data:image/png;base64,{base64.b64encode(buffer.getvalue()).decode()}' + base64_string = base64.b64encode(buffer.getvalue()).decode() return [base64_string, result] diff --git a/dash-fastapi-backend/module_admin/service/common_service.py b/dash-fastapi-backend/module_admin/service/common_service.py index 447f28a..20eb868 100644 --- a/dash-fastapi-backend/module_admin/service/common_service.py +++ b/dash-fastapi-backend/module_admin/service/common_service.py @@ -1,5 +1,10 @@ import os -from fastapi import UploadFile +from datetime import datetime +from fastapi import BackgroundTasks, Request, UploadFile +from config.env import UploadConfig +from exceptions.exception import ServiceException +from module_admin.entity.vo.common_vo import CrudResponseModel, UploadResponseModel +from utils.upload_util import UploadUtil class CommonService: @@ -8,11 +13,79 @@ class CommonService: """ @classmethod - def upload_service(cls, path: str, task_path: str, upload_id: str, file: UploadFile): + async def upload_service(cls, request: Request, file: UploadFile): + """ + 通用上传service - filepath = os.path.join(path, task_path, upload_id, f'{file.filename}') - with open(filepath, 'wb') as f: - # 流式写出大型文件,这里的10代表10MB - for chunk in iter(lambda: file.file.read(1024 * 1024 * 10), b''): - f.write(chunk) + :param request: Request对象 + :param file: 上传文件对象 + :return: 上传结果 + """ + if not UploadUtil.check_file_extension(file): + raise ServiceException(message='文件类型不合法') + else: + relative_path = f'upload/{datetime.now().strftime("%Y")}/{datetime.now().strftime("%m")}/{datetime.now().strftime("%d")}' + dir_path = os.path.join(UploadConfig.UPLOAD_PATH, relative_path) + try: + os.makedirs(dir_path) + except FileExistsError: + pass + filename = f'{file.filename.rsplit(".", 1)[0]}_{datetime.now().strftime("%Y%m%d%H%M%S")}{UploadConfig.UPLOAD_MACHINE}{UploadUtil.generate_random_number()}.{file.filename.rsplit(".")[-1]}' + filepath = os.path.join(dir_path, filename) + with open(filepath, 'wb') as f: + # 流式写出大型文件,这里的10代表10MB + for chunk in iter(lambda: file.file.read(1024 * 1024 * 10), b''): + f.write(chunk) + return CrudResponseModel( + is_success=True, + result=UploadResponseModel( + fileName=f'{UploadConfig.UPLOAD_PREFIX}/{relative_path}/{filename}', + newFileName=filename, + originalFilename=file.filename, + url=f'{request.base_url}{UploadConfig.UPLOAD_PREFIX[1:]}/{relative_path}/{filename}', + ), + message='上传成功', + ) + + @classmethod + async def download_services(cls, background_tasks: BackgroundTasks, file_name, delete: bool): + """ + 下载下载目录文件service + + :param background_tasks: 后台任务对象 + :param file_name: 下载的文件名称 + :param delete: 是否在下载完成后删除文件 + :return: 上传结果 + """ + filepath = os.path.join(UploadConfig.DOWNLOAD_PATH, file_name) + if '..' in file_name: + raise ServiceException(message='文件名称不合法') + elif not UploadUtil.check_file_exists(filepath): + raise ServiceException(message='文件不存在') + else: + if delete: + background_tasks.add_task(UploadUtil.delete_file, filepath) + return CrudResponseModel(is_success=True, result=UploadUtil.generate_file(filepath), message='下载成功') + + @classmethod + async def download_resource_services(cls, resource: str): + """ + 下载上传目录文件service + + :param resource: 下载的文件名称 + :return: 上传结果 + """ + filepath = os.path.join(resource.replace(UploadConfig.UPLOAD_PREFIX, UploadConfig.UPLOAD_PATH)) + filename = resource.rsplit('/', 1)[-1] + if ( + '..' in filename + or not UploadUtil.check_file_timestamp(filename) + or not UploadUtil.check_file_machine(filename) + or not UploadUtil.check_file_random_code(filename) + ): + raise ServiceException(message='文件名称不合法') + elif not UploadUtil.check_file_exists(filepath): + raise ServiceException(message='文件不存在') + else: + return CrudResponseModel(is_success=True, result=UploadUtil.generate_file(filepath), message='下载成功') diff --git a/dash-fastapi-backend/module_admin/service/config_service.py b/dash-fastapi-backend/module_admin/service/config_service.py index 3e9674a..1d8ec76 100644 --- a/dash-fastapi-backend/module_admin/service/config_service.py +++ b/dash-fastapi-backend/module_admin/service/config_service.py @@ -1,8 +1,13 @@ from fastapi import Request -from config.env import RedisInitKeyConfig -from module_admin.entity.vo.config_vo import * -from module_admin.dao.config_dao import * -from utils.common_util import export_list2excel +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.constant import CommonConstant +from config.enums import RedisInitKeyConfig +from exceptions.exception import ServiceException +from module_admin.dao.config_dao import ConfigDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel, DeleteConfigModel +from utils.common_util import CamelCaseUtil, export_list2excel class ConfigService: @@ -11,180 +16,220 @@ class ConfigService: """ @classmethod - def get_config_list_services(cls, result_db: Session, query_object: ConfigQueryModel): + async def get_config_list_services( + cls, query_db: AsyncSession, query_object: ConfigPageQueryModel, is_page: bool = False + ): """ 获取参数配置列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 参数配置列表信息对象 """ - config_list_result = ConfigDao.get_config_list(result_db, query_object) + config_list_result = await ConfigDao.get_config_list(query_db, query_object, is_page) return config_list_result @classmethod - async def init_cache_sys_config_services(cls, result_db: Session, redis): + async def init_cache_sys_config_services(cls, query_db: AsyncSession, redis): """ 应用初始化:获取所有参数配置对应的键值对信息并缓存service - :param result_db: orm对象 + + :param query_db: orm对象 :param redis: redis对象 :return: """ # 获取以sys_config:开头的键列表 - keys = await redis.keys(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:*") + keys = await redis.keys(f'{RedisInitKeyConfig.SYS_CONFIG.key}:*') # 删除匹配的键 if keys: await redis.delete(*keys) - config_all = ConfigDao.get_config_list(result_db, ConfigQueryModel(**dict())) + config_all = await ConfigDao.get_config_list(query_db, ConfigPageQueryModel(**dict()), is_page=False) for config_obj in config_all: - if config_obj.config_type == 'Y': - await redis.set(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_obj.config_key}", config_obj.config_value) + await redis.set( + f"{RedisInitKeyConfig.SYS_CONFIG.key}:{config_obj.get('configKey')}", + config_obj.get('configValue'), + ) @classmethod async def query_config_list_from_cache_services(cls, redis, config_key: str): """ 从缓存获取参数键名对应值service + :param redis: redis对象 :param config_key: 参数键名 :return: 参数键名对应值 """ - result = await redis.get(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_key}") + result = await redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:{config_key}') return result @classmethod - async def add_config_services(cls, request: Request, result_db: Session, page_object: ConfigModel): + async def check_config_key_unique_services(cls, query_db: AsyncSession, page_object: ConfigModel): + """ + 校验参数键名是否唯一service + + :param query_db: orm对象 + :param page_object: 参数配置对象 + :return: 校验结果 + """ + config_id = -1 if page_object.config_id is None else page_object.config_id + config = await ConfigDao.get_config_detail_by_info(query_db, ConfigModel(configKey=page_object.config_key)) + if config and config.config_id != config_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def add_config_services(cls, request: Request, query_db: AsyncSession, page_object: ConfigModel): """ 新增参数配置信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 新增参数配置对象 :return: 新增参数配置校验结果 """ - config = ConfigDao.get_config_detail_by_info(result_db, ConfigModel(**dict(config_key=page_object.config_key))) - if config: - result = dict(is_success=False, message='参数键名已存在') + if not await cls.check_config_key_unique_services(query_db, page_object): + raise ServiceException(message=f'新增参数{page_object.config_name}失败,参数键名已存在') else: try: - ConfigDao.add_config_dao(result_db, page_object) - result_db.commit() - await cls.init_cache_sys_config_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='新增成功') + await ConfigDao.add_config_dao(query_db, page_object) + await query_db.commit() + await request.app.state.redis.set( + f'{RedisInitKeyConfig.SYS_CONFIG.key}:{page_object.config_key}', page_object.config_value + ) + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudConfigResponse(**result) + await query_db.rollback() + raise e @classmethod - async def edit_config_services(cls, request: Request, result_db: Session, page_object: ConfigModel): + async def edit_config_services(cls, request: Request, query_db: AsyncSession, page_object: ConfigModel): """ 编辑参数配置信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 编辑参数配置对象 :return: 编辑参数配置校验结果 """ - edit_config = page_object.dict(exclude_unset=True) - config_info = cls.detail_config_services(result_db, edit_config.get('config_id')) - if config_info: - if config_info.config_key != page_object.config_key or config_info.config_value != page_object.config_value: - config = ConfigDao.get_config_detail_by_info(result_db, page_object) - if config: - result = dict(is_success=False, message='参数配置已存在') - return CrudConfigResponse(**result) - try: - ConfigDao.edit_config_dao(result_db, edit_config) - result_db.commit() - await cls.init_cache_sys_config_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='更新成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + edit_config = page_object.model_dump(exclude_unset=True) + config_info = await cls.config_detail_services(query_db, page_object.config_id) + if config_info.config_id: + if not await cls.check_config_key_unique_services(query_db, page_object): + raise ServiceException(message=f'修改参数{page_object.config_name}失败,参数键名已存在') + else: + try: + await ConfigDao.edit_config_dao(query_db, edit_config) + await query_db.commit() + if config_info.config_key != page_object.config_key: + await request.app.state.redis.delete( + f'{RedisInitKeyConfig.SYS_CONFIG.key}:{config_info.config_key}' + ) + await request.app.state.redis.set( + f'{RedisInitKeyConfig.SYS_CONFIG.key}:{page_object.config_key}', page_object.config_value + ) + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='参数配置不存在') - - return CrudConfigResponse(**result) + raise ServiceException(message='参数配置不存在') @classmethod - async def delete_config_services(cls, request: Request, result_db: Session, page_object: DeleteConfigModel): + async def delete_config_services(cls, request: Request, query_db: AsyncSession, page_object: DeleteConfigModel): """ 删除参数配置信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 删除参数配置对象 :return: 删除参数配置校验结果 """ - if page_object.config_ids.split(','): + if page_object.config_ids: config_id_list = page_object.config_ids.split(',') try: + delete_config_key_list = [] for config_id in config_id_list: - config_id_dict = dict(config_id=config_id) - ConfigDao.delete_config_dao(result_db, ConfigModel(**config_id_dict)) - result_db.commit() - await cls.init_cache_sys_config_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='删除成功') + config_info = await cls.config_detail_services(query_db, int(config_id)) + if config_info.config_type == CommonConstant.YES: + raise ServiceException(message=f'内置参数{config_info.config_key}不能删除') + else: + await ConfigDao.delete_config_dao(query_db, ConfigModel(configId=int(config_id))) + delete_config_key_list.append(f'{RedisInitKeyConfig.SYS_CONFIG.key}:{config_info.config_key}') + await query_db.commit() + if delete_config_key_list: + await request.app.state.redis.delete(*delete_config_key_list) + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入字典数据id为空') - return CrudConfigResponse(**result) + raise ServiceException(message='传入参数配置id为空') @classmethod - def detail_config_services(cls, result_db: Session, config_id: int): + async def config_detail_services(cls, query_db: AsyncSession, config_id: int): """ 获取参数配置详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param config_id: 参数配置id :return: 参数配置id对应的信息 """ - config = ConfigDao.get_config_detail_by_id(result_db, config_id=config_id) + config = await ConfigDao.get_config_detail_by_id(query_db, config_id=config_id) + if config: + result = ConfigModel(**CamelCaseUtil.transform_result(config)) + else: + result = ConfigModel(**dict()) - return config + return result @staticmethod - def export_config_list_services(config_list: List): + async def export_config_list_services(config_list: List): """ 导出参数配置信息service + :param config_list: 参数配置信息列表 :return: 参数配置信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "config_id": "参数主键", - "config_name": "参数名称", - "config_key": "参数键名", - "config_value": "参数键值", - "config_type": "系统内置", - "create_by": "创建者", - "create_time": "创建时间", - "update_by": "更新者", - "update_time": "更新时间", - "remark": "备注", + 'configId': '参数主键', + 'configName': '参数名称', + 'configKey': '参数键名', + 'configValue': '参数键值', + 'configType': '系统内置', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } - data = [ConfigModel(**vars(row)).dict() for row in config_list] + data = config_list for item in data: - if item.get('config_type') == 'Y': - item['config_type'] = '是' + if item.get('configType') == 'Y': + item['configType'] = '是' else: - item['config_type'] = '否' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + item['configType'] = '否' + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data @classmethod - async def refresh_sys_config_services(cls, request: Request, result_db: Session): + async def refresh_sys_config_services(cls, request: Request, query_db: AsyncSession): """ 刷新字典缓存信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :return: 刷新字典缓存校验结果 """ - await cls.init_cache_sys_config_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='刷新成功') + await cls.init_cache_sys_config_services(query_db, request.app.state.redis) - return CrudConfigResponse(**result) + return CrudResponseModel(is_success=True, message='刷新成功') diff --git a/dash-fastapi-backend/module_admin/service/dept_service.py b/dash-fastapi-backend/module_admin/service/dept_service.py index 0be3d4a..a0e49e5 100644 --- a/dash-fastapi-backend/module_admin/service/dept_service.py +++ b/dash-fastapi-backend/module_admin/service/dept_service.py @@ -1,5 +1,10 @@ -from module_admin.entity.vo.dept_vo import * -from module_admin.dao.dept_dao import * +from sqlalchemy.ext.asyncio import AsyncSession +from config.constant import CommonConstant +from exceptions.exception import ServiceException, ServiceWarning +from module_admin.dao.dept_dao import DeptDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.dept_vo import DeleteDeptModel, DeptModel +from utils.common_util import CamelCaseUtil class DeptService: @@ -8,172 +13,210 @@ class DeptService: """ @classmethod - def get_dept_tree_services(cls, result_db: Session, page_object: DeptModel, data_scope_sql: str): + async def get_dept_tree_services(cls, query_db: AsyncSession, page_object: DeptModel, data_scope_sql: str): """ 获取部门树信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 部门树信息对象 """ - dept_list_result = DeptDao.get_dept_list_for_tree(result_db, page_object, data_scope_sql) + dept_list_result = await DeptDao.get_dept_list_for_tree(query_db, page_object, data_scope_sql) dept_tree_result = cls.list_to_tree(dept_list_result) return dept_tree_result @classmethod - def get_dept_tree_for_edit_option_services(cls, result_db: Session, page_object: DeptModel, data_scope_sql: str): + async def get_dept_for_edit_option_services( + cls, query_db: AsyncSession, page_object: DeptModel, data_scope_sql: str + ): """ 获取部门编辑部门树信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 部门树信息对象 """ - dept_list_result = DeptDao.get_dept_info_for_edit_option(result_db, page_object, data_scope_sql) - dept_tree_result = cls.list_to_tree(dept_list_result) + dept_list_result = await DeptDao.get_dept_info_for_edit_option(query_db, page_object, data_scope_sql) - return dept_tree_result + return CamelCaseUtil.transform_result(dept_list_result) @classmethod - def get_dept_list_services(cls, result_db: Session, page_object: DeptModel, data_scope_sql: str): + async def get_dept_list_services(cls, query_db: AsyncSession, page_object: DeptModel, data_scope_sql: str): """ 获取部门列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 分页查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 部门列表信息对象 """ - dept_list_result = DeptDao.get_dept_list(result_db, page_object, data_scope_sql) + dept_list_result = await DeptDao.get_dept_list(query_db, page_object, data_scope_sql) + + return CamelCaseUtil.transform_result(dept_list_result) - return dept_list_result + @classmethod + async def check_dept_data_scope_services(cls, query_db: AsyncSession, dept_id: int, data_scope_sql: str): + """ + 校验部门是否有数据权限service + + :param query_db: orm对象 + :param dept_id: 部门id + :param data_scope_sql: 数据权限对应的查询sql语句 + :return: 校验结果 + """ + depts = await DeptDao.get_dept_list(query_db, DeptModel(deptId=dept_id), data_scope_sql) + if depts: + return CrudResponseModel(is_success=True, message='校验通过') + else: + raise ServiceException(message='没有权限访问部门数据') @classmethod - def add_dept_services(cls, result_db: Session, page_object: DeptModel): + async def check_dept_name_unique_services(cls, query_db: AsyncSession, page_object: DeptModel): + """ + 校验部门名称是否唯一service + + :param query_db: orm对象 + :param page_object: 部门对象 + :return: 校验结果 + """ + dept_id = -1 if page_object.dept_id is None else page_object.dept_id + dept = await DeptDao.get_dept_detail_by_info( + query_db, DeptModel(deptName=page_object.dept_name, parentId=page_object.parent_id) + ) + if dept and dept.dept_id != dept_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def add_dept_services(cls, query_db: AsyncSession, page_object: DeptModel): """ 新增部门信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增部门对象 :return: 新增部门校验结果 """ - parent_info = DeptDao.get_dept_by_id(result_db, page_object.parent_id) - if parent_info: - page_object.ancestors = f'{parent_info.ancestors},{page_object.parent_id}' - else: - page_object.ancestors = '0' - dept = DeptDao.get_dept_detail_by_info(result_db, DeptModel(**dict(parent_id=page_object.parent_id, dept_name=page_object.dept_name))) - if dept: - result = dict(is_success=False, message='同一部门下不允许存在同名的部门') - else: - try: - DeptDao.add_dept_dao(result_db, page_object) - result_db.commit() - result = dict(is_success=True, message='新增成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudDeptResponse(**result) + if not await cls.check_dept_name_unique_services(query_db, page_object): + raise ServiceException(message=f'新增部门{page_object.dept_name}失败,部门名称已存在') + parent_info = await DeptDao.get_dept_by_id(query_db, page_object.parent_id) + if parent_info.status != CommonConstant.DEPT_NORMAL: + raise ServiceException(message=f'部门{parent_info.dept_name}停用,不允许新增') + page_object.ancestors = f'{parent_info.ancestors},{page_object.parent_id}' + try: + await DeptDao.add_dept_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') + except Exception as e: + await query_db.rollback() + raise e @classmethod - def edit_dept_services(cls, result_db: Session, page_object: DeptModel): + async def edit_dept_services(cls, query_db: AsyncSession, page_object: DeptModel): """ 编辑部门信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 编辑部门对象 :return: 编辑部门校验结果 """ - parent_info = DeptDao.get_dept_by_id(result_db, page_object.parent_id) - if parent_info: - page_object.ancestors = f'{parent_info.ancestors},{page_object.parent_id}' - else: - page_object.ancestors = '0' - edit_dept = page_object.dict(exclude_unset=True) - dept_info = cls.detail_dept_services(result_db, edit_dept.get('dept_id')) - if dept_info: - if dept_info.parent_id != page_object.parent_id or dept_info.dept_name != page_object.dept_name: - dept = DeptDao.get_dept_detail_by_info(result_db, DeptModel( - **dict(parent_id=page_object.parent_id, dept_name=page_object.dept_name))) - if dept: - result = dict(is_success=False, message='同一部门下不允许存在同名的部门') - return CrudDeptResponse(**result) - try: - DeptDao.edit_dept_dao(result_db, edit_dept) - cls.update_children_info(result_db, DeptModel(dept_id=page_object.dept_id, - ancestors=page_object.ancestors, - update_by=page_object.update_by, - update_time=page_object.update_time - ) - ) - result_db.commit() - result = dict(is_success=True, message='更新成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - else: - result = dict(is_success=False, message='部门不存在') - - return CrudDeptResponse(**result) + if not await cls.check_dept_name_unique_services(query_db, page_object): + raise ServiceException(message=f'修改部门{page_object.dept_name}失败,部门名称已存在') + elif page_object.dept_id == page_object.parent_id: + raise ServiceException(message=f'修改部门{page_object.dept_name}失败,上级部门不能是自己') + elif ( + page_object.status == CommonConstant.DEPT_DISABLE + and (await DeptDao.count_normal_children_dept_dao(query_db, page_object.dept_id)) > 0 + ): + raise ServiceException(message=f'修改部门{page_object.dept_name}失败,该部门包含未停用的子部门') + new_parent_dept = await DeptDao.get_dept_by_id(query_db, page_object.parent_id) + old_dept = await DeptDao.get_dept_by_id(query_db, page_object.dept_id) + try: + if new_parent_dept and old_dept: + new_ancestors = f'{new_parent_dept.ancestors},{new_parent_dept.dept_id}' + old_ancestors = old_dept.ancestors + page_object.ancestors = new_ancestors + await cls.update_dept_children(query_db, page_object.dept_id, new_ancestors, old_ancestors) + edit_dept = page_object.model_dump(exclude_unset=True) + await DeptDao.edit_dept_dao(query_db, edit_dept) + if ( + page_object.status == CommonConstant.DEPT_NORMAL + and page_object.ancestors + and page_object.ancestors != 0 + ): + await cls.update_parent_dept_status_normal(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e @classmethod - def delete_dept_services(cls, result_db: Session, page_object: DeleteDeptModel): + async def delete_dept_services(cls, query_db: AsyncSession, page_object: DeleteDeptModel): """ 删除部门信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除部门对象 :return: 删除部门校验结果 """ - if page_object.dept_ids.split(','): + if page_object.dept_ids: dept_id_list = page_object.dept_ids.split(',') - ancestors = DeptDao.get_dept_all_ancestors(result_db) try: for dept_id in dept_id_list: - for ancestor in ancestors: - if dept_id in ancestor[0]: - result = dict(is_success=False, message='该部门下有子部门,不允许删除') + if (await DeptDao.count_children_dept_dao(query_db, int(dept_id))) > 0: + raise ServiceWarning(message='存在下级部门,不允许删除') + elif (await DeptDao.count_dept_user_dao(query_db, int(dept_id))) > 0: + raise ServiceWarning(message='部门存在用户,不允许删除') - return CrudDeptResponse(**result) - - dept_id_dict = dict(dept_id=dept_id) - DeptDao.delete_dept_dao(result_db, DeptModel(**dept_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + await DeptDao.delete_dept_dao(query_db, DeptModel(deptId=dept_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入部门id为空') - return CrudDeptResponse(**result) + raise ServiceException(message='传入部门id为空') @classmethod - def detail_dept_services(cls, result_db: Session, dept_id: int): + async def dept_detail_services(cls, query_db: AsyncSession, dept_id: int): """ 获取部门详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param dept_id: 部门id :return: 部门id对应的信息 """ - dept = DeptDao.get_dept_detail_by_id(result_db, dept_id=dept_id) + dept = await DeptDao.get_dept_detail_by_id(query_db, dept_id=dept_id) + if dept: + result = DeptModel(**CamelCaseUtil.transform_result(dept)) + else: + result = DeptModel(**dict()) - return dept + return result @classmethod def list_to_tree(cls, permission_list: list) -> list: """ 工具方法:根据部门列表信息生成树形嵌套数据 + :param permission_list: 部门列表信息 :return: 部门树形嵌套数据 """ - permission_list = [dict(title=item.dept_name, key=str(item.dept_id), value=str(item.dept_id), parent_id=str(item.parent_id)) for item in permission_list] - # 转成dept_id为key的字典 - mapping: dict = dict(zip([i['key'] for i in permission_list], permission_list)) + permission_list = [ + dict(id=item.dept_id, label=item.dept_name, parentId=item.parent_id) for item in permission_list + ] + # 转成id为key的字典 + mapping: dict = dict(zip([i['id'] for i in permission_list], permission_list)) # 树容器 container: list = [] for d in permission_list: # 如果找不到父级项,则是根节点 - parent: dict = mapping.get(d['parent_id']) + parent: dict = mapping.get(d['parentId']) if parent is None: container.append(d) else: @@ -186,52 +229,47 @@ class DeptService: return container @classmethod - def get_dept_tree(cls, pid: int, permission_list: DeptTree): + async def replace_first(cls, original_str: str, old_str: str, new_str: str): """ - 工具方法:根据部门信息生成树形嵌套数据 - :param pid: 部门id - :param permission_list: 部门列表信息 - :return: 部门树形嵌套数据 + 工具方法:替换字符串 + + :param original_str: 需要替换的原始字符串 + :param old_str: 用于匹配的字符串 + :param new_str: 替换的字符串 + :return: 替换后的字符串 """ - dept_list = [] - for permission in permission_list.dept_tree: - if permission.parent_id == pid: - children = cls.get_dept_tree(permission.dept_id, permission_list) - dept_list_data = {} - if children: - dept_list_data['title'] = permission.dept_name - dept_list_data['key'] = str(permission.dept_id) - dept_list_data['value'] = str(permission.dept_id) - dept_list_data['children'] = children - else: - dept_list_data['title'] = permission.dept_name - dept_list_data['key'] = str(permission.dept_id) - dept_list_data['value'] = str(permission.dept_id) - dept_list.append(dept_list_data) - - return dept_list + if original_str.startswith(old_str): + return original_str.replace(old_str, new_str, 1) + else: + return original_str @classmethod - def update_children_info(cls, result_db, page_object): + async def update_parent_dept_status_normal(cls, query_db: AsyncSession, dept: DeptModel): """ - 工具方法:递归更新子部门信息 - :param result_db: orm对象 - :param page_object: 编辑部门对象 + 更新父部门状态为正常 + + :param query_db: orm对象 + :param dept: 部门对象 + :return: + """ + dept_id_list = dept.ancestors.split(',') + await DeptDao.update_dept_status_normal_dao(query_db, dept_id_list) + + @classmethod + async def update_dept_children(cls, query_db: AsyncSession, dept_id: int, new_ancestors: str, old_ancestors: str): + """ + 更新子部门信息 + + :param query_db: orm对象 + :param dept_id: 部门id + :param new_ancestors: 新的祖先 + :param old_ancestors: 旧的祖先 :return: """ - children_info = DeptDao.get_children_dept(result_db, page_object.dept_id) - if children_info: - for child in children_info: - child.ancestors = f'{page_object.ancestors},{page_object.dept_id}' - DeptDao.edit_dept_dao(result_db, - dict(dept_id=child.dept_id, - ancestors=child.ancestors, - update_by=page_object.update_by, - update_time=page_object.update_time - ) - ) - cls.update_children_info(result_db, DeptModel(dept_id=child.dept_id, - ancestors=child.ancestors, - update_by=page_object.update_by, - update_time=page_object.update_time - )) + children = await DeptDao.get_children_dept_dao(query_db, dept_id) + update_children = [] + for child in children: + child_ancestors = await cls.replace_first(child.ancestors, old_ancestors, new_ancestors) + update_children.append({'dept_id': child.dept_id, 'ancestors': child_ancestors}) + if children: + await DeptDao.update_dept_children_dao(query_db, update_children) diff --git a/dash-fastapi-backend/module_admin/service/dict_service.py b/dash-fastapi-backend/module_admin/service/dict_service.py index e557b2f..5354083 100644 --- a/dash-fastapi-backend/module_admin/service/dict_service.py +++ b/dash-fastapi-backend/module_admin/service/dict_service.py @@ -1,9 +1,21 @@ -from fastapi import Request import json -from config.env import RedisInitKeyConfig -from module_admin.entity.vo.dict_vo import * -from module_admin.dao.dict_dao import * -from utils.common_util import export_list2excel +from fastapi import Request +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.constant import CommonConstant +from config.enums import RedisInitKeyConfig +from exceptions.exception import ServiceException +from module_admin.dao.dict_dao import DictDataDao, DictTypeDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.dict_vo import ( + DeleteDictDataModel, + DeleteDictTypeModel, + DictDataModel, + DictDataPageQueryModel, + DictTypeModel, + DictTypePageQueryModel, +) +from utils.common_util import CamelCaseUtil, export_list2excel class DictTypeService: @@ -12,170 +24,201 @@ class DictTypeService: """ @classmethod - def get_dict_type_list_services(cls, result_db: Session, query_object: DictTypeQueryModel): + async def get_dict_type_list_services( + cls, query_db: AsyncSession, query_object: DictTypePageQueryModel, is_page: bool = False + ): """ 获取字典类型列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 字典类型列表信息对象 """ - dict_type_list_result = DictTypeDao.get_dict_type_list(result_db, query_object) + dict_type_list_result = await DictTypeDao.get_dict_type_list(query_db, query_object, is_page) return dict_type_list_result @classmethod - def get_all_dict_type_services(cls, result_db: Session): + async def check_dict_type_unique_services(cls, query_db: AsyncSession, page_object: DictTypeModel): """ - 获取字所有典类型列表信息service - :param result_db: orm对象 - :return: 字典类型列表信息对象 - """ - dict_type_list_result = DictTypeDao.get_all_dict_type(result_db) + 校验字典类型称是否唯一service - return dict_type_list_result + :param query_db: orm对象 + :param page_object: 字典类型对象 + :return: 校验结果 + """ + dict_id = -1 if page_object.dict_id is None else page_object.dict_id + dict_type = await DictTypeDao.get_dict_type_detail_by_info( + query_db, DictTypeModel(dictType=page_object.dict_type) + ) + if dict_type and dict_type.dict_id != dict_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE @classmethod - async def add_dict_type_services(cls, request: Request, result_db: Session, page_object: DictTypeModel): + async def add_dict_type_services(cls, request: Request, query_db: AsyncSession, page_object: DictTypeModel): """ 新增字典类型信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 新增岗位对象 :return: 新增字典类型校验结果 """ - dict_type = DictTypeDao.get_dict_type_detail_by_info(result_db, DictTypeModel(**dict(dict_type=page_object.dict_type))) - if dict_type: - result = dict(is_success=False, message='字典类型已存在') + if not await cls.check_dict_type_unique_services(query_db, page_object): + raise ServiceException(message=f'新增字典{page_object.dict_name}失败,字典类型已存在') else: try: - DictTypeDao.add_dict_type_dao(result_db, page_object) - result_db.commit() - await DictDataService.init_cache_sys_dict_services(result_db, request.app.state.redis) + await DictTypeDao.add_dict_type_dao(query_db, page_object) + await query_db.commit() + await request.app.state.redis.set(f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', '') result = dict(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e - return CrudDictResponse(**result) + return CrudResponseModel(**result) @classmethod - async def edit_dict_type_services(cls, request: Request, result_db: Session, page_object: DictTypeModel): + async def edit_dict_type_services(cls, request: Request, query_db: AsyncSession, page_object: DictTypeModel): """ 编辑字典类型信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 编辑字典类型对象 :return: 编辑字典类型校验结果 """ - edit_dict_type = page_object.dict(exclude_unset=True) - dict_type_info = cls.detail_dict_type_services(result_db, edit_dict_type.get('dict_id')) - if dict_type_info: - if dict_type_info.dict_type != page_object.dict_type or dict_type_info.dict_name != page_object.dict_name: - dict_type = DictTypeDao.get_dict_type_detail_by_info(result_db, DictTypeModel( - **dict(dict_type=page_object.dict_type))) - if dict_type: - result = dict(is_success=False, message='字典类型已存在') - return CrudDictResponse(**result) - try: - if dict_type_info.dict_type != page_object.dict_type: - query_dict_data = DictDataModel(**(dict(dict_type=dict_type_info.dict_type))) - dict_data_list = DictDataDao.get_dict_data_list(result_db, query_dict_data) - for dict_data in dict_data_list: - edit_dict_data = DictDataModel(**(dict(dict_code=dict_data.dict_code, dict_type=page_object.dict_type, update_by=page_object.update_by))).dict(exclude_unset=True) - DictDataDao.edit_dict_data_dao(result_db, edit_dict_data) - DictTypeDao.edit_dict_type_dao(result_db, edit_dict_type) - result_db.commit() - await DictDataService.init_cache_sys_dict_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='更新成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + edit_dict_type = page_object.model_dump(exclude_unset=True) + dict_type_info = await cls.dict_type_detail_services(query_db, page_object.dict_id) + if dict_type_info.dict_id: + if not await cls.check_dict_type_unique_services(query_db, page_object): + raise ServiceException(message=f'修改字典{page_object.dict_name}失败,字典类型已存在') + else: + try: + query_dict_data = DictDataPageQueryModel(dictType=dict_type_info.dict_type) + dict_data_list = await DictDataDao.get_dict_data_list(query_db, query_dict_data, is_page=False) + if dict_type_info.dict_type != page_object.dict_type: + for dict_data in dict_data_list: + edit_dict_data = DictDataModel( + dictCode=dict_data.dict_code, + dictType=page_object.dict_type, + updateBy=page_object.update_by, + ).model_dump(exclude_unset=True) + await DictDataDao.edit_dict_data_dao(query_db, edit_dict_data) + await DictTypeDao.edit_dict_type_dao(query_db, edit_dict_type) + await query_db.commit() + if dict_type_info.dict_type != page_object.dict_type: + dict_data = [CamelCaseUtil.transform_result(row) for row in dict_data_list if row] + await request.app.state.redis.set( + f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', + json.dumps(dict_data, ensure_ascii=False, default=str), + ) + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='字典类型不存在') - - return CrudDictResponse(**result) + raise ServiceException(message='字典类型不存在') @classmethod - async def delete_dict_type_services(cls, request: Request, result_db: Session, page_object: DeleteDictTypeModel): + async def delete_dict_type_services( + cls, request: Request, query_db: AsyncSession, page_object: DeleteDictTypeModel + ): """ 删除字典类型信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 删除字典类型对象 :return: 删除字典类型校验结果 """ - if page_object.dict_ids.split(','): + if page_object.dict_ids: dict_id_list = page_object.dict_ids.split(',') try: + delete_dict_type_list = [] for dict_id in dict_id_list: - dict_id_dict = dict(dict_id=dict_id) - DictTypeDao.delete_dict_type_dao(result_db, DictTypeModel(**dict_id_dict)) - result_db.commit() - await DictDataService.init_cache_sys_dict_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='删除成功') + dict_type_into = await cls.dict_type_detail_services(query_db, int(dict_id)) + if (await DictDataDao.count_dict_data_dao(query_db, dict_type_into.dict_type)) > 0: + raise ServiceException(message=f'{dict_type_into.dict_name}已分配,不能删除') + await DictTypeDao.delete_dict_type_dao(query_db, DictTypeModel(dictId=int(dict_id))) + delete_dict_type_list.append(f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type_into.dict_type}') + await query_db.commit() + if delete_dict_type_list: + await request.app.state.redis.delete(*delete_dict_type_list) + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入字典类型id为空') - return CrudDictResponse(**result) + raise ServiceException(message='传入字典类型id为空') @classmethod - def detail_dict_type_services(cls, result_db: Session, dict_id: int): + async def dict_type_detail_services(cls, query_db: AsyncSession, dict_id: int): """ 获取字典类型详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param dict_id: 字典类型id :return: 字典类型id对应的信息 """ - dict_type = DictTypeDao.get_dict_type_detail_by_id(result_db, dict_id=dict_id) + dict_type = await DictTypeDao.get_dict_type_detail_by_id(query_db, dict_id=dict_id) + if dict_type: + result = DictTypeModel(**CamelCaseUtil.transform_result(dict_type)) + else: + result = DictTypeModel(**dict()) - return dict_type + return result @staticmethod - def export_dict_type_list_services(dict_type_list: List): + async def export_dict_type_list_services(dict_type_list: List): """ 导出字典类型信息service + :param dict_type_list: 字典信息列表 :return: 字典信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "dict_id": "字典编号", - "dict_name": "字典名称", - "dict_type": "字典类型", - "status": "状态", - "create_by": "创建者", - "create_time": "创建时间", - "update_by": "更新者", - "update_time": "更新时间", - "remark": "备注", + 'dictId': '字典编号', + 'dictName': '字典名称', + 'dictType': '字典类型', + 'status': '状态', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } - data = [DictTypeModel(**vars(row)).dict() for row in dict_type_list] + data = dict_type_list for item in data: if item.get('status') == '0': item['status'] = '正常' else: item['status'] = '停用' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data @classmethod - async def refresh_sys_dict_services(cls, request: Request, result_db: Session): + async def refresh_sys_dict_services(cls, request: Request, query_db: AsyncSession): """ 刷新字典缓存信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :return: 刷新字典缓存校验结果 """ - await DictDataService.init_cache_sys_dict_services(result_db, request.app.state.redis) + await DictDataService.init_cache_sys_dict_services(query_db, request.app.state.redis) result = dict(is_success=True, message='刷新成功') - return CrudDictResponse(**result) + return CrudResponseModel(**result) class DictDataService: @@ -184,192 +227,241 @@ class DictDataService: """ @classmethod - def get_dict_data_list_services(cls, result_db: Session, query_object: DictDataModel): + async def get_dict_data_list_services( + cls, query_db: AsyncSession, query_object: DictDataPageQueryModel, is_page: bool = False + ): """ 获取字典数据列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 字典数据列表信息对象 """ - dict_data_list_result = DictDataDao.get_dict_data_list(result_db, query_object) + dict_data_list_result = await DictDataDao.get_dict_data_list(query_db, query_object, is_page) return dict_data_list_result @classmethod - def query_dict_data_list_services(cls, result_db: Session, dict_type: str): + async def query_dict_data_list_services(cls, query_db: AsyncSession, dict_type: str): """ 获取字典数据列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param dict_type: 字典类型 :return: 字典数据列表信息对象 """ - dict_data_list_result = DictDataDao.query_dict_data_list(result_db, dict_type) + dict_data_list_result = await DictDataDao.query_dict_data_list(query_db, dict_type) return dict_data_list_result @classmethod - async def init_cache_sys_dict_services(cls, result_db: Session, redis): + async def init_cache_sys_dict_services(cls, query_db: AsyncSession, redis): """ 应用初始化:获取所有字典类型对应的字典数据信息并缓存service - :param result_db: orm对象 + + :param query_db: orm对象 :param redis: redis对象 :return: """ # 获取以sys_dict:开头的键列表 - keys = await redis.keys(f"{RedisInitKeyConfig.SYS_DICT.get('key')}:*") + keys = await redis.keys(f'{RedisInitKeyConfig.SYS_DICT.key}:*') # 删除匹配的键 if keys: await redis.delete(*keys) - dict_type_all = DictTypeDao.get_all_dict_type(result_db) + dict_type_all = await DictTypeDao.get_all_dict_type(query_db) for dict_type_obj in [item for item in dict_type_all if item.status == '0']: dict_type = dict_type_obj.dict_type - dict_data_list = DictDataDao.query_dict_data_list(result_db, dict_type) - dict_data = [DictDataModel(**vars(row)).dict() for row in dict_data_list if row] - await redis.set(f"{RedisInitKeyConfig.SYS_DICT.get('key')}:{dict_type}", json.dumps(dict_data, ensure_ascii=False)) + dict_data_list = await DictDataDao.query_dict_data_list(query_db, dict_type) + dict_data = [CamelCaseUtil.transform_result(row) for row in dict_data_list if row] + await redis.set( + f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type}', + json.dumps(dict_data, ensure_ascii=False, default=str), + ) @classmethod async def query_dict_data_list_from_cache_services(cls, redis, dict_type: str): """ 从缓存获取字典数据列表信息service + :param redis: redis对象 :param dict_type: 字典类型 :return: 字典数据列表信息对象 """ result = [] - dict_data_list_result = await redis.get(f"{RedisInitKeyConfig.SYS_DICT.get('key')}:{dict_type}") + dict_data_list_result = await redis.get(f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type}') if dict_data_list_result: result = json.loads(dict_data_list_result) - return result + return CamelCaseUtil.transform_result(result) + + @classmethod + async def check_dict_data_unique_services(cls, query_db: AsyncSession, page_object: DictDataModel): + """ + 校验字典数据是否唯一service + + :param query_db: orm对象 + :param page_object: 字典数据对象 + :return: 校验结果 + """ + dict_code = -1 if page_object.dict_code is None else page_object.dict_code + dict_data = await DictDataDao.get_dict_data_detail_by_info(query_db, page_object) + if dict_data and dict_data.dict_code != dict_code: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE @classmethod - async def add_dict_data_services(cls, request: Request, result_db: Session, page_object: DictDataModel): + async def add_dict_data_services(cls, request: Request, query_db: AsyncSession, page_object: DictDataModel): """ 新增字典数据信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 新增岗位对象 :return: 新增字典数据校验结果 """ - dict_data = DictDataDao.get_dict_data_detail_by_info(result_db, page_object) - if dict_data: - result = dict(is_success=False, message='字典数据已存在') + if not await cls.check_dict_data_unique_services(query_db, page_object): + raise ServiceException( + message=f'新增字典数据{page_object.dict_label}失败,{page_object.dict_type}下已存在该字典数据' + ) else: try: - DictDataDao.add_dict_data_dao(result_db, page_object) - result_db.commit() - await cls.init_cache_sys_dict_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='新增成功') + await DictDataDao.add_dict_data_dao(query_db, page_object) + await query_db.commit() + dict_data_list = await cls.query_dict_data_list_services(query_db, page_object.dict_type) + await request.app.state.redis.set( + f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', + json.dumps(CamelCaseUtil.transform_result(dict_data_list), ensure_ascii=False, default=str), + ) + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudDictResponse(**result) + await query_db.rollback() + raise e @classmethod - async def edit_dict_data_services(cls, request: Request, result_db: Session, page_object: DictDataModel): + async def edit_dict_data_services(cls, request: Request, query_db: AsyncSession, page_object: DictDataModel): """ 编辑字典数据信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 编辑字典数据对象 :return: 编辑字典数据校验结果 """ - edit_data_type = page_object.dict(exclude_unset=True) - dict_data_info = cls.detail_dict_data_services(result_db, edit_data_type.get('dict_code')) - if dict_data_info: - if dict_data_info.dict_type != page_object.dict_type or dict_data_info.dict_label != page_object.dict_label or dict_data_info.dict_value != page_object.dict_value: - dict_data = DictDataDao.get_dict_data_detail_by_info(result_db, page_object) - if dict_data: - result = dict(is_success=False, message='字典数据已存在') - return CrudDictResponse(**result) - try: - DictDataDao.edit_dict_data_dao(result_db, edit_data_type) - result_db.commit() - await cls.init_cache_sys_dict_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='更新成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + edit_data_type = page_object.model_dump(exclude_unset=True) + dict_data_info = await cls.dict_data_detail_services(query_db, page_object.dict_code) + if dict_data_info.dict_code: + if not await cls.check_dict_data_unique_services(query_db, page_object): + raise ServiceException( + message=f'新增字典数据{page_object.dict_label}失败,{page_object.dict_type}下已存在该字典数据' + ) + else: + try: + await DictDataDao.edit_dict_data_dao(query_db, edit_data_type) + await query_db.commit() + dict_data_list = await cls.query_dict_data_list_services(query_db, page_object.dict_type) + await request.app.state.redis.set( + f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', + json.dumps(CamelCaseUtil.transform_result(dict_data_list), ensure_ascii=False, default=str), + ) + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='字典数据不存在') - - return CrudDictResponse(**result) + raise ServiceException(message='字典数据不存在') @classmethod - async def delete_dict_data_services(cls, request: Request, result_db: Session, page_object: DeleteDictDataModel): + async def delete_dict_data_services( + cls, request: Request, query_db: AsyncSession, page_object: DeleteDictDataModel + ): """ 删除字典数据信息service + :param request: Request对象 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 删除字典数据对象 :return: 删除字典数据校验结果 """ - if page_object.dict_codes.split(','): + if page_object.dict_codes: dict_code_list = page_object.dict_codes.split(',') try: + delete_dict_type_list = [] for dict_code in dict_code_list: - dict_code_dict = dict(dict_code=dict_code) - DictDataDao.delete_dict_data_dao(result_db, DictDataModel(**dict_code_dict)) - result_db.commit() - await cls.init_cache_sys_dict_services(result_db, request.app.state.redis) - result = dict(is_success=True, message='删除成功') + dict_data = await cls.dict_data_detail_services(query_db, int(dict_code)) + await DictDataDao.delete_dict_data_dao(query_db, DictDataModel(dictCode=dict_code)) + delete_dict_type_list.append(dict_data.dict_type) + await query_db.commit() + for dict_type in list(set(delete_dict_type_list)): + dict_data_list = await cls.query_dict_data_list_services(query_db, dict_type) + await request.app.state.redis.set( + f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type}', + json.dumps(CamelCaseUtil.transform_result(dict_data_list), ensure_ascii=False, default=str), + ) + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入字典数据id为空') - return CrudDictResponse(**result) + raise ServiceException(message='传入字典数据id为空') @classmethod - def detail_dict_data_services(cls, result_db: Session, dict_code: int): + async def dict_data_detail_services(cls, query_db: AsyncSession, dict_code: int): """ 获取字典数据详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param dict_code: 字典数据id :return: 字典数据id对应的信息 """ - dict_data = DictDataDao.get_dict_data_detail_by_id(result_db, dict_code=dict_code) + dict_data = await DictDataDao.get_dict_data_detail_by_id(query_db, dict_code=dict_code) + if dict_data: + result = DictDataModel(**CamelCaseUtil.transform_result(dict_data)) + else: + result = DictDataModel(**dict()) - return dict_data + return result @staticmethod - def export_dict_data_list_services(dict_data_list: List): + async def export_dict_data_list_services(dict_data_list: List): """ 导出字典数据信息service + :param dict_data_list: 字典数据信息列表 :return: 字典数据信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "dict_code": "字典编码", - "dict_sort": "字典标签", - "dict_label": "字典键值", - "dict_value": "字典排序", - "dict_type": "字典类型", - "css_class": "样式属性", - "list_class": "表格回显样式", - "is_default": "是否默认", - "status": "状态", - "create_by": "创建者", - "create_time": "创建时间", - "update_by": "更新者", - "update_time": "更新时间", - "remark": "备注", + 'dictCode': '字典编码', + 'dictSort': '字典标签', + 'dictLabel': '字典键值', + 'dictValue': '字典排序', + 'dictType': '字典类型', + 'cssClass': '样式属性', + 'listClass': '表格回显样式', + 'isDefault': '是否默认', + 'status': '状态', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } - data = [DictDataModel(**vars(row)).dict() for row in dict_data_list] + data = dict_data_list for item in data: if item.get('status') == '0': item['status'] = '正常' else: item['status'] = '停用' - if item.get('is_default') == 'Y': - item['is_default'] = '是' + if item.get('isDefault') == 'Y': + item['isDefault'] = '是' else: - item['is_default'] = '否' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + item['isDefault'] = '否' + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data diff --git a/dash-fastapi-backend/module_admin/service/job_log_service.py b/dash-fastapi-backend/module_admin/service/job_log_service.py index f022559..f4c9f37 100644 --- a/dash-fastapi-backend/module_admin/service/job_log_service.py +++ b/dash-fastapi-backend/module_admin/service/job_log_service.py @@ -1,6 +1,11 @@ -from module_admin.entity.vo.job_vo import * -from module_admin.dao.job_log_dao import * -from module_admin.dao.dict_dao import DictDataDao +from fastapi import Request +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import Session +from typing import List +from module_admin.dao.job_log_dao import JobLogDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.job_vo import DeleteJobLogModel, JobLogModel, JobLogPageQueryModel +from module_admin.service.dict_service import DictDataService from utils.common_util import export_list2excel @@ -10,129 +15,132 @@ class JobLogService: """ @classmethod - def get_job_log_list_services(cls, result_db: Session, query_object: JobLogQueryModel): + async def get_job_log_list_services( + cls, query_db: AsyncSession, query_object: JobLogPageQueryModel, is_page: bool = False + ): """ 获取定时任务日志列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 定时任务日志列表信息对象 """ - job_log_list_result = JobLogDao.get_job_log_list(result_db, query_object) + job_log_list_result = await JobLogDao.get_job_log_list(query_db, query_object, is_page) return job_log_list_result @classmethod - def add_job_log_services(cls, result_db: Session, page_object: JobLogModel): + def add_job_log_services(cls, query_db: Session, page_object: JobLogModel): """ 新增定时任务日志信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增定时任务日志对象 :return: 新增定时任务日志校验结果 """ try: - JobLogDao.add_job_log_dao(result_db, page_object) - result_db.commit() + JobLogDao.add_job_log_dao(query_db, page_object) + query_db.commit() result = dict(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() + query_db.rollback() result = dict(is_success=False, message=str(e)) - return CrudJobResponse(**result) + return CrudResponseModel(**result) @classmethod - def delete_job_log_services(cls, result_db: Session, page_object: DeleteJobLogModel): + async def delete_job_log_services(cls, query_db: AsyncSession, page_object: DeleteJobLogModel): """ 删除定时任务日志信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除定时任务日志对象 :return: 删除定时任务日志校验结果 """ - if page_object.job_log_ids.split(','): + if page_object.job_log_ids: job_log_id_list = page_object.job_log_ids.split(',') try: for job_log_id in job_log_id_list: - job_log_id_dict = dict(job_log_id=job_log_id) - JobLogDao.delete_job_log_dao(result_db, JobLogModel(**job_log_id_dict)) - result_db.commit() + await JobLogDao.delete_job_log_dao(query_db, JobLogModel(jobLogId=job_log_id)) + await query_db.commit() result = dict(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: result = dict(is_success=False, message='传入定时任务日志id为空') - return CrudJobResponse(**result) - - @classmethod - def detail_job_log_services(cls, result_db: Session, job_log_id: int): - """ - 获取定时任务日志详细信息service - :param result_db: orm对象 - :param job_log_id: 定时任务日志id - :return: 定时任务日志id对应的信息 - """ - job_log = JobLogDao.get_job_log_detail_by_id(result_db, job_log_id=job_log_id) - - return job_log + return CrudResponseModel(**result) @classmethod - def clear_job_log_services(cls, result_db: Session, page_object: ClearJobLogModel): + async def clear_job_log_services(cls, query_db: AsyncSession): """ 清除定时任务日志信息service - :param result_db: orm对象 - :param page_object: 清除定时任务日志对象 + + :param query_db: orm对象 :return: 清除定时任务日志校验结果 """ - if page_object.oper_type == 'clear': - try: - JobLogDao.clear_job_log_dao(result_db) - result_db.commit() - result = dict(is_success=True, message='清除成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - else: - result = dict(is_success=False, message='清除标识不合法') + try: + await JobLogDao.clear_job_log_dao(query_db) + await query_db.commit() + result = dict(is_success=True, message='清除成功') + except Exception as e: + await query_db.rollback() + raise e - return CrudJobResponse(**result) + return CrudResponseModel(**result) @staticmethod - def export_job_log_list_services(result_db, job_log_list: List): + async def export_job_log_list_services(request: Request, job_log_list: List): """ 导出定时任务日志信息service - :param result_db: orm对象 + + :param request: Request对象 :param job_log_list: 定时任务日志信息列表 :return: 定时任务日志信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "job_log_id": "任务日志编码", - "job_name": "任务名称", - "job_group": "任务组名", - "job_executor": "任务执行器", - "invoke_target": "调用目标字符串", - "job_args": "位置参数", - "job_kwargs": "关键字参数", - "job_trigger": "任务触发器", - "job_message": "日志信息", - "status": "执行状态", - "exception_info": "异常信息", - "create_time": "创建时间", + 'jobLogId': '任务日志编码', + 'jobName': '任务名称', + 'jobGroup': '任务组名', + 'jobExecutor': '任务执行器', + 'invokeTarget': '调用目标字符串', + 'jobArgs': '位置参数', + 'jobKwargs': '关键字参数', + 'jobTrigger': '任务触发器', + 'jobMessage': '日志信息', + 'status': '执行状态', + 'exceptionInfo': '异常信息', + 'createTime': '创建时间', } - data = [JobLogModel(**vars(row)).dict() for row in job_log_list] - job_group_list = DictDataDao.query_dict_data_list(result_db, dict_type='sys_job_group') - job_group_option = [dict(label=item.dict_label, value=item.dict_value) for item in job_group_list] + data = job_log_list + job_group_list = await DictDataService.query_dict_data_list_from_cache_services( + request.app.state.redis, dict_type='sys_job_group' + ) + job_group_option = [dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_group_list] job_group_option_dict = {item.get('value'): item for item in job_group_option} + job_executor_list = await DictDataService.query_dict_data_list_from_cache_services( + request.app.state.redis, dict_type='sys_job_executor' + ) + job_executor_option = [ + dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_executor_list + ] + job_executor_option_dict = {item.get('value'): item for item in job_executor_option} for item in data: if item.get('status') == '0': item['status'] = '正常' else: item['status'] = '暂停' - if str(item.get('job_group')) in job_group_option_dict.keys(): - item['job_group'] = job_group_option_dict.get(str(item.get('job_group'))).get('label') - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in - data] + if str(item.get('jobGroup')) in job_group_option_dict.keys(): + item['jobGroup'] = job_group_option_dict.get(str(item.get('jobGroup'))).get('label') + if str(item.get('jobExecutor')) in job_executor_option_dict.keys(): + item['jobExecutor'] = job_executor_option_dict.get(str(item.get('jobExecutor'))).get('label') + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data diff --git a/dash-fastapi-backend/module_admin/service/job_service.py b/dash-fastapi-backend/module_admin/service/job_service.py index 5f50e8c..2c4c5bb 100644 --- a/dash-fastapi-backend/module_admin/service/job_service.py +++ b/dash-fastapi-backend/module_admin/service/job_service.py @@ -1,8 +1,16 @@ -from module_admin.entity.vo.job_vo import * -from module_admin.dao.job_dao import * -from module_admin.service.dict_service import Request, DictDataService -from utils.common_util import export_list2excel +from fastapi import Request +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.constant import CommonConstant, JobConstant from config.get_scheduler import SchedulerUtil +from exceptions.exception import ServiceException +from module_admin.dao.job_dao import JobDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.job_vo import DeleteJobModel, EditJobModel, JobModel, JobPageQueryModel +from module_admin.service.dict_service import DictDataService +from utils.common_util import CamelCaseUtil, export_list2excel +from utils.cron_util import CronUtil +from utils.string_util import StringUtil class JobService: @@ -11,183 +19,256 @@ class JobService: """ @classmethod - def get_job_list_services(cls, result_db: Session, query_object: JobModel): + async def get_job_list_services( + cls, query_db: AsyncSession, query_object: JobPageQueryModel, is_page: bool = False + ): """ 获取定时任务列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 定时任务列表信息对象 """ - job_list_result = JobDao.get_job_list(result_db, query_object) + job_list_result = await JobDao.get_job_list(query_db, query_object, is_page) return job_list_result @classmethod - def add_job_services(cls, result_db: Session, page_object: JobModel): + async def check_job_unique_services(cls, query_db: AsyncSession, page_object: JobModel): + """ + 校验定时任务是否存在service + + :param query_db: orm对象 + :param page_object: 定时任务对象 + :return: 校验结果 + """ + job_id = -1 if page_object.job_id is None else page_object.job_id + job = await JobDao.get_job_detail_by_info(query_db, page_object) + if job and job.job_id != job_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def add_job_services(cls, query_db: AsyncSession, page_object: JobModel): """ 新增定时任务信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增定时任务对象 :return: 新增定时任务校验结果 """ - job = JobDao.get_job_detail_by_info(result_db, page_object) - if job: - result = dict(is_success=False, message='定时任务已存在') + if not CronUtil.validate_cron_expression(page_object.cron_expression): + raise ServiceException(message=f'新增定时任务{page_object.job_name}失败,Cron表达式不正确') + elif StringUtil.contains_ignore_case(page_object.invoke_target, CommonConstant.LOOKUP_RMI): + raise ServiceException(message=f'新增定时任务{page_object.job_name}失败,目标字符串不允许rmi调用') + elif StringUtil.contains_any_ignore_case( + page_object.invoke_target, [CommonConstant.LOOKUP_LDAP, CommonConstant.LOOKUP_LDAPS] + ): + raise ServiceException(message=f'新增定时任务{page_object.job_name}失败,目标字符串不允许ldap(s)调用') + elif StringUtil.contains_any_ignore_case( + page_object.invoke_target, [CommonConstant.HTTP, CommonConstant.HTTPS] + ): + raise ServiceException(message=f'新增定时任务{page_object.job_name}失败,目标字符串不允许http(s)调用') + elif StringUtil.startswith_any_case(page_object.invoke_target, JobConstant.JOB_ERROR_LIST): + raise ServiceException(message=f'新增定时任务{page_object.job_name}失败,目标字符串存在违规') + elif not StringUtil.startswith_any_case(page_object.invoke_target, JobConstant.JOB_WHITE_LIST): + raise ServiceException(message=f'新增定时任务{page_object.job_name}失败,目标字符串不在白名单内') + elif not await cls.check_job_unique_services(query_db, page_object): + raise ServiceException(message=f'新增定时任务{page_object.job_name}失败,定时任务已存在') else: try: - JobDao.add_job_dao(result_db, page_object) - job_info = JobDao.get_job_detail_by_info(result_db, page_object) + add_job = await JobDao.add_job_dao(query_db, page_object) + job_info = await cls.job_detail_services(query_db, add_job.job_id) if job_info.status == '0': SchedulerUtil.add_scheduler_job(job_info=job_info) - result_db.commit() + await query_db.commit() result = dict(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e - return CrudJobResponse(**result) + return CrudResponseModel(**result) @classmethod - def edit_job_services(cls, result_db: Session, page_object: EditJobModel): + async def edit_job_services(cls, query_db: AsyncSession, page_object: EditJobModel): """ 编辑定时任务信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 编辑定时任务对象 :return: 编辑定时任务校验结果 """ - edit_job = page_object.dict(exclude_unset=True) + edit_job = page_object.model_dump(exclude_unset=True) if page_object.type == 'status': del edit_job['type'] - job_info = cls.detail_job_services(result_db, edit_job.get('job_id')) + job_info = await cls.job_detail_services(query_db, page_object.job_id) if job_info: - if page_object.type != 'status' and (job_info.job_name != page_object.job_name or job_info.job_group != page_object.job_group or job_info.invoke_target != page_object.invoke_target or job_info.cron_expression != page_object.cron_expression): - job = JobDao.get_job_detail_by_info(result_db, page_object) - if job: - result = dict(is_success=False, message='定时任务已存在') - return CrudJobResponse(**result) + if page_object.type != 'status': + if not CronUtil.validate_cron_expression(page_object.cron_expression): + raise ServiceException(message=f'修改定时任务{page_object.job_name}失败,Cron表达式不正确') + elif StringUtil.contains_ignore_case(page_object.invoke_target, CommonConstant.LOOKUP_RMI): + raise ServiceException(message=f'修改定时任务{page_object.job_name}失败,目标字符串不允许rmi调用') + elif StringUtil.contains_any_ignore_case( + page_object.invoke_target, [CommonConstant.LOOKUP_LDAP, CommonConstant.LOOKUP_LDAPS] + ): + raise ServiceException( + message=f'修改定时任务{page_object.job_name}失败,目标字符串不允许ldap(s)调用' + ) + elif StringUtil.contains_any_ignore_case( + page_object.invoke_target, [CommonConstant.HTTP, CommonConstant.HTTPS] + ): + raise ServiceException( + message=f'修改定时任务{page_object.job_name}失败,目标字符串不允许http(s)调用' + ) + elif StringUtil.startswith_any_case(page_object.invoke_target, JobConstant.JOB_ERROR_LIST): + raise ServiceException(message=f'修改定时任务{page_object.job_name}失败,目标字符串存在违规') + elif not StringUtil.startswith_any_case(page_object.invoke_target, JobConstant.JOB_WHITE_LIST): + raise ServiceException(message=f'修改定时任务{page_object.job_name}失败,目标字符串不在白名单内') + elif not await cls.check_job_unique_services(query_db, page_object): + raise ServiceException(message=f'修改定时任务{page_object.job_name}失败,定时任务已存在') try: - JobDao.edit_job_dao(result_db, edit_job) + await JobDao.edit_job_dao(query_db, edit_job) query_job = SchedulerUtil.get_scheduler_job(job_id=edit_job.get('job_id')) if query_job: SchedulerUtil.remove_scheduler_job(job_id=edit_job.get('job_id')) if edit_job.get('status') == '0': + job_info = await cls.job_detail_services(query_db, edit_job.get('job_id')) SchedulerUtil.add_scheduler_job(job_info=job_info) - result_db.commit() - result = dict(is_success=True, message='更新成功') + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='定时任务不存在') - - return CrudJobResponse(**result) + raise ServiceException(message='定时任务不存在') @classmethod - def execute_job_once_services(cls, result_db: Session, page_object: JobModel): + async def execute_job_once_services(cls, query_db: AsyncSession, page_object: JobModel): """ 执行一次定时任务service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 定时任务对象 :return: 执行一次定时任务结果 """ query_job = SchedulerUtil.get_scheduler_job(job_id=page_object.job_id) if query_job: SchedulerUtil.remove_scheduler_job(job_id=page_object.job_id) - job_info = cls.detail_job_services(result_db, page_object.job_id) + job_info = await cls.job_detail_services(query_db, page_object.job_id) if job_info: SchedulerUtil.execute_scheduler_job_once(job_info=job_info) - result = dict(is_success=True, message='执行成功') + return CrudResponseModel(is_success=True, message='执行成功') else: - result = dict(is_success=False, message='定时任务不存在') - - return CrudJobResponse(**result) + raise ServiceException(message='定时任务不存在') @classmethod - def delete_job_services(cls, result_db: Session, page_object: DeleteJobModel): + async def delete_job_services(cls, query_db: AsyncSession, page_object: DeleteJobModel): """ 删除定时任务信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除定时任务对象 :return: 删除定时任务校验结果 """ - if page_object.job_ids.split(','): + if page_object.job_ids: job_id_list = page_object.job_ids.split(',') try: for job_id in job_id_list: - job_id_dict = dict(job_id=job_id) - JobDao.delete_job_dao(result_db, JobModel(**job_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + await JobDao.delete_job_dao(query_db, JobModel(jobId=job_id)) + query_job = SchedulerUtil.get_scheduler_job(job_id=job_id) + if query_job: + SchedulerUtil.remove_scheduler_job(job_id=job_id) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入定时任务id为空') - return CrudJobResponse(**result) + raise ServiceException(message='传入定时任务id为空') @classmethod - def detail_job_services(cls, result_db: Session, job_id: int): + async def job_detail_services(cls, query_db: AsyncSession, job_id: int): """ 获取定时任务详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param job_id: 定时任务id :return: 定时任务id对应的信息 """ - job = JobDao.get_job_detail_by_id(result_db, job_id=job_id) + job = await JobDao.get_job_detail_by_id(query_db, job_id=job_id) + if job: + result = JobModel(**CamelCaseUtil.transform_result(job)) + else: + result = JobModel(**dict()) - return job + return result @staticmethod async def export_job_list_services(request: Request, job_list: List): """ 导出定时任务信息service + :param request: Request对象 :param job_list: 定时任务信息列表 :return: 定时任务信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "job_id": "任务编码", - "job_name": "任务名称", - "job_group": "任务组名", - "job_executor": "任务执行器", - "invoke_target": "调用目标字符串", - "job_args": "位置参数", - "job_kwargs": "关键字参数", - "cron_expression": "cron执行表达式", - "misfire_policy": "计划执行错误策略", - "concurrent": "是否并发执行", - "status": "状态", - "create_by": "创建者", - "create_time": "创建时间", - "update_by": "更新者", - "update_time": "更新时间", - "remark": "备注", + 'jobId': '任务编码', + 'jobName': '任务名称', + 'jobGroup': '任务组名', + 'jobExecutor': '任务执行器', + 'invokeTarget': '调用目标字符串', + 'jobArgs': '位置参数', + 'jobKwargs': '关键字参数', + 'cronExpression': 'cron执行表达式', + 'misfirePolicy': '计划执行错误策略', + 'concurrent': '是否并发执行', + 'status': '状态', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } - data = [JobModel(**vars(row)).dict() for row in job_list] - job_group_list = await DictDataService.query_dict_data_list_from_cache_services(request.app.state.redis, dict_type='sys_job_group') - job_group_option = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in job_group_list] + data = job_list + job_group_list = await DictDataService.query_dict_data_list_from_cache_services( + request.app.state.redis, dict_type='sys_job_group' + ) + job_group_option = [dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_group_list] job_group_option_dict = {item.get('value'): item for item in job_group_option} + job_executor_list = await DictDataService.query_dict_data_list_from_cache_services( + request.app.state.redis, dict_type='sys_job_executor' + ) + job_executor_option = [ + dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_executor_list + ] + job_executor_option_dict = {item.get('value'): item for item in job_executor_option} for item in data: if item.get('status') == '0': item['status'] = '正常' else: item['status'] = '暂停' - if str(item.get('job_group')) in job_group_option_dict.keys(): - item['job_group'] = job_group_option_dict.get(str(item.get('job_group'))).get('label') - if item.get('misfire_policy') == '1': - item['misfire_policy'] = '立即执行' - elif item.get('misfire_policy') == '2': - item['misfire_policy'] = '执行一次' + if str(item.get('jobGroup')) in job_group_option_dict.keys(): + item['jobGroup'] = job_group_option_dict.get(str(item.get('jobGroup'))).get('label') + if str(item.get('jobExecutor')) in job_executor_option_dict.keys(): + item['jobExecutor'] = job_executor_option_dict.get(str(item.get('jobExecutor'))).get('label') + if item.get('misfirePolicy') == '1': + item['misfirePolicy'] = '立即执行' + elif item.get('misfirePolicy') == '2': + item['misfirePolicy'] = '执行一次' else: - item['misfire_policy'] = '放弃执行' + item['misfirePolicy'] = '放弃执行' if item.get('concurrent') == '0': item['concurrent'] = '允许' else: item['concurrent'] = '禁止' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data diff --git a/dash-fastapi-backend/module_admin/service/log_service.py b/dash-fastapi-backend/module_admin/service/log_service.py index 6783c54..0c80a60 100644 --- a/dash-fastapi-backend/module_admin/service/log_service.py +++ b/dash-fastapi-backend/module_admin/service/log_service.py @@ -1,6 +1,19 @@ -from module_admin.entity.vo.log_vo import * -from module_admin.dao.log_dao import * -from module_admin.service.dict_service import Request, DictDataService +from fastapi import Request +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from exceptions.exception import ServiceException +from module_admin.dao.log_dao import LoginLogDao, OperationLogDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.log_vo import ( + DeleteLoginLogModel, + DeleteOperLogModel, + LogininforModel, + LoginLogPageQueryModel, + OperLogModel, + OperLogPageQueryModel, + UnlockUser, +) +from module_admin.service.dict_service import DictDataService from utils.common_util import export_list2excel @@ -10,122 +23,112 @@ class OperationLogService: """ @classmethod - def get_operation_log_list_services(cls, result_db: Session, query_object: OperLogQueryModel): + async def get_operation_log_list_services( + cls, query_db: AsyncSession, query_object: OperLogPageQueryModel, is_page: bool = False + ): """ 获取操作日志列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 操作日志列表信息对象 """ - operation_log_list_result = OperationLogDao.get_operation_log_list(result_db, query_object) + operation_log_list_result = await OperationLogDao.get_operation_log_list(query_db, query_object, is_page) return operation_log_list_result @classmethod - def add_operation_log_services(cls, result_db: Session, page_object: OperLogModel): + async def add_operation_log_services(cls, query_db: AsyncSession, page_object: OperLogModel): """ 新增操作日志service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增操作日志对象 :return: 新增操作日志校验结果 """ try: - OperationLogDao.add_operation_log_dao(result_db, page_object) - result_db.commit() - result = dict(is_success=True, message='新增成功') + await OperationLogDao.add_operation_log_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudLogResponse(**result) + await query_db.rollback() + raise e @classmethod - def delete_operation_log_services(cls, result_db: Session, page_object: DeleteOperLogModel): + async def delete_operation_log_services(cls, query_db: AsyncSession, page_object: DeleteOperLogModel): """ 删除操作日志信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除操作日志对象 :return: 删除操作日志校验结果 """ - if page_object.oper_ids.split(','): + if page_object.oper_ids: oper_id_list = page_object.oper_ids.split(',') try: for oper_id in oper_id_list: - oper_id_dict = dict(oper_id=oper_id) - OperationLogDao.delete_operation_log_dao(result_db, OperLogModel(**oper_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + await OperationLogDao.delete_operation_log_dao(query_db, OperLogModel(operId=oper_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入操作日志id为空') - return CrudLogResponse(**result) + raise ServiceException(message='传入操作日志id为空') @classmethod - def clear_operation_log_services(cls, result_db: Session, page_object: ClearOperLogModel): + async def clear_operation_log_services(cls, query_db: AsyncSession): """ 清除操作日志信息service - :param result_db: orm对象 - :param page_object: 清除操作日志对象 - :return: 清除操作日志校验结果 - """ - if page_object.oper_type == 'clear': - try: - OperationLogDao.clear_operation_log_dao(result_db) - result_db.commit() - result = dict(is_success=True, message='清除成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - else: - result = dict(is_success=False, message='清除标识不合法') - - return CrudLogResponse(**result) - @classmethod - def detail_operation_log_services(cls, result_db: Session, oper_id: int): - """ - 获取操作日志详细信息service - :param result_db: orm对象 - :param oper_id: 操作日志id - :return: 操作日志id对应的信息 + :param query_db: orm对象 + :return: 清除操作日志校验结果 """ - operation_log = OperationLogDao.get_operation_log_detail_by_id(result_db, oper_id=oper_id) - - return operation_log + try: + await OperationLogDao.clear_operation_log_dao(query_db) + await query_db.commit() + return CrudResponseModel(is_success=True, message='清除成功') + except Exception as e: + await query_db.rollback() + raise e @classmethod async def export_operation_log_list_services(cls, request: Request, operation_log_list: List): """ 导出操作日志信息service + :param request: Request对象 :param operation_log_list: 操作日志信息列表 :return: 操作日志信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "oper_id": "日志编号", - "title": "系统模块", - "business_type": "操作类型", - "method": "方法名称", - "request_method": "请求方式", - "oper_name": "操作人员", - "dept_name": "部门名称", - "oper_url": "请求URL", - "oper_ip": "操作地址", - "oper_location": "操作地点", - "oper_param": "请求参数", - "json_result": "返回参数", - "status": "操作状态", - "error_msg": "错误消息", - "oper_time": "操作日期", - "cost_time": "消耗时间(毫秒)" + 'operId': '日志编号', + 'title': '系统模块', + 'businessType': '操作类型', + 'method': '方法名称', + 'requestMethod': '请求方式', + 'operName': '操作人员', + 'deptName': '部门名称', + 'operUrl': '请求URL', + 'operIp': '操作地址', + 'operLocation': '操作地点', + 'operParam': '请求参数', + 'jsonResult': '返回参数', + 'status': '操作状态', + 'error_msg': '错误消息', + 'operTime': '操作日期', + 'costTime': '消耗时间(毫秒)', } - data = [OperLogModel(**vars(row)).dict() for row in operation_log_list] - operation_type_list = await DictDataService.query_dict_data_list_from_cache_services(request.app.state.redis, dict_type='sys_oper_type') - operation_type_option = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in operation_type_list] + data = operation_log_list + operation_type_list = await DictDataService.query_dict_data_list_from_cache_services( + request.app.state.redis, dict_type='sys_oper_type' + ) + operation_type_option = [ + dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in operation_type_list + ] operation_type_option_dict = {item.get('value'): item for item in operation_type_option} for item in data: @@ -133,10 +136,12 @@ class OperationLogService: item['status'] = '成功' else: item['status'] = '失败' - if str(item.get('business_type')) in operation_type_option_dict.keys(): - item['business_type'] = operation_type_option_dict.get(str(item.get('business_type'))).get('label') + if str(item.get('businessType')) in operation_type_option_dict.keys(): + item['businessType'] = operation_type_option_dict.get(str(item.get('businessType'))).get('label') - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data @@ -148,117 +153,116 @@ class LoginLogService: """ @classmethod - def get_login_log_list_services(cls, result_db: Session, query_object: LoginLogQueryModel): + async def get_login_log_list_services( + cls, query_db: AsyncSession, query_object: LoginLogPageQueryModel, is_page: bool = False + ): """ 获取登录日志列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 登录日志列表信息对象 """ - operation_log_list_result = LoginLogDao.get_login_log_list(result_db, query_object) + operation_log_list_result = await LoginLogDao.get_login_log_list(query_db, query_object, is_page) return operation_log_list_result @classmethod - def add_login_log_services(cls, result_db: Session, page_object: LogininforModel): + async def add_login_log_services(cls, query_db: AsyncSession, page_object: LogininforModel): """ 新增登录日志service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增登录日志对象 :return: 新增登录日志校验结果 """ try: - LoginLogDao.add_login_log_dao(result_db, page_object) - result_db.commit() - result = dict(is_success=True, message='新增成功') + await LoginLogDao.add_login_log_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudLogResponse(**result) + await query_db.rollback() + raise e @classmethod - def delete_login_log_services(cls, result_db: Session, page_object: DeleteLoginLogModel): + async def delete_login_log_services(cls, query_db: AsyncSession, page_object: DeleteLoginLogModel): """ 删除操作日志信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除操作日志对象 :return: 删除操作日志校验结果 """ - if page_object.info_ids.split(','): + if page_object.info_ids: info_id_list = page_object.info_ids.split(',') try: for info_id in info_id_list: - info_id_dict = dict(info_id=info_id) - LoginLogDao.delete_login_log_dao(result_db, LogininforModel(**info_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + await LoginLogDao.delete_login_log_dao(query_db, LogininforModel(infoId=info_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入登录日志id为空') - return CrudLogResponse(**result) + raise ServiceException(message='传入登录日志id为空') @classmethod - def clear_login_log_services(cls, result_db: Session, page_object: ClearLoginLogModel): + async def clear_login_log_services(cls, query_db: AsyncSession): """ 清除操作日志信息service - :param result_db: orm对象 - :param page_object: 清除操作日志对象 + + :param query_db: orm对象 :return: 清除操作日志校验结果 """ - if page_object.oper_type == 'clear': - try: - LoginLogDao.clear_login_log_dao(result_db) - result_db.commit() - result = dict(is_success=True, message='清除成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - else: - result = dict(is_success=False, message='清除标识不合法') - - return CrudLogResponse(**result) + try: + await LoginLogDao.clear_login_log_dao(query_db) + await query_db.commit() + return CrudResponseModel(is_success=True, message='清除成功') + except Exception as e: + await query_db.rollback() + raise e @classmethod async def unlock_user_services(cls, request: Request, unlock_user: UnlockUser): - locked_user = await request.app.state.redis.get(f"account_lock:{unlock_user.user_name}") + locked_user = await request.app.state.redis.get(f'account_lock:{unlock_user.user_name}') if locked_user: - await request.app.state.redis.delete(f"account_lock:{unlock_user.user_name}") - result = dict(is_success=True, message='解锁成功') + await request.app.state.redis.delete(f'account_lock:{unlock_user.user_name}') + return CrudResponseModel(is_success=True, message='解锁成功') else: - result = dict(is_success=False, message='该用户未锁定') - return CrudLogResponse(**result) + raise ServiceException(message='该用户未锁定') @staticmethod - def export_login_log_list_services(login_log_list: List): + async def export_login_log_list_services(login_log_list: List): """ 导出登录日志信息service + :param login_log_list: 登录日志信息列表 :return: 登录日志信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "info_id": "访问编号", - "user_name": "用户名称", - "ipaddr": "登录地址", - "login_location": "登录地点", - "browser": "浏览器", - "os": "操作系统", - "status": "登录状态", - "msg": "操作信息", - "login_time": "登录日期" + 'infoId': '访问编号', + 'userName': '用户名称', + 'ipaddr': '登录地址', + 'loginLocation': '登录地点', + 'browser': '浏览器', + 'os': '操作系统', + 'status': '登录状态', + 'msg': '操作信息', + 'loginTime': '登录日期', } - data = [LogininforModel(**vars(row)).dict() for row in login_log_list] + data = login_log_list for item in data: if item.get('status') == '0': item['status'] = '成功' else: item['status'] = '失败' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data diff --git a/dash-fastapi-backend/module_admin/service/login_service.py b/dash-fastapi-backend/module_admin/service/login_service.py index 9197bc7..5579f0d 100644 --- a/dash-fastapi-backend/module_admin/service/login_service.py +++ b/dash-fastapi-backend/module_admin/service/login_service.py @@ -1,330 +1,606 @@ -from fastapi import Request, Form -from fastapi import Depends -from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm -from jose import JWTError, jwt +import jwt import random import uuid -from datetime import timedelta -from typing import Dict -from module_admin.entity.vo.user_vo import * -from module_admin.entity.vo.login_vo import * -from module_admin.dao.login_dao import * -from module_admin.service.user_service import UserService -from module_admin.dao.user_dao import * -from config.env import AppConfig, JwtConfig, RedisInitKeyConfig -from utils.pwd_util import * -from utils.response_util import * -from utils.message_util import * +from datetime import datetime, timedelta, timezone +from fastapi import Depends, Form, Request +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from jwt.exceptions import InvalidTokenError +from sqlalchemy.ext.asyncio import AsyncSession +from typing import Dict, List, Optional, Union +from config.constant import CommonConstant, MenuConstant +from config.enums import RedisInitKeyConfig +from config.env import AppConfig, JwtConfig from config.get_db import get_db +from exceptions.exception import LoginException, AuthException, ServiceException +from module_admin.dao.login_dao import login_by_account +from module_admin.dao.user_dao import UserDao +from module_admin.entity.do.menu_do import SysMenu +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.login_vo import MenuTreeModel, MetaModel, RouterModel, SmsCode, UserLogin, UserRegister +from module_admin.entity.vo.user_vo import AddUserModel, CurrentUserModel, ResetUserModel, TokenData, UserInfoModel +from module_admin.service.user_service import UserService +from utils.common_util import CamelCaseUtil +from utils.log_util import logger +from utils.message_util import message_service +from utils.pwd_util import PwdUtil -oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login/loginByAccount") +oauth2_scheme = OAuth2PasswordBearer(tokenUrl='login') class CustomOAuth2PasswordRequestForm(OAuth2PasswordRequestForm): """ 自定义OAuth2PasswordRequestForm类,增加验证码及会话编号参数 """ + def __init__( - self, - grant_type: str = Form(default=None, regex="password"), - username: str = Form(), - password: str = Form(), - scope: str = Form(default=""), - client_id: Optional[str] = Form(default=None), - client_secret: Optional[str] = Form(default=None), - captcha: Optional[str] = Form(default=""), - session_id: Optional[str] = Form(default=""), - login_info: Optional[Dict[str, str]] = Form(default=None) + self, + grant_type: str = Form(default=None, regex='password'), + username: str = Form(), + password: str = Form(), + scope: str = Form(default=''), + client_id: Optional[str] = Form(default=None), + client_secret: Optional[str] = Form(default=None), + code: Optional[str] = Form(default=''), + uuid: Optional[str] = Form(default=''), + login_info: Optional[Dict[str, str]] = Form(default=None), ): - super().__init__(grant_type=grant_type, username=username, password=password, - scope=scope, client_id=client_id, client_secret=client_secret) - self.captcha = captcha - self.session_id = session_id + super().__init__( + grant_type=grant_type, + username=username, + password=password, + scope=scope, + client_id=client_id, + client_secret=client_secret, + ) + self.code = code + self.uuid = uuid self.login_info = login_info -async def get_current_user(request: Request = Request, token: str = Depends(oauth2_scheme), - result_db: Session = Depends(get_db)): +class LoginService: """ - 根据token获取当前用户信息 - :param request: Request对象 - :param token: 用户token - :param result_db: orm对象 - :return: 当前用户信息对象 - :raise: 令牌异常AuthException + 登录模块服务层 """ - # if token[:6] != 'Bearer': - # logger.warning("用户token不合法") - # raise AuthException(data="", message="用户token不合法") - try: - if token.startswith('Bearer'): - token = token.split(' ')[1] - payload = jwt.decode(token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm]) - user_id: str = payload.get("user_id") - session_id: str = payload.get("session_id") - if user_id is None: - logger.warning("用户token不合法") - raise AuthException(data="", message="用户token不合法") - token_data = TokenData(user_id=int(user_id)) - except JWTError: - logger.warning("用户token已失效,请重新登录") - raise AuthException(data="", message="用户token已失效,请重新登录") - user = UserDao.get_user_by_id(result_db, user_id=token_data.user_id) - if user is None: - logger.warning("用户token不合法") - raise AuthException(data="", message="用户token不合法") - if AppConfig.app_same_time_login: - redis_token = await request.app.state.redis.get(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{session_id}") - else: - # 此方法可实现同一账号同一时间只能登录一次 - redis_token = await request.app.state.redis.get(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{user.user_basic_info.user_id}") - if token == redis_token: + + @classmethod + async def authenticate_user(cls, request: Request, query_db: AsyncSession, login_user: UserLogin): + """ + 根据用户名密码校验用户登录 + + :param request: Request对象 + :param query_db: orm对象 + :param login_user: 登录用户对象 + :return: 校验结果 + """ + await cls.__check_login_ip(request) + account_lock = await request.app.state.redis.get( + f'{RedisInitKeyConfig.ACCOUNT_LOCK.key}:{login_user.user_name}' + ) + if login_user.user_name == account_lock: + logger.warning('账号已锁定,请稍后再试') + raise LoginException(data='', message='账号已锁定,请稍后再试') + # 判断请求是否来自于api文档,如果是返回指定格式的结果,用于修复api文档认证成功后token显示undefined的bug + request_from_swagger = ( + request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False + ) + request_from_redoc = ( + request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False + ) + # 判断是否开启验证码,开启则验证,否则不验证(dev模式下来自API文档的登录请求不检验) + if not login_user.captcha_enabled or ( + (request_from_swagger or request_from_redoc) and AppConfig.app_env == 'dev' + ): + pass + else: + await cls.__check_login_captcha(request, login_user) + user = await login_by_account(query_db, login_user.user_name) + if not user: + logger.warning('用户不存在') + raise LoginException(data='', message='用户不存在') + if not PwdUtil.verify_password(login_user.password, user[0].password): + cache_password_error_count = await request.app.state.redis.get( + f'{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.key}:{login_user.user_name}' + ) + password_error_counted = 0 + if cache_password_error_count: + password_error_counted = cache_password_error_count + password_error_count = int(password_error_counted) + 1 + await request.app.state.redis.set( + f'{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.key}:{login_user.user_name}', + password_error_count, + ex=timedelta(minutes=10), + ) + if password_error_count > 5: + await request.app.state.redis.delete( + f'{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.key}:{login_user.user_name}' + ) + await request.app.state.redis.set( + f'{RedisInitKeyConfig.ACCOUNT_LOCK.key}:{login_user.user_name}', + login_user.user_name, + ex=timedelta(minutes=10), + ) + logger.warning('10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试') + raise LoginException(data='', message='10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试') + logger.warning('密码错误') + raise LoginException(data='', message='密码错误') + if user[0].status == '1': + logger.warning('用户已停用') + raise LoginException(data='', message='用户已停用') + await request.app.state.redis.delete(f'{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.key}:{login_user.user_name}') + return user + + @classmethod + async def __check_login_ip(cls, request: Request): + """ + 校验用户登录ip是否在黑名单内 + + :param request: Request对象 + :return: 校验结果 + """ + black_ip_value = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.login.blackIPList') + black_ip_list = black_ip_value.split(',') if black_ip_value else [] + if request.headers.get('X-Forwarded-For') in black_ip_list: + logger.warning('当前IP禁止登录') + raise LoginException(data='', message='当前IP禁止登录') + return True + + @classmethod + async def __check_login_captcha(cls, request: Request, login_user: UserLogin): + """ + 校验用户登录验证码 + + :param request: Request对象 + :param login_user: 登录用户对象 + :return: 校验结果 + """ + captcha_value = await request.app.state.redis.get(f'{RedisInitKeyConfig.CAPTCHA_CODES.key}:{login_user.uuid}') + if not captcha_value: + logger.warning('验证码已失效') + raise LoginException(data='', message='验证码已失效') + if login_user.code != str(captcha_value): + logger.warning('验证码错误') + raise LoginException(data='', message='验证码错误') + return True + + @classmethod + async def create_access_token(cls, data: dict, expires_delta: Union[timedelta, None] = None): + """ + 根据登录信息创建当前用户token + + :param data: 登录信息 + :param expires_delta: token有效期 + :return: token + """ + to_encode = data.copy() + if expires_delta: + expire = datetime.now(timezone.utc) + expires_delta + else: + expire = datetime.now(timezone.utc) + timedelta(minutes=30) + to_encode.update({'exp': expire}) + encoded_jwt = jwt.encode(to_encode, JwtConfig.jwt_secret_key, algorithm=JwtConfig.jwt_algorithm) + return encoded_jwt + + @classmethod + async def get_current_user( + cls, request: Request = Request, token: str = Depends(oauth2_scheme), query_db: AsyncSession = Depends(get_db) + ): + """ + 根据token获取当前用户信息 + + :param request: Request对象 + :param token: 用户token + :param query_db: orm对象 + :return: 当前用户信息对象 + :raise: 令牌异常AuthException + """ + # if token[:6] != 'Bearer': + # logger.warning("用户token不合法") + # raise AuthException(data="", message="用户token不合法") + try: + if token.startswith('Bearer'): + token = token.split(' ')[1] + payload = jwt.decode(token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm]) + user_id: str = payload.get('user_id') + session_id: str = payload.get('session_id') + if not user_id: + logger.warning('用户token不合法') + raise AuthException(data='', message='用户token不合法') + token_data = TokenData(user_id=int(user_id)) + except InvalidTokenError: + logger.warning('用户token已失效,请重新登录') + raise AuthException(data='', message='用户token已失效,请重新登录') + query_user = await UserDao.get_user_by_id(query_db, user_id=token_data.user_id) + if query_user.get('user_basic_info') is None: + logger.warning('用户token不合法') + raise AuthException(data='', message='用户token不合法') if AppConfig.app_same_time_login: - await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{session_id}", redis_token, - ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) + redis_token = await request.app.state.redis.get(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{session_id}') else: - await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{user.user_basic_info.user_id}", redis_token, - ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) - - return CurrentUserInfoServiceResponse( - user=user.user_basic_info, - dept=user.user_dept_info, - role=user.user_role_info, - post=user.user_post_info, - menu=user.user_menu_info + # 此方法可实现同一账号同一时间只能登录一次 + redis_token = await request.app.state.redis.get( + f"{RedisInitKeyConfig.ACCESS_TOKEN.key}:{query_user.get('user_basic_info').user_id}" + ) + if token == redis_token: + if AppConfig.app_same_time_login: + await request.app.state.redis.set( + f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{session_id}', + redis_token, + ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes), + ) + else: + await request.app.state.redis.set( + f"{RedisInitKeyConfig.ACCESS_TOKEN.key}:{query_user.get('user_basic_info').user_id}", + redis_token, + ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes), + ) + + role_id_list = [item.role_id for item in query_user.get('user_role_info')] + if 1 in role_id_list: + permissions = ['*:*:*'] + else: + permissions = [row.perms for row in query_user.get('user_menu_info')] + post_ids = ','.join([str(row.post_id) for row in query_user.get('user_post_info')]) + role_ids = ','.join([str(row.role_id) for row in query_user.get('user_role_info')]) + roles = [row.role_key for row in query_user.get('user_role_info')] + + current_user = CurrentUserModel( + permissions=permissions, + roles=roles, + user=UserInfoModel( + **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), + postIds=post_ids, + roleIds=role_ids, + dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), + role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + ), + ) + return current_user + else: + logger.warning('用户token已失效,请重新登录') + raise AuthException(data='', message='用户token已失效,请重新登录') + + @classmethod + async def get_current_user_routers(cls, user_id: int, query_db: AsyncSession): + """ + 根据用户id获取当前用户路由信息 + + :param user_id: 用户id + :param query_db: orm对象 + :return: 当前用户路由信息对象 + """ + query_user = await UserDao.get_user_by_id(query_db, user_id=user_id) + user_router_menu = sorted( + [ + row + for row in query_user.get('user_menu_info') + if row.menu_type in [MenuConstant.TYPE_DIR, MenuConstant.TYPE_MENU] + ], + key=lambda x: x.order_num, ) - else: - logger.warning("用户token已失效,请重新登录") - raise AuthException(data="", message="用户token已失效,请重新登录") - - -async def get_sms_code_services(request: Request, result_db: Session, user: ResetUserModel): - """ - 获取短信验证码service - :param request: Request对象 - :param result_db: orm对象 - :param user: 用户对象 - :return: 短信验证码对象 - """ - redis_sms_result = await request.app.state.redis.get(f"{RedisInitKeyConfig.SMS_CODE.get('key')}:{user.session_id}") - if redis_sms_result: - return SmsCode(**dict(is_success=False, sms_code='', session_id='', message='短信验证码仍在有效期内')) - is_user = UserDao.get_user_by_name(result_db, user.user_name) - if is_user: - sms_code = str(random.randint(100000, 999999)) - session_id = str(uuid.uuid4()) - await request.app.state.redis.set(f"{RedisInitKeyConfig.SMS_CODE.get('key')}:{session_id}", sms_code, ex=timedelta(minutes=2)) - # 此处模拟调用短信服务 - message_service(sms_code) - - return SmsCode(**dict(is_success=True, sms_code=sms_code, session_id=session_id, message='获取成功')) - - return SmsCode(**dict(is_success=False, sms_code='', session_id='', message='用户不存在')) - - -async def forget_user_services(request: Request, result_db: Session, forget_user: ResetUserModel): - """ - 用户忘记密码services - :param request: Request对象 - :param result_db: orm对象 - :param forget_user: 重置用户对象 - :return: 重置结果 - """ - redis_sms_result = await request.app.state.redis.get(f"{RedisInitKeyConfig.SMS_CODE.get('key')}:{forget_user.session_id}") - if forget_user.sms_code == redis_sms_result: - forget_user.password = PwdUtil.get_password_hash(forget_user.password) - forget_user.user_id = UserDao.get_user_by_name(result_db, forget_user.user_name).user_id - edit_result = UserService.reset_user_services(result_db, forget_user) - result = edit_result.dict() - elif not redis_sms_result: - result = dict(is_success=False, message='短信验证码已过期') - else: - await request.app.state.redis.delete(f"{RedisInitKeyConfig.SMS_CODE.get('key')}:{forget_user.session_id}") - result = dict(is_success=False, message='短信验证码不正确') - - return CrudUserResponse(**result) - - -async def logout_services(request: Request, session_id: str): - """ - 退出登录services - :param request: Request对象 - :param session_id: 会话编号 - :return: 退出登录结果 - """ - await request.app.state.redis.delete(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{session_id}") - # await request.app.state.redis.delete(f'{current_user.user.user_id}_access_token') - # await request.app.state.redis.delete(f'{current_user.user.user_id}_session_id') - - return True + menus = cls.__generate_menus(0, user_router_menu) + user_router = cls.__generate_user_router_menu(menus) + return [router.model_dump(exclude_unset=True, by_alias=True) for router in user_router] + + @classmethod + def __generate_menus(cls, pid: int, permission_list: List[SysMenu]): + """ + 工具方法:根据菜单信息生成菜单信息树形嵌套数据 + + :param pid: 菜单id + :param permission_list: 菜单列表信息 + :return: 菜单信息树形嵌套数据 + """ + menu_list: List[MenuTreeModel] = [] + for permission in permission_list: + if permission.parent_id == pid: + children = cls.__generate_menus(permission.menu_id, permission_list) + menu_list_data = MenuTreeModel(**CamelCaseUtil.transform_result(permission)) + if children: + menu_list_data.children = children + menu_list.append(menu_list_data) + + return menu_list + + @classmethod + def __generate_user_router_menu(cls, permission_list: List[MenuTreeModel]): + """ + 工具方法:根据菜单树信息生成路由信息树形嵌套数据 + + :param permission_list: 菜单树列表信息 + :return: 路由信息树形嵌套数据 + """ + router_list: List[RouterModel] = [] + for permission in permission_list: + router = RouterModel( + hidden=True if permission.visible == '1' else False, + name=RouterUtil.get_router_name(permission), + path=RouterUtil.get_router_path(permission), + component=RouterUtil.get_component(permission), + query=permission.query, + meta=MetaModel( + title=permission.menu_name, + icon=permission.icon, + noCache=True if permission.is_cache == 1 else False, + link=permission.path if RouterUtil.is_http(permission.path) else None, + ), + ) + c_menus = permission.children + if c_menus and permission.menu_type == MenuConstant.TYPE_DIR: + router.always_show = True + router.redirect = 'noRedirect' + router.children = cls.__generate_user_router_menu(c_menus) + elif RouterUtil.is_menu_frame(permission): + router.meta = None + children_list: List[RouterModel] = [] + children = RouterModel( + path=permission.path, + component=permission.component, + name=RouterUtil.get_route_name(permission.route_name, permission.path), + meta=MetaModel( + title=permission.menu_name, + icon=permission.icon, + noCache=True if permission.is_cache == 1 else False, + link=permission.path if RouterUtil.is_http(permission.path) else None, + ), + query=permission.query, + ) + children_list.append(children) + router.children = children_list + elif permission.parent_id == 0 and RouterUtil.is_inner_link(permission): + router.meta = MetaModel(title=permission.menu_name, icon=permission.icon) + router.path = '/' + children_list: List[RouterModel] = [] + router_path = RouterUtil.inner_link_replace_each(permission.path) + children = RouterModel( + path=router_path, + component=MenuConstant.INNER_LINK, + name=RouterUtil.get_route_name(permission.route_name, permission.path), + meta=MetaModel( + title=permission.menu_name, + icon=permission.icon, + link=permission.path if RouterUtil.is_http(permission.path) else None, + ), + ) + children_list.append(children) + router.children = children_list + + router_list.append(router) + + return router_list + + @classmethod + async def register_user_services(cls, request: Request, query_db: AsyncSession, user_register: UserRegister): + """ + 用户注册services + + :param request: Request对象 + :param query_db: orm对象 + :param user_register: 注册用户对象 + :return: 注册结果 + """ + register_enabled = ( + True + if await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.registerUser') + == 'true' + else False + ) + captcha_enabled = ( + True + if await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.captchaEnabled') + == 'true' + else False + ) + if user_register.password == user_register.confirm_password: + if register_enabled: + if captcha_enabled: + captcha_value = await request.app.state.redis.get( + f'{RedisInitKeyConfig.CAPTCHA_CODES.key}:{user_register.uuid}' + ) + if not captcha_value: + raise ServiceException(message='验证码已失效') + elif user_register.code != str(captcha_value): + raise ServiceException(message='验证码错误') + add_user = AddUserModel( + userName=user_register.username, + nickName=user_register.username, + password=PwdUtil.get_password_hash(user_register.password), + ) + result = await UserService.add_user_services(query_db, add_user) + return result + else: + raise ServiceException(message='注册程序已关闭,禁止注册') + else: + raise ServiceException(message='两次输入的密码不一致') + + @classmethod + async def get_sms_code_services(cls, request: Request, query_db: AsyncSession, user: ResetUserModel): + """ + 获取短信验证码service + + :param request: Request对象 + :param query_db: orm对象 + :param user: 用户对象 + :return: 短信验证码对象 + """ + redis_sms_result = await request.app.state.redis.get(f'{RedisInitKeyConfig.SMS_CODE.key}:{user.session_id}') + if redis_sms_result: + return SmsCode(**dict(is_success=False, sms_code='', session_id='', message='短信验证码仍在有效期内')) + is_user = await UserDao.get_user_by_name(query_db, user.user_name) + if is_user: + sms_code = str(random.randint(100000, 999999)) + session_id = str(uuid.uuid4()) + await request.app.state.redis.set( + f'{RedisInitKeyConfig.SMS_CODE.key}:{session_id}', sms_code, ex=timedelta(minutes=2) + ) + # 此处模拟调用短信服务 + message_service(sms_code) + + return SmsCode(**dict(is_success=True, sms_code=sms_code, session_id=session_id, message='获取成功')) + + return SmsCode(**dict(is_success=False, sms_code='', session_id='', message='用户不存在')) + + @classmethod + async def forget_user_services(cls, request: Request, query_db: AsyncSession, forget_user: ResetUserModel): + """ + 用户忘记密码services + + :param request: Request对象 + :param query_db: orm对象 + :param forget_user: 重置用户对象 + :return: 重置结果 + """ + redis_sms_result = await request.app.state.redis.get( + f'{RedisInitKeyConfig.SMS_CODE.key}:{forget_user.session_id}' + ) + if forget_user.sms_code == redis_sms_result: + forget_user.password = PwdUtil.get_password_hash(forget_user.password) + forget_user.user_id = (await UserDao.get_user_by_name(query_db, forget_user.user_name)).user_id + edit_result = await UserService.reset_user_services(query_db, forget_user) + result = edit_result.dict() + elif not redis_sms_result: + result = dict(is_success=False, message='短信验证码已过期') + else: + await request.app.state.redis.delete(f'{RedisInitKeyConfig.SMS_CODE.key}:{forget_user.session_id}') + result = dict(is_success=False, message='短信验证码不正确') + return CrudResponseModel(**result) -async def check_login_ip(request: Request, login_user: UserLogin): - """ - 校验用户登录ip是否在黑名单内 - :param request: Request对象 - :param login_user: 登录用户对象 - :return: 校验结果 - """ - black_ip_value = await request.app.state.redis.get( - f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:sys.login.blackIPList") - black_ip_list = black_ip_value.split(',') if black_ip_value else [] - if login_user.login_info.get('ipaddr') in black_ip_list: - logger.warning("当前IP禁止登录") - raise LoginException(data="", message="当前IP禁止登录") - return True + @classmethod + async def logout_services(cls, request: Request, session_id: str): + """ + 退出登录services + :param request: Request对象 + :param session_id: 会话编号 + :return: 退出登录结果 + """ + await request.app.state.redis.delete(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{session_id}') + # await request.app.state.redis.delete(f'{current_user.user.user_id}_access_token') + # await request.app.state.redis.delete(f'{current_user.user.user_id}_session_id') -async def check_login_captcha(request: Request, login_user: UserLogin): - """ - 校验用户登录验证码 - :param request: Request对象 - :param login_user: 登录用户对象 - :return: 校验结果 - """ - captcha_value = await request.app.state.redis.get(f"{RedisInitKeyConfig.CAPTCHA_CODES.get('key')}:{login_user.session_id}") - if not captcha_value: - logger.warning("验证码已失效") - raise LoginException(data="", message="验证码已失效") - if login_user.captcha != str(captcha_value): - logger.warning("验证码错误") - raise LoginException(data="", message="验证码错误") - return True + return True -async def authenticate_user(request: Request, query_db: Session, login_user: UserLogin): +class RouterUtil: """ - 根据用户名密码校验用户登录 - :param request: Request对象 - :param query_db: orm对象 - :param login_user: 登录用户对象 - :return: 校验结果 + 路由处理工具类 """ - await check_login_ip(request, login_user) - account_lock = await request.app.state.redis.get(f"{RedisInitKeyConfig.ACCOUNT_LOCK.get('key')}:{login_user.user_name}") - if login_user.user_name == account_lock: - logger.warning("账号已锁定,请稍后再试") - raise LoginException(data="", message="账号已锁定,请稍后再试") - # 判断请求是否来自于api文档 - request_from_swagger = request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False - request_from_redoc = request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False - # 判断是否开启验证码,开启则验证,否则不验证(dev模式下来自API文档的登录请求不检验) - if not login_user.captcha_enabled or ((request_from_swagger or request_from_redoc) and AppConfig.app_env == 'dev'): - pass - else: - await check_login_captcha(request, login_user) - user = login_by_account(query_db, login_user.user_name) - if not user: - logger.warning("用户不存在") - raise LoginException(data="", message="用户不存在") - if not PwdUtil.verify_password(login_user.password, user[0].password): - cache_password_error_count = await request.app.state.redis.get(f"{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.get('key')}:{login_user.user_name}") - password_error_counted = 0 - if cache_password_error_count: - password_error_counted = cache_password_error_count - password_error_count = int(password_error_counted) + 1 - await request.app.state.redis.set(f"{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.get('key')}:{login_user.user_name}", password_error_count, - ex=timedelta(minutes=10)) - if password_error_count > 5: - await request.app.state.redis.delete(f"{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.get('key')}:{login_user.user_name}") - await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCOUNT_LOCK.get('key')}:{login_user.user_name}", login_user.user_name, - ex=timedelta(minutes=10)) - logger.warning("10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试") - raise LoginException(data="", message="10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试") - logger.warning("密码错误") - raise LoginException(data="", message="密码错误") - if user[0].status == '1': - logger.warning("用户已停用") - raise LoginException(data="", message="用户已停用") - await request.app.state.redis.delete(f"{RedisInitKeyConfig.PASSWORD_ERROR_COUNT.get('key')}:{login_user.user_name}") - return user - - -def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None): - """ - 根据登录信息创建当前用户token - :param data: 登录信息 - :param expires_delta: token有效期 - :return: token - """ - to_encode = data.copy() - if expires_delta: - expire = datetime.utcnow() + expires_delta - else: - expire = datetime.utcnow() + timedelta(minutes=15) - to_encode.update({"exp": expire}) - encoded_jwt = jwt.encode(to_encode, JwtConfig.jwt_secret_key, algorithm=JwtConfig.jwt_algorithm) - return encoded_jwt - - -def deal_user_dept_info(db: Session, dept_info: DeptInfo): - tmp_dept_name = dept_info.dept_name - dept_ancestors = dept_info.ancestors.split(',') - tmp_dept_list = [] - for item in dept_ancestors: - dept_obj = UserDao.get_user_dept_info(db, int(item)) - if dept_obj: - tmp_dept_list.append(dept_obj.dept_name) - tmp_dept_list.append(tmp_dept_name) - user_dept_info = '/'.join(tmp_dept_list) - - return user_dept_info - - -def deal_user_role_info(role_info: RoleInfo): - tmp_user_role_info = [] - for item in role_info.role_info: - tmp_user_role_info.append(item.role_name) - user_role_info = '/'.join(tmp_user_role_info) - - return user_role_info + @classmethod + def get_router_name(cls, menu: MenuTreeModel): + """ + 获取路由名称 + + :param menu: 菜单数对象 + :return: 路由名称 + """ + # 非外链并且是一级目录(类型为目录) + if cls.is_menu_frame(menu): + return '' + + return cls.get_route_name(menu.route_name, menu.path) + + @classmethod + def get_route_name(cls, name: str, path: str): + """ + 获取路由名称,如没有配置路由名称则取路由地址 + + :param name: 路由名称 + :param path: 路由地址 + :return: 路由名称(驼峰格式) + """ + router_name = name if name else path + return router_name.capitalize() + + @classmethod + def get_router_path(cls, menu: MenuTreeModel): + """ + 获取路由地址 + + :param menu: 菜单数对象 + :return: 路由地址 + """ + # 内链打开外网方式 + router_path = menu.path + if menu.parent_id != 0 and cls.is_inner_link(menu): + router_path = cls.inner_link_replace_each(router_path) + # 非外链并且是一级目录(类型为目录) + if menu.parent_id == 0 and menu.menu_type == MenuConstant.TYPE_DIR and menu.is_frame == MenuConstant.NO_FRAME: + router_path = f'/{menu.path}' + # 非外链并且是一级目录(类型为菜单) + elif cls.is_menu_frame(menu): + router_path = '/' + return router_path + + @classmethod + def get_component(cls, menu: MenuTreeModel): + """ + 获取组件信息 + + :param menu: 菜单数对象 + :return: 组件信息 + """ + component = MenuConstant.LAYOUT + if menu.component and not cls.is_menu_frame(menu): + component = menu.component + elif (menu.component is None or menu.component == '') and menu.parent_id != 0 and cls.is_inner_link(menu): + component = MenuConstant.INNER_LINK + elif (menu.component is None or menu.component == '') and cls.is_parent_view(menu): + component = MenuConstant.PARENT_VIEW + return component + + @classmethod + def is_menu_frame(cls, menu: MenuTreeModel): + """ + 判断是否为菜单内部跳转 + + :param menu: 菜单数对象 + :return: 是否为菜单内部跳转 + """ + return ( + menu.parent_id == 0 and menu.menu_type == MenuConstant.TYPE_MENU and menu.is_frame == MenuConstant.NO_FRAME + ) -def deal_user_menu_info(pid: int, permission_list: MenuList): - """ - 工具方法:根据菜单信息生成树形嵌套数据 - :param pid: 菜单id - :param permission_list: 菜单列表信息 - :return: 菜单树形嵌套数据 - """ - menu_list = [] - for permission in permission_list.menu_info: - if permission.parent_id == pid: - children = deal_user_menu_info(permission.menu_id, permission_list) - antd_menu_list_data = {} - if children and permission.menu_type == 'M': - antd_menu_list_data['component'] = 'SubMenu' - antd_menu_list_data['props'] = { - 'key': str(permission.menu_id), - 'title': permission.menu_name, - 'icon': permission.icon - } - antd_menu_list_data['children'] = children - elif children and permission.menu_type == 'C': - antd_menu_list_data['component'] = 'Item' - antd_menu_list_data['props'] = { - 'key': str(permission.menu_id), - 'title': permission.menu_name, - 'icon': permission.icon, - 'href': permission.path, - 'modules': permission.component - } - antd_menu_list_data['button'] = children - elif permission.menu_type == 'F': - antd_menu_list_data['component'] = 'Button' - antd_menu_list_data['props'] = { - 'key': str(permission.menu_id), - 'title': permission.menu_name, - 'icon': permission.icon - } - else: - antd_menu_list_data['component'] = 'Item' - antd_menu_list_data['props'] = { - 'key': str(permission.menu_id), - 'title': permission.menu_name, - 'icon': permission.icon, - 'href': permission.path, - } - menu_list.append(antd_menu_list_data) - - return menu_list + @classmethod + def is_inner_link(cls, menu: MenuTreeModel): + """ + 判断是否为内链组件 + + :param menu: 菜单数对象 + :return: 是否为内链组件 + """ + return menu.is_frame == MenuConstant.NO_FRAME and cls.is_http(menu.path) + + @classmethod + def is_parent_view(cls, menu: MenuTreeModel): + """ + 判断是否为parent_view组件 + + :param menu: 菜单数对象 + :return: 是否为parent_view组件 + """ + return menu.parent_id != 0 and menu.menu_type == MenuConstant.TYPE_DIR + + @classmethod + def is_http(cls, link: str): + """ + 判断是否为http(s)://开头 + + :param link: 链接 + :return: 是否为http(s)://开头 + """ + return link.startswith(CommonConstant.HTTP) or link.startswith(CommonConstant.HTTPS) + + @classmethod + def inner_link_replace_each(cls, path: str): + """ + 内链域名特殊字符替换 + + :param path: 内链域名 + :return: 替换后的内链域名 + """ + old_values = [CommonConstant.HTTP, CommonConstant.HTTPS, CommonConstant.WWW, '.', ':'] + new_values = ['', '', '', '/', '/'] + for old, new in zip(old_values, new_values): + path = path.replace(old, new) + return path diff --git a/dash-fastapi-backend/module_admin/service/menu_service.py b/dash-fastapi-backend/module_admin/service/menu_service.py index 203495d..2852d6c 100644 --- a/dash-fastapi-backend/module_admin/service/menu_service.py +++ b/dash-fastapi-backend/module_admin/service/menu_service.py @@ -1,6 +1,15 @@ -from module_admin.entity.vo.menu_vo import * -from module_admin.dao.menu_dao import * -from module_admin.entity.vo.user_vo import CurrentUserInfoServiceResponse +from sqlalchemy.ext.asyncio import AsyncSession +from typing import Optional +from config.constant import CommonConstant, MenuConstant +from exceptions.exception import ServiceException, ServiceWarning +from module_admin.dao.menu_dao import MenuDao +from module_admin.dao.role_dao import RoleDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.menu_vo import DeleteMenuModel, MenuQueryModel, MenuModel +from module_admin.entity.vo.role_vo import RoleMenuQueryModel +from module_admin.entity.vo.user_vo import CurrentUserModel +from utils.common_util import CamelCaseUtil +from utils.string_util import StringUtil class MenuService: @@ -9,162 +18,198 @@ class MenuService: """ @classmethod - def get_menu_tree_services(cls, result_db: Session, page_object: MenuTreeModel, current_user: Optional[CurrentUserInfoServiceResponse] = None): + async def get_menu_tree_services(cls, query_db: AsyncSession, current_user: Optional[CurrentUserModel] = None): """ 获取菜单树信息service - :param result_db: orm对象 - :param page_object: 查询参数对象 + + :param query_db: orm对象 :param current_user: 当前用户对象 :return: 菜单树信息对象 """ - menu_tree_option = [] - menu_list_result = MenuDao.get_menu_list_for_tree(result_db, MenuModel(**page_object.dict()), current_user.user.user_id, current_user.role) - menu_tree_result = cls.get_menu_tree(0, MenuTree(menu_tree=menu_list_result)) - if page_object.type != 'role': - menu_tree_option.append(dict(title='主类目', value='0', key='0', children=menu_tree_result)) - else: - menu_tree_option = [menu_tree_result, menu_list_result] + menu_list_result = await MenuDao.get_menu_list_for_tree( + query_db, current_user.user.user_id, current_user.user.role + ) + menu_tree_result = cls.list_to_tree(menu_list_result) - return menu_tree_option + return menu_tree_result @classmethod - def get_menu_tree_for_edit_option_services(cls, result_db: Session, page_object: MenuModel, current_user: Optional[CurrentUserInfoServiceResponse] = None): + async def get_role_menu_tree_services( + cls, query_db: AsyncSession, role_id: int, current_user: Optional[CurrentUserModel] = None + ): """ - 获取菜单编辑菜单树信息service - :param result_db: orm对象 - :param page_object: 查询参数对象 - :param current_user: 当前用户 - :return: 菜单树信息对象 + 根据角色id获取菜单树信息service + + :param query_db: orm对象 + :param role_id: 角色id + :param current_user: 当前用户对象 + :return: 当前角色id的菜单树信息对象 """ - menu_tree_option = [] - menu_list_result = MenuDao.get_menu_info_for_edit_option(result_db, page_object, current_user.user.user_id, current_user.role) - menu_tree_result = cls.get_menu_tree(0, MenuTree(menu_tree=menu_list_result)) - menu_tree_option.append(dict(title='主类目', value='0', key='0', children=menu_tree_result)) + menu_list_result = await MenuDao.get_menu_list_for_tree( + query_db, current_user.user.user_id, current_user.user.role + ) + menu_tree_result = cls.list_to_tree(menu_list_result) + role = await RoleDao.get_role_detail_by_id(query_db, role_id) + role_menu_list = await RoleDao.get_role_menu_dao(query_db, role) + checked_keys = [row.menu_id for row in role_menu_list] + result = RoleMenuQueryModel(menus=menu_tree_result, checkedKeys=checked_keys) - return menu_tree_option + return result @classmethod - def get_menu_list_services(cls, result_db: Session, page_object: MenuModel, current_user: Optional[CurrentUserInfoServiceResponse] = None): + async def get_menu_list_services( + cls, query_db: AsyncSession, page_object: MenuQueryModel, current_user: Optional[CurrentUserModel] = None + ): """ 获取菜单列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 分页查询参数对象 :param current_user: 当前用户对象 :return: 菜单列表信息对象 """ - menu_list_result = MenuDao.get_menu_list(result_db, page_object, current_user.user.user_id, current_user.role) + menu_list_result = await MenuDao.get_menu_list( + query_db, page_object, current_user.user.user_id, current_user.user.role + ) - return menu_list_result + return CamelCaseUtil.transform_result(menu_list_result) @classmethod - def add_menu_services(cls, result_db: Session, page_object: MenuModel): + async def check_menu_name_unique_services(cls, query_db: AsyncSession, page_object: MenuModel): + """ + 校验菜单名称是否唯一service + + :param query_db: orm对象 + :param page_object: 菜单对象 + :return: 校验结果 + """ + menu_id = -1 if page_object.menu_id is None else page_object.menu_id + menu = await MenuDao.get_menu_detail_by_info(query_db, MenuModel(menuName=page_object.menu_name)) + if menu and menu.menu_id != menu_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def add_menu_services(cls, query_db: AsyncSession, page_object: MenuModel): """ 新增菜单信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增菜单对象 :return: 新增菜单校验结果 """ - menu = MenuDao.get_menu_detail_by_info(result_db, MenuModel( - **dict(parent_id=page_object.parent_id, menu_name=page_object.menu_name, menu_type=page_object.menu_type))) - if menu: - result = dict(is_success=False, message='同一目录下不允许存在同名同类型的菜单') + if not await cls.check_menu_name_unique_services(query_db, page_object): + raise ServiceException(message=f'新增菜单{page_object.post_name}失败,菜单名称已存在') + elif page_object.is_frame == MenuConstant.YES_FRAME and not StringUtil.is_http(page_object.path): + raise ServiceException(message=f'新增菜单{page_object.post_name}失败,地址必须以http(s)://开头') else: try: - MenuDao.add_menu_dao(result_db, page_object) - result_db.commit() - result = dict(is_success=True, message='新增成功') + await MenuDao.add_menu_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudMenuResponse(**result) + await query_db.rollback() + raise e @classmethod - def edit_menu_services(cls, result_db: Session, page_object: MenuModel): + async def edit_menu_services(cls, query_db: AsyncSession, page_object: MenuModel): """ 编辑菜单信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 编辑部门对象 :return: 编辑菜单校验结果 """ - edit_menu = page_object.dict(exclude_unset=True) - menu_info = cls.detail_menu_services(result_db, edit_menu.get('menu_id')) - if menu_info: - if menu_info.parent_id != page_object.parent_id or menu_info.menu_name != page_object.menu_name or menu_info.menu_type != page_object.menu_type: - menu = MenuDao.get_menu_detail_by_info(result_db, MenuModel( - **dict(parent_id=page_object.parent_id, menu_name=page_object.menu_name, menu_type=page_object.menu_type))) - if menu: - result = dict(is_success=False, message='同一目录下不允许存在同名同类型的菜单') - return CrudMenuResponse(**result) - try: - MenuDao.edit_menu_dao(result_db, edit_menu) - result_db.commit() - result = dict(is_success=True, message='更新成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + edit_menu = page_object.model_dump(exclude_unset=True) + menu_info = await cls.menu_detail_services(query_db, page_object.menu_id) + if menu_info.menu_id: + if not await cls.check_menu_name_unique_services(query_db, page_object): + raise ServiceException(message=f'修改菜单{page_object.post_name}失败,菜单名称已存在') + elif page_object.is_frame == MenuConstant.YES_FRAME and not StringUtil.is_http(page_object.path): + raise ServiceException(message=f'修改菜单{page_object.post_name}失败,地址必须以http(s)://开头') + elif page_object.menu_id == page_object.parent_id: + raise ServiceException(message=f'修改菜单{page_object.post_name}失败,上级菜单不能选择自己') + else: + try: + await MenuDao.edit_menu_dao(query_db, edit_menu) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='菜单不存在') - - return CrudMenuResponse(**result) + raise ServiceException(message='菜单不存在') @classmethod - def delete_menu_services(cls, result_db: Session, page_object: DeleteMenuModel): + async def delete_menu_services(cls, query_db: AsyncSession, page_object: DeleteMenuModel): """ 删除菜单信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除菜单对象 :return: 删除菜单校验结果 """ - if page_object.menu_ids.split(','): + if page_object.menu_ids: menu_id_list = page_object.menu_ids.split(',') try: for menu_id in menu_id_list: - menu_id_dict = dict(menu_id=menu_id) - MenuDao.delete_menu_dao(result_db, MenuModel(**menu_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + if (await MenuDao.has_child_by_menu_id_dao(query_db, int(menu_id))) > 0: + raise ServiceWarning(message='存在子菜单,不允许删除') + elif (await MenuDao.check_menu_exist_role_dao(query_db, int(menu_id))) > 0: + raise ServiceWarning(message='菜单已分配,不允许删除') + await MenuDao.delete_menu_dao(query_db, MenuModel(menuId=menu_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入菜单id为空') - return CrudMenuResponse(**result) + raise ServiceException(message='传入菜单id为空') @classmethod - def detail_menu_services(cls, result_db: Session, menu_id: int): + async def menu_detail_services(cls, query_db: AsyncSession, menu_id: int): """ 获取菜单详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param menu_id: 菜单id :return: 菜单id对应的信息 """ - menu = MenuDao.get_menu_detail_by_id(result_db, menu_id=menu_id) + menu = await MenuDao.get_menu_detail_by_id(query_db, menu_id=menu_id) + if menu: + result = MenuModel(**CamelCaseUtil.transform_result(menu)) + else: + result = MenuModel(**dict()) - return menu + return result @classmethod - def get_menu_tree(cls, pid: int, permission_list: MenuTree): + def list_to_tree(cls, permission_list: list) -> list: """ - 工具方法:根据菜单信息生成树形嵌套数据 - :param pid: 菜单id + 工具方法:根据菜单列表信息生成树形嵌套数据 + :param permission_list: 菜单列表信息 :return: 菜单树形嵌套数据 """ - menu_list = [] - for permission in permission_list.menu_tree: - if permission.parent_id == pid: - children = cls.get_menu_tree(permission.menu_id, permission_list) - menu_list_data = {} - if children: - menu_list_data['title'] = permission.menu_name - menu_list_data['key'] = str(permission.menu_id) - menu_list_data['value'] = str(permission.menu_id) - menu_list_data['children'] = children - else: - menu_list_data['title'] = permission.menu_name - menu_list_data['key'] = str(permission.menu_id) - menu_list_data['value'] = str(permission.menu_id) - menu_list.append(menu_list_data) - - return menu_list + permission_list = [ + dict(id=item.menu_id, label=item.menu_name, parentId=item.parent_id) for item in permission_list + ] + # 转成id为key的字典 + mapping: dict = dict(zip([i['id'] for i in permission_list], permission_list)) + + # 树容器 + container: list = [] + + for d in permission_list: + # 如果找不到父级项,则是根节点 + parent: dict = mapping.get(d['parentId']) + if parent is None: + container.append(d) + else: + children: list = parent.get('children') + if not children: + children = [] + children.append(d) + parent.update({'children': children}) + + return container diff --git a/dash-fastapi-backend/module_admin/service/notice_service.py b/dash-fastapi-backend/module_admin/service/notice_service.py index a96c9a9..4671703 100644 --- a/dash-fastapi-backend/module_admin/service/notice_service.py +++ b/dash-fastapi-backend/module_admin/service/notice_service.py @@ -1,5 +1,10 @@ -from module_admin.entity.vo.notice_vo import * -from module_admin.dao.notice_dao import * +from sqlalchemy.ext.asyncio import AsyncSession +from config.constant import CommonConstant +from exceptions.exception import ServiceException +from module_admin.dao.notice_dao import NoticeDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.notice_vo import DeleteNoticeModel, NoticeModel, NoticePageQueryModel +from utils.common_util import CamelCaseUtil class NoticeService: @@ -8,98 +13,116 @@ class NoticeService: """ @classmethod - def get_notice_list_services(cls, result_db: Session, query_object: NoticeQueryModel): + async def get_notice_list_services( + cls, query_db: AsyncSession, query_object: NoticePageQueryModel, is_page: bool = True + ): """ 获取通知公告列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param is_page: 是否开启分页 :return: 通知公告列表信息对象 """ - notice_list_result = NoticeDao.get_notice_list(result_db, query_object) + notice_list_result = await NoticeDao.get_notice_list(query_db, query_object, is_page) return notice_list_result @classmethod - def add_notice_services(cls, result_db: Session, page_object: NoticeModel): + async def check_notice_unique_services(cls, query_db: AsyncSession, page_object: NoticeModel): + """ + 校验通知公告是否存在service + + :param query_db: orm对象 + :param page_object: 通知公告对象 + :return: 校验结果 + """ + notice_id = -1 if page_object.notice_id is None else page_object.notice_id + notice = await NoticeDao.get_notice_detail_by_info(query_db, page_object) + if notice and notice.notice_id != notice_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def add_notice_services(cls, query_db: AsyncSession, page_object: NoticeModel): """ 新增通知公告信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增通知公告对象 :return: 新增通知公告校验结果 """ - notice = NoticeDao.get_notice_detail_by_info(result_db, page_object) - if notice: - result = dict(is_success=False, message='通知公告已存在') + if not await cls.check_notice_unique_services(query_db, page_object): + raise ServiceException(message=f'新增通知公告{page_object.notice_title}失败,通知公告已存在') else: try: - NoticeDao.add_notice_dao(result_db, page_object) - result_db.commit() - result = dict(is_success=True, message='新增成功') + await NoticeDao.add_notice_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudNoticeResponse(**result) + await query_db.rollback() + raise e @classmethod - def edit_notice_services(cls, result_db: Session, page_object: NoticeModel): + async def edit_notice_services(cls, query_db: AsyncSession, page_object: NoticeModel): """ 编辑通知公告信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 编辑通知公告对象 :return: 编辑通知公告校验结果 """ - edit_notice = page_object.dict(exclude_unset=True) - notice_info = cls.detail_notice_services(result_db, edit_notice.get('notice_id')) - if notice_info: - if notice_info.notice_title != page_object.notice_title or notice_info.notice_type != page_object.notice_type or notice_info.notice_content != page_object.notice_content: - notice = NoticeDao.get_notice_detail_by_info(result_db, page_object) - if notice: - result = dict(is_success=False, message='通知公告已存在') - return CrudNoticeResponse(**result) - try: - NoticeDao.edit_notice_dao(result_db, edit_notice) - result_db.commit() - result = dict(is_success=True, message='更新成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + edit_notice = page_object.model_dump(exclude_unset=True) + notice_info = await cls.notice_detail_services(query_db, page_object.notice_id) + if notice_info.notice_id: + if not await cls.check_notice_unique_services(query_db, page_object): + raise ServiceException(message=f'修改通知公告{page_object.notice_title}失败,通知公告已存在') + else: + try: + await NoticeDao.edit_notice_dao(query_db, edit_notice) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='通知公告不存在') - - return CrudNoticeResponse(**result) + raise ServiceException(message='通知公告不存在') @classmethod - def delete_notice_services(cls, result_db: Session, page_object: DeleteNoticeModel): + async def delete_notice_services(cls, query_db: AsyncSession, page_object: DeleteNoticeModel): """ 删除通知公告信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除通知公告对象 :return: 删除通知公告校验结果 """ - if page_object.notice_ids.split(','): + if page_object.notice_ids: notice_id_list = page_object.notice_ids.split(',') try: for notice_id in notice_id_list: - notice_id_dict = dict(notice_id=notice_id) - NoticeDao.delete_notice_dao(result_db, NoticeModel(**notice_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + await NoticeDao.delete_notice_dao(query_db, NoticeModel(noticeId=notice_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入通知公告id为空') - return CrudNoticeResponse(**result) + raise ServiceException(message='传入通知公告id为空') @classmethod - def detail_notice_services(cls, result_db: Session, notice_id: int): + async def notice_detail_services(cls, query_db: AsyncSession, notice_id: int): """ 获取通知公告详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param notice_id: 通知公告id :return: 通知公告id对应的信息 """ - notice = NoticeDao.get_notice_detail_by_id(result_db, notice_id=notice_id) + notice = await NoticeDao.get_notice_detail_by_id(query_db, notice_id=notice_id) + if notice: + result = NoticeModel(**CamelCaseUtil.transform_result(notice)) + else: + result = NoticeModel(**dict()) - return notice + return result diff --git a/dash-fastapi-backend/module_admin/service/online_service.py b/dash-fastapi-backend/module_admin/service/online_service.py index 6ef9080..0d1c913 100644 --- a/dash-fastapi-backend/module_admin/service/online_service.py +++ b/dash-fastapi-backend/module_admin/service/online_service.py @@ -1,7 +1,11 @@ +import jwt from fastapi import Request -from jose import jwt -from config.env import JwtConfig, RedisInitKeyConfig -from module_admin.entity.vo.online_vo import * +from config.enums import RedisInitKeyConfig +from config.env import JwtConfig +from exceptions.exception import ServiceException +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.online_vo import DeleteOnlineModel, OnlineQueryModel +from utils.common_util import CamelCaseUtil class OnlineService: @@ -10,14 +14,15 @@ class OnlineService: """ @classmethod - async def get_online_list_services(cls, request: Request, query_object: OnlinePageObject): + async def get_online_list_services(cls, request: Request, query_object: OnlineQueryModel): """ 获取在线用户表信息service + :param request: Request对象 :param query_object: 查询参数对象 :return: 在线用户列表信息 """ - access_token_keys = await request.app.state.redis.keys(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}*") + access_token_keys = await request.app.state.redis.keys(f"{RedisInitKeyConfig.ACCESS_TOKEN.key}*") if not access_token_keys: access_token_keys = [] access_token_values_list = [await request.app.state.redis.get(key) for key in access_token_keys] @@ -25,17 +30,17 @@ class OnlineService: for item in access_token_values_list: payload = jwt.decode(item, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm]) online_dict = dict( - session_id=payload.get('session_id'), + token_id=payload.get('session_id'), user_name=payload.get('user_name'), dept_name=payload.get('dept_name'), ipaddr=payload.get('login_info').get('ipaddr'), - login_location=payload.get('login_info').get('login_location'), + login_location=payload.get('login_info').get('loginLocation'), browser=payload.get('login_info').get('browser'), os=payload.get('login_info').get('os'), - login_time=payload.get('login_info').get('login_time') + login_time=payload.get('login_info').get('loginTime'), ) if query_object.user_name and not query_object.ipaddr: - if query_object.user_name == payload.get('user_name'): + if query_object.user_name == payload.get('login_info').get('ipaddr'): online_info_list = [online_dict] break elif not query_object.user_name and query_object.ipaddr: @@ -43,27 +48,29 @@ class OnlineService: online_info_list = [online_dict] break elif query_object.user_name and query_object.ipaddr: - if query_object.user_name == payload.get('user_name') and query_object.ipaddr == payload.get('ipaddr'): + if query_object.user_name == payload.get('user_name') and query_object.ipaddr == payload.get( + 'login_info' + ).get('ipaddr'): online_info_list = [online_dict] break else: online_info_list.append(online_dict) - return online_info_list + return CamelCaseUtil.transform_result(online_info_list) @classmethod async def delete_online_services(cls, request: Request, page_object: DeleteOnlineModel): """ 强退在线用户信息service + :param request: Request对象 :param page_object: 强退在线用户对象 :return: 强退在线用户校验结果 """ - if page_object.session_ids.split(','): - session_id_list = page_object.session_ids.split(',') - for session_id in session_id_list: - await request.app.state.redis.delete(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{session_id}") - result = dict(is_success=True, message='强退成功') + if page_object.token_ids: + token_id_list = page_object.token_ids.split(',') + for token_id in token_id_list: + await request.app.state.redis.delete(f"{RedisInitKeyConfig.ACCESS_TOKEN.key}:{token_id}") + return CrudResponseModel(is_success=True, message='强退成功') else: - result = dict(is_success=False, message='传入session_id为空') - return CrudOnlineResponse(**result) + raise ServiceException(message='传入session_id为空') diff --git a/dash-fastapi-backend/module_admin/service/post_service.py b/dash-fastapi-backend/module_admin/service/post_service.py index 16e954f..5215539 100644 --- a/dash-fastapi-backend/module_admin/service/post_service.py +++ b/dash-fastapi-backend/module_admin/service/post_service.py @@ -1,6 +1,11 @@ -from module_admin.entity.vo.post_vo import * -from module_admin.dao.post_dao import * -from utils.common_util import export_list2excel +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.constant import CommonConstant +from exceptions.exception import ServiceException +from module_admin.dao.post_dao import PostDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.post_vo import DeletePostModel, PostModel, PostPageQueryModel +from utils.common_util import CamelCaseUtil, export_list2excel class PostService: @@ -9,142 +14,174 @@ class PostService: """ @classmethod - def get_post_select_option_services(cls, result_db: Session): + async def get_post_list_services( + cls, query_db: AsyncSession, query_object: PostPageQueryModel, is_page: bool = False + ): """ - 获取岗位列表不分页信息service - :param result_db: orm对象 - :return: 岗位列表不分页信息对象 + 获取岗位列表信息service + + :param query_db: orm对象 + :param query_object: 查询参数对象 + :param is_page: 是否开启分页 + :return: 岗位列表信息对象 """ - post_list_result = PostDao.get_post_select_option_dao(result_db) + post_list_result = await PostDao.get_post_list(query_db, query_object, is_page) return post_list_result @classmethod - def get_post_list_services(cls, result_db: Session, query_object: PostModel): + async def check_post_name_unique_services(cls, query_db: AsyncSession, page_object: PostModel): """ - 获取岗位列表信息service - :param result_db: orm对象 - :param query_object: 查询参数对象 - :return: 岗位列表信息对象 + 检查岗位名称是否唯一service + + :param query_db: orm对象 + :param page_object: 岗位对象 + :return: 校验结果 """ - post_list_result = PostDao.get_post_list(result_db, query_object) + post_id = -1 if page_object.post_id is None else page_object.post_id + post = await PostDao.get_post_detail_by_info(query_db, PostModel(postName=page_object.post_name)) + if post and post.post_id != post_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE - return post_list_result + @classmethod + async def check_post_code_unique_services(cls, query_db: AsyncSession, page_object: PostModel): + """ + 检查岗位编码是否唯一service + + :param query_db: orm对象 + :param page_object: 岗位对象 + :return: 校验结果 + """ + post_id = -1 if page_object.post_id is None else page_object.post_id + post = await PostDao.get_post_detail_by_info(query_db, PostModel(postCode=page_object.post_code)) + if post and post.post_id != post_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE @classmethod - def add_post_services(cls, result_db: Session, page_object: PostModel): + async def add_post_services(cls, query_db: AsyncSession, page_object: PostModel): """ 新增岗位信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增岗位对象 :return: 新增岗位校验结果 """ - post = PostDao.get_post_detail_by_info(result_db, PostModel(**dict(post_name=page_object.post_name))) - if post: - result = dict(is_success=False, message='岗位名称已存在') + if not await cls.check_post_name_unique_services(query_db, page_object): + raise ServiceException(message=f'新增岗位{page_object.post_name}失败,岗位名称已存在') + elif not await cls.check_post_code_unique_services(query_db, page_object): + raise ServiceException(message=f'新增岗位{page_object.post_name}失败,岗位编码已存在') else: try: - PostDao.add_post_dao(result_db, page_object) - result_db.commit() - result = dict(is_success=True, message='新增成功') + await PostDao.add_post_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudPostResponse(**result) + await query_db.rollback() + raise e @classmethod - def edit_post_services(cls, result_db: Session, page_object: PostModel): + async def edit_post_services(cls, query_db: AsyncSession, page_object: PostModel): """ 编辑岗位信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 编辑岗位对象 :return: 编辑岗位校验结果 """ - edit_post = page_object.dict(exclude_unset=True) - post_info = cls.detail_post_services(result_db, edit_post.get('post_id')) - if post_info: - if post_info.post_name != page_object.post_name: - post = PostDao.get_post_detail_by_info(result_db, PostModel(**dict(post_name=page_object.post_name))) - if post: - result = dict(is_success=False, message='岗位名称已存在') - return CrudPostResponse(**result) - try: - PostDao.edit_post_dao(result_db, edit_post) - result_db.commit() - result = dict(is_success=True, message='更新成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + edit_post = page_object.model_dump(exclude_unset=True) + post_info = await cls.post_detail_services(query_db, page_object.post_id) + if post_info.post_id: + if not await cls.check_post_name_unique_services(query_db, page_object): + raise ServiceException(message=f'修改岗位{page_object.post_name}失败,岗位名称已存在') + elif not await cls.check_post_code_unique_services(query_db, page_object): + raise ServiceException(message=f'修改岗位{page_object.post_name}失败,岗位编码已存在') + else: + try: + await PostDao.edit_post_dao(query_db, edit_post) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='岗位不存在') - - return CrudPostResponse(**result) + raise ServiceException(message='岗位不存在') @classmethod - def delete_post_services(cls, result_db: Session, page_object: DeletePostModel): + async def delete_post_services(cls, query_db: AsyncSession, page_object: DeletePostModel): """ 删除岗位信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除岗位对象 :return: 删除岗位校验结果 """ - if page_object.post_ids.split(','): + if page_object.post_ids: post_id_list = page_object.post_ids.split(',') try: for post_id in post_id_list: - post_id_dict = dict(post_id=post_id) - PostDao.delete_post_dao(result_db, PostModel(**post_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + post = await cls.post_detail_services(query_db, int(post_id)) + if (await PostDao.count_user_post_dao(query_db, int(post_id))) > 0: + raise ServiceException(message=f'{post.post_name}已分配,不能删除') + await PostDao.delete_post_dao(query_db, PostModel(postId=post_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入岗位id为空') - return CrudPostResponse(**result) + raise ServiceException(message='传入岗位id为空') @classmethod - def detail_post_services(cls, result_db: Session, post_id: int): + async def post_detail_services(cls, query_db: AsyncSession, post_id: int): """ 获取岗位详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param post_id: 岗位id :return: 岗位id对应的信息 """ - post = PostDao.get_post_detail_by_id(result_db, post_id=post_id) + post = await PostDao.get_post_detail_by_id(query_db, post_id=post_id) + if post: + result = PostModel(**CamelCaseUtil.transform_result(post)) + else: + result = PostModel(**dict()) - return post + return result @staticmethod - def export_post_list_services(post_list: List): + async def export_post_list_services(post_list: List): """ 导出岗位信息service + :param post_list: 岗位信息列表 :return: 岗位信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "post_id": "岗位编号", - "post_code": "岗位编码", - "post_name": "岗位名称", - "post_sort": "显示顺序", - "status": "状态", - "create_by": "创建者", - "create_time": "创建时间", - "update_by": "更新者", - "update_time": "更新时间", - "remark": "备注", + 'postId': '岗位编号', + 'postCode': '岗位编码', + 'postName': '岗位名称', + 'postSort': '显示顺序', + 'status': '状态', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } - data = [PostModel(**vars(row)).dict() for row in post_list] + data = post_list for item in data: if item.get('status') == '0': item['status'] = '正常' else: item['status'] = '停用' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data diff --git a/dash-fastapi-backend/module_admin/service/role_service.py b/dash-fastapi-backend/module_admin/service/role_service.py index 7690255..7939781 100644 --- a/dash-fastapi-backend/module_admin/service/role_service.py +++ b/dash-fastapi-backend/module_admin/service/role_service.py @@ -1,6 +1,22 @@ -from module_admin.entity.vo.role_vo import * -from module_admin.dao.role_dao import * -from utils.common_util import export_list2excel +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.constant import CommonConstant +from exceptions.exception import ServiceException +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.role_vo import ( + AddRoleModel, + DeleteRoleModel, + RoleDeptModel, + RoleDeptQueryModel, + RoleMenuModel, + RoleModel, + RolePageQueryModel, +) +from module_admin.entity.vo.user_vo import UserInfoModel, UserRolePageQueryModel +from module_admin.dao.role_dao import RoleDao +from module_admin.dao.user_dao import UserDao +from utils.common_util import CamelCaseUtil, export_list2excel +from utils.page_util import PageResponseModel class RoleService: @@ -9,198 +25,336 @@ class RoleService: """ @classmethod - def get_role_select_option_services(cls, result_db: Session): + async def get_role_select_option_services(cls, query_db: AsyncSession): """ 获取角色列表不分页信息service - :param result_db: orm对象 + + :param query_db: orm对象 :return: 角色列表不分页信息对象 """ - role_list_result = RoleDao.get_role_select_option_dao(result_db) + role_list_result = await RoleDao.get_role_select_option_dao(query_db) - return role_list_result + return CamelCaseUtil.transform_result(role_list_result) + + @classmethod + async def get_role_dept_tree_services(cls, query_db: AsyncSession, role_id: int): + """ + 根据角色id获取部门树信息service + + :param query_db: orm对象 + :param role_id: 角色id + :return: 当前角色id的部门树信息对象 + """ + role = await cls.role_detail_services(query_db, role_id) + role_dept_list = await RoleDao.get_role_dept_dao(query_db, role) + checked_keys = [row.dept_id for row in role_dept_list] + result = RoleDeptQueryModel(checkedKeys=checked_keys) + + return result @classmethod - def get_role_list_services(cls, result_db: Session, query_object: RoleQueryModel): + async def get_role_list_services( + cls, query_db: AsyncSession, query_object: RolePageQueryModel, data_scope_sql: str, is_page: bool = False + ): """ 获取角色列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 + :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 :return: 角色列表信息对象 """ - role_list_result = RoleDao.get_role_list(result_db, query_object) + role_list_result = await RoleDao.get_role_list(query_db, query_object, data_scope_sql, is_page) return role_list_result @classmethod - def add_role_services(cls, result_db: Session, page_object: AddRoleModel): + async def check_role_allowed_services(cls, check_role: RoleModel): + """ + 校验角色是否允许操作service + + :param check_role: 角色信息 + :return: 校验结果 + """ + if check_role.admin: + raise ServiceException(message='不允许操作超级管理员角色') + else: + return CrudResponseModel(is_success=True, message='校验通过') + + @classmethod + async def check_role_data_scope_services(cls, query_db: AsyncSession, role_ids: str, data_scope_sql: str): + """ + 校验角色是否有数据权限service + + :param query_db: orm对象 + :param role_ids: 角色id + :param data_scope_sql: 数据权限对应的查询sql语句 + :return: 校验结果 + """ + role_id_list = role_ids.split(',') if role_ids else [] + if role_id_list: + for role_id in role_id_list: + roles = await RoleDao.get_role_list( + query_db, RolePageQueryModel(roleId=int(role_id)), data_scope_sql, is_page=False + ) + if roles: + continue + else: + raise ServiceException(message='没有权限访问角色数据') + + @classmethod + async def check_role_name_unique_services(cls, query_db: AsyncSession, page_object: RoleModel): + """ + 校验角色名称是否唯一service + + :param query_db: orm对象 + :param page_object: 角色对象 + :return: 校验结果 + """ + role_id = -1 if page_object.role_id is None else page_object.role_id + role = await RoleDao.get_role_by_info(query_db, RoleModel(roleName=page_object.role_name)) + if role and role.role_id != role_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def check_role_key_unique_services(cls, query_db: AsyncSession, page_object: RoleModel): + """ + 校验角色权限字符是否唯一service + + :param query_db: orm对象 + :param page_object: 角色对象 + :return: 校验结果 + """ + role_id = -1 if page_object.role_id is None else page_object.role_id + role = await RoleDao.get_role_by_info(query_db, RoleModel(roleKey=page_object.role_key)) + if role and role.role_id != role_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def add_role_services(cls, query_db: AsyncSession, page_object: AddRoleModel): """ 新增角色信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增角色对象 :return: 新增角色校验结果 """ - add_role = RoleModel(**page_object.dict()) - role = RoleDao.get_role_by_info(result_db, RoleModel(**dict(role_name=page_object.role_name))) - if role: - result = dict(is_success=False, message='角色名称已存在') + add_role = RoleModel(**page_object.model_dump(by_alias=True)) + if not await cls.check_role_name_unique_services(query_db, page_object): + raise ServiceException(message=f'新增角色{page_object.post_name}失败,角色名称已存在') + elif not await cls.check_role_key_unique_services(query_db, page_object): + raise ServiceException(message=f'新增角色{page_object.post_name}失败,角色权限已存在') else: try: - add_result = RoleDao.add_role_dao(result_db, add_role) + add_result = await RoleDao.add_role_dao(query_db, add_role) role_id = add_result.role_id - if page_object.menu_id: - menu_id_list = page_object.menu_id.split(',') - for menu in menu_id_list: - menu_dict = dict(role_id=role_id, menu_id=menu) - RoleDao.add_role_menu_dao(result_db, RoleMenuModel(**menu_dict)) - result_db.commit() - result = dict(is_success=True, message='新增成功') + if page_object.menu_ids: + for menu in page_object.menu_ids: + await RoleDao.add_role_menu_dao(query_db, RoleMenuModel(roleId=role_id, menuId=menu)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudRoleResponse(**result) + await query_db.rollback() + raise e @classmethod - def edit_role_services(cls, result_db: Session, page_object: AddRoleModel): + async def edit_role_services(cls, query_db: AsyncSession, page_object: AddRoleModel): """ 编辑角色信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 编辑角色对象 :return: 编辑角色校验结果 """ - edit_role = page_object.dict(exclude_unset=True) + edit_role = page_object.model_dump(exclude_unset=True, exclude={'admin'}) if page_object.type != 'status': - del edit_role['menu_id'] + del edit_role['menu_ids'] if page_object.type == 'status': del edit_role['type'] - role_info = cls.detail_role_services(result_db, edit_role.get('role_id')) + role_info = await cls.role_detail_services(query_db, edit_role.get('role_id')) if role_info: - if page_object.type != 'status' and role_info.role.role_name != page_object.role_name: - role = RoleDao.get_role_by_info(result_db, RoleModel(**dict(role_name=page_object.role_name))) - if role: - result = dict(is_success=False, message='角色名称已存在') - return CrudRoleResponse(**result) + if page_object.type != 'status': + if not await cls.check_role_name_unique_services(query_db, page_object): + raise ServiceException(message=f'修改角色{page_object.post_name}失败,角色名称已存在') + elif not await cls.check_role_key_unique_services(query_db, page_object): + raise ServiceException(message=f'修改角色{page_object.post_name}失败,角色权限已存在') try: - RoleDao.edit_role_dao(result_db, edit_role) + await RoleDao.edit_role_dao(query_db, edit_role) if page_object.type != 'status': - role_id_dict = dict(role_id=page_object.role_id) - RoleDao.delete_role_menu_dao(result_db, RoleMenuModel(**role_id_dict)) - if page_object.menu_id: - menu_id_list = page_object.menu_id.split(',') - for menu in menu_id_list: - menu_dict = dict(role_id=page_object.role_id, menu_id=menu) - RoleDao.add_role_menu_dao(result_db, RoleMenuModel(**menu_dict)) - result_db.commit() - result = dict(is_success=True, message='更新成功') + await RoleDao.delete_role_menu_dao(query_db, RoleMenuModel(roleId=page_object.role_id)) + if page_object.menu_ids: + for menu in page_object.menu_ids: + await RoleDao.add_role_menu_dao( + query_db, RoleMenuModel(roleId=page_object.role_id, menuId=menu) + ) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='角色不存在') - - return CrudRoleResponse(**result) + raise ServiceException(message='角色不存在') @classmethod - def role_datascope_services(cls, result_db: Session, page_object: RoleDataScopeModel): + async def role_datascope_services(cls, query_db: AsyncSession, page_object: AddRoleModel): """ 分配角色数据权限service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 角色数据权限对象 :return: 分配角色数据权限结果 """ - edit_role = page_object.dict(exclude_unset=True) - del edit_role['dept_id'] - role_info = cls.detail_role_services(result_db, edit_role.get('role_id')) - if role_info: - if role_info.role.role_name != page_object.role_name: - role = RoleDao.get_role_by_info(result_db, RoleModel(**dict(role_name=page_object.role_name))) - if role: - result = dict(is_success=False, message='角色名称已存在') - return CrudRoleResponse(**result) + edit_role = page_object.model_dump(exclude_unset=True, exclude={'admin', 'dept_ids'}) + role_info = await cls.role_detail_services(query_db, page_object.role_id) + if role_info.role_id: try: - RoleDao.edit_role_dao(result_db, edit_role) - role_id_dict = dict(role_id=page_object.role_id) - RoleDao.delete_role_dept_dao(result_db, RoleDeptModel(**role_id_dict)) - if page_object.dept_id and page_object.data_scope == '2': - dept_id_list = page_object.dept_id.split(',') - for dept in dept_id_list: - dept_dict = dict(role_id=page_object.role_id, dept_id=dept) - RoleDao.add_role_dept_dao(result_db, RoleDeptModel(**dept_dict)) - result_db.commit() - result = dict(is_success=True, message='分配成功') + await RoleDao.edit_role_dao(query_db, edit_role) + await RoleDao.delete_role_dept_dao(query_db, RoleDeptModel(roleId=page_object.role_id)) + if page_object.dept_ids and page_object.data_scope == '2': + for dept in page_object.dept_ids: + await RoleDao.add_role_dept_dao( + query_db, RoleDeptModel(roleId=page_object.role_id, deptId=dept) + ) + await query_db.commit() + return CrudResponseModel(is_success=True, message='分配成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='角色不存在') - - return CrudRoleResponse(**result) + raise ServiceException(message='角色不存在') @classmethod - def delete_role_services(cls, result_db: Session, page_object: DeleteRoleModel): + async def delete_role_services(cls, query_db: AsyncSession, page_object: DeleteRoleModel): """ 删除角色信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除角色对象 :return: 删除角色校验结果 """ - if page_object.role_ids.split(','): + if page_object.role_ids: role_id_list = page_object.role_ids.split(',') try: for role_id in role_id_list: - role_id_dict = dict(role_id=role_id, update_by=page_object.update_by, update_time=page_object.update_time) - RoleDao.delete_role_menu_dao(result_db, RoleMenuModel(**role_id_dict)) - RoleDao.delete_role_dao(result_db, RoleModel(**role_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + role = await cls.role_detail_services(query_db, int(role_id)) + if (await RoleDao.count_user_role_dao(query_db, int(role_id))) > 0: + raise ServiceException(message=f'角色{role.role_name}已分配,不能删除') + role_id_dict = dict( + roleId=role_id, updateBy=page_object.update_by, updateTime=page_object.update_time + ) + await RoleDao.delete_role_menu_dao(query_db, RoleMenuModel(**role_id_dict)) + await RoleDao.delete_role_dept_dao(query_db, RoleDeptModel(**role_id_dict)) + await RoleDao.delete_role_dao(query_db, RoleModel(**role_id_dict)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入角色id为空') - return CrudRoleResponse(**result) + raise ServiceException(message='传入角色id为空') @classmethod - def detail_role_services(cls, result_db: Session, role_id: int): + async def role_detail_services(cls, query_db: AsyncSession, role_id: int): """ 获取角色详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param role_id: 角色id :return: 角色id对应的信息 """ - role = RoleDao.get_role_detail_by_id(result_db, role_id=role_id) + role = await RoleDao.get_role_detail_by_id(query_db, role_id=role_id) + if role: + result = RoleModel(**CamelCaseUtil.transform_result(role)) + else: + result = RoleModel(**dict()) - return role + return result @staticmethod - def export_role_list_services(role_list: List): + async def export_role_list_services(role_list: List): """ 导出角色列表信息service + :param role_list: 角色信息列表 :return: 角色列表信息对象 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "role_id": "角色编号", - "role_name": "角色名称", - "role_key": "权限字符", - "role_sort": "显示顺序", - "status": "状态", - "create_by": "创建者", - "create_time": "创建时间", - "update_by": "更新者", - "update_time": "更新时间", - "remark": "备注", + 'roleId': '角色编号', + 'roleName': '角色名称', + 'roleKey': '权限字符', + 'roleSort': '显示顺序', + 'status': '状态', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } - data = [RoleModel(**vars(row)).dict() for row in role_list] + data = role_list for item in data: if item.get('status') == '0': item['status'] = '正常' else: item['status'] = '停用' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data + + @classmethod + async def get_role_user_allocated_list_services( + cls, query_db: AsyncSession, page_object: UserRolePageQueryModel, data_scope_sql: str, is_page: bool = False + ): + """ + 根据角色id获取已分配用户列表 + + :param query_db: orm对象 + :param page_object: 用户关联角色对象 + :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 + :return: 已分配用户列表 + """ + query_user_list = await UserDao.get_user_role_allocated_list_by_role_id( + query_db, page_object, data_scope_sql, is_page + ) + allocated_list = PageResponseModel( + **{ + **query_user_list.model_dump(by_alias=True), + 'rows': [UserInfoModel(**row) for row in query_user_list.rows], + } + ) + + return allocated_list + + @classmethod + async def get_role_user_unallocated_list_services( + cls, query_db: AsyncSession, page_object: UserRolePageQueryModel, data_scope_sql: str, is_page: bool = False + ): + """ + 根据角色id获取未分配用户列表 + + :param query_db: orm对象 + :param page_object: 用户关联角色对象 + :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 + :return: 未分配用户列表 + """ + query_user_list = await UserDao.get_user_role_unallocated_list_by_role_id( + query_db, page_object, data_scope_sql, is_page + ) + unallocated_list = PageResponseModel( + **{ + **query_user_list.model_dump(by_alias=True), + 'rows': [UserInfoModel(**row) for row in query_user_list.rows], + } + ) + + return unallocated_list diff --git a/dash-fastapi-backend/module_admin/service/server_service.py b/dash-fastapi-backend/module_admin/service/server_service.py index 0c41c8e..2f9a53f 100644 --- a/dash-fastapi-backend/module_admin/service/server_service.py +++ b/dash-fastapi-backend/module_admin/service/server_service.py @@ -1,10 +1,10 @@ -import psutil -from utils.common_util import bytes2human +import os import platform +import psutil import socket -import os import time -from module_admin.entity.vo.server_vo import * +from module_admin.entity.vo.server_vo import CpuInfo, MemoryInfo, PyInfo, ServerMonitorModel, SysFiles, SysInfo +from utils.common_util import bytes2human class ServerService: @@ -13,23 +13,23 @@ class ServerService: """ @staticmethod - def get_server_monitor_info(): + async def get_server_monitor_info(): # CPU信息 # 获取CPU总核心数 cpu_num = psutil.cpu_count(logical=True) cpu_usage_percent = psutil.cpu_times_percent() - cpu_used = f'{cpu_usage_percent.user}%' - cpu_sys = f'{cpu_usage_percent.system}%' - cpu_free = f'{cpu_usage_percent.idle}%' - cpu = CpuInfo(**dict(cpu_num=cpu_num, used=cpu_used, sys=cpu_sys, free=cpu_free)) + cpu_used = cpu_usage_percent.user + cpu_sys = cpu_usage_percent.system + cpu_free = cpu_usage_percent.idle + cpu = CpuInfo(cpuNum=cpu_num, used=cpu_used, sys=cpu_sys, free=cpu_free) # 内存信息 memory_info = psutil.virtual_memory() memory_total = bytes2human(memory_info.total) memory_used = bytes2human(memory_info.used) memory_free = bytes2human(memory_info.free) - memory_usage = f'{memory_info.percent}%' - mem = MemoryInfo(**dict(total=memory_total, used=memory_used, free=memory_free, usage=memory_usage)) + memory_usage = memory_info.percent + mem = MemoryInfo(total=memory_total, used=memory_used, free=memory_free, usage=memory_usage) # 主机信息 # 获取主机名 @@ -39,7 +39,10 @@ class ServerService: os_name = platform.platform() computer_name = platform.node() os_arch = platform.machine() - sys = SysInfo(**dict(computer_ip=computer_ip, computer_name=computer_name, os_arch=os_arch, os_name=os_name)) + user_dir = os.path.abspath(os.getcwd()) + sys = SysInfo( + computerIp=computer_ip, computerName=computer_name, osArch=os_arch, osName=os_name, userDir=user_dir + ) # python解释器信息 current_pid = os.getpid() @@ -48,24 +51,28 @@ class ServerService: python_version = platform.python_version() python_home = current_process.exe() start_time_stamp = current_process.create_time() - start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start_time_stamp)) + start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time_stamp)) current_time_stamp = time.time() difference = current_time_stamp - start_time_stamp # 将时间差转换为天、小时和分钟数 days = int(difference // (24 * 60 * 60)) # 每天的秒数 hours = int((difference % (24 * 60 * 60)) // (60 * 60)) # 每小时的秒数 minutes = int((difference % (60 * 60)) // 60) # 每分钟的秒数 - run_time = f"{days}天{hours}小时{minutes}分钟" - project_dir = os.path.abspath(os.getcwd()) + run_time = f'{days}天{hours}小时{minutes}分钟' + # 获取当前Python程序的pid + pid = os.getpid() + # 获取该进程的内存信息 + current_process_memory_info = psutil.Process(pid).memory_info() py = PyInfo( - **dict( - name=python_name, - version=python_version, - start_time=start_time, - run_time=run_time, - home=python_home, - project_dir=project_dir - ) + name=python_name, + version=python_version, + startTime=start_time, + runTime=run_time, + home=python_home, + total=bytes2human(memory_info.available), + used=bytes2human(current_process_memory_info.rss), + free=bytes2human(memory_info.available - current_process_memory_info.rss), + usage=round((current_process_memory_info.rss / memory_info.available) * 100, 2), ) # 磁盘信息 @@ -73,17 +80,17 @@ class ServerService: sys_files = [] for i in io: o = psutil.disk_usage(i.device) - disk_data = { - "dir_name": i.device, - "sys_type_name": i.fstype, - "disk_name": "本地固定磁盘(" + i.mountpoint.replace('\\', '') + ")", - "total": bytes2human(o.total), - "used": bytes2human(o.used), - "free": bytes2human(o.free), - "usage": f'{psutil.disk_usage(i.device).percent}%' - } - sys_files.append(SysFiles(**disk_data)) + disk_data = SysFiles( + dirName=i.device, + sysTypeName=i.fstype, + typeName='本地固定磁盘(' + i.mountpoint.replace('\\', '') + ')', + total=bytes2human(o.total), + used=bytes2human(o.used), + free=bytes2human(o.free), + usage=f'{psutil.disk_usage(i.device).percent}%', + ) + sys_files.append(disk_data) - result = dict(cpu=cpu, mem=mem, sys=sys, py=py, sys_files=sys_files) + result = ServerMonitorModel(cpu=cpu, mem=mem, sys=sys, py=py, sysFiles=sys_files) - return ServerMonitorModel(**result) + return result diff --git a/dash-fastapi-backend/module_admin/service/user_service.py b/dash-fastapi-backend/module_admin/service/user_service.py index c0baa8d..dc79430 100644 --- a/dash-fastapi-backend/module_admin/service/user_service.py +++ b/dash-fastapi-backend/module_admin/service/user_service.py @@ -1,7 +1,39 @@ -from module_admin.entity.vo.user_vo import * -from module_admin.dao.user_dao import * -from utils.pwd_util import * -from utils.common_util import * +import io +import pandas as pd +from datetime import datetime +from fastapi import Request, UploadFile +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List, Union +from config.constant import CommonConstant +from exceptions.exception import ServiceException +from module_admin.dao.user_dao import UserDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.post_vo import PostPageQueryModel +from module_admin.entity.vo.user_vo import ( + AddUserModel, + CrudUserRoleModel, + CurrentUserModel, + DeleteUserModel, + EditUserModel, + ResetUserModel, + SelectedRoleModel, + UserDetailModel, + UserInfoModel, + UserModel, + UserPageQueryModel, + UserPostModel, + UserProfileModel, + UserRoleModel, + UserRoleQueryModel, + UserRoleResponseModel, +) +from module_admin.service.config_service import ConfigService +from module_admin.service.dept_service import DeptService +from module_admin.service.post_service import PostService +from module_admin.service.role_service import RoleService +from utils.common_util import CamelCaseUtil, export_list2excel, get_excel_template +from utils.page_util import PageResponseModel +from utils.pwd_util import PwdUtil class UserService: @@ -10,190 +42,340 @@ class UserService: """ @classmethod - def get_user_list_services(cls, result_db: Session, query_object: UserQueryModel, data_scope_sql: str): + async def get_user_list_services( + cls, query_db: AsyncSession, query_object: UserPageQueryModel, data_scope_sql: str, is_page: bool = False + ): """ 获取用户列表信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param query_object: 查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 + :param is_page: 是否开启分页 :return: 用户列表信息对象 """ - user_list_result = UserDao.get_user_list(result_db, query_object, data_scope_sql) + query_result = await UserDao.get_user_list(query_db, query_object, data_scope_sql, is_page) + if is_page: + user_list_result = PageResponseModel( + **{ + **query_result.model_dump(by_alias=True), + 'rows': [{**row[0], 'dept': row[1]} for row in query_result.rows], + } + ) + else: + user_list_result = [] + if query_result: + user_list_result = [{**row[0], 'dept': row[1]} for row in query_result] return user_list_result @classmethod - def add_user_services(cls, result_db: Session, page_object: AddUserModel): + async def check_user_allowed_services(cls, check_user: UserModel): + """ + 校验用户是否允许操作service + + :param check_user: 用户信息 + :return: 校验结果 + """ + if check_user.admin: + raise ServiceException(message='不允许操作超级管理员用户') + else: + return CrudResponseModel(is_success=True, message='校验通过') + + @classmethod + async def check_user_data_scope_services(cls, query_db: AsyncSession, user_id: int, data_scope_sql: str): + """ + 校验用户数据权限service + + :param query_db: orm对象 + :param user_id: 用户id + :param data_scope_sql: 数据权限对应的查询sql语句 + :return: 校验结果 + """ + users = await UserDao.get_user_list(query_db, UserPageQueryModel(userId=user_id), data_scope_sql, is_page=False) + if users: + return CrudResponseModel(is_success=True, message='校验通过') + else: + raise ServiceException(message='没有权限访问用户数据') + + @classmethod + async def check_user_name_unique_services(cls, query_db: AsyncSession, page_object: UserModel): + """ + 校验用户名是否唯一service + + :param query_db: orm对象 + :param page_object: 用户对象 + :return: 校验结果 + """ + user_id = -1 if page_object.user_id is None else page_object.user_id + user = await UserDao.get_user_by_info(query_db, UserModel(userName=page_object.user_name)) + if user and user.user_id != user_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def check_phonenumber_unique_services(cls, query_db: AsyncSession, page_object: UserModel): + """ + 校验用户手机号是否唯一service + + :param query_db: orm对象 + :param page_object: 用户对象 + :return: 校验结果 + """ + user_id = -1 if page_object.user_id is None else page_object.user_id + user = await UserDao.get_user_by_info(query_db, UserModel(phonenumber=page_object.phonenumber)) + if user and user.user_id != user_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def check_email_unique_services(cls, query_db: AsyncSession, page_object: UserModel): + """ + 校验用户邮箱是否唯一service + + :param query_db: orm对象 + :param page_object: 用户对象 + :return: 校验结果 + """ + user_id = -1 if page_object.user_id is None else page_object.user_id + user = await UserDao.get_user_by_info(query_db, UserModel(email=page_object.email)) + if user and user.user_id != user_id: + return CommonConstant.NOT_UNIQUE + return CommonConstant.UNIQUE + + @classmethod + async def add_user_services(cls, query_db: AsyncSession, page_object: AddUserModel): """ 新增用户信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增用户对象 :return: 新增用户校验结果 """ - add_user = UserModel(**page_object.dict()) - user = UserDao.get_user_by_info(result_db, UserModel(**dict(user_name=page_object.user_name))) - if user: - result = dict(is_success=False, message='用户名已存在') + add_user = UserModel(**page_object.model_dump(by_alias=True)) + if not await cls.check_user_name_unique_services(query_db, page_object): + raise ServiceException(message=f'新增用户{page_object.user_name}失败,登录账号已存在') + elif page_object.phonenumber and not await cls.check_phonenumber_unique_services(query_db, page_object): + raise ServiceException(message=f'新增用户{page_object.user_name}失败,手机号码已存在') + elif page_object.email and not await cls.check_email_unique_services(query_db, page_object): + raise ServiceException(message=f'新增用户{page_object.user_name}失败,邮箱账号已存在') else: try: - add_result = UserDao.add_user_dao(result_db, add_user) + add_result = await UserDao.add_user_dao(query_db, add_user) user_id = add_result.user_id - if page_object.role_id: - role_id_list = page_object.role_id.split(',') - for role in role_id_list: - role_dict = dict(user_id=user_id, role_id=role) - UserDao.add_user_role_dao(result_db, UserRoleModel(**role_dict)) - if page_object.post_id: - post_id_list = page_object.post_id.split(',') - for post in post_id_list: - post_dict = dict(user_id=user_id, post_id=post) - UserDao.add_user_post_dao(result_db, UserPostModel(**post_dict)) - result_db.commit() - result = dict(is_success=True, message='新增成功') + if page_object.role_ids: + for role in page_object.role_ids: + await UserDao.add_user_role_dao(query_db, UserRoleModel(userId=user_id, roleId=role)) + if page_object.post_ids: + for post in page_object.post_ids: + await UserDao.add_user_post_dao(query_db, UserPostModel(userId=user_id, postId=post)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudUserResponse(**result) + await query_db.rollback() + raise e @classmethod - def edit_user_services(cls, result_db: Session, page_object: AddUserModel): + async def edit_user_services(cls, query_db: AsyncSession, page_object: EditUserModel): """ 编辑用户信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 编辑用户对象 :return: 编辑用户校验结果 """ - edit_user = page_object.dict(exclude_unset=True) - if page_object.type != 'status' and page_object.type != 'avatar': - del edit_user['role_id'] - del edit_user['post_id'] - if page_object.type == 'status' or page_object.type == 'avatar': + edit_user = page_object.model_dump(exclude_unset=True, exclude={'admin'}) + if page_object.type != 'status' and page_object.type != 'avatar' and page_object.type != 'pwd': + del edit_user['role_ids'] + del edit_user['post_ids'] + del edit_user['role'] + if page_object.type == 'status' or page_object.type == 'avatar' or page_object.type == 'pwd': del edit_user['type'] - user_info = cls.detail_user_services(result_db, edit_user.get('user_id')) - if user_info: - if page_object.type != 'status' and page_object.type != 'avatar' and user_info.user.user_name != page_object.user_name: - user = UserDao.get_user_by_info(result_db, UserModel(**dict(user_name=page_object.user_name))) - if user: - result = dict(is_success=False, message='用户名已存在') - return CrudUserResponse(**result) + user_info = await cls.user_detail_services(query_db, edit_user.get('user_id')) + if user_info.data and user_info.data.user_id: + if page_object.type != 'status' and page_object.type != 'avatar' and page_object.type != 'pwd': + if not await cls.check_user_name_unique_services(query_db, page_object): + raise ServiceException(message=f'修改用户{page_object.user_name}失败,登录账号已存在') + elif page_object.phonenumber and not await cls.check_phonenumber_unique_services(query_db, page_object): + raise ServiceException(message=f'修改用户{page_object.user_name}失败,手机号码已存在') + elif page_object.email and not await cls.check_email_unique_services(query_db, page_object): + raise ServiceException(message=f'修改用户{page_object.user_name}失败,邮箱账号已存在') try: - UserDao.edit_user_dao(result_db, edit_user) - if page_object.type != 'status' and page_object.type != 'avatar': - user_id_dict = dict(user_id=page_object.user_id) - UserDao.delete_user_role_dao(result_db, UserRoleModel(**user_id_dict)) - UserDao.delete_user_post_dao(result_db, UserPostModel(**user_id_dict)) - if page_object.role_id: - role_id_list = page_object.role_id.split(',') - for role in role_id_list: - role_dict = dict(user_id=page_object.user_id, role_id=role) - UserDao.add_user_role_dao(result_db, UserRoleModel(**role_dict)) - if page_object.post_id: - post_id_list = page_object.post_id.split(',') - for post in post_id_list: - post_dict = dict(user_id=page_object.user_id, post_id=post) - UserDao.add_user_post_dao(result_db, UserPostModel(**post_dict)) - result_db.commit() - result = dict(is_success=True, message='更新成功') + await UserDao.edit_user_dao(query_db, edit_user) + if page_object.type != 'status' and page_object.type != 'avatar' and page_object.type != 'pwd': + await UserDao.delete_user_role_dao(query_db, UserRoleModel(userId=page_object.user_id)) + await UserDao.delete_user_post_dao(query_db, UserPostModel(userId=page_object.user_id)) + if page_object.role_ids: + for role in page_object.role_ids: + await UserDao.add_user_role_dao( + query_db, UserRoleModel(userId=page_object.user_id, roleId=role) + ) + if page_object.post_ids: + for post in page_object.post_ids: + await UserDao.add_user_post_dao( + query_db, UserPostModel(userId=page_object.user_id, postId=post) + ) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='用户不存在') - - return CrudUserResponse(**result) + raise ServiceException(message='用户不存在') @classmethod - def delete_user_services(cls, result_db: Session, page_object: DeleteUserModel): + async def delete_user_services(cls, query_db: AsyncSession, page_object: DeleteUserModel): """ 删除用户信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除用户对象 :return: 删除用户校验结果 """ - if page_object.user_ids.split(','): + if page_object.user_ids: user_id_list = page_object.user_ids.split(',') try: for user_id in user_id_list: - user_id_dict = dict(user_id=user_id, update_by=page_object.update_by, update_time=page_object.update_time) - UserDao.delete_user_role_dao(result_db, UserRoleModel(**user_id_dict)) - UserDao.delete_user_post_dao(result_db, UserPostModel(**user_id_dict)) - UserDao.delete_user_dao(result_db, UserModel(**user_id_dict)) - result_db.commit() - result = dict(is_success=True, message='删除成功') + user_id_dict = dict( + userId=user_id, updateBy=page_object.update_by, updateTime=page_object.update_time + ) + await UserDao.delete_user_role_dao(query_db, UserRoleModel(**user_id_dict)) + await UserDao.delete_user_post_dao(query_db, UserPostModel(**user_id_dict)) + await UserDao.delete_user_dao(query_db, UserModel(**user_id_dict)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入用户id为空') - return CrudUserResponse(**result) + raise ServiceException(message='传入用户id为空') @classmethod - def detail_user_services(cls, result_db: Session, user_id: int): + async def user_detail_services(cls, query_db: AsyncSession, user_id: Union[int, str]): """ 获取用户详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param user_id: 用户id :return: 用户id对应的信息 """ - user = UserDao.get_user_detail_by_id(result_db, user_id=user_id) + posts = await PostService.get_post_list_services(query_db, PostPageQueryModel(**{}), is_page=False) + roles = await RoleService.get_role_select_option_services(query_db) + if user_id != '': + query_user = await UserDao.get_user_detail_by_id(query_db, user_id=user_id) + post_ids = ','.join([str(row.post_id) for row in query_user.get('user_post_info')]) + post_ids_list = [row.post_id for row in query_user.get('user_post_info')] + role_ids = ','.join([str(row.role_id) for row in query_user.get('user_role_info')]) + role_ids_list = [row.role_id for row in query_user.get('user_role_info')] + + return UserDetailModel( + data=UserInfoModel( + **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), + postIds=post_ids, + roleIds=role_ids, + dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), + role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + ), + postIds=post_ids_list, + posts=posts, + roleIds=role_ids_list, + roles=roles, + ) + + return UserDetailModel(posts=posts, roles=roles) + + @classmethod + async def user_profile_services(cls, query_db: AsyncSession, user_id: int): + """ + 获取用户个人详细信息service - return UserDetailModel( - user=user.user_basic_info, - dept=user.user_dept_info, - role=user.user_role_info, - post=user.user_post_info + :param query_db: orm对象 + :param user_id: 用户id + :return: 用户id对应的信息 + """ + query_user = await UserDao.get_user_detail_by_id(query_db, user_id=user_id) + post_ids = ','.join([str(row.post_id) for row in query_user.get('user_post_info')]) + post_group = ','.join([row.post_name for row in query_user.get('user_post_info')]) + role_ids = ','.join([str(row.role_id) for row in query_user.get('user_role_info')]) + role_group = ','.join([row.role_name for row in query_user.get('user_role_info')]) + + return UserProfileModel( + data=UserInfoModel( + **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), + postIds=post_ids, + roleIds=role_ids, + dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), + role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + ), + postGroup=post_group, + roleGroup=role_group, ) @classmethod - def reset_user_services(cls, result_db: Session, page_object: ResetUserModel): + async def reset_user_services(cls, query_db: AsyncSession, page_object: ResetUserModel): """ 重置用户密码service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 重置用户对象 :return: 重置用户校验结果 """ - reset_user = page_object.dict(exclude_unset=True) + reset_user = page_object.model_dump(exclude_unset=True, exclude={'admin'}) if page_object.old_password: - user = UserDao.get_user_detail_by_id(result_db, user_id=page_object.user_id).user_basic_info + user = (await UserDao.get_user_detail_by_id(query_db, user_id=page_object.user_id)).get('user_basic_info') if not PwdUtil.verify_password(page_object.old_password, user.password): - result = dict(is_success=False, message='旧密码不正确') - return CrudUserResponse(**result) + raise ServiceException(message='修改密码失败,旧密码错误') + elif PwdUtil.verify_password(page_object.password, user.password): + raise ServiceException(message='新密码不能与旧密码相同') else: del reset_user['old_password'] if page_object.sms_code and page_object.session_id: del reset_user['sms_code'] del reset_user['session_id'] try: - UserDao.edit_user_dao(result_db, reset_user) - result_db.commit() - result = dict(is_success=True, message='重置成功') + reset_user['password'] = PwdUtil.get_password_hash(page_object.password) + await UserDao.edit_user_dao(query_db, reset_user) + await query_db.commit() + return CrudResponseModel(is_success=True, message='重置成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudUserResponse(**result) + await query_db.rollback() + raise e @classmethod - def batch_import_user_services(cls, result_db: Session, user_import: ImportUserModel, current_user: CurrentUserInfoServiceResponse): + async def batch_import_user_services( + cls, + request: Request, + query_db: AsyncSession, + file: UploadFile, + update_support: bool, + current_user: CurrentUserModel, + user_data_scope_sql: str, + dept_data_scope_sql: str, + ): """ 批量导入用户service - :param user_import: 用户导入参数对象 - :param result_db: orm对象 + + :param request: Request对象 + :param query_db: orm对象 + :param file: 用户导入文件对象 + :param update_support: 用户存在时是否更新 :param current_user: 当前用户对象 + :param user_data_scope_sql: 用户数据权限sql + :param dept_data_scope_sql: 部门数据权限sql :return: 批量导入用户结果 """ header_dict = { - "部门编号": "dept_id", - "登录名称": "user_name", - "用户名称": "nick_name", - "用户邮箱": "email", - "手机号码": "phonenumber", - "用户性别": "sex", - "帐号状态": "status" + '部门编号': 'dept_id', + '登录名称': 'user_name', + '用户名称': 'nick_name', + '用户邮箱': 'email', + '手机号码': 'phonenumber', + '用户性别': 'sex', + '帐号状态': 'status', } - filepath = get_filepath_from_url(user_import.url) - df = pd.read_excel(filepath) + contents = await file.read() + df = pd.read_excel(io.BytesIO(contents)) + await file.close() df.rename(columns=header_dict, inplace=True) add_error_result = [] count = 0 @@ -211,86 +393,103 @@ class UserService: if row['status'] == '停用': row['status'] = '1' add_user = UserModel( - **dict( - dept_id=row['dept_id'], - user_name=row['user_name'], - password=PwdUtil.get_password_hash('123456'), - nick_name=row['nick_name'], - email=row['email'], - phonenumber=row['phonenumber'], - sex=row['sex'], - status=row['status'], - create_by=current_user.user.user_name, - create_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - update_by=current_user.user.user_name, - update_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S") - ) + deptId=row['dept_id'], + userName=row['user_name'], + password=PwdUtil.get_password_hash( + await ConfigService.query_config_list_from_cache_services( + request.app.state.redis, 'sys.user.initPassword' + ) + ), + nickName=row['nick_name'], + email=row['email'], + phonenumber=str(row['phonenumber']), + sex=row['sex'], + status=row['status'], + createBy=current_user.user.user_name, + createTime=datetime.now(), + updateBy=current_user.user.user_name, + updateTime=datetime.now(), ) - user_info = UserDao.get_user_by_info(result_db, UserModel(**dict(user_name=row['user_name']))) + user_info = await UserDao.get_user_by_info(query_db, UserModel(userName=row['user_name'])) if user_info: - if user_import.is_update: - edit_user = UserModel( - **dict( - user_id=user_info.user_id, - dept_id=row['dept_id'], - user_name=row['user_name'], - nick_name=row['nick_name'], - email=row['email'], - phonenumber=row['phonenumber'], - sex=row['sex'], - status=row['status'], - update_by=current_user.user.user_name, - update_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S") + if update_support: + edit_user_model = UserModel( + userId=user_info.user_id, + deptId=row['dept_id'], + userName=row['user_name'], + nickName=row['nick_name'], + email=row['email'], + phonenumber=str(row['phonenumber']), + sex=row['sex'], + status=row['status'], + updateBy=current_user.user.user_name, + updateTime=datetime.now(), + ) + edit_user_model.validate_fields() + await cls.check_user_allowed_services(edit_user_model) + if not current_user.user.admin: + await cls.check_user_data_scope_services( + query_db, edit_user_model.user_id, user_data_scope_sql + ) + await DeptService.check_dept_data_scope_services( + query_db, edit_user_model.dept_id, dept_data_scope_sql ) - ).dict(exclude_unset=True) - UserDao.edit_user_dao(result_db, edit_user) + edit_user = edit_user_model.model_dump(exclude_unset=True) + await UserDao.edit_user_dao(query_db, edit_user) else: add_error_result.append(f"{count}.用户账号{row['user_name']}已存在") else: - UserDao.add_user_dao(result_db, add_user) - result_db.commit() - result = dict(is_success=True, message='\n'.join(add_error_result)) + add_user.validate_fields() + if not current_user.user.admin: + await DeptService.check_dept_data_scope_services( + query_db, add_user.dept_id, dept_data_scope_sql + ) + await UserDao.add_user_dao(query_db, add_user) + await query_db.commit() + return CrudResponseModel(is_success=True, message='\n'.join(add_error_result)) except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - - return CrudUserResponse(**result) + await query_db.rollback() + raise e @staticmethod - def get_user_import_template_services(): + async def get_user_import_template_services(): """ 获取用户导入模板service + :return: 用户导入模板excel的二进制数据 """ - header_list = ["部门编号", "登录名称", "用户名称", "用户邮箱", "手机号码", "用户性别", "帐号状态"] - selector_header_list = ["用户性别", "帐号状态"] - option_list = [{"用户性别": ["男", "女", "未知"]}, {"帐号状态": ["正常", "停用"]}] - binary_data = get_excel_template(header_list=header_list, selector_header_list=selector_header_list, option_list=option_list) + header_list = ['部门编号', '登录名称', '用户名称', '用户邮箱', '手机号码', '用户性别', '帐号状态'] + selector_header_list = ['用户性别', '帐号状态'] + option_list = [{'用户性别': ['男', '女', '未知']}, {'帐号状态': ['正常', '停用']}] + binary_data = get_excel_template( + header_list=header_list, selector_header_list=selector_header_list, option_list=option_list + ) return binary_data @staticmethod - def export_user_list_services(user_list: List): + async def export_user_list_services(user_list: List): """ 导出用户信息service + :param user_list: 用户信息列表 :return: 用户信息对应excel的二进制数据 """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "user_id": "用户编号", - "user_name": "用户名称", - "nick_name": "用户昵称", - "dept_name": "部门", - "email": "邮箱地址", - "phonenumber": "手机号码", - "sex": "性别", - "status": "状态", - "create_by": "创建者", - "create_time": "创建时间", - "update_by": "更新者", - "update_time": "更新时间", - "remark": "备注", + 'userId': '用户编号', + 'userName': '用户名称', + 'nickName': '用户昵称', + 'deptName': '部门', + 'email': '邮箱地址', + 'phonenumber': '手机号码', + 'sex': '性别', + 'status': '状态', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } data = user_list @@ -306,133 +505,138 @@ class UserService: item['sex'] = '女' else: item['sex'] = '未知' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data @classmethod - def get_user_role_allocated_list_services(cls, result_db: Session, page_object: UserRoleQueryModel): - """ - 根据用户id获取已分配角色列表或根据角色id获取已分配用户列表 - :param result_db: orm对象 - :param page_object: 用户关联角色对象 - :return: 已分配角色列表或已分配用户列表 + async def get_user_role_allocated_list_services(cls, query_db: AsyncSession, page_object: UserRoleQueryModel): """ - allocated_list = [] - if page_object.user_id: - allocated_list = UserDao.get_user_role_allocated_list_by_user_id(result_db, page_object) - if page_object.role_id: - allocated_list = UserDao.get_user_role_allocated_list_by_role_id(result_db, page_object) - - return allocated_list + 根据用户id获取已分配角色列表 - @classmethod - def get_user_role_unallocated_list_services(cls, result_db: Session, page_object: UserRoleQueryModel): - """ - 根据用户id获取未分配角色列表或根据角色id获取未分配用户列表 - :param result_db: orm对象 + :param query_db: orm对象 :param page_object: 用户关联角色对象 - :return: 未分配角色列表或未分配用户列表 + :return: 已分配角色列表 """ - unallocated_list = [] - if page_object.user_id: - unallocated_list = UserDao.get_user_role_unallocated_list_by_user_id(result_db, page_object) - if page_object.role_id: - unallocated_list = UserDao.get_user_role_unallocated_list_by_role_id(result_db, page_object) + query_user = await UserDao.get_user_detail_by_id(query_db, page_object.user_id) + post_ids = ','.join([str(row.post_id) for row in query_user.get('user_post_info')]) + role_ids = ','.join([str(row.role_id) for row in query_user.get('user_role_info')]) + user = UserInfoModel( + **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), + postIds=post_ids, + roleIds=role_ids, + dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), + role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + ) + query_role_list = [ + SelectedRoleModel(**row) for row in await RoleService.get_role_select_option_services(query_db) + ] + for model_a in query_role_list: + for model_b in user.role: + if model_a.role_id == model_b.role_id: + model_a.flag = True + result = UserRoleResponseModel(roles=query_role_list, user=user) - return unallocated_list + return result @classmethod - def add_user_role_services(cls, result_db: Session, page_object: CrudUserRoleModel): + async def add_user_role_services(cls, query_db: AsyncSession, page_object: CrudUserRoleModel): """ 新增用户关联角色信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 新增用户关联角色对象 :return: 新增用户关联角色校验结果 """ - if page_object.user_ids and page_object.role_ids: - user_id_list = page_object.user_ids.split(',') + if page_object.user_id and page_object.role_ids: role_id_list = page_object.role_ids.split(',') - if len(user_id_list) == 1 and len(role_id_list) >= 1: - try: - for role_id in role_id_list: - user_role_dict = dict(user_id=page_object.user_ids, role_id=role_id) - user_role = cls.detail_user_role_services(result_db, UserRoleModel(**user_role_dict)) - if user_role: - continue - else: - UserDao.add_user_role_dao(result_db, UserRoleModel(**user_role_dict)) - result_db.commit() - result = dict(is_success=True, message='新增成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - elif len(user_id_list) >= 1 and len(role_id_list) == 1: - try: - for user_id in user_id_list: - user_role_dict = dict(user_id=user_id, role_id=page_object.role_ids) - user_role = cls.detail_user_role_services(result_db, UserRoleModel(**user_role_dict)) - if user_role: - continue - else: - UserDao.add_user_role_dao(result_db, UserRoleModel(**user_role_dict)) - result_db.commit() - result = dict(is_success=True, message='新增成功') - except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - else: - result = dict(is_success=False, message='不满足新增条件') + try: + await UserDao.delete_user_role_by_user_and_role_dao(query_db, UserRoleModel(userId=page_object.user_id)) + for role_id in role_id_list: + await UserDao.add_user_role_dao(query_db, UserRoleModel(userId=page_object.user_id, roleId=role_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='分配成功') + except Exception as e: + await query_db.rollback() + raise e + elif page_object.user_id and not page_object.role_ids: + try: + await UserDao.delete_user_role_by_user_and_role_dao(query_db, UserRoleModel(userId=page_object.user_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='分配成功') + except Exception as e: + await query_db.rollback() + raise e + elif page_object.user_ids and page_object.role_id: + user_id_list = page_object.user_ids.split(',') + try: + for user_id in user_id_list: + user_role = await cls.detail_user_role_services( + query_db, UserRoleModel(userId=user_id, roleId=page_object.role_id) + ) + if user_role: + continue + else: + await UserDao.add_user_role_dao( + query_db, UserRoleModel(userId=user_id, roleId=page_object.role_id) + ) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='传入用户角色关联信息为空') - - return CrudUserResponse(**result) + raise ServiceException(message='不满足新增条件') @classmethod - def delete_user_role_services(cls, result_db: Session, page_object: CrudUserRoleModel): + async def delete_user_role_services(cls, query_db: AsyncSession, page_object: CrudUserRoleModel): """ 删除用户关联角色信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 删除用户关联角色对象 :return: 删除用户关联角色校验结果 """ - if page_object.user_ids and page_object.role_ids: - user_id_list = page_object.user_ids.split(',') - role_id_list = page_object.role_ids.split(',') - if len(user_id_list) == 1 and len(role_id_list) >= 1: + if (page_object.user_id and page_object.role_id) or (page_object.user_ids and page_object.role_id): + if page_object.user_id and page_object.role_id: try: - for role_id in role_id_list: - UserDao.delete_user_role_by_user_and_role_dao(result_db, UserRoleModel(**dict(user_id=page_object.user_ids, role_id=role_id))) - result_db.commit() - result = dict(is_success=True, message='删除成功') + await UserDao.delete_user_role_by_user_and_role_dao( + query_db, UserRoleModel(userId=page_object.user_id, roleId=page_object.role_id) + ) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) - elif len(user_id_list) >= 1 and len(role_id_list) == 1: + await query_db.rollback() + raise e + elif page_object.user_ids and page_object.role_id: + user_id_list = page_object.user_ids.split(',') try: for user_id in user_id_list: - UserDao.delete_user_role_by_user_and_role_dao(result_db, UserRoleModel(**dict(user_id=user_id, role_id=page_object.role_ids))) - result_db.commit() - result = dict(is_success=True, message='删除成功') + await UserDao.delete_user_role_by_user_and_role_dao( + query_db, UserRoleModel(userId=user_id, roleId=page_object.role_id) + ) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: - result_db.rollback() - result = dict(is_success=False, message=str(e)) + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='不满足删除条件') + raise ServiceException(message='不满足删除条件') else: - result = dict(is_success=False, message='传入用户角色关联信息为空') - - return CrudUserResponse(**result) + raise ServiceException(message='传入用户角色关联信息为空') @classmethod - def detail_user_role_services(cls, result_db: Session, page_object: UserRoleModel): + async def detail_user_role_services(cls, query_db: AsyncSession, page_object: UserRoleModel): """ 获取用户关联角色详细信息service - :param result_db: orm对象 + + :param query_db: orm对象 :param page_object: 用户关联角色对象 :return: 用户关联角色详细信息 """ - user_role = UserDao.get_user_role_detail(result_db, page_object) + user_role = await UserDao.get_user_role_detail(query_db, page_object) return user_role diff --git a/dash-fastapi-backend/module_task/__init__.py b/dash-fastapi-backend/module_task/__init__.py index 36fefe9..1f4b412 100644 --- a/dash-fastapi-backend/module_task/__init__.py +++ b/dash-fastapi-backend/module_task/__init__.py @@ -1 +1 @@ -from . import scheduler_test +from . import scheduler_test # noqa: F401 diff --git a/dash-fastapi-backend/module_task/scheduler_test.py b/dash-fastapi-backend/module_task/scheduler_test.py index b22dc6f..1c8441f 100644 --- a/dash-fastapi-backend/module_task/scheduler_test.py +++ b/dash-fastapi-backend/module_task/scheduler_test.py @@ -4,4 +4,4 @@ from datetime import datetime def job(*args, **kwargs): print(args) print(kwargs) - print(f"{datetime.now()}执行了") + print(f'{datetime.now()}执行了') diff --git a/dash-fastapi-backend/ruff.toml b/dash-fastapi-backend/ruff.toml new file mode 100644 index 0000000..ea95368 --- /dev/null +++ b/dash-fastapi-backend/ruff.toml @@ -0,0 +1,4 @@ +line-length = 120 + +[format] +quote-style = "single" \ No newline at end of file diff --git a/dash-fastapi-backend/server.py b/dash-fastapi-backend/server.py new file mode 100644 index 0000000..00b4661 --- /dev/null +++ b/dash-fastapi-backend/server.py @@ -0,0 +1,83 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from config.env import AppConfig +from config.get_db import init_create_table +from config.get_redis import RedisUtil +from config.get_scheduler import SchedulerUtil +from exceptions.handle import handle_exception +from middlewares.handle import handle_middleware +from module_admin.controller.cache_controller import cacheController +from module_admin.controller.captcha_controller import captchaController +from module_admin.controller.common_controller import commonController +from module_admin.controller.config_controller import configController +from module_admin.controller.dept_controller import deptController +from module_admin.controller.dict_controller import dictController +from module_admin.controller.log_controller import logController +from module_admin.controller.login_controller import loginController +from module_admin.controller.job_controller import jobController +from module_admin.controller.menu_controller import menuController +from module_admin.controller.notice_controller import noticeController +from module_admin.controller.online_controller import onlineController +from module_admin.controller.post_controler import postController +from module_admin.controller.role_controller import roleController +from module_admin.controller.server_controller import serverController +from module_admin.controller.user_controller import userController +from sub_applications.handle import handle_sub_applications +from utils.common_util import worship +from utils.log_util import logger + + +# 生命周期事件 +@asynccontextmanager +async def lifespan(app: FastAPI): + logger.info(f'{AppConfig.app_name}开始启动') + worship() + await init_create_table() + app.state.redis = await RedisUtil.create_redis_pool() + await RedisUtil.init_sys_dict(app.state.redis) + await RedisUtil.init_sys_config(app.state.redis) + await SchedulerUtil.init_system_scheduler() + logger.info(f'{AppConfig.app_name}启动成功') + yield + await RedisUtil.close_redis_pool(app) + await SchedulerUtil.close_system_scheduler() + + +# 初始化FastAPI对象 +app = FastAPI( + title=AppConfig.app_name, + description=f'{AppConfig.app_name}接口文档', + version=AppConfig.app_version, + lifespan=lifespan, +) + +# 挂载子应用 +handle_sub_applications(app) +# 加载中间件处理方法 +handle_middleware(app) +# 加载全局异常处理方法 +handle_exception(app) + + +# 加载路由列表 +controller_list = [ + {'router': loginController, 'tags': ['登录模块']}, + {'router': captchaController, 'tags': ['验证码模块']}, + {'router': userController, 'tags': ['系统管理-用户管理']}, + {'router': roleController, 'tags': ['系统管理-角色管理']}, + {'router': menuController, 'tags': ['系统管理-菜单管理']}, + {'router': deptController, 'tags': ['系统管理-部门管理']}, + {'router': postController, 'tags': ['系统管理-岗位管理']}, + {'router': dictController, 'tags': ['系统管理-字典管理']}, + {'router': configController, 'tags': ['系统管理-参数管理']}, + {'router': noticeController, 'tags': ['系统管理-通知公告管理']}, + {'router': logController, 'tags': ['系统管理-日志管理']}, + {'router': onlineController, 'tags': ['系统监控-在线用户']}, + {'router': jobController, 'tags': ['系统监控-定时任务']}, + {'router': serverController, 'tags': ['系统监控-菜单管理']}, + {'router': cacheController, 'tags': ['系统监控-缓存监控']}, + {'router': commonController, 'tags': ['通用模块']}, +] + +for controller in controller_list: + app.include_router(router=controller.get('router'), tags=controller.get('tags')) diff --git a/dash-fastapi-backend/sql/dash-fastapi.sql b/dash-fastapi-backend/sql/dash-fastapi.sql index 8514d9d..6fb0ee0 100644 --- a/dash-fastapi-backend/sql/dash-fastapi.sql +++ b/dash-fastapi-backend/sql/dash-fastapi.sql @@ -1,721 +1,712 @@ -/* - Navicat Premium Data Transfer - - Source Server : 本机mysql - Source Server Type : MySQL - Source Server Version : 80013 - Source Host : localhost:3306 - Source Schema : dash-fastapi - - Target Server Type : MySQL - Target Server Version : 80013 - File Encoding : 65001 - - Date: 09/03/2023 14:30:35 -*/ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for gen_table --- ---------------------------- -DROP TABLE IF EXISTS `gen_table`; -CREATE TABLE `gen_table` ( - `table_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', - `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表名称', - `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表描述', - `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联子表的表名', - `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子表关联的外键名', - `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '实体类名称', - `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', - `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成包路径', - `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成模块名', - `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成业务名', - `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能名', - `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能作者', - `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', - `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', - `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '其它生成选项', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`table_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of gen_table --- ---------------------------- - --- ---------------------------- --- Table structure for gen_table_column --- ---------------------------- -DROP TABLE IF EXISTS `gen_table_column`; -CREATE TABLE `gen_table_column` ( - `column_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', - `table_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '归属表编号', - `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列名称', - `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列描述', - `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列类型', - `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA类型', - `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA字段名', - `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否主键(1是)', - `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否自增(1是)', - `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否必填(1是)', - `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)', - `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)', - `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)', - `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)', - `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', - `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', - `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', - `sort` int(11) NULL DEFAULT NULL COMMENT '排序', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`column_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 26 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of gen_table_column --- ---------------------------- - --- ---------------------------- --- Table structure for sys_config --- ---------------------------- -DROP TABLE IF EXISTS `sys_config`; -CREATE TABLE `sys_config` ( - `config_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '参数主键', - `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数名称', - `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键名', - `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键值', - `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`config_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 101 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_config --- ---------------------------- -INSERT INTO `sys_config` VALUES (1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', '#1890ff', 'Y', 'admin', '2023-05-23 16:13:34', 'admin', '2023-05-23 16:13:34', '蓝色 #1890ff'); -INSERT INTO `sys_config` VALUES (2, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', '2023-05-23 16:13:34', 'admin', '2023-05-23 16:13:34', '是否开启验证码功能(true开启,false关闭)'); -INSERT INTO `sys_config` VALUES (3, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', '2023-05-23 16:13:34', '', NULL, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); -INSERT INTO `sys_config` VALUES (4, '账号自助-是否开启忘记密码功能', 'sys.account.forgetUser', 'true', 'Y', 'admin', '2023-05-23 16:13:34', 'admin', '2023-05-23 16:13:34', '是否开启忘记密码功能(true开启,false关闭)'); - --- ---------------------------- --- Table structure for sys_dept --- ---------------------------- -DROP TABLE IF EXISTS `sys_dept`; -CREATE TABLE `sys_dept` ( - `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id', - `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父部门id', - `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '祖级列表', - `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称', - `order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序', - `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '负责人', - `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话', - `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`dept_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 201 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_dept --- ---------------------------- -INSERT INTO `sys_dept` VALUES (100, 0, '0', '集团总公司', 1, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '上海分公司', 1, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (102, 100, '0,100', '广东分公司', 2, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (103, 101, '0,100,101', '研发部门', 1, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (104, 101, '0,100,101', '市场部门', 2, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (105, 101, '0,100,101', '测试部门', 3, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (106, 101, '0,100,101', '财务部门', 4, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (107, 101, '0,100,101', '运维部门', 5, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (108, 102, '0,100,102', '市场部门', 1, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); -INSERT INTO `sys_dept` VALUES (109, 102, '0,100,102', '财务部门', 2, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-08 15:57:58'); - --- ---------------------------- --- Table structure for sys_dict_data --- ---------------------------- -DROP TABLE IF EXISTS `sys_dict_data`; -CREATE TABLE `sys_dict_data` ( - `dict_code` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典编码', - `dict_sort` int(11) NULL DEFAULT 0 COMMENT '字典排序', - `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典标签', - `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典键值', - `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', - `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)', - `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表格回显样式', - `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`dict_code`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 101 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_dict_data --- ---------------------------- -INSERT INTO `sys_dict_data` VALUES (1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '性别男'); -INSERT INTO `sys_dict_data` VALUES (2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '性别女'); -INSERT INTO `sys_dict_data` VALUES (3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '性别未知'); -INSERT INTO `sys_dict_data` VALUES (4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '显示菜单'); -INSERT INTO `sys_dict_data` VALUES (5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '隐藏菜单'); -INSERT INTO `sys_dict_data` VALUES (6, 1, '正常', '0', 'sys_normal_disable', '{\"color\": \"blue\"}', 'primary', 'Y', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '正常状态'); -INSERT INTO `sys_dict_data` VALUES (7, 2, '停用', '1', 'sys_normal_disable', '{\"color\": \"volcano\"}', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', 'admin', '2023-08-18 11:24:23', '停用状态'); -INSERT INTO `sys_dict_data` VALUES (8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '正常状态'); -INSERT INTO `sys_dict_data` VALUES (9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '停用状态'); -INSERT INTO `sys_dict_data` VALUES (10, 1, '默认', 'default', 'sys_job_group', '{\"color\": \"blue\"}', '', 'Y', '0', 'admin', '2023-02-11 22:23:38', 'admin', '2023-08-20 16:33:32', '默认分组'); -INSERT INTO `sys_dict_data` VALUES (11, 2, '数据库', 'sqlalchemy', 'sys_job_group', '{\"color\": \"green\"}', '', 'N', '0', 'admin', '2023-02-11 22:23:38', 'admin', '2023-08-27 22:54:40', '数据库分组'); -INSERT INTO `sys_dict_data` VALUES (12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '系统默认是'); -INSERT INTO `sys_dict_data` VALUES (13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '系统默认否'); -INSERT INTO `sys_dict_data` VALUES (14, 1, '通知', '1', 'sys_notice_type', '{\"color\": \"gold\"}', 'warning', 'Y', '0', 'admin', '2023-02-11 22:23:38', 'admin', '2023-08-20 16:12:53', '通知'); -INSERT INTO `sys_dict_data` VALUES (15, 2, '公告', '2', 'sys_notice_type', '{\"color\": \"green\"}', 'success', 'N', '0', 'admin', '2023-02-11 22:23:38', 'admin', '2023-08-20 16:13:03', '公告'); -INSERT INTO `sys_dict_data` VALUES (16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '正常状态'); -INSERT INTO `sys_dict_data` VALUES (17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '关闭状态'); -INSERT INTO `sys_dict_data` VALUES (18, 99, '其他', '0', 'sys_oper_type', '{\"color\": \"purple\"}', 'info', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '其他操作'); -INSERT INTO `sys_dict_data` VALUES (19, 1, '新增', '1', 'sys_oper_type', '{\"color\": \"green\"}', 'info', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '新增操作'); -INSERT INTO `sys_dict_data` VALUES (20, 2, '修改', '2', 'sys_oper_type', '{\"color\": \"orange\"}', 'info', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '修改操作'); -INSERT INTO `sys_dict_data` VALUES (21, 3, '删除', '3', 'sys_oper_type', '{\"color\": \"red\"}', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '删除操作'); -INSERT INTO `sys_dict_data` VALUES (22, 4, '授权', '4', 'sys_oper_type', '{\"color\": \"lime\"}', 'primary', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '授权操作'); -INSERT INTO `sys_dict_data` VALUES (23, 5, '导出', '5', 'sys_oper_type', '{\"color\": \"geekblue\"}', 'warning', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '导出操作'); -INSERT INTO `sys_dict_data` VALUES (24, 6, '导入', '6', 'sys_oper_type', '{\"color\": \"blue\"}', 'warning', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '导入操作'); -INSERT INTO `sys_dict_data` VALUES (25, 7, '强退', '7', 'sys_oper_type', '{\"color\": \"magenta\"}', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '强退操作'); -INSERT INTO `sys_dict_data` VALUES (26, 8, '生成代码', '8', 'sys_oper_type', '{\"color\": \"cyan\"}', 'warning', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '生成操作'); -INSERT INTO `sys_dict_data` VALUES (27, 9, '清空数据', '9', 'sys_oper_type', '{\"color\": \"volcano\"}', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '清空操作'); -INSERT INTO `sys_dict_data` VALUES (28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '正常状态'); -INSERT INTO `sys_dict_data` VALUES (29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '停用状态'); -INSERT INTO `sys_dict_data` VALUES (100, 3, 'Redis', 'redis', 'sys_job_group', '{\"color\": \"gold\"}', 'default', 'N', '0', 'admin', '2023-08-27 22:52:05', 'admin', '2023-08-27 22:52:05', 'redis分组'); - --- ---------------------------- --- Table structure for sys_dict_type --- ---------------------------- -DROP TABLE IF EXISTS `sys_dict_type`; -CREATE TABLE `sys_dict_type` ( - `dict_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键', - `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典名称', - `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`dict_id`) USING BTREE, - UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_dict_type --- ---------------------------- -INSERT INTO `sys_dict_type` VALUES (1, '用户性别', 'sys_user_sex', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '用户性别列表'); -INSERT INTO `sys_dict_type` VALUES (2, '菜单状态', 'sys_show_hide', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '菜单状态列表'); -INSERT INTO `sys_dict_type` VALUES (3, '系统开关', 'sys_normal_disable', '0', 'admin', '2023-02-11 22:23:38', 'admin', '2023-08-18 11:23:39', '系统开关列表'); -INSERT INTO `sys_dict_type` VALUES (4, '任务状态', 'sys_job_status', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '任务状态列表'); -INSERT INTO `sys_dict_type` VALUES (5, '任务分组', 'sys_job_group', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '任务分组列表'); -INSERT INTO `sys_dict_type` VALUES (6, '系统是否', 'sys_yes_no', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '系统是否列表'); -INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '通知类型列表'); -INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '通知状态列表'); -INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '操作类型列表'); -INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2023-02-11 22:23:38', '', NULL, '登录状态列表'); - --- ---------------------------- --- Table structure for sys_job --- ---------------------------- -DROP TABLE IF EXISTS `sys_job`; -CREATE TABLE `sys_job` ( - `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID', - `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务名称', - `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'default' COMMENT '任务组名', - `job_executor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'default' COMMENT '任务执行器', - `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串', - `job_args` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '位置参数', - `job_kwargs` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关键字参数', - `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'cron执行表达式', - `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', - `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注信息', - PRIMARY KEY (`job_id`, `job_name`, `job_group`, `job_executor`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_job --- ---------------------------- -INSERT INTO `sys_job` VALUES (1, '系统默认(无参)', 'default', 'default', 'module_task.scheduler_test.job', 'test', NULL, '0/10 * * * * ?', '2', '0', '1', 'admin', '2023-05-23 16:13:34', 'admin', '2023-05-23 16:13:34', ''); -INSERT INTO `sys_job` VALUES (2, '系统默认(有参)', 'sqlalchemy', 'default', 'module_task.scheduler_test.job', 'new', '{\"test\": 111}', '0/15 * * * * ?', '1', '1', '1', 'admin', '2023-05-23 16:13:34', 'admin', '2023-05-23 16:13:34', ''); -INSERT INTO `sys_job` VALUES (3, '系统默认(多参)', 'redis', 'default', 'module_task.scheduler_test.job', NULL, NULL, '0/20 * * * * ?', '3', '1', '1', 'admin', '2023-05-23 16:13:34', '', NULL, ''); - --- ---------------------------- --- Table structure for sys_job_log --- ---------------------------- -DROP TABLE IF EXISTS `sys_job_log`; -CREATE TABLE `sys_job_log` ( - `job_log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', - `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', - `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名', - `job_executor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务执行器', - `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串', - `job_args` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '位置参数', - `job_kwargs` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关键字参数', - `job_trigger` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务触发器', - `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日志信息', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', - `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '异常信息', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`job_log_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_job_log --- ---------------------------- - --- ---------------------------- --- Table structure for sys_logininfor --- ---------------------------- -DROP TABLE IF EXISTS `sys_logininfor`; -CREATE TABLE `sys_logininfor` ( - `info_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '访问ID', - `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户账号', - `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录IP地址', - `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录地点', - `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '浏览器类型', - `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作系统', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)', - `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '提示消息', - `login_time` datetime(0) NULL DEFAULT NULL COMMENT '访问时间', - PRIMARY KEY (`info_id`) USING BTREE, - INDEX `idx_sys_logininfor_s`(`status`) USING BTREE, - INDEX `idx_sys_logininfor_lt`(`login_time`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_logininfor --- ---------------------------- - --- ---------------------------- --- Table structure for sys_menu --- ---------------------------- -DROP TABLE IF EXISTS `sys_menu`; -CREATE TABLE `sys_menu` ( - `menu_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', - `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', - `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父菜单ID', - `order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序', - `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '路由地址', - `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径', - `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由参数', - `is_frame` int(11) NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)', - `is_cache` int(11) NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)', - `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', - `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', - `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识', - `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '菜单图标', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - PRIMARY KEY (`menu_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 2000 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_menu --- ---------------------------- -INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 1, '/system', NULL, '', 1, 0, 'M', '0', '0', '', 'antd-setting', 'admin', '2023-05-23 16:13:33', '', NULL, '系统管理目录'); -INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 2, '/monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'antd-fund-projection-screen', 'admin', '2023-05-23 16:13:33', '', NULL, '系统监控目录'); -INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 3, '/tool', NULL, '', 1, 0, 'M', '0', '0', '', 'antd-repair', 'admin', '2023-05-23 16:13:33', '', NULL, '系统工具目录'); -INSERT INTO `sys_menu` VALUES (4, '若依官网', 0, 4, 'http://ruoyi.vip', NULL, NULL, 0, 0, 'M', '0', '0', '', 'antd-send', 'admin', '2023-05-23 16:13:33', '', NULL, '若依官网地址'); -INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 1, '/system/user', 'system.user', '', 1, 0, 'C', '0', '0', 'system:user:list', 'antd-user', 'admin', '2023-05-23 16:13:33', '', NULL, '用户管理菜单'); -INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, '/system/role', 'system.role', '', 1, 0, 'C', '0', '0', 'system:role:list', 'antd-team', 'admin', '2023-05-23 16:13:33', '', NULL, '角色管理菜单'); -INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, '/system/menu', 'system.menu', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'antd-app-store-add', 'admin', '2023-05-23 16:13:33', '', NULL, '菜单管理菜单'); -INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, '/system/dept', 'system.dept', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'antd-cluster', 'admin', '2023-05-23 16:13:33', '', NULL, '部门管理菜单'); -INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, '/system/post', 'system.post', '', 1, 0, 'C', '0', '0', 'system:post:list', 'antd-idcard', 'admin', '2023-05-23 16:13:33', 'ry', '2023-07-06 09:47:26', '岗位管理菜单'); -INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, '/system/dict', 'system.dict', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'antd-read', 'admin', '2023-05-23 16:13:33', 'ry', '2023-07-06 16:25:44', '字典管理菜单'); -INSERT INTO `sys_menu` VALUES (106, '参数设置', 1, 7, '/system/config', 'system.config', '', 1, 0, 'C', '0', '0', 'system:config:list', 'antd-calculator', 'admin', '2023-05-23 16:13:33', '', NULL, '参数设置菜单'); -INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 8, '/system/notice', 'system.notice', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'antd-notification', 'admin', '2023-05-23 16:13:33', '', NULL, '通知公告菜单'); -INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, '/log', '', '', 1, 0, 'M', '0', '0', '', 'antd-bug', 'admin', '2023-05-23 16:13:33', '', NULL, '日志管理菜单'); -INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 1, '/monitor/online', 'monitor.online', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'antd-desktop', 'admin', '2023-05-23 16:13:33', '', NULL, '在线用户菜单'); -INSERT INTO `sys_menu` VALUES (110, '定时任务', 2, 2, '/monitor/job', 'monitor.job', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'antd-deployment-unit', 'admin', '2023-05-23 16:13:33', '', NULL, '定时任务菜单'); -INSERT INTO `sys_menu` VALUES (111, '数据监控', 2, 3, '/monitor/druid', 'monitor.druid', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'antd-database', 'admin', '2023-05-23 16:13:33', '', NULL, '数据监控菜单'); -INSERT INTO `sys_menu` VALUES (112, '服务监控', 2, 4, '/monitor/server', 'monitor.server', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'antd-cloud-server', 'admin', '2023-05-23 16:13:33', '', NULL, '服务监控菜单'); -INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, '/monitor/cache/control', 'monitor.cache.control', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'antd-cloud-sync', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-11 10:52:56', '缓存监控菜单'); -INSERT INTO `sys_menu` VALUES (114, '缓存列表', 2, 6, '/monitor/cache/list', 'monitor.cache.list', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'antd-table', 'admin', '2023-05-23 16:13:33', 'admin', '2023-08-11 10:53:11', '缓存列表菜单'); -INSERT INTO `sys_menu` VALUES (115, '表单构建', 3, 1, '/tool/build', 'tool.build', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'antd-build', 'admin', '2023-05-23 16:13:33', '', NULL, '表单构建菜单'); -INSERT INTO `sys_menu` VALUES (116, '代码生成', 3, 2, '/tool/gen', 'tool.gen', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'antd-console-sql', 'admin', '2023-05-23 16:13:33', '', NULL, '代码生成菜单'); -INSERT INTO `sys_menu` VALUES (117, '系统接口', 3, 3, '/tool/swagger', 'tool.swagger', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'antd-api', 'admin', '2023-05-23 16:13:33', '', NULL, '系统接口菜单'); -INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, '/monitor/operlog', 'monitor.operlog', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'antd-clear', 'admin', '2023-05-23 16:13:33', '', NULL, '操作日志菜单'); -INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, '/monitor/logininfor', 'monitor.logininfor', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'antd-control', 'admin', '2023-05-23 16:13:33', '', NULL, '登录日志菜单'); -INSERT INTO `sys_menu` VALUES (1000, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1001, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1002, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1003, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1004, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1005, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1006, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1007, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1008, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1009, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1010, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1011, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1012, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1013, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1014, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1015, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1016, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1017, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1018, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1019, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1020, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1021, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1022, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1023, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1024, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1025, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1026, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1027, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1028, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1029, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1030, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1031, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1032, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1033, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1034, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1035, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1036, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1037, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1038, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1039, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1040, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1041, '日志导出', 500, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1042, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1043, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1044, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1045, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1049, '任务查询', 110, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1050, '任务新增', 110, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1051, '任务修改', 110, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1052, '任务删除', 110, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1053, '状态修改', 110, 5, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1054, '任务导出', 110, 6, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1055, '生成查询', 116, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1056, '生成修改', 116, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1057, '生成删除', 116, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1058, '导入代码', 116, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1059, '预览代码', 116, 5, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_menu` VALUES (1060, '生成代码', 116, 6, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2023-05-23 16:13:33', '', NULL, ''); - --- ---------------------------- --- Table structure for sys_notice --- ---------------------------- -DROP TABLE IF EXISTS `sys_notice`; -CREATE TABLE `sys_notice` ( - `notice_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '公告ID', - `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题', - `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)', - `notice_content` longblob NULL COMMENT '公告内容', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`notice_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '通知公告表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_notice --- ---------------------------- -INSERT INTO `sys_notice` VALUES (1, '温馨提醒:2018-07-01 若依新版本发布啦', '2', 0xE696B0E78988E69CACE58685E5AEB9, '0', 'admin', '2023-05-23 16:13:34', '', NULL, '管理员'); -INSERT INTO `sys_notice` VALUES (2, '维护通知:2018-07-01 若依系统凌晨维护', '1', 0xE7BBB4E68AA4E58685E5AEB9, '0', 'admin', '2023-05-23 16:13:34', '', NULL, '管理员'); - --- ---------------------------- --- Table structure for sys_oper_log --- ---------------------------- -DROP TABLE IF EXISTS `sys_oper_log`; -CREATE TABLE `sys_oper_log` ( - `oper_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键', - `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '模块标题', - `business_type` int(11) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)', - `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '方法名称', - `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求方式', - `operator_type` int(11) NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)', - `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作人员', - `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称', - `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求URL', - `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址', - `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作地点', - `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求参数', - `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '返回参数', - `status` int(11) NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)', - `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '错误消息', - `oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', - `cost_time` bigint(20) NULL DEFAULT 0 COMMENT '消耗时间', - PRIMARY KEY (`oper_id`) USING BTREE, - INDEX `idx_sys_oper_log_bt`(`business_type`) USING BTREE, - INDEX `idx_sys_oper_log_s`(`status`) USING BTREE, - INDEX `idx_sys_oper_log_ot`(`oper_time`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_oper_log --- ---------------------------- - --- ---------------------------- --- Table structure for sys_post --- ---------------------------- -DROP TABLE IF EXISTS `sys_post`; -CREATE TABLE `sys_post` ( - `post_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '岗位ID', - `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码', - `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', - `post_sort` int(11) NOT NULL COMMENT '显示顺序', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`post_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位信息表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_post --- ---------------------------- -INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, '0', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, '0', 'admin', '2023-05-23 16:13:33', '', NULL, ''); -INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, '0', 'admin', '2023-05-23 16:13:33', 'ry', '2023-06-05 15:49:31', ''); -INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, '0', 'admin', '2023-05-23 16:13:33', '', NULL, ''); - --- ---------------------------- --- Table structure for sys_role --- ---------------------------- -DROP TABLE IF EXISTS `sys_role`; -CREATE TABLE `sys_role` ( - `role_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID', - `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称', - `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色权限字符串', - `role_sort` int(11) NOT NULL COMMENT '显示顺序', - `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', - `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示', - `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`role_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_role --- ---------------------------- -INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', 1, 1, '0', '0', 'admin', '2023-05-23 16:13:33', '', NULL, '超级管理员'); -INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, '2', 1, 1, '0', '0', 'admin', '2023-05-23 16:13:33', 'admin', '2023-09-01 15:53:26', '普通角色'); - --- ---------------------------- --- Table structure for sys_role_dept --- ---------------------------- -DROP TABLE IF EXISTS `sys_role_dept`; -CREATE TABLE `sys_role_dept` ( - `role_id` bigint(20) NOT NULL COMMENT '角色ID', - `dept_id` bigint(20) NOT NULL COMMENT '部门ID', - PRIMARY KEY (`role_id`, `dept_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和部门关联表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_role_dept --- ---------------------------- -INSERT INTO `sys_role_dept` VALUES (2, 100); -INSERT INTO `sys_role_dept` VALUES (2, 101); -INSERT INTO `sys_role_dept` VALUES (2, 105); - --- ---------------------------- --- Table structure for sys_role_menu --- ---------------------------- -DROP TABLE IF EXISTS `sys_role_menu`; -CREATE TABLE `sys_role_menu` ( - `role_id` bigint(20) NOT NULL COMMENT '角色ID', - `menu_id` bigint(20) NOT NULL COMMENT '菜单ID', - PRIMARY KEY (`role_id`, `menu_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_role_menu --- ---------------------------- -INSERT INTO `sys_role_menu` VALUES (2, 1); -INSERT INTO `sys_role_menu` VALUES (2, 2); -INSERT INTO `sys_role_menu` VALUES (2, 3); -INSERT INTO `sys_role_menu` VALUES (2, 4); -INSERT INTO `sys_role_menu` VALUES (2, 100); -INSERT INTO `sys_role_menu` VALUES (2, 101); -INSERT INTO `sys_role_menu` VALUES (2, 102); -INSERT INTO `sys_role_menu` VALUES (2, 103); -INSERT INTO `sys_role_menu` VALUES (2, 104); -INSERT INTO `sys_role_menu` VALUES (2, 105); -INSERT INTO `sys_role_menu` VALUES (2, 106); -INSERT INTO `sys_role_menu` VALUES (2, 107); -INSERT INTO `sys_role_menu` VALUES (2, 108); -INSERT INTO `sys_role_menu` VALUES (2, 109); -INSERT INTO `sys_role_menu` VALUES (2, 110); -INSERT INTO `sys_role_menu` VALUES (2, 111); -INSERT INTO `sys_role_menu` VALUES (2, 112); -INSERT INTO `sys_role_menu` VALUES (2, 113); -INSERT INTO `sys_role_menu` VALUES (2, 114); -INSERT INTO `sys_role_menu` VALUES (2, 115); -INSERT INTO `sys_role_menu` VALUES (2, 116); -INSERT INTO `sys_role_menu` VALUES (2, 117); -INSERT INTO `sys_role_menu` VALUES (2, 500); -INSERT INTO `sys_role_menu` VALUES (2, 501); -INSERT INTO `sys_role_menu` VALUES (2, 1000); -INSERT INTO `sys_role_menu` VALUES (2, 1001); -INSERT INTO `sys_role_menu` VALUES (2, 1002); -INSERT INTO `sys_role_menu` VALUES (2, 1003); -INSERT INTO `sys_role_menu` VALUES (2, 1004); -INSERT INTO `sys_role_menu` VALUES (2, 1005); -INSERT INTO `sys_role_menu` VALUES (2, 1006); -INSERT INTO `sys_role_menu` VALUES (2, 1007); -INSERT INTO `sys_role_menu` VALUES (2, 1008); -INSERT INTO `sys_role_menu` VALUES (2, 1009); -INSERT INTO `sys_role_menu` VALUES (2, 1010); -INSERT INTO `sys_role_menu` VALUES (2, 1011); -INSERT INTO `sys_role_menu` VALUES (2, 1012); -INSERT INTO `sys_role_menu` VALUES (2, 1013); -INSERT INTO `sys_role_menu` VALUES (2, 1014); -INSERT INTO `sys_role_menu` VALUES (2, 1015); -INSERT INTO `sys_role_menu` VALUES (2, 1016); -INSERT INTO `sys_role_menu` VALUES (2, 1017); -INSERT INTO `sys_role_menu` VALUES (2, 1018); -INSERT INTO `sys_role_menu` VALUES (2, 1019); -INSERT INTO `sys_role_menu` VALUES (2, 1020); -INSERT INTO `sys_role_menu` VALUES (2, 1021); -INSERT INTO `sys_role_menu` VALUES (2, 1022); -INSERT INTO `sys_role_menu` VALUES (2, 1023); -INSERT INTO `sys_role_menu` VALUES (2, 1024); -INSERT INTO `sys_role_menu` VALUES (2, 1025); -INSERT INTO `sys_role_menu` VALUES (2, 1026); -INSERT INTO `sys_role_menu` VALUES (2, 1027); -INSERT INTO `sys_role_menu` VALUES (2, 1028); -INSERT INTO `sys_role_menu` VALUES (2, 1029); -INSERT INTO `sys_role_menu` VALUES (2, 1030); -INSERT INTO `sys_role_menu` VALUES (2, 1031); -INSERT INTO `sys_role_menu` VALUES (2, 1032); -INSERT INTO `sys_role_menu` VALUES (2, 1033); -INSERT INTO `sys_role_menu` VALUES (2, 1034); -INSERT INTO `sys_role_menu` VALUES (2, 1035); -INSERT INTO `sys_role_menu` VALUES (2, 1036); -INSERT INTO `sys_role_menu` VALUES (2, 1037); -INSERT INTO `sys_role_menu` VALUES (2, 1038); -INSERT INTO `sys_role_menu` VALUES (2, 1039); -INSERT INTO `sys_role_menu` VALUES (2, 1040); -INSERT INTO `sys_role_menu` VALUES (2, 1041); -INSERT INTO `sys_role_menu` VALUES (2, 1042); -INSERT INTO `sys_role_menu` VALUES (2, 1043); -INSERT INTO `sys_role_menu` VALUES (2, 1044); -INSERT INTO `sys_role_menu` VALUES (2, 1045); -INSERT INTO `sys_role_menu` VALUES (2, 1046); -INSERT INTO `sys_role_menu` VALUES (2, 1047); -INSERT INTO `sys_role_menu` VALUES (2, 1048); -INSERT INTO `sys_role_menu` VALUES (2, 1049); -INSERT INTO `sys_role_menu` VALUES (2, 1050); -INSERT INTO `sys_role_menu` VALUES (2, 1051); -INSERT INTO `sys_role_menu` VALUES (2, 1052); -INSERT INTO `sys_role_menu` VALUES (2, 1053); -INSERT INTO `sys_role_menu` VALUES (2, 1054); -INSERT INTO `sys_role_menu` VALUES (2, 1055); -INSERT INTO `sys_role_menu` VALUES (2, 1056); -INSERT INTO `sys_role_menu` VALUES (2, 1057); -INSERT INTO `sys_role_menu` VALUES (2, 1058); -INSERT INTO `sys_role_menu` VALUES (2, 1059); -INSERT INTO `sys_role_menu` VALUES (2, 1060); - --- ---------------------------- --- Table structure for sys_user --- ---------------------------- -DROP TABLE IF EXISTS `sys_user`; -CREATE TABLE `sys_user` ( - `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID', - `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID', - `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号', - `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称', - `user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '00' COMMENT '用户类型(00系统用户)', - `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户邮箱', - `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码', - `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', - `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址', - `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', - `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '最后登录IP', - `login_date` datetime(0) NULL DEFAULT NULL COMMENT '最后登录时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`user_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_user --- ---------------------------- -INSERT INTO `sys_user` VALUES (1, 103, 'admin', '超级管理员', '00', 'niangao@163.com', '18888888888', '1', '/common/caches?taskPath=avatar&taskId=admin&filename=admin_avatar.jpeg', '$2b$12$dW/S5ummJs3Z5fMXqsesWuJgTimgtpK85L0zFhUAuFmHDznII/F66', '0', '0', '127.0.0.1', '2023-05-23 16:13:33', 'admin', '2023-05-23 16:13:33', 'admin', '2023-05-23 16:13:33', '管理员'); -INSERT INTO `sys_user` VALUES (2, 105, 'niangao', '年糕', '00', 'niangao@qq.com', '16688888888', '0', '/common/caches?taskPath=avatar&taskId=ry&filename=ry_avatar.jpeg', '$2b$12$UkNwXNmyQ2RbS1BROXmCRelWLkEgKWQmVsY1S9O1/nZpUSPud1Oz2', '0', '0', '127.0.0.1', '2023-05-23 16:13:33', 'admin', '2023-05-23 16:13:33', 'admin', '2023-05-23 16:13:33', '测试员'); - --- ---------------------------- --- Table structure for sys_user_post --- ---------------------------- -DROP TABLE IF EXISTS `sys_user_post`; -CREATE TABLE `sys_user_post` ( - `user_id` bigint(20) NOT NULL COMMENT '用户ID', - `post_id` bigint(20) NOT NULL COMMENT '岗位ID', - PRIMARY KEY (`user_id`, `post_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_user_post --- ---------------------------- -INSERT INTO `sys_user_post` VALUES (1, 1); -INSERT INTO `sys_user_post` VALUES (2, 1); - --- ---------------------------- --- Table structure for sys_user_role --- ---------------------------- -DROP TABLE IF EXISTS `sys_user_role`; -CREATE TABLE `sys_user_role` ( - `user_id` bigint(20) NOT NULL COMMENT '用户ID', - `role_id` bigint(20) NOT NULL COMMENT '角色ID', - PRIMARY KEY (`user_id`, `role_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of sys_user_role --- ---------------------------- -INSERT INTO `sys_user_role` VALUES (1, 1); -INSERT INTO `sys_user_role` VALUES (2, 2); - -SET FOREIGN_KEY_CHECKS = 1; +-- ---------------------------- +-- 1、部门表 +-- ---------------------------- +drop table if exists sys_dept; +create table sys_dept ( + dept_id bigint(20) not null auto_increment comment '部门id', + parent_id bigint(20) default 0 comment '父部门id', + ancestors varchar(50) default '' comment '祖级列表', + dept_name varchar(30) default '' comment '部门名称', + order_num int(4) default 0 comment '显示顺序', + leader varchar(20) default null comment '负责人', + phone varchar(11) default null comment '联系电话', + email varchar(50) default null comment '邮箱', + status char(1) default '0' comment '部门状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (dept_id) +) engine=innodb auto_increment=200 comment = '部门表'; + +-- ---------------------------- +-- 初始化-部门表数据 +-- ---------------------------- +insert into sys_dept values(100, 0, '0', '集团总公司', 0, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(101, 100, '0,100', '深圳分公司', 1, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '年糕', '15888888888', 'niangao@qq.com', '0', '0', 'admin', sysdate(), '', null); + + +-- ---------------------------- +-- 2、用户信息表 +-- ---------------------------- +drop table if exists sys_user; +create table sys_user ( + user_id bigint(20) not null auto_increment comment '用户ID', + dept_id bigint(20) default null comment '部门ID', + user_name varchar(30) not null comment '用户账号', + nick_name varchar(30) not null comment '用户昵称', + user_type varchar(2) default '00' comment '用户类型(00系统用户)', + email varchar(50) default '' comment '用户邮箱', + phonenumber varchar(11) default '' comment '手机号码', + sex char(1) default '0' comment '用户性别(0男 1女 2未知)', + avatar varchar(100) default '' comment '头像地址', + password varchar(100) default '' comment '密码', + status char(1) default '0' comment '帐号状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + login_ip varchar(128) default '' comment '最后登录IP', + login_date datetime comment '最后登录时间', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (user_id) +) engine=innodb auto_increment=100 comment = '用户信息表'; + +-- ---------------------------- +-- 初始化-用户信息表数据 +-- ---------------------------- +insert into sys_user values(1, 103, 'admin', '超级管理员', '00', 'niangao@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '管理员'); +insert into sys_user values(2, 105, 'niangao', '年糕', '00', 'niangao@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '测试员'); + + +-- ---------------------------- +-- 3、岗位信息表 +-- ---------------------------- +drop table if exists sys_post; +create table sys_post +( + post_id bigint(20) not null auto_increment comment '岗位ID', + post_code varchar(64) not null comment '岗位编码', + post_name varchar(50) not null comment '岗位名称', + post_sort int(4) not null comment '显示顺序', + status char(1) not null comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (post_id) +) engine=innodb comment = '岗位信息表'; + +-- ---------------------------- +-- 初始化-岗位信息表数据 +-- ---------------------------- +insert into sys_post values(1, 'ceo', '董事长', 1, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(2, 'se', '项目经理', 2, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(3, 'hr', '人力资源', 3, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(4, 'user', '普通员工', 4, '0', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 4、角色信息表 +-- ---------------------------- +drop table if exists sys_role; +create table sys_role ( + role_id bigint(20) not null auto_increment comment '角色ID', + role_name varchar(30) not null comment '角色名称', + role_key varchar(100) not null comment '角色权限字符串', + role_sort int(4) not null comment '显示顺序', + data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示', + dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示', + status char(1) not null comment '角色状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (role_id) +) engine=innodb auto_increment=100 comment = '角色信息表'; + +-- ---------------------------- +-- 初始化-角色信息表数据 +-- ---------------------------- +insert into sys_role values('1', '超级管理员', 'admin', 1, 1, 1, 1, '0', '0', 'admin', sysdate(), '', null, '超级管理员'); +insert into sys_role values('2', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 'admin', sysdate(), '', null, '普通角色'); + + +-- ---------------------------- +-- 5、菜单权限表 +-- ---------------------------- +drop table if exists sys_menu; +create table sys_menu ( + menu_id bigint(20) not null auto_increment comment '菜单ID', + menu_name varchar(50) not null comment '菜单名称', + parent_id bigint(20) default 0 comment '父菜单ID', + order_num int(4) default 0 comment '显示顺序', + path varchar(200) default '' comment '路由地址', + component varchar(255) default null comment '组件路径', + query varchar(255) default null comment '路由参数', + route_name varchar(50) default '' comment '路由名称', + is_frame int(1) default 1 comment '是否为外链(0是 1否)', + is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)', + menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)', + visible char(1) default 0 comment '菜单状态(0显示 1隐藏)', + status char(1) default 0 comment '菜单状态(0正常 1停用)', + perms varchar(100) default null comment '权限标识', + icon varchar(100) default '#' comment '菜单图标', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注', + primary key (menu_id) +) engine=innodb auto_increment=2000 comment = '菜单权限表'; + +-- ---------------------------- +-- 初始化-菜单信息表数据 +-- ---------------------------- +-- 一级菜单 +insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'antd-setting', 'admin', sysdate(), '', null, '系统管理目录'); +insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'antd-fund-projection-screen', 'admin', sysdate(), '', null, '系统监控目录'); +insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'antd-repair', 'admin', sysdate(), '', null, '系统工具目录'); +insert into sys_menu values('4', '若依官网', '0', '4', 'http://ruoyi.vip', null, '', '', 0, 0, 'M', '0', '0', '', 'antd-send', 'admin', sysdate(), '', null, '若依官网地址'); +-- 二级菜单 +insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system.user', '', '', 1, 0, 'C', '0', '0', 'system:user:list', 'antd-user', 'admin', sysdate(), '', null, '用户管理菜单'); +insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system.role', '', '', 1, 0, 'C', '0', '0', 'system:role:list', 'antd-team', 'admin', sysdate(), '', null, '角色管理菜单'); +insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system.menu', '', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'antd-app-store-add', 'admin', sysdate(), '', null, '菜单管理菜单'); +insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system.dept', '', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'antd-cluster', 'admin', sysdate(), '', null, '部门管理菜单'); +insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system.post', '', '', 1, 0, 'C', '0', '0', 'system:post:list', 'antd-idcard', 'admin', sysdate(), '', null, '岗位管理菜单'); +insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system.dict', '', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'antd-read', 'admin', sysdate(), '', null, '字典管理菜单'); +insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system.config', '', '', 1, 0, 'C', '0', '0', 'system:config:list', 'antd-calculator', 'admin', sysdate(), '', null, '参数设置菜单'); +insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system.notice', '', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'antd-notification', 'admin', sysdate(), '', null, '通知公告菜单'); +insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '', 1, 0, 'M', '0', '0', '', 'antd-bug', 'admin', sysdate(), '', null, '日志管理菜单'); +insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor.online', '', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'antd-desktop', 'admin', sysdate(), '', null, '在线用户菜单'); +insert into sys_menu values('110', '定时任务', '2', '2', 'job', 'monitor.job', '', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'antd-deployment-unit', 'admin', sysdate(), '', null, '定时任务菜单'); +insert into sys_menu values('111', '数据监控', '2', '3', 'druid', 'monitor.druid', '', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'antd-database', 'admin', sysdate(), '', null, '数据监控菜单'); +insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor.server', '', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'antd-cloud-server', 'admin', sysdate(), '', null, '服务监控菜单'); +insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor.cache.control', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'antd-cloud-sync', 'admin', sysdate(), '', null, '缓存监控菜单'); +insert into sys_menu values('114', '缓存列表', '2', '6', 'cacheList', 'monitor.cache.list', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'antd-table', 'admin', sysdate(), '', null, '缓存列表菜单'); +insert into sys_menu values('115', '表单构建', '3', '1', 'build', 'tool.build', '', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'antd-build', 'admin', sysdate(), '', null, '表单构建菜单'); +insert into sys_menu values('116', '代码生成', '3', '2', 'gen', 'tool.gen', '', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'antd-console-sql', 'admin', sysdate(), '', null, '代码生成菜单'); +insert into sys_menu values('117', '系统接口', '3', '3', 'swagger', 'tool.swagger', '', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'antd-api', 'admin', sysdate(), '', null, '系统接口菜单'); +-- 三级菜单 +insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor.operlog', '', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'antd-clear', 'admin', sysdate(), '', null, '操作日志菜单'); +insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor.logininfor', '', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'antd-control', 'admin', sysdate(), '', null, '登录日志菜单'); +-- 用户管理按钮 +insert into sys_menu values('1000', '用户查询', '100', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1001', '用户新增', '100', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1002', '用户修改', '100', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1003', '用户删除', '100', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1004', '用户导出', '100', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1005', '用户导入', '100', '6', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1006', '重置密码', '100', '7', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', sysdate(), '', null, ''); +-- 角色管理按钮 +insert into sys_menu values('1007', '角色查询', '101', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1008', '角色新增', '101', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1009', '角色修改', '101', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1010', '角色删除', '101', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1011', '角色导出', '101', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', sysdate(), '', null, ''); +-- 菜单管理按钮 +insert into sys_menu values('1012', '菜单查询', '102', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1013', '菜单新增', '102', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1014', '菜单修改', '102', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1015', '菜单删除', '102', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', sysdate(), '', null, ''); +-- 部门管理按钮 +insert into sys_menu values('1016', '部门查询', '103', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1017', '部门新增', '103', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1018', '部门修改', '103', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1019', '部门删除', '103', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', sysdate(), '', null, ''); +-- 岗位管理按钮 +insert into sys_menu values('1020', '岗位查询', '104', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1021', '岗位新增', '104', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1022', '岗位修改', '104', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1023', '岗位删除', '104', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1024', '岗位导出', '104', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', sysdate(), '', null, ''); +-- 字典管理按钮 +insert into sys_menu values('1025', '字典查询', '105', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1026', '字典新增', '105', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1027', '字典修改', '105', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1028', '字典删除', '105', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1029', '字典导出', '105', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', sysdate(), '', null, ''); +-- 参数设置按钮 +insert into sys_menu values('1030', '参数查询', '106', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1031', '参数新增', '106', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1032', '参数修改', '106', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1033', '参数删除', '106', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1034', '参数导出', '106', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', sysdate(), '', null, ''); +-- 通知公告按钮 +insert into sys_menu values('1035', '公告查询', '107', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1036', '公告新增', '107', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1037', '公告修改', '107', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1038', '公告删除', '107', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', sysdate(), '', null, ''); +-- 操作日志按钮 +insert into sys_menu values('1039', '操作查询', '500', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1040', '操作删除', '500', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1041', '日志导出', '500', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', sysdate(), '', null, ''); +-- 登录日志按钮 +insert into sys_menu values('1042', '登录查询', '501', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1043', '登录删除', '501', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1044', '日志导出', '501', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1045', '账户解锁', '501', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', sysdate(), '', null, ''); +-- 在线用户按钮 +insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, ''); +-- 定时任务按钮 +insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1054', '任务导出', '110', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成按钮 +insert into sys_menu values('1055', '生成查询', '116', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1056', '生成修改', '116', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1057', '生成删除', '116', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1058', '导入代码', '116', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1059', '预览代码', '116', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1060', '生成代码', '116', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 6、用户和角色关联表 用户N-1角色 +-- ---------------------------- +drop table if exists sys_user_role; +create table sys_user_role ( + user_id bigint(20) not null comment '用户ID', + role_id bigint(20) not null comment '角色ID', + primary key(user_id, role_id) +) engine=innodb comment = '用户和角色关联表'; + +-- ---------------------------- +-- 初始化-用户和角色关联表数据 +-- ---------------------------- +insert into sys_user_role values ('1', '1'); +insert into sys_user_role values ('2', '2'); + + +-- ---------------------------- +-- 7、角色和菜单关联表 角色1-N菜单 +-- ---------------------------- +drop table if exists sys_role_menu; +create table sys_role_menu ( + role_id bigint(20) not null comment '角色ID', + menu_id bigint(20) not null comment '菜单ID', + primary key(role_id, menu_id) +) engine=innodb comment = '角色和菜单关联表'; + +-- ---------------------------- +-- 初始化-角色和菜单关联表数据 +-- ---------------------------- +insert into sys_role_menu values ('2', '1'); +insert into sys_role_menu values ('2', '2'); +insert into sys_role_menu values ('2', '3'); +insert into sys_role_menu values ('2', '4'); +insert into sys_role_menu values ('2', '100'); +insert into sys_role_menu values ('2', '101'); +insert into sys_role_menu values ('2', '102'); +insert into sys_role_menu values ('2', '103'); +insert into sys_role_menu values ('2', '104'); +insert into sys_role_menu values ('2', '105'); +insert into sys_role_menu values ('2', '106'); +insert into sys_role_menu values ('2', '107'); +insert into sys_role_menu values ('2', '108'); +insert into sys_role_menu values ('2', '109'); +insert into sys_role_menu values ('2', '110'); +insert into sys_role_menu values ('2', '111'); +insert into sys_role_menu values ('2', '112'); +insert into sys_role_menu values ('2', '113'); +insert into sys_role_menu values ('2', '114'); +insert into sys_role_menu values ('2', '115'); +insert into sys_role_menu values ('2', '116'); +insert into sys_role_menu values ('2', '117'); +insert into sys_role_menu values ('2', '500'); +insert into sys_role_menu values ('2', '501'); +insert into sys_role_menu values ('2', '1000'); +insert into sys_role_menu values ('2', '1001'); +insert into sys_role_menu values ('2', '1002'); +insert into sys_role_menu values ('2', '1003'); +insert into sys_role_menu values ('2', '1004'); +insert into sys_role_menu values ('2', '1005'); +insert into sys_role_menu values ('2', '1006'); +insert into sys_role_menu values ('2', '1007'); +insert into sys_role_menu values ('2', '1008'); +insert into sys_role_menu values ('2', '1009'); +insert into sys_role_menu values ('2', '1010'); +insert into sys_role_menu values ('2', '1011'); +insert into sys_role_menu values ('2', '1012'); +insert into sys_role_menu values ('2', '1013'); +insert into sys_role_menu values ('2', '1014'); +insert into sys_role_menu values ('2', '1015'); +insert into sys_role_menu values ('2', '1016'); +insert into sys_role_menu values ('2', '1017'); +insert into sys_role_menu values ('2', '1018'); +insert into sys_role_menu values ('2', '1019'); +insert into sys_role_menu values ('2', '1020'); +insert into sys_role_menu values ('2', '1021'); +insert into sys_role_menu values ('2', '1022'); +insert into sys_role_menu values ('2', '1023'); +insert into sys_role_menu values ('2', '1024'); +insert into sys_role_menu values ('2', '1025'); +insert into sys_role_menu values ('2', '1026'); +insert into sys_role_menu values ('2', '1027'); +insert into sys_role_menu values ('2', '1028'); +insert into sys_role_menu values ('2', '1029'); +insert into sys_role_menu values ('2', '1030'); +insert into sys_role_menu values ('2', '1031'); +insert into sys_role_menu values ('2', '1032'); +insert into sys_role_menu values ('2', '1033'); +insert into sys_role_menu values ('2', '1034'); +insert into sys_role_menu values ('2', '1035'); +insert into sys_role_menu values ('2', '1036'); +insert into sys_role_menu values ('2', '1037'); +insert into sys_role_menu values ('2', '1038'); +insert into sys_role_menu values ('2', '1039'); +insert into sys_role_menu values ('2', '1040'); +insert into sys_role_menu values ('2', '1041'); +insert into sys_role_menu values ('2', '1042'); +insert into sys_role_menu values ('2', '1043'); +insert into sys_role_menu values ('2', '1044'); +insert into sys_role_menu values ('2', '1045'); +insert into sys_role_menu values ('2', '1046'); +insert into sys_role_menu values ('2', '1047'); +insert into sys_role_menu values ('2', '1048'); +insert into sys_role_menu values ('2', '1049'); +insert into sys_role_menu values ('2', '1050'); +insert into sys_role_menu values ('2', '1051'); +insert into sys_role_menu values ('2', '1052'); +insert into sys_role_menu values ('2', '1053'); +insert into sys_role_menu values ('2', '1054'); +insert into sys_role_menu values ('2', '1055'); +insert into sys_role_menu values ('2', '1056'); +insert into sys_role_menu values ('2', '1057'); +insert into sys_role_menu values ('2', '1058'); +insert into sys_role_menu values ('2', '1059'); +insert into sys_role_menu values ('2', '1060'); + +-- ---------------------------- +-- 8、角色和部门关联表 角色1-N部门 +-- ---------------------------- +drop table if exists sys_role_dept; +create table sys_role_dept ( + role_id bigint(20) not null comment '角色ID', + dept_id bigint(20) not null comment '部门ID', + primary key(role_id, dept_id) +) engine=innodb comment = '角色和部门关联表'; + +-- ---------------------------- +-- 初始化-角色和部门关联表数据 +-- ---------------------------- +insert into sys_role_dept values ('2', '100'); +insert into sys_role_dept values ('2', '101'); +insert into sys_role_dept values ('2', '105'); + + +-- ---------------------------- +-- 9、用户与岗位关联表 用户1-N岗位 +-- ---------------------------- +drop table if exists sys_user_post; +create table sys_user_post +( + user_id bigint(20) not null comment '用户ID', + post_id bigint(20) not null comment '岗位ID', + primary key (user_id, post_id) +) engine=innodb comment = '用户与岗位关联表'; + +-- ---------------------------- +-- 初始化-用户与岗位关联表数据 +-- ---------------------------- +insert into sys_user_post values ('1', '1'); +insert into sys_user_post values ('2', '2'); + + +-- ---------------------------- +-- 10、操作日志记录 +-- ---------------------------- +drop table if exists sys_oper_log; +create table sys_oper_log ( + oper_id bigint(20) not null auto_increment comment '日志主键', + title varchar(50) default '' comment '模块标题', + business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)', + method varchar(100) default '' comment '方法名称', + request_method varchar(10) default '' comment '请求方式', + operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)', + oper_name varchar(50) default '' comment '操作人员', + dept_name varchar(50) default '' comment '部门名称', + oper_url varchar(255) default '' comment '请求URL', + oper_ip varchar(128) default '' comment '主机地址', + oper_location varchar(255) default '' comment '操作地点', + oper_param varchar(2000) default '' comment '请求参数', + json_result varchar(2000) default '' comment '返回参数', + status int(1) default 0 comment '操作状态(0正常 1异常)', + error_msg varchar(2000) default '' comment '错误消息', + oper_time datetime comment '操作时间', + cost_time bigint(20) default 0 comment '消耗时间', + primary key (oper_id), + key idx_sys_oper_log_bt (business_type), + key idx_sys_oper_log_s (status), + key idx_sys_oper_log_ot (oper_time) +) engine=innodb auto_increment=100 comment = '操作日志记录'; + + +-- ---------------------------- +-- 11、字典类型表 +-- ---------------------------- +drop table if exists sys_dict_type; +create table sys_dict_type +( + dict_id bigint(20) not null auto_increment comment '字典主键', + dict_name varchar(100) default '' comment '字典名称', + dict_type varchar(100) default '' comment '字典类型', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_id), + unique (dict_type) +) engine=innodb auto_increment=100 comment = '字典类型表'; + +insert into sys_dict_type values(1, '用户性别', 'sys_user_sex', '0', 'admin', sysdate(), '', null, '用户性别列表'); +insert into sys_dict_type values(2, '菜单状态', 'sys_show_hide', '0', 'admin', sysdate(), '', null, '菜单状态列表'); +insert into sys_dict_type values(3, '系统开关', 'sys_normal_disable', '0', 'admin', sysdate(), '', null, '系统开关列表'); +insert into sys_dict_type values(4, '任务状态', 'sys_job_status', '0', 'admin', sysdate(), '', null, '任务状态列表'); +insert into sys_dict_type values(5, '任务分组', 'sys_job_group', '0', 'admin', sysdate(), '', null, '任务分组列表'); +insert into sys_dict_type values(6, '任务执行器', 'sys_job_executor', '0', 'admin', sysdate(), '', null, '任务执行器列表'); +insert into sys_dict_type values(7, '系统是否', 'sys_yes_no', '0', 'admin', sysdate(), '', null, '系统是否列表'); +insert into sys_dict_type values(8, '通知类型', 'sys_notice_type', '0', 'admin', sysdate(), '', null, '通知类型列表'); +insert into sys_dict_type values(9, '通知状态', 'sys_notice_status', '0', 'admin', sysdate(), '', null, '通知状态列表'); +insert into sys_dict_type values(10, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表'); +insert into sys_dict_type values(11, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表'); + + +-- ---------------------------- +-- 12、字典数据表 +-- ---------------------------- +drop table if exists sys_dict_data; +create table sys_dict_data +( + dict_code bigint(20) not null auto_increment comment '字典编码', + dict_sort int(4) default 0 comment '字典排序', + dict_label varchar(100) default '' comment '字典标签', + dict_value varchar(100) default '' comment '字典键值', + dict_type varchar(100) default '' comment '字典类型', + css_class varchar(100) default null comment '样式属性(其他样式扩展)', + list_class varchar(100) default null comment '表格回显样式', + is_default char(1) default 'N' comment '是否默认(Y是 N否)', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_code) +) engine=innodb auto_increment=100 comment = '字典数据表'; + +insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', sysdate(), '', null, '性别男'); +insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别女'); +insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别未知'); +insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '显示菜单'); +insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '隐藏菜单'); +insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(10, 1, '默认', 'default', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组'); +insert into sys_dict_data values(11, 2, '数据库', 'sqlalchemy', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '数据库分组'); +insert into sys_dict_data values(12, 3, 'redis', 'redis', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, 'reids分组'); +insert into sys_dict_data values(13, 1, '默认', 'default', 'sys_job_executor', '', '', 'N', '0', 'admin', sysdate(), '', null, '线程池'); +insert into sys_dict_data values(14, 2, '进程池', 'processpool', 'sys_job_executor', '', '', 'N', '0', 'admin', sysdate(), '', null, '进程池'); +insert into sys_dict_data values(15, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是'); +insert into sys_dict_data values(16, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否'); +insert into sys_dict_data values(17, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知'); +insert into sys_dict_data values(18, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告'); +insert into sys_dict_data values(19, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(20, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态'); +insert into sys_dict_data values(21, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '其他操作'); +insert into sys_dict_data values(22, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作'); +insert into sys_dict_data values(23, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作'); +insert into sys_dict_data values(24, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作'); +insert into sys_dict_data values(25, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作'); +insert into sys_dict_data values(26, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作'); +insert into sys_dict_data values(27, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作'); +insert into sys_dict_data values(28, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作'); +insert into sys_dict_data values(29, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作'); +insert into sys_dict_data values(30, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作'); +insert into sys_dict_data values(31, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(32, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); + + +-- ---------------------------- +-- 13、参数配置表 +-- ---------------------------- +drop table if exists sys_config; +create table sys_config ( + config_id int(5) not null auto_increment comment '参数主键', + config_name varchar(100) default '' comment '参数名称', + config_key varchar(100) default '' comment '参数键名', + config_value varchar(500) default '' comment '参数键值', + config_type char(1) default 'N' comment '系统内置(Y是 N否)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (config_id) +) engine=innodb auto_increment=100 comment = '参数配置表'; + +insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); +insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); +insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); +insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)'); +insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)'); +insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); + + +-- ---------------------------- +-- 14、系统访问记录 +-- ---------------------------- +drop table if exists sys_logininfor; +create table sys_logininfor ( + info_id bigint(20) not null auto_increment comment '访问ID', + user_name varchar(50) default '' comment '用户账号', + ipaddr varchar(128) default '' comment '登录IP地址', + login_location varchar(255) default '' comment '登录地点', + browser varchar(50) default '' comment '浏览器类型', + os varchar(50) default '' comment '操作系统', + status char(1) default '0' comment '登录状态(0成功 1失败)', + msg varchar(255) default '' comment '提示消息', + login_time datetime comment '访问时间', + primary key (info_id), + key idx_sys_logininfor_s (status), + key idx_sys_logininfor_lt (login_time) +) engine=innodb auto_increment=100 comment = '系统访问记录'; + + +-- ---------------------------- +-- 15、定时任务调度表 +-- ---------------------------- +drop table if exists sys_job; +create table sys_job ( + job_id bigint(20) not null auto_increment comment '任务ID', + job_name varchar(64) default '' comment '任务名称', + job_group varchar(64) default 'default' comment '任务组名', + job_executor varchar(64) default 'default' comment '任务执行器', + invoke_target varchar(500) not null comment '调用目标字符串', + job_args varchar(255) default '' comment '位置参数', + job_kwargs varchar(255) default '' comment '关键字参数', + cron_expression varchar(255) default '' comment 'cron执行表达式', + misfire_policy varchar(20) default '3' comment '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + concurrent char(1) default '1' comment '是否并发执行(0允许 1禁止)', + status char(1) default '0' comment '状态(0正常 1暂停)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注信息', + primary key (job_id, job_name, job_group) +) engine=innodb auto_increment=100 comment = '定时任务调度表'; + +insert into sys_job values(1, '系统默认(无参)', 'default', 'default', 'module_task.scheduler_test.job', NULL, NULL, '0/10 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); +insert into sys_job values(2, '系统默认(有参)', 'default', 'default', 'module_task.scheduler_test.job', 'test', NULL, '0/15 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); +insert into sys_job values(3, '系统默认(多参)', 'default', 'default', 'module_task.scheduler_test.job', 'new', '{\"test\": 111}', '0/20 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 16、定时任务调度日志表 +-- ---------------------------- +drop table if exists sys_job_log; +create table sys_job_log ( + job_log_id bigint(20) not null auto_increment comment '任务日志ID', + job_name varchar(64) not null comment '任务名称', + job_group varchar(64) not null comment '任务组名', + job_executor varchar(64) not null comment '任务执行器', + invoke_target varchar(500) not null comment '调用目标字符串', + job_args varchar(255) default '' comment '位置参数', + job_kwargs varchar(255) default '' comment '关键字参数', + job_trigger varchar(255) default '' comment '任务触发器', + job_message varchar(500) comment '日志信息', + status char(1) default '0' comment '执行状态(0正常 1失败)', + exception_info varchar(2000) default '' comment '异常信息', + create_time datetime comment '创建时间', + primary key (job_log_id) +) engine=innodb comment = '定时任务调度日志表'; + + +-- ---------------------------- +-- 17、通知公告表 +-- ---------------------------- +drop table if exists sys_notice; +create table sys_notice ( + notice_id int(4) not null auto_increment comment '公告ID', + notice_title varchar(50) not null comment '公告标题', + notice_type char(1) not null comment '公告类型(1通知 2公告)', + notice_content longblob default null comment '公告内容', + status char(1) default '0' comment '公告状态(0正常 1关闭)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(255) default null comment '备注', + primary key (notice_id) +) engine=innodb auto_increment=10 comment = '通知公告表'; + +-- ---------------------------- +-- 初始化-公告信息表数据 +-- ---------------------------- +insert into sys_notice values('1', '温馨提醒:2018-07-01 vfadmin新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员'); +insert into sys_notice values('2', '维护通知:2018-07-01 vfadmin系统凌晨维护', '1', '维护内容', '0', 'admin', sysdate(), '', null, '管理员'); + + +-- ---------------------------- +-- 18、代码生成业务表 +-- ---------------------------- +drop table if exists gen_table; +create table gen_table ( + table_id bigint(20) not null auto_increment comment '编号', + table_name varchar(200) default '' comment '表名称', + table_comment varchar(500) default '' comment '表描述', + sub_table_name varchar(64) default null comment '关联子表的表名', + sub_table_fk_name varchar(64) default null comment '子表关联的外键名', + class_name varchar(100) default '' comment '实体类名称', + tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)', + tpl_web_type varchar(30) default '' comment '前端模板类型(element-ui模版 element-plus模版)', + package_name varchar(100) comment '生成包路径', + module_name varchar(30) comment '生成模块名', + business_name varchar(30) comment '生成业务名', + function_name varchar(50) comment '生成功能名', + function_author varchar(50) comment '生成功能作者', + gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)', + gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)', + options varchar(1000) comment '其它生成选项', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (table_id) +) engine=innodb auto_increment=1 comment = '代码生成业务表'; + + +-- ---------------------------- +-- 19、代码生成业务表字段 +-- ---------------------------- +drop table if exists gen_table_column; +create table gen_table_column ( + column_id bigint(20) not null auto_increment comment '编号', + table_id bigint(20) comment '归属表编号', + column_name varchar(200) comment '列名称', + column_comment varchar(500) comment '列描述', + column_type varchar(100) comment '列类型', + java_type varchar(500) comment 'JAVA类型', + java_field varchar(200) comment 'JAVA字段名', + is_pk char(1) comment '是否主键(1是)', + is_increment char(1) comment '是否自增(1是)', + is_required char(1) comment '是否必填(1是)', + is_insert char(1) comment '是否为插入字段(1是)', + is_edit char(1) comment '是否编辑字段(1是)', + is_list char(1) comment '是否列表字段(1是)', + is_query char(1) comment '是否查询字段(1是)', + query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)', + html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + dict_type varchar(200) default '' comment '字典类型', + sort int comment '排序', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (column_id) +) engine=innodb auto_increment=1 comment = '代码生成业务表字段'; \ No newline at end of file diff --git a/dash-fastapi-backend/sub_applications/handle.py b/dash-fastapi-backend/sub_applications/handle.py new file mode 100644 index 0000000..df2a5f4 --- /dev/null +++ b/dash-fastapi-backend/sub_applications/handle.py @@ -0,0 +1,10 @@ +from fastapi import FastAPI +from sub_applications.staticfiles import mount_staticfiles + + +def handle_sub_applications(app: FastAPI): + """ + 全局处理子应用挂载 + """ + # 挂载静态文件 + mount_staticfiles(app) diff --git a/dash-fastapi-backend/sub_applications/staticfiles.py b/dash-fastapi-backend/sub_applications/staticfiles.py new file mode 100644 index 0000000..c481d72 --- /dev/null +++ b/dash-fastapi-backend/sub_applications/staticfiles.py @@ -0,0 +1,10 @@ +from fastapi import FastAPI +from fastapi.staticfiles import StaticFiles +from config.env import UploadConfig + + +def mount_staticfiles(app: FastAPI): + """ + 挂载静态文件 + """ + app.mount(f'{UploadConfig.UPLOAD_PREFIX}', StaticFiles(directory=f'{UploadConfig.UPLOAD_PATH}'), name='profile') diff --git a/dash-fastapi-backend/utils/common_util.py b/dash-fastapi-backend/utils/common_util.py index b1e8233..853cfe3 100644 --- a/dash-fastapi-backend/utils/common_util.py +++ b/dash-fastapi-backend/utils/common_util.py @@ -1,10 +1,12 @@ -import pandas as pd import io import os +import pandas as pd +import re from openpyxl import Workbook from openpyxl.styles import Alignment, PatternFill from openpyxl.utils import get_column_letter from openpyxl.worksheet.datavalidation import DataValidation +from sqlalchemy.engine.row import Row from typing import List from config.env import CachePathConfig @@ -31,12 +33,123 @@ def worship(): // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // -// 佛祖保佑 永不宕机 永无BUG // +// 佛祖保佑 永不宕机 永无BUG // //////////////////////////////////////////////////////////////////// """) -def bytes2human(n, format_str="%(value).1f%(symbol)s"): +class CamelCaseUtil: + """ + 下划线形式(snake_case)转小驼峰形式(camelCase)工具方法 + """ + + @classmethod + def snake_to_camel(cls, snake_str): + """ + 下划线形式字符串(snake_case)转换为小驼峰形式字符串(camelCase) + + :param snake_str: 下划线形式字符串 + :return: 小驼峰形式字符串 + """ + # 分割字符串 + words = snake_str.split('_') + # 小驼峰命名,第一个词首字母小写,其余词首字母大写 + return words[0] + ''.join(word.capitalize() for word in words[1:]) + + @classmethod + def transform_result(cls, result): + """ + 针对不同类型将下划线形式(snake_case)批量转换为小驼峰形式(camelCase)方法 + + :param result: 输入数据 + :return: 小驼峰形式结果 + """ + if result is None: + return result + # 如果是字典,直接转换键 + elif isinstance(result, dict): + return {cls.snake_to_camel(k): v for k, v in result.items()} + # 如果是一组字典或其他类型的列表,遍历列表进行转换 + elif isinstance(result, list): + return [ + cls.transform_result(row) + if isinstance(row, (dict, Row)) + else ( + cls.transform_result({c.name: getattr(row, c.name) for c in row.__table__.columns}) if row else row + ) + for row in result + ] + # 如果是sqlalchemy的Row实例,遍历Row进行转换 + elif isinstance(result, Row): + return [ + cls.transform_result(row) + if isinstance(row, dict) + else ( + cls.transform_result({c.name: getattr(row, c.name) for c in row.__table__.columns}) if row else row + ) + for row in result + ] + # 如果是其他类型,如模型实例,先转换为字典 + else: + return cls.transform_result({c.name: getattr(result, c.name) for c in result.__table__.columns}) + + +class SnakeCaseUtil: + """ + 小驼峰形式(camelCase)转下划线形式(snake_case)工具方法 + """ + + @classmethod + def camel_to_snake(cls, camel_str): + """ + 小驼峰形式字符串(camelCase)转换为下划线形式字符串(snake_case) + + :param camel_str: 小驼峰形式字符串 + :return: 下划线形式字符串 + """ + # 在大写字母前添加一个下划线,然后将整个字符串转为小写 + words = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', camel_str) + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', words).lower() + + @classmethod + def transform_result(cls, result): + """ + 针对不同类型将下划线形式(snake_case)批量转换为小驼峰形式(camelCase)方法 + + :param result: 输入数据 + :return: 小驼峰形式结果 + """ + if result is None: + return result + # 如果是字典,直接转换键 + elif isinstance(result, dict): + return {cls.camel_to_snake(k): v for k, v in result.items()} + # 如果是一组字典或其他类型的列表,遍历列表进行转换 + elif isinstance(result, list): + return [ + cls.transform_result(row) + if isinstance(row, (dict, Row)) + else ( + cls.transform_result({c.name: getattr(row, c.name) for c in row.__table__.columns}) if row else row + ) + for row in result + ] + # 如果是sqlalchemy的Row实例,遍历Row进行转换 + elif isinstance(result, Row): + return [ + cls.transform_result(row) + if isinstance(row, dict) + else ( + cls.transform_result({c.name: getattr(row, c.name) for c in row.__table__.columns}) if row else row + ) + for row in result + ] + # 如果是其他类型,如模型实例,先转换为字典 + else: + return cls.transform_result({c.name: getattr(result, c.name) for c in result.__table__.columns}) + + +def bytes2human(n, format_str='%(value).1f%(symbol)s'): """Used by various scripts. See: http://goo.gl/zeJZl @@ -63,6 +176,7 @@ def bytes2file_response(bytes_info): def export_list2excel(list_data: List): """ 工具方法:将需要导出的list数据转化为对应excel的二进制数据 + :param list_data: 数据列表 :return: 字典信息对应excel的二进制数据 """ @@ -77,6 +191,7 @@ def export_list2excel(list_data: List): def get_excel_template(header_list: List, selector_header_list: List, option_list: List[dict]): """ 工具方法:将需要导出的list数据转化为对应excel的二进制数据 + :param header_list: 表头数据列表 :param selector_header_list: 需要设置为选择器格式的表头数据列表 :param option_list: 选择器格式的表头预设的选项列表 @@ -91,7 +206,7 @@ def get_excel_template(header_list: List, selector_header_list: List, option_lis headers = header_list # 设置表头背景样式为灰色,前景色为白色 - header_fill = PatternFill(start_color="ababab", end_color="ababab", fill_type="solid") + header_fill = PatternFill(start_color='ababab', end_color='ababab', fill_type='solid') # 将表头写入第一行 for col_num, header in enumerate(headers, 1): @@ -115,10 +230,11 @@ def get_excel_template(header_list: List, selector_header_list: List, option_lis for option in options: if option.get(selector_header): header_option = option.get(selector_header) - dv = DataValidation(type="list", formula1=f'"{",".join(header_option)}"') + dv = DataValidation(type='list', formula1=f'"{",".join(header_option)}"') # 设置数据有效性规则的起始单元格和结束单元格 dv.add( - f'{get_column_letter(column_selector_header_index)}2:{get_column_letter(column_selector_header_index)}1048576') + f'{get_column_letter(column_selector_header_index)}2:{get_column_letter(column_selector_header_index)}1048576' + ) # 添加数据有效性规则到工作表 ws.add_data_validation(dv) @@ -136,13 +252,14 @@ def get_excel_template(header_list: List, selector_header_list: List, option_lis def get_filepath_from_url(url: str): """ 工具方法:根据请求参数获取文件路径 + :param url: 请求参数中的url参数 :return: 文件路径 """ - file_info = url.split("?")[1].split("&") - task_id = file_info[0].split("=")[1] - file_name = file_info[1].split("=")[1] - task_path = file_info[2].split("=")[1] + file_info = url.split('?')[1].split('&') + task_id = file_info[0].split('=')[1] + file_name = file_info[1].split('=')[1] + task_path = file_info[2].split('=')[1] filepath = os.path.join(CachePathConfig.PATH, task_path, task_id, file_name) return filepath diff --git a/dash-fastapi-backend/utils/cron_util.py b/dash-fastapi-backend/utils/cron_util.py new file mode 100644 index 0000000..6232962 --- /dev/null +++ b/dash-fastapi-backend/utils/cron_util.py @@ -0,0 +1,172 @@ +import re +from datetime import datetime + + +class CronUtil: + """ + Cron表达式工具类 + """ + + @classmethod + def __valid_range(cls, search_str: str, start_range: int, end_range: int): + match = re.match(r'^(\d+)-(\d+)$', search_str) + if match: + start, end = int(match.group(1)), int(match.group(2)) + return start_range <= start < end <= end_range + return False + + @classmethod + def __valid_sum( + cls, search_str: str, start_range_a: int, start_range_b: int, end_range_a: int, end_range_b: int, sum_range: int + ): + match = re.match(r'^(\d+)/(\d+)$', search_str) + if match: + start, end = int(match.group(1)), int(match.group(2)) + return ( + start_range_a <= start <= start_range_b + and end_range_a <= end <= end_range_b + and start + end <= sum_range + ) + return False + + @classmethod + def validate_second_or_minute(cls, second_or_minute: str): + """ + 校验秒或分钟值是否正确 + + :param second_or_minute: 秒或分钟值 + :return: 校验结果 + """ + if ( + second_or_minute == '*' + or ('-' in second_or_minute and cls.__valid_range(second_or_minute, 0, 59)) + or ('/' in second_or_minute and cls.__valid_sum(second_or_minute, 0, 58, 1, 59, 59)) + or re.match(r'^(?:[0-5]?\d|59)(?:,[0-5]?\d|59)*$', second_or_minute) + ): + return True + return False + + @classmethod + def validate_hour(cls, hour: str): + """ + 校验小时值是否正确 + + :param hour: 小时值 + :return: 校验结果 + """ + if ( + hour == '*' + or ('-' in hour and cls.__valid_range(hour, 0, 23)) + or ('/' in hour and cls.__valid_sum(hour, 0, 22, 1, 23, 23)) + or re.match(r'^(?:0|[1-9]|1\d|2[0-3])(?:,(?:0|[1-9]|1\d|2[0-3]))*$', hour) + ): + return True + return False + + @classmethod + def validate_day(cls, day: str): + """ + 校验日值是否正确 + + :param day: 日值 + :return: 校验结果 + """ + if ( + day in ['*', '?', 'L'] + or ('-' in day and cls.__valid_range(day, 1, 31)) + or ('/' in day and cls.__valid_sum(day, 1, 30, 1, 30, 31)) + or ('W' in day and re.match(r'^(?:[1-9]|1\d|2\d|3[01])W$', day)) + or re.match(r'^(?:0|[1-9]|1\d|2[0-9]|3[0-1])(?:,(?:0|[1-9]|1\d|2[0-9]|3[0-1]))*$', day) + ): + return True + return False + + @classmethod + def validate_month(cls, month: str): + """ + 校验月值是否正确 + + :param month: 月值 + :return: 校验结果 + """ + if ( + month == '*' + or ('-' in month and cls.__valid_range(month, 1, 12)) + or ('/' in month and cls.__valid_sum(month, 1, 11, 1, 11, 12)) + or re.match(r'^(?:0|[1-9]|1[0-2])(?:,(?:0|[1-9]|1[0-2]))*$', month) + ): + return True + return False + + @classmethod + def validate_week(cls, week: str): + """ + 校验周值是否正确 + + :param week: 周值 + :return: 校验结果 + """ + if ( + week in ['*', '?'] + or ('-' in week and cls.__valid_range(week, 1, 7)) + or ('#' in week and re.match(r'^[1-7]#[1-4]$', week)) + or ('L' in week and re.match(r'^[1-7]L$', week)) + or re.match(r'^[1-7](?:(,[1-7]))*$', week) + ): + return True + return False + + @classmethod + def validate_year(cls, year: str): + """ + 校验年值是否正确 + + :param year: 年值 + :return: 校验结果 + """ + current_year = int(datetime.now().year) + future_years = [current_year + i for i in range(9)] + if ( + year == '*' + or ('-' in year and cls.__valid_range(year, current_year, 2099)) + or ('/' in year and cls.__valid_sum(year, current_year, 2098, 1, 2099 - current_year, 2099)) + or ('#' in year and re.match(r'^[1-7]#[1-4]$', year)) + or ('L' in year and re.match(r'^[1-7]L$', year)) + or ( + (len(year) == 4 or ',' in year) + and all(int(item) in future_years and current_year <= int(item) <= 2099 for item in year.split(',')) + ) + ): + return True + return False + + @classmethod + def validate_cron_expression(cls, cron_expression: str): + """ + 校验Cron表达式是否正确 + + :param cron_expression: Cron表达式 + :return: 校验结果 + """ + values = cron_expression.split() + if len(values) != 6 and len(values) != 7: + return False + second_validation = cls.validate_second_or_minute(values[0]) + minute_validation = cls.validate_second_or_minute(values[1]) + hour_validation = cls.validate_hour(values[2]) + day_validation = cls.validate_day(values[3]) + month_validation = cls.validate_month(values[4]) + week_validation = cls.validate_week(values[5]) + validation = ( + second_validation + and minute_validation + and hour_validation + and day_validation + and month_validation + and week_validation + ) + if len(values) == 6: + return validation + if len(values) == 7: + year_validation = cls.validate_year(values[6]) + return validation and year_validation diff --git a/dash-fastapi-backend/utils/log_util.py b/dash-fastapi-backend/utils/log_util.py index e904653..e42f393 100644 --- a/dash-fastapi-backend/utils/log_util.py +++ b/dash-fastapi-backend/utils/log_util.py @@ -8,4 +8,4 @@ if not os.path.exists(log_path): log_path_error = os.path.join(log_path, f'{time.strftime("%Y-%m-%d")}_error.log') -logger.add(log_path_error, rotation="50MB", encoding="utf-8", enqueue=True, compression="zip") +logger.add(log_path_error, rotation='50MB', encoding='utf-8', enqueue=True, compression='zip') diff --git a/dash-fastapi-backend/utils/message_util.py b/dash-fastapi-backend/utils/message_util.py index 6a21f88..3d3eb51 100644 --- a/dash-fastapi-backend/utils/message_util.py +++ b/dash-fastapi-backend/utils/message_util.py @@ -2,4 +2,4 @@ from utils.log_util import logger def message_service(sms_code: str): - logger.info(f"短信验证码为{sms_code}") + logger.info(f'短信验证码为{sms_code}') diff --git a/dash-fastapi-backend/utils/page_util.py b/dash-fastapi-backend/utils/page_util.py index dd78021..dfe8a31 100644 --- a/dash-fastapi-backend/utils/page_util.py +++ b/dash-fastapi-backend/utils/page_util.py @@ -1,63 +1,101 @@ import math -from typing import List +from pydantic import BaseModel, ConfigDict +from pydantic.alias_generators import to_camel +from sqlalchemy import func, select, Select +from sqlalchemy.ext.asyncio import AsyncSession +from typing import Optional, List +from utils.common_util import CamelCaseUtil -from pydantic import BaseModel - -class PageModel(BaseModel): +class PageResponseModel(BaseModel): """ - 分页模型 + 列表分页查询返回模型 """ - offset: int - page_num: int - page_size: int - total: int - has_next: bool + model_config = ConfigDict(alias_generator=to_camel) -class PageObjectResponse(BaseModel): - """ - 用户管理列表分页查询返回模型 - """ rows: List = [] - page_num: int - page_size: int + page_num: Optional[int] = None + page_size: Optional[int] = None total: int - has_next: bool + has_next: Optional[bool] = None -def get_page_info(offset: int, page_num: int, page_size: int, count: int): +class PageUtil: """ - 根据分页参数获取分页信息 - :param offset: 起始数据位置 - :param page_num: 当前页码 - :param page_size: 当前页面数据量 - :param count: 数据总数 - :return: 分页信息对象 + 分页工具类 """ - has_next = False - if offset >= count: - res_offset_1 = (page_num - 2) * page_size - if res_offset_1 < 0: - res_offset = 0 - res_page_num = 1 - else: - res_offset = res_offset_1 - res_page_num = page_num - 1 - else: - res_offset = offset - if (res_offset + page_size) < count: - has_next = True - res_page_num = page_num - result = dict(offset=res_offset, page_num=res_page_num, page_size=page_size, total=count, has_next=has_next) + @classmethod + def get_page_obj(cls, data_list: List, page_num: int, page_size: int): + """ + 输入数据列表data_list和分页信息,返回分页数据列表结果 + + :param data_list: 原始数据列表 + :param page_num: 当前页码 + :param page_size: 当前页面数据量 + :return: 分页数据对象 + """ + # 计算起始索引和结束索引 + start = (page_num - 1) * page_size + end = page_num * page_size + + # 根据计算得到的起始索引和结束索引对数据列表进行切片 + paginated_data = data_list[start:end] + has_next = True if math.ceil(len(data_list) / page_size) > page_num else False + + result = PageResponseModel( + rows=paginated_data, pageNum=page_num, pageSize=page_size, total=len(data_list), hasNext=has_next + ) + + return result + + @classmethod + async def paginate(cls, db: AsyncSession, query: Select, page_num: int, page_size: int, is_page: bool = False): + """ + 输入查询语句和分页信息,返回分页数据列表结果 + + :param db: orm对象 + :param query: sqlalchemy查询语句 + :param page_num: 当前页码 + :param page_size: 当前页面数据量 + :param is_page: 是否开启分页 + :return: 分页数据对象 + """ + if is_page: + total = (await db.execute(select(func.count('*')).select_from(query.subquery()))).scalar() + query_result = await db.execute(query.offset((page_num - 1) * page_size).limit(page_size)) + paginated_data = [] + for row in query_result: + if row and len(row) == 1: + paginated_data.append(row[0]) + else: + paginated_data.append(row) + has_next = math.ceil(total / page_size) > page_num + result = PageResponseModel( + rows=CamelCaseUtil.transform_result(paginated_data), + pageNum=page_num, + pageSize=page_size, + total=total, + hasNext=has_next, + ) + else: + query_result = await db.execute(query) + no_paginated_data = [] + for row in query_result: + if row and len(row) == 1: + no_paginated_data.append(row[0]) + else: + no_paginated_data.append(row) + result = CamelCaseUtil.transform_result(no_paginated_data) - return PageModel(**result) + return result def get_page_obj(data_list: List, page_num: int, page_size: int): """ 输入数据列表data_list和分页信息,返回分页数据列表结果 + :param data_list: 原始数据列表 :param page_num: 当前页码 :param page_size: 当前页面数据量 @@ -71,14 +109,8 @@ def get_page_obj(data_list: List, page_num: int, page_size: int): paginated_data = data_list[start:end] has_next = True if math.ceil(len(data_list) / page_size) > page_num else False - result = dict( - rows=paginated_data, - page_num=page_num, - page_size=page_size, - total=len(data_list), - has_next=has_next + result = PageResponseModel( + rows=paginated_data, pageNum=page_num, pageSize=page_size, total=len(data_list), hasNext=has_next ) - return PageObjectResponse(**result) - - + return result diff --git a/dash-fastapi-backend/utils/pwd_util.py b/dash-fastapi-backend/utils/pwd_util.py index 2e9a2f9..86e9c27 100644 --- a/dash-fastapi-backend/utils/pwd_util.py +++ b/dash-fastapi-backend/utils/pwd_util.py @@ -1,6 +1,6 @@ from passlib.context import CryptContext -pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +pwd_context = CryptContext(schemes=['bcrypt'], deprecated='auto') class PwdUtil: @@ -12,6 +12,7 @@ class PwdUtil: def verify_password(cls, plain_password, hashed_password): """ 工具方法:校验当前输入的密码与数据库存储的密码是否一致 + :param plain_password: 当前输入的密码 :param hashed_password: 数据库存储的密码 :return: 校验结果 @@ -22,6 +23,7 @@ class PwdUtil: def get_password_hash(cls, input_password): """ 工具方法:对当前输入的密码进行加密 + :param input_password: 输入的密码 :return: 加密成功的密码 """ diff --git a/dash-fastapi-backend/utils/response_util.py b/dash-fastapi-backend/utils/response_util.py index 4ac66e3..88d2e37 100644 --- a/dash-fastapi-backend/utils/response_util.py +++ b/dash-fastapi-backend/utils/response_util.py @@ -1,114 +1,193 @@ +from datetime import datetime from fastapi import status -from fastapi.responses import JSONResponse, Response, StreamingResponse from fastapi.encoders import jsonable_encoder -from typing import Any -from datetime import datetime - - -def response_200(*, data: Any = None, message="获取成功") -> Response: - return JSONResponse( - status_code=status.HTTP_200_OK, - content=jsonable_encoder( - { - 'code': 200, - 'message': message, - 'data': data, - 'success': 'true', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_400(*, data: Any = None, message: str = "获取失败") -> Response: - return JSONResponse( - status_code=status.HTTP_400_BAD_REQUEST, - content=jsonable_encoder( - { - 'code': 400, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_401(*, data: Any = None, message: str = "获取失败") -> Response: - return JSONResponse( - status_code=status.HTTP_401_UNAUTHORIZED, - content=jsonable_encoder( - { - 'code': 401, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_403(*, data: Any = None, message: str = "获取失败") -> Response: - return JSONResponse( - status_code=status.HTTP_403_FORBIDDEN, - content=jsonable_encoder( - { - 'code': 403, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_500(*, data: Any = None, message: str = "接口异常") -> Response: - return JSONResponse( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - content=jsonable_encoder( - { - 'code': 500, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def streaming_response_200(*, data: Any = None): - return StreamingResponse( - status_code=status.HTTP_200_OK, - content=data, - ) - - -class AuthException(Exception): - """ - 自定义令牌异常AuthException - """ - def __init__(self, data: str = None, message: str = None): - self.data = data - self.message = message +from fastapi.responses import JSONResponse, Response, StreamingResponse +from pydantic import BaseModel +from typing import Any, Dict, Optional +from config.constant import HttpStatusConstant -class PermissionException(Exception): +class ResponseUtil: """ - 自定义权限异常PermissionException + 响应工具类 """ - def __init__(self, data: str = None, message: str = None): - self.data = data - self.message = message - -class LoginException(Exception): - """ - 自定义登录异常LoginException - """ - def __init__(self, data: str = None, message: str = None): - self.data = data - self.message = message + @classmethod + def success( + cls, + msg: str = '操作成功', + data: Optional[Any] = None, + rows: Optional[Any] = None, + dict_content: Optional[Dict] = None, + model_content: Optional[BaseModel] = None, + ) -> Response: + """ + 成功响应方法 + + :param msg: 可选,自定义成功响应信息 + :param data: 可选,成功响应结果中属性为data的值 + :param rows: 可选,成功响应结果中属性为rows的值 + :param dict_content: 可选,dict类型,成功响应结果中自定义属性的值 + :param model_content: 可选,BaseModel类型,成功响应结果中自定义属性的值 + :return: 成功响应结果 + """ + result = {'code': HttpStatusConstant.SUCCESS, 'msg': msg} + + if data is not None: + result['data'] = data + if rows is not None: + result['rows'] = rows + if dict_content is not None: + result.update(dict_content) + if model_content is not None: + result.update(model_content.model_dump(by_alias=True)) + + result.update({'success': True, 'time': datetime.now()}) + + return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result)) + + @classmethod + def failure( + cls, + msg: str = '操作失败', + data: Optional[Any] = None, + rows: Optional[Any] = None, + dict_content: Optional[Dict] = None, + model_content: Optional[BaseModel] = None, + ) -> Response: + """ + 失败响应方法 + + :param msg: 可选,自定义失败响应信息 + :param data: 可选,失败响应结果中属性为data的值 + :param rows: 可选,失败响应结果中属性为rows的值 + :param dict_content: 可选,dict类型,失败响应结果中自定义属性的值 + :param model_content: 可选,BaseModel类型,失败响应结果中自定义属性的值 + :return: 失败响应结果 + """ + result = {'code': HttpStatusConstant.WARN, 'msg': msg} + + if data is not None: + result['data'] = data + if rows is not None: + result['rows'] = rows + if dict_content is not None: + result.update(dict_content) + if model_content is not None: + result.update(model_content.model_dump(by_alias=True)) + + result.update({'success': False, 'time': datetime.now()}) + + return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result)) + + @classmethod + def unauthorized( + cls, + msg: str = '登录信息已过期,访问系统资源失败', + data: Optional[Any] = None, + rows: Optional[Any] = None, + dict_content: Optional[Dict] = None, + model_content: Optional[BaseModel] = None, + ) -> Response: + """ + 未认证响应方法 + + :param msg: 可选,自定义未认证响应信息 + :param data: 可选,未认证响应结果中属性为data的值 + :param rows: 可选,未认证响应结果中属性为rows的值 + :param dict_content: 可选,dict类型,未认证响应结果中自定义属性的值 + :param model_content: 可选,BaseModel类型,未认证响应结果中自定义属性的值 + :return: 未认证响应结果 + """ + result = {'code': HttpStatusConstant.UNAUTHORIZED, 'msg': msg} + + if data is not None: + result['data'] = data + if rows is not None: + result['rows'] = rows + if dict_content is not None: + result.update(dict_content) + if model_content is not None: + result.update(model_content.model_dump(by_alias=True)) + + result.update({'success': False, 'time': datetime.now()}) + + return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result)) + + @classmethod + def forbidden( + cls, + msg: str = '该用户无此接口权限', + data: Optional[Any] = None, + rows: Optional[Any] = None, + dict_content: Optional[Dict] = None, + model_content: Optional[BaseModel] = None, + ) -> Response: + """ + 未授权响应方法 + + :param msg: 可选,自定义未授权响应信息 + :param data: 可选,未授权响应结果中属性为data的值 + :param rows: 可选,未授权响应结果中属性为rows的值 + :param dict_content: 可选,dict类型,未授权响应结果中自定义属性的值 + :param model_content: 可选,BaseModel类型,未授权响应结果中自定义属性的值 + :return: 未授权响应结果 + """ + result = {'code': HttpStatusConstant.FORBIDDEN, 'msg': msg} + + if data is not None: + result['data'] = data + if rows is not None: + result['rows'] = rows + if dict_content is not None: + result.update(dict_content) + if model_content is not None: + result.update(model_content.model_dump(by_alias=True)) + + result.update({'success': False, 'time': datetime.now()}) + + return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result)) + + @classmethod + def error( + cls, + msg: str = '接口异常', + data: Optional[Any] = None, + rows: Optional[Any] = None, + dict_content: Optional[Dict] = None, + model_content: Optional[BaseModel] = None, + ) -> Response: + """ + 错误响应方法 + + :param msg: 可选,自定义错误响应信息 + :param data: 可选,错误响应结果中属性为data的值 + :param rows: 可选,错误响应结果中属性为rows的值 + :param dict_content: 可选,dict类型,错误响应结果中自定义属性的值 + :param model_content: 可选,BaseModel类型,错误响应结果中自定义属性的值 + :return: 错误响应结果 + """ + result = {'code': HttpStatusConstant.ERROR, 'msg': msg} + + if data is not None: + result['data'] = data + if rows is not None: + result['rows'] = rows + if dict_content is not None: + result.update(dict_content) + if model_content is not None: + result.update(model_content.model_dump(by_alias=True)) + + result.update({'success': False, 'time': datetime.now()}) + + return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result)) + + @classmethod + def streaming(cls, *, data: Any = None): + """ + 流式响应方法 + + :param data: 流式传输的内容 + :return: 流式响应结果 + """ + return StreamingResponse(status_code=status.HTTP_200_OK, content=data) diff --git a/dash-fastapi-backend/utils/string_util.py b/dash-fastapi-backend/utils/string_util.py new file mode 100644 index 0000000..0be9e65 --- /dev/null +++ b/dash-fastapi-backend/utils/string_util.py @@ -0,0 +1,101 @@ +from typing import List +from config.constant import CommonConstant + + +class StringUtil: + """ + 字符串工具类 + """ + + @classmethod + def is_blank(cls, string: str) -> bool: + """ + 校验字符串是否为''或全空格 + + :param string: 需要校验的字符串 + :return: 校验结果 + """ + if string is None: + return False + str_len = len(string) + if str_len == 0: + return True + else: + for i in range(str_len): + if string[i] != ' ': + return False + return True + + @classmethod + def is_empty(cls, string) -> bool: + """ + 校验字符串是否为''或None + + :param string: 需要校验的字符串 + :return: 校验结果 + """ + return string is None or len(string) == 0 + + @classmethod + def is_http(cls, link: str): + """ + 判断是否为http(s)://开头 + + :param link: 链接 + :return: 是否为http(s)://开头 + """ + return link.startswith(CommonConstant.HTTP) or link.startswith(CommonConstant.HTTPS) + + @classmethod + def contains_ignore_case(cls, search_str: str, compare_str: str): + """ + 查找指定字符串是否包含指定字符串同时串忽略大小写 + + :param search_str: 查找的字符串 + :param compare_str: 比对的字符串 + :return: 查找结果 + """ + if compare_str and search_str: + return compare_str.lower() in search_str.lower() + return False + + @classmethod + def contains_any_ignore_case(cls, search_str: str, compare_str_list: List[str]): + """ + 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + + :param search_str: 查找的字符串 + :param compare_str_list: 比对的字符串列表 + :return: 查找结果 + """ + if search_str and compare_str_list: + for compare_str in compare_str_list: + return cls.contains_ignore_case(search_str, compare_str) + return False + + @classmethod + def startswith_case(cls, search_str: str, compare_str: str): + """ + 查找指定字符串是否以指定字符串开头 + + :param search_str: 查找的字符串 + :param compare_str: 比对的字符串 + :return: 查找结果 + """ + if compare_str and search_str: + return search_str.startswith(compare_str) + return False + + @classmethod + def startswith_any_case(cls, search_str: str, compare_str_list: List[str]): + """ + 查找指定字符串是否以指定字符串列表中的任意一个字符串开头 + + :param search_str: 查找的字符串 + :param compare_str_list: 比对的字符串列表 + :return: 查找结果 + """ + if search_str and compare_str_list: + for compare_str in compare_str_list: + return cls.startswith_case(search_str, compare_str) + return False diff --git a/dash-fastapi-backend/utils/time_format_util.py b/dash-fastapi-backend/utils/time_format_util.py index ba19489..380537e 100644 --- a/dash-fastapi-backend/utils/time_format_util.py +++ b/dash-fastapi-backend/utils/time_format_util.py @@ -29,6 +29,7 @@ def list_format_datetime(lst): def format_datetime_dict_list(dicts): """ 递归遍历嵌套字典,并将 datetime 值转换为字符串格式 + :param dicts: 输入一个嵌套字典的列表 :return: 对目标列表中所有字典的datetime类型的属性格式化 """ diff --git a/dash-fastapi-backend/utils/upload_util.py b/dash-fastapi-backend/utils/upload_util.py new file mode 100644 index 0000000..726789e --- /dev/null +++ b/dash-fastapi-backend/utils/upload_util.py @@ -0,0 +1,105 @@ +import os +import random +from datetime import datetime +from fastapi import UploadFile +from config.env import UploadConfig + + +class UploadUtil: + """ + 上传工具类 + """ + + @classmethod + def generate_random_number(cls): + """ + 生成3位数字构成的字符串 + + :return: 3位数字构成的字符串 + """ + random_number = random.randint(1, 999) + + return f'{random_number:03}' + + @classmethod + def check_file_exists(cls, filepath: str): + """ + 检查文件是否存在 + + :param filepath: 文件路径 + :return: 校验结果 + """ + return os.path.exists(filepath) + + @classmethod + def check_file_extension(cls, file: UploadFile): + """ + 检查文件后缀是否合法 + + :param file: 文件对象 + :return: 校验结果 + """ + file_extension = file.filename.rsplit('.', 1)[-1] + if file_extension in UploadConfig.DEFAULT_ALLOWED_EXTENSION: + return True + return False + + @classmethod + def check_file_timestamp(cls, filename: str): + """ + 校验文件时间戳是否合法 + + :param filename: 文件名称 + :return: 校验结果 + """ + timestamp = filename.rsplit('.', 1)[0].split('_')[-1].split(UploadConfig.UPLOAD_MACHINE)[0] + try: + datetime.strptime(timestamp, '%Y%m%d%H%M%S') + return True + except ValueError: + return False + + @classmethod + def check_file_machine(cls, filename: str): + """ + 校验文件机器码是否合法 + + :param filename: 文件名称 + :return: 校验结果 + """ + if filename.rsplit('.', 1)[0][-4] == UploadConfig.UPLOAD_MACHINE: + return True + return False + + @classmethod + def check_file_random_code(cls, filename: str): + """ + 校验文件随机码是否合法 + + :param filename: 文件名称 + :return: 校验结果 + """ + valid_code_list = [f'{i:03}' for i in range(1, 999)] + if filename.rsplit('.', 1)[0][-3:] in valid_code_list: + return True + return False + + @classmethod + def generate_file(cls, filepath: str): + """ + 根据文件生成二进制数据 + + :param filepath: 文件路径 + :yield: 二进制数据 + """ + with open(filepath, 'rb') as response_file: + yield from response_file + + @classmethod + def delete_file(cls, filepath: str): + """ + 根据文件路径删除对应文件 + + :param filepath: 文件路径 + """ + os.remove(filepath) -- Gitee From b29e5c62a5942a1e9bdc4244b0ee507f54f20e5f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 28 Aug 2024 17:22:46 +0800 Subject: [PATCH 002/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4vo?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/pydantic_annotation.py | 8 +++---- .../module_admin/entity/vo/cache_vo.py | 7 +------ .../module_admin/entity/vo/common_vo.py | 5 +---- .../module_admin/entity/vo/config_vo.py | 5 +---- .../module_admin/entity/vo/dept_vo.py | 5 +---- .../module_admin/entity/vo/dict_vo.py | 9 ++------ .../module_admin/entity/vo/job_vo.py | 9 ++------ .../module_admin/entity/vo/log_vo.py | 11 ++-------- .../module_admin/entity/vo/login_vo.py | 13 +----------- .../module_admin/entity/vo/notice_vo.py | 5 +---- .../module_admin/entity/vo/online_vo.py | 7 +------ .../module_admin/entity/vo/post_vo.py | 5 +---- .../module_admin/entity/vo/role_vo.py | 13 +++--------- .../module_admin/entity/vo/server_vo.py | 15 +------------ .../module_admin/entity/vo/user_vo.py | 21 +++---------------- 15 files changed, 25 insertions(+), 113 deletions(-) diff --git a/dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py b/dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py index 0799f66..521a13e 100644 --- a/dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py @@ -17,7 +17,7 @@ def as_query(cls: Type[BaseModel]): if not model_field.is_required(): new_parameters.append( inspect.Parameter( - model_field.alias, + field_name, inspect.Parameter.POSITIONAL_ONLY, default=Query(default=model_field.default, description=model_field.description), annotation=model_field.annotation, @@ -26,7 +26,7 @@ def as_query(cls: Type[BaseModel]): else: new_parameters.append( inspect.Parameter( - model_field.alias, + field_name, inspect.Parameter.POSITIONAL_ONLY, default=Query(..., description=model_field.description), annotation=model_field.annotation, @@ -55,7 +55,7 @@ def as_form(cls: Type[BaseModel]): if not model_field.is_required(): new_parameters.append( inspect.Parameter( - model_field.alias, + field_name, inspect.Parameter.POSITIONAL_ONLY, default=Form(default=model_field.default, description=model_field.description), annotation=model_field.annotation, @@ -64,7 +64,7 @@ def as_form(cls: Type[BaseModel]): else: new_parameters.append( inspect.Parameter( - model_field.alias, + field_name, inspect.Parameter.POSITIONAL_ONLY, default=Form(..., description=model_field.description), annotation=model_field.annotation, diff --git a/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py b/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py index 79b49fb..6d58896 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/cache_vo.py @@ -1,5 +1,4 @@ -from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel +from pydantic import BaseModel, Field from typing import Any, List, Optional @@ -8,8 +7,6 @@ class CacheMonitorModel(BaseModel): 缓存监控信息对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel) - command_stats: Optional[List] = Field(default=[], description='命令统计') db_size: Optional[int] = Field(default=None, description='Key数量') info: Optional[dict] = Field(default={}, description='Redis信息') @@ -20,8 +17,6 @@ class CacheInfoModel(BaseModel): 缓存监控对象对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel) - cache_key: Optional[str] = Field(default=None, description='缓存键名') cache_name: Optional[str] = Field(default=None, description='缓存名称') cache_value: Optional[Any] = Field(default=None, description='缓存内容') diff --git a/dash-fastapi-backend/module_admin/entity/vo/common_vo.py b/dash-fastapi-backend/module_admin/entity/vo/common_vo.py index 258be5d..d25bf1c 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/common_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/common_vo.py @@ -1,5 +1,4 @@ -from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel +from pydantic import BaseModel, Field from typing import Any, Optional @@ -18,8 +17,6 @@ class UploadResponseModel(BaseModel): 上传响应模型 """ - model_config = ConfigDict(alias_generator=to_camel) - file_name: Optional[str] = Field(default=None, description='新文件映射路径') new_file_name: Optional[str] = Field(default=None, description='新文件名称') original_filename: Optional[str] = Field(default=None, description='原文件名称') diff --git a/dash-fastapi-backend/module_admin/entity/vo/config_vo.py b/dash-fastapi-backend/module_admin/entity/vo/config_vo.py index c398d23..11f2355 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/config_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/config_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_form, as_query @@ -11,7 +10,7 @@ class ConfigModel(BaseModel): 参数配置表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) config_id: Optional[int] = Field(default=None, description='参数主键') config_name: Optional[str] = Field(default=None, description='参数名称') @@ -70,6 +69,4 @@ class DeleteConfigModel(BaseModel): 删除参数配置模型 """ - model_config = ConfigDict(alias_generator=to_camel) - config_ids: str = Field(description='需要删除的参数主键') diff --git a/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py b/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py index dcad117..cd2824a 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import Network, NotBlank, Size from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_query @@ -11,7 +10,7 @@ class DeptModel(BaseModel): 部门表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) dept_id: Optional[int] = Field(default=None, description='部门id') parent_id: Optional[int] = Field(default=None, description='父部门id') @@ -68,8 +67,6 @@ class DeleteDeptModel(BaseModel): 删除部门模型 """ - model_config = ConfigDict(alias_generator=to_camel) - dept_ids: str = Field(default=None, description='需要删除的部门id') update_by: Optional[str] = Field(default=None, description='更新者') update_time: Optional[str] = Field(default=None, description='更新时间') diff --git a/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py b/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py index 4961674..b37cfa0 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Pattern, Size from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_form, as_query @@ -11,7 +10,7 @@ class DictTypeModel(BaseModel): 字典类型表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) dict_id: Optional[int] = Field(default=None, description='字典主键') dict_name: Optional[str] = Field(default=None, description='字典名称') @@ -48,7 +47,7 @@ class DictDataModel(BaseModel): 字典数据表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) dict_code: Optional[int] = Field(default=None, description='字典编码') dict_sort: Optional[int] = Field(default=None, description='字典排序') @@ -116,8 +115,6 @@ class DeleteDictTypeModel(BaseModel): 删除字典类型模型 """ - model_config = ConfigDict(alias_generator=to_camel) - dict_ids: str = Field(description='需要删除的字典主键') @@ -146,6 +143,4 @@ class DeleteDictDataModel(BaseModel): 删除字典数据模型 """ - model_config = ConfigDict(alias_generator=to_camel) - dict_codes: str = Field(description='需要删除的字典编码') diff --git a/dash-fastapi-backend/module_admin/entity/vo/job_vo.py b/dash-fastapi-backend/module_admin/entity/vo/job_vo.py index 4dd9e38..ca0fc35 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/job_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/job_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_form, as_query @@ -11,7 +10,7 @@ class JobModel(BaseModel): 定时任务调度表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) job_id: Optional[int] = Field(default=None, description='任务ID') job_name: Optional[str] = Field(default=None, description='任务名称') @@ -52,7 +51,7 @@ class JobLogModel(BaseModel): 定时任务调度日志表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) job_log_id: Optional[int] = Field(default=None, description='任务日志ID') job_name: Optional[str] = Field(default=None, description='任务名称') @@ -101,8 +100,6 @@ class DeleteJobModel(BaseModel): 删除定时任务模型 """ - model_config = ConfigDict(alias_generator=to_camel) - job_ids: str = Field(description='需要删除的定时任务ID') @@ -131,6 +128,4 @@ class DeleteJobLogModel(BaseModel): 删除定时任务日志模型 """ - model_config = ConfigDict(alias_generator=to_camel) - job_log_ids: str = Field(description='需要删除的定时任务日志ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/log_vo.py b/dash-fastapi-backend/module_admin/entity/vo/log_vo.py index 1866513..c1970b0 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/log_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/log_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_form, as_query @@ -10,7 +9,7 @@ class OperLogModel(BaseModel): 操作日志表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) oper_id: Optional[int] = Field(default=None, description='日志主键') title: Optional[str] = Field(default=None, description='模块标题') @@ -42,7 +41,7 @@ class LogininforModel(BaseModel): 登录日志表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) info_id: Optional[int] = Field(default=None, description='访问ID') user_name: Optional[str] = Field(default=None, description='用户账号') @@ -84,8 +83,6 @@ class DeleteOperLogModel(BaseModel): 删除操作日志模型 """ - model_config = ConfigDict(alias_generator=to_camel) - oper_ids: str = Field(description='需要删除的日志主键') @@ -118,8 +115,6 @@ class DeleteLoginLogModel(BaseModel): 删除登录日志模型 """ - model_config = ConfigDict(alias_generator=to_camel) - info_ids: str = Field(description='需要删除的访问ID') @@ -128,6 +123,4 @@ class UnlockUser(BaseModel): 解锁用户模型 """ - model_config = ConfigDict(alias_generator=to_camel) - user_name: str = Field(description='用户名称') diff --git a/dash-fastapi-backend/module_admin/entity/vo/login_vo.py b/dash-fastapi-backend/module_admin/entity/vo/login_vo.py index fbd6e07..17cacc4 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/login_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/login_vo.py @@ -1,14 +1,11 @@ import re -from pydantic import BaseModel, ConfigDict, Field, model_validator -from pydantic.alias_generators import to_camel +from pydantic import BaseModel, Field, model_validator from typing import List, Optional, Union from exceptions.exception import ModelValidatorException from module_admin.entity.vo.menu_vo import MenuModel class UserLogin(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - user_name: str = Field(description='用户名称') password: str = Field(description='用户密码') code: Optional[str] = Field(default=None, description='验证码') @@ -18,8 +15,6 @@ class UserLogin(BaseModel): class UserRegister(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - username: str = Field(description='用户名称') password: str = Field(description='用户密码') confirm_password: str = Field(description='用户二次确认密码') @@ -41,8 +36,6 @@ class Token(BaseModel): class CaptchaCode(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - captcha_enabled: bool = Field(description='是否启用验证码') register_enabled: bool = Field(description='是否启用注册') img: str = Field(description='验证码图片') @@ -61,8 +54,6 @@ class MenuTreeModel(MenuModel): class MetaModel(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - title: Optional[str] = Field(default=None, description='设置路由在侧边栏和面包屑中展示的名字') icon: Optional[str] = Field(default=None, description='设置路由的图标') no_cache: Optional[bool] = Field(default=None, description='设置为true,则不会被 缓存') @@ -70,8 +61,6 @@ class MetaModel(BaseModel): class RouterModel(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - name: Optional[str] = Field(default=None, description='路由名称') path: Optional[str] = Field(default=None, description='路由地址') hidden: Optional[bool] = Field(default=None, description='是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现') diff --git a/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py b/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py index bbf0a07..ef1570c 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size, Xss from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_form, as_query @@ -11,7 +10,7 @@ class NoticeModel(BaseModel): 通知公告表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) notice_id: Optional[int] = Field(default=None, description='公告ID') notice_title: Optional[str] = Field(default=None, description='公告标题') @@ -59,6 +58,4 @@ class DeleteNoticeModel(BaseModel): 删除通知公告模型 """ - model_config = ConfigDict(alias_generator=to_camel) - notice_ids: str = Field(description='需要删除的公告ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py index ca68f1e..8c24789 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py @@ -1,6 +1,5 @@ from datetime import datetime -from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel +from pydantic import BaseModel, Field from typing import Optional from module_admin.annotation.pydantic_annotation import as_query @@ -10,8 +9,6 @@ class OnlineModel(BaseModel): 在线用户对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel) - token_id: Optional[str] = Field(default=None, description='会话编号') user_name: Optional[str] = Field(default=None, description='部门名称') dept_name: Optional[str] = Field(default=None, description='用户名称') @@ -37,6 +34,4 @@ class DeleteOnlineModel(BaseModel): 强退在线用户模型 """ - model_config = ConfigDict(alias_generator=to_camel) - token_ids: str = Field(description='需要强退的会话编号') diff --git a/dash-fastapi-backend/module_admin/entity/vo/post_vo.py b/dash-fastapi-backend/module_admin/entity/vo/post_vo.py index ab85103..337a6cc 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/post_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/post_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_form, as_query @@ -11,7 +10,7 @@ class PostModel(BaseModel): 岗位信息表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) post_id: Optional[int] = Field(default=None, description='岗位ID') post_code: Optional[str] = Field(default=None, description='岗位编码') @@ -69,6 +68,4 @@ class DeletePostModel(BaseModel): 删除岗位模型 """ - model_config = ConfigDict(alias_generator=to_camel) - post_ids: str = Field(description='需要删除的岗位ID') diff --git a/dash-fastapi-backend/module_admin/entity/vo/role_vo.py b/dash-fastapi-backend/module_admin/entity/vo/role_vo.py index d6f60bc..37a4c41 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/role_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/role_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size from typing import List, Literal, Optional, Union from module_admin.annotation.pydantic_annotation import as_form, as_query @@ -11,7 +10,7 @@ class RoleModel(BaseModel): 角色表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) role_id: Optional[int] = Field(default=None, description='角色ID') role_name: Optional[str] = Field(default=None, description='角色名称') @@ -78,7 +77,7 @@ class RoleMenuModel(BaseModel): 角色和菜单关联表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) role_id: Optional[int] = Field(default=None, description='角色ID') menu_id: Optional[int] = Field(default=None, description='菜单ID') @@ -89,7 +88,7 @@ class RoleDeptModel(BaseModel): 角色和部门关联表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) role_id: Optional[int] = Field(default=None, description='角色ID') dept_id: Optional[int] = Field(default=None, description='部门ID') @@ -120,8 +119,6 @@ class RoleMenuQueryModel(BaseModel): 角色菜单查询模型 """ - model_config = ConfigDict(alias_generator=to_camel) - menus: List = Field(default=[], description='菜单信息') checked_keys: List[int] = Field(default=[], description='已选择的菜单ID信息') @@ -131,8 +128,6 @@ class RoleDeptQueryModel(BaseModel): 角色部门查询模型 """ - model_config = ConfigDict(alias_generator=to_camel) - depts: List = Field(default=[], description='部门信息') checked_keys: List[int] = Field(default=[], description='已选择的部门ID信息') @@ -152,8 +147,6 @@ class DeleteRoleModel(BaseModel): 删除角色模型 """ - model_config = ConfigDict(alias_generator=to_camel) - role_ids: str = Field(description='需要删除的菜单ID') update_by: Optional[str] = Field(default=None, description='更新者') update_time: Optional[datetime] = Field(default=None, description='更新时间') diff --git a/dash-fastapi-backend/module_admin/entity/vo/server_vo.py b/dash-fastapi-backend/module_admin/entity/vo/server_vo.py index 810ecac..9a3e914 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/server_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/server_vo.py @@ -1,11 +1,8 @@ -from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel +from pydantic import BaseModel, Field from typing import List, Optional class CpuInfo(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - cpu_num: Optional[int] = Field(default=None, description='核心数') used: Optional[float] = Field(default=None, description='CPU用户使用率') sys: Optional[float] = Field(default=None, description='CPU系统使用率') @@ -13,8 +10,6 @@ class CpuInfo(BaseModel): class MemoryInfo(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - total: Optional[str] = Field(default=None, description='内存总量') used: Optional[str] = Field(default=None, description='已用内存') free: Optional[str] = Field(default=None, description='剩余内存') @@ -22,8 +17,6 @@ class MemoryInfo(BaseModel): class SysInfo(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - computer_ip: Optional[str] = Field(default=None, description='服务器IP') computer_name: Optional[str] = Field(default=None, description='服务器名称') os_arch: Optional[str] = Field(default=None, description='系统架构') @@ -32,8 +25,6 @@ class SysInfo(BaseModel): class PyInfo(MemoryInfo): - model_config = ConfigDict(alias_generator=to_camel) - name: Optional[str] = Field(default=None, description='Python名称') version: Optional[str] = Field(default=None, description='Python版本') start_time: Optional[str] = Field(default=None, description='启动时间') @@ -42,8 +33,6 @@ class PyInfo(MemoryInfo): class SysFiles(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - dir_name: Optional[str] = Field(default=None, description='盘符路径') sys_type_name: Optional[str] = Field(default=None, description='盘符类型') type_name: Optional[str] = Field(default=None, description='文件类型') @@ -58,8 +47,6 @@ class ServerMonitorModel(BaseModel): 服务监控对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel) - cpu: Optional[CpuInfo] = Field(description='CPU相关信息') py: Optional[PyInfo] = Field(description='Python相关信息') mem: Optional[MemoryInfo] = Field(description='內存相关信息') diff --git a/dash-fastapi-backend/module_admin/entity/vo/user_vo.py b/dash-fastapi-backend/module_admin/entity/vo/user_vo.py index 67a1d14..a7dddf4 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/user_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/user_vo.py @@ -1,7 +1,6 @@ import re from datetime import datetime from pydantic import BaseModel, ConfigDict, Field, model_validator -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import Network, NotBlank, Size, Xss from typing import List, Literal, Optional, Union from exceptions.exception import ModelValidatorException @@ -24,7 +23,7 @@ class UserModel(BaseModel): 用户表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) user_id: Optional[int] = Field(default=None, description='用户ID') dept_id: Optional[int] = Field(default=None, description='部门ID') @@ -95,7 +94,7 @@ class UserRoleModel(BaseModel): 用户和角色关联表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) user_id: Optional[int] = Field(default=None, description='用户ID') role_id: Optional[int] = Field(default=None, description='角色ID') @@ -106,7 +105,7 @@ class UserPostModel(BaseModel): 用户与岗位关联表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) user_id: Optional[int] = Field(default=None, description='用户ID') post_id: Optional[int] = Field(default=None, description='岗位ID') @@ -120,8 +119,6 @@ class UserInfoModel(UserModel): class CurrentUserModel(BaseModel): - model_config = ConfigDict(alias_generator=to_camel) - permissions: List = Field(description='权限信息') roles: List = Field(description='角色信息') user: Union[UserInfoModel, None] = Field(description='用户信息') @@ -132,8 +129,6 @@ class UserDetailModel(BaseModel): 获取用户详情信息响应模型 """ - model_config = ConfigDict(alias_generator=to_camel) - data: Optional[Union[UserInfoModel, None]] = Field(default=None, description='用户信息') post_ids: Optional[List] = Field(default=None, description='岗位ID信息') posts: List[Union[PostModel, None]] = Field(description='岗位信息') @@ -146,8 +141,6 @@ class UserProfileModel(BaseModel): 获取个人信息响应模型 """ - model_config = ConfigDict(alias_generator=to_camel) - data: Union[UserInfoModel, None] = Field(description='用户信息') post_group: Union[str, None] = Field(description='岗位信息') role_group: Union[str, None] = Field(description='角色信息') @@ -197,8 +190,6 @@ class ResetPasswordModel(BaseModel): 重置密码模型 """ - model_config = ConfigDict(alias_generator=to_camel) - old_password: Optional[str] = Field(default=None, description='旧密码') new_password: Optional[str] = Field(default=None, description='新密码') @@ -226,8 +217,6 @@ class DeleteUserModel(BaseModel): 删除用户模型 """ - model_config = ConfigDict(alias_generator=to_camel) - user_ids: str = Field(description='需要删除的用户ID') update_by: Optional[str] = Field(default=None, description='更新者') update_time: Optional[datetime] = Field(default=None, description='更新时间') @@ -264,8 +253,6 @@ class UserRoleResponseModel(BaseModel): 用户角色关联管理列表返回模型 """ - model_config = ConfigDict(alias_generator=to_camel) - roles: List[Union[SelectedRoleModel, None]] = Field(default=[], description='角色信息') user: UserInfoModel = Field(description='用户信息') @@ -276,8 +263,6 @@ class CrudUserRoleModel(BaseModel): 新增、删除用户关联角色及角色关联用户模型 """ - model_config = ConfigDict(alias_generator=to_camel) - user_id: Optional[int] = Field(default=None, description='用户ID') user_ids: Optional[str] = Field(default=None, description='用户ID信息') role_id: Optional[int] = Field(default=None, description='角色ID') -- Gitee From 56a8c4c6bcafeda55d67e95dbc1074fb8f4d1640 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 28 Aug 2024 21:13:27 +0800 Subject: [PATCH 003/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4menu=5Fvo?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/entity/vo/menu_vo.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py b/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py index 9dc8d75..a8fb783 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py @@ -1,6 +1,5 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field -from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional from module_admin.annotation.pydantic_annotation import as_query @@ -11,7 +10,7 @@ class MenuModel(BaseModel): 菜单表对应pydantic模型 """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + model_config = ConfigDict(from_attributes=True) menu_id: Optional[int] = Field(default=None, description='菜单ID') menu_name: Optional[str] = Field(default=None, description='菜单名称') @@ -83,6 +82,4 @@ class DeleteMenuModel(BaseModel): 删除菜单模型 """ - model_config = ConfigDict(alias_generator=to_camel) - menu_ids: str = Field(description='需要删除的菜单ID') -- Gitee From a5caa2c57024df63b4bf335cf0f3bf81413bc728 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 28 Aug 2024 21:38:12 +0800 Subject: [PATCH 004/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4controlle?= =?UTF-8?q?r=E5=B1=82vo=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/captcha_controller.py | 2 +- .../controller/config_controller.py | 2 +- .../controller/dept_controller.py | 4 +- .../controller/dict_controller.py | 4 +- .../module_admin/controller/job_controller.py | 10 ++-- .../module_admin/controller/log_controller.py | 6 +-- .../controller/login_controller.py | 6 +-- .../controller/menu_controller.py | 2 +- .../controller/notice_controller.py | 2 +- .../controller/online_controller.py | 2 +- .../module_admin/controller/post_controler.py | 2 +- .../controller/role_controller.py | 22 ++++---- .../controller/user_controller.py | 52 +++++++++---------- 13 files changed, 58 insertions(+), 58 deletions(-) diff --git a/dash-fastapi-backend/module_admin/controller/captcha_controller.py b/dash-fastapi-backend/module_admin/controller/captcha_controller.py index 83d35b8..35beeda 100644 --- a/dash-fastapi-backend/module_admin/controller/captcha_controller.py +++ b/dash-fastapi-backend/module_admin/controller/captcha_controller.py @@ -35,6 +35,6 @@ async def get_captcha_image(request: Request): return ResponseUtil.success( model_content=CaptchaCode( - captchaEnabled=captcha_enabled, registerEnabled=register_enabled, img=image, uuid=session_id + captcha_enabled=captcha_enabled, register_enabled=register_enabled, img=image, uuid=session_id ) ) diff --git a/dash-fastapi-backend/module_admin/controller/config_controller.py b/dash-fastapi-backend/module_admin/controller/config_controller.py index d594da8..e75ec6d 100644 --- a/dash-fastapi-backend/module_admin/controller/config_controller.py +++ b/dash-fastapi-backend/module_admin/controller/config_controller.py @@ -82,7 +82,7 @@ async def refresh_system_config(request: Request, query_db: AsyncSession = Depen @configController.delete('/{config_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) @Log(title='参数管理', business_type=BusinessType.DELETE) async def delete_system_config(request: Request, config_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_config = DeleteConfigModel(configIds=config_ids) + delete_config = DeleteConfigModel(config_ids=config_ids) delete_config_result = await ConfigService.delete_config_services(request, query_db, delete_config) logger.info(delete_config_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/dept_controller.py b/dash-fastapi-backend/module_admin/controller/dept_controller.py index 2943206..d84691b 100644 --- a/dash-fastapi-backend/module_admin/controller/dept_controller.py +++ b/dash-fastapi-backend/module_admin/controller/dept_controller.py @@ -30,7 +30,7 @@ async def get_system_dept_tree_for_edit_option( query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept')), ): - dept_query = DeptModel(deptId=dept_id) + dept_query = DeptModel(dept_id=dept_id) dept_query_result = await DeptService.get_dept_for_edit_option_services(query_db, dept_query, data_scope_sql) logger.info('获取成功') @@ -105,7 +105,7 @@ async def delete_system_dept( for dept_id in dept_id_list: if not current_user.user.admin: await DeptService.check_dept_data_scope_services(query_db, int(dept_id), data_scope_sql) - delete_dept = DeleteDeptModel(deptIds=dept_ids) + delete_dept = DeleteDeptModel(dept_ids=dept_ids) delete_dept.update_by = current_user.user.user_name delete_dept.update_time = datetime.now() delete_dept_result = await DeptService.delete_dept_services(query_db, delete_dept) diff --git a/dash-fastapi-backend/module_admin/controller/dict_controller.py b/dash-fastapi-backend/module_admin/controller/dict_controller.py index f86dbac..afd27b2 100644 --- a/dash-fastapi-backend/module_admin/controller/dict_controller.py +++ b/dash-fastapi-backend/module_admin/controller/dict_controller.py @@ -92,7 +92,7 @@ async def refresh_system_dict(request: Request, query_db: AsyncSession = Depends @dictController.delete('/type/{dict_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:remove'))]) @Log(title='字典类型', business_type=BusinessType.DELETE) async def delete_system_dict_type(request: Request, dict_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_dict_type = DeleteDictTypeModel(dictIds=dict_ids) + delete_dict_type = DeleteDictTypeModel(dict_ids=dict_ids) delete_dict_type_result = await DictTypeService.delete_dict_type_services(request, query_db, delete_dict_type) logger.info(delete_dict_type_result.message) @@ -203,7 +203,7 @@ async def edit_system_dict_data( @dictController.delete('/data/{dict_codes}', dependencies=[Depends(CheckUserInterfaceAuth('system:dict:remove'))]) @Log(title='字典数据', business_type=BusinessType.DELETE) async def delete_system_dict_data(request: Request, dict_codes: str, query_db: AsyncSession = Depends(get_db)): - delete_dict_data = DeleteDictDataModel(dictCodes=dict_codes) + delete_dict_data = DeleteDictDataModel(dict_codes=dict_codes) delete_dict_data_result = await DictDataService.delete_dict_data_services(request, query_db, delete_dict_data) logger.info(delete_dict_data_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/job_controller.py b/dash-fastapi-backend/module_admin/controller/job_controller.py index 0c08fff..8c36db8 100644 --- a/dash-fastapi-backend/module_admin/controller/job_controller.py +++ b/dash-fastapi-backend/module_admin/controller/job_controller.py @@ -87,10 +87,10 @@ async def change_system_job_status( current_user: CurrentUserModel = Depends(LoginService.get_current_user), ): edit_job = EditJobModel( - jobId=change_job.job_id, + job_id=change_job.job_id, status=change_job.status, - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), type='status', ) edit_job_result = await JobService.edit_job_services(query_db, edit_job) @@ -111,7 +111,7 @@ async def execute_system_job(request: Request, execute_job: JobModel, query_db: @jobController.delete('/job/{job_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) @Log(title='定时任务', business_type=BusinessType.DELETE) async def delete_system_job(request: Request, job_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_job = DeleteJobModel(jobIds=job_ids) + delete_job = DeleteJobModel(job_ids=job_ids) delete_job_result = await JobService.delete_job_services(query_db, delete_job) logger.info(delete_job_result.message) @@ -172,7 +172,7 @@ async def clear_system_job_log(request: Request, query_db: AsyncSession = Depend @jobController.delete('/jobLog/{job_log_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:job:remove'))]) @Log(title='定时任务调度日志', business_type=BusinessType.DELETE) async def delete_system_job_log(request: Request, job_log_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_job_log = DeleteJobLogModel(jobLogIds=job_log_ids) + delete_job_log = DeleteJobLogModel(job_log_ids=job_log_ids) delete_job_log_result = await JobLogService.delete_job_log_services(query_db, delete_job_log) logger.info(delete_job_log_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/log_controller.py b/dash-fastapi-backend/module_admin/controller/log_controller.py index 4d0b55c..b95136f 100644 --- a/dash-fastapi-backend/module_admin/controller/log_controller.py +++ b/dash-fastapi-backend/module_admin/controller/log_controller.py @@ -53,7 +53,7 @@ async def clear_system_operation_log(request: Request, query_db: AsyncSession = @logController.delete('/operlog/{oper_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) @Log(title='操作日志', business_type=BusinessType.DELETE) async def delete_system_operation_log(request: Request, oper_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_operation_log = DeleteOperLogModel(operIds=oper_ids) + delete_operation_log = DeleteOperLogModel(oper_ids=oper_ids) delete_operation_log_result = await OperationLogService.delete_operation_log_services( query_db, delete_operation_log ) @@ -114,7 +114,7 @@ async def clear_system_login_log(request: Request, query_db: AsyncSession = Depe ) @Log(title='登录日志', business_type=BusinessType.DELETE) async def delete_system_login_log(request: Request, info_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_login_log = DeleteLoginLogModel(infoIds=info_ids) + delete_login_log = DeleteLoginLogModel(info_ids=info_ids) delete_login_log_result = await LoginLogService.delete_login_log_services(query_db, delete_login_log) logger.info(delete_login_log_result.message) @@ -126,7 +126,7 @@ async def delete_system_login_log(request: Request, info_ids: str, query_db: Asy ) @Log(title='账户解锁', business_type=BusinessType.OTHER) async def unlock_system_user(request: Request, user_name: str, query_db: AsyncSession = Depends(get_db)): - unlock_user = UnlockUser(userName=user_name) + unlock_user = UnlockUser(user_name=user_name) unlock_user_result = await LoginLogService.unlock_user_services(request, unlock_user) logger.info(unlock_user_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/login_controller.py b/dash-fastapi-backend/module_admin/controller/login_controller.py index 6d13fcc..e6a5916 100644 --- a/dash-fastapi-backend/module_admin/controller/login_controller.py +++ b/dash-fastapi-backend/module_admin/controller/login_controller.py @@ -32,12 +32,12 @@ async def login( else False ) user = UserLogin( - userName=form_data.username, + user_name=form_data.username, password=form_data.password, code=form_data.code, uuid=form_data.uuid, - loginInfo=form_data.login_info, - captchaEnabled=captcha_enabled, + login_info=form_data.login_info, + captcha_enabled=captcha_enabled, ) result = await LoginService.authenticate_user(request, query_db, user) access_token_expires = timedelta(minutes=JwtConfig.jwt_expire_minutes) diff --git a/dash-fastapi-backend/module_admin/controller/menu_controller.py b/dash-fastapi-backend/module_admin/controller/menu_controller.py index 0e3124e..b3e8aca 100644 --- a/dash-fastapi-backend/module_admin/controller/menu_controller.py +++ b/dash-fastapi-backend/module_admin/controller/menu_controller.py @@ -97,7 +97,7 @@ async def edit_system_menu( @menuController.delete('/{menu_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:menu:remove'))]) @Log(title='菜单管理', business_type=BusinessType.DELETE) async def delete_system_menu(request: Request, menu_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_menu = DeleteMenuModel(menuIds=menu_ids) + delete_menu = DeleteMenuModel(menu_ids=menu_ids) delete_menu_result = await MenuService.delete_menu_services(query_db, delete_menu) logger.info(delete_menu_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/notice_controller.py b/dash-fastapi-backend/module_admin/controller/notice_controller.py index e1e4aa1..a7f46d0 100644 --- a/dash-fastapi-backend/module_admin/controller/notice_controller.py +++ b/dash-fastapi-backend/module_admin/controller/notice_controller.py @@ -72,7 +72,7 @@ async def edit_system_notice( @noticeController.delete('/{notice_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:notice:remove'))]) @Log(title='通知公告', business_type=BusinessType.DELETE) async def delete_system_notice(request: Request, notice_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_notice = DeleteNoticeModel(noticeIds=notice_ids) + delete_notice = DeleteNoticeModel(notice_ids=notice_ids) delete_notice_result = await NoticeService.delete_notice_services(query_db, delete_notice) logger.info(delete_notice_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/online_controller.py b/dash-fastapi-backend/module_admin/controller/online_controller.py index bf65c8f..03eb70f 100644 --- a/dash-fastapi-backend/module_admin/controller/online_controller.py +++ b/dash-fastapi-backend/module_admin/controller/online_controller.py @@ -33,7 +33,7 @@ async def get_monitor_online_list( @onlineController.delete('/{token_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:forceLogout'))]) @Log(title='在线用户', business_type=BusinessType.FORCE) async def delete_monitor_online(request: Request, token_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_online = DeleteOnlineModel(tokenIds=token_ids) + delete_online = DeleteOnlineModel(token_ids=token_ids) delete_online_result = await OnlineService.delete_online_services(request, delete_online) logger.info(delete_online_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/post_controler.py b/dash-fastapi-backend/module_admin/controller/post_controler.py index 4219076..8b9d6c5 100644 --- a/dash-fastapi-backend/module_admin/controller/post_controler.py +++ b/dash-fastapi-backend/module_admin/controller/post_controler.py @@ -73,7 +73,7 @@ async def edit_system_post( @postController.delete('/{post_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))]) @Log(title='岗位管理', business_type=BusinessType.DELETE) async def delete_system_post(request: Request, post_ids: str, query_db: AsyncSession = Depends(get_db)): - delete_post = DeletePostModel(postIds=post_ids) + delete_post = DeletePostModel(post_ids=post_ids) delete_post_result = await PostService.delete_post_services(query_db, delete_post) logger.info(delete_post_result.message) diff --git a/dash-fastapi-backend/module_admin/controller/role_controller.py b/dash-fastapi-backend/module_admin/controller/role_controller.py index e092bcc..a9215e9 100644 --- a/dash-fastapi-backend/module_admin/controller/role_controller.py +++ b/dash-fastapi-backend/module_admin/controller/role_controller.py @@ -108,12 +108,12 @@ async def edit_system_role_datascope( if not current_user.user.admin: await RoleService.check_role_data_scope_services(query_db, str(role_data_scope.role_id), data_scope_sql) edit_role = AddRoleModel( - roleId=role_data_scope.role_id, - dataScope=role_data_scope.data_scope, - deptIds=role_data_scope.dept_ids, - deptCheckStrictly=role_data_scope.dept_check_strictly, - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + role_id=role_data_scope.role_id, + data_scope=role_data_scope.data_scope, + dept_ids=role_data_scope.dept_ids, + dept_check_strictly=role_data_scope.dept_check_strictly, + update_by=current_user.user.user_name, + update_time=datetime.now(), ) role_data_scope_result = await RoleService.role_datascope_services(query_db, edit_role) logger.info(role_data_scope_result.message) @@ -133,10 +133,10 @@ async def delete_system_role( role_id_list = role_ids.split(',') if role_ids else [] if role_id_list: for role_id in role_id_list: - await RoleService.check_role_allowed_services(RoleModel(roleId=int(role_id))) + await RoleService.check_role_allowed_services(RoleModel(role_id=int(role_id))) if not current_user.user.admin: await RoleService.check_role_data_scope_services(query_db, role_id, data_scope_sql) - delete_role = DeleteRoleModel(roleIds=role_ids, updateBy=current_user.user.user_name, updateTime=datetime.now()) + delete_role = DeleteRoleModel(role_ids=role_ids, update_by=current_user.user.user_name, update_time=datetime.now()) delete_role_result = await RoleService.delete_role_services(query_db, delete_role) logger.info(delete_role_result.message) @@ -192,10 +192,10 @@ async def reset_system_role_status( if not current_user.user.admin: await RoleService.check_role_data_scope_services(query_db, str(change_role.role_id), data_scope_sql) edit_role = AddRoleModel( - roleId=change_role.role_id, + role_id=change_role.role_id, status=change_role.status, - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), type='status', ) edit_role_result = await RoleService.edit_role_services(query_db, edit_role) diff --git a/dash-fastapi-backend/module_admin/controller/user_controller.py b/dash-fastapi-backend/module_admin/controller/user_controller.py index 253535c..81838f3 100644 --- a/dash-fastapi-backend/module_admin/controller/user_controller.py +++ b/dash-fastapi-backend/module_admin/controller/user_controller.py @@ -140,10 +140,10 @@ async def delete_system_user( return ResponseUtil.failure(msg='当前登录用户不能删除') for user_id in user_id_list: - await UserService.check_user_allowed_services(UserModel(userId=int(user_id))) + await UserService.check_user_allowed_services(UserModel(user_id=int(user_id))) if not current_user.user.admin: await UserService.check_user_data_scope_services(query_db, int(user_id), data_scope_sql) - delete_user = DeleteUserModel(userIds=user_ids, updateBy=current_user.user.user_name, updateTime=datetime.now()) + delete_user = DeleteUserModel(user_ids=user_ids, update_by=current_user.user.user_name, update_time=datetime.now()) delete_user_result = await UserService.delete_user_services(query_db, delete_user) logger.info(delete_user_result.message) @@ -163,10 +163,10 @@ async def reset_system_user_pwd( if not current_user.user.admin: await UserService.check_user_data_scope_services(query_db, reset_user.user_id, data_scope_sql) edit_user = EditUserModel( - userId=reset_user.user_id, + user_id=reset_user.user_id, password=PwdUtil.get_password_hash(reset_user.password), - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), type='pwd', ) edit_user_result = await UserService.edit_user_services(query_db, edit_user) @@ -188,10 +188,10 @@ async def change_system_user_status( if not current_user.user.admin: await UserService.check_user_data_scope_services(query_db, change_user.user_id, data_scope_sql) edit_user = EditUserModel( - userId=change_user.user_id, + user_id=change_user.user_id, status=change_user.status, - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), type='status', ) edit_user_result = await UserService.edit_user_services(query_db, edit_user) @@ -255,10 +255,10 @@ async def change_system_user_profile_avatar( with open(avatar_path, 'wb') as f: f.write(avatarfile) edit_user = EditUserModel( - userId=current_user.user.user_id, + user_id=current_user.user.user_id, avatar=f'{UploadConfig.UPLOAD_PREFIX}/{relative_path}/{avatar_name}', - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), type='avatar', ) edit_user_result = await UserService.edit_user_services(query_db, edit_user) @@ -277,13 +277,13 @@ async def change_system_user_profile_info( current_user: CurrentUserModel = Depends(LoginService.get_current_user), ): edit_user = EditUserModel( - **user_info.model_dump(exclude_unset=True, by_alias=True, exclude={'role_ids', 'post_ids'}), - userId=current_user.user.user_id, - userName=current_user.user.user_name, - updateBy=current_user.user.user_name, - updateTime=datetime.now(), - roleIds=current_user.user.role_ids.split(',') if current_user.user.role_ids else [], - postIds=current_user.user.post_ids.split(',') if current_user.user.post_ids else [], + **user_info.model_dump(exclude_unset=True, exclude={'role_ids', 'post_ids'}), + user_id=current_user.user.user_id, + user_name=current_user.user.user_name, + update_by=current_user.user.user_name, + update_time=datetime.now(), + role_ids=current_user.user.role_ids.split(',') if current_user.user.role_ids else [], + post_ids=current_user.user.post_ids.split(',') if current_user.user.post_ids else [], role=current_user.user.role, ) edit_user_result = await UserService.edit_user_services(query_db, edit_user) @@ -301,11 +301,11 @@ async def reset_system_user_password( current_user: CurrentUserModel = Depends(LoginService.get_current_user), ): reset_user = ResetUserModel( - userId=current_user.user.user_id, - oldPassword=reset_password.old_password, + user_id=current_user.user.user_id, + old_password=reset_password.old_password, password=reset_password.new_password, - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), ) reset_user_result = await UserService.reset_user_services(query_db, reset_user) logger.info(reset_user_result.message) @@ -364,7 +364,7 @@ async def export_system_user_list( dependencies=[Depends(CheckUserInterfaceAuth('system:user:query'))], ) async def get_system_allocated_role_list(request: Request, user_id: int, query_db: AsyncSession = Depends(get_db)): - user_role_query = UserRoleQueryModel(userId=user_id) + user_role_query = UserRoleQueryModel(user_id=user_id) user_role_allocated_query_result = await UserService.get_user_role_allocated_list_services( query_db, user_role_query ) @@ -381,8 +381,8 @@ async def get_system_allocated_role_list(request: Request, user_id: int, query_d @Log(title='用户管理', business_type=BusinessType.GRANT) async def update_system_role_user( request: Request, - user_id: int = Query(alias='userId'), - role_ids: str = Query(alias='roleIds'), + user_id: int = Query(), + role_ids: str = Query(), query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user), user_data_scope_sql: str = Depends(GetDataScope('SysUser')), @@ -392,7 +392,7 @@ async def update_system_role_user( await UserService.check_user_data_scope_services(query_db, user_id, user_data_scope_sql) await RoleService.check_role_data_scope_services(query_db, role_ids, role_data_scope_sql) add_user_role_result = await UserService.add_user_role_services( - query_db, CrudUserRoleModel(userId=user_id, roleIds=role_ids) + query_db, CrudUserRoleModel(user_id=user_id, role_ids=role_ids) ) logger.info(add_user_role_result.message) -- Gitee From 886199390f3cebffc4956523aee2fe12985b7419 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 29 Aug 2024 23:28:37 +0800 Subject: [PATCH 005/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4role=5Fco?= =?UTF-8?q?ntroller=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/controller/role_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/controller/role_controller.py b/dash-fastapi-backend/module_admin/controller/role_controller.py index a9215e9..0b6fa45 100644 --- a/dash-fastapi-backend/module_admin/controller/role_controller.py +++ b/dash-fastapi-backend/module_admin/controller/role_controller.py @@ -158,7 +158,7 @@ async def query_detail_system_role( role_detail_result = await RoleService.role_detail_services(query_db, role_id) logger.info(f'获取role_id为{role_id}的信息成功') - return ResponseUtil.success(data=role_detail_result.model_dump(by_alias=True)) + return ResponseUtil.success(data=role_detail_result.model_dump()) @roleController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('system:role:export'))]) -- Gitee From b23188bc54ac26b72c67458aaf6961b2bb9de332 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 29 Aug 2024 23:29:12 +0800 Subject: [PATCH 006/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9ESqlalchemySer?= =?UTF-8?q?ializeUtil=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/utils/common_util.py | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/dash-fastapi-backend/utils/common_util.py b/dash-fastapi-backend/utils/common_util.py index 853cfe3..52bc9fc 100644 --- a/dash-fastapi-backend/utils/common_util.py +++ b/dash-fastapi-backend/utils/common_util.py @@ -8,6 +8,7 @@ from openpyxl.utils import get_column_letter from openpyxl.worksheet.datavalidation import DataValidation from sqlalchemy.engine.row import Row from typing import List +from config.database import Base from config.env import CachePathConfig @@ -38,6 +39,44 @@ def worship(): """) +class SqlalchemySerializeUtil: + """ + sqlalchemy查询结果序列化工具类 + """ + + @classmethod + def __to_dict(cls, obj: Base): + """ + 将sqlalchemy模型对象转换为字典 + + :param obj: sqlalchemy模型对象 + :return: 字典结果 + """ + base_dict = obj.__dict__ + base_dict.pop('_sa_instance_state', None) + + return base_dict + + @classmethod + def serialize_result(cls, result): + """ + 将sqlalchemy查询结果序列化 + + :param result: sqlalchemy查询结果 + :return: 序列化结果 + """ + if isinstance(result, Base): + return cls.__to_dict(result) + elif isinstance(result, list): + return [cls.serialize_result(row) for row in result] + elif isinstance(result, Row): + if all([isinstance(row, Base) for row in result]): + return [cls.__to_dict(row) for row in result] + else: + return result._asdict() + return result + + class CamelCaseUtil: """ 下划线形式(snake_case)转小驼峰形式(camelCase)工具方法 -- Gitee From 0b8ce7c6f0335594c33324adde5467918f696a8c Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 29 Aug 2024 23:30:03 +0800 Subject: [PATCH 007/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4service?= =?UTF-8?q?=E5=B1=82vo=E5=8F=8A=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/service/cache_service.py | 10 +- .../module_admin/service/common_service.py | 6 +- .../module_admin/service/config_service.py | 32 ++--- .../module_admin/service/dept_service.py | 18 +-- .../module_admin/service/dict_service.py | 82 +++++------ .../module_admin/service/job_log_service.py | 36 ++--- .../module_admin/service/job_service.py | 54 ++++---- .../module_admin/service/log_service.py | 42 +++--- .../module_admin/service/login_service.py | 20 +-- .../module_admin/service/menu_service.py | 16 +-- .../module_admin/service/notice_service.py | 6 +- .../module_admin/service/online_service.py | 7 +- .../module_admin/service/post_service.py | 26 ++-- .../module_admin/service/role_service.py | 48 +++---- .../module_admin/service/server_service.py | 14 +- .../module_admin/service/user_service.py | 128 ++++++++++-------- 16 files changed, 279 insertions(+), 266 deletions(-) diff --git a/dash-fastapi-backend/module_admin/service/cache_service.py b/dash-fastapi-backend/module_admin/service/cache_service.py index 72212cb..ccecf6c 100644 --- a/dash-fastapi-backend/module_admin/service/cache_service.py +++ b/dash-fastapi-backend/module_admin/service/cache_service.py @@ -24,7 +24,7 @@ class CacheService: command_stats = [ dict(name=key.split('_')[1], value=str(value.get('calls'))) for key, value in command_stats_dict.items() ] - result = CacheMonitorModel(commandStats=command_stats, dbSize=db_size, info=info) + result = CacheMonitorModel(command_stats=command_stats, db_size=db_size, info=info) return result @@ -39,9 +39,9 @@ class CacheService: for key_config in RedisInitKeyConfig: name_list.append( CacheInfoModel( - cacheKey='', - cacheName=key_config.key, - cacheValue='', + cache_key='', + cache_name=key_config.key, + cache_value='', remark=key_config.remark, ) ) @@ -74,7 +74,7 @@ class CacheService: """ cache_value = await request.app.state.redis.get(f'{cache_name}:{cache_key}') - return CacheInfoModel(cacheKey=cache_key, cacheName=cache_name, cacheValue=cache_value, remark='') + return CacheInfoModel(cache_key=cache_key, cache_name=cache_name, cache_value=cache_value, remark='') @classmethod async def clear_cache_monitor_cache_name_services(cls, request: Request, cache_name: str): diff --git a/dash-fastapi-backend/module_admin/service/common_service.py b/dash-fastapi-backend/module_admin/service/common_service.py index 20eb868..387ef33 100644 --- a/dash-fastapi-backend/module_admin/service/common_service.py +++ b/dash-fastapi-backend/module_admin/service/common_service.py @@ -40,9 +40,9 @@ class CommonService: return CrudResponseModel( is_success=True, result=UploadResponseModel( - fileName=f'{UploadConfig.UPLOAD_PREFIX}/{relative_path}/{filename}', - newFileName=filename, - originalFilename=file.filename, + file_name=f'{UploadConfig.UPLOAD_PREFIX}/{relative_path}/{filename}', + new_fileName=filename, + original_filename=file.filename, url=f'{request.base_url}{UploadConfig.UPLOAD_PREFIX[1:]}/{relative_path}/{filename}', ), message='上传成功', diff --git a/dash-fastapi-backend/module_admin/service/config_service.py b/dash-fastapi-backend/module_admin/service/config_service.py index 1d8ec76..f60bece 100644 --- a/dash-fastapi-backend/module_admin/service/config_service.py +++ b/dash-fastapi-backend/module_admin/service/config_service.py @@ -7,7 +7,7 @@ from exceptions.exception import ServiceException from module_admin.dao.config_dao import ConfigDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel, DeleteConfigModel -from utils.common_util import CamelCaseUtil, export_list2excel +from utils.common_util import export_list2excel, SqlalchemySerializeUtil class ConfigService: @@ -75,7 +75,7 @@ class ConfigService: :return: 校验结果 """ config_id = -1 if page_object.config_id is None else page_object.config_id - config = await ConfigDao.get_config_detail_by_info(query_db, ConfigModel(configKey=page_object.config_key)) + config = await ConfigDao.get_config_detail_by_info(query_db, ConfigModel(config_key=page_object.config_key)) if config and config.config_id != config_id: return CommonConstant.NOT_UNIQUE return CommonConstant.UNIQUE @@ -156,7 +156,7 @@ class ConfigService: if config_info.config_type == CommonConstant.YES: raise ServiceException(message=f'内置参数{config_info.config_key}不能删除') else: - await ConfigDao.delete_config_dao(query_db, ConfigModel(configId=int(config_id))) + await ConfigDao.delete_config_dao(query_db, ConfigModel(config_id=int(config_id))) delete_config_key_list.append(f'{RedisInitKeyConfig.SYS_CONFIG.key}:{config_info.config_key}') await query_db.commit() if delete_config_key_list: @@ -179,7 +179,7 @@ class ConfigService: """ config = await ConfigDao.get_config_detail_by_id(query_db, config_id=config_id) if config: - result = ConfigModel(**CamelCaseUtil.transform_result(config)) + result = ConfigModel(**SqlalchemySerializeUtil.serialize_result(config)) else: result = ConfigModel(**dict()) @@ -195,25 +195,25 @@ class ConfigService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'configId': '参数主键', - 'configName': '参数名称', - 'configKey': '参数键名', - 'configValue': '参数键值', - 'configType': '系统内置', - 'createBy': '创建者', - 'createTime': '创建时间', - 'updateBy': '更新者', - 'updateTime': '更新时间', + 'config_id': '参数主键', + 'config_name': '参数名称', + 'config_key': '参数键名', + 'config_value': '参数键值', + 'config_type': '系统内置', + 'create_by': '创建者', + 'create_time': '创建时间', + 'update_by': '更新者', + 'update_time': '更新时间', 'remark': '备注', } data = config_list for item in data: - if item.get('configType') == 'Y': - item['configType'] = '是' + if item.get('config_type') == 'Y': + item['config_type'] = '是' else: - item['configType'] = '否' + item['config_type'] = '否' new_data = [ {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data ] diff --git a/dash-fastapi-backend/module_admin/service/dept_service.py b/dash-fastapi-backend/module_admin/service/dept_service.py index a0e49e5..b189347 100644 --- a/dash-fastapi-backend/module_admin/service/dept_service.py +++ b/dash-fastapi-backend/module_admin/service/dept_service.py @@ -4,7 +4,7 @@ from exceptions.exception import ServiceException, ServiceWarning from module_admin.dao.dept_dao import DeptDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.dept_vo import DeleteDeptModel, DeptModel -from utils.common_util import CamelCaseUtil +from utils.common_util import SqlalchemySerializeUtil class DeptService: @@ -41,7 +41,7 @@ class DeptService: """ dept_list_result = await DeptDao.get_dept_info_for_edit_option(query_db, page_object, data_scope_sql) - return CamelCaseUtil.transform_result(dept_list_result) + return SqlalchemySerializeUtil.serialize_result(dept_list_result) @classmethod async def get_dept_list_services(cls, query_db: AsyncSession, page_object: DeptModel, data_scope_sql: str): @@ -55,7 +55,7 @@ class DeptService: """ dept_list_result = await DeptDao.get_dept_list(query_db, page_object, data_scope_sql) - return CamelCaseUtil.transform_result(dept_list_result) + return SqlalchemySerializeUtil.serialize_result(dept_list_result) @classmethod async def check_dept_data_scope_services(cls, query_db: AsyncSession, dept_id: int, data_scope_sql: str): @@ -67,7 +67,7 @@ class DeptService: :param data_scope_sql: 数据权限对应的查询sql语句 :return: 校验结果 """ - depts = await DeptDao.get_dept_list(query_db, DeptModel(deptId=dept_id), data_scope_sql) + depts = await DeptDao.get_dept_list(query_db, DeptModel(dept_id=dept_id), data_scope_sql) if depts: return CrudResponseModel(is_success=True, message='校验通过') else: @@ -84,7 +84,7 @@ class DeptService: """ dept_id = -1 if page_object.dept_id is None else page_object.dept_id dept = await DeptDao.get_dept_detail_by_info( - query_db, DeptModel(deptName=page_object.dept_name, parentId=page_object.parent_id) + query_db, DeptModel(dept_name=page_object.dept_name, parent_id=page_object.parent_id) ) if dept and dept.dept_id != dept_id: return CommonConstant.NOT_UNIQUE @@ -171,7 +171,7 @@ class DeptService: elif (await DeptDao.count_dept_user_dao(query_db, int(dept_id))) > 0: raise ServiceWarning(message='部门存在用户,不允许删除') - await DeptDao.delete_dept_dao(query_db, DeptModel(deptId=dept_id)) + await DeptDao.delete_dept_dao(query_db, DeptModel(dept_id=dept_id)) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: @@ -191,7 +191,7 @@ class DeptService: """ dept = await DeptDao.get_dept_detail_by_id(query_db, dept_id=dept_id) if dept: - result = DeptModel(**CamelCaseUtil.transform_result(dept)) + result = DeptModel(**SqlalchemySerializeUtil.serialize_result(dept)) else: result = DeptModel(**dict()) @@ -206,7 +206,7 @@ class DeptService: :return: 部门树形嵌套数据 """ permission_list = [ - dict(id=item.dept_id, label=item.dept_name, parentId=item.parent_id) for item in permission_list + dict(id=item.dept_id, label=item.dept_name, parent_id=item.parent_id) for item in permission_list ] # 转成id为key的字典 mapping: dict = dict(zip([i['id'] for i in permission_list], permission_list)) @@ -216,7 +216,7 @@ class DeptService: for d in permission_list: # 如果找不到父级项,则是根节点 - parent: dict = mapping.get(d['parentId']) + parent: dict = mapping.get(d['parent_id']) if parent is None: container.append(d) else: diff --git a/dash-fastapi-backend/module_admin/service/dict_service.py b/dash-fastapi-backend/module_admin/service/dict_service.py index 5354083..8c871e4 100644 --- a/dash-fastapi-backend/module_admin/service/dict_service.py +++ b/dash-fastapi-backend/module_admin/service/dict_service.py @@ -15,7 +15,7 @@ from module_admin.entity.vo.dict_vo import ( DictTypeModel, DictTypePageQueryModel, ) -from utils.common_util import CamelCaseUtil, export_list2excel +from utils.common_util import export_list2excel, SqlalchemySerializeUtil class DictTypeService: @@ -50,7 +50,7 @@ class DictTypeService: """ dict_id = -1 if page_object.dict_id is None else page_object.dict_id dict_type = await DictTypeDao.get_dict_type_detail_by_info( - query_db, DictTypeModel(dictType=page_object.dict_type) + query_db, DictTypeModel(dict_type=page_object.dict_type) ) if dict_type and dict_type.dict_id != dict_id: return CommonConstant.NOT_UNIQUE @@ -97,20 +97,20 @@ class DictTypeService: raise ServiceException(message=f'修改字典{page_object.dict_name}失败,字典类型已存在') else: try: - query_dict_data = DictDataPageQueryModel(dictType=dict_type_info.dict_type) + query_dict_data = DictDataPageQueryModel(dict_type=dict_type_info.dict_type) dict_data_list = await DictDataDao.get_dict_data_list(query_db, query_dict_data, is_page=False) if dict_type_info.dict_type != page_object.dict_type: for dict_data in dict_data_list: edit_dict_data = DictDataModel( - dictCode=dict_data.dict_code, - dictType=page_object.dict_type, - updateBy=page_object.update_by, + dict_code=dict_data.dict_code, + dict_type=page_object.dict_type, + update_by=page_object.update_by, ).model_dump(exclude_unset=True) await DictDataDao.edit_dict_data_dao(query_db, edit_dict_data) await DictTypeDao.edit_dict_type_dao(query_db, edit_dict_type) await query_db.commit() if dict_type_info.dict_type != page_object.dict_type: - dict_data = [CamelCaseUtil.transform_result(row) for row in dict_data_list if row] + dict_data = [SqlalchemySerializeUtil.serialize_result(row) for row in dict_data_list if row] await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', json.dumps(dict_data, ensure_ascii=False, default=str), @@ -142,7 +142,7 @@ class DictTypeService: dict_type_into = await cls.dict_type_detail_services(query_db, int(dict_id)) if (await DictDataDao.count_dict_data_dao(query_db, dict_type_into.dict_type)) > 0: raise ServiceException(message=f'{dict_type_into.dict_name}已分配,不能删除') - await DictTypeDao.delete_dict_type_dao(query_db, DictTypeModel(dictId=int(dict_id))) + await DictTypeDao.delete_dict_type_dao(query_db, DictTypeModel(dict_id=int(dict_id))) delete_dict_type_list.append(f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type_into.dict_type}') await query_db.commit() if delete_dict_type_list: @@ -165,7 +165,7 @@ class DictTypeService: """ dict_type = await DictTypeDao.get_dict_type_detail_by_id(query_db, dict_id=dict_id) if dict_type: - result = DictTypeModel(**CamelCaseUtil.transform_result(dict_type)) + result = DictTypeModel(**SqlalchemySerializeUtil.serialize_result(dict_type)) else: result = DictTypeModel(**dict()) @@ -181,14 +181,14 @@ class DictTypeService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'dictId': '字典编号', - 'dictName': '字典名称', - 'dictType': '字典类型', + 'dict_id': '字典编号', + 'dict_name': '字典名称', + 'dict_type': '字典类型', 'status': '状态', - 'createBy': '创建者', - 'createTime': '创建时间', - 'updateBy': '更新者', - 'updateTime': '更新时间', + 'create_by': '创建者', + 'create_time': '创建时间', + 'update_by': '更新者', + 'update_time': '更新时间', 'remark': '备注', } @@ -273,7 +273,7 @@ class DictDataService: for dict_type_obj in [item for item in dict_type_all if item.status == '0']: dict_type = dict_type_obj.dict_type dict_data_list = await DictDataDao.query_dict_data_list(query_db, dict_type) - dict_data = [CamelCaseUtil.transform_result(row) for row in dict_data_list if row] + dict_data = [SqlalchemySerializeUtil.serialize_result(row) for row in dict_data_list if row] await redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type}', json.dumps(dict_data, ensure_ascii=False, default=str), @@ -293,7 +293,7 @@ class DictDataService: if dict_data_list_result: result = json.loads(dict_data_list_result) - return CamelCaseUtil.transform_result(result) + return SqlalchemySerializeUtil.serialize_result(result) @classmethod async def check_dict_data_unique_services(cls, query_db: AsyncSession, page_object: DictDataModel): @@ -331,7 +331,9 @@ class DictDataService: dict_data_list = await cls.query_dict_data_list_services(query_db, page_object.dict_type) await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', - json.dumps(CamelCaseUtil.transform_result(dict_data_list), ensure_ascii=False, default=str), + json.dumps( + SqlalchemySerializeUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str + ), ) return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: @@ -362,7 +364,9 @@ class DictDataService: dict_data_list = await cls.query_dict_data_list_services(query_db, page_object.dict_type) await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', - json.dumps(CamelCaseUtil.transform_result(dict_data_list), ensure_ascii=False, default=str), + json.dumps( + SqlalchemySerializeUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str + ), ) return CrudResponseModel(is_success=True, message='更新成功') except Exception as e: @@ -389,14 +393,16 @@ class DictDataService: delete_dict_type_list = [] for dict_code in dict_code_list: dict_data = await cls.dict_data_detail_services(query_db, int(dict_code)) - await DictDataDao.delete_dict_data_dao(query_db, DictDataModel(dictCode=dict_code)) + await DictDataDao.delete_dict_data_dao(query_db, DictDataModel(dict_code=dict_code)) delete_dict_type_list.append(dict_data.dict_type) await query_db.commit() for dict_type in list(set(delete_dict_type_list)): dict_data_list = await cls.query_dict_data_list_services(query_db, dict_type) await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type}', - json.dumps(CamelCaseUtil.transform_result(dict_data_list), ensure_ascii=False, default=str), + json.dumps( + SqlalchemySerializeUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str + ), ) return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: @@ -416,7 +422,7 @@ class DictDataService: """ dict_data = await DictDataDao.get_dict_data_detail_by_id(query_db, dict_code=dict_code) if dict_data: - result = DictDataModel(**CamelCaseUtil.transform_result(dict_data)) + result = DictDataModel(**SqlalchemySerializeUtil.serialize_result(dict_data)) else: result = DictDataModel(**dict()) @@ -432,19 +438,19 @@ class DictDataService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'dictCode': '字典编码', - 'dictSort': '字典标签', - 'dictLabel': '字典键值', - 'dictValue': '字典排序', - 'dictType': '字典类型', - 'cssClass': '样式属性', - 'listClass': '表格回显样式', - 'isDefault': '是否默认', + 'dict_code': '字典编码', + 'dict_sort': '字典标签', + 'dict_label': '字典键值', + 'dict_value': '字典排序', + 'dict_type': '字典类型', + 'css_class': '样式属性', + 'list_class': '表格回显样式', + 'is_default': '是否默认', 'status': '状态', - 'createBy': '创建者', - 'createTime': '创建时间', - 'updateBy': '更新者', - 'updateTime': '更新时间', + 'create_by': '创建者', + 'create_time': '创建时间', + 'update_by': '更新者', + 'update_time': '更新时间', 'remark': '备注', } @@ -455,10 +461,10 @@ class DictDataService: item['status'] = '正常' else: item['status'] = '停用' - if item.get('isDefault') == 'Y': - item['isDefault'] = '是' + if item.get('is_default') == 'Y': + item['is_default'] = '是' else: - item['isDefault'] = '否' + item['is_default'] = '否' new_data = [ {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data ] diff --git a/dash-fastapi-backend/module_admin/service/job_log_service.py b/dash-fastapi-backend/module_admin/service/job_log_service.py index f4c9f37..8ad7bfb 100644 --- a/dash-fastapi-backend/module_admin/service/job_log_service.py +++ b/dash-fastapi-backend/module_admin/service/job_log_service.py @@ -62,7 +62,7 @@ class JobLogService: job_log_id_list = page_object.job_log_ids.split(',') try: for job_log_id in job_log_id_list: - await JobLogDao.delete_job_log_dao(query_db, JobLogModel(jobLogId=job_log_id)) + await JobLogDao.delete_job_log_dao(query_db, JobLogModel(job_log_id=job_log_id)) await query_db.commit() result = dict(is_success=True, message='删除成功') except Exception as e: @@ -101,31 +101,31 @@ class JobLogService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'jobLogId': '任务日志编码', - 'jobName': '任务名称', - 'jobGroup': '任务组名', - 'jobExecutor': '任务执行器', - 'invokeTarget': '调用目标字符串', - 'jobArgs': '位置参数', - 'jobKwargs': '关键字参数', - 'jobTrigger': '任务触发器', - 'jobMessage': '日志信息', + 'job_log_id': '任务日志编码', + 'job_name': '任务名称', + 'job_group': '任务组名', + 'job_executor': '任务执行器', + 'invoke_target': '调用目标字符串', + 'job_args': '位置参数', + 'job_kwargs': '关键字参数', + 'job_trigger': '任务触发器', + 'job_message': '日志信息', 'status': '执行状态', - 'exceptionInfo': '异常信息', - 'createTime': '创建时间', + 'exception_info': '异常信息', + 'create_time': '创建时间', } data = job_log_list job_group_list = await DictDataService.query_dict_data_list_from_cache_services( request.app.state.redis, dict_type='sys_job_group' ) - job_group_option = [dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_group_list] + job_group_option = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in job_group_list] job_group_option_dict = {item.get('value'): item for item in job_group_option} job_executor_list = await DictDataService.query_dict_data_list_from_cache_services( request.app.state.redis, dict_type='sys_job_executor' ) job_executor_option = [ - dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_executor_list + dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in job_executor_list ] job_executor_option_dict = {item.get('value'): item for item in job_executor_option} @@ -134,10 +134,10 @@ class JobLogService: item['status'] = '正常' else: item['status'] = '暂停' - if str(item.get('jobGroup')) in job_group_option_dict.keys(): - item['jobGroup'] = job_group_option_dict.get(str(item.get('jobGroup'))).get('label') - if str(item.get('jobExecutor')) in job_executor_option_dict.keys(): - item['jobExecutor'] = job_executor_option_dict.get(str(item.get('jobExecutor'))).get('label') + if str(item.get('job_group')) in job_group_option_dict.keys(): + item['job_group'] = job_group_option_dict.get(str(item.get('job_group'))).get('label') + if str(item.get('job_executor')) in job_executor_option_dict.keys(): + item['job_executor'] = job_executor_option_dict.get(str(item.get('job_executor'))).get('label') new_data = [ {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data ] diff --git a/dash-fastapi-backend/module_admin/service/job_service.py b/dash-fastapi-backend/module_admin/service/job_service.py index 2c4c5bb..8464951 100644 --- a/dash-fastapi-backend/module_admin/service/job_service.py +++ b/dash-fastapi-backend/module_admin/service/job_service.py @@ -8,7 +8,7 @@ from module_admin.dao.job_dao import JobDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.job_vo import DeleteJobModel, EditJobModel, JobModel, JobPageQueryModel from module_admin.service.dict_service import DictDataService -from utils.common_util import CamelCaseUtil, export_list2excel +from utils.common_util import export_list2excel, SqlalchemySerializeUtil from utils.cron_util import CronUtil from utils.string_util import StringUtil @@ -175,7 +175,7 @@ class JobService: job_id_list = page_object.job_ids.split(',') try: for job_id in job_id_list: - await JobDao.delete_job_dao(query_db, JobModel(jobId=job_id)) + await JobDao.delete_job_dao(query_db, JobModel(job_id=job_id)) query_job = SchedulerUtil.get_scheduler_job(job_id=job_id) if query_job: SchedulerUtil.remove_scheduler_job(job_id=job_id) @@ -198,7 +198,7 @@ class JobService: """ job = await JobDao.get_job_detail_by_id(query_db, job_id=job_id) if job: - result = JobModel(**CamelCaseUtil.transform_result(job)) + result = JobModel(**SqlalchemySerializeUtil.serialize_result(job)) else: result = JobModel(**dict()) @@ -215,21 +215,21 @@ class JobService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'jobId': '任务编码', - 'jobName': '任务名称', - 'jobGroup': '任务组名', - 'jobExecutor': '任务执行器', - 'invokeTarget': '调用目标字符串', - 'jobArgs': '位置参数', - 'jobKwargs': '关键字参数', - 'cronExpression': 'cron执行表达式', - 'misfirePolicy': '计划执行错误策略', + 'job_id': '任务编码', + 'job_name': '任务名称', + 'job_group': '任务组名', + 'job_executor': '任务执行器', + 'invoke_target': '调用目标字符串', + 'job_args': '位置参数', + 'job_kwargs': '关键字参数', + 'cron_expression': 'cron执行表达式', + 'misfire_policy': '计划执行错误策略', 'concurrent': '是否并发执行', 'status': '状态', - 'createBy': '创建者', - 'createTime': '创建时间', - 'updateBy': '更新者', - 'updateTime': '更新时间', + 'create_by': '创建者', + 'create_time': '创建时间', + 'update_by': '更新者', + 'update_time': '更新时间', 'remark': '备注', } @@ -237,13 +237,13 @@ class JobService: job_group_list = await DictDataService.query_dict_data_list_from_cache_services( request.app.state.redis, dict_type='sys_job_group' ) - job_group_option = [dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_group_list] + job_group_option = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in job_group_list] job_group_option_dict = {item.get('value'): item for item in job_group_option} job_executor_list = await DictDataService.query_dict_data_list_from_cache_services( request.app.state.redis, dict_type='sys_job_executor' ) job_executor_option = [ - dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in job_executor_list + dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in job_executor_list ] job_executor_option_dict = {item.get('value'): item for item in job_executor_option} @@ -252,16 +252,16 @@ class JobService: item['status'] = '正常' else: item['status'] = '暂停' - if str(item.get('jobGroup')) in job_group_option_dict.keys(): - item['jobGroup'] = job_group_option_dict.get(str(item.get('jobGroup'))).get('label') - if str(item.get('jobExecutor')) in job_executor_option_dict.keys(): - item['jobExecutor'] = job_executor_option_dict.get(str(item.get('jobExecutor'))).get('label') - if item.get('misfirePolicy') == '1': - item['misfirePolicy'] = '立即执行' - elif item.get('misfirePolicy') == '2': - item['misfirePolicy'] = '执行一次' + if str(item.get('job_group')) in job_group_option_dict.keys(): + item['job_group'] = job_group_option_dict.get(str(item.get('job_group'))).get('label') + if str(item.get('job_executor')) in job_executor_option_dict.keys(): + item['job_executor'] = job_executor_option_dict.get(str(item.get('job_executor'))).get('label') + if item.get('misfire_policy') == '1': + item['misfire_policy'] = '立即执行' + elif item.get('misfire_policy') == '2': + item['misfire_policy'] = '执行一次' else: - item['misfirePolicy'] = '放弃执行' + item['misfire_policy'] = '放弃执行' if item.get('concurrent') == '0': item['concurrent'] = '允许' else: diff --git a/dash-fastapi-backend/module_admin/service/log_service.py b/dash-fastapi-backend/module_admin/service/log_service.py index 0c80a60..1401ac1 100644 --- a/dash-fastapi-backend/module_admin/service/log_service.py +++ b/dash-fastapi-backend/module_admin/service/log_service.py @@ -68,7 +68,7 @@ class OperationLogService: oper_id_list = page_object.oper_ids.split(',') try: for oper_id in oper_id_list: - await OperationLogDao.delete_operation_log_dao(query_db, OperLogModel(operId=oper_id)) + await OperationLogDao.delete_operation_log_dao(query_db, OperLogModel(oper_id=oper_id)) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: @@ -104,22 +104,22 @@ class OperationLogService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'operId': '日志编号', + 'oper_id': '日志编号', 'title': '系统模块', - 'businessType': '操作类型', + 'business_type': '操作类型', 'method': '方法名称', - 'requestMethod': '请求方式', - 'operName': '操作人员', - 'deptName': '部门名称', - 'operUrl': '请求URL', - 'operIp': '操作地址', - 'operLocation': '操作地点', - 'operParam': '请求参数', - 'jsonResult': '返回参数', + 'request_method': '请求方式', + 'oper_name': '操作人员', + 'dept_name': '部门名称', + 'oper_url': '请求URL', + 'oper_ip': '操作地址', + 'oper_location': '操作地点', + 'oper_param': '请求参数', + 'json_result': '返回参数', 'status': '操作状态', 'error_msg': '错误消息', - 'operTime': '操作日期', - 'costTime': '消耗时间(毫秒)', + 'oper_time': '操作日期', + 'cost_time': '消耗时间(毫秒)', } data = operation_log_list @@ -127,7 +127,7 @@ class OperationLogService: request.app.state.redis, dict_type='sys_oper_type' ) operation_type_option = [ - dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in operation_type_list + dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in operation_type_list ] operation_type_option_dict = {item.get('value'): item for item in operation_type_option} @@ -136,8 +136,8 @@ class OperationLogService: item['status'] = '成功' else: item['status'] = '失败' - if str(item.get('businessType')) in operation_type_option_dict.keys(): - item['businessType'] = operation_type_option_dict.get(str(item.get('businessType'))).get('label') + if str(item.get('business_type')) in operation_type_option_dict.keys(): + item['business_type'] = operation_type_option_dict.get(str(item.get('business_type'))).get('label') new_data = [ {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data @@ -198,7 +198,7 @@ class LoginLogService: info_id_list = page_object.info_ids.split(',') try: for info_id in info_id_list: - await LoginLogDao.delete_login_log_dao(query_db, LogininforModel(infoId=info_id)) + await LoginLogDao.delete_login_log_dao(query_db, LogininforModel(info_id=info_id)) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: @@ -242,15 +242,15 @@ class LoginLogService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'infoId': '访问编号', - 'userName': '用户名称', + 'info_id': '访问编号', + 'user_name': '用户名称', 'ipaddr': '登录地址', - 'loginLocation': '登录地点', + 'login_location': '登录地点', 'browser': '浏览器', 'os': '操作系统', 'status': '登录状态', 'msg': '操作信息', - 'loginTime': '登录日期', + 'login_time': '登录日期', } data = login_log_list diff --git a/dash-fastapi-backend/module_admin/service/login_service.py b/dash-fastapi-backend/module_admin/service/login_service.py index 5579f0d..5028b3f 100644 --- a/dash-fastapi-backend/module_admin/service/login_service.py +++ b/dash-fastapi-backend/module_admin/service/login_service.py @@ -19,7 +19,7 @@ from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.login_vo import MenuTreeModel, MetaModel, RouterModel, SmsCode, UserLogin, UserRegister from module_admin.entity.vo.user_vo import AddUserModel, CurrentUserModel, ResetUserModel, TokenData, UserInfoModel from module_admin.service.user_service import UserService -from utils.common_util import CamelCaseUtil +from utils.common_util import SqlalchemySerializeUtil from utils.log_util import logger from utils.message_util import message_service from utils.pwd_util import PwdUtil @@ -247,11 +247,11 @@ class LoginService: permissions=permissions, roles=roles, user=UserInfoModel( - **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), + **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), postIds=post_ids, roleIds=role_ids, - dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), - role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), ), ) return current_user @@ -279,7 +279,7 @@ class LoginService: ) menus = cls.__generate_menus(0, user_router_menu) user_router = cls.__generate_user_router_menu(menus) - return [router.model_dump(exclude_unset=True, by_alias=True) for router in user_router] + return [router.model_dump(exclude_unset=True) for router in user_router] @classmethod def __generate_menus(cls, pid: int, permission_list: List[SysMenu]): @@ -294,7 +294,7 @@ class LoginService: for permission in permission_list: if permission.parent_id == pid: children = cls.__generate_menus(permission.menu_id, permission_list) - menu_list_data = MenuTreeModel(**CamelCaseUtil.transform_result(permission)) + menu_list_data = MenuTreeModel(**SqlalchemySerializeUtil.serialize_result(permission)) if children: menu_list_data.children = children menu_list.append(menu_list_data) @@ -320,7 +320,7 @@ class LoginService: meta=MetaModel( title=permission.menu_name, icon=permission.icon, - noCache=True if permission.is_cache == 1 else False, + no_cache=True if permission.is_cache == 1 else False, link=permission.path if RouterUtil.is_http(permission.path) else None, ), ) @@ -339,7 +339,7 @@ class LoginService: meta=MetaModel( title=permission.menu_name, icon=permission.icon, - noCache=True if permission.is_cache == 1 else False, + no_cache=True if permission.is_cache == 1 else False, link=permission.path if RouterUtil.is_http(permission.path) else None, ), query=permission.query, @@ -401,8 +401,8 @@ class LoginService: elif user_register.code != str(captcha_value): raise ServiceException(message='验证码错误') add_user = AddUserModel( - userName=user_register.username, - nickName=user_register.username, + user_name=user_register.username, + nick_name=user_register.username, password=PwdUtil.get_password_hash(user_register.password), ) result = await UserService.add_user_services(query_db, add_user) diff --git a/dash-fastapi-backend/module_admin/service/menu_service.py b/dash-fastapi-backend/module_admin/service/menu_service.py index 2852d6c..fdbe5ef 100644 --- a/dash-fastapi-backend/module_admin/service/menu_service.py +++ b/dash-fastapi-backend/module_admin/service/menu_service.py @@ -8,7 +8,7 @@ from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.menu_vo import DeleteMenuModel, MenuQueryModel, MenuModel from module_admin.entity.vo.role_vo import RoleMenuQueryModel from module_admin.entity.vo.user_vo import CurrentUserModel -from utils.common_util import CamelCaseUtil +from utils.common_util import SqlalchemySerializeUtil from utils.string_util import StringUtil @@ -52,7 +52,7 @@ class MenuService: role = await RoleDao.get_role_detail_by_id(query_db, role_id) role_menu_list = await RoleDao.get_role_menu_dao(query_db, role) checked_keys = [row.menu_id for row in role_menu_list] - result = RoleMenuQueryModel(menus=menu_tree_result, checkedKeys=checked_keys) + result = RoleMenuQueryModel(menus=menu_tree_result, checked_keys=checked_keys) return result @@ -72,7 +72,7 @@ class MenuService: query_db, page_object, current_user.user.user_id, current_user.user.role ) - return CamelCaseUtil.transform_result(menu_list_result) + return SqlalchemySerializeUtil.serialize_result(menu_list_result) @classmethod async def check_menu_name_unique_services(cls, query_db: AsyncSession, page_object: MenuModel): @@ -84,7 +84,7 @@ class MenuService: :return: 校验结果 """ menu_id = -1 if page_object.menu_id is None else page_object.menu_id - menu = await MenuDao.get_menu_detail_by_info(query_db, MenuModel(menuName=page_object.menu_name)) + menu = await MenuDao.get_menu_detail_by_info(query_db, MenuModel(menu_name=page_object.menu_name)) if menu and menu.menu_id != menu_id: return CommonConstant.NOT_UNIQUE return CommonConstant.UNIQUE @@ -157,7 +157,7 @@ class MenuService: raise ServiceWarning(message='存在子菜单,不允许删除') elif (await MenuDao.check_menu_exist_role_dao(query_db, int(menu_id))) > 0: raise ServiceWarning(message='菜单已分配,不允许删除') - await MenuDao.delete_menu_dao(query_db, MenuModel(menuId=menu_id)) + await MenuDao.delete_menu_dao(query_db, MenuModel(menu_id=menu_id)) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: @@ -177,7 +177,7 @@ class MenuService: """ menu = await MenuDao.get_menu_detail_by_id(query_db, menu_id=menu_id) if menu: - result = MenuModel(**CamelCaseUtil.transform_result(menu)) + result = MenuModel(**SqlalchemySerializeUtil.serialize_result(menu)) else: result = MenuModel(**dict()) @@ -192,7 +192,7 @@ class MenuService: :return: 菜单树形嵌套数据 """ permission_list = [ - dict(id=item.menu_id, label=item.menu_name, parentId=item.parent_id) for item in permission_list + dict(id=item.menu_id, label=item.menu_name, parent_id=item.parent_id) for item in permission_list ] # 转成id为key的字典 mapping: dict = dict(zip([i['id'] for i in permission_list], permission_list)) @@ -202,7 +202,7 @@ class MenuService: for d in permission_list: # 如果找不到父级项,则是根节点 - parent: dict = mapping.get(d['parentId']) + parent: dict = mapping.get(d['parent_id']) if parent is None: container.append(d) else: diff --git a/dash-fastapi-backend/module_admin/service/notice_service.py b/dash-fastapi-backend/module_admin/service/notice_service.py index 4671703..e6353ff 100644 --- a/dash-fastapi-backend/module_admin/service/notice_service.py +++ b/dash-fastapi-backend/module_admin/service/notice_service.py @@ -4,7 +4,7 @@ from exceptions.exception import ServiceException from module_admin.dao.notice_dao import NoticeDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.notice_vo import DeleteNoticeModel, NoticeModel, NoticePageQueryModel -from utils.common_util import CamelCaseUtil +from utils.common_util import SqlalchemySerializeUtil class NoticeService: @@ -101,7 +101,7 @@ class NoticeService: notice_id_list = page_object.notice_ids.split(',') try: for notice_id in notice_id_list: - await NoticeDao.delete_notice_dao(query_db, NoticeModel(noticeId=notice_id)) + await NoticeDao.delete_notice_dao(query_db, NoticeModel(notice_id=notice_id)) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: @@ -121,7 +121,7 @@ class NoticeService: """ notice = await NoticeDao.get_notice_detail_by_id(query_db, notice_id=notice_id) if notice: - result = NoticeModel(**CamelCaseUtil.transform_result(notice)) + result = NoticeModel(**SqlalchemySerializeUtil.serialize_result(notice)) else: result = NoticeModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/online_service.py b/dash-fastapi-backend/module_admin/service/online_service.py index 0d1c913..e172f42 100644 --- a/dash-fastapi-backend/module_admin/service/online_service.py +++ b/dash-fastapi-backend/module_admin/service/online_service.py @@ -5,7 +5,6 @@ from config.env import JwtConfig from exceptions.exception import ServiceException from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.online_vo import DeleteOnlineModel, OnlineQueryModel -from utils.common_util import CamelCaseUtil class OnlineService: @@ -22,7 +21,7 @@ class OnlineService: :param query_object: 查询参数对象 :return: 在线用户列表信息 """ - access_token_keys = await request.app.state.redis.keys(f"{RedisInitKeyConfig.ACCESS_TOKEN.key}*") + access_token_keys = await request.app.state.redis.keys(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}*') if not access_token_keys: access_token_keys = [] access_token_values_list = [await request.app.state.redis.get(key) for key in access_token_keys] @@ -56,7 +55,7 @@ class OnlineService: else: online_info_list.append(online_dict) - return CamelCaseUtil.transform_result(online_info_list) + return online_info_list @classmethod async def delete_online_services(cls, request: Request, page_object: DeleteOnlineModel): @@ -70,7 +69,7 @@ class OnlineService: if page_object.token_ids: token_id_list = page_object.token_ids.split(',') for token_id in token_id_list: - await request.app.state.redis.delete(f"{RedisInitKeyConfig.ACCESS_TOKEN.key}:{token_id}") + await request.app.state.redis.delete(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{token_id}') return CrudResponseModel(is_success=True, message='强退成功') else: raise ServiceException(message='传入session_id为空') diff --git a/dash-fastapi-backend/module_admin/service/post_service.py b/dash-fastapi-backend/module_admin/service/post_service.py index 5215539..3028cc7 100644 --- a/dash-fastapi-backend/module_admin/service/post_service.py +++ b/dash-fastapi-backend/module_admin/service/post_service.py @@ -5,7 +5,7 @@ from exceptions.exception import ServiceException from module_admin.dao.post_dao import PostDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.post_vo import DeletePostModel, PostModel, PostPageQueryModel -from utils.common_util import CamelCaseUtil, export_list2excel +from utils.common_util import export_list2excel, SqlalchemySerializeUtil class PostService: @@ -39,7 +39,7 @@ class PostService: :return: 校验结果 """ post_id = -1 if page_object.post_id is None else page_object.post_id - post = await PostDao.get_post_detail_by_info(query_db, PostModel(postName=page_object.post_name)) + post = await PostDao.get_post_detail_by_info(query_db, PostModel(post_name=page_object.post_name)) if post and post.post_id != post_id: return CommonConstant.NOT_UNIQUE return CommonConstant.UNIQUE @@ -54,7 +54,7 @@ class PostService: :return: 校验结果 """ post_id = -1 if page_object.post_id is None else page_object.post_id - post = await PostDao.get_post_detail_by_info(query_db, PostModel(postCode=page_object.post_code)) + post = await PostDao.get_post_detail_by_info(query_db, PostModel(post_code=page_object.post_code)) if post and post.post_id != post_id: return CommonConstant.NOT_UNIQUE return CommonConstant.UNIQUE @@ -124,7 +124,7 @@ class PostService: post = await cls.post_detail_services(query_db, int(post_id)) if (await PostDao.count_user_post_dao(query_db, int(post_id))) > 0: raise ServiceException(message=f'{post.post_name}已分配,不能删除') - await PostDao.delete_post_dao(query_db, PostModel(postId=post_id)) + await PostDao.delete_post_dao(query_db, PostModel(post_id=post_id)) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: @@ -144,7 +144,7 @@ class PostService: """ post = await PostDao.get_post_detail_by_id(query_db, post_id=post_id) if post: - result = PostModel(**CamelCaseUtil.transform_result(post)) + result = PostModel(**SqlalchemySerializeUtil.serialize_result(post)) else: result = PostModel(**dict()) @@ -160,15 +160,15 @@ class PostService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'postId': '岗位编号', - 'postCode': '岗位编码', - 'postName': '岗位名称', - 'postSort': '显示顺序', + 'post_id': '岗位编号', + 'post_code': '岗位编码', + 'post_name': '岗位名称', + 'post_sort': '显示顺序', 'status': '状态', - 'createBy': '创建者', - 'createTime': '创建时间', - 'updateBy': '更新者', - 'updateTime': '更新时间', + 'create_by': '创建者', + 'create_time': '创建时间', + 'update_by': '更新者', + 'update_time': '更新时间', 'remark': '备注', } diff --git a/dash-fastapi-backend/module_admin/service/role_service.py b/dash-fastapi-backend/module_admin/service/role_service.py index 7939781..cbbedd5 100644 --- a/dash-fastapi-backend/module_admin/service/role_service.py +++ b/dash-fastapi-backend/module_admin/service/role_service.py @@ -15,7 +15,7 @@ from module_admin.entity.vo.role_vo import ( from module_admin.entity.vo.user_vo import UserInfoModel, UserRolePageQueryModel from module_admin.dao.role_dao import RoleDao from module_admin.dao.user_dao import UserDao -from utils.common_util import CamelCaseUtil, export_list2excel +from utils.common_util import export_list2excel, SqlalchemySerializeUtil from utils.page_util import PageResponseModel @@ -34,7 +34,7 @@ class RoleService: """ role_list_result = await RoleDao.get_role_select_option_dao(query_db) - return CamelCaseUtil.transform_result(role_list_result) + return SqlalchemySerializeUtil.serialize_result(role_list_result) @classmethod async def get_role_dept_tree_services(cls, query_db: AsyncSession, role_id: int): @@ -48,7 +48,7 @@ class RoleService: role = await cls.role_detail_services(query_db, role_id) role_dept_list = await RoleDao.get_role_dept_dao(query_db, role) checked_keys = [row.dept_id for row in role_dept_list] - result = RoleDeptQueryModel(checkedKeys=checked_keys) + result = RoleDeptQueryModel(checked_keys=checked_keys) return result @@ -96,7 +96,7 @@ class RoleService: if role_id_list: for role_id in role_id_list: roles = await RoleDao.get_role_list( - query_db, RolePageQueryModel(roleId=int(role_id)), data_scope_sql, is_page=False + query_db, RolePageQueryModel(role_id=int(role_id)), data_scope_sql, is_page=False ) if roles: continue @@ -113,7 +113,7 @@ class RoleService: :return: 校验结果 """ role_id = -1 if page_object.role_id is None else page_object.role_id - role = await RoleDao.get_role_by_info(query_db, RoleModel(roleName=page_object.role_name)) + role = await RoleDao.get_role_by_info(query_db, RoleModel(role_name=page_object.role_name)) if role and role.role_id != role_id: return CommonConstant.NOT_UNIQUE return CommonConstant.UNIQUE @@ -128,7 +128,7 @@ class RoleService: :return: 校验结果 """ role_id = -1 if page_object.role_id is None else page_object.role_id - role = await RoleDao.get_role_by_info(query_db, RoleModel(roleKey=page_object.role_key)) + role = await RoleDao.get_role_by_info(query_db, RoleModel(role_key=page_object.role_key)) if role and role.role_id != role_id: return CommonConstant.NOT_UNIQUE return CommonConstant.UNIQUE @@ -142,7 +142,7 @@ class RoleService: :param page_object: 新增角色对象 :return: 新增角色校验结果 """ - add_role = RoleModel(**page_object.model_dump(by_alias=True)) + add_role = RoleModel(**page_object.model_dump()) if not await cls.check_role_name_unique_services(query_db, page_object): raise ServiceException(message=f'新增角色{page_object.post_name}失败,角色名称已存在') elif not await cls.check_role_key_unique_services(query_db, page_object): @@ -153,7 +153,7 @@ class RoleService: role_id = add_result.role_id if page_object.menu_ids: for menu in page_object.menu_ids: - await RoleDao.add_role_menu_dao(query_db, RoleMenuModel(roleId=role_id, menuId=menu)) + await RoleDao.add_role_menu_dao(query_db, RoleMenuModel(role_id=role_id, menu_id=menu)) await query_db.commit() return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: @@ -184,11 +184,11 @@ class RoleService: try: await RoleDao.edit_role_dao(query_db, edit_role) if page_object.type != 'status': - await RoleDao.delete_role_menu_dao(query_db, RoleMenuModel(roleId=page_object.role_id)) + await RoleDao.delete_role_menu_dao(query_db, RoleMenuModel(role_id=page_object.role_id)) if page_object.menu_ids: for menu in page_object.menu_ids: await RoleDao.add_role_menu_dao( - query_db, RoleMenuModel(roleId=page_object.role_id, menuId=menu) + query_db, RoleMenuModel(role_id=page_object.role_id, menu_id=menu) ) await query_db.commit() return CrudResponseModel(is_success=True, message='更新成功') @@ -212,11 +212,11 @@ class RoleService: if role_info.role_id: try: await RoleDao.edit_role_dao(query_db, edit_role) - await RoleDao.delete_role_dept_dao(query_db, RoleDeptModel(roleId=page_object.role_id)) + await RoleDao.delete_role_dept_dao(query_db, RoleDeptModel(role_id=page_object.role_id)) if page_object.dept_ids and page_object.data_scope == '2': for dept in page_object.dept_ids: await RoleDao.add_role_dept_dao( - query_db, RoleDeptModel(roleId=page_object.role_id, deptId=dept) + query_db, RoleDeptModel(role_id=page_object.role_id, dept_id=dept) ) await query_db.commit() return CrudResponseModel(is_success=True, message='分配成功') @@ -243,7 +243,7 @@ class RoleService: if (await RoleDao.count_user_role_dao(query_db, int(role_id))) > 0: raise ServiceException(message=f'角色{role.role_name}已分配,不能删除') role_id_dict = dict( - roleId=role_id, updateBy=page_object.update_by, updateTime=page_object.update_time + role_id=role_id, update_by=page_object.update_by, update_time=page_object.update_time ) await RoleDao.delete_role_menu_dao(query_db, RoleMenuModel(**role_id_dict)) await RoleDao.delete_role_dept_dao(query_db, RoleDeptModel(**role_id_dict)) @@ -267,7 +267,7 @@ class RoleService: """ role = await RoleDao.get_role_detail_by_id(query_db, role_id=role_id) if role: - result = RoleModel(**CamelCaseUtil.transform_result(role)) + result = RoleModel(**SqlalchemySerializeUtil.serialize_result(role)) else: result = RoleModel(**dict()) @@ -283,15 +283,15 @@ class RoleService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'roleId': '角色编号', - 'roleName': '角色名称', - 'roleKey': '权限字符', - 'roleSort': '显示顺序', + 'role_id': '角色编号', + 'role_name': '角色名称', + 'role_key': '权限字符', + 'role_sort': '显示顺序', 'status': '状态', - 'createBy': '创建者', - 'createTime': '创建时间', - 'updateBy': '更新者', - 'updateTime': '更新时间', + 'create_by': '创建者', + 'create_time': '创建时间', + 'update_by': '更新者', + 'update_time': '更新时间', 'remark': '备注', } @@ -327,7 +327,7 @@ class RoleService: ) allocated_list = PageResponseModel( **{ - **query_user_list.model_dump(by_alias=True), + **query_user_list.model_dump(), 'rows': [UserInfoModel(**row) for row in query_user_list.rows], } ) @@ -352,7 +352,7 @@ class RoleService: ) unallocated_list = PageResponseModel( **{ - **query_user_list.model_dump(by_alias=True), + **query_user_list.model_dump(), 'rows': [UserInfoModel(**row) for row in query_user_list.rows], } ) diff --git a/dash-fastapi-backend/module_admin/service/server_service.py b/dash-fastapi-backend/module_admin/service/server_service.py index 2f9a53f..557c01c 100644 --- a/dash-fastapi-backend/module_admin/service/server_service.py +++ b/dash-fastapi-backend/module_admin/service/server_service.py @@ -41,7 +41,7 @@ class ServerService: os_arch = platform.machine() user_dir = os.path.abspath(os.getcwd()) sys = SysInfo( - computerIp=computer_ip, computerName=computer_name, osArch=os_arch, osName=os_name, userDir=user_dir + computer_ip=computer_ip, computer_name=computer_name, os_arch=os_arch, os_name=os_name, user_dir=user_dir ) # python解释器信息 @@ -66,8 +66,8 @@ class ServerService: py = PyInfo( name=python_name, version=python_version, - startTime=start_time, - runTime=run_time, + start_time=start_time, + run_time=run_time, home=python_home, total=bytes2human(memory_info.available), used=bytes2human(current_process_memory_info.rss), @@ -81,9 +81,9 @@ class ServerService: for i in io: o = psutil.disk_usage(i.device) disk_data = SysFiles( - dirName=i.device, - sysTypeName=i.fstype, - typeName='本地固定磁盘(' + i.mountpoint.replace('\\', '') + ')', + dir_name=i.device, + sys_type_name=i.fstype, + type_name='本地固定磁盘(' + i.mountpoint.replace('\\', '') + ')', total=bytes2human(o.total), used=bytes2human(o.used), free=bytes2human(o.free), @@ -91,6 +91,6 @@ class ServerService: ) sys_files.append(disk_data) - result = ServerMonitorModel(cpu=cpu, mem=mem, sys=sys, py=py, sysFiles=sys_files) + result = ServerMonitorModel(cpu=cpu, mem=mem, sys=sys, py=py, sys_files=sys_files) return result diff --git a/dash-fastapi-backend/module_admin/service/user_service.py b/dash-fastapi-backend/module_admin/service/user_service.py index dc79430..b6ad5d6 100644 --- a/dash-fastapi-backend/module_admin/service/user_service.py +++ b/dash-fastapi-backend/module_admin/service/user_service.py @@ -31,7 +31,7 @@ from module_admin.service.config_service import ConfigService from module_admin.service.dept_service import DeptService from module_admin.service.post_service import PostService from module_admin.service.role_service import RoleService -from utils.common_util import CamelCaseUtil, export_list2excel, get_excel_template +from utils.common_util import export_list2excel, get_excel_template, SqlalchemySerializeUtil from utils.page_util import PageResponseModel from utils.pwd_util import PwdUtil @@ -58,7 +58,7 @@ class UserService: if is_page: user_list_result = PageResponseModel( **{ - **query_result.model_dump(by_alias=True), + **query_result.model_dump(), 'rows': [{**row[0], 'dept': row[1]} for row in query_result.rows], } ) @@ -92,7 +92,9 @@ class UserService: :param data_scope_sql: 数据权限对应的查询sql语句 :return: 校验结果 """ - users = await UserDao.get_user_list(query_db, UserPageQueryModel(userId=user_id), data_scope_sql, is_page=False) + users = await UserDao.get_user_list( + query_db, UserPageQueryModel(user_id=user_id), data_scope_sql, is_page=False + ) if users: return CrudResponseModel(is_success=True, message='校验通过') else: @@ -108,7 +110,7 @@ class UserService: :return: 校验结果 """ user_id = -1 if page_object.user_id is None else page_object.user_id - user = await UserDao.get_user_by_info(query_db, UserModel(userName=page_object.user_name)) + user = await UserDao.get_user_by_info(query_db, UserModel(user_name=page_object.user_name)) if user and user.user_id != user_id: return CommonConstant.NOT_UNIQUE return CommonConstant.UNIQUE @@ -152,7 +154,7 @@ class UserService: :param page_object: 新增用户对象 :return: 新增用户校验结果 """ - add_user = UserModel(**page_object.model_dump(by_alias=True)) + add_user = UserModel(**page_object.model_dump()) if not await cls.check_user_name_unique_services(query_db, page_object): raise ServiceException(message=f'新增用户{page_object.user_name}失败,登录账号已存在') elif page_object.phonenumber and not await cls.check_phonenumber_unique_services(query_db, page_object): @@ -165,10 +167,10 @@ class UserService: user_id = add_result.user_id if page_object.role_ids: for role in page_object.role_ids: - await UserDao.add_user_role_dao(query_db, UserRoleModel(userId=user_id, roleId=role)) + await UserDao.add_user_role_dao(query_db, UserRoleModel(user_id=user_id, role_id=role)) if page_object.post_ids: for post in page_object.post_ids: - await UserDao.add_user_post_dao(query_db, UserPostModel(userId=user_id, postId=post)) + await UserDao.add_user_post_dao(query_db, UserPostModel(user_id=user_id, post_id=post)) await query_db.commit() return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: @@ -203,17 +205,17 @@ class UserService: try: await UserDao.edit_user_dao(query_db, edit_user) if page_object.type != 'status' and page_object.type != 'avatar' and page_object.type != 'pwd': - await UserDao.delete_user_role_dao(query_db, UserRoleModel(userId=page_object.user_id)) - await UserDao.delete_user_post_dao(query_db, UserPostModel(userId=page_object.user_id)) + await UserDao.delete_user_role_dao(query_db, UserRoleModel(user_id=page_object.user_id)) + await UserDao.delete_user_post_dao(query_db, UserPostModel(user_id=page_object.user_id)) if page_object.role_ids: for role in page_object.role_ids: await UserDao.add_user_role_dao( - query_db, UserRoleModel(userId=page_object.user_id, roleId=role) + query_db, UserRoleModel(user_id=page_object.user_id, role_id=role) ) if page_object.post_ids: for post in page_object.post_ids: await UserDao.add_user_post_dao( - query_db, UserPostModel(userId=page_object.user_id, postId=post) + query_db, UserPostModel(user_id=page_object.user_id, post_id=post) ) await query_db.commit() return CrudResponseModel(is_success=True, message='更新成功') @@ -237,7 +239,7 @@ class UserService: try: for user_id in user_id_list: user_id_dict = dict( - userId=user_id, updateBy=page_object.update_by, updateTime=page_object.update_time + user_id=user_id, update_by=page_object.update_by, update_time=page_object.update_time ) await UserDao.delete_user_role_dao(query_db, UserRoleModel(**user_id_dict)) await UserDao.delete_user_post_dao(query_db, UserPostModel(**user_id_dict)) @@ -270,15 +272,15 @@ class UserService: return UserDetailModel( data=UserInfoModel( - **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), - postIds=post_ids, - roleIds=role_ids, - dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), - role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), + post_ids=post_ids, + role_ids=role_ids, + dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), ), - postIds=post_ids_list, + post_ids=post_ids_list, posts=posts, - roleIds=role_ids_list, + role_ids=role_ids_list, roles=roles, ) @@ -301,14 +303,14 @@ class UserService: return UserProfileModel( data=UserInfoModel( - **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), - postIds=post_ids, - roleIds=role_ids, - dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), - role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), + post_ids=post_ids, + role_ids=role_ids, + dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), ), - postGroup=post_group, - roleGroup=role_group, + post_group=post_group, + role_group=role_group, ) @classmethod @@ -393,37 +395,37 @@ class UserService: if row['status'] == '停用': row['status'] = '1' add_user = UserModel( - deptId=row['dept_id'], - userName=row['user_name'], + dept_id=row['dept_id'], + user_name=row['user_name'], password=PwdUtil.get_password_hash( await ConfigService.query_config_list_from_cache_services( request.app.state.redis, 'sys.user.initPassword' ) ), - nickName=row['nick_name'], + nick_name=row['nick_name'], email=row['email'], phonenumber=str(row['phonenumber']), sex=row['sex'], status=row['status'], - createBy=current_user.user.user_name, - createTime=datetime.now(), - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + create_by=current_user.user.user_name, + create_time=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), ) - user_info = await UserDao.get_user_by_info(query_db, UserModel(userName=row['user_name'])) + user_info = await UserDao.get_user_by_info(query_db, UserModel(user_name=row['user_name'])) if user_info: if update_support: edit_user_model = UserModel( - userId=user_info.user_id, - deptId=row['dept_id'], - userName=row['user_name'], - nickName=row['nick_name'], + user_id=user_info.user_id, + dept_id=row['dept_id'], + user_name=row['user_name'], + nick_name=row['nick_name'], email=row['email'], phonenumber=str(row['phonenumber']), sex=row['sex'], status=row['status'], - updateBy=current_user.user.user_name, - updateTime=datetime.now(), + update_by=current_user.user.user_name, + update_time=datetime.now(), ) edit_user_model.validate_fields() await cls.check_user_allowed_services(edit_user_model) @@ -477,18 +479,18 @@ class UserService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - 'userId': '用户编号', - 'userName': '用户名称', - 'nickName': '用户昵称', - 'deptName': '部门', + 'user_id': '用户编号', + 'user_name': '用户名称', + 'nick_name': '用户昵称', + 'dept_name': '部门', 'email': '邮箱地址', 'phonenumber': '手机号码', 'sex': '性别', 'status': '状态', - 'createBy': '创建者', - 'createTime': '创建时间', - 'updateBy': '更新者', - 'updateTime': '更新时间', + 'create_by': '创建者', + 'create_time': '创建时间', + 'update_by': '更新者', + 'update_time': '更新时间', 'remark': '备注', } @@ -525,11 +527,11 @@ class UserService: post_ids = ','.join([str(row.post_id) for row in query_user.get('user_post_info')]) role_ids = ','.join([str(row.role_id) for row in query_user.get('user_role_info')]) user = UserInfoModel( - **CamelCaseUtil.transform_result(query_user.get('user_basic_info')), - postIds=post_ids, - roleIds=role_ids, - dept=CamelCaseUtil.transform_result(query_user.get('user_dept_info')), - role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), + **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), + post_ids=post_ids, + role_ids=role_ids, + dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), ) query_role_list = [ SelectedRoleModel(**row) for row in await RoleService.get_role_select_option_services(query_db) @@ -554,9 +556,13 @@ class UserService: if page_object.user_id and page_object.role_ids: role_id_list = page_object.role_ids.split(',') try: - await UserDao.delete_user_role_by_user_and_role_dao(query_db, UserRoleModel(userId=page_object.user_id)) + await UserDao.delete_user_role_by_user_and_role_dao( + query_db, UserRoleModel(user_id=page_object.user_id) + ) for role_id in role_id_list: - await UserDao.add_user_role_dao(query_db, UserRoleModel(userId=page_object.user_id, roleId=role_id)) + await UserDao.add_user_role_dao( + query_db, UserRoleModel(user_id=page_object.user_id, role_id=role_id) + ) await query_db.commit() return CrudResponseModel(is_success=True, message='分配成功') except Exception as e: @@ -564,7 +570,9 @@ class UserService: raise e elif page_object.user_id and not page_object.role_ids: try: - await UserDao.delete_user_role_by_user_and_role_dao(query_db, UserRoleModel(userId=page_object.user_id)) + await UserDao.delete_user_role_by_user_and_role_dao( + query_db, UserRoleModel(user_id=page_object.user_id) + ) await query_db.commit() return CrudResponseModel(is_success=True, message='分配成功') except Exception as e: @@ -575,13 +583,13 @@ class UserService: try: for user_id in user_id_list: user_role = await cls.detail_user_role_services( - query_db, UserRoleModel(userId=user_id, roleId=page_object.role_id) + query_db, UserRoleModel(user_id=user_id, role_id=page_object.role_id) ) if user_role: continue else: await UserDao.add_user_role_dao( - query_db, UserRoleModel(userId=user_id, roleId=page_object.role_id) + query_db, UserRoleModel(user_id=user_id, role_id=page_object.role_id) ) await query_db.commit() return CrudResponseModel(is_success=True, message='新增成功') @@ -604,7 +612,7 @@ class UserService: if page_object.user_id and page_object.role_id: try: await UserDao.delete_user_role_by_user_and_role_dao( - query_db, UserRoleModel(userId=page_object.user_id, roleId=page_object.role_id) + query_db, UserRoleModel(user_id=page_object.user_id, role_id=page_object.role_id) ) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') @@ -616,7 +624,7 @@ class UserService: try: for user_id in user_id_list: await UserDao.delete_user_role_by_user_and_role_dao( - query_db, UserRoleModel(userId=user_id, roleId=page_object.role_id) + query_db, UserRoleModel(user_id=user_id, role_id=page_object.role_id) ) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') -- Gitee From f2b947b6cc780c49cf5482831c51771dab28905f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 29 Aug 2024 23:30:26 +0800 Subject: [PATCH 008/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=87=BD=E6=95=B0=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/utils/page_util.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/dash-fastapi-backend/utils/page_util.py b/dash-fastapi-backend/utils/page_util.py index dfe8a31..9d08f72 100644 --- a/dash-fastapi-backend/utils/page_util.py +++ b/dash-fastapi-backend/utils/page_util.py @@ -1,10 +1,9 @@ import math from pydantic import BaseModel, ConfigDict -from pydantic.alias_generators import to_camel from sqlalchemy import func, select, Select from sqlalchemy.ext.asyncio import AsyncSession from typing import Optional, List -from utils.common_util import CamelCaseUtil +from utils.common_util import SqlalchemySerializeUtil class PageResponseModel(BaseModel): @@ -12,8 +11,6 @@ class PageResponseModel(BaseModel): 列表分页查询返回模型 """ - model_config = ConfigDict(alias_generator=to_camel) - rows: List = [] page_num: Optional[int] = None page_size: Optional[int] = None @@ -45,7 +42,7 @@ class PageUtil: has_next = True if math.ceil(len(data_list) / page_size) > page_num else False result = PageResponseModel( - rows=paginated_data, pageNum=page_num, pageSize=page_size, total=len(data_list), hasNext=has_next + rows=paginated_data, page_num=page_num, page_size=page_size, total=len(data_list), has_next=has_next ) return result @@ -73,11 +70,11 @@ class PageUtil: paginated_data.append(row) has_next = math.ceil(total / page_size) > page_num result = PageResponseModel( - rows=CamelCaseUtil.transform_result(paginated_data), - pageNum=page_num, - pageSize=page_size, + rows=SqlalchemySerializeUtil.serialize_result(paginated_data), + page_num=page_num, + page_size=page_size, total=total, - hasNext=has_next, + has_next=has_next, ) else: query_result = await db.execute(query) @@ -87,7 +84,7 @@ class PageUtil: no_paginated_data.append(row[0]) else: no_paginated_data.append(row) - result = CamelCaseUtil.transform_result(no_paginated_data) + result = SqlalchemySerializeUtil.serialize_result(no_paginated_data) return result @@ -110,7 +107,7 @@ def get_page_obj(data_list: List, page_num: int, page_size: int): has_next = True if math.ceil(len(data_list) / page_size) > page_num else False result = PageResponseModel( - rows=paginated_data, pageNum=page_num, pageSize=page_size, total=len(data_list), hasNext=has_next + rows=paginated_data, page_num=page_num, page_size=page_size, total=len(data_list), has_next=has_next ) return result -- Gitee From e5502ebc9d28bb21c6841160a0c7a00987ad5ea2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 29 Aug 2024 23:30:45 +0800 Subject: [PATCH 009/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E5=B7=A5=E5=85=B7=E7=B1=BB=E8=BF=94=E5=9B=9E=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/utils/response_util.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dash-fastapi-backend/utils/response_util.py b/dash-fastapi-backend/utils/response_util.py index 88d2e37..3881773 100644 --- a/dash-fastapi-backend/utils/response_util.py +++ b/dash-fastapi-backend/utils/response_util.py @@ -40,7 +40,7 @@ class ResponseUtil: if dict_content is not None: result.update(dict_content) if model_content is not None: - result.update(model_content.model_dump(by_alias=True)) + result.update(model_content.model_dump()) result.update({'success': True, 'time': datetime.now()}) @@ -74,7 +74,7 @@ class ResponseUtil: if dict_content is not None: result.update(dict_content) if model_content is not None: - result.update(model_content.model_dump(by_alias=True)) + result.update(model_content.model_dump()) result.update({'success': False, 'time': datetime.now()}) @@ -108,7 +108,7 @@ class ResponseUtil: if dict_content is not None: result.update(dict_content) if model_content is not None: - result.update(model_content.model_dump(by_alias=True)) + result.update(model_content.model_dump()) result.update({'success': False, 'time': datetime.now()}) @@ -142,7 +142,7 @@ class ResponseUtil: if dict_content is not None: result.update(dict_content) if model_content is not None: - result.update(model_content.model_dump(by_alias=True)) + result.update(model_content.model_dump()) result.update({'success': False, 'time': datetime.now()}) @@ -176,7 +176,7 @@ class ResponseUtil: if dict_content is not None: result.update(dict_content) if model_content is not None: - result.update(model_content.model_dump(by_alias=True)) + result.update(model_content.model_dump()) result.update({'success': False, 'time': datetime.now()}) -- Gitee From a5d9e35cb12b9db3d11b54adba841f47f7c7bc6b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 30 Aug 2024 11:21:21 +0800 Subject: [PATCH 010/229] =?UTF-8?q?refactor:=20SqlalchemySerializeUtil?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E4=B8=BASqlalchemyUtil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/service/config_service.py | 8 ++++---- .../module_admin/service/dept_service.py | 8 ++++---- .../module_admin/service/dict_service.py | 18 ++++++++--------- .../module_admin/service/job_service.py | 4 ++-- .../module_admin/service/login_service.py | 10 +++++----- .../module_admin/service/menu_service.py | 6 +++--- .../module_admin/service/notice_service.py | 4 ++-- .../module_admin/service/post_service.py | 4 ++-- .../module_admin/service/role_service.py | 6 +++--- .../module_admin/service/user_service.py | 20 +++++++++---------- dash-fastapi-backend/utils/common_util.py | 10 +++++----- dash-fastapi-backend/utils/page_util.py | 6 +++--- 12 files changed, 52 insertions(+), 52 deletions(-) diff --git a/dash-fastapi-backend/module_admin/service/config_service.py b/dash-fastapi-backend/module_admin/service/config_service.py index f60bece..16d0c35 100644 --- a/dash-fastapi-backend/module_admin/service/config_service.py +++ b/dash-fastapi-backend/module_admin/service/config_service.py @@ -7,7 +7,7 @@ from exceptions.exception import ServiceException from module_admin.dao.config_dao import ConfigDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel, DeleteConfigModel -from utils.common_util import export_list2excel, SqlalchemySerializeUtil +from utils.common_util import export_list2excel, SqlalchemyUtil class ConfigService: @@ -48,8 +48,8 @@ class ConfigService: config_all = await ConfigDao.get_config_list(query_db, ConfigPageQueryModel(**dict()), is_page=False) for config_obj in config_all: await redis.set( - f"{RedisInitKeyConfig.SYS_CONFIG.key}:{config_obj.get('configKey')}", - config_obj.get('configValue'), + f"{RedisInitKeyConfig.SYS_CONFIG.key}:{config_obj.get('config_key')}", + config_obj.get('config_value'), ) @classmethod @@ -179,7 +179,7 @@ class ConfigService: """ config = await ConfigDao.get_config_detail_by_id(query_db, config_id=config_id) if config: - result = ConfigModel(**SqlalchemySerializeUtil.serialize_result(config)) + result = ConfigModel(**SqlalchemyUtil.serialize_result(config)) else: result = ConfigModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/dept_service.py b/dash-fastapi-backend/module_admin/service/dept_service.py index b189347..fcc316d 100644 --- a/dash-fastapi-backend/module_admin/service/dept_service.py +++ b/dash-fastapi-backend/module_admin/service/dept_service.py @@ -4,7 +4,7 @@ from exceptions.exception import ServiceException, ServiceWarning from module_admin.dao.dept_dao import DeptDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.dept_vo import DeleteDeptModel, DeptModel -from utils.common_util import SqlalchemySerializeUtil +from utils.common_util import SqlalchemyUtil class DeptService: @@ -41,7 +41,7 @@ class DeptService: """ dept_list_result = await DeptDao.get_dept_info_for_edit_option(query_db, page_object, data_scope_sql) - return SqlalchemySerializeUtil.serialize_result(dept_list_result) + return SqlalchemyUtil.serialize_result(dept_list_result) @classmethod async def get_dept_list_services(cls, query_db: AsyncSession, page_object: DeptModel, data_scope_sql: str): @@ -55,7 +55,7 @@ class DeptService: """ dept_list_result = await DeptDao.get_dept_list(query_db, page_object, data_scope_sql) - return SqlalchemySerializeUtil.serialize_result(dept_list_result) + return SqlalchemyUtil.serialize_result(dept_list_result) @classmethod async def check_dept_data_scope_services(cls, query_db: AsyncSession, dept_id: int, data_scope_sql: str): @@ -191,7 +191,7 @@ class DeptService: """ dept = await DeptDao.get_dept_detail_by_id(query_db, dept_id=dept_id) if dept: - result = DeptModel(**SqlalchemySerializeUtil.serialize_result(dept)) + result = DeptModel(**SqlalchemyUtil.serialize_result(dept)) else: result = DeptModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/dict_service.py b/dash-fastapi-backend/module_admin/service/dict_service.py index 8c871e4..2175b6b 100644 --- a/dash-fastapi-backend/module_admin/service/dict_service.py +++ b/dash-fastapi-backend/module_admin/service/dict_service.py @@ -15,7 +15,7 @@ from module_admin.entity.vo.dict_vo import ( DictTypeModel, DictTypePageQueryModel, ) -from utils.common_util import export_list2excel, SqlalchemySerializeUtil +from utils.common_util import export_list2excel, SqlalchemyUtil class DictTypeService: @@ -110,7 +110,7 @@ class DictTypeService: await DictTypeDao.edit_dict_type_dao(query_db, edit_dict_type) await query_db.commit() if dict_type_info.dict_type != page_object.dict_type: - dict_data = [SqlalchemySerializeUtil.serialize_result(row) for row in dict_data_list if row] + dict_data = [SqlalchemyUtil.serialize_result(row) for row in dict_data_list if row] await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', json.dumps(dict_data, ensure_ascii=False, default=str), @@ -165,7 +165,7 @@ class DictTypeService: """ dict_type = await DictTypeDao.get_dict_type_detail_by_id(query_db, dict_id=dict_id) if dict_type: - result = DictTypeModel(**SqlalchemySerializeUtil.serialize_result(dict_type)) + result = DictTypeModel(**SqlalchemyUtil.serialize_result(dict_type)) else: result = DictTypeModel(**dict()) @@ -273,7 +273,7 @@ class DictDataService: for dict_type_obj in [item for item in dict_type_all if item.status == '0']: dict_type = dict_type_obj.dict_type dict_data_list = await DictDataDao.query_dict_data_list(query_db, dict_type) - dict_data = [SqlalchemySerializeUtil.serialize_result(row) for row in dict_data_list if row] + dict_data = [SqlalchemyUtil.serialize_result(row) for row in dict_data_list if row] await redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type}', json.dumps(dict_data, ensure_ascii=False, default=str), @@ -293,7 +293,7 @@ class DictDataService: if dict_data_list_result: result = json.loads(dict_data_list_result) - return SqlalchemySerializeUtil.serialize_result(result) + return SqlalchemyUtil.serialize_result(result) @classmethod async def check_dict_data_unique_services(cls, query_db: AsyncSession, page_object: DictDataModel): @@ -332,7 +332,7 @@ class DictDataService: await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', json.dumps( - SqlalchemySerializeUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str + SqlalchemyUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str ), ) return CrudResponseModel(is_success=True, message='新增成功') @@ -365,7 +365,7 @@ class DictDataService: await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{page_object.dict_type}', json.dumps( - SqlalchemySerializeUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str + SqlalchemyUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str ), ) return CrudResponseModel(is_success=True, message='更新成功') @@ -401,7 +401,7 @@ class DictDataService: await request.app.state.redis.set( f'{RedisInitKeyConfig.SYS_DICT.key}:{dict_type}', json.dumps( - SqlalchemySerializeUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str + SqlalchemyUtil.serialize_result(dict_data_list), ensure_ascii=False, default=str ), ) return CrudResponseModel(is_success=True, message='删除成功') @@ -422,7 +422,7 @@ class DictDataService: """ dict_data = await DictDataDao.get_dict_data_detail_by_id(query_db, dict_code=dict_code) if dict_data: - result = DictDataModel(**SqlalchemySerializeUtil.serialize_result(dict_data)) + result = DictDataModel(**SqlalchemyUtil.serialize_result(dict_data)) else: result = DictDataModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/job_service.py b/dash-fastapi-backend/module_admin/service/job_service.py index 8464951..5a8c3bd 100644 --- a/dash-fastapi-backend/module_admin/service/job_service.py +++ b/dash-fastapi-backend/module_admin/service/job_service.py @@ -8,7 +8,7 @@ from module_admin.dao.job_dao import JobDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.job_vo import DeleteJobModel, EditJobModel, JobModel, JobPageQueryModel from module_admin.service.dict_service import DictDataService -from utils.common_util import export_list2excel, SqlalchemySerializeUtil +from utils.common_util import export_list2excel, SqlalchemyUtil from utils.cron_util import CronUtil from utils.string_util import StringUtil @@ -198,7 +198,7 @@ class JobService: """ job = await JobDao.get_job_detail_by_id(query_db, job_id=job_id) if job: - result = JobModel(**SqlalchemySerializeUtil.serialize_result(job)) + result = JobModel(**SqlalchemyUtil.serialize_result(job)) else: result = JobModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/login_service.py b/dash-fastapi-backend/module_admin/service/login_service.py index 5028b3f..f355afb 100644 --- a/dash-fastapi-backend/module_admin/service/login_service.py +++ b/dash-fastapi-backend/module_admin/service/login_service.py @@ -19,7 +19,7 @@ from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.login_vo import MenuTreeModel, MetaModel, RouterModel, SmsCode, UserLogin, UserRegister from module_admin.entity.vo.user_vo import AddUserModel, CurrentUserModel, ResetUserModel, TokenData, UserInfoModel from module_admin.service.user_service import UserService -from utils.common_util import SqlalchemySerializeUtil +from utils.common_util import SqlalchemyUtil from utils.log_util import logger from utils.message_util import message_service from utils.pwd_util import PwdUtil @@ -247,11 +247,11 @@ class LoginService: permissions=permissions, roles=roles, user=UserInfoModel( - **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), + **SqlalchemyUtil.serialize_result(query_user.get('user_basic_info')), postIds=post_ids, roleIds=role_ids, - dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), - role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), + dept=SqlalchemyUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemyUtil.serialize_result(query_user.get('user_role_info')), ), ) return current_user @@ -294,7 +294,7 @@ class LoginService: for permission in permission_list: if permission.parent_id == pid: children = cls.__generate_menus(permission.menu_id, permission_list) - menu_list_data = MenuTreeModel(**SqlalchemySerializeUtil.serialize_result(permission)) + menu_list_data = MenuTreeModel(**SqlalchemyUtil.serialize_result(permission)) if children: menu_list_data.children = children menu_list.append(menu_list_data) diff --git a/dash-fastapi-backend/module_admin/service/menu_service.py b/dash-fastapi-backend/module_admin/service/menu_service.py index fdbe5ef..fb95d28 100644 --- a/dash-fastapi-backend/module_admin/service/menu_service.py +++ b/dash-fastapi-backend/module_admin/service/menu_service.py @@ -8,7 +8,7 @@ from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.menu_vo import DeleteMenuModel, MenuQueryModel, MenuModel from module_admin.entity.vo.role_vo import RoleMenuQueryModel from module_admin.entity.vo.user_vo import CurrentUserModel -from utils.common_util import SqlalchemySerializeUtil +from utils.common_util import SqlalchemyUtil from utils.string_util import StringUtil @@ -72,7 +72,7 @@ class MenuService: query_db, page_object, current_user.user.user_id, current_user.user.role ) - return SqlalchemySerializeUtil.serialize_result(menu_list_result) + return SqlalchemyUtil.serialize_result(menu_list_result) @classmethod async def check_menu_name_unique_services(cls, query_db: AsyncSession, page_object: MenuModel): @@ -177,7 +177,7 @@ class MenuService: """ menu = await MenuDao.get_menu_detail_by_id(query_db, menu_id=menu_id) if menu: - result = MenuModel(**SqlalchemySerializeUtil.serialize_result(menu)) + result = MenuModel(**SqlalchemyUtil.serialize_result(menu)) else: result = MenuModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/notice_service.py b/dash-fastapi-backend/module_admin/service/notice_service.py index e6353ff..1b076d9 100644 --- a/dash-fastapi-backend/module_admin/service/notice_service.py +++ b/dash-fastapi-backend/module_admin/service/notice_service.py @@ -4,7 +4,7 @@ from exceptions.exception import ServiceException from module_admin.dao.notice_dao import NoticeDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.notice_vo import DeleteNoticeModel, NoticeModel, NoticePageQueryModel -from utils.common_util import SqlalchemySerializeUtil +from utils.common_util import SqlalchemyUtil class NoticeService: @@ -121,7 +121,7 @@ class NoticeService: """ notice = await NoticeDao.get_notice_detail_by_id(query_db, notice_id=notice_id) if notice: - result = NoticeModel(**SqlalchemySerializeUtil.serialize_result(notice)) + result = NoticeModel(**SqlalchemyUtil.serialize_result(notice)) else: result = NoticeModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/post_service.py b/dash-fastapi-backend/module_admin/service/post_service.py index 3028cc7..3c1f364 100644 --- a/dash-fastapi-backend/module_admin/service/post_service.py +++ b/dash-fastapi-backend/module_admin/service/post_service.py @@ -5,7 +5,7 @@ from exceptions.exception import ServiceException from module_admin.dao.post_dao import PostDao from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.post_vo import DeletePostModel, PostModel, PostPageQueryModel -from utils.common_util import export_list2excel, SqlalchemySerializeUtil +from utils.common_util import export_list2excel, SqlalchemyUtil class PostService: @@ -144,7 +144,7 @@ class PostService: """ post = await PostDao.get_post_detail_by_id(query_db, post_id=post_id) if post: - result = PostModel(**SqlalchemySerializeUtil.serialize_result(post)) + result = PostModel(**SqlalchemyUtil.serialize_result(post)) else: result = PostModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/role_service.py b/dash-fastapi-backend/module_admin/service/role_service.py index cbbedd5..7191f5d 100644 --- a/dash-fastapi-backend/module_admin/service/role_service.py +++ b/dash-fastapi-backend/module_admin/service/role_service.py @@ -15,7 +15,7 @@ from module_admin.entity.vo.role_vo import ( from module_admin.entity.vo.user_vo import UserInfoModel, UserRolePageQueryModel from module_admin.dao.role_dao import RoleDao from module_admin.dao.user_dao import UserDao -from utils.common_util import export_list2excel, SqlalchemySerializeUtil +from utils.common_util import export_list2excel, SqlalchemyUtil from utils.page_util import PageResponseModel @@ -34,7 +34,7 @@ class RoleService: """ role_list_result = await RoleDao.get_role_select_option_dao(query_db) - return SqlalchemySerializeUtil.serialize_result(role_list_result) + return SqlalchemyUtil.serialize_result(role_list_result) @classmethod async def get_role_dept_tree_services(cls, query_db: AsyncSession, role_id: int): @@ -267,7 +267,7 @@ class RoleService: """ role = await RoleDao.get_role_detail_by_id(query_db, role_id=role_id) if role: - result = RoleModel(**SqlalchemySerializeUtil.serialize_result(role)) + result = RoleModel(**SqlalchemyUtil.serialize_result(role)) else: result = RoleModel(**dict()) diff --git a/dash-fastapi-backend/module_admin/service/user_service.py b/dash-fastapi-backend/module_admin/service/user_service.py index b6ad5d6..87dd0ca 100644 --- a/dash-fastapi-backend/module_admin/service/user_service.py +++ b/dash-fastapi-backend/module_admin/service/user_service.py @@ -31,7 +31,7 @@ from module_admin.service.config_service import ConfigService from module_admin.service.dept_service import DeptService from module_admin.service.post_service import PostService from module_admin.service.role_service import RoleService -from utils.common_util import export_list2excel, get_excel_template, SqlalchemySerializeUtil +from utils.common_util import export_list2excel, get_excel_template, SqlalchemyUtil from utils.page_util import PageResponseModel from utils.pwd_util import PwdUtil @@ -272,11 +272,11 @@ class UserService: return UserDetailModel( data=UserInfoModel( - **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), + **SqlalchemyUtil.serialize_result(query_user.get('user_basic_info')), post_ids=post_ids, role_ids=role_ids, - dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), - role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), + dept=SqlalchemyUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemyUtil.serialize_result(query_user.get('user_role_info')), ), post_ids=post_ids_list, posts=posts, @@ -303,11 +303,11 @@ class UserService: return UserProfileModel( data=UserInfoModel( - **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), + **SqlalchemyUtil.serialize_result(query_user.get('user_basic_info')), post_ids=post_ids, role_ids=role_ids, - dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), - role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), + dept=SqlalchemyUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemyUtil.serialize_result(query_user.get('user_role_info')), ), post_group=post_group, role_group=role_group, @@ -527,11 +527,11 @@ class UserService: post_ids = ','.join([str(row.post_id) for row in query_user.get('user_post_info')]) role_ids = ','.join([str(row.role_id) for row in query_user.get('user_role_info')]) user = UserInfoModel( - **SqlalchemySerializeUtil.serialize_result(query_user.get('user_basic_info')), + **SqlalchemyUtil.serialize_result(query_user.get('user_basic_info')), post_ids=post_ids, role_ids=role_ids, - dept=SqlalchemySerializeUtil.serialize_result(query_user.get('user_dept_info')), - role=SqlalchemySerializeUtil.serialize_result(query_user.get('user_role_info')), + dept=SqlalchemyUtil.serialize_result(query_user.get('user_dept_info')), + role=SqlalchemyUtil.serialize_result(query_user.get('user_role_info')), ) query_role_list = [ SelectedRoleModel(**row) for row in await RoleService.get_role_select_option_services(query_db) diff --git a/dash-fastapi-backend/utils/common_util.py b/dash-fastapi-backend/utils/common_util.py index 52bc9fc..d37cd53 100644 --- a/dash-fastapi-backend/utils/common_util.py +++ b/dash-fastapi-backend/utils/common_util.py @@ -39,13 +39,13 @@ def worship(): """) -class SqlalchemySerializeUtil: +class SqlalchemyUtil: """ - sqlalchemy查询结果序列化工具类 + sqlalchemy工具类 """ @classmethod - def __to_dict(cls, obj: Base): + def base_to_dict(cls, obj: Base): """ 将sqlalchemy模型对象转换为字典 @@ -66,12 +66,12 @@ class SqlalchemySerializeUtil: :return: 序列化结果 """ if isinstance(result, Base): - return cls.__to_dict(result) + return cls.base_to_dict(result) elif isinstance(result, list): return [cls.serialize_result(row) for row in result] elif isinstance(result, Row): if all([isinstance(row, Base) for row in result]): - return [cls.__to_dict(row) for row in result] + return [cls.base_to_dict(row) for row in result] else: return result._asdict() return result diff --git a/dash-fastapi-backend/utils/page_util.py b/dash-fastapi-backend/utils/page_util.py index 9d08f72..2f5edda 100644 --- a/dash-fastapi-backend/utils/page_util.py +++ b/dash-fastapi-backend/utils/page_util.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, ConfigDict from sqlalchemy import func, select, Select from sqlalchemy.ext.asyncio import AsyncSession from typing import Optional, List -from utils.common_util import SqlalchemySerializeUtil +from utils.common_util import SqlalchemyUtil class PageResponseModel(BaseModel): @@ -70,7 +70,7 @@ class PageUtil: paginated_data.append(row) has_next = math.ceil(total / page_size) > page_num result = PageResponseModel( - rows=SqlalchemySerializeUtil.serialize_result(paginated_data), + rows=SqlalchemyUtil.serialize_result(paginated_data), page_num=page_num, page_size=page_size, total=total, @@ -84,7 +84,7 @@ class PageUtil: no_paginated_data.append(row[0]) else: no_paginated_data.append(row) - result = SqlalchemySerializeUtil.serialize_result(no_paginated_data) + result = SqlalchemyUtil.serialize_result(no_paginated_data) return result -- Gitee From c13cb2a548a07d70156ba22ea4860fc0c7a8f88e Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 30 Aug 2024 14:00:05 +0800 Subject: [PATCH 011/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4login=5Fc?= =?UTF-8?q?ontroller=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/controller/login_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/controller/login_controller.py b/dash-fastapi-backend/module_admin/controller/login_controller.py index e6a5916..9753cbe 100644 --- a/dash-fastapi-backend/module_admin/controller/login_controller.py +++ b/dash-fastapi-backend/module_admin/controller/login_controller.py @@ -66,7 +66,7 @@ async def login( ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes), ) await UserService.edit_user_services( - query_db, EditUserModel(userId=result[0].user_id, loginDate=datetime.now(), type='status') + query_db, EditUserModel(user_id=result[0].user_id, login_date=datetime.now(), type='status') ) logger.info('登录成功') # 判断请求是否来自于api文档,如果是返回指定格式的结果,用于修复api文档认证成功后token显示undefined的bug -- Gitee From 7255b5fe1e2ed2ce86e95e73c78080192eb97641 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 30 Aug 2024 14:00:24 +0800 Subject: [PATCH 012/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=A3=85=E9=A5=B0=E5=99=A8=E7=BC=96=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/annotation/log_annotation.py | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/dash-fastapi-backend/module_admin/annotation/log_annotation.py b/dash-fastapi-backend/module_admin/annotation/log_annotation.py index 1f3e220..74bf12f 100644 --- a/dash-fastapi-backend/module_admin/annotation/log_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/log_annotation.py @@ -16,6 +16,7 @@ from module_admin.service.login_service import LoginService from config.enums import BusinessType from config.env import AppConfig from exceptions.exception import LoginException, ServiceException, ServiceWarning +from utils.log_util import logger from utils.response_util import ResponseUtil @@ -116,13 +117,14 @@ class Log: try: # 调用原始函数 result = await func(*args, **kwargs) - except LoginException as e: + except (LoginException, ServiceWarning) as e: + logger.warning(e.message) result = ResponseUtil.failure(data=e.data, msg=e.message) except ServiceException as e: + logger.exception(e) result = ResponseUtil.error(data=e.data, msg=e.message) - except ServiceWarning as e: - result = ResponseUtil.failure(data=e.data, msg=e.message) except Exception as e: + logger.exception(e) result = ResponseUtil.error(msg=str(e)) # 获取请求耗时 cost_time = float(time.time() - start_time) * 100 @@ -164,8 +166,8 @@ class Log: else: user = kwargs.get('form_data') user_name = user.username - login_log['loginTime'] = oper_time - login_log['userName'] = user_name + login_log['login_time'] = oper_time + login_log['user_name'] = user_name login_log['status'] = str(status) login_log['msg'] = result_dict.get('msg') @@ -176,21 +178,21 @@ class Log: dept_name = current_user.user.dept.dept_name if current_user.user.dept else None operation_log = OperLogModel( title=self.title, - businessType=self.business_type, + business_type=self.business_type, method=func_path, - requestMethod=request_method, - operatorType=operator_type, - operName=oper_name, - deptName=dept_name, - operUrl=oper_url, - operIp=oper_ip, - operLocation=oper_location, - operParam=oper_param, - jsonResult=json_result, + request_method=request_method, + operator_type=operator_type, + oper_name=oper_name, + dept_name=dept_name, + oper_url=oper_url, + oper_ip=oper_ip, + oper_location=oper_location, + oper_param=oper_param, + json_result=json_result, status=status, - errorMsg=error_msg, - operTime=oper_time, - costTime=int(cost_time), + error_msg=error_msg, + oper_time=oper_time, + cost_time=int(cost_time), ) await OperationLogService.add_operation_log_services(query_db, operation_log) -- Gitee From 2d939ec4175147bb2c24a206b7e9c7c688e236d8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 30 Aug 2024 14:02:41 +0800 Subject: [PATCH 013/229] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index dfbeb62..1a2dcce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,23 +1,25 @@ APScheduler==3.10.4 -dash==2.10.2 -DateTime==5.1 -fastapi[all]==0.95.1 -feffery-antd-charts==0.0.1rc17 -feffery-antd-components==0.2.11 +asyncmy==0.2.9 +dash==2.17.1 +DateTime==5.5 +fastapi[all]==0.112.2 +feffery-antd-charts==0.1.0rc5 +feffery-antd-components==0.3.2 feffery-markdown-components==0.2.10 -feffery-utils-components==0.2.0b12 -Flask-Compress==1.13 +feffery-utils-components==0.2.0rc24 +Flask-Compress==1.15 jsonpath-ng==1.5.3 -loguru==0.7.0 -openpyxl==3.1.2 -pandas==1.5.3 +loguru==0.7.2 +openpyxl==3.1.5 +pandas==2.2.2 passlib[bcrypt]==1.7.4 -Pillow==10.2.0 -psutil==5.9.5 -PyMySQL==1.0.3 -python-jose[cryptography]==3.3.0 -redis==5.0.1 -requests==2.31.0 -SQLAlchemy==1.4.48 +Pillow==10.4.0 +psutil==6.0.0 +pydantic-validation-decorator==0.1.2 +PyJWT[crypto]==2.8.0 +PyMySQL==1.1.1 +redis==5.0.7 +requests==2.32.3 +SQLAlchemy[asyncio]==2.0.31 user-agents==2.2.0 -waitress==2.1.2 +waitress==3.0.0 -- Gitee From 8bb73698708fa1ff402cadbad217435f27ed0f18 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 1 Sep 2024 21:18:21 +0800 Subject: [PATCH 014/229] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=962.0.?= =?UTF-8?q?0=E7=89=88=E6=9C=AC=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/config.py | 2 +- dash-fastapi-frontend/api/login.py | 70 +++- dash-fastapi-frontend/api/monitor/cache.py | 96 +++++ dash-fastapi-frontend/api/monitor/job.py | 120 ++++++ dash-fastapi-frontend/api/monitor/job_log.py | 61 +++ .../api/monitor/logininfor.py | 74 ++++ dash-fastapi-frontend/api/monitor/online.py | 34 ++ dash-fastapi-frontend/api/monitor/operlog.py | 61 +++ dash-fastapi-frontend/api/monitor/server.py | 19 + dash-fastapi-frontend/api/router.py | 19 + dash-fastapi-frontend/api/system/config.py | 115 +++++ dash-fastapi-frontend/api/system/dept.py | 88 ++++ dash-fastapi-frontend/api/system/dict/data.py | 103 +++++ dash-fastapi-frontend/api/system/dict/type.py | 114 +++++ dash-fastapi-frontend/api/system/menu.py | 100 +++++ dash-fastapi-frontend/api/system/notice.py | 75 ++++ dash-fastapi-frontend/api/system/post.py | 90 ++++ dash-fastapi-frontend/api/system/role.py | 202 +++++++++ dash-fastapi-frontend/api/system/user.py | 201 +++++++++ dash-fastapi-frontend/app.py | 239 ++++++----- dash-fastapi-frontend/callbacks/app_c.py | 10 +- .../callbacks/layout_c/head_c.py | 4 +- .../callbacks/layout_c/index_c.py | 396 +++++++++--------- dash-fastapi-frontend/callbacks/login_c.py | 138 ++++-- dash-fastapi-frontend/config/env.py | 6 +- dash-fastapi-frontend/ruff.toml | 4 + dash-fastapi-frontend/server.py | 51 ++- dash-fastapi-frontend/utils/cache_util.py | 52 +++ .../utils/permission_util.py | 65 +++ dash-fastapi-frontend/utils/request.py | 178 ++++++-- dash-fastapi-frontend/utils/router_util.py | 146 +++++++ dash-fastapi-frontend/views/login.py | 234 +++++------ 32 files changed, 2624 insertions(+), 543 deletions(-) create mode 100644 dash-fastapi-frontend/api/monitor/cache.py create mode 100644 dash-fastapi-frontend/api/monitor/job.py create mode 100644 dash-fastapi-frontend/api/monitor/job_log.py create mode 100644 dash-fastapi-frontend/api/monitor/logininfor.py create mode 100644 dash-fastapi-frontend/api/monitor/online.py create mode 100644 dash-fastapi-frontend/api/monitor/operlog.py create mode 100644 dash-fastapi-frontend/api/monitor/server.py create mode 100644 dash-fastapi-frontend/api/router.py create mode 100644 dash-fastapi-frontend/api/system/config.py create mode 100644 dash-fastapi-frontend/api/system/dept.py create mode 100644 dash-fastapi-frontend/api/system/dict/data.py create mode 100644 dash-fastapi-frontend/api/system/dict/type.py create mode 100644 dash-fastapi-frontend/api/system/menu.py create mode 100644 dash-fastapi-frontend/api/system/notice.py create mode 100644 dash-fastapi-frontend/api/system/post.py create mode 100644 dash-fastapi-frontend/api/system/role.py create mode 100644 dash-fastapi-frontend/api/system/user.py create mode 100644 dash-fastapi-frontend/ruff.toml create mode 100644 dash-fastapi-frontend/utils/cache_util.py create mode 100644 dash-fastapi-frontend/utils/permission_util.py create mode 100644 dash-fastapi-frontend/utils/router_util.py diff --git a/dash-fastapi-frontend/api/config.py b/dash-fastapi-frontend/api/config.py index f092b8d..d2ab45b 100644 --- a/dash-fastapi-frontend/api/config.py +++ b/dash-fastapi-frontend/api/config.py @@ -8,7 +8,7 @@ def get_config_list_api(page_obj: dict): def query_config_list_api(config_key: str): - return api_request(method='get', url=f'/common/config/query/{config_key}', is_headers=False) + return api_request(method='get', url=f'/common/config/query/{config_key}', headers={'is_token': False}) def add_config_api(page_obj: dict): diff --git a/dash-fastapi-frontend/api/login.py b/dash-fastapi-frontend/api/login.py index fd642f2..1a51d33 100644 --- a/dash-fastapi-frontend/api/login.py +++ b/dash-fastapi-frontend/api/login.py @@ -1,20 +1,74 @@ from utils.request import api_request -def login_api(page_obj: dict): +class LoginApi: + """ + 登录模块相关接口 + """ - return api_request(method='post', url='/login/loginByAccount', is_headers=False, data=page_obj) + @classmethod + def login(cls, data: dict): + """ + 登录接口 + :param data: 登录参数 + :return: + """ + return api_request( + url='/login', + method='post', + headers={'is_token': False}, + data=data, + ) -def get_captcha_image_api(): + @classmethod + def register(json: dict): + """ + 注册接口 - return api_request(method='post', url='/captcha/captchaImage', is_headers=False) + :param data: 注册参数 + :return: + """ + return api_request( + url='/register', + method='post', + headers={'is_token': False}, + json=json, + ) + @classmethod + def get_info(cls): + """ + 获取登录用户信息接口 -def get_current_user_info_api(): + :return: + """ + return api_request( + url='/getInfo', + method='get', + ) - return api_request(method='post', url='/login/getLoginUserInfo', is_headers=True) + @classmethod + def logout(cls): + """ + 退出登录接口 + :return: + """ + return api_request( + url='/logout', + method='post', + ) -def logout_api(): - return api_request(method='post', url='/login/logout', is_headers=True) + @classmethod + def get_code_img(cls): + """ + 获取图片验证码接口 + + :return: + """ + return api_request( + url='/captchaImage', + method='get', + headers={'is_token': False}, + ) diff --git a/dash-fastapi-frontend/api/monitor/cache.py b/dash-fastapi-frontend/api/monitor/cache.py new file mode 100644 index 0000000..07aa625 --- /dev/null +++ b/dash-fastapi-frontend/api/monitor/cache.py @@ -0,0 +1,96 @@ +from utils.request import api_request + + +class CacheApi: + """ + 缓存管理模块相关接口 + """ + + @classmethod + def get_cache(cls): + """ + 查询缓存详情接口 + + :return: + """ + return api_request( + url='/monitor/cache', + method='get', + ) + + @classmethod + def list_cache_name(cls): + """ + 查询缓存名称列表接口 + + :return: + """ + return api_request( + url='/monitor/cache/getNames', + method='get', + ) + + @classmethod + def list_cache_key(cls, cache_name: str): + """ + 查询缓存键名列表接口 + + :param cache_name: 缓存名称 + :return: + """ + return api_request( + url=f'/monitor/cache/getKeys/{cache_name}', + method='get', + ) + + @classmethod + def get_cache_value(cls, cache_name: str, cache_key: str): + """ + 查询缓存内容接口 + + :param cache_name: 缓存名称 + :param cache_key: 缓存键名 + :return: + """ + return api_request( + url=f'/monitor/cache/getValue/{cache_name}/{cache_key}', + method='get', + ) + + @classmethod + def clear_cache_name(cls, cache_name: str): + """ + 清理指定名称缓存接口 + + :param cache_name: 缓存名称 + :return: + """ + return api_request( + url=f'/monitor/cache/clearCacheName/{cache_name}', + method='delete', + ) + + @classmethod + def clear_cache_key(cls, cache_key: str): + """ + 清理指定键名缓存接口 + + :param cache_key: 缓存键名 + :return: + """ + return api_request( + url=f'/monitor/cache/clearCacheKey/{cache_key}', + method='delete', + ) + + @classmethod + def clear_cache_all(cls): + """ + 清理全部缓存接口 + + :return: + """ + return api_request( + url='/monitor/cache/clearCacheAll', + method='delete', + ) diff --git a/dash-fastapi-frontend/api/monitor/job.py b/dash-fastapi-frontend/api/monitor/job.py new file mode 100644 index 0000000..334ba13 --- /dev/null +++ b/dash-fastapi-frontend/api/monitor/job.py @@ -0,0 +1,120 @@ +from utils.request import api_request + + +class JobApi: + """ + 定时任务调度管理模块相关接口 + """ + + @classmethod + def list_job(cls, query: dict): + """ + 查询定时任务调度列表接口 + + :param query: 查询定时任务调度参数 + :return: + """ + return api_request( + url='/monitor/job/list', + method='get', + params=query, + ) + + @classmethod + def get_job(cls, job_id: str): + """ + 查询定时任务调度详情接口 + + :param job_id: 定时任务调度id + :return: + """ + return api_request( + url=f'/monitor/job/{job_id}', + method='get', + ) + + @classmethod + def add_job(cls, json: dict): + """ + 新增定时任务调度接口 + + :param json: 新增定时任务调度参数 + :return: + """ + return api_request( + url='/monitor/job', + method='post', + json=json, + ) + + @classmethod + def update_job(cls, json: dict): + """ + 修改定时任务调度接口 + + :param json: 修改定时任务调度参数 + :return: + """ + return api_request( + url='/monitor/job', + method='put', + json=json, + ) + + @classmethod + def del_job(cls, job_id: str): + """ + 删除定时任务调度接口 + + :param job_id: 定时任务调度id + :return: + """ + return api_request( + url=f'/monitor/job/{job_id}', + method='delete', + ) + + @classmethod + def export_job(cls, data: dict): + """ + 导出定时任务调度接口 + + :param data: 导出定时任务调度参数 + :return: + """ + return api_request( + url='/monitor/job/export', + method='post', + data=data, + stream=True, + ) + + @classmethod + def change_job_status(cls, job_id: str, status: str): + """ + 角色状态修改接口 + + :param job_id: 定时任务id + :param status: 定时任务状态 + :return: + """ + return api_request( + url='/monitor/job/changeStatus', + method='put', + json=dict(job_id=job_id, status=status), + ) + + @classmethod + def run_job(cls, job_id: str, job_group: str): + """ + 定时任务立即执行一次接口 + + :param job_id: 定时任务id + :param job_group: 定时任务分组 + :return: + """ + return api_request( + url='/monitor/job/run', + method='put', + json=dict(job_id=job_id, job_group=job_group), + ) diff --git a/dash-fastapi-frontend/api/monitor/job_log.py b/dash-fastapi-frontend/api/monitor/job_log.py new file mode 100644 index 0000000..048b3d8 --- /dev/null +++ b/dash-fastapi-frontend/api/monitor/job_log.py @@ -0,0 +1,61 @@ +from utils.request import api_request + + +class JobLogApi: + """ + 调度日志管理模块相关接口 + """ + + @classmethod + def list_job_log(cls, query: dict): + """ + 查询调度日志列表接口 + + :param query: 查询调度日志参数 + :return: + """ + return api_request( + url='/monitor/jobLog/list', + method='get', + params=query, + ) + + @classmethod + def del_job_log(cls, job_log_id: str): + """ + 删除调度日志接口 + + :param job_log_id: 调度日志id + :return: + """ + return api_request( + url=f'/monitor/jobLog/{job_log_id}', + method='delete', + ) + + @classmethod + def clean_job_log(cls): + """ + 清空调度日志接口 + + :return: + """ + return api_request( + url='/monitor/jobLog/clean', + method='delete', + ) + + @classmethod + def export_job_log(cls, data: dict): + """ + 导出调度日志接口 + + :param data: 导出调度日志参数 + :return: + """ + return api_request( + url='/monitor/jobLog/export', + method='post', + data=data, + stream=True, + ) diff --git a/dash-fastapi-frontend/api/monitor/logininfor.py b/dash-fastapi-frontend/api/monitor/logininfor.py new file mode 100644 index 0000000..7e0ab77 --- /dev/null +++ b/dash-fastapi-frontend/api/monitor/logininfor.py @@ -0,0 +1,74 @@ +from utils.request import api_request + + +class LogininforApi: + """ + 登录日志管理模块相关接口 + """ + + @classmethod + def list_logininfor(cls, query: dict): + """ + 查询登录日志列表接口 + + :param query: 查询登录日志参数 + :return: + """ + return api_request( + url='/monitor/logininfor/list', + method='get', + params=query, + ) + + @classmethod + def del_logininfor(cls, info_id: str): + """ + 删除登录日志接口 + + :param info_id: 登录日志id + :return: + """ + return api_request( + url=f'/monitor/logininfor/{info_id}', + method='delete', + ) + + @classmethod + def unlock_logininfor(cls, user_name: str): + """ + 解锁用户登录状态接口 + + :param user_name: 用户名称 + :return: + """ + return api_request( + url=f'/monitor/logininfor/unlock/{user_name}', + method='get', + ) + + @classmethod + def clean_logininfor(cls): + """ + 清空登录日志接口 + + :return: + """ + return api_request( + url='/monitor/logininfor/clean', + method='delete', + ) + + @classmethod + def export_logininfor(cls, data: dict): + """ + 导出登录日志接口 + + :param data: 导出登录日志参数 + :return: + """ + return api_request( + url='/monitor/logininfor/export', + method='post', + data=data, + stream=True, + ) diff --git a/dash-fastapi-frontend/api/monitor/online.py b/dash-fastapi-frontend/api/monitor/online.py new file mode 100644 index 0000000..ef7e47e --- /dev/null +++ b/dash-fastapi-frontend/api/monitor/online.py @@ -0,0 +1,34 @@ +from utils.request import api_request + + +class OnlineApi: + """ + 在线用户管理模块相关接口 + """ + + @classmethod + def list_online(cls, query: dict): + """ + 查询在线用户列表接口 + + :param query: 查询在线用户参数 + :return: + """ + return api_request( + url='/monitor/online/list', + method='get', + params=query, + ) + + @classmethod + def force_logout(cls, token_id: str): + """ + 强退用户接口 + + :param token_id: 在线用户token + :return: + """ + return api_request( + url=f'/monitor/online/{token_id}', + method='delete', + ) diff --git a/dash-fastapi-frontend/api/monitor/operlog.py b/dash-fastapi-frontend/api/monitor/operlog.py new file mode 100644 index 0000000..62b9c9e --- /dev/null +++ b/dash-fastapi-frontend/api/monitor/operlog.py @@ -0,0 +1,61 @@ +from utils.request import api_request + + +class OperlogApi: + """ + 操作日志管理模块相关接口 + """ + + @classmethod + def list_operlog(cls, query: dict): + """ + 查询操作日志列表接口 + + :param query: 查询操作日志参数 + :return: + """ + return api_request( + url='/monitor/operlog/list', + method='get', + params=query, + ) + + @classmethod + def del_operlog(cls, oper_id: str): + """ + 删除操作日志接口 + + :param oper_id: 操作日志id + :return: + """ + return api_request( + url=f'/monitor/operlog/{oper_id}', + method='delete', + ) + + @classmethod + def clean_operlog(cls): + """ + 清空操作日志接口 + + :return: + """ + return api_request( + url='/monitor/operlog/clean', + method='delete', + ) + + @classmethod + def export_operlog(cls, data: dict): + """ + 导出操作日志接口 + + :param data: 导出操作日志参数 + :return: + """ + return api_request( + url='/monitor/operlog/export', + method='post', + data=data, + stream=True, + ) diff --git a/dash-fastapi-frontend/api/monitor/server.py b/dash-fastapi-frontend/api/monitor/server.py new file mode 100644 index 0000000..9f1c39d --- /dev/null +++ b/dash-fastapi-frontend/api/monitor/server.py @@ -0,0 +1,19 @@ +from utils.request import api_request + + +class ServerApi: + """ + 服务监控模块相关接口 + """ + + @classmethod + def get_server(cls): + """ + 获取服务信息接口 + + :return: + """ + return api_request( + url='/monitor/server', + method='get', + ) diff --git a/dash-fastapi-frontend/api/router.py b/dash-fastapi-frontend/api/router.py new file mode 100644 index 0000000..90f91b4 --- /dev/null +++ b/dash-fastapi-frontend/api/router.py @@ -0,0 +1,19 @@ +from utils.request import api_request + + +class RouterApi: + """ + 路由模块相关接口 + """ + + @classmethod + def get_routers(cls): + """ + 获取路由信息接口 + + :return: + """ + return api_request( + url='/getRouters', + method='get', + ) diff --git a/dash-fastapi-frontend/api/system/config.py b/dash-fastapi-frontend/api/system/config.py new file mode 100644 index 0000000..f6d1d7b --- /dev/null +++ b/dash-fastapi-frontend/api/system/config.py @@ -0,0 +1,115 @@ +from utils.request import api_request + + +class ConfigApi: + """ + 参数配置模块相关接口 + """ + + @classmethod + def list_config(cls, query: dict): + """ + 查询参数配置列表接口 + + :param query: 查询参数配置参数 + :return: + """ + return api_request( + url='/system/config/list', + method='get', + params=query, + ) + + @classmethod + def get_config(cls, config_id: str): + """ + 查询参数配置详情接口 + + :param config_id: 参数配置id + :return: + """ + return api_request( + url=f'/system/config/{config_id}', + method='get', + ) + + @classmethod + def get_config_key(config_key: str): + """ + 根据参数配置键名查询参数配置值接口 + + :param config_key: 参数键名 + :return: + """ + return api_request( + url=f'/system/config/configKey/{config_key}', + method='get', + ) + + @classmethod + def add_config(cls, json: dict): + """ + 新增参数配置接口 + + :param json: 新增参数配置参数 + :return: + """ + return api_request( + url='/system/config', + method='post', + json=json, + ) + + @classmethod + def update_config(cls, json: dict): + """ + 修改参数配置接口 + + :param json: 修改参数配置参数 + :return: + """ + return api_request( + url='/system/config', + method='put', + json=json, + ) + + @classmethod + def del_config(cls, config_id: str): + """ + 删除参数配置接口 + + :param config_id: 参数配置id + :return: + """ + return api_request( + url=f'/system/config/{config_id}', + method='delete', + ) + + @classmethod + def refresh_cache(cls): + """ + 刷新参数配置缓存接口 + + :return: + """ + return api_request( + url='/system/config/refreshCache', + method='delete', + ) + + @classmethod + def export_config(cls, data: dict): + """ + 导出参数配置接口 + + :param data: 导出参数配置参数 + :return: + """ + return api_request( + url='/system/config/export', + method='post', + data=data, + stream=True, + ) diff --git a/dash-fastapi-frontend/api/system/dept.py b/dash-fastapi-frontend/api/system/dept.py new file mode 100644 index 0000000..753abc3 --- /dev/null +++ b/dash-fastapi-frontend/api/system/dept.py @@ -0,0 +1,88 @@ +from utils.request import api_request + + +class DeptApi: + """ + 部门管理模块相关接口 + """ + + @classmethod + def list_dept(cls, query: dict): + """ + 查询部门列表接口 + + :param query: 查询部门参数 + :return: + """ + return api_request( + url='/system/dept/list', + method='get', + params=query, + ) + + @classmethod + def list_dept_exclude_child(cls, dept_id: str): + """ + 查询部门列表(排除节点)接口 + + :param query: 部门id + :return: + """ + return api_request( + url=f'/system/dept/listexclude/{dept_id}', + method='get', + ) + + @classmethod + def get_dept(cls, dept_id: str): + """ + 查询部门详情接口 + + :param dept_id: 部门id + :return: + """ + return api_request( + url=f'/system/dept/{dept_id}', + method='get', + ) + + @classmethod + def add_dept(cls, json: dict): + """ + 新增部门接口 + + :param json: 新增部门参数 + :return: + """ + return api_request( + url='/system/dept', + method='post', + json=json, + ) + + @classmethod + def update_dept(cls, json: dict): + """ + 修改部门接口 + + :param json: 修改部门参数 + :return: + """ + return api_request( + url='/system/dept', + method='put', + json=json, + ) + + @classmethod + def del_dept(cls, dept_id: str): + """ + 删除部门接口 + + :param dept_id: 部门id + :return: + """ + return api_request( + url=f'/system/dept/{dept_id}', + method='delete', + ) diff --git a/dash-fastapi-frontend/api/system/dict/data.py b/dash-fastapi-frontend/api/system/dict/data.py new file mode 100644 index 0000000..acd440d --- /dev/null +++ b/dash-fastapi-frontend/api/system/dict/data.py @@ -0,0 +1,103 @@ +from utils.request import api_request + + +class DictDataApi: + """ + 字典数据管理模块相关接口 + """ + + @classmethod + def list_data(cls, query: dict): + """ + 查询字典数据列表接口 + + :param query: 查询字典数据参数 + :return: + """ + return api_request( + url='/system/dict/data/list', + method='get', + params=query, + ) + + @classmethod + def get_data(cls, dict_code: str): + """ + 查询字典数据详情接口 + + :param dict_code: 字典数据id + :return: + """ + return api_request( + url=f'/system/dict/data/{dict_code}', + method='get', + ) + + @classmethod + def get_dicts(cls, dict_type: str): + """ + 根据字典类型查询字典数据信息接口 + + :param dict_type: 字典类型 + :return: + """ + return api_request( + url=f'/system/dict/data/type/{dict_type}', + method='get', + ) + + @classmethod + def add_data(cls, json: dict): + """ + 新增字典数据接口 + + :param json: 新增字典数据参数 + :return: + """ + return api_request( + url='/system/dict/data', + method='post', + json=json, + ) + + @classmethod + def update_data(cls, json: dict): + """ + 修改字典数据接口 + + :param json: 修改字典数据参数 + :return: + """ + return api_request( + url='/system/dict/data', + method='put', + json=json, + ) + + @classmethod + def del_data(cls, dict_code: str): + """ + 删除字典数据接口 + + :param dict_code: 字典数据id + :return: + """ + return api_request( + url=f'/system/dict/data/{dict_code}', + method='delete', + ) + + @classmethod + def export_data(cls, data: dict): + """ + 导出字典数据接口 + + :param data: 导出字典数据参数 + :return: + """ + return api_request( + url='/system/dict/data/export', + method='post', + data=data, + stream=True, + ) diff --git a/dash-fastapi-frontend/api/system/dict/type.py b/dash-fastapi-frontend/api/system/dict/type.py new file mode 100644 index 0000000..73dd76b --- /dev/null +++ b/dash-fastapi-frontend/api/system/dict/type.py @@ -0,0 +1,114 @@ +from utils.request import api_request + + +class DictTypeApi: + """ + 字典类型管理模块相关接口 + """ + + @classmethod + def list_type(cls, query: dict): + """ + 查询字典类型列表接口 + + :param query: 查询字典类型参数 + :return: + """ + return api_request( + url='/system/dict/type/list', + method='get', + params=query, + ) + + @classmethod + def get_type(cls, dict_id: str): + """ + 查询字典类型详情接口 + + :param dict_id: 字典类型id + :return: + """ + return api_request( + url=f'/system/dict/type/{dict_id}', + method='get', + ) + + @classmethod + def add_type(cls, json: dict): + """ + 新增字典类型接口 + + :param json: 新增字典类型参数 + :return: + """ + return api_request( + url='/system/dict/type', + method='post', + json=json, + ) + + @classmethod + def update_type(cls, json: dict): + """ + 修改字典类型接口 + + :param json: 修改字典类型参数 + :return: + """ + return api_request( + url='/system/dict/type', + method='put', + json=json, + ) + + @classmethod + def del_type(cls, dict_id: str): + """ + 删除字典类型接口 + + :param dict_id: 字典类型id + :return: + """ + return api_request( + url=f'/system/dict/type/{dict_id}', + method='delete', + ) + + @classmethod + def export_type(cls, data: dict): + """ + 导出字典类型接口 + + :param data: 导出字典类型参数 + :return: + """ + return api_request( + url='/system/dict/type/export', + method='post', + data=data, + stream=True, + ) + + @classmethod + def refresh_cache(cls): + """ + 删除字典类型接口 + + :return: + """ + return api_request( + url='/system/dict/type/refreshCache', + method='delete', + ) + + @classmethod + def optionselect(cls): + """ + 查询字典类型详情接口 + + :return: + """ + return api_request( + url='/system/dict/type/optionselect', + method='get', + ) diff --git a/dash-fastapi-frontend/api/system/menu.py b/dash-fastapi-frontend/api/system/menu.py new file mode 100644 index 0000000..930b2c6 --- /dev/null +++ b/dash-fastapi-frontend/api/system/menu.py @@ -0,0 +1,100 @@ +from utils.request import api_request + + +class MenuApi: + """ + 菜单管理模块相关接口 + """ + + @classmethod + def list_menu(cls, query: dict): + """ + 查询菜单列表接口 + + :param query: 查询菜单参数 + :return: + """ + return api_request( + url='/system/menu/list', + method='get', + params=query, + ) + + @classmethod + def get_menu(cls, menu_id: str): + """ + 查询菜单详情接口 + + :param menu_id: 菜单id + :return: + """ + return api_request( + url=f'/system/menu/{menu_id}', + method='get', + ) + + @classmethod + def treeselect(cls): + """ + 查询菜单下拉树结构接口 + + :return: + """ + return api_request( + url='/system/menu/treeselect', + method='get', + ) + + @classmethod + def role_menu_treeselect(cls, role_id: str): + """ + 根据角色id查询菜单下拉树结构接口 + + :param role_id: 角色id + :return: + """ + return api_request( + url=f'/system/menu/roleMenuTreeselect/{role_id}', + method='get', + ) + + @classmethod + def add_menu(cls, json: dict): + """ + 新增菜单接口 + + :param json: 新增菜单参数 + :return: + """ + return api_request( + url='/system/menu', + method='post', + json=json, + ) + + @classmethod + def update_menu(cls, json: dict): + """ + 修改菜单接口 + + :param json: 修改菜单参数 + :return: + """ + return api_request( + url='/system/menu', + method='put', + json=json, + ) + + @classmethod + def del_menu(cls, menu_id: str): + """ + 删除菜单接口 + + :param menu_id: 菜单id + :return: + """ + return api_request( + url=f'/system/menu/{menu_id}', + method='delete', + ) diff --git a/dash-fastapi-frontend/api/system/notice.py b/dash-fastapi-frontend/api/system/notice.py new file mode 100644 index 0000000..b5203db --- /dev/null +++ b/dash-fastapi-frontend/api/system/notice.py @@ -0,0 +1,75 @@ +from utils.request import api_request + + +class NoticeApi: + """ + 通知公告管理模块相关接口 + """ + + @classmethod + def list_notice(cls, query: dict): + """ + 查询通知公告列表接口 + + :param query: 查询通知公告参数 + :return: + """ + return api_request( + url='/system/notice/list', + method='get', + params=query, + ) + + @classmethod + def get_notice(cls, notice_id: str): + """ + 查询通知公告详情接口 + + :param notice_id: 通知公告id + :return: + """ + return api_request( + url=f'/system/notice/{notice_id}', + method='get', + ) + + @classmethod + def add_notice(cls, json: dict): + """ + 新增通知公告接口 + + :param json: 新增通知公告参数 + :return: + """ + return api_request( + url='/system/notice', + method='post', + json=json, + ) + + @classmethod + def update_notice(cls, json: dict): + """ + 修改通知公告接口 + + :param json: 修改通知公告参数 + :return: + """ + return api_request( + url='/system/notice', + method='put', + json=json, + ) + + @classmethod + def del_notice(cls, notice_id: str): + """ + 删除通知公告接口 + + :param notice_id: 通知公告id + :return: + """ + return api_request( + url=f'/system/notice/{notice_id}', + method='delete', + ) diff --git a/dash-fastapi-frontend/api/system/post.py b/dash-fastapi-frontend/api/system/post.py new file mode 100644 index 0000000..2b32e95 --- /dev/null +++ b/dash-fastapi-frontend/api/system/post.py @@ -0,0 +1,90 @@ +from utils.request import api_request + + +class PostApi: + """ + 岗位管理模块相关接口 + """ + + @classmethod + def list_post(cls, query: dict): + """ + 查询岗位列表接口 + + :param query: 查询岗位参数 + :return: + """ + return api_request( + url='/system/post/list', + method='get', + params=query, + ) + + @classmethod + def get_post(cls, post_id: str): + """ + 查询岗位详情接口 + + :param post_id: 岗位id + :return: + """ + return api_request( + url=f'/system/post/{post_id}', + method='get', + ) + + @classmethod + def add_post(cls, json: dict): + """ + 新增岗位接口 + + :param json: 新增岗位参数 + :return: + """ + return api_request( + url='/system/post', + method='post', + json=json, + ) + + @classmethod + def update_post(cls, json: dict): + """ + 修改岗位接口 + + :param json: 修改岗位参数 + :return: + """ + return api_request( + url='/system/post', + method='put', + json=json, + ) + + @classmethod + def del_post(cls, post_id: str): + """ + 删除岗位接口 + + :param post_id: 岗位id + :return: + """ + return api_request( + url=f'/system/post/{post_id}', + method='delete', + ) + + @classmethod + def export_post(cls, data: dict): + """ + 导出岗位接口 + + :param data: 导出岗位参数 + :return: + """ + return api_request( + url='/system/post/export', + method='post', + data=data, + stream=True, + ) diff --git a/dash-fastapi-frontend/api/system/role.py b/dash-fastapi-frontend/api/system/role.py new file mode 100644 index 0000000..c82876f --- /dev/null +++ b/dash-fastapi-frontend/api/system/role.py @@ -0,0 +1,202 @@ +from utils.request import api_request + + +class RoleApi: + """ + 角色管理模块相关接口 + """ + + @classmethod + def list_role(cls, query: dict): + """ + 查询角色列表接口 + + :param query: 查询角色参数 + :return: + """ + return api_request( + url='/system/role/list', + method='get', + params=query, + ) + + @classmethod + def get_role(cls, role_id: str): + """ + 查询角色详情接口 + + :param role_id: 角色id + :return: + """ + return api_request( + url=f'/system/role/{role_id}', + method='get', + ) + + @classmethod + def add_role(cls, json: dict): + """ + 新增角色接口 + + :param json: 新增角色参数 + :return: + """ + return api_request( + url='/system/role', + method='post', + json=json, + ) + + @classmethod + def update_role(cls, json: dict): + """ + 修改角色接口 + + :param json: 修改角色参数 + :return: + """ + return api_request( + url='/system/role', + method='put', + json=json, + ) + + @classmethod + def data_scope(cls, json: dict): + """ + 角色数据权限接口 + + :param json: 角色数据权限参数 + :return: + """ + return api_request( + url='/system/role/dataScope', + method='put', + json=json, + ) + + @classmethod + def change_user_status(cls, role_id: str, status: str): + """ + 角色状态修改接口 + + :param role_id: 角色id + :param status: 角色状态 + :return: + """ + return api_request( + url='/system/role/changeStatus', + method='put', + json=dict(role_id=role_id, status=status), + ) + + @classmethod + def del_role(cls, role_id: str): + """ + 删除角色接口 + + :param role_id: 角色id + :return: + """ + return api_request( + url=f'/system/role/{role_id}', + method='delete', + ) + + @classmethod + def export_role(cls, data: dict): + """ + 导出角色接口 + + :param data: 导出角色参数 + :return: + """ + return api_request( + url='/system/role/export', + method='post', + data=data, + stream=True, + ) + + @classmethod + def allocated_user_list(cls, query: dict): + """ + 查询角色已授权用户列表接口 + + :param query: 查询角色已授权用户列表参数 + :return: + """ + return api_request( + url='/system/role/authUser/allocatedList', + method='get', + params=query, + ) + + @classmethod + def unallocated_user_list(cls, query: dict): + """ + 查询角色未授权用户列表接口 + + :param query: 查询角色未授权用户列表参数 + :return: + """ + return api_request( + url='/system/role/authUser/unallocatedList', + method='get', + params=query, + ) + + @classmethod + def auth_user_cancel(cls, json: dict): + """ + 取消用户授权角色接口 + + :param json: 用户授权角色参数 + :return: + """ + return api_request( + url='/system/role/authUser/cancel', + method='put', + json=json, + ) + + @classmethod + def auth_user_cancel_all(cls, json: dict): + """ + 批量取消用户授权角色接口 + + :param json: 用户授权角色参数 + :return: + """ + return api_request( + url='/system/role/authUser/cancelAll', + method='put', + json=json, + ) + + @classmethod + def auth_user_select_all(cls, json: dict): + """ + 授权用户选择接口 + + :param json: 用户选择角色参数 + :return: + """ + return api_request( + url='/system/role/authUser/selectAll', + method='put', + json=json, + ) + + @classmethod + def dept_tree_select(cls, role_id: str): + """ + 根据角色id查询部门树结构接口 + + :param role_id: 角色id + :return: + """ + return api_request( + url=f'/system/role/deptTree/{role_id}', + method='get', + ) diff --git a/dash-fastapi-frontend/api/system/user.py b/dash-fastapi-frontend/api/system/user.py new file mode 100644 index 0000000..43733bb --- /dev/null +++ b/dash-fastapi-frontend/api/system/user.py @@ -0,0 +1,201 @@ +from utils.request import api_request + + +class UserApi: + """ + 用户管理模块相关接口 + """ + + @classmethod + def list_user(cls, query: dict): + """ + 查询用户列表接口 + + :param query: 查询用户参数 + :return: + """ + return api_request( + url='/system/user/list', + method='get', + params=query, + ) + + @classmethod + def get_user(cls, user_id: str): + """ + 查询用户详情接口 + + :param user_id: 用户id + :return: + """ + return api_request( + url=f'/system/user/{user_id}', + method='get', + ) + + @classmethod + def add_user(cls, json: dict): + """ + 新增用户接口 + + :param json: 新增用户参数 + :return: + """ + return api_request( + url='/system/user', + method='post', + json=json, + ) + + @classmethod + def update_user(cls, json: dict): + """ + 修改用户接口 + + :param json: 修改用户参数 + :return: + """ + return api_request( + url='/system/user', + method='put', + json=json, + ) + + @classmethod + def del_user(cls, user_id: str): + """ + 删除用户接口 + + :param user_id: 用户id + :return: + """ + return api_request( + url=f'/system/user/{user_id}', + method='delete', + ) + + @classmethod + def export_user(cls, data: dict): + """ + 导出用户接口 + + :param data: 导出用户参数 + :return: + """ + return api_request( + url='/system/user/export', + method='post', + data=data, + stream=True, + ) + + @classmethod + def reset_user_pwd(cls, user_id: str, password: str): + """ + 用户密码重置接口 + + :param user_id: 用户id + :param password: 用户密码 + :return: + """ + return api_request( + url='/system/user/resetPwd', + method='put', + json=dict(user_id=user_id, password=password), + ) + + @classmethod + def change_user_status(cls, user_id: str, status: str): + """ + 用户状态修改接口 + + :param user_id: 用户id + :param password: 用户状态 + :return: + """ + return api_request( + url='/system/user/changeStatus', + method='put', + json=dict(user_id=user_id, status=status), + ) + + @classmethod + def get_user_profile(cls): + """ + 查询用户个人信息接口 + + :return: + """ + return api_request( + url='/system/user/profile', + method='get', + ) + + @classmethod + def update_user_profile(cls, json: dict): + """ + 修改用户个人信息接口 + + :param json: 修改用户个人信息参数 + :return: + """ + return api_request( + url='/system/user/profile', + method='put', + json=json, + ) + + @classmethod + def update_user_pwd(cls, old_password: str, new_password: str): + """ + 用户个人密码重置接口 + + :param old_password: 用户旧密码 + :param new_password: 用户新密码 + :return: + """ + return api_request( + url='/system/user/profile/updatePwd', + method='put', + json=dict(old_password=old_password, new_password=new_password), + ) + + @classmethod + def upload_avatar(cls, data: dict): + """ + 用户头像上传接口 + + :param data: 用户头像参数 + :return: + """ + return api_request( + url='/system/user/profile/avatar', + method='post', + data=data, + ) + + @classmethod + def update_auth_role(cls, json: dict): + """ + 保存授权角色接口 + + :param json: 授权角色参数 + :return: + """ + return api_request( + url='/system/user/authRole', + method='put', + json=json, + ) + + @classmethod + def dept_tree_select(cls): + """ + 查询部门下拉树结构接口 + + :return: + """ + return api_request( + url='/system/user/deptTree', + method='get', + ) diff --git a/dash-fastapi-frontend/app.py b/dash-fastapi-frontend/app.py index e1d840d..8b7682a 100644 --- a/dash-fastapi-frontend/app.py +++ b/dash-fastapi-frontend/app.py @@ -7,7 +7,7 @@ import feffery_utils_components as fuc from flask import session from operator import itemgetter -from server import app +from server import app, logger from config.env import AppConfig from config.global_config import RouterConfig from store.store import render_store_container @@ -16,8 +16,16 @@ from store.store import render_store_container import views from callbacks import app_c -from api.login import get_current_user_info_api -from utils.tree_tool import find_node_values, find_key_by_href, deal_user_menu_info, get_search_panel_data +from api.login import LoginApi +from api.router import RouterApi +from utils.cache_util import CacheManager +from utils.router_util import RouterUtil +from utils.tree_tool import ( + find_node_values, + find_key_by_href, + deal_user_menu_info, + get_search_panel_data, +) app.layout = html.Div( [ @@ -25,54 +33,46 @@ app.layout = html.Div( fuc.FefferyLocation(id='url-container'), # 用于回调pathname信息 dcc.Location(id='dcc-url', refresh=False), - # 注入js执行容器 - fuc.FefferyExecuteJs( - id='execute-js-container' - ), - + fuc.FefferyExecuteJs(id='execute-js-container'), # 注入页面内容挂载点 html.Div(id='app-mount'), - # 注入全局配置容器 fac.AntdConfigProvider(id='app-config-provider'), - # 注入快捷搜索面板 fuc.FefferyShortcutPanel( id='search-panel', data=[], placeholder='输入你想要搜索的菜单...', - panelStyles={ - 'accentColor': '#1890ff', - 'zIndex': 99999 - } + panelStyles={'accentColor': '#1890ff', 'zIndex': 99999}, ), - # 辅助处理多输入 -> 存储接口返回token校验信息 render_store_container(), - # 重定向容器 html.Div(id='redirect-container'), - # 登录消息失效对话框提示 fac.AntdModal( html.Div( [ - fac.AntdIcon(icon='fc-high-priority', style={'font-size': '28px'}), - fac.AntdText('用户信息已过期,请重新登录', style={'margin-left': '5px'}), + fac.AntdIcon( + icon='fc-high-priority', style={'font-size': '28px'} + ), + fac.AntdText( + '用户信息已过期,请重新登录', + style={'margin-left': '5px'}, + ), ] ), id='token-invalid-modal', visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), - # 注入全局消息提示容器 html.Div(id='global-message-container'), # 注入全局通知信息容器 - html.Div(id='global-notification-container') + html.Div(id='global-notification-container'), ] ) @@ -80,20 +80,24 @@ app.layout = html.Div( @app.callback( output=dict( app_mount=Output('app-mount', 'children'), - redirect_container=Output('redirect-container', 'children', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + redirect_container=Output( + 'redirect-container', 'children', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), menu_current_key=Output('current-key-container', 'data'), - menu_info=Output('menu-info-store-container', 'data'), - menu_list=Output('menu-list-store-container', 'data'), - search_panel_data=Output('search-panel', 'data') + search_panel_data=Output('search-panel', 'data'), ), inputs=dict(pathname=Input('url-container', 'pathname')), state=dict( url_trigger=State('url-container', 'trigger'), - session_token=State('token-container', 'data') + session_token=State('token-container', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) def router(pathname, url_trigger, session_token): """ @@ -104,103 +108,112 @@ def router(pathname, url_trigger, session_token): # 若已登录 if token_result and session_token and token_result == session_token: try: - current_user_result = get_current_user_info_api() - if current_user_result['code'] == 200: - current_user = current_user_result['data'] - menu_list = current_user['menu'] - user_menu_list = sorted([item for item in menu_list if item.get('visible') == '0'], key=itemgetter('order_num')) - menu_info = deal_user_menu_info(0, menu_list) - user_menu_info = deal_user_menu_info(0, user_menu_list) - search_panel_data = get_search_panel_data(user_menu_list) - session['user_info'] = current_user['user'] - session['dept_info'] = current_user['dept'] - session['role_info'] = current_user['role'] - session['post_info'] = current_user['post'] - dynamic_valid_pathname_list = find_node_values(menu_info, 'href') - valid_href_list = dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME - if pathname in valid_href_list: - current_key = find_key_by_href(menu_info, pathname) - if pathname == '/': - current_key = '首页' - if pathname == '/user/profile': - current_key = '个人资料' - if url_trigger == 'load': - - # 根据pathname控制渲染行为 - if pathname == '/login' or pathname == '/forget': - # 重定向到主页面 - return dict( - app_mount=dash.no_update, - redirect_container=dcc.Location(pathname='/', id='router-redirect'), - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, - menu_current_key={'current_key': current_key}, - menu_info={'menu_info': menu_info}, - menu_list={'menu_list': menu_list}, - search_panel_data=search_panel_data - ) - - # 否则正常渲染主页面 - return dict( - app_mount=views.layout.render_content(user_menu_info), - redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, - menu_current_key={'current_key': current_key}, - menu_info={'menu_info': menu_info}, - menu_list={'menu_list': menu_list}, - search_panel_data=search_panel_data - ) - - else: + if url_trigger == 'load': + current_user_result = LoginApi.get_info() + router_list_result = RouterApi.get_routers() + if ( + current_user_result['code'] == 200 + and router_list_result['code'] == 200 + ): + current_user = current_user_result + router_list = router_list_result['data'] + menu_info = RouterUtil.generate_menu_tree(router_list) + # search_panel_data = get_search_panel_data(user_menu_list) + search_panel_data = [] + session['user_info'] = current_user['user'] + permissions = { + 'perms': current_user['permissions'], + 'roles': current_user['roles'], + } + cache_obj = dict( + user_info=current_user['user'], + permissions=permissions, + menu_info=menu_info, + search_panel_data=search_panel_data, + ) + CacheManager.set(cache_obj) + else: + return dict( + app_mount=dash.no_update, + redirect_container=dash.no_update, + global_message_container=dash.no_update, + api_check_token_trigger={'timestamp': time.time()}, + menu_current_key=dash.no_update, + search_panel_data=dash.no_update, + ) + menu_info = CacheManager.get('menu_info') + search_panel_data = CacheManager.get('search_panel_data') + dynamic_valid_pathname_list = find_node_values(menu_info, 'href') + valid_href_list = ( + dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME + ) + if pathname in valid_href_list: + current_key = find_key_by_href(menu_info, pathname) + if pathname == '/': + current_key = '首页' + if pathname == '/user/profile': + current_key = '个人资料' + if url_trigger == 'load': + # 根据pathname控制渲染行为 + if pathname == '/login' or pathname == '/forget': + # 重定向到主页面 return dict( app_mount=dash.no_update, - redirect_container=None, + redirect_container=dcc.Location( + pathname='/', id='router-redirect' + ), global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key={'current_key': current_key}, - menu_info={'menu_info': menu_info}, - menu_list={'menu_list': menu_list}, - search_panel_data=search_panel_data + search_panel_data=search_panel_data, ) + user_menu_info = RouterUtil.generate_menu_tree( + RouterUtil.get_visible_routers(router_list) + ) + # 否则正常渲染主页面 + return dict( + app_mount=views.layout.render_content(user_menu_info), + redirect_container=None, + global_message_container=None, + api_check_token_trigger={'timestamp': time.time()}, + menu_current_key={'current_key': current_key}, + search_panel_data=search_panel_data, + ) + else: - # 渲染404状态页 return dict( - app_mount=views.page_404.render_content(), + app_mount=dash.no_update, redirect_container=None, global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, - menu_current_key=dash.no_update, - menu_info=dash.no_update, - menu_list=dash.no_update, - search_panel_data=dash.no_update + menu_current_key={'current_key': current_key}, + search_panel_data=search_panel_data, ) else: + # 渲染404状态页 return dict( - app_mount=dash.no_update, - redirect_container=dash.no_update, - global_message_container=dash.no_update, + app_mount=views.page_404.render_content(), + redirect_container=None, + global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, - menu_info=dash.no_update, - menu_list=dash.no_update, - search_panel_data=dash.no_update + search_panel_data=dash.no_update, ) except Exception as e: - print(e) + logger.exception(e) return dict( app_mount=dash.no_update, redirect_container=None, - global_message_container=fuc.FefferyFancyNotification('接口异常', type='error', autoClose=2000), + global_message_container=fuc.FefferyFancyNotification( + '接口异常', type='error', autoClose=2000 + ), api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, - menu_info=dash.no_update, - menu_list=dash.no_update, - search_panel_data=dash.no_update + search_panel_data=dash.no_update, ) else: # 若未登录 @@ -214,9 +227,7 @@ def router(pathname, url_trigger, session_token): global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, - menu_info=dash.no_update, - menu_list=dash.no_update, - search_panel_data=dash.no_update + search_panel_data=dash.no_update, ) if pathname == '/login': @@ -226,9 +237,7 @@ def router(pathname, url_trigger, session_token): global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, - menu_info=dash.no_update, - menu_list=dash.no_update, - search_panel_data=dash.no_update + search_panel_data=dash.no_update, ) if pathname == '/forget': @@ -238,23 +247,25 @@ def router(pathname, url_trigger, session_token): global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, - menu_info=dash.no_update, - menu_list=dash.no_update, - search_panel_data=dash.no_update + search_panel_data=dash.no_update, ) # 否则重定向到登录页 return dict( app_mount=dash.no_update, - redirect_container=dcc.Location(pathname='/login', id='router-redirect'), + redirect_container=dcc.Location( + pathname='/login', id='router-redirect' + ), global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, - menu_info=dash.no_update, - menu_list=dash.no_update, - search_panel_data=dash.no_update + search_panel_data=dash.no_update, ) if __name__ == '__main__': - app.run(host=AppConfig.app_host, port=AppConfig.app_port, debug=AppConfig.app_debug) + app.run( + host=AppConfig.app_host, + port=AppConfig.app_port, + debug=AppConfig.app_debug, + ) diff --git a/dash-fastapi-frontend/callbacks/app_c.py b/dash-fastapi-frontend/callbacks/app_c.py index be94265..fe7bf28 100644 --- a/dash-fastapi-frontend/callbacks/app_c.py +++ b/dash-fastapi-frontend/callbacks/app_c.py @@ -56,12 +56,12 @@ def redirect_page(okCounts): State('custom-app-primary-color-container', 'data') ) def get_primary_color(_, custom_color): - if not custom_color: - primary_color_res = query_config_list_api(config_key='sys.index.skinName') - if primary_color_res.get('code') == 200: - primary_color = primary_color_res.get('data') + # if not custom_color: + # primary_color_res = query_config_list_api(config_key='sys.index.skinName') + # if primary_color_res.get('code') == 200: + # primary_color = primary_color_res.get('data') - return primary_color + # return primary_color return dash.no_update diff --git a/dash-fastapi-frontend/callbacks/layout_c/head_c.py b/dash-fastapi-frontend/callbacks/layout_c/head_c.py index a64910c..18e347f 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/head_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/head_c.py @@ -5,7 +5,7 @@ from flask import session from dash.dependencies import Input, Output, State from server import app -from api.login import logout_api +from api.login import LoginApi # 页首右侧个人中心选项卡回调 @@ -52,7 +52,7 @@ app.clientside_callback( ) def logout_confirm(okCounts): if okCounts: - result = logout_api() + result = LoginApi.logout() if result['code'] == 200: session.clear() diff --git a/dash-fastapi-frontend/callbacks/layout_c/index_c.py b/dash-fastapi-frontend/callbacks/layout_c/index_c.py index d966cf8..c57e317 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/index_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/index_c.py @@ -1,4 +1,5 @@ import dash +import importlib from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate import feffery_antd_components as fac @@ -7,23 +8,39 @@ from flask import json, session from collections import OrderedDict from server import app -import views -from utils.tree_tool import find_title_by_key, find_modules_by_key, find_href_by_key, find_parents +import views # noqa: F401 +from utils.cache_util import CacheManager +from utils.tree_tool import ( + find_title_by_key, + find_modules_by_key, + find_href_by_key, + find_parents, +) @app.callback( - [Output('tabs-container', 'items', allow_duplicate=True), - Output('tabs-container', 'activeKey', allow_duplicate=True)], - [Input('index-side-menu', 'currentKey'), - Input('tabs-container', 'tabCloseCounts')], - [State('tabs-container', 'latestDeletePane'), - State('tabs-container', 'items'), - State('tabs-container', 'activeKey'), - State('menu-info-store-container', 'data'), - State('menu-list-store-container', 'data')], - prevent_initial_call=True + [ + Output('tabs-container', 'items', allow_duplicate=True), + Output('tabs-container', 'activeKey', allow_duplicate=True), + ], + [ + Input('index-side-menu', 'currentKey'), + Input('tabs-container', 'tabCloseCounts'), + ], + [ + State('tabs-container', 'latestDeletePane'), + State('tabs-container', 'items'), + State('tabs-container', 'activeKey'), + ], + prevent_initial_call=True, ) -def handle_tab_switch_and_create(currentKey, tabCloseCounts, latestDeletePane, origin_items, activeKey, menu_info, menu_list): +def handle_tab_switch_and_create( + currentKey, + tabCloseCounts, + latestDeletePane, + origin_items, + activeKey, +): """ 这个回调函数用于处理标签页子项的新建、切换及删除 具体策略: @@ -42,62 +59,60 @@ def handle_tab_switch_and_create(currentKey, tabCloseCounts, latestDeletePane, o new_items = dash.Patch() if trigger_id == 'index-side-menu': - # 判断当前新选中的菜单栏项对应标签页是否已创建 if currentKey in [item['key'] for item in origin_items]: - return [ - dash.no_update, - currentKey - ] + return [dash.no_update, currentKey] if currentKey == '个人资料': menu_title = '个人资料' - button_perms = [] - role_perms = [] menu_modules = 'system.user.profile' else: - menu_title = find_title_by_key(menu_info.get('menu_info'), currentKey) - button_perms = [item.get('perms') for item in menu_list.get('menu_list') if str(item.get('parent_id')) == currentKey] - role_perms = [item.get('role_key') for item in session.get('role_info')] + menu_title = find_title_by_key( + CacheManager.get('menu_info'), currentKey + ) # 判断当前选中的菜单栏项是否存在module,如果有,则动态导入module,否则返回404页面 - menu_modules = find_modules_by_key(menu_info.get('menu_info'), currentKey) + menu_modules = find_modules_by_key( + CacheManager.get('menu_info'), currentKey + ) for index, item in enumerate(origin_items): - if {'key': '关闭右侧', 'label': '关闭右侧', 'icon': 'antd-arrow-right'} not in item['contextMenu']: - item['contextMenu'].insert(-1, { - 'key': '关闭右侧', - 'label': '关闭右侧', - 'icon': 'antd-arrow-right' - }) + if { + 'key': '关闭右侧', + 'label': '关闭右侧', + 'icon': 'antd-arrow-right', + } not in item['contextMenu']: + item['contextMenu'].insert( + -1, + { + 'key': '关闭右侧', + 'label': '关闭右侧', + 'icon': 'antd-arrow-right', + }, + ) new_items[index]['contextMenu'] = item['contextMenu'] context_menu = [ - { - 'key': '刷新页面', - 'label': '刷新页面', - 'icon': 'antd-reload' - }, - { - 'key': '关闭当前', - 'label': '关闭当前', - 'icon': 'antd-close' - }, + {'key': '刷新页面', 'label': '刷新页面', 'icon': 'antd-reload'}, + {'key': '关闭当前', 'label': '关闭当前', 'icon': 'antd-close'}, { 'key': '关闭其他', 'label': '关闭其他', - 'icon': 'antd-close-circle' + 'icon': 'antd-close-circle', }, { 'key': '全部关闭', 'label': '全部关闭', - 'icon': 'antd-close-circle' - } + 'icon': 'antd-close-circle', + }, ] if len(origin_items) != 1: - context_menu.insert(-1, { - 'key': '关闭左侧', - 'label': '关闭左侧', - 'icon': 'antd-arrow-left' - }) + context_menu.insert( + -1, + { + 'key': '关闭左侧', + 'label': '关闭左侧', + 'icon': 'antd-arrow-left', + }, + ) if menu_modules: if menu_modules == 'link': raise PreventUpdate @@ -108,8 +123,10 @@ def handle_tab_switch_and_create(currentKey, tabCloseCounts, latestDeletePane, o { 'label': menu_title, 'key': currentKey, - 'children': eval('views.' + menu_modules + '.render(button_perms=button_perms, role_perms=role_perms)'), - 'contextMenu': context_menu + 'children': importlib.import_module( + 'views.' + menu_modules + ).render(), + 'contextMenu': context_menu, } ) else: @@ -121,22 +138,15 @@ def handle_tab_switch_and_create(currentKey, tabCloseCounts, latestDeletePane, o status='404', title='页面不存在', subTitle='请先配置该路由的页面', - style={ - 'paddingBottom': 0, - 'paddingTop': 0 - } + style={'paddingBottom': 0, 'paddingTop': 0}, ), - 'contextMenu': context_menu + 'contextMenu': context_menu, } ) - return [ - new_items, - currentKey - ] + return [new_items, currentKey] elif trigger_id == 'tabs-container': - # 如果删除的是当前标签页则回到最后新增的标签页,否则保持当前标签页不变 for index, item in enumerate(origin_items): if item['key'] == latestDeletePane: @@ -144,75 +154,82 @@ def handle_tab_switch_and_create(currentKey, tabCloseCounts, latestDeletePane, o { 'key': '刷新页面', 'label': '刷新页面', - 'icon': 'antd-reload' + 'icon': 'antd-reload', }, { 'key': '关闭其他', 'label': '关闭其他', - 'icon': 'antd-close-circle' + 'icon': 'antd-close-circle', }, { 'key': '全部关闭', 'label': '全部关闭', - 'icon': 'antd-close-circle' - } + 'icon': 'antd-close-circle', + }, ] if index == 1: if len(origin_items) == 2: new_items[0]['contextMenu'] = context_menu else: - origin_items[2]['contextMenu'].remove({ - 'key': '关闭左侧', - 'label': '关闭左侧', - 'icon': 'antd-arrow-left' - }) - new_items[2]['contextMenu'] = origin_items[2]['contextMenu'] + origin_items[2]['contextMenu'].remove( + { + 'key': '关闭左侧', + 'label': '关闭左侧', + 'icon': 'antd-arrow-left', + } + ) + new_items[2]['contextMenu'] = origin_items[2][ + 'contextMenu' + ] elif index == 2: if len(origin_items) == 3: - origin_items[1]['contextMenu'].remove({ - 'key': '关闭右侧', - 'label': '关闭右侧', - 'icon': 'antd-arrow-right' - }) - new_items[1]['contextMenu'] = origin_items[1]['contextMenu'] + origin_items[1]['contextMenu'].remove( + { + 'key': '关闭右侧', + 'label': '关闭右侧', + 'icon': 'antd-arrow-right', + } + ) + new_items[1]['contextMenu'] = origin_items[1][ + 'contextMenu' + ] else: if index == len(origin_items) - 1: - new_items[index - 1]['contextMenu'] = item['contextMenu'] + new_items[index - 1]['contextMenu'] = item[ + 'contextMenu' + ] del new_items[index] break new_origin_items = [ - item for item in - origin_items if item['key'] != latestDeletePane + item for item in origin_items if item['key'] != latestDeletePane ] return [ new_items, - new_origin_items[-1]['key'] if activeKey == latestDeletePane else activeKey + new_origin_items[-1]['key'] + if activeKey == latestDeletePane + else activeKey, ] raise PreventUpdate @app.callback( - [Output('tabs-container', 'items', allow_duplicate=True), - Output('tabs-container', 'activeKey', allow_duplicate=True), - Output('trigger-reload-output', 'reload', allow_duplicate=True)], + [ + Output('tabs-container', 'items', allow_duplicate=True), + Output('tabs-container', 'activeKey', allow_duplicate=True), + Output('trigger-reload-output', 'reload', allow_duplicate=True), + ], Input('tabs-container', 'clickedContextMenu'), - [State('tabs-container', 'items'), - State('tabs-container', 'activeKey')], - prevent_initial_call=True + [State('tabs-container', 'items'), State('tabs-container', 'activeKey')], + prevent_initial_call=True, ) def handle_via_context_menu(clickedContextMenu, origin_items, activeKey): """ 基于标签页标题右键菜单的额外标签页控制 """ if clickedContextMenu['menuKey'] == '刷新页面': - - return [ - dash.no_update, - dash.no_update, - True - ] + return [dash.no_update, dash.no_update, True] if '关闭' in clickedContextMenu['menuKey']: new_items = dash.Patch() @@ -223,51 +240,64 @@ def handle_via_context_menu(clickedContextMenu, origin_items, activeKey): { 'key': '刷新页面', 'label': '刷新页面', - 'icon': 'antd-reload' + 'icon': 'antd-reload', }, { 'key': '关闭其他', 'label': '关闭其他', - 'icon': 'antd-close-circle' + 'icon': 'antd-close-circle', }, { 'key': '全部关闭', 'label': '全部关闭', - 'icon': 'antd-close-circle' - } + 'icon': 'antd-close-circle', + }, ] if index == 1: if len(origin_items) == 2: new_items[0]['contextMenu'] = context_menu else: - origin_items[2]['contextMenu'].remove({ - 'key': '关闭左侧', - 'label': '关闭左侧', - 'icon': 'antd-arrow-left' - }) - new_items[2]['contextMenu'] = origin_items[2]['contextMenu'] + origin_items[2]['contextMenu'].remove( + { + 'key': '关闭左侧', + 'label': '关闭左侧', + 'icon': 'antd-arrow-left', + } + ) + new_items[2]['contextMenu'] = origin_items[2][ + 'contextMenu' + ] elif index == 2: if len(origin_items) == 3: - origin_items[1]['contextMenu'].remove({ - 'key': '关闭右侧', - 'label': '关闭右侧', - 'icon': 'antd-arrow-right' - }) - new_items[1]['contextMenu'] = origin_items[1]['contextMenu'] + origin_items[1]['contextMenu'].remove( + { + 'key': '关闭右侧', + 'label': '关闭右侧', + 'icon': 'antd-arrow-right', + } + ) + new_items[1]['contextMenu'] = origin_items[1][ + 'contextMenu' + ] else: if index == len(origin_items) - 1: - new_items[index - 1]['contextMenu'] = item['contextMenu'] + new_items[index - 1]['contextMenu'] = item[ + 'contextMenu' + ] del new_items[index] break new_origin_items = [ - item for item in - origin_items if item['key'] != clickedContextMenu['tabKey'] + item + for item in origin_items + if item['key'] != clickedContextMenu['tabKey'] ] return [ new_items, - new_origin_items[-1]['key'] if activeKey == clickedContextMenu['tabKey'] else activeKey, - dash.no_update + new_origin_items[-1]['key'] + if activeKey == clickedContextMenu['tabKey'] + else activeKey, + dash.no_update, ] elif clickedContextMenu['menuKey'] == '关闭其他': @@ -277,166 +307,148 @@ def handle_via_context_menu(clickedContextMenu, origin_items, activeKey): current_index = index for i in range(1, current_index): del new_items[1] - for j in range(current_index+1, len(origin_items)+1): + for j in range(current_index + 1, len(origin_items) + 1): del new_items[2] context_menu = [ - { - 'key': '刷新页面', - 'label': '刷新页面', - 'icon': 'antd-reload' - }, + {'key': '刷新页面', 'label': '刷新页面', 'icon': 'antd-reload'}, { 'key': '关闭其他', 'label': '关闭其他', - 'icon': 'antd-close-circle' + 'icon': 'antd-close-circle', }, { 'key': '全部关闭', 'label': '全部关闭', - 'icon': 'antd-close-circle' - } + 'icon': 'antd-close-circle', + }, ] if clickedContextMenu['tabKey'] == '首页': new_items[0]['contextMenu'] = context_menu else: - context_menu.insert(1, { - 'key': '关闭当前', - 'label': '关闭当前', - 'icon': 'antd-close' - }) + context_menu.insert( + 1, + { + 'key': '关闭当前', + 'label': '关闭当前', + 'icon': 'antd-close', + }, + ) new_items[1]['contextMenu'] = context_menu - return [ - new_items, - clickedContextMenu['tabKey'], - dash.no_update - ] + return [new_items, clickedContextMenu['tabKey'], dash.no_update] elif clickedContextMenu['menuKey'] == '关闭左侧': current_index = 0 for index, item in enumerate(origin_items): if item['key'] == clickedContextMenu['tabKey']: current_index = index - item['contextMenu'].remove({ - 'key': '关闭左侧', - 'label': '关闭左侧', - 'icon': 'antd-arrow-left' - }) + item['contextMenu'].remove( + { + 'key': '关闭左侧', + 'label': '关闭左侧', + 'icon': 'antd-arrow-left', + } + ) new_items[index]['contextMenu'] = item['contextMenu'] break for i in range(1, current_index): del new_items[1] - return [ - new_items, - clickedContextMenu['tabKey'], - dash.no_update - ] + return [new_items, clickedContextMenu['tabKey'], dash.no_update] elif clickedContextMenu['menuKey'] == '关闭右侧': current_index = 0 for index, item in enumerate(origin_items): if item['key'] == clickedContextMenu['tabKey']: current_index = index - item['contextMenu'].remove({ - 'key': '关闭右侧', - 'label': '关闭右侧', - 'icon': 'antd-arrow-right' - }) + item['contextMenu'].remove( + { + 'key': '关闭右侧', + 'label': '关闭右侧', + 'icon': 'antd-arrow-right', + } + ) new_items[index]['contextMenu'] = item['contextMenu'] break - for i in range(current_index+1, len(origin_items)+1): - del new_items[current_index+1] + for i in range(current_index + 1, len(origin_items) + 1): + del new_items[current_index + 1] - return [ - new_items, - clickedContextMenu['tabKey'], - dash.no_update - ] + return [new_items, clickedContextMenu['tabKey'], dash.no_update] for i in range(len(origin_items)): del new_items[1] new_items[0]['contextMenu'] = [ - { - 'key': '刷新页面', - 'label': '刷新页面', - 'icon': 'antd-reload' - }, + {'key': '刷新页面', 'label': '刷新页面', 'icon': 'antd-reload'}, { 'key': '关闭其他', 'label': '关闭其他', - 'icon': 'antd-close-circle' + 'icon': 'antd-close-circle', }, { 'key': '全部关闭', 'label': '全部关闭', - 'icon': 'antd-close-circle' - } + 'icon': 'antd-close-circle', + }, ] # 否则则为全部关闭 - return [ - new_items, - '首页', - dash.no_update - ] + return [new_items, '首页', dash.no_update] raise PreventUpdate # 页首面包屑和hash回调 @app.callback( - [Output('header-breadcrumb', 'items'), - Output('dcc-url', 'pathname', allow_duplicate=True)], + [ + Output('header-breadcrumb', 'items'), + Output('dcc-url', 'pathname', allow_duplicate=True), + ], Input('tabs-container', 'activeKey'), - State('menu-info-store-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_current_breadcrumbs(active_key, menu_info): +def get_current_breadcrumbs(active_key): if active_key: - if active_key == '首页': return [ [ - { - 'title': '首页', - 'icon': 'antd-dashboard', - 'href': '/' - }, + {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, ], - '/' + '/', ] elif active_key == '个人资料': return [ [ - { - 'title': '首页', - 'icon': 'antd-dashboard', - 'href': '/' - }, + {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, { 'title': '个人资料', - } + }, ], - '/user/profile' + '/user/profile', ] else: - result = find_parents(menu_info.get('menu_info'), active_key) + result = find_parents(CacheManager.get('menu_info'), active_key) # 去除result的重复项 - parent_info = list(OrderedDict((json.dumps(d, ensure_ascii=False), d) for d in result).values()) + parent_info = list( + OrderedDict( + (json.dumps(d, ensure_ascii=False), d) for d in result + ).values() + ) if parent_info: - current_href = find_href_by_key(menu_info.get('menu_info'), active_key) + current_href = find_href_by_key( + CacheManager.get('menu_info'), active_key + ) return [ [ { 'title': '首页', 'icon': 'antd-dashboard', - 'href': '/' + 'href': '/', }, - ] + parent_info, - current_href + ] + + parent_info, + current_href, ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index e3b2059..6a09ee6 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -7,13 +7,17 @@ import time from server import app from utils.common import validate_data_not_empty -from api.login import login_api, get_captcha_image_api +from api.login import LoginApi @app.callback( output=dict( - username_form_status=Output('login-username-form-item', 'validateStatus'), - password_form_status=Output('login-password-form-item', 'validateStatus'), + username_form_status=Output( + 'login-username-form-item', 'validateStatus' + ), + password_form_status=Output( + 'login-password-form-item', 'validateStatus' + ), captcha_form_status=Output('login-captcha-form-item', 'validateStatus'), username_form_help=Output('login-username-form-item', 'help'), password_form_help=Output('login-password-form-item', 'help'), @@ -21,34 +25,51 @@ from api.login import login_api, get_captcha_image_api image_click=Output('login-captcha-image-container', 'n_clicks'), submit_loading=Output('login-submit', 'loading'), token=Output('token-container', 'data'), - redirect_container=Output('redirect-container', 'children', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - nClicks=Input('login-submit', 'nClicks') + redirect_container=Output( + 'redirect-container', 'children', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(nClicks=Input('login-submit', 'nClicks')), state=dict( username=State('login-username', 'value'), password=State('login-password', 'value'), input_captcha=State('login-captcha', 'value'), session_id=State('captcha_image-session_id-container', 'data'), image_click=State('login-captcha-image-container', 'n_clicks'), - captcha_hidden=State('captcha-row-container', 'hidden') + captcha_hidden=State('captcha-row-container', 'hidden'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def login_auth(nClicks, username, password, input_captcha, session_id, image_click, captcha_hidden): +def login_auth( + nClicks, + username, + password, + input_captcha, + session_id, + image_click, + captcha_hidden, +): if nClicks: if captcha_hidden: input_captcha = 'hidden' # 校验全部输入值是否不为空 - if all(validate_data_not_empty(item) for item in [username, password, input_captcha]): - + if all( + validate_data_not_empty(item) + for item in [username, password, input_captcha] + ): try: - user_params = dict(username=username, password=password, captcha=input_captcha, session_id=session_id) - userinfo_result = login_api(user_params) + user_params = dict( + username=username, + password=password, + code=input_captcha, + uuid=session_id, + ) + userinfo_result = LoginApi.login(user_params) if userinfo_result['code'] == 200: - token = userinfo_result['data']['access_token'] + token = userinfo_result['token'] session['Authorization'] = token return dict( username_form_status=None, @@ -60,12 +81,15 @@ def login_auth(nClicks, username, password, input_captcha, session_id, image_cli image_click=dash.no_update, submit_loading=False, token=token, - redirect_container=dcc.Location(pathname='/', id='login-redirect'), - global_message_container=fuc.FefferyFancyMessage('登录成功', type='success') + redirect_container=dcc.Location( + pathname='/', id='login-redirect' + ), + global_message_container=fuc.FefferyFancyMessage( + '登录成功', type='success' + ), ) else: - return dict( username_form_status=None, password_form_status=None, @@ -77,7 +101,9 @@ def login_auth(nClicks, username, password, input_captcha, session_id, image_cli submit_loading=False, token=None, redirect_container=None, - global_message_container=fuc.FefferyFancyMessage(userinfo_result.get('message'), type='error') + global_message_container=fuc.FefferyFancyMessage( + userinfo_result.get('msg'), type='error' + ), ) except Exception as e: print(e) @@ -92,21 +118,35 @@ def login_auth(nClicks, username, password, input_captcha, session_id, image_cli submit_loading=False, token=None, redirect_container=None, - global_message_container=fuc.FefferyFancyMessage('接口异常', type='error') + global_message_container=fuc.FefferyFancyMessage( + '接口异常', type='error' + ), ) return dict( - username_form_status=None if validate_data_not_empty(username) else 'error', - password_form_status=None if validate_data_not_empty(password) else 'error', - captcha_form_status=None if validate_data_not_empty(input_captcha) else 'error', - username_form_help=None if validate_data_not_empty(username) else '请输入用户名!', - password_form_help=None if validate_data_not_empty(password) else '请输入密码!', - captcha_form_help=None if validate_data_not_empty(input_captcha) else '请输入验证码!', + username_form_status=None + if validate_data_not_empty(username) + else 'error', + password_form_status=None + if validate_data_not_empty(password) + else 'error', + captcha_form_status=None + if validate_data_not_empty(input_captcha) + else 'error', + username_form_help=None + if validate_data_not_empty(username) + else '请输入用户名!', + password_form_help=None + if validate_data_not_empty(password) + else '请输入密码!', + captcha_form_help=None + if validate_data_not_empty(input_captcha) + else '请输入验证码!', image_click=dash.no_update, submit_loading=False, token=None, redirect_container=None, - global_message_container=None + global_message_container=None, ) return dict( @@ -120,42 +160,50 @@ def login_auth(nClicks, username, password, input_captcha, session_id, image_cli submit_loading=dash.no_update, token=dash.no_update, redirect_container=dash.no_update, - global_message_container=dash.no_update + global_message_container=dash.no_update, ) @app.callback( - [Output('login-captcha-image', 'src'), - Output('captcha_image-session_id-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('login-captcha-image', 'src'), + Output('captcha_image-session_id-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('login-captcha-image-container', 'n_clicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_login_captcha_image(captcha_click): if captcha_click: try: - captcha_image_info = get_captcha_image_api() + captcha_image_info = LoginApi.get_code_img() if captcha_image_info.get('code') == 200: - captcha_image = captcha_image_info.get('data').get('image') - session_id = captcha_image_info.get('data').get('session_id') + captcha_image = ( + f"data:image/gif;base64,{captcha_image_info.get('img')}" + ) + session_id = captcha_image_info.get('uuid') return [ captcha_image, session_id, dash.no_update, - dash.no_update + dash.no_update, ] else: return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - dash.no_update + dash.no_update, ] except Exception as e: - - return [dash.no_update, dash.no_update, {'timestamp': time.time()}, fuc.FefferyFancyMessage('接口异常', type='error')] + return [ + dash.no_update, + dash.no_update, + {'timestamp': time.time()}, + fuc.FefferyFancyMessage('接口异常', type='error'), + ] return [dash.no_update] * 4 @@ -163,12 +211,14 @@ def change_login_captcha_image(captcha_click): @app.callback( Output('container', 'style'), Input('url-container', 'pathname'), - State('container', 'style') + State('container', 'style'), ) def random_bg(pathname, old_style): return { **old_style, - 'backgroundImage': 'url({})'.format(dash.get_asset_url('imgs/login-background.jpg')), + 'backgroundImage': 'url({})'.format( + dash.get_asset_url('imgs/login-background.jpg') + ), 'backgroundRepeat': 'no-repeat', - 'backgroundSize': 'cover' + 'backgroundSize': 'cover', } diff --git a/dash-fastapi-frontend/config/env.py b/dash-fastapi-frontend/config/env.py index afa30bb..6b01bd7 100644 --- a/dash-fastapi-frontend/config/env.py +++ b/dash-fastapi-frontend/config/env.py @@ -1,6 +1,6 @@ import os import argparse -from pydantic import BaseSettings +from pydantic_settings import BaseSettings from functools import lru_cache from dotenv import load_dotenv @@ -18,8 +18,8 @@ class AppSettings(BaseSettings): app_host: str = '0.0.0.0' app_port: int = 8088 app_debug: bool = True - app_compress_algorithm = 'br' - app_compress_br_level = 11 + app_compress_algorithm: str = 'br' + app_compress_br_level: int = 11 class GetConfig: diff --git a/dash-fastapi-frontend/ruff.toml b/dash-fastapi-frontend/ruff.toml new file mode 100644 index 0000000..ab99b0a --- /dev/null +++ b/dash-fastapi-frontend/ruff.toml @@ -0,0 +1,4 @@ +line-length = 80 + +[format] +quote-style = "single" \ No newline at end of file diff --git a/dash-fastapi-frontend/server.py b/dash-fastapi-frontend/server.py index 026ad3d..7e4e88e 100644 --- a/dash-fastapi-frontend/server.py +++ b/dash-fastapi-frontend/server.py @@ -11,7 +11,7 @@ app = dash.Dash( __name__, compress=True, suppress_callback_exceptions=True, - update_title=None + update_title=None, ) server = app.server @@ -23,33 +23,60 @@ app.server.secret_key = AppConfig.app_secret_key app.server.config['COMPRESS_ALGORITHM'] = AppConfig.app_compress_algorithm app.server.config['COMPRESS_BR_LEVEL'] = AppConfig.app_compress_br_level -log_time = time.strftime("%Y%m%d", time.localtime()) +log_time = time.strftime('%Y%m%d', time.localtime()) # sys_log_file_path = os.path.join(PathConfig.ABS_ROOT_PATH, 'log', 'sys_log', f'sys_request_log_{log_time}.log') -api_log_file_path = os.path.join(PathConfig.ABS_ROOT_PATH, 'log', 'api_log', f'api_request_log_{log_time}.log') +api_log_file_path = os.path.join( + PathConfig.ABS_ROOT_PATH, + 'log', + 'api_log', + f'api_request_log_{log_time}.log', +) # logger.add(sys_log_file_path, filter=lambda x: '[sys]' in x['message'], # rotation="50MB", encoding="utf-8", enqueue=True, compression="zip") -logger.add(api_log_file_path, filter=lambda x: '[api]' in x['message'], - rotation="50MB", encoding="utf-8", enqueue=True, compression="zip") +logger.add( + api_log_file_path, + filter=lambda x: '[api]' in x['message'], + rotation='50MB', + encoding='utf-8', + enqueue=True, + compression='zip', +) # 获取用户浏览器信息 @server.before_request def get_user_agent_info(): - request_addr = request.headers.get("X-Forwarded-For") if AppConfig.app_env == 'prod' else request.remote_addr + request_addr = ( + request.headers.get('X-Forwarded-For') + if AppConfig.app_env == 'prod' + else request.remote_addr + ) user_string = str(request.user_agent) user_agent = parse(user_string) bw = user_agent.browser.family if user_agent.browser.version != (): bw_version = user_agent.browser.version[0] if bw == 'IE': - logger.warning("[sys]请求人:{}||请求IP:{}||请求方法:{}||请求Data:{}", - session.get('name'), request_addr, request.method, '用户使用IE内核') + logger.warning( + '[sys]请求人:{}||请求IP:{}||请求方法:{}||请求Data:{}', + session.get('name'), + request_addr, + request.method, + '用户使用IE内核', + ) return "

请不要使用IE浏览器或360浏览器兼容模式

" if bw_version < 71: - logger.warning("[sys]请求人:{}||请求IP:{}||请求方法:{}||请求Data:{}", - session.get('name'), request_addr, request.method, '用户Chrome内核版本太低') - return "

Chrome内核版本号太低,请升级浏览器

" \ - "

点击此处可下载最新版Chrome浏览器

" + logger.warning( + '[sys]请求人:{}||请求IP:{}||请求方法:{}||请求Data:{}', + session.get('name'), + request_addr, + request.method, + '用户Chrome内核版本太低', + ) + return ( + "

Chrome内核版本号太低,请升级浏览器

" + "

点击此处可下载最新版Chrome浏览器

" + ) # 配置系统日志 diff --git a/dash-fastapi-frontend/utils/cache_util.py b/dash-fastapi-frontend/utils/cache_util.py new file mode 100644 index 0000000..245fa0c --- /dev/null +++ b/dash-fastapi-frontend/utils/cache_util.py @@ -0,0 +1,52 @@ +from cachebox import LRUCache +from flask import session +from typing import Dict + + +cache_manager = LRUCache(maxsize=10000, iterable=None, capacity=10000) + + +class CacheManager: + """ + 缓存管理器 + """ + + @classmethod + def get(cls, target_key: str): + """ + 获取缓存值 + + :param target_key: 缓存key + :return: 缓存值 + """ + cache_value = cache_manager.get(session.get('Authorization')).get( + target_key + ) + return cache_value + + @classmethod + def set(cls, target_obj: Dict): + """ + 设置缓存值 + + :param target_obj: 缓存值 + :return: + """ + cache = cache_manager.get(session.get('Authorization')) + if cache: + cache.update(target_obj) + else: + cache = target_obj + cache_manager.insert(session.get('Authorization'), cache) + + @classmethod + def delete(cls, target_key: str): + """ + 删除缓存值 + + :param target_key: 缓存key + :return: + """ + cache = cache_manager.get(session.get('Authorization')) + cache.pop(target_key, None) + cache_manager.insert(session.get('Authorization'), cache) diff --git a/dash-fastapi-frontend/utils/permission_util.py b/dash-fastapi-frontend/utils/permission_util.py new file mode 100644 index 0000000..080161b --- /dev/null +++ b/dash-fastapi-frontend/utils/permission_util.py @@ -0,0 +1,65 @@ +from typing import List, Union +from utils.cache_util import CacheManager + + +class PermissionManager: + """ + 权限管理器 + """ + + @classmethod + def check_perms(cls, perm: Union[str, List], is_strict: bool = False): + """ + 校验当前用户是否具有相应的权限标识 + + :param perm: 权限标识 + :param is_strict: 当传入的权限标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个权限标识,所有的校验结果都需要为True才会通过 + :return: 校验结果 + """ + user_perm_list = CacheManager.get('permissions').get('perms') + if '*:*:*' in user_perm_list: + return True + if isinstance(perm, str): + if perm in user_perm_list: + return True + if isinstance(perm, list): + if is_strict: + if all([perm_str in user_perm_list for perm_str in perm]): + return True + else: + if any([perm_str in user_perm_list for perm_str in perm]): + return True + return False + + @classmethod + def check_roles(cls, role_key: Union[str, List], is_strict: bool = False): + """ + 根据角色校验当前用户是否具有相应的权限 + + :param role_key: 角色标识 + :param is_strict: 当传入的角色标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个角色标识,所有的校验结果都需要为True才会通过 + :return: 校验结果 + """ + user_role_list = CacheManager.get('permissions').get('roles') + user_role_key_list = [role.role_key for role in user_role_list] + if isinstance(role_key, str): + if role_key in user_role_key_list: + return True + if isinstance(role_key, list): + if is_strict: + if all( + [ + role_key_str in user_role_key_list + for role_key_str in role_key + ] + ): + return True + else: + if any( + [ + role_key_str in user_role_key_list + for role_key_str in role_key + ] + ): + return True + return False diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index 51b4fc2..5ac25a2 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -1,70 +1,160 @@ import requests -from typing import Optional +from typing import Dict, Literal, Optional from flask import session, request from config.env import AppConfig from config.global_config import ApiBaseUrlConfig from server import logger -def api_request(method: str, url: str, is_headers: bool, params: Optional[dict] = None, data: Optional[dict] = None, - json: Optional[dict] = None, timeout: Optional[int] = None, stream: Optional[bool] = False): +def api_request( + url: str, + method: Literal['get', 'post', 'delete', 'put', 'patch'], + headers: Optional[Dict] = {}, + params: Optional[Dict] = None, + data: Optional[Dict] = None, + json: Optional[Dict] = None, + timeout: Optional[int] = None, + stream: Optional[bool] = False, +): + """ + Api请求方法 + + :param url: 请求url + :param method: 请求方法 + :param headers: 请求头 + :param params: 查询参数 + :param data: 表单参数 + :param json: 请求体 + :param timeout: 请求超时时间 + :param stream: 是否为流式请求 + :return: 请求结果 + """ api_url = ApiBaseUrlConfig.BaseUrl + url - method = method.lower().strip() + api_method = method.lower().strip() user_agent = request.headers.get('User-Agent') - authorization = session.get('Authorization') if session.get('Authorization') else '' - remote_addr = request.headers.get("X-Forwarded-For") if AppConfig.app_env == 'prod' else request.remote_addr - if is_headers: - api_headers = {'Authorization': 'Bearer ' + authorization, 'remote_addr': remote_addr, - 'User-Agent': user_agent, 'is_browser': 'no'} - else: - api_headers = {'remote_addr': remote_addr, 'User-Agent': user_agent, 'is_browser': 'no'} + authorization = ( + session.get('Authorization') if session.get('Authorization') else '' + ) + remote_addr = ( + request.headers.get('X-Forwarded-For') + if AppConfig.app_env == 'prod' + else request.remote_addr + ) + merged_headers = {'is_token': True, **headers} + is_token = merged_headers.get('is_token') + api_headers = { + k: v for k, v in merged_headers.items() if isinstance(v, (str, bytes)) + } + api_headers.update( + { + 'remote_addr': remote_addr, + 'User-Agent': user_agent, + 'is_browser': 'no', + } + ) + if is_token: + api_headers.update({'Authorization': 'Bearer ' + authorization}) try: - if method == 'get': - response = requests.get(url=api_url, params=params, data=data, json=json, headers=api_headers, - timeout=timeout, stream=stream) - elif method == 'post': - response = requests.post(url=api_url, params=params, data=data, json=json, headers=api_headers, - timeout=timeout, stream=stream) - elif method == 'delete': - response = requests.delete(url=api_url, params=params, data=data, json=json, headers=api_headers, - timeout=timeout, stream=stream) - elif method == 'put': - response = requests.put(url=api_url, params=params, data=data, json=json, headers=api_headers, - timeout=timeout, stream=stream) - elif method == 'patch': - response = requests.patch(url=api_url, params=params, data=data, json=json, headers=api_headers, - timeout=timeout, stream=stream) - else: - raise ValueError(f'Unsupported HTTP method: {method}') + if api_method == 'get': + response = requests.get( + url=api_url, + params=params, + data=data, + json=json, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'post': + response = requests.post( + url=api_url, + params=params, + data=data, + json=json, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'delete': + response = requests.delete( + url=api_url, + params=params, + data=data, + json=json, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'put': + response = requests.put( + url=api_url, + params=params, + data=data, + json=json, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'patch': + response = requests.patch( + url=api_url, + params=params, + data=data, + json=json, + headers=api_headers, + timeout=timeout, + stream=stream, + ) data_list = [params, data, json] if stream: response_code = response.status_code - response_message = '获取成功' if response_code == 200 else '获取失败' + response_message = ( + '获取成功' if response_code == 200 else '获取失败' + ) else: response_code = response.json().get('code') - response_message = response.json().get('message') + response_message = response.json().get('msg') session['code'] = response_code session['message'] = response_message if response_code == 200: - logger.info("[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求参数:{}||请求结果:{}", - session.get('user_info').get('user_name') if session.get('user_info') else None, - remote_addr, method, url, - ','.join([str(x) for x in data_list if x]), - response_message) + logger.info( + '[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求参数:{}||请求结果:{}', + session.get('user_info').get('user_name') + if session.get('user_info') + else None, + remote_addr, + method, + url, + ','.join([str(x) for x in data_list if x]), + response_message, + ) else: - logger.warning("[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求参数:{}||请求结果:{}", - session.get('user_info').get('user_name') if session.get('user_info') else None, - remote_addr, method, url, - ','.join([str(x) for x in data_list if x]), - response_message) + logger.warning( + '[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求参数:{}||请求结果:{}', + session.get('user_info').get('user_name') + if session.get('user_info') + else None, + remote_addr, + method, + url, + ','.join([str(x) for x in data_list if x]), + response_message, + ) return response if stream else response.json() except Exception as e: - logger.error("[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求结果:{}", - session.get('user_info').get('user_name') if session.get('user_info') else None, - remote_addr, method, url, str(e)) + logger.error( + '[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求结果:{}', + session.get('user_info').get('user_name') + if session.get('user_info') + else None, + remote_addr, + method, + url, + str(e), + ) session['code'] = 500 - session['message'] = str(e) + session['msg'] = str(e) return dict(code=500, data='', message=str(e)) diff --git a/dash-fastapi-frontend/utils/router_util.py b/dash-fastapi-frontend/utils/router_util.py new file mode 100644 index 0000000..1db70b0 --- /dev/null +++ b/dash-fastapi-frontend/utils/router_util.py @@ -0,0 +1,146 @@ +import json +from copy import deepcopy +from typing import Dict, List + + +class CommonConstant: + """ + 常用常量 + + WWW: www主域 + HTTP: http请求 + HTTPS: https请求 + """ + + WWW = 'www.' + HTTP = 'http://' + HTTPS = 'https://' + + +class RouterUtil: + """ + 路由工具类 + """ + + @classmethod + def generate_menu_tree(cls, router_list: List, path: str = ''): + """ + 生成菜单树 + + :param router_list: 路由列表 + :param path: 路由path + :return: 菜单树 + """ + menu_list = [] + for router in router_list: + copy_router = deepcopy(router) + copy_router['path'] = ( + copy_router.get('path') + if copy_router.get('path') + and ( + copy_router.get('path').startswith('/') + or cls.is_http(copy_router.get('path')) + ) + else '/' + copy_router.get('path') + ) + copy_router['props'] = { + **copy_router.get('meta'), + 'key': copy_router.get('name'), + 'href': path + copy_router.get('path'), + } + if copy_router.get('component') in ['Layout', 'ParentView']: + copy_router['component'] = 'SubMenu' + elif copy_router.get('component') == 'InnerLink': + if copy_router.get('path') == '/': + copy_router = copy_router['children'] + copy_router['props']['href'] = '/' + copy_router.get('path') + cls.__genrate_item_menu( + copy_router, 'components.inner_link' + ) + else: + if copy_router.get('children'): + copy_router['component'] = 'SubMenu' + else: + cls.__genrate_item_menu( + copy_router, 'components.inner_link' + ) + else: + cls.__genrate_item_menu( + copy_router, copy_router.get('component') + ) + + if copy_router.get('children'): + copy_router['children'] = cls.generate_menu_tree( + copy_router.get('children'), + copy_router.get('props').get('href'), + ) + else: + query = ( + '?' + + '&'.join( + [ + '{}={}'.format(k, v) + for k, v in json.loads( + copy_router.get('query') + ).items() + ] + ) + if copy_router.get('query') + else '' + ) + copy_router['props']['href'] = ( + copy_router.get('props').get('href') + query + ) + copy_router.pop('name', None) + copy_router.pop('meta', None) + menu_list.append(copy_router) + + return menu_list + + @classmethod + def get_visible_routers(cls, router_list: List): + """ + 获取可见路由 + + :param router_list: 路由列表 + :return: 可见路由列表 + """ + new_router_list = [] + for router in router_list: + copy_router = deepcopy(router) + if copy_router.get('hidden'): + continue + if copy_router.get('children'): + copy_router['children'] = cls.get_visible_routers( + copy_router.get('children') + ) + new_router_list.append(copy_router) + + return new_router_list + + @classmethod + def __genrate_item_menu(cls, router: Dict, modules: str): + """ + 生成Item类型菜单 + + :param router: 路由信息 + :param modules: 组件路径 + + :return: Item类型菜单 + """ + router['props']['modules'] = modules + router['component'] = 'Item' + + return router + + @classmethod + def is_http(cls, link: str): + """ + 判断是否为http(s)://开头 + + :param link: 链接 + :return: 是否为http(s)://开头 + """ + return link.startswith(CommonConstant.HTTP) or link.startswith( + CommonConstant.HTTPS + ) diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index 65f6b1d..3ca28bd 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -6,57 +6,68 @@ from api.config import query_config_list_api def render_content(): - captcha_enabled_info = query_config_list_api(config_key='sys.account.captchaEnabled') - forget_enabled_info = query_config_list_api(config_key='sys.account.forgetUser') + # captcha_enabled_info = query_config_list_api( + # config_key="sys.account.captchaEnabled" + # ) + # forget_enabled_info = query_config_list_api(config_key="sys.account.forgetUser") captcha_hidden = False forget_show = True - if captcha_enabled_info.get('code') == 200: - captcha_hidden = False if captcha_enabled_info.get('data') == 'true' else True - if forget_enabled_info.get('code') == 200: - forget_show = False if forget_enabled_info.get('data') == 'false' else True + # if captcha_enabled_info.get("code") == 200: + # captcha_hidden = False if captcha_enabled_info.get("data") == "true" else True + # if forget_enabled_info.get("code") == 200: + # forget_show = False if forget_enabled_info.get("data") == "false" else True return html.Div( [ - dcc.Store(id='captcha_image-session_id-container'), + dcc.Store(id="captcha_image-session_id-container"), html.Div( [ html.Div( [ - fac.AntdText('HELLO', style={'color': 'rgba(255,255,255,0.8)'}) + fac.AntdText( + "HELLO", + style={ + "color": "rgba(255,255,255,0.8)", + "fontSize": "60px", + "fontWeight": "500", + }, + ) ], - style={ - 'fontSize': '60px', - 'fontWeight': '500' - } ), html.Div( [ - fac.AntdText('WELCOME', style={'color': 'rgba(255,255,255,0.8)'}), + fac.AntdText( + "WELCOME", + style={ + "color": "rgba(255,255,255,0.8)", + "fontSize": "60px", + "fontWeight": "500", + }, + ), ], - style={ - 'fontSize': '60px', - 'fontWeight': '500' - } ), html.Div( [ - fac.AntdText('欢迎使用通用后台管理系统', style={'color': 'rgba(255,255,255,0.8)'}), + fac.AntdText( + "欢迎使用通用后台管理系统", + style={ + "color": "rgba(255,255,255,0.8)", + "fontSize": "20px", + "fontWeight": "600", + "marginTop": "25px", + }, + ), ], - style={ - 'fontSize': '18px', - 'fontWeight': '600', - 'marginTop': '20px' - } ), ], style={ - 'position': 'fixed', - 'top': '20%', - 'left': '26%', - 'width': '430px', - 'padding': '0px 30px', - 'transform': 'translateX(-50%)' - } + "position": "fixed", + "top": "20%", + "left": "26%", + "width": "430px", + "padding": "0px 30px", + "transform": "translateX(-50%)", + }, ), fac.AntdCard( [ @@ -64,27 +75,23 @@ def render_content(): [ fac.AntdFormItem( fac.AntdInput( - placeholder='请输入用户名', - id='login-username', - size='large', - prefix=fac.AntdIcon( - icon='antd-user' - ), + placeholder="请输入用户名", + id="login-username", + size="large", + prefix=fac.AntdIcon(icon="antd-user"), ), - id='login-username-form-item' + id="login-username-form-item", ), fac.AntdFormItem( fac.AntdInput( - placeholder='请输入密码', - id='login-password', - mode='password', + placeholder="请输入密码", + id="login-password", + mode="password", passwordUseMd5=True, - size='large', - prefix=fac.AntdIcon( - icon='antd-lock' - ), + size="large", + prefix=fac.AntdIcon(icon="antd-lock"), ), - id='login-password-form-item' + id="login-password-form-item", ), html.Div( [ @@ -92,120 +99,111 @@ def render_content(): [ fac.AntdFormItem( fac.AntdInput( - placeholder='请输入验证码', - id='login-captcha', - size='large', + placeholder="请输入验证码", + id="login-captcha", + size="large", prefix=fac.AntdIcon( - icon='antd-check-circle' + icon="antd-check-circle" ), - style={ - 'width': '210px' - } + style={"width": "210px"}, ), - id='login-captcha-form-item' + id="login-captcha-form-item", ), fac.AntdFormItem( html.Div( [ fac.AntdImage( - id='login-captcha-image', - src='', + id="login-captcha-image", + src="", height=37, width=100, - preview=False + preview=False, ) ], - id='login-captcha-image-container', + id="login-captcha-image-container", n_clicks=1, - style={ - 'border': '1px solid #ccc' - } + style={"border": "1px solid #ccc"}, ) - ) + ), ], - align='end', - size=10 + align="end", + size=10, ), ], - id='captcha-row-container', - hidden=captcha_hidden + id="captcha-row-container", + hidden=captcha_hidden, ), fac.AntdSpace( [ - html.Div(id='test'), + html.Div(id="test"), fac.AntdButton( - '忘记密码', - id='forget-password-link', - type='link', - href='/forget', - target='_self' - ) + "忘记密码", + id="forget-password-link", + type="link", + href="/forget", + target="_self", + ), ], - align='center', - size=240 - ) if forget_show else [], + align="center", + size=240, + ) + if forget_show + else [], fac.AntdFormItem( fac.AntdButton( - '登录', - id='login-submit', - type='primary', - loadingChildren='登录中', + "登录", + id="login-submit", + type="primary", + loadingChildren="登录中", autoSpin=True, block=True, - size='large', + size="large", ), - style={ - 'marginTop': '20px' - } - ) + style={"marginTop": "20px"}, + ), ], - layout='vertical', - style={ - 'width': '100%' - } + layout="vertical", + style={"width": "100%"}, ), ], - id='login-form-container', - title='登录', + id="login-form-container", + title="登录", hoverable=True, style={ - 'position': 'fixed', - 'top': '16%', - 'left': '70%', - 'width': '430px', - 'padding': '0px 30px', - 'transform': 'translateX(-50%)' - } + "position": "fixed", + "top": "16%", + "left": "70%", + "width": "430px", + "padding": "0px 30px", + "transform": "translateX(-50%)", + }, ), fac.AntdFooter( html.Div( fac.AntdText( - '版权所有©2023 Dash-FastAPI-Admin', - style={ - 'margin': '0' - } + "版权所有©2023 Dash-FastAPI-Admin", style={"margin": "0"} ), style={ - 'display': 'flex', - 'height': '100%', - 'justifyContent': 'center', - 'alignItems': 'center' - } + "display": "flex", + "height": "100%", + "justifyContent": "center", + "alignItems": "center", + }, ), style={ - 'backgroundColor': 'rgb(255 255 255 / 0%)', - 'height': '40px', - 'position': 'fixed', - 'bottom': 0, - 'left': '50%', - 'width': '500px', - 'padding': '20px 50px', - 'transform': 'translateX(-50%)' - } + "backgroundColor": "rgb(255 255 255 / 0%)", + "height": "40px", + "position": "fixed", + "bottom": 0, + "left": "50%", + "width": "500px", + "padding": 0, + "transform": "translateX(-50%)", + }, ), ], - id='container', + id="container", style={ - 'height': '100vh', - } + "height": "100vh", + }, ) -- Gitee From 36e087d37f903d8ecea823d62e26cdae04e51664 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 1 Sep 2024 21:19:36 +0800 Subject: [PATCH 015/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/post_c.py | 366 ++++++++++++------ .../views/system/post/__init__.py | 222 ++++++----- 2 files changed, 348 insertions(+), 240 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index fa0fd27..f23b3b1 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -8,32 +8,54 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.post import get_post_list_api, get_post_detail_api, add_post_api, edit_post_api, delete_post_api, export_post_list_api +from api.system.post import PostApi +from utils.permission_util import PermissionManager +from api.post import ( + get_post_list_api, + get_post_detail_api, + add_post_api, + edit_post_api, + delete_post_api, + export_post_list_api, +) @app.callback( output=dict( post_table_data=Output('post-list-table', 'data', allow_duplicate=True), - post_table_pagination=Output('post-list-table', 'pagination', allow_duplicate=True), + post_table_pagination=Output( + 'post-list-table', 'pagination', allow_duplicate=True + ), post_table_key=Output('post-list-table', 'key'), post_table_selectedrowkeys=Output('post-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('post-search', 'nClicks'), refresh_click=Input('post-refresh', 'nClicks'), pagination=Input('post-list-table', 'pagination'), - operations=Input('post-operations-store', 'data') + operations=Input('post-operations-store', 'data'), ), state=dict( post_code=State('post-post_code-input', 'value'), post_name=State('post-post_name-input', 'value'), status_select=State('post-status-select', 'value'), - button_perms=State('post-button-perms-container', 'data') + button_perms=State('post-button-perms-container', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_post_table_data(search_click, refresh_click, pagination, operations, post_code, post_name, status_select, button_perms): +def get_post_table_data( + search_click, + refresh_click, + pagination, + operations, + post_code, + post_name, + status_select, + button_perms, +): """ 获取岗位表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ @@ -43,7 +65,7 @@ def get_post_table_data(search_click, refresh_click, pagination, operations, pos post_name=post_name, status=status_select, page_num=1, - page_size=10 + page_size=10, ) triggered_id = dash.ctx.triggered_id if triggered_id == 'post-list-table': @@ -52,19 +74,19 @@ def get_post_table_data(search_click, refresh_click, pagination, operations, pos post_name=post_name, status=status_select, page_num=pagination['current'], - page_size=pagination['pageSize'] + page_size=pagination['pageSize'], ) if search_click or refresh_click or pagination or operations: - table_info = get_post_list_api(query_params) + table_info = PostApi.list_post(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == '0': @@ -73,23 +95,19 @@ def get_post_table_data(search_click, refresh_click, pagination, operations, pos item['status'] = dict(tag='停用', color='volcano') item['key'] = str(item['post_id']) item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:post:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:post:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:post:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:post:remove') + else {}, ] return dict( post_table_data=table_data, post_table_pagination=table_pagination, post_table_key=str(uuid.uuid4()), post_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -97,7 +115,7 @@ def get_post_table_data(search_click, refresh_click, pagination, operations, pos post_table_pagination=dash.no_update, post_table_key=dash.no_update, post_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -105,26 +123,28 @@ def get_post_table_data(search_click, refresh_click, pagination, operations, pos # 重置岗位搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('post-post_code-input', 'value'), - Output('post-post_name-input', 'value'), - Output('post-status-select', 'value'), - Output('post-operations-store', 'data')], + """, + [ + Output('post-post_code-input', 'value'), + Output('post-post_name-input', 'value'), + Output('post-status-select', 'value'), + Output('post-operations-store', 'data'), + ], Input('post-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示岗位搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -134,19 +154,21 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('post-search-form-container', 'hidden'), - Output('post-hidden-tooltip', 'title')], + """, + [ + Output('post-search-form-container', 'hidden'), + Output('post-hidden-tooltip', 'title'), + ], Input('post-hidden', 'nClicks'), State('post-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'post-operation-button', 'index': 'edit'}, 'disabled'), Input('post-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_post_edit_button_status(table_rows_selected): """ @@ -168,7 +190,7 @@ def change_post_edit_button_status(table_rows_selected): @app.callback( Output({'type': 'post-operation-button', 'index': 'delete'}, 'disabled'), Input('post-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_post_delete_button_status(table_rows_selected): """ @@ -177,7 +199,6 @@ def change_post_delete_button_status(table_rows_selected): outputs_list = dash.ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -190,37 +211,65 @@ def change_post_delete_button_status(table_rows_selected): modal_visible=Output('post-modal', 'visible', allow_duplicate=True), modal_title=Output('post-modal', 'title'), form_value=Output({'type': 'post-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'post-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'post-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'post-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'post-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('post-edit-id-store', 'data'), - modal_type=Output('post-operations-store-bk', 'data') + modal_type=Output('post-operations-store-bk', 'data'), ), inputs=dict( - operation_click=Input({'type': 'post-operation-button', 'index': ALL}, 'nClicks'), - button_click=Input('post-list-table', 'nClicksButton') + operation_click=Input( + {'type': 'post-operation-button', 'index': ALL}, 'nClicks' + ), + button_click=Input('post-list-table', 'nClicksButton'), ), state=dict( selected_row_keys=State('post-list-table', 'selectedRowKeys'), clicked_content=State('post-list-table', 'clickedContent'), - recently_button_clicked_row=State('post-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'post-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_post_modal(operation_click, button_click, selected_row_keys, clicked_content, recently_button_clicked_row): +def add_edit_post_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示新增或编辑岗位弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'add', 'type': 'post-operation-button'} \ - or trigger_id == {'index': 'edit', 'type': 'post-operation-button'} \ - or (trigger_id == 'post-list-table' and clicked_content == '修改'): + if ( + trigger_id == {'index': 'add', 'type': 'post-operation-button'} + or trigger_id == {'index': 'edit', 'type': 'post-operation-button'} + or (trigger_id == 'post-list-table' and clicked_content == '修改') + ): # 获取所有输出表单项对应value的index form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] # 获取所有输出表单项对应label的index form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'post-operation-button'}: - post_info = dict(post_name=None, post_code=None, post_sort=0, status='0', remark=None) + post_info = dict( + post_name=None, + post_code=None, + post_sort=0, + status='0', + remark=None, + ) return dict( modal_visible=True, modal_title='新增岗位', @@ -229,14 +278,17 @@ def add_edit_post_modal(operation_click, button_click, selected_row_keys, clicke form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger=dash.no_update, edit_row_info=None, - modal_type={'type': 'add'} + modal_type={'type': 'add'}, ) - elif trigger_id == {'index': 'edit', 'type': 'post-operation-button'} or (trigger_id == 'post-list-table' and clicked_content == '修改'): + elif trigger_id == { + 'index': 'edit', + 'type': 'post-operation-button', + } or (trigger_id == 'post-list-table' and clicked_content == '修改'): if trigger_id == {'index': 'edit', 'type': 'post-operation-button'}: post_id = int(','.join(selected_row_keys)) else: post_id = int(recently_button_clicked_row['key']) - post_info_res = get_post_detail_api(post_id=post_id) + post_info_res = PostApi.get_post(post_id=post_id) if post_info_res['code'] == 200: post_info = post_info_res['data'] return dict( @@ -247,7 +299,7 @@ def add_edit_post_modal(operation_click, button_click, selected_row_keys, clicke form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=post_info if post_info else None, - modal_type={'type': 'edit'} + modal_type={'type': 'edit'}, ) return dict( @@ -258,7 +310,7 @@ def add_edit_post_modal(operation_click, button_click, selected_row_keys, clicke form_label_validate_info=[dash.no_update] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None + modal_type=None, ) raise PreventUpdate @@ -266,64 +318,99 @@ def add_edit_post_modal(operation_click, button_click, selected_row_keys, clicke @app.callback( output=dict( - form_label_validate_status=Output({'type': 'post-form-label', 'index': ALL, 'required': True}, 'validateStatus', - allow_duplicate=True), - form_label_validate_info=Output({'type': 'post-form-label', 'index': ALL, 'required': True}, 'help', - allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'post-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'post-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('post-modal', 'visible'), - operations=Output('post-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('post-modal', 'okCounts') + operations=Output( + 'post-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('post-modal', 'okCounts')), state=dict( modal_type=State('post-operations-store-bk', 'data'), edit_row_info=State('post-edit-id-store', 'data'), form_value=State({'type': 'post-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'post-form-label', 'index': ALL, 'required': True}, 'label') + form_label=State( + {'type': 'post-form-label', 'index': ALL, 'required': True}, 'label' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def post_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label): +def post_confirm( + confirm_trigger, modal_type, edit_row_info, form_value, form_label +): """ 新增或编辑岗位弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + } + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params_add = form_value_state params_edit = params_add.copy() - params_edit['post_id'] = edit_row_info.get('post_id') if edit_row_info else None + params_edit['post_id'] = ( + edit_row_info.get('post_id') if edit_row_info else None + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_post_api(params_add) + api_res = PostApi.add_post(params_add) if modal_type == 'edit': - api_res = edit_post_api(params_edit) + api_res = PostApi.update_post(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -332,40 +419,66 @@ def post_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_la modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('post-delete-text', 'children'), - Output('post-delete-confirm-modal', 'visible'), - Output('post-delete-ids-store', 'data')], - [Input({'type': 'post-operation-button', 'index': ALL}, 'nClicks'), - Input('post-list-table', 'nClicksButton')], - [State('post-list-table', 'selectedRowKeys'), - State('post-list-table', 'clickedContent'), - State('post-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + Output('post-delete-text', 'children'), + Output('post-delete-confirm-modal', 'visible'), + Output('post-delete-ids-store', 'data'), + ], + [ + Input({'type': 'post-operation-button', 'index': ALL}, 'nClicks'), + Input('post-list-table', 'nClicksButton'), + ], + [ + State('post-list-table', 'selectedRowKeys'), + State('post-list-table', 'clickedContent'), + State('post-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def post_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): +def post_delete_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示删除岗位二次确认弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'delete', 'type': 'post-operation-button'} or (trigger_id == 'post-list-table' and clicked_content == '删除'): - + if trigger_id == {'index': 'delete', 'type': 'post-operation-button'} or ( + trigger_id == 'post-list-table' and clicked_content == '删除' + ): if trigger_id == {'index': 'delete', 'type': 'post-operation-button'}: post_ids = ','.join(selected_row_keys) else: @@ -374,76 +487,78 @@ def post_delete_modal(operation_click, button_click, else: raise PreventUpdate - return [ - f'是否确认删除岗位编号为{post_ids}的岗位?', - True, - {'post_ids': post_ids} - ] + return [f'是否确认删除岗位编号为{post_ids}的岗位?', True, post_ids] raise PreventUpdate @app.callback( - [Output('post-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('post-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('post-delete-confirm-modal', 'okCounts'), State('post-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def post_delete_confirm(delete_confirm, post_ids_data): """ 删除岗位弹窗确认回调,实现删除操作 """ if delete_confirm: - params = post_ids_data - delete_button_info = delete_post_api(params) + delete_button_info = PostApi.del_post(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('post-export-container', 'data', allow_duplicate=True), - Output('post-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('post-export-container', 'data', allow_duplicate=True), + Output('post-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('post-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_post_list(export_click): """ 导出岗位信息回调 """ if export_click: - export_post_res = export_post_list_api({}) + export_post_res = PostApi.export_post({}) if export_post_res.status_code == 200: export_post = export_post_res.content return [ - dcc.send_bytes(export_post, f'岗位信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_post, + f'岗位信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -452,7 +567,7 @@ def export_post_list(export_click): @app.callback( Output('post-export-container', 'data', allow_duplicate=True), Input('post-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_post_export_status(data): """ @@ -460,7 +575,6 @@ def reset_post_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index b19207b..ac2019b 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -2,23 +2,24 @@ from dash import dcc, html import feffery_antd_components as fac import callbacks.system_c.post_c -from api.post import get_post_list_api +from api.system.post import PostApi +from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') post_params = dict(page_num=1, page_size=10) - table_info = get_post_list_api(post_params) + table_info = PostApi.list_post(post_params) table_data = [] page_num = 1 page_size = 10 total = 0 if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') @@ -26,16 +27,12 @@ def render(*args, **kwargs): item['status'] = dict(tag='停用', color='volcano') item['key'] = str(item['post_id']) item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:post:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:post:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:post:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:post:remove') + else {}, ] return [ @@ -72,9 +69,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 210 - } + }, ), - label='岗位编码' + label='岗位编码', ), fac.AntdFormItem( fac.AntdInput( @@ -84,9 +81,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 210 - } + }, ), - label='岗位名称' + label='岗位名称', ), fac.AntdFormItem( fac.AntdSelect( @@ -95,18 +92,18 @@ def render(*args, **kwargs): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '停用', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 200 - } + }, ), - label='岗位状态' + label='岗位状态', ), fac.AntdFormItem( fac.AntdButton( @@ -115,7 +112,7 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ) ), fac.AntdFormItem( @@ -124,20 +121,20 @@ def render(*args, **kwargs): id='post-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ) - ) + ), ], style={ 'paddingBottom': '10px' - } + }, ), ], layout='inline', ) ], id='post-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -156,14 +153,18 @@ def render(*args, **kwargs): ], id={ 'type': 'post-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:post:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:post:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -173,15 +174,19 @@ def render(*args, **kwargs): ], id={ 'type': 'post-operation-button', - 'index': 'edit' + 'index': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', - 'border-color': '#d0f5e0' - } - ) if 'system:post:edit' in button_perms else [], + 'border-color': '#d0f5e0', + }, + ) + if PermissionManager.check_perms( + 'system:post:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -191,15 +196,19 @@ def render(*args, **kwargs): ], id={ 'type': 'post-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:post:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:post:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -211,15 +220,19 @@ def render(*args, **kwargs): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'system:post:export' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'system:post:export' + ) + else [], ], style={ 'paddingBottom': '10px', - } + }, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -233,10 +246,10 @@ def render(*args, **kwargs): ), ], id='post-hidden', - shape='circle' + shape='circle', ), id='post-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -248,24 +261,22 @@ def render(*args, **kwargs): ), ], id='post-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -323,7 +334,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -332,28 +343,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑岗位表单modal fac.AntdModal( [ @@ -363,126 +378,105 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'post-form-value', - 'index': 'post_name' + 'index': 'post_name', }, placeholder='请输入岗位名称', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='岗位名称', required=True, id={ 'type': 'post-form-label', 'index': 'post_name', - 'required': True - } + 'required': True, + }, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'post-form-value', - 'index': 'post_code' + 'index': 'post_code', }, placeholder='请输入岗位编码', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='岗位编码', required=True, id={ 'type': 'post-form-label', 'index': 'post_code', - 'required': True - } + 'required': True, + }, ), fac.AntdFormItem( fac.AntdInputNumber( id={ 'type': 'post-form-value', - 'index': 'post_sort' + 'index': 'post_sort', }, defaultValue=0, min=0, - style={ - 'width': 350 - } + style={'width': 350}, ), label='岗位顺序', required=True, id={ 'type': 'post-form-label', 'index': 'post_sort', - 'required': True - } + 'required': True, + }, ), fac.AntdFormItem( fac.AntdRadioGroup( id={ 'type': 'post-form-value', - 'index': 'status' + 'index': 'status', }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '停用', 'value': '1'}, ], defaultValue='0', - style={ - 'width': 350 - } + style={'width': 350}, ), label='岗位状态', id={ 'type': 'post-form-label', 'index': 'status', - 'required': False - } + 'required': False, + }, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'post-form-value', - 'index': 'remark' + 'index': 'remark', }, placeholder='请输入内容', allowClear=True, mode='text-area', - style={ - 'width': 350 - } + style={'width': 350}, ), label='备注', id={ 'type': 'post-form-label', 'index': 'remark', - 'required': False - } + 'required': False, + }, ), ], - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ) ], id='post-modal', mask=False, width=580, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除岗位二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='post-delete-text'), @@ -490,6 +484,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] -- Gitee From 4caa6946460b99cbc25a4e7a8dce5d39e1659b1a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 15:41:51 +0800 Subject: [PATCH 016/229] =?UTF-8?q?perf:=20=E5=9F=BA=E4=BA=8Efac0.3.4?= =?UTF-8?q?=E6=96=B0=E7=89=B9=E6=80=A7=E4=BC=98=E5=8C=96=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E9=A1=B9=E9=80=89=E6=8B=A9=E7=9B=91=E5=90=AC=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/layout_c/index_c.py | 93 +++++++------------ 1 file changed, 35 insertions(+), 58 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/layout_c/index_c.py b/dash-fastapi-frontend/callbacks/layout_c/index_c.py index c57e317..b1e150e 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/index_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/index_c.py @@ -4,30 +4,26 @@ from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate import feffery_antd_components as fac from jsonpath_ng import parse -from flask import json, session -from collections import OrderedDict from server import app import views # noqa: F401 from utils.cache_util import CacheManager -from utils.tree_tool import ( - find_title_by_key, - find_modules_by_key, - find_href_by_key, - find_parents, -) +from utils.tree_tool import find_href_by_key @app.callback( [ Output('tabs-container', 'items', allow_duplicate=True), Output('tabs-container', 'activeKey', allow_duplicate=True), + Output('header-breadcrumb', 'items'), ], [ Input('index-side-menu', 'currentKey'), Input('tabs-container', 'tabCloseCounts'), ], [ + State('index-side-menu', 'currentItem'), + State('index-side-menu', 'currentItemPath'), State('tabs-container', 'latestDeletePane'), State('tabs-container', 'items'), State('tabs-container', 'activeKey'), @@ -37,6 +33,8 @@ from utils.tree_tool import ( def handle_tab_switch_and_create( currentKey, tabCloseCounts, + currentItem, + currentItemPath, latestDeletePane, origin_items, activeKey, @@ -59,21 +57,33 @@ def handle_tab_switch_and_create( new_items = dash.Patch() if trigger_id == 'index-side-menu': + breadcrumb_items = [ + {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, + ] + if currentKey == '首页': + pass + elif currentKey == '个人资料': + breadcrumb_items.append({'title': '个人资料'}) + else: + breadcrumb_items = breadcrumb_items + [ + {'title': item.get('props').get('title')} + for item in currentItemPath + ] # 判断当前新选中的菜单栏项对应标签页是否已创建 if currentKey in [item['key'] for item in origin_items]: - return [dash.no_update, currentKey] + return [dash.no_update, currentKey, breadcrumb_items] if currentKey == '个人资料': menu_title = '个人资料' menu_modules = 'system.user.profile' + breadcrumb_items = [ + {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, + {'title': menu_title}, + ] else: - menu_title = find_title_by_key( - CacheManager.get('menu_info'), currentKey - ) + menu_title = currentItem.get('props').get('title') # 判断当前选中的菜单栏项是否存在module,如果有,则动态导入module,否则返回404页面 - menu_modules = find_modules_by_key( - CacheManager.get('menu_info'), currentKey - ) + menu_modules = currentItem.get('props').get('modules') for index, item in enumerate(origin_items): if { @@ -144,7 +154,7 @@ def handle_tab_switch_and_create( } ) - return [new_items, currentKey] + return [new_items, currentKey, breadcrumb_items] elif trigger_id == 'tabs-container': # 如果删除的是当前标签页则回到最后新增的标签页,否则保持当前标签页不变 @@ -209,6 +219,7 @@ def handle_tab_switch_and_create( new_origin_items[-1]['key'] if activeKey == latestDeletePane else activeKey, + dash.no_update, ] raise PreventUpdate @@ -396,59 +407,25 @@ def handle_via_context_menu(clickedContextMenu, origin_items, activeKey): raise PreventUpdate -# 页首面包屑和hash回调 +# 标签页点击回调 @app.callback( - [ - Output('header-breadcrumb', 'items'), - Output('dcc-url', 'pathname', allow_duplicate=True), - ], + Output('dcc-url', 'pathname', allow_duplicate=True), Input('tabs-container', 'activeKey'), prevent_initial_call=True, ) -def get_current_breadcrumbs(active_key): +def get_current_href(active_key): if active_key: if active_key == '首页': - return [ - [ - {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, - ], - '/', - ] + return '/' elif active_key == '个人资料': - return [ - [ - {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, - { - 'title': '个人资料', - }, - ], - '/user/profile', - ] + return '/user/profile' else: - result = find_parents(CacheManager.get('menu_info'), active_key) - # 去除result的重复项 - parent_info = list( - OrderedDict( - (json.dumps(d, ensure_ascii=False), d) for d in result - ).values() + current_href = find_href_by_key( + CacheManager.get('menu_info'), active_key ) - if parent_info: - current_href = find_href_by_key( - CacheManager.get('menu_info'), active_key - ) - return [ - [ - { - 'title': '首页', - 'icon': 'antd-dashboard', - 'href': '/', - }, - ] - + parent_info, - current_href, - ] + return current_href raise PreventUpdate -- Gitee From 2cda557433a34ce7f84f55aa3a9184005bc94149 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 15:42:25 +0800 Subject: [PATCH 017/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=85=AC=E5=91=8A=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/notice_c.py | 417 +++++++++++------- .../views/system/notice/__init__.py | 294 ++++++------ 2 files changed, 421 insertions(+), 290 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 74b3bb9..53ad908 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -8,84 +8,102 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.notice import get_notice_list_api, add_notice_api, edit_notice_api, delete_notice_api, get_notice_detail_api -from api.dict import query_dict_data_list_api +from api.system.notice import NoticeApi +from api.system.dict.data import DictDataApi +from utils.permission_util import PermissionManager @app.callback( output=dict( - notice_table_data=Output('notice-list-table', 'data', allow_duplicate=True), - notice_table_pagination=Output('notice-list-table', 'pagination', allow_duplicate=True), + notice_table_data=Output( + 'notice-list-table', 'data', allow_duplicate=True + ), + notice_table_pagination=Output( + 'notice-list-table', 'pagination', allow_duplicate=True + ), notice_table_key=Output('notice-list-table', 'key'), - notice_table_selectedrowkeys=Output('notice-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + notice_table_selectedrowkeys=Output( + 'notice-list-table', 'selectedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('notice-search', 'nClicks'), refresh_click=Input('notice-refresh', 'nClicks'), pagination=Input('notice-list-table', 'pagination'), - operations=Input('notice-operations-store', 'data') + operations=Input('notice-operations-store', 'data'), ), state=dict( notice_title=State('notice-notice_title-input', 'value'), update_by=State('notice-update_by-input', 'value'), notice_type=State('notice-notice_type-select', 'value'), create_time_range=State('notice-create_time-range', 'value'), - button_perms=State('notice-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_notice_table_data(search_click, refresh_click, pagination, operations, notice_title, update_by, notice_type, create_time_range, - button_perms): +def get_notice_table_data( + search_click, + refresh_click, + pagination, + operations, + notice_title, + update_by, + notice_type, + create_time_range, +): """ 获取通知公告表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - create_time_start = None - create_time_end = None + begin_time = None + end_time = None if create_time_range: - create_time_start = create_time_range[0] - create_time_end = create_time_range[1] + begin_time = create_time_range[0] + end_time = create_time_range[1] query_params = dict( notice_title=notice_title, update_by=update_by, notice_type=notice_type, - create_time_start=create_time_start, - create_time_end=create_time_end, + begin_time=begin_time, + end_time=end_time, page_num=1, - page_size=10 + page_size=10, ) triggered_id = dash.ctx.triggered_id if triggered_id == 'notice-list-table': - query_params = dict( - notice_title=notice_title, - update_by=update_by, - notice_type=notice_type, - create_time_start=create_time_start, - create_time_end=create_time_end, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: option_table = [] - info = query_dict_data_list_api(dict_type='sys_notice_type') + info = DictDataApi.get_dicts(dict_type='sys_notice_type') if info.get('code') == 200: data = info.get('data') option_table = [ - dict(label=item.get('dict_label'), value=item.get('dict_value'), css_class=item.get('css_class')) for - item in data] + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} - table_info = get_notice_list_api(query_params) + table_info = NoticeApi.list_notice(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == '0': @@ -93,21 +111,19 @@ def get_notice_table_data(search_click, refresh_click, pagination, operations, n else: item['status'] = dict(tag='关闭', color='volcano') item['notice_type'] = dict( - tag=option_dict.get(str(item.get('notice_type'))).get('label'), - color=json.loads(option_dict.get(str(item.get('notice_type'))).get('css_class')).get('color') + tag=option_dict.get(str(item.get('notice_type'))).get( + 'label' + ), + color='blue', ) item['key'] = str(item['notice_id']) item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:notice:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:notice:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:notice:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:notice:remove') + else {}, ] return dict( @@ -115,7 +131,7 @@ def get_notice_table_data(search_click, refresh_click, pagination, operations, n notice_table_pagination=table_pagination, notice_table_key=str(uuid.uuid4()), notice_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -123,7 +139,7 @@ def get_notice_table_data(search_click, refresh_click, pagination, operations, n notice_table_pagination=dash.no_update, notice_table_key=dash.no_update, notice_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -131,27 +147,29 @@ def get_notice_table_data(search_click, refresh_click, pagination, operations, n # 重置通知公告搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('notice-notice_title-input', 'value'), - Output('notice-update_by-input', 'value'), - Output('notice-notice_type-select', 'value'), - Output('notice-create_time-range', 'value'), - Output('notice-operations-store', 'data')], + """, + [ + Output('notice-notice_title-input', 'value'), + Output('notice-update_by-input', 'value'), + Output('notice-notice_type-select', 'value'), + Output('notice-create_time-range', 'value'), + Output('notice-operations-store', 'data'), + ], Input('notice-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示通知公告搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -161,19 +179,21 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('notice-search-form-container', 'hidden'), - Output('notice-hidden-tooltip', 'title')], + """, + [ + Output('notice-search-form-container', 'hidden'), + Output('notice-hidden-tooltip', 'title'), + ], Input('notice-hidden', 'nClicks'), State('notice-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'notice-operation-button', 'index': 'edit'}, 'disabled'), Input('notice-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_notice_edit_button_status(table_rows_selected): """ @@ -195,7 +215,7 @@ def change_notice_edit_button_status(table_rows_selected): @app.callback( Output({'type': 'notice-operation-button', 'index': 'delete'}, 'disabled'), Input('notice-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_notice_delete_button_status(table_rows_selected): """ @@ -204,7 +224,6 @@ def change_notice_delete_button_status(table_rows_selected): outputs_list = dash.ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -214,63 +233,103 @@ def change_notice_delete_button_status(table_rows_selected): @app.callback( output=dict( - modal=dict(visible=Output('notice-modal', 'visible', allow_duplicate=True), title=Output('notice-modal', 'title')), + modal=dict( + visible=Output('notice-modal', 'visible', allow_duplicate=True), + title=Output('notice-modal', 'title'), + ), form_value=dict( notice_title=Output('notice-notice_title', 'value'), notice_type=Output('notice-notice_type', 'value'), status=Output('notice-status', 'value'), notice_content=Output('notice-content', 'htmlValue'), - editor_key=Output('notice-content', 'key') + editor_key=Output('notice-content', 'key'), ), form_validate=[ - Output('notice-notice_title-form-item', 'validateStatus', allow_duplicate=True), - Output('notice-notice_type-form-item', 'validateStatus', allow_duplicate=True), - Output('notice-notice_title-form-item', 'help', allow_duplicate=True), - Output('notice-notice_type-form-item', 'help', allow_duplicate=True) + Output( + 'notice-notice_title-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'notice-notice_type-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'notice-notice_title-form-item', 'help', allow_duplicate=True + ), + Output( + 'notice-notice_type-form-item', 'help', allow_duplicate=True + ), ], other=dict( - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('notice-edit-id-store', 'data'), - modal_type=Output('notice-operations-store-bk', 'data') - ) + modal_type=Output('notice-operations-store-bk', 'data'), + ), ), inputs=dict( - operation_click=Input({'type': 'notice-operation-button', 'index': ALL}, 'nClicks'), - button_click=Input('notice-list-table', 'nClicksButton') + operation_click=Input( + {'type': 'notice-operation-button', 'index': ALL}, 'nClicks' + ), + button_click=Input('notice-list-table', 'nClicksButton'), ), state=dict( selected_row_keys=State('notice-list-table', 'selectedRowKeys'), clicked_content=State('notice-list-table', 'clickedContent'), - recently_button_clicked_row=State('notice-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'notice-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_notice_modal(operation_click, button_click, selected_row_keys, clicked_content, - recently_button_clicked_row): +def add_edit_notice_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示新增或编辑通知公告弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'add', 'type': 'notice-operation-button'} \ - or trigger_id == {'index': 'edit', 'type': 'notice-operation-button'} \ - or (trigger_id == 'notice-list-table' and clicked_content == '修改'): + if ( + trigger_id == {'index': 'add', 'type': 'notice-operation-button'} + or trigger_id == {'index': 'edit', 'type': 'notice-operation-button'} + or (trigger_id == 'notice-list-table' and clicked_content == '修改') + ): if trigger_id == {'index': 'add', 'type': 'notice-operation-button'}: return dict( modal=dict(visible=True, title='新增通知公告'), - form_value=dict(notice_title=None, notice_type=None, status='0', notice_content=None, editor_key=str(uuid.uuid4())), + form_value=dict( + notice_title=None, + notice_type=None, + status='0', + notice_content=None, + editor_key=str(uuid.uuid4()), + ), form_validate=[None] * 4, other=dict( api_check_token_trigger=dash.no_update, edit_row_info=None, - modal_type={'type': 'add'} - ) + modal_type={'type': 'add'}, + ), ) - elif trigger_id == {'index': 'edit', 'type': 'notice-operation-button'} or (trigger_id == 'notice-list-table' and clicked_content == '修改'): - if trigger_id == {'index': 'edit', 'type': 'notice-operation-button'}: + elif trigger_id == { + 'index': 'edit', + 'type': 'notice-operation-button', + } or (trigger_id == 'notice-list-table' and clicked_content == '修改'): + if trigger_id == { + 'index': 'edit', + 'type': 'notice-operation-button', + }: notice_id = int(','.join(selected_row_keys)) else: notice_id = int(recently_button_clicked_row['key']) - notice_info_res = get_notice_detail_api(notice_id=notice_id) + notice_info_res = NoticeApi.get_notice(notice_id=notice_id) if notice_info_res['code'] == 200: notice_info = notice_info_res['data'] notice_content = notice_info.get('notice_content') @@ -282,14 +341,14 @@ def add_edit_notice_modal(operation_click, button_click, selected_row_keys, clic notice_type=notice_info.get('notice_type'), status=notice_info.get('status'), notice_content=notice_content, - editor_key=str(uuid.uuid4()) + editor_key=str(uuid.uuid4()), ), form_validate=[None] * 4, other=dict( api_check_token_trigger={'timestamp': time.time()}, edit_row_info=notice_info if notice_info else None, - modal_type={'type': 'edit'} - ) + modal_type={'type': 'edit'}, + ), ) return dict( @@ -299,14 +358,14 @@ def add_edit_notice_modal(operation_click, button_click, selected_row_keys, clic notice_type=dash.no_update, status=dash.no_update, notice_content=dash.no_update, - editor_key=dash.no_update + editor_key=dash.no_update, ), form_validate=[dash.no_update] * 4, other=dict( api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None - ) + modal_type=None, + ), ) raise PreventUpdate @@ -314,45 +373,82 @@ def add_edit_notice_modal(operation_click, button_click, selected_row_keys, clic @app.callback( output=dict( - notice_title_form_status=Output('notice-notice_title-form-item', 'validateStatus', allow_duplicate=True), - notice_type_form_status=Output('notice-notice_type-form-item', 'validateStatus', allow_duplicate=True), - notice_title_form_help=Output('notice-notice_title-form-item', 'help', allow_duplicate=True), - notice_type_form_help=Output('notice-notice_type-form-item', 'help', allow_duplicate=True), + notice_title_form_status=Output( + 'notice-notice_title-form-item', + 'validateStatus', + allow_duplicate=True, + ), + notice_type_form_status=Output( + 'notice-notice_type-form-item', + 'validateStatus', + allow_duplicate=True, + ), + notice_title_form_help=Output( + 'notice-notice_title-form-item', 'help', allow_duplicate=True + ), + notice_type_form_help=Output( + 'notice-notice_type-form-item', 'help', allow_duplicate=True + ), modal_visible=Output('notice-modal', 'visible'), - operations=Output('notice-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('notice-modal', 'okCounts') + operations=Output( + 'notice-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('notice-modal', 'okCounts')), state=dict( modal_type=State('notice-operations-store-bk', 'data'), edit_row_info=State('notice-edit-id-store', 'data'), notice_title=State('notice-notice_title', 'value'), notice_type=State('notice-notice_type', 'value'), status=State('notice-status', 'value'), - notice_content=State('notice-content', 'htmlValue') + notice_content=State('notice-content', 'htmlValue'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def notice_confirm(confirm_trigger, modal_type, edit_row_info, notice_title, notice_type, status, notice_content): +def notice_confirm( + confirm_trigger, + modal_type, + edit_row_info, + notice_title, + notice_type, + status, + notice_content, +): """ 新增或编辑通知公告弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - if all(validate_data_not_empty(item) for item in [notice_title, notice_type]): - params_add = dict(notice_title=notice_title, notice_type=notice_type, status=status, - notice_content=notice_content) - params_edit = dict(notice_id=edit_row_info.get('notice_id') if edit_row_info else None, - notice_title=notice_title, - notice_type=notice_type, status=status, notice_content=notice_content) + if all( + validate_data_not_empty(item) + for item in [notice_title, notice_type] + ): + params_add = dict( + notice_title=notice_title, + notice_type=notice_type, + status=status, + notice_content=notice_content, + ) + params_edit = dict( + notice_id=edit_row_info.get('notice_id') + if edit_row_info + else None, + notice_title=notice_title, + notice_type=notice_type, + status=status, + notice_content=notice_content, + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_notice_api(params_add) + api_res = NoticeApi.add_notice(params_add) if modal_type == 'edit': - api_res = edit_notice_api(params_edit) + api_res = NoticeApi.update_notice(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( @@ -363,7 +459,9 @@ def notice_confirm(confirm_trigger, modal_type, edit_row_info, notice_title, not modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( @@ -374,7 +472,9 @@ def notice_confirm(confirm_trigger, modal_type, edit_row_info, notice_title, not modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -385,42 +485,66 @@ def notice_confirm(confirm_trigger, modal_type, edit_row_info, notice_title, not modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( - notice_title_form_status=None if validate_data_not_empty(notice_title) else 'error', - notice_type_form_status=None if validate_data_not_empty(notice_type) else 'error', - notice_title_form_help=None if validate_data_not_empty(notice_title) else '请输入公告标题!', - notice_type_form_help=None if validate_data_not_empty(notice_type) else '请输入公告类型!', + notice_title_form_status=None + if validate_data_not_empty(notice_title) + else 'error', + notice_type_form_status=None + if validate_data_not_empty(notice_type) + else 'error', + notice_title_form_help=None + if validate_data_not_empty(notice_title) + else '请输入公告标题!', + notice_type_form_help=None + if validate_data_not_empty(notice_type) + else '请输入公告类型!', modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('notice-delete-text', 'children'), - Output('notice-delete-confirm-modal', 'visible'), - Output('notice-delete-ids-store', 'data')], - [Input({'type': 'notice-operation-button', 'index': ALL}, 'nClicks'), - Input('notice-list-table', 'nClicksButton')], - [State('notice-list-table', 'selectedRowKeys'), - State('notice-list-table', 'clickedContent'), - State('notice-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + Output('notice-delete-text', 'children'), + Output('notice-delete-confirm-modal', 'visible'), + Output('notice-delete-ids-store', 'data'), + ], + [ + Input({'type': 'notice-operation-button', 'index': ALL}, 'nClicks'), + Input('notice-list-table', 'nClicksButton'), + ], + [ + State('notice-list-table', 'selectedRowKeys'), + State('notice-list-table', 'clickedContent'), + State('notice-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def notice_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): +def notice_delete_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示删除通知公告二次确认弹窗回调 """ trigger_id = dash.ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'notice-operation-button'} or ( - trigger_id == 'notice-list-table' and clicked_content == '删除'): + trigger_id == 'notice-list-table' and clicked_content == '删除' + ): trigger_id = dash.ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'notice-operation-button'}: @@ -431,42 +555,39 @@ def notice_delete_modal(operation_click, button_click, else: return dash.no_update - return [ - f'是否确认删除序号为{notice_ids}的通知公告?', - True, - {'notice_ids': notice_ids} - ] + return [f'是否确认删除序号为{notice_ids}的通知公告?', True, notice_ids] raise PreventUpdate @app.callback( - [Output('notice-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('notice-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('notice-delete-confirm-modal', 'okCounts'), State('notice-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def notice_delete_confirm(delete_confirm, notice_ids_data): """ 删除岗通知公告弹窗确认回调,实现删除操作 """ if delete_confirm: - params = notice_ids_data - delete_button_info = delete_notice_api(params) + delete_button_info = NoticeApi.del_notice(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index dea0047..9be14bd 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -7,8 +7,9 @@ import uuid import callbacks.system_c.notice_c from config.global_config import ApiBaseUrlConfig -from api.notice import get_notice_list_api -from api.dict import query_dict_data_list_api +from api.system.notice import NoticeApi +from api.system.dict.data import DictDataApi +from utils.permission_util import PermissionManager def render(*args, **kwargs): @@ -16,26 +17,34 @@ def render(*args, **kwargs): option = [] option_table = [] - info = query_dict_data_list_api(dict_type='sys_notice_type') + info = DictDataApi.get_dicts(dict_type='sys_notice_type') if info.get('code') == 200: data = info.get('data') - option = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in data] + option = [ + dict(label=item.get('dict_label'), value=item.get('dict_value')) + for item in data + ] option_table = [ - dict(label=item.get('dict_label'), value=item.get('dict_value'), css_class=item.get('css_class')) for item - in data] + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} notice_params = dict(page_num=1, page_size=10) - table_info = get_notice_list_api(notice_params) + table_info = NoticeApi.list_notice(notice_params) table_data = [] page_num = 1 page_size = 10 total = 0 if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') @@ -43,21 +52,19 @@ def render(*args, **kwargs): item['status'] = dict(tag='关闭', color='volcano') if str(item.get('notice_type')) in option_dict.keys(): item['notice_type'] = dict( - tag=option_dict.get(str(item.get('notice_type'))).get('label'), - color=json.loads(option_dict.get(str(item.get('notice_type'))).get('css_class')).get('color') + tag=option_dict.get(str(item.get('notice_type'))).get( + 'label' + ), + color='blue', ) item['key'] = str(item['notice_id']) item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:notice:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:notice:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:notice:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:notice:remove') + else {}, ] return [ @@ -88,10 +95,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='公告标题', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdInput( @@ -101,10 +110,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='操作人员', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -113,20 +124,24 @@ def render(*args, **kwargs): options=option, style={ 'width': 240 - } + }, ), label='类型', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdDateRangePicker( id='notice-create_time-range', style={ 'width': 240 - } + }, ), label='创建时间', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -135,9 +150,11 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -145,16 +162,18 @@ def render(*args, **kwargs): id='notice-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='notice-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -173,14 +192,18 @@ def render(*args, **kwargs): ], id={ 'type': 'notice-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:notice:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:notice:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -190,15 +213,19 @@ def render(*args, **kwargs): ], id={ 'type': 'notice-operation-button', - 'index': 'edit' + 'index': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', - 'border-color': '#d0f5e0' - } - ) if 'system:notice:edit' in button_perms else [], + 'border-color': '#d0f5e0', + }, + ) + if PermissionManager.check_perms( + 'system:notice:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -208,21 +235,23 @@ def render(*args, **kwargs): ], id={ 'type': 'notice-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:notice:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:notice:remove' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -236,10 +265,10 @@ def render(*args, **kwargs): ), ], id='notice-hidden', - shape='circle' + shape='circle', ), id='notice-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -251,24 +280,22 @@ def render(*args, **kwargs): ), ], id='notice-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -326,7 +353,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -335,28 +362,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑通知公告modal fac.AntdModal( [ @@ -368,45 +399,33 @@ def render(*args, **kwargs): fac.AntdFormItem( fac.AntdInput( id='notice-notice_title', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id='notice-notice_title-form-item', required=True, label='公告标题', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdSelect( id='notice-notice_type', options=option, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id='notice-notice_type-form-item', required=True, label='公告类型', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 - ) + span=12, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -415,32 +434,20 @@ def render(*args, **kwargs): fac.AntdRadioGroup( id='notice-status', options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '关闭', - 'value': '1' - } + {'label': '正常', 'value': '0'}, + {'label': '关闭', 'value': '1'}, ], - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id='notice-status-form-item', label='状态', - labelCol={ - 'span': 3 - }, - wrapperCol={ - 'span': 21 - } + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=24 + span=24, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -458,69 +465,72 @@ def render(*args, **kwargs): 'maxNumberOfFiles': 10, 'meta': { 'baseUrl': ApiBaseUrlConfig.BaseUrl, - 'uploadId': str(uuid.uuid4()), - 'taskPath': 'notice' + 'uploadId': str( + uuid.uuid4() + ), + 'taskPath': 'notice', }, 'metaWithUrl': True, 'headers': { - 'Authorization': 'Bearer ' + session.get('Authorization') + 'Authorization': 'Bearer ' + + session.get( + 'Authorization' + ) }, 'withCredentials': True, 'timeout': 5 * 1000, - 'base64LimitSize': 500 * 1024 + 'base64LimitSize': 500 * 1024, }, uploadVideo={ 'server': f'{ApiBaseUrlConfig.BaseUrl}/common/uploadForEditor', 'fieldName': 'file', - 'maxFileSize': 100 * 1024 * 1024, + 'maxFileSize': 100 + * 1024 + * 1024, 'maxNumberOfFiles': 3, 'meta': { 'baseUrl': ApiBaseUrlConfig.BaseUrl, - 'uploadId': str(uuid.uuid4()), - 'taskPath': 'notice' + 'uploadId': str( + uuid.uuid4() + ), + 'taskPath': 'notice', }, 'metaWithUrl': True, 'headers': { - 'Authorization': 'Bearer ' + session.get('Authorization') + 'Authorization': 'Bearer ' + + session.get( + 'Authorization' + ) }, 'withCredentials': True, - 'timeout': 15 * 1000 + 'timeout': 15 * 1000, }, editorStyle={ 'height': 300, - 'width': '100%' + 'width': '100%', }, - style={ - 'marginBottom': 15 - } + style={'marginBottom': 15}, ), id='notice-notice_content-form-item', label='内容', - labelCol={ - 'span': 3 - }, - wrapperCol={ - 'span': 21 - } + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=24 + span=24, ), ], - gutter=5 - ) + gutter=5, + ), ], - style={ - 'marginRight': '30px' - } + style={'marginRight': '30px'}, ) ], id='notice-modal', mask=False, width=900, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除通知公告二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='notice-delete-text'), @@ -528,6 +538,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] -- Gitee From 6dc580de47c6ab951a8ff59f3b4c7da019c13d5c Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 15:55:41 +0800 Subject: [PATCH 018/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=AE=BE=E7=BD=AE=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/config_c.py | 405 +++++++++++------- .../views/system/config/__init__.py | 266 ++++++------ 2 files changed, 397 insertions(+), 274 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 99a25ac..aee4469 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -8,73 +8,87 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.config import get_config_list_api, get_config_detail_api, add_config_api, edit_config_api, delete_config_api, export_config_list_api, refresh_config_api +from api.system.config import ConfigApi +from utils.permission_util import PermissionManager @app.callback( output=dict( - config_table_data=Output('config-list-table', 'data', allow_duplicate=True), - config_table_pagination=Output('config-list-table', 'pagination', allow_duplicate=True), + config_table_data=Output( + 'config-list-table', 'data', allow_duplicate=True + ), + config_table_pagination=Output( + 'config-list-table', 'pagination', allow_duplicate=True + ), config_table_key=Output('config-list-table', 'key'), - config_table_selectedrowkeys=Output('config-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + config_table_selectedrowkeys=Output( + 'config-list-table', 'selectedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('config-search', 'nClicks'), refresh_click=Input('config-refresh', 'nClicks'), pagination=Input('config-list-table', 'pagination'), - operations=Input('config-operations-store', 'data') + operations=Input('config-operations-store', 'data'), ), state=dict( config_name=State('config-config_name-input', 'value'), config_key=State('config-config_key-input', 'value'), config_type=State('config-config_type-select', 'value'), create_time_range=State('config-create_time-range', 'value'), - button_perms=State('config-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_config_table_data(search_click, refresh_click, pagination, operations, config_name, config_key, config_type, create_time_range, button_perms): +def get_config_table_data( + search_click, + refresh_click, + pagination, + operations, + config_name, + config_key, + config_type, + create_time_range, +): """ 获取参数设置表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - create_time_start = None - create_time_end = None + begin_time = None + end_time = None if create_time_range: - create_time_start = create_time_range[0] - create_time_end = create_time_range[1] + begin_time = create_time_range[0] + end_time = create_time_range[1] query_params = dict( config_name=config_name, config_key=config_key, config_type=config_type, - create_time_start=create_time_start, - create_time_end=create_time_end, + begin_time=begin_time, + end_time=end_time, page_num=1, - page_size=10 + page_size=10, ) triggered_id = dash.ctx.triggered_id if triggered_id == 'config-list-table': - query_params = dict( - config_name=config_name, - config_key=config_key, - config_type=config_type, - create_time_start=create_time_start, - create_time_end=create_time_end, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - table_info = get_config_list_api(query_params) + table_info = ConfigApi.list_config(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['config_type'] == 'Y': @@ -83,16 +97,12 @@ def get_config_table_data(search_click, refresh_click, pagination, operations, c item['config_type'] = dict(tag='否', color='volcano') item['key'] = str(item['config_id']) item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:config:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:config:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:config:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:config:remove') + else {}, ] return dict( @@ -100,7 +110,7 @@ def get_config_table_data(search_click, refresh_click, pagination, operations, c config_table_pagination=table_pagination, config_table_key=str(uuid.uuid4()), config_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -108,7 +118,7 @@ def get_config_table_data(search_click, refresh_click, pagination, operations, c config_table_pagination=dash.no_update, config_table_key=dash.no_update, config_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -116,27 +126,29 @@ def get_config_table_data(search_click, refresh_click, pagination, operations, c # 重置参数设置搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('config-config_name-input', 'value'), - Output('config-config_key-input', 'value'), - Output('config-config_type-select', 'value'), - Output('config-create_time-range', 'value'), - Output('config-operations-store', 'data')], + """, + [ + Output('config-config_name-input', 'value'), + Output('config-config_key-input', 'value'), + Output('config-config_type-select', 'value'), + Output('config-create_time-range', 'value'), + Output('config-operations-store', 'data'), + ], Input('config-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示参数设置搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -146,19 +158,21 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('config-search-form-container', 'hidden'), - Output('config-hidden-tooltip', 'title')], + """, + [ + Output('config-search-form-container', 'hidden'), + Output('config-hidden-tooltip', 'title'), + ], Input('config-hidden', 'nClicks'), State('config-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'config-operation-button', 'index': 'edit'}, 'disabled'), Input('config-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_config_edit_button_status(table_rows_selected): """ @@ -180,7 +194,7 @@ def change_config_edit_button_status(table_rows_selected): @app.callback( Output({'type': 'config-operation-button', 'index': 'delete'}, 'disabled'), Input('config-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_config_delete_button_status(table_rows_selected): """ @@ -189,7 +203,6 @@ def change_config_delete_button_status(table_rows_selected): outputs_list = dash.ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -202,37 +215,65 @@ def change_config_delete_button_status(table_rows_selected): modal_visible=Output('config-modal', 'visible', allow_duplicate=True), modal_title=Output('config-modal', 'title'), form_value=Output({'type': 'config-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'config-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'config-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'config-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'config-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('config-edit-id-store', 'data'), - modal_type=Output('config-operations-store-bk', 'data') + modal_type=Output('config-operations-store-bk', 'data'), ), inputs=dict( - operation_click=Input({'type': 'config-operation-button', 'index': ALL}, 'nClicks'), - button_click=Input('config-list-table', 'nClicksButton') + operation_click=Input( + {'type': 'config-operation-button', 'index': ALL}, 'nClicks' + ), + button_click=Input('config-list-table', 'nClicksButton'), ), state=dict( selected_row_keys=State('config-list-table', 'selectedRowKeys'), clicked_content=State('config-list-table', 'clickedContent'), - recently_button_clicked_row=State('config-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'config-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_config_modal(operation_click, button_click, selected_row_keys, clicked_content, recently_button_clicked_row): +def add_edit_config_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示新增或编辑参数设置弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'add', 'type': 'config-operation-button'} \ - or trigger_id == {'index': 'edit', 'type': 'config-operation-button'} \ - or (trigger_id == 'config-list-table' and clicked_content == '修改'): + if ( + trigger_id == {'index': 'add', 'type': 'config-operation-button'} + or trigger_id == {'index': 'edit', 'type': 'config-operation-button'} + or (trigger_id == 'config-list-table' and clicked_content == '修改') + ): # 获取所有输出表单项对应value的index form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] # 获取所有输出表单项对应label的index form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'config-operation-button'}: - config_info = dict(config_name=None, config_key=None, config_value=None, config_type='Y', remark=None) + config_info = dict( + config_name=None, + config_key=None, + config_value=None, + config_type='Y', + remark=None, + ) return dict( modal_visible=True, modal_title='新增参数', @@ -241,14 +282,20 @@ def add_edit_config_modal(operation_click, button_click, selected_row_keys, clic form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger=dash.no_update, edit_row_info=None, - modal_type={'type': 'add'} + modal_type={'type': 'add'}, ) - elif trigger_id == {'index': 'edit', 'type': 'config-operation-button'} or (trigger_id == 'config-list-table' and clicked_content == '修改'): - if trigger_id == {'index': 'edit', 'type': 'config-operation-button'}: + elif trigger_id == { + 'index': 'edit', + 'type': 'config-operation-button', + } or (trigger_id == 'config-list-table' and clicked_content == '修改'): + if trigger_id == { + 'index': 'edit', + 'type': 'config-operation-button', + }: config_id = int(','.join(selected_row_keys)) else: config_id = int(recently_button_clicked_row['key']) - config_info_res = get_config_detail_api(config_id=config_id) + config_info_res = ConfigApi.get_config(config_id=config_id) if config_info_res['code'] == 200: config_info = config_info_res['data'] return dict( @@ -259,7 +306,7 @@ def add_edit_config_modal(operation_click, button_click, selected_row_keys, clic form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=config_info if config_info else None, - modal_type={'type': 'edit'} + modal_type={'type': 'edit'}, ) return dict( @@ -270,7 +317,7 @@ def add_edit_config_modal(operation_click, button_click, selected_row_keys, clic form_label_validate_info=[dash.no_update] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None + modal_type=None, ) raise PreventUpdate @@ -278,64 +325,100 @@ def add_edit_config_modal(operation_click, button_click, selected_row_keys, clic @app.callback( output=dict( - form_label_validate_status=Output({'type': 'config-form-label', 'index': ALL, 'required': True}, 'validateStatus', - allow_duplicate=True), - form_label_validate_info=Output({'type': 'config-form-label', 'index': ALL, 'required': True}, 'help', - allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'config-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'config-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('config-modal', 'visible'), - operations=Output('config-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('config-modal', 'okCounts') + operations=Output( + 'config-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('config-modal', 'okCounts')), state=dict( modal_type=State('config-operations-store-bk', 'data'), edit_row_info=State('config-edit-id-store', 'data'), form_value=State({'type': 'config-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'config-form-label', 'index': ALL, 'required': True}, 'label') + form_label=State( + {'type': 'config-form-label', 'index': ALL, 'required': True}, + 'label', + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def config_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label): +def config_confirm( + confirm_trigger, modal_type, edit_row_info, form_value, form_label +): """ 新增或编辑参数设置弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + } + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params_add = form_value_state params_edit = params_add.copy() - params_edit['config_id'] = edit_row_info.get('config_id') if edit_row_info else None + params_edit['config_id'] = ( + edit_row_info.get('config_id') if edit_row_info else None + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_config_api(params_add) + api_res = ConfigApi.add_config(params_add) if modal_type == 'edit': - api_res = edit_config_api(params_edit) + api_res = ConfigApi.update_config(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -344,41 +427,66 @@ def config_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_ modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('config-delete-text', 'children'), - Output('config-delete-confirm-modal', 'visible'), - Output('config-delete-ids-store', 'data')], - [Input({'type': 'config-operation-button', 'index': ALL}, 'nClicks'), - Input('config-list-table', 'nClicksButton')], - [State('config-list-table', 'selectedRowKeys'), - State('config-list-table', 'clickedContent'), - State('config-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + Output('config-delete-text', 'children'), + Output('config-delete-confirm-modal', 'visible'), + Output('config-delete-ids-store', 'data'), + ], + [ + Input({'type': 'config-operation-button', 'index': ALL}, 'nClicks'), + Input('config-list-table', 'nClicksButton'), + ], + [ + State('config-list-table', 'selectedRowKeys'), + State('config-list-table', 'clickedContent'), + State('config-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def config_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): +def config_delete_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示删除参数设置二次确认弹窗回调 """ trigger_id = dash.ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'config-operation-button'} or ( - trigger_id == 'config-list-table' and clicked_content == '删除'): - + trigger_id == 'config-list-table' and clicked_content == '删除' + ): if trigger_id == {'index': 'delete', 'type': 'config-operation-button'}: config_ids = ','.join(selected_row_keys) else: @@ -390,73 +498,79 @@ def config_delete_modal(operation_click, button_click, return [ f'是否确认删除参数编号为{config_ids}的参数设置?', True, - {'config_ids': config_ids} + config_ids, ] raise PreventUpdate @app.callback( - [Output('config-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('config-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('config-delete-confirm-modal', 'okCounts'), State('config-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def config_delete_confirm(delete_confirm, config_ids_data): """ 删除参数设置弹窗确认回调,实现删除操作 """ if delete_confirm: - params = config_ids_data - delete_button_info = delete_config_api(params) + delete_button_info = ConfigApi.del_config(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('config-export-container', 'data', allow_duplicate=True), - Output('config-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('config-export-container', 'data', allow_duplicate=True), + Output('config-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('config-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_config_list(export_click): """ 导出参数设置信息回调 """ if export_click: - export_config_res = export_config_list_api({}) + export_config_res = ConfigApi.export_config({}) if export_config_res.status_code == 200: export_config = export_config_res.content return [ - dcc.send_bytes(export_config, f'参数配置信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_config, + f'参数配置信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -465,7 +579,7 @@ def export_config_list(export_click): @app.callback( Output('config-export-container', 'data', allow_duplicate=True), Input('config-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_config_export_status(data): """ @@ -473,33 +587,34 @@ def reset_config_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate @app.callback( - [Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('config-refresh-cache', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def refresh_config_cache(refresh_click): """ 刷新缓存回调 """ if refresh_click: - refresh_info_res = refresh_config_api({}) + refresh_info_res = ConfigApi.refresh_cache() if refresh_info_res.get('code') == 200: return [ {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新成功', type='success') + fuc.FefferyFancyMessage('刷新成功', type='success'), ] return [ {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新失败', type='error') + fuc.FefferyFancyMessage('刷新失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index 2b5093c..8aa8aa5 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -1,24 +1,25 @@ from dash import dcc, html import feffery_antd_components as fac -import callbacks.system_c.config_c -from api.config import get_config_list_api +import callbacks.system_c.config_c # noqa: F401 +from api.system.config import ConfigApi +from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') config_params = dict(page_num=1, page_size=10) - table_info = get_config_list_api(config_params) + table_info = ConfigApi.list_config(config_params) table_data = [] page_num = 1 page_size = 10 total = 0 if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['config_type'] == 'Y': item['config_type'] = dict(tag='是', color='blue') @@ -26,16 +27,12 @@ def render(*args, **kwargs): item['config_type'] = dict(tag='否', color='volcano') item['key'] = str(item['config_id']) item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:config:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:config:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:config:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:config:remove') + else {}, ] return [ @@ -70,10 +67,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 235 - } + }, ), label='参数名称', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdInput( @@ -83,10 +82,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 235 - } + }, ), label='参数键名', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -95,29 +96,33 @@ def render(*args, **kwargs): options=[ { 'label': '是', - 'value': 'Y' + 'value': 'Y', }, { 'label': '否', - 'value': 'N' - } + 'value': 'N', + }, ], style={ 'width': 235 - } + }, ), label='系统内置', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdDateRangePicker( id='config-create_time-range', style={ 'width': 235 - } + }, ), label='创建时间', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -126,9 +131,11 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -136,16 +143,18 @@ def render(*args, **kwargs): id='config-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='config-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -164,14 +173,18 @@ def render(*args, **kwargs): ], id={ 'type': 'config-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:config:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:config:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -181,15 +194,19 @@ def render(*args, **kwargs): ], id={ 'type': 'config-operation-button', - 'index': 'edit' + 'index': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', - 'border-color': '#d0f5e0' - } - ) if 'system:config:edit' in button_perms else [], + 'border-color': '#d0f5e0', + }, + ) + if PermissionManager.check_perms( + 'system:config:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -199,15 +216,19 @@ def render(*args, **kwargs): ], id={ 'type': 'config-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:config:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:config:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -219,9 +240,13 @@ def render(*args, **kwargs): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'system:config:export' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'system:config:export' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -234,15 +259,17 @@ def render(*args, **kwargs): 'color': '#ff9292', 'background': '#ffeded', 'border-color': '#ffdbdb', - 'marginRight': '10px' - } - ) if 'system:config:edit' in button_perms else [], + 'marginRight': '10px', + }, + ) + if PermissionManager.check_perms( + 'system:config:remove' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -256,10 +283,10 @@ def render(*args, **kwargs): ), ], id='config-hidden', - shape='circle' + shape='circle', ), id='config-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -271,24 +298,22 @@ def render(*args, **kwargs): ), ], id='config-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -353,7 +378,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -362,28 +387,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑参数配置表单modal fac.AntdModal( [ @@ -396,23 +425,21 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'config-form-value', - 'index': 'config_name' + 'index': 'config_name', }, placeholder='请输入参数名称', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='参数名称', required=True, id={ 'type': 'config-form-label', 'index': 'config_name', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -423,23 +450,21 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'config-form-value', - 'index': 'config_key' + 'index': 'config_key', }, placeholder='请输入参数键名', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='参数键名', required=True, id={ 'type': 'config-form-label', 'index': 'config_key', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -450,23 +475,21 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'config-form-value', - 'index': 'config_value' + 'index': 'config_value', }, placeholder='请输入参数键值', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='参数键值', required=True, id={ 'type': 'config-form-label', 'index': 'config_value', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -477,31 +500,23 @@ def render(*args, **kwargs): fac.AntdRadioGroup( id={ 'type': 'config-form-value', - 'index': 'config_type' + 'index': 'config_type', }, options=[ - { - 'label': '是', - 'value': 'Y' - }, - { - 'label': '否', - 'value': 'N' - }, + {'label': '是', 'value': 'Y'}, + {'label': '否', 'value': 'N'}, ], defaultValue='0', - style={ - 'width': 350 - } + style={'width': 350}, ), label='系统内置', id={ 'type': 'config-form-label', 'index': 'config_type', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), @@ -512,42 +527,35 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'config-form-value', - 'index': 'remark' + 'index': 'remark', }, placeholder='请输入内容', allowClear=True, mode='text-area', - style={ - 'width': 350 - } + style={'width': 350}, ), label='备注', id={ 'type': 'config-form-label', 'index': 'remark', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), ], - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ) ], id='config-modal', mask=False, width=580, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除参数配置二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='config-delete-text'), @@ -555,6 +563,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True - ) + centered=True, + ), ] -- Gitee From 315bd9da755722a9727eee1324f0ebe308c6a000 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 16:13:33 +0800 Subject: [PATCH 019/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/logininfor_c.py | 202 ++++++++++-------- .../views/monitor/logininfor/__init__.py | 160 ++++++++------ 2 files changed, 209 insertions(+), 153 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index 4cec7c0..def925b 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -7,78 +7,90 @@ from dash.exceptions import PreventUpdate import feffery_utils_components as fuc from server import app -from api.log import get_login_log_list_api, delete_login_log_api, clear_login_log_api, unlock_user_api, export_login_log_list_api +from api.monitor.logininfor import LogininforApi @app.callback( output=dict( - login_log_table_data=Output('login_log-list-table', 'data', allow_duplicate=True), - login_log_table_pagination=Output('login_log-list-table', 'pagination', allow_duplicate=True), + login_log_table_data=Output( + 'login_log-list-table', 'data', allow_duplicate=True + ), + login_log_table_pagination=Output( + 'login_log-list-table', 'pagination', allow_duplicate=True + ), login_log_table_key=Output('login_log-list-table', 'key'), - login_log_table_selectedrowkeys=Output('login_log-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + login_log_table_selectedrowkeys=Output( + 'login_log-list-table', 'selectedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('login_log-search', 'nClicks'), refresh_click=Input('login_log-refresh', 'nClicks'), sorter=Input('login_log-list-table', 'sorter'), pagination=Input('login_log-list-table', 'pagination'), - operations=Input('login_log-operations-store', 'data') + operations=Input('login_log-operations-store', 'data'), ), state=dict( ipaddr=State('login_log-ipaddr-input', 'value'), user_name=State('login_log-user_name-input', 'value'), status_select=State('login_log-status-select', 'value'), login_time_range=State('login_log-login_time-range', 'value'), - button_perms=State('login_log-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_login_log_table_data(search_click, refresh_click, sorter, pagination, operations, ipaddr, user_name, status_select, login_time_range, button_perms): +def get_login_log_table_data( + search_click, + refresh_click, + sorter, + pagination, + operations, + ipaddr, + user_name, + status_select, + login_time_range, +): """ 获取登录日志表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - login_time_start = None - login_time_end = None + begin_time = None + end_time = None if login_time_range: - login_time_start = login_time_range[0] - login_time_end = login_time_range[1] + begin_time = login_time_range[0] + end_time = login_time_range[1] query_params = dict( ipaddr=ipaddr, user_name=user_name, status=status_select, - login_time_start=login_time_start, - login_time_end=login_time_end, + begin_time=begin_time, + end_time=end_time, order_by_column=sorter.get('columns')[0] if sorter else None, - is_asc=sorter.get('orders')[0] if sorter else None, + is_asc=f"{sorter.get('orders')[0]}ing" if sorter else None, page_num=1, - page_size=10 + page_size=10, ) triggered_prop = dash.ctx.triggered[0].get('prop_id') if triggered_prop == 'login_log-list-table.pagination': - query_params = dict( - ipaddr=ipaddr, - user_name=user_name, - status=status_select, - login_time_start=login_time_start, - login_time_end=login_time_end, - order_by_column=sorter.get('columns')[0] if sorter else None, - is_asc=sorter.get('orders')[0] if sorter else None, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - table_info = get_login_log_list_api(query_params) + table_info = LogininforApi.list_logininfor(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == '0': @@ -92,7 +104,7 @@ def get_login_log_table_data(search_click, refresh_click, sorter, pagination, op login_log_table_pagination=table_pagination, login_log_table_key=str(uuid.uuid4()), login_log_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -100,7 +112,7 @@ def get_login_log_table_data(search_click, refresh_click, sorter, pagination, op login_log_table_pagination=dash.no_update, login_log_table_key=dash.no_update, login_log_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -108,27 +120,29 @@ def get_login_log_table_data(search_click, refresh_click, sorter, pagination, op # 重置登录日志搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('login_log-ipaddr-input', 'value'), - Output('login_log-user_name-input', 'value'), - Output('login_log-status-select', 'value'), - Output('login_log-login_time-range', 'value'), - Output('login_log-operations-store', 'data')], + """, + [ + Output('login_log-ipaddr-input', 'value'), + Output('login_log-user_name-input', 'value'), + Output('login_log-status-select', 'value'), + Output('login_log-login_time-range', 'value'), + Output('login_log-operations-store', 'data'), + ], Input('login_log-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示登录日志搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -138,19 +152,23 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('login_log-search-form-container', 'hidden'), - Output('login_log-hidden-tooltip', 'title')], + """, + [ + Output('login_log-search-form-container', 'hidden'), + Output('login_log-hidden-tooltip', 'title'), + ], Input('login_log-hidden', 'nClicks'), State('login_log-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( - Output({'type': 'login_log-operation-button', 'index': 'delete'}, 'disabled'), + Output( + {'type': 'login_log-operation-button', 'index': 'delete'}, 'disabled' + ), Input('login_log-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_login_log_delete_button_status(table_rows_selected): """ @@ -159,7 +177,6 @@ def change_login_log_delete_button_status(table_rows_selected): outputs_list = dash.ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -170,7 +187,7 @@ def change_login_log_delete_button_status(table_rows_selected): @app.callback( Output('login_log-unlock', 'disabled'), Input('login_log-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_login_log_unlock_button_status(table_rows_selected): """ @@ -190,12 +207,14 @@ def change_login_log_unlock_button_status(table_rows_selected): @app.callback( - [Output('login_log-delete-text', 'children'), - Output('login_log-delete-confirm-modal', 'visible'), - Output('login_log-delete-ids-store', 'data')], + [ + Output('login_log-delete-text', 'children'), + Output('login_log-delete-confirm-modal', 'visible'), + Output('login_log-delete-ids-store', 'data'), + ], Input({'type': 'login_log-operation-button', 'index': ALL}, 'nClicks'), State('login_log-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def login_log_delete_modal(operation_click, selected_row_keys): """ @@ -209,97 +228,102 @@ def login_log_delete_modal(operation_click, selected_row_keys): return [ f'是否确认删除访问编号为{info_ids}的登录日志?', True, - {'oper_type': 'delete', 'info_ids': info_ids} + info_ids, ] elif trigger_id.index == 'clear': return [ - f'是否确认清除所有的登录日志?', + '是否确认清除所有的登录日志?', True, - {'oper_type': 'clear', 'info_ids': ''} + None, ] raise PreventUpdate @app.callback( - [Output('login_log-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('login_log-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('login_log-delete-confirm-modal', 'okCounts'), State('login_log-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def login_log_delete_confirm(delete_confirm, info_ids_data): """ 删除或清空登录日志弹窗确认回调,实现删除或清空操作 """ if delete_confirm: - oper_type = info_ids_data.get('oper_type') if oper_type == 'clear': - params = dict(oper_type=info_ids_data.get('oper_type')) - clear_button_info = clear_login_log_api(params) + clear_button_info = LogininforApi.clean_logininfor() if clear_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除成功', type='success') + fuc.FefferyFancyMessage('清除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除失败', type='error') + fuc.FefferyFancyMessage('清除失败', type='error'), ] else: - params = dict(info_ids=info_ids_data.get('info_ids')) - delete_button_info = delete_login_log_api(params) + params = info_ids_data.get('info_ids') + delete_button_info = LogininforApi.del_logininfor(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('login_log-export-container', 'data', allow_duplicate=True), - Output('login_log-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('login_log-export-container', 'data', allow_duplicate=True), + Output('login_log-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('login_log-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_login_log_list(export_click): """ 导出登录日志信息回调 """ if export_click: - export_login_log_res = export_login_log_list_api({}) + export_login_log_res = LogininforApi.export_logininfor({}) if export_login_log_res.status_code == 200: export_login_log = export_login_log_res.content return [ - dcc.send_bytes(export_login_log, f'登录日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_login_log, + f'登录日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -308,7 +332,7 @@ def export_login_log_list(export_click): @app.callback( Output('login_log-export-container', 'data', allow_duplicate=True), Input('login_log-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_login_log_export_status(data): """ @@ -316,18 +340,19 @@ def reset_login_log_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate @app.callback( - [Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('login_log-unlock', 'nClicks'), State('login_log-list-table', 'selectedRows'), - prevent_initial_call=True + prevent_initial_call=True, ) def unlock_user(unlock_click, selected_rows): """ @@ -335,17 +360,16 @@ def unlock_user(unlock_click, selected_rows): """ if unlock_click: user_name = selected_rows[0].get('user_name') - unlock_info_res = unlock_user_api(dict(user_name=user_name)) + unlock_info_res = LogininforApi.unlock_logininfor(user_name=user_name) if unlock_info_res.get('code') == 200: - return [ {'timestamp': time.time()}, - fuc.FefferyFancyMessage('解锁成功', type='success') + fuc.FefferyFancyMessage('解锁成功', type='success'), ] return [ {'timestamp': time.time()}, - fuc.FefferyFancyMessage('解锁失败', type='error') + fuc.FefferyFancyMessage('解锁失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py index ebe85e5..b34f674 100644 --- a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py @@ -1,24 +1,25 @@ from dash import dcc, html import feffery_antd_components as fac -import callbacks.monitor_c.logininfor_c -from api.log import get_login_log_list_api +import callbacks.monitor_c.logininfor_c # noqa: F401 +from api.monitor.logininfor import LogininforApi +from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') login_log_params = dict(page_num=1, page_size=10) - table_info = get_login_log_list_api(login_log_params) + table_info = LogininforApi.list_logininfor(login_log_params) table_data = [] page_num = 1 page_size = 10 total = 0 if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['status'] == '0': item['status'] = dict(tag='成功', color='blue') @@ -55,10 +56,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='登录地址', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdInput( @@ -68,10 +71,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='用户名称', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -80,29 +85,33 @@ def render(*args, **kwargs): options=[ { 'label': '成功', - 'value': 0 + 'value': 0, }, { 'label': '失败', - 'value': 1 - } + 'value': 1, + }, ], style={ 'width': 240 - } + }, ), label='状态', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdDateRangePicker( id='login_log-login_time-range', style={ 'width': 240 - } + }, ), label='登录时间', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -111,9 +120,11 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -121,16 +132,18 @@ def render(*args, **kwargs): id='login_log-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='login_log-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -149,15 +162,19 @@ def render(*args, **kwargs): ], id={ 'type': 'login_log-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'monitor:logininfor:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:logininfor:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -167,14 +184,18 @@ def render(*args, **kwargs): ], id={ 'type': 'login_log-operation-button', - 'index': 'clear' + 'index': 'clear', }, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'monitor:logininfor:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:logininfor:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -187,9 +208,13 @@ def render(*args, **kwargs): style={ 'color': '#74bcff', 'background': '#e8f4ff', - 'border-color': '#d1e9ff' - } - ) if 'monitor:logininfor:unlock' in button_perms else [], + 'border-color': '#d1e9ff', + }, + ) + if PermissionManager.check_perms( + 'monitor:logininfor:unlock' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -201,15 +226,17 @@ def render(*args, **kwargs): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'monitor:logininfor:export' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'monitor:logininfor:export' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -223,10 +250,10 @@ def render(*args, **kwargs): ), ], id='login_log-hidden', - shape='circle' + shape='circle', ), id='login_log-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -238,24 +265,22 @@ def render(*args, **kwargs): ), ], id='login_log-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -333,35 +358,42 @@ def render(*args, **kwargs): rowSelectionWidth=50, bordered=True, sortOptions={ - 'sortDataIndexes': ['user_name', 'login_time'], - 'multiple': False + 'sortDataIndexes': [ + 'user_name', + 'login_time', + ], + 'multiple': False, }, pagination={ 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 删除操作日志二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='login_log-delete-text'), @@ -369,6 +401,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] -- Gitee From 275c7cad4c4930113c2aaa4482ddb5ee70c21150 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 16:30:12 +0800 Subject: [PATCH 020/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/operlog_c.py | 289 +++++++++------ .../views/monitor/operlog/__init__.py | 350 +++++++++--------- 2 files changed, 337 insertions(+), 302 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index b1e6252..7322b44 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -1,31 +1,39 @@ import dash import time import uuid -import json from dash import dcc from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate import feffery_utils_components as fuc from server import app -from api.log import get_operation_log_list_api, get_operation_log_detail_api, delete_operation_log_api, clear_operation_log_api, export_operation_log_list_api -from api.dict import query_dict_data_list_api +from api.monitor.operlog import OperlogApi +from api.system.dict.data import DictDataApi +from utils.permission_util import PermissionManager @app.callback( output=dict( - operation_log_table_data=Output('operation_log-list-table', 'data', allow_duplicate=True), - operation_log_table_pagination=Output('operation_log-list-table', 'pagination', allow_duplicate=True), + operation_log_table_data=Output( + 'operation_log-list-table', 'data', allow_duplicate=True + ), + operation_log_table_pagination=Output( + 'operation_log-list-table', 'pagination', allow_duplicate=True + ), operation_log_table_key=Output('operation_log-list-table', 'key'), - operation_log_table_selectedrowkeys=Output('operation_log-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + operation_log_table_selectedrowkeys=Output( + 'operation_log-list-table', 'selectedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('operation_log-search', 'nClicks'), refresh_click=Input('operation_log-refresh', 'nClicks'), sorter=Input('operation_log-list-table', 'sorter'), pagination=Input('operation_log-list-table', 'pagination'), - operations=Input('operation_log-operations-store', 'data') + operations=Input('operation_log-operations-store', 'data'), ), state=dict( title=State('operation_log-title-input', 'value'), @@ -33,64 +41,75 @@ from api.dict import query_dict_data_list_api business_type=State('operation_log-business_type-select', 'value'), status_select=State('operation_log-status-select', 'value'), oper_time_range=State('operation_log-oper_time-range', 'value'), - button_perms=State('operation_log-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_operation_log_table_data(search_click, refresh_click, sorter, pagination, operations, title, oper_name, business_type, status_select, oper_time_range, button_perms): +def get_operation_log_table_data( + search_click, + refresh_click, + sorter, + pagination, + operations, + title, + oper_name, + business_type, + status_select, + oper_time_range, +): """ 获取操作日志表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - oper_time_start = None - oper_time_end = None + begin_time = None + end_time = None if oper_time_range: - oper_time_start = oper_time_range[0] - oper_time_end = oper_time_range[1] + begin_time = oper_time_range[0] + end_time = oper_time_range[1] query_params = dict( title=title, oper_name=oper_name, business_type=business_type, status=status_select, - oper_time_start=oper_time_start, - oper_time_end=oper_time_end, + begin_time=begin_time, + end_time=end_time, order_by_column=sorter.get('columns')[0] if sorter else None, - is_asc=sorter.get('orders')[0] if sorter else None, + is_asc=f"{sorter.get('orders')[0]}ing" if sorter else None, page_num=1, - page_size=10 + page_size=10, ) triggered_prop = dash.ctx.triggered[0].get('prop_id') if triggered_prop == 'operation_log-list-table.pagination': - query_params = dict( - title=title, - oper_name=oper_name, - business_type=business_type, - status=status_select, - oper_time_start=oper_time_start, - oper_time_end=oper_time_end, - order_by_column=sorter.get('columns')[0] if sorter else None, - is_asc=sorter.get('orders')[0] if sorter else None, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: option_table = [] - info = query_dict_data_list_api(dict_type='sys_oper_type') + info = DictDataApi.get_dicts(dict_type='sys_oper_type') if info.get('code') == 200: data = info.get('data') - option_table = [dict(label=item.get('dict_label'), value=item.get('dict_value'), css_class=item.get('css_class')) for item in data] + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} - table_info = get_operation_log_list_api(query_params) + table_info = OperlogApi.list_operlog(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == 0: @@ -99,17 +118,17 @@ def get_operation_log_table_data(search_click, refresh_click, sorter, pagination item['status'] = dict(tag='失败', color='volcano') if str(item.get('business_type')) in option_dict.keys(): item['business_type'] = dict( - tag=option_dict.get(str(item.get('business_type'))).get('label'), - color=json.loads(option_dict.get(str(item.get('business_type'))).get('css_class')).get('color') + tag=option_dict.get(str(item.get('business_type'))).get( + 'label' + ), + color='blue', ) item['key'] = str(item['oper_id']) item['cost_time'] = f"{item['cost_time']}毫秒" item['operation'] = [ - { - 'content': '详情', - 'type': 'link', - 'icon': 'antd-eye' - } if 'monitor:operlog:query' in button_perms else {}, + {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:operlog:query') + else {}, ] return dict( @@ -117,7 +136,7 @@ def get_operation_log_table_data(search_click, refresh_click, sorter, pagination operation_log_table_pagination=table_pagination, operation_log_table_key=str(uuid.uuid4()), operation_log_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -125,7 +144,7 @@ def get_operation_log_table_data(search_click, refresh_click, sorter, pagination operation_log_table_pagination=dash.no_update, operation_log_table_key=dash.no_update, operation_log_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -133,28 +152,30 @@ def get_operation_log_table_data(search_click, refresh_click, sorter, pagination # 重置操作日志搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('operation_log-title-input', 'value'), - Output('operation_log-oper_name-input', 'value'), - Output('operation_log-business_type-select', 'value'), - Output('operation_log-status-select', 'value'), - Output('operation_log-oper_time-range', 'value'), - Output('operation_log-operations-store', 'data')], + """, + [ + Output('operation_log-title-input', 'value'), + Output('operation_log-oper_name-input', 'value'), + Output('operation_log-business_type-select', 'value'), + Output('operation_log-status-select', 'value'), + Output('operation_log-oper_time-range', 'value'), + Output('operation_log-operations-store', 'data'), + ], Input('operation_log-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示操作日志搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -164,69 +185,88 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('operation_log-search-form-container', 'hidden'), - Output('operation_log-hidden-tooltip', 'title')], + """, + [ + Output('operation_log-search-form-container', 'hidden'), + Output('operation_log-hidden-tooltip', 'title'), + ], Input('operation_log-hidden', 'nClicks'), State('operation_log-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( output=dict( - modal_visible=Output('operation_log-modal', 'visible', allow_duplicate=True), + modal_visible=Output( + 'operation_log-modal', 'visible', allow_duplicate=True + ), modal_title=Output('operation_log-modal', 'title'), - form_value=Output({'type': 'operation_log-form-value', 'index': ALL}, 'children'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + form_value=Output( + {'type': 'operation_log-form-value', 'index': ALL}, 'children' + ), ), inputs=dict( button_click=Input('operation_log-list-table', 'nClicksButton') ), state=dict( clicked_content=State('operation_log-list-table', 'clickedContent'), - recently_button_clicked_row=State('operation_log-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'operation_log-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_operation_log_modal(button_click, clicked_content, recently_button_clicked_row): +def add_edit_operation_log_modal( + button_click, clicked_content, recently_button_clicked_row +): """ 显示操作日志详情弹窗回调 """ if button_click: # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[-2]] - oper_id = int(recently_button_clicked_row['key']) - operation_log_info_res = get_operation_log_detail_api(oper_id=oper_id) - if operation_log_info_res['code'] == 200: - operation_log_info = operation_log_info_res['data'] - oper_name = operation_log_info.get('oper_name') if operation_log_info.get('oper_name') else '' - oper_ip = operation_log_info.get('oper_ip') if operation_log_info.get('oper_ip') else '' - oper_location = operation_log_info.get('oper_location') if operation_log_info.get('oper_location') else '' - operation_log_info['login_info'] = f'{oper_name} / {oper_ip} / {oper_location}' - operation_log_info['status'] = '正常' if operation_log_info.get('status') == 0 else '失败' - operation_log_info['cost_time'] = f"{operation_log_info.get('cost_time')}毫秒" - return dict( - modal_visible=True, - modal_title='操作日志详情', - form_value=[operation_log_info.get(k) for k in form_value_list], - api_check_token_trigger={'timestamp': time.time()} - ) - + form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[-1]] + operation_log_info = recently_button_clicked_row + oper_name = ( + operation_log_info.get('oper_name') + if operation_log_info.get('oper_name') + else '' + ) + oper_ip = ( + operation_log_info.get('oper_ip') + if operation_log_info.get('oper_ip') + else '' + ) + oper_location = ( + operation_log_info.get('oper_location') + if operation_log_info.get('oper_location') + else '' + ) + operation_log_info['login_info'] = ( + f'{oper_name} / {oper_ip} / {oper_location}' + ) + operation_log_info['status'] = ( + '正常' if operation_log_info.get('status') == 0 else '失败' + ) + operation_log_info['cost_time'] = ( + f"{operation_log_info.get('cost_time')}毫秒" + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - api_check_token_trigger={'timestamp': time.time()} + modal_visible=True, + modal_title='操作日志详情', + form_value=[operation_log_info.get(k) for k in form_value_list], ) raise PreventUpdate @app.callback( - Output({'type': 'operation_log-operation-button', 'index': 'delete'}, 'disabled'), + Output( + {'type': 'operation_log-operation-button', 'index': 'delete'}, + 'disabled', + ), Input('operation_log-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_operation_log_delete_button_status(table_rows_selected): """ @@ -235,7 +275,6 @@ def change_operation_log_delete_button_status(table_rows_selected): outputs_list = dash.ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -244,12 +283,14 @@ def change_operation_log_delete_button_status(table_rows_selected): @app.callback( - [Output('operation_log-delete-text', 'children'), - Output('operation_log-delete-confirm-modal', 'visible'), - Output('operation_log-delete-ids-store', 'data')], + [ + Output('operation_log-delete-text', 'children'), + Output('operation_log-delete-confirm-modal', 'visible'), + Output('operation_log-delete-ids-store', 'data'), + ], Input({'type': 'operation_log-operation-button', 'index': ALL}, 'nClicks'), State('operation_log-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def operation_log_delete_modal(operation_click, selected_row_keys): """ @@ -263,97 +304,102 @@ def operation_log_delete_modal(operation_click, selected_row_keys): return [ f'是否确认删除日志编号为{oper_ids}的操作日志?', True, - {'oper_type': 'delete', 'oper_ids': oper_ids} + oper_ids, ] elif trigger_id.index == 'clear': return [ - f'是否确认清除所有的操作日志?', + '是否确认清除所有的操作日志?', True, - {'oper_type': 'clear', 'oper_ids': ''} + None, ] raise PreventUpdate @app.callback( - [Output('operation_log-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('operation_log-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('operation_log-delete-confirm-modal', 'okCounts'), State('operation_log-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def operation_log_delete_confirm(delete_confirm, oper_ids_data): """ 删除或清空操作日志弹窗确认回调,实现删除或清空操作 """ if delete_confirm: - oper_type = oper_ids_data.get('oper_type') if oper_type == 'clear': - params = dict(oper_type=oper_ids_data.get('oper_type')) - clear_button_info = clear_operation_log_api(params) + clear_button_info = OperlogApi.clean_operlog() if clear_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除成功', type='success') + fuc.FefferyFancyMessage('清除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除失败', type='error') + fuc.FefferyFancyMessage('清除失败', type='error'), ] else: - params = dict(oper_ids=oper_ids_data.get('oper_ids')) - delete_button_info = delete_operation_log_api(params) + params = oper_ids_data + delete_button_info = OperlogApi.del_operlog(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('operation_log-export-container', 'data', allow_duplicate=True), - Output('operation_log-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('operation_log-export-container', 'data', allow_duplicate=True), + Output('operation_log-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('operation_log-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_operation_log_list(export_click): """ 导出操作日志信息回调 """ if export_click: - export_operation_log_res = export_operation_log_list_api({}) + export_operation_log_res = OperlogApi.export_operlog({}) if export_operation_log_res.status_code == 200: export_operation_log = export_operation_log_res.content return [ - dcc.send_bytes(export_operation_log, f'操作日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_operation_log, + f'操作日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -362,7 +408,7 @@ def export_operation_log_list(export_click): @app.callback( Output('operation_log-export-container', 'data', allow_duplicate=True), Input('operation_log-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_operation_log_export_status(data): """ @@ -370,7 +416,6 @@ def reset_operation_log_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index 6e77157..933e7e8 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -1,10 +1,10 @@ from dash import dcc, html import feffery_antd_components as fac -import json -import callbacks.monitor_c.operlog_c -from api.log import get_operation_log_list_api -from api.dict import query_dict_data_list_api +import callbacks.monitor_c.operlog_c # noqa: F401 +from api.monitor.operlog import OperlogApi +from api.system.dict.data import DictDataApi +from utils.permission_util import PermissionManager def render(*args, **kwargs): @@ -12,26 +12,34 @@ def render(*args, **kwargs): option = [] option_table = [] - info = query_dict_data_list_api(dict_type='sys_oper_type') + info = DictDataApi.get_dicts(dict_type='sys_oper_type') if info.get('code') == 200: data = info.get('data') - option = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in data] + option = [ + dict(label=item.get('dict_label'), value=item.get('dict_value')) + for item in data + ] option_table = [ - dict(label=item.get('dict_label'), value=item.get('dict_value'), css_class=item.get('css_class')) for item - in data] + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} operation_log_params = dict(page_num=1, page_size=10) - table_info = get_operation_log_list_api(operation_log_params) + table_info = OperlogApi.list_operlog(operation_log_params) table_data = [] page_num = 1 page_size = 10 total = 0 if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['status'] == 0: item['status'] = dict(tag='成功', color='blue') @@ -39,17 +47,17 @@ def render(*args, **kwargs): item['status'] = dict(tag='失败', color='volcano') if str(item.get('business_type')) in option_dict.keys(): item['business_type'] = dict( - tag=option_dict.get(str(item.get('business_type'))).get('label'), - color=json.loads(option_dict.get(str(item.get('business_type'))).get('css_class')).get('color') + tag=option_dict.get(str(item.get('business_type'))).get( + 'label' + ), + color='blue', ) item['key'] = str(item['oper_id']) item['cost_time'] = f"{item['cost_time']}毫秒" item['operation'] = [ - { - 'content': '详情', - 'type': 'link', - 'icon': 'antd-eye' - } if 'monitor:operlog:query' in button_perms else {}, + {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:operlog:query') + else {}, ] return [ @@ -81,10 +89,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='系统模块', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdInput( @@ -94,10 +104,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='操作人员', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -106,10 +118,12 @@ def render(*args, **kwargs): options=option, style={ 'width': 240 - } + }, ), label='类型', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -118,29 +132,33 @@ def render(*args, **kwargs): options=[ { 'label': '成功', - 'value': 0 + 'value': 0, }, { 'label': '失败', - 'value': 1 - } + 'value': 1, + }, ], style={ 'width': 240 - } + }, ), label='状态', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdDateRangePicker( id='operation_log-oper_time-range', style={ 'width': 240 - } + }, ), label='操作时间', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -149,9 +167,11 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -159,16 +179,18 @@ def render(*args, **kwargs): id='operation_log-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='operation_log-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -187,15 +209,19 @@ def render(*args, **kwargs): ], id={ 'type': 'operation_log-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'monitor:operlog:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:operlog:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -205,14 +231,18 @@ def render(*args, **kwargs): ], id={ 'type': 'operation_log-operation-button', - 'index': 'clear' + 'index': 'clear', }, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'monitor:operlog:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:operlog:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -224,15 +254,17 @@ def render(*args, **kwargs): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'monitor:operlog:export' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'monitor:operlog:export' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -246,10 +278,10 @@ def render(*args, **kwargs): ), ], id='operation_log-hidden', - shape='circle' + shape='circle', ), id='operation_log-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -261,24 +293,22 @@ def render(*args, **kwargs): ), ], id='operation_log-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -357,41 +387,48 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, sortOptions={ - 'sortDataIndexes': ['oper_name', 'oper_time'], - 'multiple': False + 'sortDataIndexes': [ + 'oper_name', + 'oper_time', + ], + 'multiple': False, }, pagination={ 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 操作日志明细modal fac.AntdModal( [ @@ -404,49 +441,41 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'title' + 'index': 'title', } ), label='操作模块', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'title' + 'index': 'title', }, - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'oper_url' + 'index': 'oper_url', } ), label='请求地址', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'oper_url' - }, - labelCol={ - 'span': 8 + 'index': 'oper_url', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -455,49 +484,41 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'login_info' + 'index': 'login_info', } ), label='登录信息', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'login_info' + 'index': 'login_info', }, - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'request_method' + 'index': 'request_method', } ), label='请求方式', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'request_method' - }, - labelCol={ - 'span': 8 + 'index': 'request_method', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -506,23 +527,19 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'method' + 'index': 'method', } ), label='操作方法', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'method' + 'index': 'method', }, - labelCol={ - 'span': 4 - }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - span=24 + span=24, ), ], ), @@ -533,23 +550,19 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'oper_param' + 'index': 'oper_param', } ), label='请求参数', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'oper_param' - }, - labelCol={ - 'span': 4 + 'index': 'oper_param', }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - span=24 + span=24, ), ], ), @@ -560,23 +573,19 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'json_result' + 'index': 'json_result', } ), label='返回参数', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'json_result' + 'index': 'json_result', }, - labelCol={ - 'span': 4 - }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - span=24 + span=24, ), ], ), @@ -587,83 +596,65 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'status' + 'index': 'status', } ), label='操作状态', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'status' - }, - labelCol={ - 'span': 12 + 'index': 'status', }, - wrapperCol={ - 'span': 12 - } + labelCol={'span': 12}, + wrapperCol={'span': 12}, ), - span=8 + span=8, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'cost_time' + 'index': 'cost_time', } ), label='消耗时间', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'cost_time' - }, - labelCol={ - 'span': 12 + 'index': 'cost_time', }, - wrapperCol={ - 'span': 12 - } + labelCol={'span': 12}, + wrapperCol={'span': 12}, ), - span=6 + span=6, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'operation_log-form-value', - 'index': 'oper_time' + 'index': 'oper_time', } ), label='操作时间', required=True, id={ 'type': 'operation_log-form-label', - 'index': 'oper_time' + 'index': 'oper_time', }, - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=10 + span=10, ), ], - gutter=5 + gutter=5, ), ], - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - }, - style={ - 'marginRight': '15px' - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, + style={'marginRight': '15px'}, ) ], id='operation_log-modal', @@ -671,7 +662,6 @@ def render(*args, **kwargs): width=850, renderFooter=False, ), - # 删除操作日志二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='operation_log-delete-text'), @@ -679,6 +669,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] -- Gitee From 8a2dfe49257f5ced4ec3405ff676844b9ac60ae2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 22:13:05 +0800 Subject: [PATCH 021/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/dept.py | 2 +- .../callbacks/system_c/dept_c.py | 361 +++++++++++------- .../views/system/dept/__init__.py | 271 ++++++------- 3 files changed, 343 insertions(+), 291 deletions(-) diff --git a/dash-fastapi-frontend/api/system/dept.py b/dash-fastapi-frontend/api/system/dept.py index 753abc3..910c3b1 100644 --- a/dash-fastapi-frontend/api/system/dept.py +++ b/dash-fastapi-frontend/api/system/dept.py @@ -29,7 +29,7 @@ class DeptApi: :return: """ return api_request( - url=f'/system/dept/listexclude/{dept_id}', + url=f'/system/dept/list/exclude/{dept_id}', method='get', ) diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 877f587..6667c0a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -7,93 +7,96 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from utils.tree_tool import list_to_tree -from api.dept import get_dept_tree_api, get_dept_list_api, add_dept_api, edit_dept_api, delete_dept_api, \ - get_dept_detail_api, get_dept_tree_for_edit_option_api +from api.system.dept import DeptApi +from utils.permission_util import PermissionManager +from utils.tree_tool import list_to_tree, list_to_tree_select @app.callback( output=dict( dept_table_data=Output('dept-list-table', 'data', allow_duplicate=True), dept_table_key=Output('dept-list-table', 'key'), - dept_table_defaultexpandedrowkeys=Output('dept-list-table', 'defaultExpandedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - fold_click=Output('dept-fold', 'nClicks') + dept_table_defaultexpandedrowkeys=Output( + 'dept-list-table', 'defaultExpandedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + fold_click=Output('dept-fold', 'nClicks'), ), inputs=dict( search_click=Input('dept-search', 'nClicks'), refresh_click=Input('dept-refresh', 'nClicks'), operations=Input('dept-operations-store', 'data'), - fold_click=Input('dept-fold', 'nClicks') + fold_click=Input('dept-fold', 'nClicks'), ), state=dict( dept_name=State('dept-dept_name-input', 'value'), status_select=State('dept-status-select', 'value'), - in_default_expanded_row_keys=State('dept-list-table', 'defaultExpandedRowKeys'), - button_perms=State('dept-button-perms-container', 'data') + in_default_expanded_row_keys=State( + 'dept-list-table', 'defaultExpandedRowKeys' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_dept_table_data(search_click, refresh_click, operations, fold_click, dept_name, status_select, - in_default_expanded_row_keys, button_perms): +def get_dept_table_data( + search_click, + refresh_click, + operations, + fold_click, + dept_name, + status_select, + in_default_expanded_row_keys, +): """ 获取部门表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - query_params = dict( - dept_name=dept_name, - status=status_select - ) + query_params = dict(dept_name=dept_name, status=status_select) if search_click or refresh_click or operations or fold_click: - table_info = get_dept_list_api(query_params) + table_info = DeptApi.list_dept(query_params) default_expanded_row_keys = [] if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['data'] for item in table_data: default_expanded_row_keys.append(str(item['dept_id'])) item['key'] = str(item['dept_id']) if item['parent_id'] == 0: item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dept:edit' in button_perms else {}, - { - 'content': '新增', - 'type': 'link', - 'icon': 'antd-plus' - } if 'system:dept:add' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, ] elif item['status'] == '1': item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dept:edit' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, { 'content': '删除', 'type': 'link', - 'icon': 'antd-delete' - } if 'system:dept:remove' in button_perms else {}, + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:dept:remove') + else {}, ] else: item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dept:edit' in button_perms else {}, - { - 'content': '新增', - 'type': 'link', - 'icon': 'antd-plus' - } if 'system:dept:add' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, { 'content': '删除', 'type': 'link', - 'icon': 'antd-delete' - } if 'system:dept:remove' in button_perms else {}, + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:dept:remove') + else {}, ] if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') @@ -108,7 +111,7 @@ def get_dept_table_data(search_click, refresh_click, operations, fold_click, dep dept_table_key=str(uuid.uuid4()), dept_table_defaultexpandedrowkeys=[], api_check_token_trigger={'timestamp': time.time()}, - fold_click=None + fold_click=None, ) return dict( @@ -116,7 +119,7 @@ def get_dept_table_data(search_click, refresh_click, operations, fold_click, dep dept_table_key=str(uuid.uuid4()), dept_table_defaultexpandedrowkeys=default_expanded_row_keys, api_check_token_trigger={'timestamp': time.time()}, - fold_click=None + fold_click=None, ) return dict( @@ -124,7 +127,7 @@ def get_dept_table_data(search_click, refresh_click, operations, fold_click, dep dept_table_key=dash.no_update, dept_table_defaultexpandedrowkeys=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - fold_click=None + fold_click=None, ) return dict( @@ -132,30 +135,32 @@ def get_dept_table_data(search_click, refresh_click, operations, fold_click, dep dept_table_key=dash.no_update, dept_table_defaultexpandedrowkeys=dash.no_update, api_check_token_trigger=dash.no_update, - fold_click=None + fold_click=None, ) # 重置部门搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('dept-dept_name-input', 'value'), - Output('dept-status-select', 'value'), - Output('dept-operations-store', 'data')], + """, + [ + Output('dept-dept_name-input', 'value'), + Output('dept-status-select', 'value'), + Output('dept-operations-store', 'data'), + ], Input('dept-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示部门搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -165,12 +170,14 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('dept-search-form-container', 'hidden'), - Output('dept-hidden-tooltip', 'title')], + """, + [ + Output('dept-search-form-container', 'hidden'), + Output('dept-hidden-tooltip', 'title'), + ], Input('dept-hidden', 'nClicks'), State('dept-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @@ -179,47 +186,81 @@ app.clientside_callback( modal_visible=Output('dept-modal', 'visible', allow_duplicate=True), modal_title=Output('dept-modal', 'title'), parent_id_div_ishidden=Output('dept-parent_id-div', 'hidden'), - parent_id_tree=Output({'type': 'dept-form-value', 'index': 'parent_id'}, 'treeData'), + parent_id_tree=Output( + {'type': 'dept-form-value', 'index': 'parent_id'}, 'treeData' + ), form_value=Output({'type': 'dept-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'dept-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'dept-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'dept-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'dept-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('dept-edit-id-store', 'data'), - modal_type=Output('dept-operations-store-bk', 'data') + modal_type=Output('dept-operations-store-bk', 'data'), ), inputs=dict( - operation_click=Input({'type': 'dept-operation-button', 'index': ALL}, 'nClicks'), - button_click=Input('dept-list-table', 'nClicksButton') + operation_click=Input( + {'type': 'dept-operation-button', 'index': ALL}, 'nClicks' + ), + button_click=Input('dept-list-table', 'nClicksButton'), ), state=dict( clicked_content=State('dept-list-table', 'clickedContent'), - recently_button_clicked_row=State('dept-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'dept-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_dept_modal(operation_click, button_click, clicked_content, recently_button_clicked_row): +def add_edit_dept_modal( + operation_click, button_click, clicked_content, recently_button_clicked_row +): """ 显示新增或编辑部门弹窗回调 """ trigger_id = dash.ctx.triggered_id if trigger_id == {'index': 'add', 'type': 'dept-operation-button'} or ( - trigger_id == 'dept-list-table' and clicked_content != '删除'): + trigger_id == 'dept-list-table' and clicked_content != '删除' + ): # 获取所有输出表单项对应value的index form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[4]] # 获取所有输出表单项对应label的index form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[5]] - dept_params = dict(dept_name='') if trigger_id == 'dept-list-table' and clicked_content == '修改': - dept_params['dept_id'] = int(recently_button_clicked_row['key']) - tree_info = get_dept_tree_for_edit_option_api(dept_params) + tree_info = DeptApi.list_dept_exclude_child( + dept_id=int(recently_button_clicked_row['key']) + ) else: - tree_info = get_dept_tree_api(dept_params) + dept_params = dict(dept_name='') + tree_info = DeptApi.list_dept(dept_params) if tree_info['code'] == 200: - tree_data = tree_info['data'] + tree_data = list_to_tree_select( + tree_info['data'], + 'dept_name', + 'dept_id', + 'dept_id', + 'parent_id', + ) - if trigger_id == {'index': 'add', 'type': 'dept-operation-button'} or (trigger_id == 'dept-list-table' and clicked_content == '新增'): + if trigger_id == { + 'index': 'add', + 'type': 'dept-operation-button', + } or ( + trigger_id == 'dept-list-table' and clicked_content == '新增' + ): dept_info = dict( - parent_id=None if trigger_id == {'index': 'add', 'type': 'dept-operation-button'} else str(recently_button_clicked_row['key']), + parent_id=None + if trigger_id + == {'index': 'add', 'type': 'dept-operation-button'} + else str(recently_button_clicked_row['key']), dept_name=None, order_num=None, leader=None, @@ -237,11 +278,11 @@ def add_edit_dept_modal(operation_click, button_click, clicked_content, recently form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type={'type': 'add'} + modal_type={'type': 'add'}, ) elif trigger_id == 'dept-list-table' and clicked_content == '修改': dept_id = int(recently_button_clicked_row['key']) - dept_info_res = get_dept_detail_api(dept_id=dept_id) + dept_info_res = DeptApi.get_dept(dept_id=dept_id) if dept_info_res['code'] == 200: dept_info = dept_info_res['data'] return dict( @@ -250,11 +291,12 @@ def add_edit_dept_modal(operation_click, button_click, clicked_content, recently parent_id_div_ishidden=dept_info.get('parent_id') == 0, parent_id_tree=tree_data, form_value=[dept_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), + form_label_validate_status=[None] + * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=dept_info, - modal_type={'type': 'edit'} + modal_type={'type': 'edit'}, ) return dict( @@ -267,7 +309,7 @@ def add_edit_dept_modal(operation_click, button_click, clicked_content, recently form_label_validate_info=[dash.no_update] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None + modal_type=None, ) raise PreventUpdate @@ -275,64 +317,99 @@ def add_edit_dept_modal(operation_click, button_click, clicked_content, recently @app.callback( output=dict( - form_label_validate_status=Output({'type': 'dept-form-label', 'index': ALL, 'required': True}, 'validateStatus', - allow_duplicate=True), - form_label_validate_info=Output({'type': 'dept-form-label', 'index': ALL, 'required': True}, 'help', - allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'dept-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'dept-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('dept-modal', 'visible'), - operations=Output('dept-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('dept-modal', 'okCounts') + operations=Output( + 'dept-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('dept-modal', 'okCounts')), state=dict( modal_type=State('dept-operations-store-bk', 'data'), edit_row_info=State('dept-edit-id-store', 'data'), form_value=State({'type': 'dept-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'dept-form-label', 'index': ALL, 'required': True}, 'label') + form_label=State( + {'type': 'dept-form-label', 'index': ALL, 'required': True}, 'label' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def dept_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label): +def dept_confirm( + confirm_trigger, modal_type, edit_row_info, form_value, form_label +): """ 新增或编辑部门弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + } + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params_add = form_value_state params_edit = params_add.copy() - params_edit['dept_id'] = edit_row_info.get('dept_id') if edit_row_info else None + params_edit['dept_id'] = ( + edit_row_info.get('dept_id') if edit_row_info else None + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_dept_api(params_add) + api_res = DeptApi.add_dept(params_add) if modal_type == 'edit': - api_res = edit_dept_api(params_edit) + api_res = DeptApi.update_dept(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -341,36 +418,55 @@ def dept_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_la modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('dept-delete-text', 'children'), - Output('dept-delete-confirm-modal', 'visible'), - Output('dept-delete-ids-store', 'data')], + [ + Output('dept-delete-text', 'children'), + Output('dept-delete-confirm-modal', 'visible'), + Output('dept-delete-ids-store', 'data'), + ], [Input('dept-list-table', 'nClicksButton')], - [State('dept-list-table', 'clickedContent'), - State('dept-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + State('dept-list-table', 'clickedContent'), + State('dept-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def dept_delete_modal(button_click, clicked_content, recently_button_clicked_row): +def dept_delete_modal( + button_click, clicked_content, recently_button_clicked_row +): """ 显示删除部门二次确认弹窗回调 """ if button_click: - if clicked_content == '删除': dept_ids = recently_button_clicked_row['key'] else: @@ -379,39 +475,40 @@ def dept_delete_modal(button_click, clicked_content, recently_button_clicked_row return [ f'是否确认删除部门编号为{dept_ids}的部门?', True, - {'dept_ids': dept_ids} + dept_ids, ] raise PreventUpdate @app.callback( - [Output('dept-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('dept-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('dept-delete-confirm-modal', 'okCounts'), State('dept-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def dept_delete_confirm(delete_confirm, dept_ids_data): """ 删除部门弹窗确认回调,实现删除操作 """ if delete_confirm: - params = dept_ids_data - delete_button_info = delete_dept_api(params) + delete_button_info = DeptApi.del_dept(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/dept/__init__.py b/dash-fastapi-frontend/views/system/dept/__init__.py index 5983d03..ba530a4 100644 --- a/dash-fastapi-frontend/views/system/dept/__init__.py +++ b/dash-fastapi-frontend/views/system/dept/__init__.py @@ -1,8 +1,9 @@ from dash import dcc, html import feffery_antd_components as fac -import callbacks.system_c.dept_c -from api.dept import get_dept_list_api +import callbacks.system_c.dept_c # noqa: F401 +from api.system.dept import DeptApi +from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree @@ -10,55 +11,41 @@ def render(*args, **kwargs): button_perms = kwargs.get('button_perms') table_data_new = [] default_expanded_row_keys = [] - table_info = get_dept_list_api({}) + table_info = DeptApi.list_dept({}) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['data'] for item in table_data: default_expanded_row_keys.append(str(item['dept_id'])) item['key'] = str(item['dept_id']) if item['parent_id'] == 0: item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dept:edit' in button_perms else {}, - { - 'content': '新增', - 'type': 'link', - 'icon': 'antd-plus' - } if 'system:dept:add' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, ] elif item['status'] == '1': item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dept:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:dept:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dept:remove') + else {}, ] else: item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dept:edit' in button_perms else {}, - { - 'content': '新增', - 'type': 'link', - 'icon': 'antd-plus' - } if 'system:dept:add' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:dept:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dept:remove') + else {}, ] if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') @@ -96,9 +83,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), - label='部门名称' + label='部门名称', ), fac.AntdFormItem( fac.AntdSelect( @@ -107,18 +94,18 @@ def render(*args, **kwargs): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '停用', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 240 - } + }, ), - label='部门状态' + label='部门状态', ), fac.AntdFormItem( fac.AntdButton( @@ -127,7 +114,7 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ) ), fac.AntdFormItem( @@ -136,13 +123,13 @@ def render(*args, **kwargs): id='dept-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ) - ) + ), ], style={ 'paddingBottom': '10px' - } + }, ), ], layout='inline', @@ -168,14 +155,18 @@ def render(*args, **kwargs): ], id={ 'type': 'dept-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:dept:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:dept:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -187,15 +178,13 @@ def render(*args, **kwargs): style={ 'color': '#909399', 'background': '#f4f4f5', - 'border-color': '#d3d4d6' - } + 'border-color': '#d3d4d6', + }, ), ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -209,10 +198,10 @@ def render(*args, **kwargs): ), ], id='dept-hidden', - shape='circle' + shape='circle', ), id='dept-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -224,24 +213,22 @@ def render(*args, **kwargs): ), ], id='dept-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -257,7 +244,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'ellipsis' }, - 'hidden': True + 'hidden': True, }, { 'dataIndex': 'dept_name', @@ -293,7 +280,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], bordered=True, pagination={ @@ -303,21 +290,20 @@ def render(*args, **kwargs): style={ 'width': '100%', 'padding-right': '10px', - 'padding-bottom': '20px' - } + 'padding-bottom': '20px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑部门表单modal fac.AntdModal( [ @@ -332,34 +318,28 @@ def render(*args, **kwargs): fac.AntdTreeSelect( id={ 'type': 'dept-form-value', - 'index': 'parent_id' + 'index': 'parent_id', }, placeholder='请选择上级部门', treeData=[], treeNodeFilterProp='title', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), label='上级部门', required=True, id={ 'type': 'dept-form-label', 'index': 'parent_id', - 'required': True - }, - labelCol={ - 'span': 4 + 'required': True, }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), ], id='dept-parent_id-div', - hidden=False + hidden=False, ), - span=24 + span=24, ), ] ), @@ -370,48 +350,44 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'dept-form-value', - 'index': 'dept_name' + 'index': 'dept_name', }, placeholder='请输入部门名称', allowClear=True, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), label='部门名称', required=True, id={ 'type': 'dept-form-label', 'index': 'dept_name', - 'required': True - } + 'required': True, + }, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdInputNumber( id={ 'type': 'dept-form-value', - 'index': 'order_num' + 'index': 'order_num', }, min=0, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), label='显示顺序', required=True, id={ 'type': 'dept-form-label', 'index': 'order_num', - 'required': True - } + 'required': True, + }, ), - span=12 - ) + span=12, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -420,47 +396,43 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'dept-form-value', - 'index': 'leader' + 'index': 'leader', }, placeholder='请输入负责人', allowClear=True, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), label='负责人', id={ 'type': 'dept-form-label', 'index': 'leader', - 'required': False - } + 'required': False, + }, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdInput( id={ 'type': 'dept-form-value', - 'index': 'phone' + 'index': 'phone', }, placeholder='请输入联系电话', allowClear=True, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), label='联系电话', id={ 'type': 'dept-form-label', 'index': 'phone', - 'required': False - } + 'required': False, + }, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -469,76 +441,59 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'dept-form-value', - 'index': 'email' + 'index': 'email', }, placeholder='请输入邮箱', allowClear=True, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), label='邮箱', id={ 'type': 'dept-form-label', 'index': 'email', - 'required': False - } + 'required': False, + }, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( id={ 'type': 'dept-form-value', - 'index': 'status' + 'index': 'status', }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '停用', 'value': '1'}, ], defaultValue='0', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), label='部门状态', id={ 'type': 'dept-form-label', 'index': 'status', - 'required': False - } + 'required': False, + }, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), ], - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - }, - style={ - 'marginRight': '15px' - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, + style={'marginRight': '15px'}, ) ], id='dept-modal', mask=False, width=650, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除部门二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='dept-delete-text'), @@ -546,6 +501,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] -- Gitee From ca25436cceb601df5b04f31d1cb27492161994d6 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 22:13:42 +0800 Subject: [PATCH 022/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 496 ++++++++++++------ .../callbacks/system_c/dict_c/dict_data_c.py | 398 +++++++++----- .../views/system/dict/__init__.py | 257 ++++----- .../views/system/dict/dict_data.py | 271 +++++----- 4 files changed, 854 insertions(+), 568 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index a4698f1..da67864 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -8,73 +8,87 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.dict import get_dict_type_list_api, get_all_dict_type_api, get_dict_type_detail_api, add_dict_type_api, edit_dict_type_api, delete_dict_type_api, export_dict_type_list_api, refresh_dict_api +from api.system.dict.type import DictTypeApi +from utils.permission_util import PermissionManager @app.callback( output=dict( - dict_type_table_data=Output('dict_type-list-table', 'data', allow_duplicate=True), - dict_type_table_pagination=Output('dict_type-list-table', 'pagination', allow_duplicate=True), + dict_type_table_data=Output( + 'dict_type-list-table', 'data', allow_duplicate=True + ), + dict_type_table_pagination=Output( + 'dict_type-list-table', 'pagination', allow_duplicate=True + ), dict_type_table_key=Output('dict_type-list-table', 'key'), - dict_type_table_selectedrowkeys=Output('dict_type-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + dict_type_table_selectedrowkeys=Output( + 'dict_type-list-table', 'selectedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('dict_type-search', 'nClicks'), refresh_click=Input('dict_type-refresh', 'nClicks'), pagination=Input('dict_type-list-table', 'pagination'), - operations=Input('dict_type-operations-store', 'data') + operations=Input('dict_type-operations-store', 'data'), ), state=dict( dict_name=State('dict_type-dict_name-input', 'value'), dict_type=State('dict_type-dict_type-input', 'value'), status_select=State('dict_type-status-select', 'value'), create_time_range=State('dict_type-create_time-range', 'value'), - button_perms=State('dict_type-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_dict_type_table_data(search_click, refresh_click, pagination, operations, dict_name, dict_type, status_select, create_time_range, button_perms): +def get_dict_type_table_data( + search_click, + refresh_click, + pagination, + operations, + dict_name, + dict_type, + status_select, + create_time_range, +): """ 获取字典类型表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - create_time_start = None - create_time_end = None + begin_time = None + end_time = None if create_time_range: - create_time_start = create_time_range[0] - create_time_end = create_time_range[1] + begin_time = create_time_range[0] + end_time = create_time_range[1] query_params = dict( dict_name=dict_name, dict_type=dict_type, status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, + begin_time=begin_time, + end_time=end_time, page_num=1, - page_size=10 + page_size=10, ) triggered_id = dash.ctx.triggered_id if triggered_id == 'dict_type-list-table': - query_params = dict( - dict_name=dict_name, - dict_type=dict_type, - status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - table_info = get_dict_type_list_api(query_params) + table_info = DictTypeApi.list_type(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == '0': @@ -87,16 +101,12 @@ def get_dict_type_table_data(search_click, refresh_click, pagination, operations 'type': 'link', } item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dict:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:dict:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dict:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dict:remove') + else {}, ] return dict( @@ -104,7 +114,7 @@ def get_dict_type_table_data(search_click, refresh_click, pagination, operations dict_type_table_pagination=table_pagination, dict_type_table_key=str(uuid.uuid4()), dict_type_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -112,7 +122,7 @@ def get_dict_type_table_data(search_click, refresh_click, pagination, operations dict_type_table_pagination=dash.no_update, dict_type_table_key=dash.no_update, dict_type_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -120,27 +130,29 @@ def get_dict_type_table_data(search_click, refresh_click, pagination, operations # 重置字典类型搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('dict_type-dict_name-input', 'value'), - Output('dict_type-dict_type-input', 'value'), - Output('dict_type-status-select', 'value'), - Output('dict_type-create_time-range', 'value'), - Output('dict_type-operations-store', 'data')], + """, + [ + Output('dict_type-dict_name-input', 'value'), + Output('dict_type-dict_type-input', 'value'), + Output('dict_type-status-select', 'value'), + Output('dict_type-create_time-range', 'value'), + Output('dict_type-operations-store', 'data'), + ], Input('dict_type-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示字典类型搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -150,19 +162,21 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('dict_type-search-form-container', 'hidden'), - Output('dict_type-hidden-tooltip', 'title')], + """, + [ + Output('dict_type-search-form-container', 'hidden'), + Output('dict_type-hidden-tooltip', 'title'), + ], Input('dict_type-hidden', 'nClicks'), State('dict_type-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'dict_type-operation-button', 'index': 'edit'}, 'disabled'), Input('dict_type-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_dict_type_edit_button_status(table_rows_selected): """ @@ -182,9 +196,11 @@ def change_dict_type_edit_button_status(table_rows_selected): @app.callback( - Output({'type': 'dict_type-operation-button', 'index': 'delete'}, 'disabled'), + Output( + {'type': 'dict_type-operation-button', 'index': 'delete'}, 'disabled' + ), Input('dict_type-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_dict_type_delete_button_status(table_rows_selected): """ @@ -193,7 +209,6 @@ def change_dict_type_delete_button_status(table_rows_selected): outputs_list = dash.ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -203,40 +218,71 @@ def change_dict_type_delete_button_status(table_rows_selected): @app.callback( output=dict( - modal_visible=Output('dict_type-modal', 'visible', allow_duplicate=True), + modal_visible=Output( + 'dict_type-modal', 'visible', allow_duplicate=True + ), modal_title=Output('dict_type-modal', 'title'), - form_value=Output({'type': 'dict_type-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'dict_type-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'dict_type-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + form_value=Output( + {'type': 'dict_type-form-value', 'index': ALL}, 'value' + ), + form_label_validate_status=Output( + {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('dict_type-edit-id-store', 'data'), - modal_type=Output('dict_type-operations-store-bk', 'data') + modal_type=Output('dict_type-operations-store-bk', 'data'), ), inputs=dict( - operation_click=Input({'type': 'dict_type-operation-button', 'index': ALL}, 'nClicks'), - button_click=Input('dict_type-list-table', 'nClicksButton') + operation_click=Input( + {'type': 'dict_type-operation-button', 'index': ALL}, 'nClicks' + ), + button_click=Input('dict_type-list-table', 'nClicksButton'), ), state=dict( selected_row_keys=State('dict_type-list-table', 'selectedRowKeys'), clicked_content=State('dict_type-list-table', 'clickedContent'), - recently_button_clicked_row=State('dict_type-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'dict_type-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_dict_type_modal(operation_click, button_click, selected_row_keys, clicked_content, recently_button_clicked_row): +def add_edit_dict_type_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示新增或编辑字典类型弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'add', 'type': 'dict_type-operation-button'} \ - or trigger_id == {'index': 'edit', 'type': 'dict_type-operation-button'} \ - or (trigger_id == 'dict_type-list-table' and clicked_content == '修改'): + if ( + trigger_id == {'index': 'add', 'type': 'dict_type-operation-button'} + or trigger_id == {'index': 'edit', 'type': 'dict_type-operation-button'} + or (trigger_id == 'dict_type-list-table' and clicked_content == '修改') + ): # 获取所有输出表单项对应value的index form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] # 获取所有输出表单项对应label的index form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'dict_type-operation-button'}: - dict_type_info = dict(dict_name=None, dict_type=None, status='0', remark=None,) + dict_type_info = dict( + dict_name=None, + dict_type=None, + status='0', + remark=None, + ) return dict( modal_visible=True, modal_title='新增字典类型', @@ -245,14 +291,22 @@ def add_edit_dict_type_modal(operation_click, button_click, selected_row_keys, c form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger=dash.no_update, edit_row_info=None, - modal_type={'type': 'add'} + modal_type={'type': 'add'}, ) - elif trigger_id == {'index': 'edit', 'type': 'dict_type-operation-button'} or (trigger_id == 'dict_type-list-table' and clicked_content == '修改'): - if trigger_id == {'index': 'edit', 'type': 'dict_type-operation-button'}: + elif trigger_id == { + 'index': 'edit', + 'type': 'dict_type-operation-button', + } or ( + trigger_id == 'dict_type-list-table' and clicked_content == '修改' + ): + if trigger_id == { + 'index': 'edit', + 'type': 'dict_type-operation-button', + }: dict_id = int(','.join(selected_row_keys)) else: dict_id = int(recently_button_clicked_row['key']) - dict_type_info_res = get_dict_type_detail_api(dict_id=dict_id) + dict_type_info_res = DictTypeApi.get_type(dict_id=dict_id) if dict_type_info_res['code'] == 200: dict_type_info = dict_type_info_res['data'] return dict( @@ -263,7 +317,7 @@ def add_edit_dict_type_modal(operation_click, button_click, selected_row_keys, c form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=dict_type_info if dict_type_info else None, - modal_type={'type': 'edit'} + modal_type={'type': 'edit'}, ) return dict( @@ -274,7 +328,7 @@ def add_edit_dict_type_modal(operation_click, button_click, selected_row_keys, c form_label_validate_info=[dash.no_update] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None + modal_type=None, ) raise PreventUpdate @@ -282,64 +336,102 @@ def add_edit_dict_type_modal(operation_click, button_click, selected_row_keys, c @app.callback( output=dict( - form_label_validate_status=Output({'type': 'dict_type-form-label', 'index': ALL, 'required': True}, 'validateStatus', - allow_duplicate=True), - form_label_validate_info=Output({'type': 'dict_type-form-label', 'index': ALL, 'required': True}, 'help', - allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('dict_type-modal', 'visible'), - operations=Output('dict_type-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('dict_type-modal', 'okCounts') + operations=Output( + 'dict_type-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('dict_type-modal', 'okCounts')), state=dict( modal_type=State('dict_type-operations-store-bk', 'data'), edit_row_info=State('dict_type-edit-id-store', 'data'), - form_value=State({'type': 'dict_type-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'dict_type-form-label', 'index': ALL, 'required': True}, 'label') + form_value=State( + {'type': 'dict_type-form-value', 'index': ALL}, 'value' + ), + form_label=State( + {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, + 'label', + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def dict_type_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label): +def dict_type_confirm( + confirm_trigger, modal_type, edit_row_info, form_value, form_label +): """ 新增或编字典类型弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + } + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params_add = form_value_state params_edit = params_add.copy() - params_edit['dict_id'] = edit_row_info.get('dict_id') if edit_row_info else None + params_edit['dict_id'] = ( + edit_row_info.get('dict_id') if edit_row_info else None + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_dict_type_api(params_add) + api_res = DictTypeApi.add_type(params_add) if modal_type == 'edit': - api_res = edit_dict_type_api(params_edit) + api_res = DictTypeApi.update_type(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -348,42 +440,71 @@ def dict_type_confirm(confirm_trigger, modal_type, edit_row_info, form_value, fo modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('dict_type-delete-text', 'children'), - Output('dict_type-delete-confirm-modal', 'visible'), - Output('dict_type-delete-ids-store', 'data')], - [Input({'type': 'dict_type-operation-button', 'index': ALL}, 'nClicks'), - Input('dict_type-list-table', 'nClicksButton')], - [State('dict_type-list-table', 'selectedRowKeys'), - State('dict_type-list-table', 'clickedContent'), - State('dict_type-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + Output('dict_type-delete-text', 'children'), + Output('dict_type-delete-confirm-modal', 'visible'), + Output('dict_type-delete-ids-store', 'data'), + ], + [ + Input({'type': 'dict_type-operation-button', 'index': ALL}, 'nClicks'), + Input('dict_type-list-table', 'nClicksButton'), + ], + [ + State('dict_type-list-table', 'selectedRowKeys'), + State('dict_type-list-table', 'clickedContent'), + State('dict_type-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def dict_type_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): +def dict_type_delete_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示删除字典类型二次确认弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'delete', 'type': 'dict_type-operation-button'} or ( - trigger_id == 'dict_type-list-table' and clicked_content == '删除'): - - if trigger_id == {'index': 'delete', 'type': 'dict_type-operation-button'}: + if trigger_id == { + 'index': 'delete', + 'type': 'dict_type-operation-button', + } or (trigger_id == 'dict_type-list-table' and clicked_content == '删除'): + if trigger_id == { + 'index': 'delete', + 'type': 'dict_type-operation-button', + }: dict_ids = ','.join(selected_row_keys) else: if clicked_content == '删除': @@ -394,39 +515,40 @@ def dict_type_delete_modal(operation_click, button_click, return [ f'是否确认删除字典编号为{dict_ids}的字典类型?', True, - {'dict_ids': dict_ids} + dict_ids, ] raise PreventUpdate @app.callback( - [Output('dict_type-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('dict_type-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('dict_type-delete-confirm-modal', 'okCounts'), State('dict_type-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def dict_type_delete_confirm(delete_confirm, dict_ids_data): """ 删除字典类型弹窗确认回调,实现删除操作 """ if delete_confirm: - params = dict_ids_data - delete_button_info = delete_dict_type_api(params) + delete_button_info = DictTypeApi.del_type(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @@ -434,84 +556,115 @@ def dict_type_delete_confirm(delete_confirm, dict_ids_data): @app.callback( output=dict( - dict_data_modal_visible=Output('dict_type_to_dict_data-modal', 'visible'), + dict_data_modal_visible=Output( + 'dict_type_to_dict_data-modal', 'visible' + ), dict_data_modal_title=Output('dict_type_to_dict_data-modal', 'title'), - dict_data_select_options=Output('dict_data-dict_type-select', 'options'), - dict_data_select_value=Output('dict_data-dict_type-select', 'value', allow_duplicate=True), + dict_data_select_options=Output( + 'dict_data-dict_type-select', 'options' + ), + dict_data_select_value=Output( + 'dict_data-dict_type-select', 'value', allow_duplicate=True + ), dict_data_search_nclick=Output('dict_data-search', 'nClicks'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) - ), - inputs=dict( - button_click=Input('dict_type-list-table', 'nClicksButton') + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), + inputs=dict(button_click=Input('dict_type-list-table', 'nClicksButton')), state=dict( clicked_content=State('dict_type-list-table', 'clickedContent'), - recently_button_clicked_row=State('dict_type-list-table', 'recentlyButtonClickedRow'), - dict_data_search_nclick=State('dict_data-search', 'nClicks') + recently_button_clicked_row=State( + 'dict_type-list-table', 'recentlyButtonClickedRow' + ), + dict_data_search_nclick=State('dict_data-search', 'nClicks'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def dict_type_to_dict_data_modal(button_click, clicked_content, recently_button_clicked_row, dict_data_search_nclick): +def dict_type_to_dict_data_modal( + button_click, + clicked_content, + recently_button_clicked_row, + dict_data_search_nclick, +): """ 显示字典类型对应数据表格弹窗回调 """ - if button_click and clicked_content == recently_button_clicked_row.get('dict_type').get('content'): - all_dict_type_info = get_all_dict_type_api({}) + if button_click and clicked_content == recently_button_clicked_row.get( + 'dict_type' + ).get('content'): + all_dict_type_info = DictTypeApi.optionselect() if all_dict_type_info.get('code') == 200: all_dict_type = all_dict_type_info.get('data') - dict_data_options = [dict(label=item.get('dict_name'), value=item.get('dict_type')) for item in all_dict_type] + dict_data_options = [ + dict(label=item.get('dict_name'), value=item.get('dict_type')) + for item in all_dict_type + ] return dict( dict_data_modal_visible=True, dict_data_modal_title='字典数据', dict_data_select_options=dict_data_options, - dict_data_select_value=recently_button_clicked_row.get('dict_type').get('content'), - dict_data_search_nclick=dict_data_search_nclick + 1 if dict_data_search_nclick else 1, - api_check_token_trigger={'timestamp': time.time()} + dict_data_select_value=recently_button_clicked_row.get( + 'dict_type' + ).get('content'), + dict_data_search_nclick=dict_data_search_nclick + 1 + if dict_data_search_nclick + else 1, + api_check_token_trigger={'timestamp': time.time()}, ) return dict( dict_data_modal_visible=True, dict_data_modal_title='字典数据', dict_data_select_options=[], - dict_data_select_value=recently_button_clicked_row.get('dict_type').get('content'), - dict_data_search_nclick=dict_data_search_nclick + 1 if dict_data_search_nclick else 1, - api_check_token_trigger={'timestamp': time.time()} + dict_data_select_value=recently_button_clicked_row.get( + 'dict_type' + ).get('content'), + dict_data_search_nclick=dict_data_search_nclick + 1 + if dict_data_search_nclick + else 1, + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @app.callback( - [Output('dict_type-export-container', 'data', allow_duplicate=True), - Output('dict_type-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('dict_type-export-container', 'data', allow_duplicate=True), + Output('dict_type-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('dict_type-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_dict_type_list(export_click): """ 导出字典类型信息回调 """ if export_click: - export_dict_type_res = export_dict_type_list_api({}) + export_dict_type_res = DictTypeApi.export_type({}) if export_dict_type_res.status_code == 200: export_dict_type = export_dict_type_res.content return [ - dcc.send_bytes(export_dict_type, f'字典类型信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_dict_type, + f'字典类型信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -520,7 +673,7 @@ def export_dict_type_list(export_click): @app.callback( Output('dict_type-export-container', 'data', allow_duplicate=True), Input('dict_type-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_dict_type_export_status(data): """ @@ -528,33 +681,34 @@ def reset_dict_type_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate @app.callback( - [Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('dict_type-refresh-cache', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def refresh_dict_cache(refresh_click): """ 刷新缓存回调 """ if refresh_click: - refresh_info_res = refresh_dict_api({}) + refresh_info_res = DictTypeApi.refresh_cache() if refresh_info_res.get('code') == 200: return [ {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新成功', type='success') + fuc.FefferyFancyMessage('刷新成功', type='success'), ] return [ {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新失败', type='error') + fuc.FefferyFancyMessage('刷新失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index cf4ae9d..1c46994 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -8,32 +8,48 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.dict import get_dict_data_list_api, get_dict_data_detail_api, add_dict_data_api, edit_dict_data_api, delete_dict_data_api, export_dict_data_list_api +from api.system.dict.data import DictDataApi +from utils.permission_util import PermissionManager @app.callback( output=dict( - dict_data_table_data=Output('dict_data-list-table', 'data', allow_duplicate=True), - dict_data_table_pagination=Output('dict_data-list-table', 'pagination', allow_duplicate=True), + dict_data_table_data=Output( + 'dict_data-list-table', 'data', allow_duplicate=True + ), + dict_data_table_pagination=Output( + 'dict_data-list-table', 'pagination', allow_duplicate=True + ), dict_data_table_key=Output('dict_data-list-table', 'key'), - dict_data_table_selectedrowkeys=Output('dict_data-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + dict_data_table_selectedrowkeys=Output( + 'dict_data-list-table', 'selectedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('dict_data-search', 'nClicks'), refresh_click=Input('dict_data-refresh', 'nClicks'), pagination=Input('dict_data-list-table', 'pagination'), - operations=Input('dict_data-operations-store', 'data') + operations=Input('dict_data-operations-store', 'data'), ), state=dict( dict_type=State('dict_data-dict_type-select', 'value'), dict_label=State('dict_data-dict_label-input', 'value'), status_select=State('dict_data-status-select', 'value'), - button_perms=State('dict_data-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_dict_data_table_data(search_click, refresh_click, pagination, operations, dict_type, dict_label, status_select, button_perms): +def get_dict_data_table_data( + search_click, + refresh_click, + pagination, + operations, + dict_type, + dict_label, + status_select, +): """ 获取字典数据表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ @@ -43,28 +59,27 @@ def get_dict_data_table_data(search_click, refresh_click, pagination, operations dict_label=dict_label, status=status_select, page_num=1, - page_size=10 + page_size=10, ) triggered_id = dash.ctx.triggered_id if triggered_id == 'dict_data-list-table': - query_params = dict( - dict_type=dict_type, - dict_label=dict_label, - status=status_select, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - table_info = get_dict_data_list_api(query_params) + table_info = DictDataApi.list_data(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == '0': @@ -73,16 +88,12 @@ def get_dict_data_table_data(search_click, refresh_click, pagination, operations item['status'] = dict(tag='停用', color='volcano') item['key'] = str(item['dict_code']) item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dict:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:dict:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dict:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dict:remove') + else {}, ] return dict( @@ -90,7 +101,7 @@ def get_dict_data_table_data(search_click, refresh_click, pagination, operations dict_data_table_pagination=table_pagination, dict_data_table_key=str(uuid.uuid4()), dict_data_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -98,7 +109,7 @@ def get_dict_data_table_data(search_click, refresh_click, pagination, operations dict_data_table_pagination=dash.no_update, dict_data_table_key=dash.no_update, dict_data_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -106,25 +117,27 @@ def get_dict_data_table_data(search_click, refresh_click, pagination, operations # 重置字典数据搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('dict_data-dict_label-input', 'value'), - Output('dict_data-status-select', 'value'), - Output('dict_data-operations-store', 'data')], + """, + [ + Output('dict_data-dict_label-input', 'value'), + Output('dict_data-status-select', 'value'), + Output('dict_data-operations-store', 'data'), + ], Input('dict_data-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示字典数据搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -134,19 +147,21 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('dict_data-search-form-container', 'hidden'), - Output('dict_data-hidden-tooltip', 'title')], + """, + [ + Output('dict_data-search-form-container', 'hidden'), + Output('dict_data-hidden-tooltip', 'title'), + ], Input('dict_data-hidden', 'nClicks'), State('dict_data-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'dict_data-operation-button', 'index': 'edit'}, 'disabled'), Input('dict_data-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_dict_data_edit_button_status(table_rows_selected): """ @@ -166,9 +181,11 @@ def change_dict_data_edit_button_status(table_rows_selected): @app.callback( - Output({'type': 'dict_data-operation-button', 'index': 'delete'}, 'disabled'), + Output( + {'type': 'dict_data-operation-button', 'index': 'delete'}, 'disabled' + ), Input('dict_data-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_dict_data_delete_button_status(table_rows_selected): """ @@ -177,7 +194,6 @@ def change_dict_data_delete_button_status(table_rows_selected): outputs_list = dash.ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -187,36 +203,62 @@ def change_dict_data_delete_button_status(table_rows_selected): @app.callback( output=dict( - modal_visible=Output('dict_data-modal', 'visible', allow_duplicate=True), + modal_visible=Output( + 'dict_data-modal', 'visible', allow_duplicate=True + ), modal_title=Output('dict_data-modal', 'title'), - form_value=Output({'type': 'dict_data-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'dict_data-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'dict_data-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + form_value=Output( + {'type': 'dict_data-form-value', 'index': ALL}, 'value' + ), + form_label_validate_status=Output( + {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('dict_data-edit-id-store', 'data'), - modal_type=Output('dict_data-operations-store-bk', 'data') + modal_type=Output('dict_data-operations-store-bk', 'data'), ), inputs=dict( - operation_click=Input({'type': 'dict_data-operation-button', 'index': ALL}, 'nClicks'), - button_click=Input('dict_data-list-table', 'nClicksButton') + operation_click=Input( + {'type': 'dict_data-operation-button', 'index': ALL}, 'nClicks' + ), + button_click=Input('dict_data-list-table', 'nClicksButton'), ), state=dict( selected_row_keys=State('dict_data-list-table', 'selectedRowKeys'), clicked_content=State('dict_data-list-table', 'clickedContent'), - recently_button_clicked_row=State('dict_data-list-table', 'recentlyButtonClickedRow'), - dict_type_select=State('dict_data-dict_type-select', 'value') + recently_button_clicked_row=State( + 'dict_data-list-table', 'recentlyButtonClickedRow' + ), + dict_type_select=State('dict_data-dict_type-select', 'value'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_dict_data_modal(operation_click, button_click, selected_row_keys, clicked_content, - recently_button_clicked_row, dict_type_select): +def add_edit_dict_data_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, + dict_type_select, +): """ 显示新增或编辑字典数据弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'add', 'type': 'dict_data-operation-button'} \ - or trigger_id == {'index': 'edit', 'type': 'dict_data-operation-button'} \ - or (trigger_id == 'dict_data-list-table' and clicked_content == '修改'): + if ( + trigger_id == {'index': 'add', 'type': 'dict_data-operation-button'} + or trigger_id == {'index': 'edit', 'type': 'dict_data-operation-button'} + or (trigger_id == 'dict_data-list-table' and clicked_content == '修改') + ): # 获取所有输出表单项对应value的index form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] # 获取所有输出表单项对应label的index @@ -230,7 +272,7 @@ def add_edit_dict_data_modal(operation_click, button_click, selected_row_keys, c dict_sort=0, list_class='default', status='0', - remark=None + remark=None, ) return dict( modal_visible=True, @@ -240,14 +282,22 @@ def add_edit_dict_data_modal(operation_click, button_click, selected_row_keys, c form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger=dash.no_update, edit_row_info=None, - modal_type={'type': 'add'} + modal_type={'type': 'add'}, ) - elif trigger_id == {'index': 'edit', 'type': 'dict_data-operation-button'} or (trigger_id == 'dict_data-list-table' and clicked_content == '修改'): - if trigger_id == {'index': 'edit', 'type': 'dict_data-operation-button'}: + elif trigger_id == { + 'index': 'edit', + 'type': 'dict_data-operation-button', + } or ( + trigger_id == 'dict_data-list-table' and clicked_content == '修改' + ): + if trigger_id == { + 'index': 'edit', + 'type': 'dict_data-operation-button', + }: dict_code = int(','.join(selected_row_keys)) else: dict_code = int(recently_button_clicked_row['key']) - dict_data_info_res = get_dict_data_detail_api(dict_code=dict_code) + dict_data_info_res = DictDataApi.get_data(dict_code=dict_code) if dict_data_info_res['code'] == 200: dict_data_info = dict_data_info_res['data'] return dict( @@ -258,7 +308,7 @@ def add_edit_dict_data_modal(operation_click, button_click, selected_row_keys, c form_label_validate_info=[None] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=dict_data_info if dict_data_info else None, - modal_type={'type': 'edit'} + modal_type={'type': 'edit'}, ) return dict( @@ -269,7 +319,7 @@ def add_edit_dict_data_modal(operation_click, button_click, selected_row_keys, c form_label_validate_info=[dash.no_update] * len(form_label_list), api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None + modal_type=None, ) raise PreventUpdate @@ -277,64 +327,102 @@ def add_edit_dict_data_modal(operation_click, button_click, selected_row_keys, c @app.callback( output=dict( - form_label_validate_status=Output({'type': 'dict_data-form-label', 'index': ALL, 'required': True}, 'validateStatus', - allow_duplicate=True), - form_label_validate_info=Output({'type': 'dict_data-form-label', 'index': ALL, 'required': True}, 'help', - allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('dict_data-modal', 'visible'), - operations=Output('dict_data-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('dict_data-modal', 'okCounts') + operations=Output( + 'dict_data-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('dict_data-modal', 'okCounts')), state=dict( modal_type=State('dict_data-operations-store-bk', 'data'), edit_row_info=State('dict_data-edit-id-store', 'data'), - form_value=State({'type': 'dict_data-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'dict_data-form-label', 'index': ALL, 'required': True}, 'label') + form_value=State( + {'type': 'dict_data-form-value', 'index': ALL}, 'value' + ), + form_label=State( + {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, + 'label', + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def dict_data_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label): +def dict_data_confirm( + confirm_trigger, modal_type, edit_row_info, form_value, form_label +): """ 新增或编字典数据弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + } + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params_add = form_value_state params_edit = params_add.copy() - params_edit['dict_code'] = edit_row_info.get('dict_code') if edit_row_info else None + params_edit['dict_code'] = ( + edit_row_info.get('dict_code') if edit_row_info else None + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_dict_data_api(params_add) + api_res = DictDataApi.add_data(params_add) if modal_type == 'edit': - api_res = edit_dict_data_api(params_edit) + api_res = DictDataApi.update_data(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -343,42 +431,71 @@ def dict_data_confirm(confirm_trigger, modal_type, edit_row_info, form_value, fo modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('dict_data-delete-text', 'children'), - Output('dict_data-delete-confirm-modal', 'visible'), - Output('dict_data-delete-ids-store', 'data')], - [Input({'type': 'dict_data-operation-button', 'index': ALL}, 'nClicks'), - Input('dict_data-list-table', 'nClicksButton')], - [State('dict_data-list-table', 'selectedRowKeys'), - State('dict_data-list-table', 'clickedContent'), - State('dict_data-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + Output('dict_data-delete-text', 'children'), + Output('dict_data-delete-confirm-modal', 'visible'), + Output('dict_data-delete-ids-store', 'data'), + ], + [ + Input({'type': 'dict_data-operation-button', 'index': ALL}, 'nClicks'), + Input('dict_data-list-table', 'nClicksButton'), + ], + [ + State('dict_data-list-table', 'selectedRowKeys'), + State('dict_data-list-table', 'clickedContent'), + State('dict_data-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def dict_data_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): +def dict_data_delete_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示删除字典数据二次确认弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'delete', 'type': 'dict_data-operation-button'} or ( - trigger_id == 'dict_data-list-table' and clicked_content == '删除'): - - if trigger_id == {'index': 'delete', 'type': 'dict_data-operation-button'}: + if trigger_id == { + 'index': 'delete', + 'type': 'dict_data-operation-button', + } or (trigger_id == 'dict_data-list-table' and clicked_content == '删除'): + if trigger_id == { + 'index': 'delete', + 'type': 'dict_data-operation-button', + }: dict_codes = ','.join(selected_row_keys) else: if clicked_content == '删除': @@ -389,74 +506,82 @@ def dict_data_delete_modal(operation_click, button_click, return [ f'是否确认删除字典编码为{dict_codes}的数据?', True, - {'dict_codes': dict_codes} + dict_codes, ] raise PreventUpdate @app.callback( - [Output('dict_data-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('dict_data-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('dict_data-delete-confirm-modal', 'okCounts'), State('dict_data-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def dict_data_delete_confirm(delete_confirm, dict_codes_data): """ 删除字典数据弹窗确认回调,实现删除操作 """ if delete_confirm: - params = dict_codes_data - delete_button_info = delete_dict_data_api(params) + delete_button_info = DictDataApi.del_data(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('dict_data-export-container', 'data', allow_duplicate=True), - Output('dict_data-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('dict_data-export-container', 'data', allow_duplicate=True), + Output('dict_data-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('dict_data-export', 'nClicks'), State('dict_data-dict_type-select', 'value'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_dict_data_list(export_click, dict_type): """ 导出字典数据信息回调 """ if export_click: - export_dict_data_res = export_dict_data_list_api(dict(dict_type=dict_type)) + export_dict_data_res = DictDataApi.export_data( + dict(dict_type=dict_type) + ) if export_dict_data_res.status_code == 200: export_dict_data = export_dict_data_res.content return [ - dcc.send_bytes(export_dict_data, f'字典数据信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_dict_data, + f'字典数据信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -465,7 +590,7 @@ def export_dict_data_list(export_click, dict_type): @app.callback( Output('dict_data-export-container', 'data', allow_duplicate=True), Input('dict_data-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_dict_data_export_status(data): """ @@ -473,7 +598,6 @@ def reset_dict_data_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index ac8824a..2d67bf4 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -1,25 +1,26 @@ from dash import dcc, html import feffery_antd_components as fac -import callbacks.system_c.dict_c.dict_c +import callbacks.system_c.dict_c.dict_c # noqa: F401 from . import dict_data -from api.dict import get_dict_type_list_api +from api.system.dict.type import DictTypeApi +from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') dict_type_params = dict(page_num=1, page_size=10) - table_info = get_dict_type_list_api(dict_type_params) + table_info = DictTypeApi.list_type(dict_type_params) table_data = [] page_num = 1 page_size = 10 total = 0 if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') @@ -31,16 +32,12 @@ def render(*args, **kwargs): 'type': 'link', } item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:dict:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:dict:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dict:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dict:remove') + else {}, ] return [ @@ -79,10 +76,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='字典名称', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdInput( @@ -92,10 +91,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), label='字典类型', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -104,29 +105,33 @@ def render(*args, **kwargs): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '停用', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 240 - } + }, ), label='状态', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdDateRangePicker( id='dict_type-create_time-range', style={ 'width': 240 - } + }, ), label='创建时间', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -135,9 +140,11 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -145,16 +152,18 @@ def render(*args, **kwargs): id='dict_type-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='dict_type-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -173,14 +182,18 @@ def render(*args, **kwargs): ], id={ 'type': 'dict_type-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:dict:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:dict:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -190,15 +203,19 @@ def render(*args, **kwargs): ], id={ 'type': 'dict_type-operation-button', - 'index': 'edit' + 'index': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', - 'border-color': '#d0f5e0' - } - ) if 'system:dict:edit' in button_perms else [], + 'border-color': '#d0f5e0', + }, + ) + if PermissionManager.check_perms( + 'system:dict:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -208,15 +225,19 @@ def render(*args, **kwargs): ], id={ 'type': 'dict_type-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:dict:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:dict:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -228,9 +249,13 @@ def render(*args, **kwargs): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'system:dict:export' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'system:dict:export' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -242,15 +267,17 @@ def render(*args, **kwargs): style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:dict:edit' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:dict:remove' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -264,10 +291,10 @@ def render(*args, **kwargs): ), ], id='dict_type-hidden', - shape='circle' + shape='circle', ), id='dict_type-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -279,24 +306,22 @@ def render(*args, **kwargs): ), ], id='dict_type-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -354,7 +379,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -363,28 +388,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑字典类型表单modal fac.AntdModal( [ @@ -397,23 +426,21 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'dict_type-form-value', - 'index': 'dict_name' + 'index': 'dict_name', }, placeholder='请输入字典名称', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='字典名称', required=True, id={ 'type': 'dict_type-form-label', 'index': 'dict_name', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -424,23 +451,21 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'dict_type-form-value', - 'index': 'dict_type' + 'index': 'dict_type', }, placeholder='请输入字典类型', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='字典类型', required=True, id={ 'type': 'dict_type-form-label', 'index': 'dict_type', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -451,31 +476,23 @@ def render(*args, **kwargs): fac.AntdRadioGroup( id={ 'type': 'dict_type-form-value', - 'index': 'status' + 'index': 'status', }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '停用', 'value': '1'}, ], defaultValue='0', - style={ - 'width': 350 - } + style={'width': 350}, ), label='状态', id={ 'type': 'dict_type-form-label', 'index': 'status', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), @@ -486,42 +503,35 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'dict_type-form-value', - 'index': 'remark' + 'index': 'remark', }, placeholder='请输入内容', allowClear=True, mode='text-area', - style={ - 'width': 350 - } + style={'width': 350}, ), label='备注', id={ 'type': 'dict_type-form-label', 'index': 'remark', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), ], - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ) ], id='dict_type-modal', mask=False, width=580, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除字典类型二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='dict_type-delete-text'), @@ -529,9 +539,8 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), - # 字典数据modal fac.AntdModal( dict_data.render(button_perms), @@ -540,6 +549,6 @@ def render(*args, **kwargs): maskClosable=False, width=1000, renderFooter=False, - okClickClose=False - ) + okClickClose=False, + ), ] diff --git a/dash-fastapi-frontend/views/system/dict/dict_data.py b/dash-fastapi-frontend/views/system/dict/dict_data.py index 6352390..871d445 100644 --- a/dash-fastapi-frontend/views/system/dict/dict_data.py +++ b/dash-fastapi-frontend/views/system/dict/dict_data.py @@ -1,11 +1,11 @@ from dash import dcc, html import feffery_antd_components as fac -import callbacks.system_c.dict_c.dict_data_c +import callbacks.system_c.dict_c.dict_data_c # noqa: F401 +from utils.permission_util import PermissionManager def render(button_perms): - return [ dcc.Store(id='dict_data-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -31,10 +31,12 @@ def render(button_perms): allowClear=False, style={ 'width': 240 - } + }, ), label='字典名称', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdInput( @@ -44,10 +46,12 @@ def render(button_perms): allowClear=True, style={ 'width': 240 - } + }, ), label='字典标签', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -56,19 +60,21 @@ def render(button_perms): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '停用', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 240 - } + }, ), label='状态', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -77,9 +83,11 @@ def render(button_perms): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -87,16 +95,18 @@ def render(button_perms): id='dict_data-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='dict_data-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -115,14 +125,18 @@ def render(button_perms): ], id={ 'type': 'dict_data-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:dict:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:dict:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -132,15 +146,19 @@ def render(button_perms): ], id={ 'type': 'dict_data-operation-button', - 'index': 'edit' + 'index': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', - 'border-color': '#d0f5e0' - } - ) if 'system:dict:edit' in button_perms else [], + 'border-color': '#d0f5e0', + }, + ) + if PermissionManager.check_perms( + 'system:dict:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -150,15 +168,19 @@ def render(button_perms): ], id={ 'type': 'dict_data-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:dict:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:dict:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -170,15 +192,17 @@ def render(button_perms): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'system:dict:export' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'system:dict:export' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -192,10 +216,10 @@ def render(button_perms): ), ], id='dict_data-hidden', - shape='circle' + shape='circle', ), id='dict_data-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -207,24 +231,22 @@ def render(button_perms): ), ], id='dict_data-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -291,7 +313,7 @@ def render(button_perms): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -301,28 +323,32 @@ def render(button_perms): 'pageSize': 10, 'current': 1, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': 0 + 'total': 0, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑字典数据表单modal fac.AntdModal( [ @@ -335,22 +361,20 @@ def render(button_perms): fac.AntdInput( id={ 'type': 'dict_data-form-value', - 'index': 'dict_type' + 'index': 'dict_type', }, placeholder='请输入字典类型', disabled=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='字典类型', id={ 'type': 'dict_data-form-label', 'index': 'dict_type', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), @@ -361,23 +385,21 @@ def render(button_perms): fac.AntdInput( id={ 'type': 'dict_data-form-value', - 'index': 'dict_label' + 'index': 'dict_label', }, placeholder='请输入数据标签', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='数据标签', required=True, id={ 'type': 'dict_data-form-label', 'index': 'dict_label', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -388,23 +410,21 @@ def render(button_perms): fac.AntdInput( id={ 'type': 'dict_data-form-value', - 'index': 'dict_value' + 'index': 'dict_value', }, placeholder='请输入数据键值', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='数据键值', required=True, id={ 'type': 'dict_data-form-label', 'index': 'dict_value', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -415,22 +435,20 @@ def render(button_perms): fac.AntdInput( id={ 'type': 'dict_data-form-value', - 'index': 'css_class' + 'index': 'css_class', }, placeholder='请输入样式属性', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='样式属性', id={ 'type': 'dict_data-form-label', 'index': 'css_class', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), @@ -441,23 +459,21 @@ def render(button_perms): fac.AntdInputNumber( id={ 'type': 'dict_data-form-value', - 'index': 'dict_sort' + 'index': 'dict_sort', }, defaultValue=0, min=0, - style={ - 'width': 350 - } + style={'width': 350}, ), label='显示排序', required=True, id={ 'type': 'dict_data-form-label', 'index': 'dict_sort', - 'required': True - } + 'required': True, + }, ), - span=24 + span=24, ), ] ), @@ -468,47 +484,45 @@ def render(button_perms): fac.AntdSelect( id={ 'type': 'dict_data-form-value', - 'index': 'list_class' + 'index': 'list_class', }, placeholder='回显样式', options=[ { 'label': '默认', - 'value': 'default' + 'value': 'default', }, { 'label': '主要', - 'value': 'primary' + 'value': 'primary', }, { 'label': '成功', - 'value': 'success' + 'value': 'success', }, { 'label': '信息', - 'value': 'info' + 'value': 'info', }, { 'label': '警告', - 'value': 'warning' + 'value': 'warning', }, { 'label': '危险', - 'value': 'danger' - } + 'value': 'danger', + }, ], - style={ - 'width': 350 - } + style={'width': 350}, ), label='回显样式', id={ 'type': 'dict_data-form-label', 'index': 'list_class', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), @@ -519,31 +533,23 @@ def render(button_perms): fac.AntdRadioGroup( id={ 'type': 'dict_data-form-value', - 'index': 'status' + 'index': 'status', }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '停用', 'value': '1'}, ], defaultValue='0', - style={ - 'width': 350 - } + style={'width': 350}, ), label='状态', id={ 'type': 'dict_data-form-label', 'index': 'status', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), @@ -554,33 +560,27 @@ def render(button_perms): fac.AntdInput( id={ 'type': 'dict_data-form-value', - 'index': 'remark' + 'index': 'remark', }, placeholder='请输入内容', allowClear=True, mode='text-area', - style={ - 'width': 350 - } + style={'width': 350}, ), label='备注', id={ 'type': 'dict_data-form-label', 'index': 'remark', - 'required': False - } + 'required': False, + }, ), - span=24 + span=24, ), ] ), ], - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ) ], id='dict_data-modal', @@ -588,15 +588,14 @@ def render(button_perms): maskClosable=False, width=580, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除字典数据二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='dict_data-delete-text'), id='dict_data-delete-confirm-modal', visible=False, title='提示', - renderFooter=True + renderFooter=True, ), ] -- Gitee From 22f528abb15e6f5b69d3a54d39f4328c9ca08f85 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 3 Sep 2024 22:13:58 +0800 Subject: [PATCH 023/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu_c/components_c/button_type_c.py | 110 ++++-- .../menu_c/components_c/content_type_c.py | 133 +++++-- .../menu_c/components_c/menu_type_c.py | 163 +++++--- .../callbacks/system_c/menu_c/menu_c.py | 347 ++++++++++-------- dash-fastapi-frontend/utils/tree_tool.py | 82 ++++- .../views/system/menu/__init__.py | 204 ++++------ 6 files changed, 659 insertions(+), 380 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py index a39764c..77022f7 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py @@ -6,23 +6,41 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.menu import add_menu_api, edit_menu_api +from api.system.menu import MenuApi @app.callback( output=dict( form_validate=[ - Output('menu-parent_id-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-menu_name-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-order_num-form-item', 'validateStatus', allow_duplicate=True), + Output( + 'menu-parent_id-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-menu_name-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-order_num-form-item', + 'validateStatus', + allow_duplicate=True, + ), Output('menu-parent_id-form-item', 'help', allow_duplicate=True), Output('menu-menu_name-form-item', 'help', allow_duplicate=True), - Output('menu-order_num-form-item', 'help', allow_duplicate=True) + Output('menu-order_num-form-item', 'help', allow_duplicate=True), ], modal_visible=Output('menu-modal', 'visible', allow_duplicate=True), - operations=Output('menu-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) + operations=Output( + 'menu-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), inputs=dict( confirm_trigger=Input('menu-modal-F-trigger', 'data'), @@ -35,25 +53,52 @@ from api.menu import add_menu_api, edit_menu_api icon=State('menu-icon', 'value'), menu_name=State('menu-menu_name', 'value'), order_num=State('menu-order_num', 'value'), - perms=State('button-menu-perms', 'value') + perms=State('button-menu-perms', 'value'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def menu_confirm_button(confirm_trigger, modal_type, edit_row_info, parent_id, menu_type, icon, menu_name, order_num, perms): +def menu_confirm_button( + confirm_trigger, + modal_type, + edit_row_info, + parent_id, + menu_type, + icon, + menu_name, + order_num, + perms, +): """ 菜单类型为按钮时新增或编辑弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - if all(validate_data_not_empty(item) for item in [parent_id, menu_name, order_num]): - params_add = dict(parent_id=parent_id, menu_type=menu_type, icon=icon, menu_name=menu_name, order_num=order_num, perms=perms) - params_edit = dict(menu_id=edit_row_info.get('menu_id') if edit_row_info else None, parent_id=parent_id, menu_type=menu_type, icon=icon, - menu_name=menu_name, order_num=order_num, perms=perms) + if all( + validate_data_not_empty(item) + for item in [parent_id, menu_name, order_num] + ): + params_add = dict( + parent_id=parent_id, + menu_type=menu_type, + icon=icon, + menu_name=menu_name, + order_num=order_num, + perms=perms, + ) + params_edit = dict( + menu_id=edit_row_info.get('menu_id') if edit_row_info else None, + parent_id=parent_id, + menu_type=menu_type, + icon=icon, + menu_name=menu_name, + order_num=order_num, + perms=perms, + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_menu_api(params_add) + api_res = MenuApi.add_menu(params_add) if modal_type == 'edit': - api_res = edit_menu_api(params_edit) + api_res = MenuApi.update_menu(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( @@ -61,7 +106,9 @@ def menu_confirm_button(confirm_trigger, modal_type, edit_row_info, parent_id, m modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( @@ -69,7 +116,9 @@ def menu_confirm_button(confirm_trigger, modal_type, edit_row_info, parent_id, m modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -77,7 +126,9 @@ def menu_confirm_button(confirm_trigger, modal_type, edit_row_info, parent_id, m modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( @@ -85,22 +136,29 @@ def menu_confirm_button(confirm_trigger, modal_type, edit_row_info, parent_id, m None if validate_data_not_empty(parent_id) else 'error', None if validate_data_not_empty(menu_name) else 'error', None if validate_data_not_empty(order_num) else 'error', - None if validate_data_not_empty(parent_id) else '请选择上级菜单!', - None if validate_data_not_empty(menu_name) else '请输入菜单名称!', - None if validate_data_not_empty(order_num) else '请输入显示排序!' + None + if validate_data_not_empty(parent_id) + else '请选择上级菜单!', + None + if validate_data_not_empty(menu_name) + else '请输入菜单名称!', + None + if validate_data_not_empty(order_num) + else '请输入显示排序!', ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - Output('button-menu-perms', 'value'), - Input('menu-edit-id-store', 'data') + Output('button-menu-perms', 'value'), Input('menu-edit-id-store', 'data') ) def set_edit_info(edit_info): """ diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py index c1404ae..10e28ae 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py @@ -6,15 +6,27 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.menu import add_menu_api, edit_menu_api +from api.system.menu import MenuApi @app.callback( output=dict( form_validate=[ - Output('menu-parent_id-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-menu_name-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-order_num-form-item', 'validateStatus', allow_duplicate=True), + Output( + 'menu-parent_id-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-menu_name-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-order_num-form-item', + 'validateStatus', + allow_duplicate=True, + ), Output('content-menu-path-form-item', 'validateStatus'), Output('menu-parent_id-form-item', 'help', allow_duplicate=True), Output('menu-menu_name-form-item', 'help', allow_duplicate=True), @@ -22,13 +34,17 @@ from api.menu import add_menu_api, edit_menu_api Output('content-menu-path-form-item', 'help'), ], modal_visible=Output('menu-modal', 'visible', allow_duplicate=True), - operations=Output('menu-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('menu-modal-M-trigger', 'data') + operations=Output( + 'menu-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('menu-modal-M-trigger', 'data')), state=dict( modal_type=State('menu-operations-store-bk', 'data'), edit_row_info=State('menu-edit-id-store', 'data'), @@ -40,26 +56,61 @@ from api.menu import add_menu_api, edit_menu_api is_frame=State('content-menu-is_frame', 'value'), path=State('content-menu-path', 'value'), visible=State('content-menu-visible', 'value'), - status=State('content-menu-status', 'value') + status=State('content-menu-status', 'value'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def menu_confirm_content(confirm_trigger, modal_type, edit_row_info, parent_id, menu_type, icon, menu_name, order_num, is_frame, path, visible, status): +def menu_confirm_content( + confirm_trigger, + modal_type, + edit_row_info, + parent_id, + menu_type, + icon, + menu_name, + order_num, + is_frame, + path, + visible, + status, +): """ 菜单类型为目录时新增或编辑弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - if all(validate_data_not_empty(item) for item in [parent_id, menu_name, order_num, path]): - params_add = dict(parent_id=parent_id, menu_type=menu_type, icon=icon, menu_name=menu_name, order_num=order_num, - is_frame=is_frame, path=path, visible=visible, status=status) - params_edit = dict(menu_id=edit_row_info.get('menu_id') if edit_row_info else None, parent_id=parent_id, menu_type=menu_type, icon=icon, - menu_name=menu_name, order_num=order_num, is_frame=is_frame, path=path, visible=visible, status=status) + if all( + validate_data_not_empty(item) + for item in [parent_id, menu_name, order_num, path] + ): + params_add = dict( + parent_id=parent_id, + menu_type=menu_type, + icon=icon, + menu_name=menu_name, + order_num=order_num, + is_frame=is_frame, + path=path, + visible=visible, + status=status, + ) + params_edit = dict( + menu_id=edit_row_info.get('menu_id') if edit_row_info else None, + parent_id=parent_id, + menu_type=menu_type, + icon=icon, + menu_name=menu_name, + order_num=order_num, + is_frame=is_frame, + path=path, + visible=visible, + status=status, + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_menu_api(params_add) + api_res = MenuApi.add_menu(params_add) if modal_type == 'edit': - api_res = edit_menu_api(params_edit) + api_res = MenuApi.update_menu(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( @@ -67,7 +118,9 @@ def menu_confirm_content(confirm_trigger, modal_type, edit_row_info, parent_id, modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( @@ -75,7 +128,9 @@ def menu_confirm_content(confirm_trigger, modal_type, edit_row_info, parent_id, modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -83,7 +138,9 @@ def menu_confirm_content(confirm_trigger, modal_type, edit_row_info, parent_id, modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( @@ -92,26 +149,36 @@ def menu_confirm_content(confirm_trigger, modal_type, edit_row_info, parent_id, None if validate_data_not_empty(menu_name) else 'error', None if validate_data_not_empty(order_num) else 'error', None if validate_data_not_empty(path) else 'error', - None if validate_data_not_empty(parent_id) else '请选择上级菜单!', - None if validate_data_not_empty(menu_name) else '请输入菜单名称!', - None if validate_data_not_empty(order_num) else '请输入显示排序!', + None + if validate_data_not_empty(parent_id) + else '请选择上级菜单!', + None + if validate_data_not_empty(menu_name) + else '请输入菜单名称!', + None + if validate_data_not_empty(order_num) + else '请输入显示排序!', None if validate_data_not_empty(path) else '请输入路由地址!', ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('content-menu-is_frame', 'value'), - Output('content-menu-path', 'value'), - Output('content-menu-visible', 'value'), - Output('content-menu-status', 'value')], - Input('menu-edit-id-store', 'data') + [ + Output('content-menu-is_frame', 'value'), + Output('content-menu-path', 'value'), + Output('content-menu-visible', 'value'), + Output('content-menu-status', 'value'), + ], + Input('menu-edit-id-store', 'data'), ) def set_edit_info(edit_info): """ @@ -122,7 +189,7 @@ def set_edit_info(edit_info): edit_info.get('is_frame'), edit_info.get('path'), edit_info.get('visible'), - edit_info.get('status') + edit_info.get('status'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py index 2fcb149..e5c51e2 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py @@ -6,29 +6,49 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.menu import add_menu_api, edit_menu_api +from api.system.menu import MenuApi @app.callback( output=dict( form_validate=[ - Output('menu-parent_id-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-menu_name-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-order_num-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-menu-path-form-item', 'validateStatus', allow_duplicate=True), + Output( + 'menu-parent_id-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-menu_name-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-order_num-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-menu-path-form-item', + 'validateStatus', + allow_duplicate=True, + ), Output('menu-parent_id-form-item', 'help', allow_duplicate=True), Output('menu-menu_name-form-item', 'help', allow_duplicate=True), Output('menu-order_num-form-item', 'help', allow_duplicate=True), Output('menu-menu-path-form-item', 'help', allow_duplicate=True), ], modal_visible=Output('menu-modal', 'visible', allow_duplicate=True), - operations=Output('menu-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('menu-modal-C-trigger', 'data') + operations=Output( + 'menu-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('menu-modal-C-trigger', 'data')), state=dict( modal_type=State('menu-operations-store-bk', 'data'), edit_row_info=State('menu-edit-id-store', 'data'), @@ -44,28 +64,73 @@ from api.menu import add_menu_api, edit_menu_api query=State('menu-menu-query', 'value'), is_cache=State('menu-menu-is_cache', 'value'), visible=State('menu-menu-visible', 'value'), - status=State('menu-menu-status', 'value') + status=State('menu-menu-status', 'value'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def menu_confirm_menu(confirm_trigger, modal_type, edit_row_info, parent_id, menu_type, icon, menu_name, order_num, is_frame, path, - component, perms, query, is_cache, visible, status): +def menu_confirm_menu( + confirm_trigger, + modal_type, + edit_row_info, + parent_id, + menu_type, + icon, + menu_name, + order_num, + is_frame, + path, + component, + perms, + query, + is_cache, + visible, + status, +): """ 菜单类型为菜单时新增或编辑弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - if all(validate_data_not_empty(item) for item in [parent_id, menu_name, order_num, path]): - params_add = dict(parent_id=parent_id, menu_type=menu_type, icon=icon, menu_name=menu_name, order_num=order_num, is_frame=is_frame, - path=path, component=component, perms=perms, query=query, is_cache=is_cache, visible=visible, status=status) - params_edit = dict(menu_id=edit_row_info.get('menu_id') if edit_row_info else None, parent_id=parent_id, menu_type=menu_type, icon=icon, - menu_name=menu_name, order_num=order_num, is_frame=is_frame, path=path, component=component, - perms=perms, query=query, is_cache=is_cache, visible=visible, status=status) + if all( + validate_data_not_empty(item) + for item in [parent_id, menu_name, order_num, path] + ): + params_add = dict( + parent_id=parent_id, + menu_type=menu_type, + icon=icon, + menu_name=menu_name, + order_num=order_num, + is_frame=is_frame, + path=path, + component=component, + perms=perms, + query=query, + is_cache=is_cache, + visible=visible, + status=status, + ) + params_edit = dict( + menu_id=edit_row_info.get('menu_id') if edit_row_info else None, + parent_id=parent_id, + menu_type=menu_type, + icon=icon, + menu_name=menu_name, + order_num=order_num, + is_frame=is_frame, + path=path, + component=component, + perms=perms, + query=query, + is_cache=is_cache, + visible=visible, + status=status, + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_menu_api(params_add) + api_res = MenuApi.add_menu(params_add) if modal_type == 'edit': - api_res = edit_menu_api(params_edit) + api_res = MenuApi.update_menu(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( @@ -73,7 +138,9 @@ def menu_confirm_menu(confirm_trigger, modal_type, edit_row_info, parent_id, men modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( @@ -81,7 +148,9 @@ def menu_confirm_menu(confirm_trigger, modal_type, edit_row_info, parent_id, men modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -89,7 +158,9 @@ def menu_confirm_menu(confirm_trigger, modal_type, edit_row_info, parent_id, men modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( @@ -98,30 +169,40 @@ def menu_confirm_menu(confirm_trigger, modal_type, edit_row_info, parent_id, men None if validate_data_not_empty(menu_name) else 'error', None if validate_data_not_empty(order_num) else 'error', None if validate_data_not_empty(path) else 'error', - None if validate_data_not_empty(parent_id) else '请选择上级菜单!', - None if validate_data_not_empty(menu_name) else '请输入菜单名称!', - None if validate_data_not_empty(order_num) else '请输入显示排序!', - None if validate_data_not_empty(path) else '请输入路由地址!' + None + if validate_data_not_empty(parent_id) + else '请选择上级菜单!', + None + if validate_data_not_empty(menu_name) + else '请输入菜单名称!', + None + if validate_data_not_empty(order_num) + else '请输入显示排序!', + None if validate_data_not_empty(path) else '请输入路由地址!', ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('menu-menu-is_frame', 'value'), - Output('menu-menu-path', 'value'), - Output('menu-menu-component', 'value'), - Output('menu-menu-perms', 'value'), - Output('menu-menu-query', 'value'), - Output('menu-menu-is_cache', 'value'), - Output('menu-menu-visible', 'value'), - Output('menu-menu-status', 'value')], - Input('menu-edit-id-store', 'data') + [ + Output('menu-menu-is_frame', 'value'), + Output('menu-menu-path', 'value'), + Output('menu-menu-component', 'value'), + Output('menu-menu-perms', 'value'), + Output('menu-menu-query', 'value'), + Output('menu-menu-is_cache', 'value'), + Output('menu-menu-visible', 'value'), + Output('menu-menu-status', 'value'), + ], + Input('menu-edit-id-store', 'data'), ) def set_edit_info(edit_info): """ @@ -136,7 +217,7 @@ def set_edit_info(edit_info): edit_info.get('query'), edit_info.get('is_cache'), edit_info.get('visible'), - edit_info.get('status') + edit_info.get('status'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index 36efee9..84de057 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -7,47 +7,58 @@ import feffery_antd_components as fac import feffery_utils_components as fuc from server import app -from utils.tree_tool import list_to_tree +from api.system.menu import MenuApi +from utils.permission_util import PermissionManager +from utils.tree_tool import list_to_tree, list_to_tree_select from views.system.menu.components import content_type, menu_type, button_type -from api.menu import get_menu_tree_api, get_menu_tree_for_edit_option_api, get_menu_list_api, delete_menu_api, get_menu_detail_api @app.callback( output=dict( menu_table_data=Output('menu-list-table', 'data', allow_duplicate=True), menu_table_key=Output('menu-list-table', 'key'), - menu_table_defaultexpandedrowkeys=Output('menu-list-table', 'defaultExpandedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - fold_click=Output('menu-fold', 'nClicks') + menu_table_defaultexpandedrowkeys=Output( + 'menu-list-table', 'defaultExpandedRowKeys' + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + fold_click=Output('menu-fold', 'nClicks'), ), inputs=dict( search_click=Input('menu-search', 'nClicks'), refresh_click=Input('menu-refresh', 'nClicks'), operations=Input('menu-operations-store', 'data'), - fold_click=Input('menu-fold', 'nClicks') + fold_click=Input('menu-fold', 'nClicks'), ), state=dict( menu_name=State('menu-menu_name-input', 'value'), status_select=State('menu-status-select', 'value'), - in_default_expanded_row_keys=State('menu-list-table', 'defaultExpandedRowKeys'), - button_perms=State('menu-button-perms-container', 'data') + in_default_expanded_row_keys=State( + 'menu-list-table', 'defaultExpandedRowKeys' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_menu_table_data(search_click, refresh_click, operations, fold_click, menu_name, status_select, in_default_expanded_row_keys, button_perms): +def get_menu_table_data( + search_click, + refresh_click, + operations, + fold_click, + menu_name, + status_select, + in_default_expanded_row_keys, +): """ 获取菜单表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - query_params = dict( - menu_name=menu_name, - status=status_select - ) + query_params = dict(menu_name=menu_name, status=status_select) if search_click or refresh_click or operations or fold_click: - table_info = get_menu_list_api(query_params) + table_info = MenuApi.list_menu(query_params) default_expanded_row_keys = [] if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['data'] for item in table_data: default_expanded_row_keys.append(str(item['menu_id'])) item['key'] = str(item['menu_id']) @@ -56,41 +67,37 @@ def get_menu_table_data(search_click, refresh_click, operations, fold_click, men 'type': 'link', 'icon': item['icon'], 'disabled': True, - 'style': { - 'color': 'rgba(0, 0, 0, 0.8)' - } + 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, }, ] if item['status'] == '1': item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:menu:edit' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, { 'content': '删除', 'type': 'link', - 'icon': 'antd-delete' - } if 'system:menu:remove' in button_perms else {}, + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:menu:remove') + else {}, ] else: item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:menu:edit' in button_perms else {}, - { - 'content': '新增', - 'type': 'link', - 'icon': 'antd-plus' - } if 'system:menu:add' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:menu:add') + else {}, { 'content': '删除', 'type': 'link', - 'icon': 'antd-delete' - } if 'system:menu:remove' in button_perms else {}, + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:menu:remove') + else {}, ] if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') @@ -105,7 +112,7 @@ def get_menu_table_data(search_click, refresh_click, operations, fold_click, men menu_table_key=str(uuid.uuid4()), menu_table_defaultexpandedrowkeys=default_expanded_row_keys, api_check_token_trigger={'timestamp': time.time()}, - fold_click=None + fold_click=None, ) return dict( @@ -113,7 +120,7 @@ def get_menu_table_data(search_click, refresh_click, operations, fold_click, men menu_table_key=str(uuid.uuid4()), menu_table_defaultexpandedrowkeys=[], api_check_token_trigger={'timestamp': time.time()}, - fold_click=None + fold_click=None, ) return dict( @@ -121,7 +128,7 @@ def get_menu_table_data(search_click, refresh_click, operations, fold_click, men menu_table_key=dash.no_update, menu_table_defaultexpandedrowkeys=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - fold_click=None + fold_click=None, ) return dict( @@ -129,31 +136,33 @@ def get_menu_table_data(search_click, refresh_click, operations, fold_click, men menu_table_key=dash.no_update, menu_table_defaultexpandedrowkeys=dash.no_update, api_check_token_trigger=dash.no_update, - fold_click=None + fold_click=None, ) # 重置菜单搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('menu-menu_name-input', 'value'), - Output('menu-status-select', 'value'), - Output('menu-operations-store', 'data')], + """, + [ + Output('menu-menu_name-input', 'value'), + Output('menu-status-select', 'value'), + Output('menu-operations-store', 'data'), + ], Input('menu-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示菜单搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -163,154 +172,210 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('menu-search-form-container', 'hidden'), - Output('menu-hidden-tooltip', 'title')], + """, + [ + Output('menu-search-form-container', 'hidden'), + Output('menu-hidden-tooltip', 'title'), + ], Input('menu-hidden', 'nClicks'), State('menu-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( - [Output('menu-icon', 'value'), - Output('menu-icon', 'prefix')], + [Output('menu-icon', 'value'), Output('menu-icon', 'prefix')], Input('icon-category', 'value'), - prevent_initial_call=True + prevent_initial_call=True, ) def get_select_icon(icon): """ 获取新增或编辑表单中选择的icon回调 """ if icon: - return [ - icon, - fac.AntdIcon(icon=icon) - ] + return [icon, fac.AntdIcon(icon=icon)] raise PreventUpdate @app.callback( output=dict( - modal=dict(visible=Output('menu-modal', 'visible', allow_duplicate=True), title=Output('menu-modal', 'title')), + modal=dict( + visible=Output('menu-modal', 'visible', allow_duplicate=True), + title=Output('menu-modal', 'title'), + ), form_value=dict( - parent_tree=Output('menu-parent_id', 'treeData'), parent_id=Output('menu-parent_id', 'value'), - menu_type=Output('menu-menu_type', 'value'), icon=Output('menu-icon', 'value', allow_duplicate=True), - icon_prefix=Output('menu-icon', 'prefix', allow_duplicate=True), icon_category=Output('icon-category', 'value'), - menu_name=Output('menu-menu_name', 'value'), order_num=Output('menu-order_num', 'value') + parent_tree=Output('menu-parent_id', 'treeData'), + parent_id=Output('menu-parent_id', 'value'), + menu_type=Output('menu-menu_type', 'value'), + icon=Output('menu-icon', 'value', allow_duplicate=True), + icon_prefix=Output('menu-icon', 'prefix', allow_duplicate=True), + icon_category=Output('icon-category', 'value'), + menu_name=Output('menu-menu_name', 'value'), + order_num=Output('menu-order_num', 'value'), ), form_validate=[ - Output('menu-parent_id-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-menu_name-form-item', 'validateStatus', allow_duplicate=True), - Output('menu-order_num-form-item', 'validateStatus', allow_duplicate=True), + Output( + 'menu-parent_id-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-menu_name-form-item', + 'validateStatus', + allow_duplicate=True, + ), + Output( + 'menu-order_num-form-item', + 'validateStatus', + allow_duplicate=True, + ), Output('menu-parent_id-form-item', 'help', allow_duplicate=True), Output('menu-menu_name-form-item', 'help', allow_duplicate=True), - Output('menu-order_num-form-item', 'help', allow_duplicate=True) + Output('menu-order_num-form-item', 'help', allow_duplicate=True), ], other=dict( - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('menu-edit-id-store', 'data'), - modal_type=Output('menu-operations-store-bk', 'data') - ) + modal_type=Output('menu-operations-store-bk', 'data'), + ), ), inputs=dict( - operation_click=Input({'type': 'menu-operation-button', 'index': ALL}, 'nClicks'), - button_click=Input('menu-list-table', 'nClicksButton') + operation_click=Input( + {'type': 'menu-operation-button', 'index': ALL}, 'nClicks' + ), + button_click=Input('menu-list-table', 'nClicksButton'), ), state=dict( clicked_content=State('menu-list-table', 'clickedContent'), - recently_button_clicked_row=State('menu-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'menu-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_menu_modal(operation_click, button_click, clicked_content, recently_button_clicked_row): +def add_edit_menu_modal( + operation_click, button_click, clicked_content, recently_button_clicked_row +): """ 显示新增或编辑菜单弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'add', 'type': 'menu-operation-button'} or (trigger_id == 'menu-list-table' and clicked_content != '删除'): + if trigger_id == {'index': 'add', 'type': 'menu-operation-button'} or ( + trigger_id == 'menu-list-table' and clicked_content != '删除' + ): menu_params = dict(menu_name='') - if clicked_content == '修改': - tree_info = get_menu_tree_for_edit_option_api(menu_params) - else: - tree_info = get_menu_tree_api(menu_params) + tree_info = MenuApi.list_menu(menu_params) if tree_info['code'] == 200: - tree_data = tree_info['data'] + tree_data = [dict(title='主类目', value='0', key='0', children=[])] + tree_data[0]['children'] = list_to_tree_select( + tree_info['data'], + 'menu_name', + 'menu_id', + 'menu_id', + 'parent_id', + ) if trigger_id == {'index': 'add', 'type': 'menu-operation-button'}: return dict( modal=dict(visible=True, title='新增菜单'), form_value=dict( - parent_tree=tree_data, parent_id='0', menu_type='M', icon=None, - icon_prefix=None, icon_category=None, menu_name=None, order_num=None + parent_tree=tree_data, + parent_id='0', + menu_type='M', + icon=None, + icon_prefix=None, + icon_category=None, + menu_name=None, + order_num=None, ), form_validate=[None] * 6, other=dict( api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type={'type': 'add'} - ) + modal_type={'type': 'add'}, + ), ) elif trigger_id == 'menu-list-table' and clicked_content == '新增': return dict( modal=dict(visible=True, title='新增菜单'), form_value=dict( - parent_tree=tree_data, parent_id=str(recently_button_clicked_row['key']), menu_type='M', - icon=None, icon_prefix=None, icon_category=None, menu_name=None, order_num=None + parent_tree=tree_data, + parent_id=str(recently_button_clicked_row['key']), + menu_type='M', + icon=None, + icon_prefix=None, + icon_category=None, + menu_name=None, + order_num=None, ), form_validate=[None] * 6, other=dict( api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type={'type': 'add'} - ) + modal_type={'type': 'add'}, + ), ) elif trigger_id == 'menu-list-table' and clicked_content == '修改': menu_id = int(recently_button_clicked_row['key']) - menu_info_res = get_menu_detail_api(menu_id=menu_id) + menu_info_res = MenuApi.get_menu(menu_id=menu_id) if menu_info_res['code'] == 200: menu_info = menu_info_res['data'] return dict( modal=dict(visible=True, title='编辑菜单'), form_value=dict( - parent_tree=tree_data, parent_id=str(menu_info.get('parent_id')), - menu_type=menu_info.get('menu_type'), icon=menu_info.get('icon'), - icon_prefix=fac.AntdIcon(icon=menu_info.get('icon')), icon_category=menu_info.get('icon'), - menu_name=menu_info.get('menu_name'), order_num=menu_info.get('order_num') + parent_tree=tree_data, + parent_id=str(menu_info.get('parent_id')), + menu_type=menu_info.get('menu_type'), + icon=menu_info.get('icon'), + icon_prefix=fac.AntdIcon( + icon=menu_info.get('icon') + ), + icon_category=menu_info.get('icon'), + menu_name=menu_info.get('menu_name'), + order_num=menu_info.get('order_num'), ), form_validate=[None] * 6, other=dict( api_check_token_trigger={'timestamp': time.time()}, edit_row_info=menu_info, - modal_type={'type': 'edit'} - ) + modal_type={'type': 'edit'}, + ), ) return dict( modal=dict(visible=dash.no_update, title=dash.no_update), form_value=dict( - parent_tree=dash.no_update, parent_id=dash.no_update, menu_type=dash.no_update, - icon=dash.no_update, icon_prefix=dash.no_update, icon_category=dash.no_update, - menu_name=dash.no_update, order_num=dash.no_update + parent_tree=dash.no_update, + parent_id=dash.no_update, + menu_type=dash.no_update, + icon=dash.no_update, + icon_prefix=dash.no_update, + icon_category=dash.no_update, + menu_name=dash.no_update, + order_num=dash.no_update, ), form_validate=[dash.no_update] * 6, other=dict( api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None - ) + modal_type=None, + ), ) raise PreventUpdate @app.callback( - [Output('content-by-menu-type', 'children'), - Output('content-by-menu-type', 'key'), - Output('menu-modal-menu-type-store', 'data')], + [ + Output('content-by-menu-type', 'children'), + Output('content-by-menu-type', 'key'), + Output('menu-modal-menu-type-store', 'data'), + ], Input('menu-menu_type', 'value'), - prevent_initial_call=True + prevent_initial_call=True, ) def get_bottom_content(menu_value): """ @@ -329,9 +394,11 @@ def get_bottom_content(menu_value): @app.callback( - [Output('menu-modal-M-trigger', 'data'), - Output('menu-modal-C-trigger', 'data'), - Output('menu-modal-F-trigger', 'data')], + [ + Output('menu-modal-M-trigger', 'data'), + Output('menu-modal-C-trigger', 'data'), + Output('menu-modal-F-trigger', 'data'), + ], Input('menu-modal', 'okCounts'), State('menu-modal-menu-type-store', 'data'), ) @@ -341,43 +408,36 @@ def modal_confirm_trigger(confirm, menu_type): """ if confirm: if menu_type.get('type') == 'M': - return [ - {'timestamp': time.time()}, - dash.no_update, - dash.no_update - ] + return [{'timestamp': time.time()}, dash.no_update, dash.no_update] if menu_type.get('type') == 'C': - return [ - dash.no_update, - {'timestamp': time.time()}, - dash.no_update - ] - + return [dash.no_update, {'timestamp': time.time()}, dash.no_update] + if menu_type.get('type') == 'F': - return [ - dash.no_update, - dash.no_update, - {'timestamp': time.time()} - ] + return [dash.no_update, dash.no_update, {'timestamp': time.time()}] raise PreventUpdate @app.callback( - [Output('menu-delete-text', 'children'), - Output('menu-delete-confirm-modal', 'visible'), - Output('menu-delete-ids-store', 'data')], + [ + Output('menu-delete-text', 'children'), + Output('menu-delete-confirm-modal', 'visible'), + Output('menu-delete-ids-store', 'data'), + ], [Input('menu-list-table', 'nClicksButton')], - [State('menu-list-table', 'clickedContent'), - State('menu-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + State('menu-list-table', 'clickedContent'), + State('menu-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def menu_delete_modal(button_click, clicked_content, recently_button_clicked_row): +def menu_delete_modal( + button_click, clicked_content, recently_button_clicked_row +): """ 显示删除菜单二次确认弹窗回调 """ if button_click: - if clicked_content == '删除': menu_ids = recently_button_clicked_row['key'] else: @@ -386,39 +446,40 @@ def menu_delete_modal(button_click, clicked_content, recently_button_clicked_row return [ f'是否确认删除菜单编号为{menu_ids}的菜单?', True, - {'menu_ids': menu_ids} + menu_ids, ] raise PreventUpdate @app.callback( - [Output('menu-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('menu-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('menu-delete-confirm-modal', 'okCounts'), State('menu-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def menu_delete_confirm(delete_confirm, menu_ids_data): """ 删除菜单弹窗确认回调,实现删除操作 """ if delete_confirm: - params = menu_ids_data - delete_button_info = delete_menu_api(params) + delete_button_info = MenuApi.del_menu(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/utils/tree_tool.py b/dash-fastapi-frontend/utils/tree_tool.py index 7ebd634..1917e0e 100644 --- a/dash-fastapi-frontend/utils/tree_tool.py +++ b/dash-fastapi-frontend/utils/tree_tool.py @@ -20,11 +20,11 @@ def find_node_values(data, key): def find_key_by_href(data, href): """ - 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 - :param data: 待查找的树形list - :param href: 目标pathname - :return: 目标值对应的key - """ + 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 + :param data: 待查找的树形list + :param href: 目标pathname + :return: 目标值对应的key + """ for item in data: if 'children' in item: result = find_key_by_href(item['children'], href) @@ -128,7 +128,9 @@ def deal_user_menu_info(pid: int, permission_list: list): menu_list = [] for permission in permission_list: if permission['parent_id'] == pid: - children = deal_user_menu_info(permission['menu_id'], permission_list) + children = deal_user_menu_info( + permission['menu_id'], permission_list + ) antd_menu_list_data = {} if children and permission['menu_type'] == 'M': antd_menu_list_data['component'] = 'SubMenu' @@ -136,7 +138,7 @@ def deal_user_menu_info(pid: int, permission_list: list): 'key': str(permission['menu_id']), 'title': permission['menu_name'], 'icon': permission['icon'], - 'modules': permission['component'] + 'modules': permission['component'], } antd_menu_list_data['children'] = children elif permission['menu_type'] == 'C': @@ -146,7 +148,7 @@ def deal_user_menu_info(pid: int, permission_list: list): 'title': permission['menu_name'], 'icon': permission['icon'], 'href': permission['path'], - 'modules': permission['component'] + 'modules': permission['component'], } antd_menu_list_data['button'] = children elif permission['menu_type'] == 'F': @@ -154,7 +156,7 @@ def deal_user_menu_info(pid: int, permission_list: list): antd_menu_list_data['props'] = { 'key': str(permission['menu_id']), 'title': permission['menu_name'], - 'icon': permission['icon'] + 'icon': permission['icon'], } elif permission['is_frame'] == 0: antd_menu_list_data['component'] = 'Item' @@ -164,7 +166,7 @@ def deal_user_menu_info(pid: int, permission_list: list): 'icon': permission['icon'], 'href': permission['path'], 'target': '_blank', - 'modules': 'link' + 'modules': 'link', } else: antd_menu_list_data['component'] = 'Item' @@ -173,7 +175,7 @@ def deal_user_menu_info(pid: int, permission_list: list): 'title': permission['menu_name'], 'icon': permission['icon'], 'href': permission['path'], - 'modules': permission['component'] + 'modules': permission['component'], } menu_list.append(antd_menu_list_data) @@ -206,7 +208,9 @@ def get_dept_tree(pid: int, permission_list: list): return dept_list -def list_to_tree(permission_list: list, sub_id_str: str, parent_id_str: str) -> list: +def list_to_tree( + permission_list: list, sub_id_str: str, parent_id_str: str +) -> list: """ 工具方法:根据列表信息生成树形嵌套数据 :param permission_list: 列表信息 @@ -215,7 +219,9 @@ def list_to_tree(permission_list: list, sub_id_str: str, parent_id_str: str) -> :return: 树形嵌套数据 """ # 转成id为key的字典 - mapping: dict = dict(zip([i[sub_id_str] for i in permission_list], permission_list)) + mapping: dict = dict( + zip([i[sub_id_str] for i in permission_list], permission_list) + ) # 树容器 container: list = [] @@ -235,6 +241,54 @@ def list_to_tree(permission_list: list, sub_id_str: str, parent_id_str: str) -> return container +def list_to_tree_select( + permission_list: list, + title_str: str, + key_str: str, + value_str: str, + parent_id_str: str, +) -> list: + """ + 工具方法:根据列表信息生成树选择器嵌套数据 + :param permission_list: 列表信息 + :param title_str: title字符串 + :param key_str: key字符串 + :param value_str: value字符串 + :param parent_id_str: parent_id字符串 + :return: 树形嵌套数据 + """ + permission_list = [ + dict( + title=item[title_str], + key=str(item[key_str]), + value=str(item[value_str]), + parent_id=str(item[parent_id_str]), + ) + for item in permission_list + ] + # 转成id为key的字典 + mapping: dict = dict( + zip([i['key'] for i in permission_list], permission_list) + ) + + # 树容器 + container: list = [] + + for d in permission_list: + # 如果找不到父级项,则是根节点 + parent: dict = mapping.get(d['parent_id']) + if parent is None: + container.append(d) + else: + children: list = parent.get('children') + if not children: + children = [] + children.append(d) + parent.update({'children': children}) + + return container + + def get_search_panel_data(menu_list: list): search_data = [] for item in menu_list: @@ -242,7 +296,7 @@ def get_search_panel_data(menu_list: list): item_dict = dict( id=str(item.get('menu_id')), title=item.get('menu_name'), - handler='() => window.open("%s", "_self")' % item.get('path') + handler='() => window.open("%s", "_self")' % item.get('path'), ) search_data.append(item_dict) diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index 0e8988d..7f7a9b2 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -1,18 +1,19 @@ from dash import dcc, html import feffery_antd_components as fac -from api.menu import get_menu_list_api +from api.system.menu import MenuApi +from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree from views.system.menu.components.icon_category import render_icon -import callbacks.system_c.menu_c.menu_c +import callbacks.system_c.menu_c.menu_c # noqa: F401 def render(*args, **kwargs): button_perms = kwargs.get('button_perms') table_data_new = [] - table_info = get_menu_list_api({}) + table_info = MenuApi.list_menu({}) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['data'] for item in table_data: item['key'] = str(item['menu_id']) item['icon'] = [ @@ -20,41 +21,29 @@ def render(*args, **kwargs): 'type': 'link', 'icon': item['icon'], 'disabled': True, - 'style': { - 'color': 'rgba(0, 0, 0, 0.8)' - } + 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, }, ] if item['status'] == '1': item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:menu:edit' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:menu:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:menu:remove') + else {}, ] else: item['operation'] = [ - { - 'content': '修改', - 'type': 'link', - 'icon': 'antd-edit' - } if 'system:menu:edit' in button_perms else {}, - { - 'content': '新增', - 'type': 'link', - 'icon': 'antd-plus' - } if 'system:menu:add' in button_perms else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete' - } if 'system:menu:remove' in button_perms else {}, + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:menu:add') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:menu:remove') + else {}, ] if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') @@ -98,9 +87,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), - label='菜单名称' + label='菜单名称', ), fac.AntdFormItem( fac.AntdSelect( @@ -109,18 +98,18 @@ def render(*args, **kwargs): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '停用', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 240 - } + }, ), - label='菜单状态' + label='菜单状态', ), fac.AntdFormItem( fac.AntdButton( @@ -129,7 +118,7 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ) ), fac.AntdFormItem( @@ -138,20 +127,20 @@ def render(*args, **kwargs): id='menu-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ) - ) + ), ], style={ 'paddingBottom': '10px' - } + }, ), ], layout='inline', ) ], id='menu-search-form-container', - hidden=False + hidden=False, ) ) ] @@ -170,14 +159,18 @@ def render(*args, **kwargs): ], id={ 'type': 'menu-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:menu:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:menu:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -189,15 +182,13 @@ def render(*args, **kwargs): style={ 'color': '#909399', 'background': '#f4f4f5', - 'border-color': '#d3d4d6' - } + 'border-color': '#d3d4d6', + }, ), ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -211,10 +202,10 @@ def render(*args, **kwargs): ), ], id='menu-hidden', - shape='circle' + shape='circle', ), id='menu-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -226,24 +217,22 @@ def render(*args, **kwargs): ), ], id='menu-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -259,7 +248,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'ellipsis' }, - 'hidden': True + 'hidden': True, }, { 'dataIndex': 'menu_name', @@ -320,7 +309,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], bordered=True, pagination={ @@ -329,21 +318,20 @@ def render(*args, **kwargs): style={ 'width': '100%', 'padding-right': '10px', - 'padding-bottom': '20px' - } + 'padding-bottom': '20px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑菜单表单modal fac.AntdModal( [ @@ -358,9 +346,7 @@ def render(*args, **kwargs): treeData=[], defaultValue='0', treeNodeFilterProp='title', - style={ - 'width': 495 - } + style={'width': 495}, ), label='上级菜单', required=True, @@ -368,12 +354,10 @@ def render(*args, **kwargs): labelCol={ 'span': 4, }, - wrapperCol={ - 'span': 20 - } + wrapperCol={'span': 20}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -381,23 +365,12 @@ def render(*args, **kwargs): fac.AntdRadioGroup( id='menu-menu_type', options=[ - { - 'label': '目录', - 'value': 'M' - }, - { - 'label': '菜单', - 'value': 'C' - }, - { - 'label': '按钮', - 'value': 'F' - }, + {'label': '目录', 'value': 'M'}, + {'label': '菜单', 'value': 'C'}, + {'label': '按钮', 'value': 'F'}, ], defaultValue='M', - style={ - 'width': 495 - } + style={'width': 495}, ), label='菜单类型', required=True, @@ -405,12 +378,10 @@ def render(*args, **kwargs): labelCol={ 'span': 4, }, - wrapperCol={ - 'span': 20 - } + wrapperCol={'span': 20}, ) ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -420,25 +391,21 @@ def render(*args, **kwargs): id='menu-icon', placeholder='点击此处选择图标', readOnly=True, - style={ - 'width': 495 - } + style={'width': 495}, ), content=render_icon(), trigger='click', - placement='bottom' + placement='bottom', ), label='菜单图标', id='menu-icon-form-item', labelCol={ 'span': 4, }, - wrapperCol={ - 'span': 20 - } + wrapperCol={'span': 20}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -447,9 +414,7 @@ def render(*args, **kwargs): id='menu-menu_name', placeholder='请输入菜单名称', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='菜单名称', required=True, @@ -457,17 +422,13 @@ def render(*args, **kwargs): labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), fac.AntdFormItem( fac.AntdInputNumber( id='menu-order_num', min=0, - style={ - 'width': 200 - } + style={'width': 200}, ), label='显示排序', required=True, @@ -475,12 +436,10 @@ def render(*args, **kwargs): labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), ], - size="middle" + size='middle', ), html.Div(id='content-by-menu-type'), ] @@ -490,9 +449,8 @@ def render(*args, **kwargs): mask=False, width=680, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除菜单二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='menu-delete-text'), @@ -500,6 +458,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] -- Gitee From ee3a870de4d76284eaab4f03b5a21df9c5ea90ba Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 17:56:44 +0800 Subject: [PATCH 024/229] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0.gitignore?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f6c6f30..bd229c9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ __pycache__/ # Distribution / packaging .Python develop-eggs/ +df_admin/ dist/ downloads/ eggs/ -- Gitee From a6297fb1e7c659854465358b8a833a8b9bd63f90 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 17:57:10 +0800 Subject: [PATCH 025/229] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4=E8=B7=A8?= =?UTF-8?q?=E5=9F=9F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/middlewares/cors_middleware.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-backend/middlewares/cors_middleware.py b/dash-fastapi-backend/middlewares/cors_middleware.py index 55508e7..f5f7ef1 100644 --- a/dash-fastapi-backend/middlewares/cors_middleware.py +++ b/dash-fastapi-backend/middlewares/cors_middleware.py @@ -11,8 +11,8 @@ def add_cors_middleware(app: FastAPI): """ # 前端页面url origins = [ - 'http://localhost:80', - 'http://127.0.0.1:80', + 'http://localhost:8088', + 'http://127.0.0.1:8088', ] # 后台api允许跨域 -- Gitee From 7b7858c5e189bb0af9129eccb809b8fc76c04eca Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 17:57:59 +0800 Subject: [PATCH 026/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4user=5Fco?= =?UTF-8?q?ntroller=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/controller/user_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/controller/user_controller.py b/dash-fastapi-backend/module_admin/controller/user_controller.py index 81838f3..196de90 100644 --- a/dash-fastapi-backend/module_admin/controller/user_controller.py +++ b/dash-fastapi-backend/module_admin/controller/user_controller.py @@ -318,7 +318,7 @@ async def reset_system_user_password( async def batch_import_system_user( request: Request, file: UploadFile = File(...), - update_support: bool = Query(alias='updateSupport'), + update_support: bool = Query(), query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user), user_data_scope_sql: str = Depends(GetDataScope('SysUser')), -- Gitee From faafdebbc740dac3c72c5f6547daa27c100ae90b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 17:58:29 +0800 Subject: [PATCH 027/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/service/common_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/service/common_service.py b/dash-fastapi-backend/module_admin/service/common_service.py index 387ef33..e0c325a 100644 --- a/dash-fastapi-backend/module_admin/service/common_service.py +++ b/dash-fastapi-backend/module_admin/service/common_service.py @@ -41,7 +41,7 @@ class CommonService: is_success=True, result=UploadResponseModel( file_name=f'{UploadConfig.UPLOAD_PREFIX}/{relative_path}/{filename}', - new_fileName=filename, + new_file_name=filename, original_filename=file.filename, url=f'{request.base_url}{UploadConfig.UPLOAD_PREFIX[1:]}/{relative_path}/{filename}', ), -- Gitee From 9658a601f3c4393901fe74eb99dbd22c53a5d870 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 17:59:11 +0800 Subject: [PATCH 028/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=83=A8=E9=97=A8=E6=A0=91=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/service/dept_service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-backend/module_admin/service/dept_service.py b/dash-fastapi-backend/module_admin/service/dept_service.py index fcc316d..3144080 100644 --- a/dash-fastapi-backend/module_admin/service/dept_service.py +++ b/dash-fastapi-backend/module_admin/service/dept_service.py @@ -206,10 +206,11 @@ class DeptService: :return: 部门树形嵌套数据 """ permission_list = [ - dict(id=item.dept_id, label=item.dept_name, parent_id=item.parent_id) for item in permission_list + dict(key=str(item.dept_id), title=item.dept_name, value=str(item.dept_id), parent_id=str(item.parent_id)) + for item in permission_list ] # 转成id为key的字典 - mapping: dict = dict(zip([i['id'] for i in permission_list], permission_list)) + mapping: dict = dict(zip([i['key'] for i in permission_list], permission_list)) # 树容器 container: list = [] -- Gitee From c6e2346b022ee853ee357e327dfb5e9080b96d13 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 17:59:23 +0800 Subject: [PATCH 029/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E8=8F=9C=E5=8D=95=E6=A0=91=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/service/menu_service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-backend/module_admin/service/menu_service.py b/dash-fastapi-backend/module_admin/service/menu_service.py index fb95d28..2cf7639 100644 --- a/dash-fastapi-backend/module_admin/service/menu_service.py +++ b/dash-fastapi-backend/module_admin/service/menu_service.py @@ -192,10 +192,11 @@ class MenuService: :return: 菜单树形嵌套数据 """ permission_list = [ - dict(id=item.menu_id, label=item.menu_name, parent_id=item.parent_id) for item in permission_list + dict(key=str(item.menu_id), title=item.menu_name, value=str(item.menu_id), parent_id=str(item.parent_id)) + for item in permission_list ] # 转成id为key的字典 - mapping: dict = dict(zip([i['id'] for i in permission_list], permission_list)) + mapping: dict = dict(zip([i['key'] for i in permission_list], permission_list)) # 树容器 container: list = [] -- Gitee From bf7f69ac104570fd2c1c5917b746fdefa1b4e727 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 18:00:17 +0800 Subject: [PATCH 030/229] =?UTF-8?q?feat:=20api=5Frequest=E6=96=B0=E5=A2=9E?= =?UTF-8?q?files=E5=8F=82=E6=95=B0=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=8F=91?= =?UTF-8?q?=E9=80=81=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/request.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index 5ac25a2..9c8f403 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -13,6 +13,7 @@ def api_request( params: Optional[Dict] = None, data: Optional[Dict] = None, json: Optional[Dict] = None, + files: Optional[Dict] = None, timeout: Optional[int] = None, stream: Optional[bool] = False, ): @@ -25,6 +26,7 @@ def api_request( :param params: 查询参数 :param data: 表单参数 :param json: 请求体 + :param files: 请求文件 :param timeout: 请求超时时间 :param stream: 是否为流式请求 :return: 请求结果 @@ -61,6 +63,7 @@ def api_request( params=params, data=data, json=json, + files=files, headers=api_headers, timeout=timeout, stream=stream, @@ -71,6 +74,7 @@ def api_request( params=params, data=data, json=json, + files=files, headers=api_headers, timeout=timeout, stream=stream, @@ -81,6 +85,7 @@ def api_request( params=params, data=data, json=json, + files=files, headers=api_headers, timeout=timeout, stream=stream, @@ -91,6 +96,7 @@ def api_request( params=params, data=data, json=json, + files=files, headers=api_headers, timeout=timeout, stream=stream, @@ -101,6 +107,7 @@ def api_request( params=params, data=data, json=json, + files=files, headers=api_headers, timeout=timeout, stream=stream, -- Gitee From 24180308d0dd85f4e7fb5076dde90c039e0f7602 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 18:00:56 +0800 Subject: [PATCH 031/229] =?UTF-8?q?refactor:=20=E5=88=9D=E6=AD=A5=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E8=A7=92=E8=89=B2=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/role.py | 2 +- .../callbacks/system_c/role_c/role_c.py | 612 +++++++++++------- .../views/system/role/__init__.py | 358 +++++----- .../system/role/component/query_form_table.py | 452 ++++++------- 4 files changed, 767 insertions(+), 657 deletions(-) diff --git a/dash-fastapi-frontend/api/system/role.py b/dash-fastapi-frontend/api/system/role.py index c82876f..b873bf7 100644 --- a/dash-fastapi-frontend/api/system/role.py +++ b/dash-fastapi-frontend/api/system/role.py @@ -76,7 +76,7 @@ class RoleApi: ) @classmethod - def change_user_status(cls, role_id: str, status: str): + def change_role_status(cls, role_id: str, status: str): """ 角色状态修改接口 diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 11a9757..0809a5b 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -9,80 +9,94 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.role import get_role_list_api, get_role_detail_api, add_role_api, edit_role_api, delete_role_api, export_role_list_api -from api.menu import get_menu_tree_api +from api.system.menu import MenuApi +from api.system.role import RoleApi +from utils.permission_util import PermissionManager @app.callback( output=dict( role_table_data=Output('role-list-table', 'data', allow_duplicate=True), - role_table_pagination=Output('role-list-table', 'pagination', allow_duplicate=True), + role_table_pagination=Output( + 'role-list-table', 'pagination', allow_duplicate=True + ), role_table_key=Output('role-list-table', 'key'), role_table_selectedrowkeys=Output('role-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( search_click=Input('role-search', 'nClicks'), refresh_click=Input('role-refresh', 'nClicks'), pagination=Input('role-list-table', 'pagination'), - operations=Input('role-operations-store', 'data') + operations=Input('role-operations-store', 'data'), ), state=dict( role_name=State('role-role_name-input', 'value'), role_key=State('role-role_key-input', 'value'), status_select=State('role-status-select', 'value'), create_time_range=State('role-create_time-range', 'value'), - button_perms=State('role-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_role_table_data(search_click, refresh_click, pagination, operations, role_name, role_key, status_select, create_time_range, button_perms): +def get_role_table_data( + search_click, + refresh_click, + pagination, + operations, + role_name, + role_key, + status_select, + create_time_range, +): """ 获取角色表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - create_time_start = None - create_time_end = None + begin_time = None + end_time = None if create_time_range: - create_time_start = create_time_range[0] - create_time_end = create_time_range[1] + begin_time = create_time_range[0] + end_time = create_time_range[1] query_params = dict( role_name=role_name, role_key=role_key, status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, + begin_time=begin_time, + end_time=end_time, page_num=1, - page_size=10 + page_size=10, ) triggered_id = dash.ctx.triggered_id if triggered_id == 'role-list-table': - query_params = dict( - role_name=role_name, - role_key=role_key, - status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - table_info = get_role_list_api(query_params) + table_info = RoleApi.list_role(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == '0': - item['status'] = dict(checked=True, disabled=item['role_id'] == 1) + item['status'] = dict( + checked=True, disabled=item['role_id'] == 1 + ) else: - item['status'] = dict(checked=False, disabled=item['role_id'] == 1) + item['status'] = dict( + checked=False, disabled=item['role_id'] == 1 + ) item['key'] = str(item['role_id']) if item['role_id'] == 1: item['operation'] = [] @@ -94,41 +108,35 @@ def get_role_table_data(search_click, refresh_click, pagination, operations, rol id={ 'type': 'role-operation-table', 'operation': 'edit', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='link', - icon=fac.AntdIcon( - icon='antd-edit' - ), - style={ - 'padding': 0 - } - ) if 'system:role:edit' in button_perms else [], + icon=fac.AntdIcon(icon='antd-edit'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:edit') + else [], fac.AntdButton( '删除', id={ 'type': 'role-operation-table', 'operation': 'delete', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='link', - icon=fac.AntdIcon( - icon='antd-delete' - ), - style={ - 'padding': 0 - } - ) if 'system:role:remove' in button_perms else [], + icon=fac.AntdIcon(icon='antd-delete'), + style={'padding': 0}, + ) + if PermissionManager.check_perms( + 'system:role:remove' + ) + else [], fac.AntdPopover( fac.AntdButton( '更多', type='link', - icon=fac.AntdIcon( - icon='antd-more' - ), - style={ - 'padding': 0 - } + icon=fac.AntdIcon(icon='antd-more'), + style={'padding': 0}, ), content=fac.AntdSpace( [ @@ -137,38 +145,34 @@ def get_role_table_data(search_click, refresh_click, pagination, operations, rol id={ 'type': 'role-operation-table', 'operation': 'datascope', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='text', block=True, icon=fac.AntdIcon( icon='antd-check-circle' ), - style={ - 'padding': 0 - } + style={'padding': 0}, ), fac.AntdButton( '分配用户', id={ 'type': 'role-operation-table', 'operation': 'allocation', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='text', block=True, - icon=fac.AntdIcon( - icon='antd-user' - ), - style={ - 'padding': 0 - } + icon=fac.AntdIcon(icon='antd-user'), + style={'padding': 0}, ), ], - direction='vertical' + direction='vertical', ), - placement='bottomRight' - ) if 'system:role:edit' in button_perms else [] + placement='bottomRight', + ) + if PermissionManager.check_perms('system:role:edit') + else [], ] ) @@ -177,7 +181,7 @@ def get_role_table_data(search_click, refresh_click, pagination, operations, rol role_table_pagination=table_pagination, role_table_key=str(uuid.uuid4()), role_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -185,7 +189,7 @@ def get_role_table_data(search_click, refresh_click, pagination, operations, rol role_table_pagination=dash.no_update, role_table_key=dash.no_update, role_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -193,27 +197,29 @@ def get_role_table_data(search_click, refresh_click, pagination, operations, rol # 重置角色搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('role-role_name-input', 'value'), - Output('role-role_key-input', 'value'), - Output('role-status-select', 'value'), - Output('role-create_time-range', 'value'), - Output('role-operations-store', 'data')], + """, + [ + Output('role-role_name-input', 'value'), + Output('role-role_key-input', 'value'), + Output('role-status-select', 'value'), + Output('role-create_time-range', 'value'), + Output('role-operations-store', 'data'), + ], Input('role-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示角色搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -223,19 +229,21 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('role-search-form-container', 'hidden'), - Output('role-hidden-tooltip', 'title')], + """, + [ + Output('role-search-form-container', 'hidden'), + Output('role-hidden-tooltip', 'title'), + ], Input('role-hidden', 'nClicks'), State('role-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'role-operation-button', 'operation': 'edit'}, 'disabled'), Input('role-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_role_edit_button_status(table_rows_selected): """ @@ -255,9 +263,11 @@ def change_role_edit_button_status(table_rows_selected): @app.callback( - Output({'type': 'role-operation-button', 'operation': 'delete'}, 'disabled'), + Output( + {'type': 'role-operation-button', 'operation': 'delete'}, 'disabled' + ), Input('role-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_role_delete_button_status(table_rows_selected): """ @@ -280,7 +290,7 @@ def change_role_delete_button_status(table_rows_selected): Output('role-menu-perms', 'expandedKeys', allow_duplicate=True), Input('role-menu-perms-radio-fold-unfold', 'checked'), State('role-menu-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def fold_unfold_role_menu(fold_unfold, menu_info): """ @@ -291,12 +301,12 @@ def fold_unfold_role_menu(fold_unfold, menu_info): for item in menu_info: if item.get('parent_id') == 0: default_expanded_keys.append(str(item.get('menu_id'))) - + if fold_unfold: return default_expanded_keys else: return [] - + return dash.no_update @@ -304,7 +314,7 @@ def fold_unfold_role_menu(fold_unfold, menu_info): Output('role-menu-perms', 'checkedKeys', allow_duplicate=True), Input('role-menu-perms-radio-all-none', 'checked'), State('role-menu-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def all_none_role_menu_mode(all_none, menu_info): """ @@ -315,21 +325,23 @@ def all_none_role_menu_mode(all_none, menu_info): for item in menu_info: if item.get('parent_id') == 0: default_expanded_keys.append(str(item.get('menu_id'))) - + if all_none: return [str(item.get('menu_id')) for item in menu_info] else: return [] - + return dash.no_update @app.callback( - [Output('role-menu-perms', 'checkStrictly'), - Output('role-menu-perms', 'checkedKeys', allow_duplicate=True)], + [ + Output('role-menu-perms', 'checkStrictly'), + Output('role-menu-perms', 'checkedKeys', allow_duplicate=True), + ], Input('role-menu-perms-radio-parent-children', 'checked'), State('current-role-menu-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_role_menu_mode(parent_children, current_role_menu): """ @@ -349,7 +361,9 @@ def change_role_menu_mode(parent_children, current_role_menu): return [False, checked_menu] else: if current_role_menu: - checked_menu = [str(item.get('menu_id')) for item in current_role_menu if item] or [] + checked_menu = [ + str(item.get('menu_id')) for item in current_role_menu if item + ] or [] return [True, checked_menu] @@ -357,27 +371,48 @@ def change_role_menu_mode(parent_children, current_role_menu): output=dict( modal_visible=Output('role-modal', 'visible', allow_duplicate=True), modal_title=Output('role-modal', 'title'), - form_value=Output({'type': 'role-form-value', 'index': ALL, 'required': ALL}, 'value'), - form_label_validate_status=Output({'type': 'role-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'role-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), + form_value=Output( + {'type': 'role-form-value', 'index': ALL, 'required': ALL}, 'value' + ), + form_label_validate_status=Output( + {'type': 'role-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'role-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), menu_perms_tree=Output('role-menu-perms', 'treeData'), - menu_perms_expandedkeys=Output('role-menu-perms', 'expandedKeys', allow_duplicate=True), - menu_perms_checkedkeys=Output('role-menu-perms', 'checkedKeys', allow_duplicate=True), - menu_perms_halfcheckedkeys=Output('role-menu-perms', 'halfCheckedKeys', allow_duplicate=True), + menu_perms_expandedkeys=Output( + 'role-menu-perms', 'expandedKeys', allow_duplicate=True + ), + menu_perms_checkedkeys=Output( + 'role-menu-perms', 'checkedKeys', allow_duplicate=True + ), + menu_perms_halfcheckedkeys=Output( + 'role-menu-perms', 'halfCheckedKeys', allow_duplicate=True + ), role_menu=Output('role-menu-store', 'data'), current_role_menu=Output('current-role-menu-store', 'data'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), edit_row_info=Output('role-edit-id-store', 'data'), - modal_type=Output('role-operations-store-bk', 'data') + modal_type=Output('role-operations-store-bk', 'data'), ), inputs=dict( - operation_click=Input({'type': 'role-operation-button', 'operation': ALL}, 'nClicks'), - button_click=Input({'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, 'nClicks') + operation_click=Input( + {'type': 'role-operation-button', 'operation': ALL}, 'nClicks' + ), + button_click=Input( + {'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, + 'nClicks', + ), ), - state=dict( - selected_row_keys=State('role-list-table', 'selectedRowKeys') - ), - prevent_initial_call=True + state=dict(selected_row_keys=State('role-list-table', 'selectedRowKeys')), + prevent_initial_call=True, ) def add_edit_role_modal(operation_click, button_click, selected_row_keys): """ @@ -389,65 +424,79 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] # 获取所有输出表单项对应label的index form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] - menu_params = dict(menu_name='', type='role') - tree_info = get_menu_tree_api(menu_params) - if tree_info.get('code') == 200: - tree_data = tree_info['data'] - if trigger_id.type == 'role-operation-button' and trigger_id.operation == 'add': - role_info = dict(role_name=None, role_key=None, role_sort=None, status='0', remark=None) + if ( + trigger_id.type == 'role-operation-button' + and trigger_id.operation == 'add' + ): + tree_info = MenuApi.treeselect() + if tree_info.get('code') == 200: + tree_data = tree_info['data'] + role_info = dict( + role_name=None, + role_key=None, + role_sort=None, + status='0', + remark=None, + ) return dict( modal_visible=True, modal_title='新增角色', form_value=[role_info.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), - menu_perms_tree=tree_data[0], + menu_perms_tree=tree_data, menu_perms_expandedkeys=[], menu_perms_checkedkeys=None, menu_perms_halfcheckedkeys=None, - role_menu=tree_data[1], + role_menu=[], current_role_menu=None, api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type={'type': 'add'} + modal_type={'type': 'add'}, + ) + elif trigger_id.operation == 'edit': + if trigger_id.type == 'role-operation-button': + role_id = int(','.join(selected_row_keys)) + else: + role_id = int(trigger_id.index) + role_info_res = RoleApi.get_role(role_id=role_id) + tree_info = MenuApi.role_menu_treeselect(role_id=role_id) + if role_info_res['code'] == 200 and tree_info.get('code') == 200: + role_info = role_info_res['data'] + tree_data = tree_info['menus'] + checked_menu = [] + checked_menu_all = [] + if role_info.get('menu')[0]: + for item in role_info.get('menu'): + checked_menu_all.append(str(item.get('menu_id'))) + has_children = False + for other_item in role_info.get('menu'): + if other_item['parent_id'] == item['menu_id']: + has_children = True + break + if not has_children: + checked_menu.append(str(item.get('menu_id'))) + half_checked_menu = [ + x for x in checked_menu_all if x not in checked_menu + ] + return dict( + modal_visible=True, + modal_title='编辑角色', + form_value=[ + role_info.get('role').get(k) for k in form_value_list + ], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + menu_perms_tree=tree_data, + menu_perms_expandedkeys=[], + menu_perms_checkedkeys=tree_data['checked_keys'], + menu_perms_halfcheckedkeys=half_checked_menu, + role_menu=[], + current_role_menu=role_info.get('menu'), + api_check_token_trigger={'timestamp': time.time()}, + edit_row_info=role_info.get('role') if role_info else None, + modal_type={'type': 'edit'}, ) - elif trigger_id.operation == 'edit': - if trigger_id.type == 'role-operation-button': - role_id = int(','.join(selected_row_keys)) - else: - role_id = int(trigger_id.index) - role_info_res = get_role_detail_api(role_id=role_id) - if role_info_res['code'] == 200: - role_info = role_info_res['data'] - checked_menu = [] - checked_menu_all = [] - if role_info.get('menu')[0]: - for item in role_info.get('menu'): - checked_menu_all.append(str(item.get('menu_id'))) - has_children = False - for other_item in role_info.get('menu'): - if other_item['parent_id'] == item['menu_id']: - has_children = True - break - if not has_children: - checked_menu.append(str(item.get('menu_id'))) - half_checked_menu = [x for x in checked_menu_all if x not in checked_menu] - return dict( - modal_visible=True, - modal_title='编辑角色', - form_value=[role_info.get('role').get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - menu_perms_tree=tree_data[0], - menu_perms_expandedkeys=[], - menu_perms_checkedkeys=checked_menu, - menu_perms_halfcheckedkeys=half_checked_menu, - role_menu=tree_data[1], - current_role_menu=role_info.get('menu'), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=role_info.get('role') if role_info else None, - modal_type={'type': 'edit'} - ) return dict( modal_visible=dash.no_update, @@ -463,7 +512,7 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): current_role_menu=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, - modal_type=None + modal_type=None, ) raise PreventUpdate @@ -471,41 +520,80 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): @app.callback( output=dict( - form_label_validate_status=Output({'type': 'role-form-label', 'index': ALL, 'required': True}, 'validateStatus', - allow_duplicate=True), - form_label_validate_info=Output({'type': 'role-form-label', 'index': ALL, 'required': True}, 'help', - allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'role-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'role-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('role-modal', 'visible'), - operations=Output('role-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('role-modal', 'okCounts') + operations=Output( + 'role-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('role-modal', 'okCounts')), state=dict( modal_type=State('role-operations-store-bk', 'data'), edit_row_info=State('role-edit-id-store', 'data'), - form_value=State({'type': 'role-form-value', 'index': ALL, 'required': ALL}, 'value'), - form_label=State({'type': 'role-form-value', 'index': ALL, 'required': True}, 'placeholder'), + form_value=State( + {'type': 'role-form-value', 'index': ALL, 'required': ALL}, 'value' + ), + form_label=State( + {'type': 'role-form-value', 'index': ALL, 'required': True}, + 'placeholder', + ), menu_checked_keys=State('role-menu-perms', 'checkedKeys'), menu_half_checked_keys=State('role-menu-perms', 'halfCheckedKeys'), - parent_checked=State('role-menu-perms-radio-parent-children', 'checked') + parent_checked=State( + 'role-menu-perms-radio-parent-children', 'checked' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def role_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label, menu_checked_keys, menu_half_checked_keys, parent_checked): +def role_confirm( + confirm_trigger, + modal_type, + edit_row_info, + form_value, + form_label, + menu_checked_keys, + menu_half_checked_keys, + parent_checked, +): """ 新增或编辑角色弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[3]} - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): - menu_half_checked_keys = menu_half_checked_keys if menu_half_checked_keys else [] + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[3] + } + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): + menu_half_checked_keys = ( + menu_half_checked_keys if menu_half_checked_keys else [] + ) menu_checked_keys = menu_checked_keys if menu_checked_keys else [] if parent_checked: menu_perms = menu_half_checked_keys + menu_checked_keys @@ -514,31 +602,41 @@ def role_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_la params_add = form_value_state params_add['menu_id'] = ','.join(menu_perms) if menu_perms else None params_edit = params_add.copy() - params_edit['role_id'] = edit_row_info.get('role_id') if edit_row_info else None + params_edit['role_id'] = ( + edit_row_info.get('role_id') if edit_row_info else None + ) api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_role_api(params_add) + api_res = RoleApi.add_role(params_add) if modal_type == 'edit': - api_res = edit_role_api(params_edit) + api_res = RoleApi.update_role(params_edit) if api_res.get('code') == 200: if modal_type == 'add': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) if modal_type == 'edit': return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -547,65 +645,90 @@ def role_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_la modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else form_label_state.get(k) for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else form_label_state.get(k) + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '处理失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('role-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], - [Input('role-list-table', 'recentlySwitchDataIndex'), - Input('role-list-table', 'recentlySwitchStatus'), - Input('role-list-table', 'recentlySwitchRow')], - prevent_initial_call=True + [ + Output('role-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], + [ + Input('role-list-table', 'recentlySwitchDataIndex'), + Input('role-list-table', 'recentlySwitchStatus'), + Input('role-list-table', 'recentlySwitchRow'), + ], + prevent_initial_call=True, ) -def table_switch_role_status(recently_switch_data_index, recently_switch_status, recently_switch_row): +def table_switch_role_status( + recently_switch_data_index, recently_switch_status, recently_switch_row +): """ 表格内切换角色状态回调 """ if recently_switch_data_index: - if recently_switch_status: - params = dict(role_id=int(recently_switch_row['key']), status='0', type='status') - else: - params = dict(role_id=int(recently_switch_row['key']), status='1', type='status') - edit_button_result = edit_role_api(params) + edit_button_result = RoleApi.change_role_status( + role_id=recently_switch_row['key'], + status='0' if recently_switch_status else '1', + ) if edit_button_result['code'] == 200: - return [ {'type': 'switch-status'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success') + fuc.FefferyFancyMessage('修改成功', type='success'), ] return [ {'type': 'switch-status'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error') + fuc.FefferyFancyMessage('修改失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('role-delete-text', 'children'), - Output('role-delete-confirm-modal', 'visible'), - Output('role-delete-ids-store', 'data')], - [Input({'type': 'role-operation-button', 'operation': ALL}, 'nClicks'), - Input({'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, 'nClicks')], + [ + Output('role-delete-text', 'children'), + Output('role-delete-confirm-modal', 'visible'), + Output('role-delete-ids-store', 'data'), + ], + [ + Input({'type': 'role-operation-button', 'operation': ALL}, 'nClicks'), + Input( + {'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, + 'nClicks', + ), + ], State('role-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def role_delete_modal(operation_click, button_click, selected_row_keys): """ @@ -613,7 +736,6 @@ def role_delete_modal(operation_click, button_click, selected_row_keys): """ trigger_id = dash.ctx.triggered_id if trigger_id.operation == 'delete': - if trigger_id.type == 'role-operation-button': role_ids = ','.join(selected_row_keys) else: @@ -625,51 +747,59 @@ def role_delete_modal(operation_click, button_click, selected_row_keys): return [ f'是否确认删除角色编号为{role_ids}的角色?', True, - {'role_ids': role_ids} + role_ids, ] raise PreventUpdate @app.callback( - [Output('role-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('role-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('role-delete-confirm-modal', 'okCounts'), State('role-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def role_delete_confirm(delete_confirm, role_ids_data): """ 删除角色弹窗确认回调,实现删除操作 """ if delete_confirm: - params = role_ids_data - delete_button_info = delete_role_api(params) + delete_button_info = RoleApi.del_role(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('role_to_allocated_user-modal', 'visible'), - Output({'type': 'allocate_user-search', 'index': 'allocated'}, 'nClicks'), - Output('allocate_user-role_id-container', 'data')], - Input({'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, 'nClicks'), + [ + Output('role_to_allocated_user-modal', 'visible'), + Output( + {'type': 'allocate_user-search', 'index': 'allocated'}, 'nClicks' + ), + Output('allocate_user-role_id-container', 'data'), + ], + Input( + {'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, + 'nClicks', + ), State({'type': 'allocate_user-search', 'index': 'allocated'}, 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def role_to_allocated_user_modal(allocated_click, allocated_user_search_nclick): """ @@ -679,42 +809,49 @@ def role_to_allocated_user_modal(allocated_click, allocated_user_search_nclick): if trigger_id.operation == 'allocation': return [ True, - allocated_user_search_nclick + 1 if allocated_user_search_nclick else 1, - trigger_id.index + allocated_user_search_nclick + 1 + if allocated_user_search_nclick + else 1, + trigger_id.index, ] raise PreventUpdate @app.callback( - [Output('role-export-container', 'data', allow_duplicate=True), - Output('role-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('role-export-container', 'data', allow_duplicate=True), + Output('role-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('role-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_role_list(export_click): """ 导出角色信息回调 """ if export_click: - export_role_res = export_role_list_api({}) + export_role_res = RoleApi.export_role({}) if export_role_res.status_code == 200: export_role = export_role_res.content return [ - dcc.send_bytes(export_role, f'角色信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_role, + f'角色信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -723,7 +860,7 @@ def export_role_list(export_click): @app.callback( Output('role-export-container', 'data', allow_duplicate=True), Input('role-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_role_export_status(data): """ @@ -731,7 +868,6 @@ def reset_role_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index 715045e..e31a593 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -1,30 +1,35 @@ from dash import dcc, html import feffery_antd_components as fac -import callbacks.system_c.role_c.role_c +import callbacks.system_c.role_c.role_c # noqa: F401 from . import data_scope, allocate_user -from api.role import get_role_list_api +from api.system.role import RoleApi +from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') role_params = dict(page_num=1, page_size=10) - table_info = get_role_list_api(role_params) + table_info = RoleApi.list_role(role_params) table_data = [] page_num = 1 page_size = 10 total = 0 if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['status'] == '0': - item['status'] = dict(checked=True, disabled=item['role_id'] == 1) + item['status'] = dict( + checked=True, disabled=item['role_id'] == 1 + ) else: - item['status'] = dict(checked=False, disabled=item['role_id'] == 1) + item['status'] = dict( + checked=False, disabled=item['role_id'] == 1 + ) item['key'] = str(item['role_id']) if item['role_id'] == 1: item['operation'] = [] @@ -36,41 +41,33 @@ def render(*args, **kwargs): id={ 'type': 'role-operation-table', 'operation': 'edit', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='link', - icon=fac.AntdIcon( - icon='antd-edit' - ), - style={ - 'padding': 0 - } - ) if 'system:role:edit' in button_perms else [], + icon=fac.AntdIcon(icon='antd-edit'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:edit') + else [], fac.AntdButton( '删除', id={ 'type': 'role-operation-table', 'operation': 'delete', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='link', - icon=fac.AntdIcon( - icon='antd-delete' - ), - style={ - 'padding': 0 - } - ) if 'system:role:remove' in button_perms else [], + icon=fac.AntdIcon(icon='antd-delete'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:remove') + else [], fac.AntdPopover( fac.AntdButton( '更多', type='link', - icon=fac.AntdIcon( - icon='antd-more' - ), - style={ - 'padding': 0 - } + icon=fac.AntdIcon(icon='antd-more'), + style={'padding': 0}, ), content=fac.AntdSpace( [ @@ -79,38 +76,34 @@ def render(*args, **kwargs): id={ 'type': 'role-operation-table', 'operation': 'datascope', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='text', block=True, icon=fac.AntdIcon( icon='antd-check-circle' ), - style={ - 'padding': 0 - } + style={'padding': 0}, ), fac.AntdButton( '分配用户', id={ 'type': 'role-operation-table', 'operation': 'allocation', - 'index': str(item['role_id']) + 'index': str(item['role_id']), }, type='text', block=True, - icon=fac.AntdIcon( - icon='antd-user' - ), - style={ - 'padding': 0 - } + icon=fac.AntdIcon(icon='antd-user'), + style={'padding': 0}, ), ], - direction='vertical' + direction='vertical', ), - placement='bottomRight' - ) if 'system:role:edit' in button_perms else [] + placement='bottomRight', + ) + if PermissionManager.check_perms('system:role:edit') + else [], ] ) @@ -152,10 +145,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 220 - } + }, ), label='角色名称', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdInput( @@ -165,10 +160,12 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 220 - } + }, ), label='权限字符', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -177,29 +174,33 @@ def render(*args, **kwargs): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '停用', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 220 - } + }, ), label='状态', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdDateRangePicker( id='role-create_time-range', style={ 'width': 240 - } + }, ), label='创建时间', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -208,9 +209,11 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -218,16 +221,18 @@ def render(*args, **kwargs): id='role-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='role-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -246,15 +251,19 @@ def render(*args, **kwargs): ], id={ 'type': 'role-operation-button', - 'operation': 'add' + 'operation': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', 'border-color': '#a3d3ff', - 'marginRight': '10px' - } - ) if 'system:role:add' in button_perms else [], + 'marginRight': '10px', + }, + ) + if PermissionManager.check_perms( + 'system:role:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -264,16 +273,20 @@ def render(*args, **kwargs): ], id={ 'type': 'role-operation-button', - 'operation': 'edit' + 'operation': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', 'border-color': '#d0f5e0', - 'marginRight': '10px' - } - ) if 'system:role:edit' in button_perms else [], + 'marginRight': '10px', + }, + ) + if PermissionManager.check_perms( + 'system:role:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -283,16 +296,20 @@ def render(*args, **kwargs): ], id={ 'type': 'role-operation-button', - 'operation': 'delete' + 'operation': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', 'border-color': '#ffdbdb', - 'marginRight': '10px' - } - ) if 'system:role:remove' in button_perms else [], + 'marginRight': '10px', + }, + ) + if PermissionManager.check_perms( + 'system:role:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -305,15 +322,17 @@ def render(*args, **kwargs): 'color': '#ffba00', 'background': '#fff8e6', 'border-color': '#ffe399', - 'marginRight': '10px' - } - ) if 'system:role:export' in button_perms else [], + 'marginRight': '10px', + }, + ) + if PermissionManager.check_perms( + 'system:role:export' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -327,10 +346,10 @@ def render(*args, **kwargs): ), ], id='role-hidden', - shape='circle' + shape='circle', ), id='role-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -342,24 +361,22 @@ def render(*args, **kwargs): ), ], id='role-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -415,7 +432,7 @@ def render(*args, **kwargs): 'title': '操作', 'width': 180, 'dataIndex': 'operation', - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -424,28 +441,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑角色表单modal fac.AntdModal( [ @@ -456,40 +477,32 @@ def render(*args, **kwargs): id={ 'type': 'role-form-value', 'index': 'role_name', - 'required': True + 'required': True, }, placeholder='请输入角色名称', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='角色名称', required=True, id={ 'type': 'role-form-label', 'index': 'role_name', - 'required': True + 'required': True, }, - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'role-form-value', 'index': 'role_key', - 'required': True + 'required': True, }, placeholder='请输入权限字符', allowClear=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label=html.Div( [ @@ -497,85 +510,63 @@ def render(*args, **kwargs): fac.AntdIcon( icon='antd-question-circle' ), - title='控制器中定义的权限字符,如:common' + title='控制器中定义的权限字符,如:common', ), - fac.AntdText('权限字符') + fac.AntdText('权限字符'), ] ), required=True, id={ 'type': 'role-form-label', 'index': 'role_key', - 'required': True - }, - labelCol={ - 'span': 6 + 'required': True, }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), fac.AntdFormItem( fac.AntdInputNumber( id={ 'type': 'role-form-value', 'index': 'role_sort', - 'required': True + 'required': True, }, placeholder='请输入角色顺序', defaultValue=0, min=0, - style={ - 'width': 350 - } + style={'width': 350}, ), label='角色顺序', required=True, id={ 'type': 'role-form-label', 'index': 'role_sort', - 'required': True - }, - labelCol={ - 'span': 6 + 'required': True, }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), fac.AntdFormItem( fac.AntdRadioGroup( id={ 'type': 'role-form-value', 'index': 'status', - 'required': False + 'required': False, }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '停用', 'value': '1'}, ], - style={ - 'width': 350 - } + style={'width': 350}, ), label='状态', id={ 'type': 'role-form-label', 'index': 'status', - 'required': False + 'required': False, }, - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), fac.AntdFormItem( [ @@ -584,14 +575,14 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdCheckbox( id='role-menu-perms-radio-fold-unfold', - label='展开/折叠' + label='展开/折叠', ), span=7, ), fac.AntdCol( fac.AntdCheckbox( id='role-menu-perms-radio-all-none', - label='全选/全不选' + label='全选/全不选', ), span=8, ), @@ -599,14 +590,12 @@ def render(*args, **kwargs): fac.AntdCheckbox( id='role-menu-perms-radio-parent-children', label='父子联动', - checked=True + checked=True, ), span=6, ), ], - style={ - 'paddingTop': '6px' - } + style={'paddingTop': '6px'}, ), fac.AntdRow( fac.AntdCol( @@ -618,56 +607,44 @@ def render(*args, **kwargs): multiple=True, checkable=True, showLine=False, - selectable=False + selectable=False, ) ], style={ 'border': 'solid 1px rgba(0, 0, 0, 0.2)', 'border-radius': '5px', - 'width': 350 - } + 'width': 350, + }, ) ), - style={ - 'paddingTop': '6px' - } + style={'paddingTop': '6px'}, ), ], label='菜单权限', id='role-menu-perms-form-item', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'role-form-value', 'index': 'remark', - 'required': False + 'required': False, }, placeholder='请输入内容', allowClear=True, mode='text-area', - style={ - 'width': 350 - } + style={'width': 350}, ), label='备注', id={ 'type': 'role-form-label', 'index': 'remark', - 'required': False + 'required': False, }, - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), ] ) @@ -676,9 +653,8 @@ def render(*args, **kwargs): mask=False, width=600, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除角色二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='role-delete-text'), @@ -686,9 +662,8 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), - # 数据权限modal fac.AntdModal( data_scope.render(), @@ -697,9 +672,8 @@ def render(*args, **kwargs): mask=False, width=600, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 分配用户modal fac.AntdModal( allocate_user.render(button_perms), @@ -709,6 +683,6 @@ def render(*args, **kwargs): maskClosable=False, width=1000, renderFooter=False, - okClickClose=False - ) + okClickClose=False, + ), ] diff --git a/dash-fastapi-frontend/views/system/role/component/query_form_table.py b/dash-fastapi-frontend/views/system/role/component/query_form_table.py index 893dd0b..5092f6d 100644 --- a/dash-fastapi-frontend/views/system/role/component/query_form_table.py +++ b/dash-fastapi-frontend/views/system/role/component/query_form_table.py @@ -1,5 +1,6 @@ from dash import html import feffery_antd_components as fac +from utils.permission_util import PermissionManager def render(button_perms, allocate_index, is_operation): @@ -12,44 +13,32 @@ def render(button_perms, allocate_index, is_operation): { 'dataIndex': 'user_name', 'title': '用户名称', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, { 'dataIndex': 'nick_name', 'title': '用户昵称', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, { 'dataIndex': 'email', 'title': '邮箱', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, { 'dataIndex': 'phonenumber', 'title': '手机', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, { 'dataIndex': 'status', 'title': '状态', - 'renderOptions': { - 'renderType': 'tags' - }, + 'renderOptions': {'renderType': 'tags'}, }, { 'dataIndex': 'create_time', 'title': '创建时间', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, ] @@ -60,231 +49,242 @@ def render(button_perms, allocate_index, is_operation): 'dataIndex': 'operation', 'fixed': 'right', 'width': 150, - 'renderOptions': { - 'renderType': 'button' - }, + 'renderOptions': {'renderType': 'button'}, } ) return fac.AntdRow( - [ - fac.AntdCol( - [ - fac.AntdRow( - [ - fac.AntdCol( - html.Div( - [ - fac.AntdForm( - [ - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'allocate_user-user_name-input', - 'index': allocate_index - }, - placeholder='请输入用户名称', - autoComplete='off', - allowClear=True, - style={ - 'width': 240 - } - ), - label='用户名称', - style={'paddingBottom': '10px'}, - ), - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'allocate_user-phonenumber-input', - 'index': allocate_index - }, - placeholder='请输入手机号码', - autoComplete='off', - allowClear=True, - style={ - 'width': 240 - } - ), - label='手机号码', - style={'paddingBottom': '10px'}, - ), - fac.AntdFormItem( - fac.AntdButton( - '搜索', - id={ - 'type': 'allocate_user-search', - 'index': allocate_index - }, - type='primary', - icon=fac.AntdIcon( - icon='antd-search' - ) - ), - style={'paddingBottom': '10px'}, - ), - fac.AntdFormItem( - fac.AntdButton( - '重置', - id={ - 'type': 'allocate_user-reset', - 'index': allocate_index - }, - icon=fac.AntdIcon( - icon='antd-sync' - ) - ), - style={'paddingBottom': '10px'}, - ) - ], - layout='inline', - ) - ], - id={ - 'type': 'allocate_user-search-form-container', - 'index': allocate_index - }, - hidden=False - ), - ) - ] - ), - fac.AntdRow( - [ - fac.AntdCol( - fac.AntdSpace( - [ - fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-plus' + [ + fac.AntdCol( + [ + fac.AntdRow( + [ + fac.AntdCol( + html.Div( + [ + fac.AntdForm( + [ + fac.AntdFormItem( + fac.AntdInput( + id={ + 'type': 'allocate_user-user_name-input', + 'index': allocate_index, + }, + placeholder='请输入用户名称', + autoComplete='off', + allowClear=True, + style={'width': 240}, ), - '添加用户', - ], - id='allocate_user-add', - style={ - 'color': '#1890ff', - 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:role:edit' in button_perms else [], - fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-close-circle' + label='用户名称', + style={ + 'paddingBottom': '10px' + }, + ), + fac.AntdFormItem( + fac.AntdInput( + id={ + 'type': 'allocate_user-phonenumber-input', + 'index': allocate_index, + }, + placeholder='请输入手机号码', + autoComplete='off', + allowClear=True, + style={'width': 240}, ), - '批量取消授权', - ], - id={ - 'type': 'allocate_user-operation-button', - 'index': 'delete' - }, - disabled=True, - style={ - 'color': '#ff9292', - 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:role:edit' in button_perms else [], - ], - style={ - 'paddingBottom': '10px' - } - ), - span=16 - ) if is_operation else [], - fac.AntdCol( - fac.AntdSpace( - [ - html.Div( - fac.AntdTooltip( + label='手机号码', + style={ + 'paddingBottom': '10px' + }, + ), + fac.AntdFormItem( fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-search' - ), - ], + '搜索', id={ - 'type': 'allocate_user-hidden', - 'index': allocate_index + 'type': 'allocate_user-search', + 'index': allocate_index, }, - shape='circle' + type='primary', + icon=fac.AntdIcon( + icon='antd-search' + ), ), - id={ - 'type': 'allocate_user-hidden-tooltip', - 'index': allocate_index + style={ + 'paddingBottom': '10px' }, - title='隐藏搜索' - ) - ), - html.Div( - fac.AntdTooltip( + ), + fac.AntdFormItem( fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-sync' - ), - ], + '重置', id={ - 'type': 'allocate_user-refresh', - 'index': allocate_index + 'type': 'allocate_user-reset', + 'index': allocate_index, }, - shape='circle' + icon=fac.AntdIcon( + icon='antd-sync' + ), ), - title='刷新' - ) - ), - ], - style={ - 'float': 'right', - 'paddingBottom': '10px' - } - ), - span=8 if is_operation else 24, - style={ - 'paddingRight': '10px' - } - ) - ], - gutter=5 - ), - fac.AntdRow( - [ - fac.AntdCol( - fac.AntdSpin( - fac.AntdTable( - id={ - 'type': 'allocate_user-list-table', - 'index': allocate_index + style={ + 'paddingBottom': '10px' + }, + ), + ], + layout='inline', + ) + ], + id={ + 'type': 'allocate_user-search-form-container', + 'index': allocate_index, + }, + hidden=False, + ), + ) + ] + ), + fac.AntdRow( + [ + fac.AntdCol( + fac.AntdSpace( + [ + fac.AntdButton( + [ + fac.AntdIcon(icon='antd-plus'), + '添加用户', + ], + id='allocate_user-add', + style={ + 'color': '#1890ff', + 'background': '#e8f4ff', + 'border-color': '#a3d3ff', }, - data=[], - columns=table_column, - rowSelectionType='checkbox', - rowSelectionWidth=50, - bordered=True, - maxWidth=1000, - pagination={ - 'pageSize': 10, - 'current': 1, - 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], - 'showQuickJumper': True, - 'total': 0 + ) + if PermissionManager.check_perms( + 'system:role:edit' + ) + else [], + fac.AntdButton( + [ + fac.AntdIcon( + icon='antd-close-circle' + ), + '批量取消授权', + ], + id={ + 'type': 'allocate_user-operation-button', + 'index': 'delete', }, - mode='server-side', + disabled=True, style={ - 'width': '100%', - 'padding-right': '10px' - } + 'color': '#ff9292', + 'background': '#ffeded', + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:role:edit' + ) + else [], + ], + style={'paddingBottom': '10px'}, + ), + span=16, + ) + if is_operation + else [], + fac.AntdCol( + fac.AntdSpace( + [ + html.Div( + fac.AntdTooltip( + fac.AntdButton( + [ + fac.AntdIcon( + icon='antd-search' + ), + ], + id={ + 'type': 'allocate_user-hidden', + 'index': allocate_index, + }, + shape='circle', + ), + id={ + 'type': 'allocate_user-hidden-tooltip', + 'index': allocate_index, + }, + title='隐藏搜索', + ) ), - text='数据加载中' + html.Div( + fac.AntdTooltip( + fac.AntdButton( + [ + fac.AntdIcon( + icon='antd-sync' + ), + ], + id={ + 'type': 'allocate_user-refresh', + 'index': allocate_index, + }, + shape='circle', + ), + title='刷新', + ) + ), + ], + style={ + 'float': 'right', + 'paddingBottom': '10px', + }, + ), + span=8 if is_operation else 24, + style={'paddingRight': '10px'}, + ), + ], + gutter=5, + ), + fac.AntdRow( + [ + fac.AntdCol( + fac.AntdSpin( + fac.AntdTable( + id={ + 'type': 'allocate_user-list-table', + 'index': allocate_index, + }, + data=[], + columns=table_column, + rowSelectionType='checkbox', + rowSelectionWidth=50, + bordered=True, + maxWidth=1000, + pagination={ + 'pageSize': 10, + 'current': 1, + 'showSizeChanger': True, + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], + 'showQuickJumper': True, + 'total': 0, + }, + mode='server-side', + style={ + 'width': '100%', + 'padding-right': '10px', + }, ), - ) - ] - ), - ], - span=24 - ) - ], - gutter=5 - ) + text='数据加载中', + ), + ) + ] + ), + ], + span=24, + ) + ], + gutter=5, + ) -- Gitee From 8d74820ea644308b895bd9672940712f13e74864 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 18:01:20 +0800 Subject: [PATCH 032/229] =?UTF-8?q?refactor:=20=E5=88=9D=E6=AD=A5=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=94=A8=E6=88=B7=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/user.py | 29 + .../callbacks/system_c/user_c/user_c.py | 845 +++++++++++------- .../views/system/user/__init__.py | 624 ++++++------- .../views/system/user/allocate_role.py | 43 +- .../system/user/component/query_form_table.py | 449 +++++----- 5 files changed, 1100 insertions(+), 890 deletions(-) diff --git a/dash-fastapi-frontend/api/system/user.py b/dash-fastapi-frontend/api/system/user.py index 43733bb..e482c1c 100644 --- a/dash-fastapi-frontend/api/system/user.py +++ b/dash-fastapi-frontend/api/system/user.py @@ -74,6 +74,35 @@ class UserApi: method='delete', ) + @classmethod + def download_template(cls): + """ + 下载用户导入模板接口 + + :return: + """ + return api_request( + url='/system/user/importTemplate', + method='post', + stream=True, + ) + + @classmethod + def import_user(cls, file: bytes, update_support: bool): + """ + 导入用户接口 + + :param file: 导入模板文件 + :param update_support: 是否更新已存在的用户数据 + :return: + """ + return api_request( + url='/system/user/importData', + method='post', + files={'file': file}, + params={'update_support': update_support}, + ) + @classmethod def export_user(cls, data: dict): """ diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index d2c6e36..1818f60 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -1,6 +1,8 @@ import dash import time import uuid +import base64 +from io import BytesIO from dash import dcc from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate @@ -8,64 +10,65 @@ import feffery_utils_components as fuc from server import app from utils.common import validate_data_not_empty -from api.dept import get_dept_tree_api -from api.user import get_user_list_api, get_user_detail_api, add_user_api, edit_user_api, delete_user_api, reset_user_password_api, batch_import_user_api, download_user_import_template_api, export_user_list_api -from api.role import get_role_select_option_api -from api.post import get_post_select_option_api +from api.system.user import UserApi +from utils.permission_util import PermissionManager -@app.callback( - [Output('dept-tree', 'treeData'), - Output('api-check-token', 'data', allow_duplicate=True)], +app.clientside_callback( + """(dept_input) => dept_input""", + Output('dept-tree', 'searchKeyword'), Input('dept-input-search', 'value'), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_search_dept_tree(dept_input): - dept_params = dict(dept_name=dept_input) - tree_info = get_dept_tree_api(dept_params) - if tree_info['code'] == 200: - tree_data = tree_info['data'] - - return [tree_data, {'timestamp': time.time()}] - - return [dash.no_update, {'timestamp': time.time()}] @app.callback( output=dict( user_table_data=Output('user-list-table', 'data', allow_duplicate=True), - user_table_pagination=Output('user-list-table', 'pagination', allow_duplicate=True), + user_table_pagination=Output( + 'user-list-table', 'pagination', allow_duplicate=True + ), user_table_key=Output('user-list-table', 'key'), user_table_selectedrowkeys=Output('user-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( selected_dept_tree=Input('dept-tree', 'selectedKeys'), search_click=Input('user-search', 'nClicks'), refresh_click=Input('user-refresh', 'nClicks'), pagination=Input('user-list-table', 'pagination'), - operations=Input('user-operations-store', 'data') + operations=Input('user-operations-store', 'data'), ), state=dict( user_name=State('user-user_name-input', 'value'), phone_number=State('user-phone_number-input', 'value'), status_select=State('user-status-select', 'value'), create_time_range=State('user-create_time-range', 'value'), - button_perms=State('user-button-perms-container', 'data') ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_user_table_data_by_dept_tree(selected_dept_tree, search_click, refresh_click, pagination, operations, - user_name, phone_number, status_select, create_time_range, button_perms): +def get_user_table_data_by_dept_tree( + selected_dept_tree, + search_click, + refresh_click, + pagination, + operations, + user_name, + phone_number, + status_select, + create_time_range, +): """ 获取用户表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ dept_id = None - create_time_start = None - create_time_end = None + begin_time = None + end_time = None if create_time_range: - create_time_start = create_time_range[0] - create_time_end = create_time_range[1] + begin_time = create_time_range[0] + end_time = create_time_range[1] if selected_dept_tree: dept_id = int(selected_dept_tree[0]) query_params = dict( @@ -73,61 +76,63 @@ def get_user_table_data_by_dept_tree(selected_dept_tree, search_click, refresh_c user_name=user_name, phonenumber=phone_number, status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, + begin_time=begin_time, + end_time=end_time, page_num=1, - page_size=10 + page_size=10, ) triggered_id = dash.ctx.triggered_id if triggered_id == 'user-list-table': - query_params = dict( - dept_id=dept_id, - user_name=user_name, - phonenumber=phone_number, - status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) - if selected_dept_tree or search_click or refresh_click or pagination or operations: - table_info = get_user_list_api(query_params) + if ( + selected_dept_tree + or search_click + or refresh_click + or pagination + or operations + ): + table_info = UserApi.list_user(query_params) if table_info['code'] == 200: - table_data = table_info['data']['rows'] + table_data = table_info['rows'] table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], + pageSize=table_info['page_size'], + current=table_info['page_num'], showSizeChanger=True, pageSizeOptions=[10, 30, 50, 100], showQuickJumper=True, - total=table_info['data']['total'] + total=table_info['total'], ) for item in table_data: if item['status'] == '0': - item['status'] = dict(checked=True, disabled=item['user_id'] == 1) + item['status'] = dict( + checked=True, disabled=item['user_id'] == 1 + ) else: - item['status'] = dict(checked=False, disabled=item['user_id'] == 1) + item['status'] = dict( + checked=False, disabled=item['user_id'] == 1 + ) item['key'] = str(item['user_id']) if item['user_id'] == 1: item['operation'] = [] else: item['operation'] = [ - { - 'title': '修改', - 'icon': 'antd-edit' - } if 'system:user:edit' in button_perms else None, - { - 'title': '删除', - 'icon': 'antd-delete' - } if 'system:user:remove' in button_perms else None, - { - 'title': '重置密码', - 'icon': 'antd-key' - } if 'system:user:resetPwd' in button_perms else None, - { - 'title': '分配角色', - 'icon': 'antd-check-circle' - } if 'system:user:edit' in button_perms else None + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:user:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:user:remove') + else None, + {'title': '重置密码', 'icon': 'antd-key'} + if PermissionManager.check_perms('system:user:resetPwd') + else None, + {'title': '分配角色', 'icon': 'antd-check-circle'} + if PermissionManager.check_perms('system:user:edit') + else None, ] return dict( @@ -135,7 +140,7 @@ def get_user_table_data_by_dept_tree(selected_dept_tree, search_click, refresh_c user_table_pagination=table_pagination, user_table_key=str(uuid.uuid4()), user_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -143,7 +148,7 @@ def get_user_table_data_by_dept_tree(selected_dept_tree, search_click, refresh_c user_table_pagination=dash.no_update, user_table_key=dash.no_update, user_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -151,28 +156,30 @@ def get_user_table_data_by_dept_tree(selected_dept_tree, search_click, refresh_c # 重置用户搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('dept-tree', 'selectedKeys'), - Output('user-user_name-input', 'value'), - Output('user-phone_number-input', 'value'), - Output('user-status-select', 'value'), - Output('user-create_time-range', 'value'), - Output('user-operations-store', 'data')], + """, + [ + Output('dept-tree', 'selectedKeys'), + Output('user-user_name-input', 'value'), + Output('user-phone_number-input', 'value'), + Output('user-status-select', 'value'), + Output('user-create_time-range', 'value'), + Output('user-operations-store', 'data'), + ], Input('user-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示用户搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -182,19 +189,21 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('user-search-form-container', 'hidden'), - Output('user-hidden-tooltip', 'title')], + """, + [ + Output('user-search-form-container', 'hidden'), + Output('user-hidden-tooltip', 'title'), + ], Input('user-hidden', 'nClicks'), State('user-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'user-operation-button', 'index': 'edit'}, 'disabled'), Input('user-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_user_edit_button_status(table_rows_selected): """ @@ -216,7 +225,7 @@ def change_user_edit_button_status(table_rows_selected): @app.callback( Output({'type': 'user-operation-button', 'index': 'delete'}, 'disabled'), Input('user-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_user_delete_button_status(table_rows_selected): """ @@ -238,20 +247,32 @@ def change_user_delete_button_status(table_rows_selected): @app.callback( output=dict( modal_visible=Output('user-add-modal', 'visible', allow_duplicate=True), - dept_tree=Output({'type': 'user_add-form-value', 'index': 'dept_id'}, 'treeData'), - form_value=Output({'type': 'user_add-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'user_add-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'user_add-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), + dept_tree=Output( + {'type': 'user_add-form-value', 'index': 'dept_id'}, 'treeData' + ), + form_value=Output( + {'type': 'user_add-form-value', 'index': ALL}, 'value' + ), + form_label_validate_status=Output( + {'type': 'user_add-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'user_add-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), user_post=Output('user-add-post', 'value'), user_role=Output('user-add-role', 'value'), post_option=Output('user-add-post', 'options'), role_option=Output('user-add-role', 'options'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) - ), - inputs=dict( - add_click=Input('user-add', 'nClicks') + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), - prevent_initial_call=True + inputs=dict(add_click=Input('user-add', 'nClicks')), + prevent_initial_call=True, ) def add_user_modal(add_click): """ @@ -262,15 +283,23 @@ def add_user_modal(add_click): form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] # 获取所有输出表单项对应label的index form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] - dept_params = dict(dept_name='') - tree_info = get_dept_tree_api(dept_params) - post_option_info = get_post_select_option_api() - role_option_info = get_role_select_option_api() - if tree_info['code'] == 200 and post_option_info['code'] == 200 and role_option_info['code'] == 200: + tree_info = UserApi.dept_tree_select() + detail_info = UserApi.get_user(user_id='') + if tree_info['code'] == 200 and detail_info['code'] == 200: tree_data = tree_info['data'] - post_option = post_option_info['data'] - role_option = role_option_info['data'] - user_info = dict(nick_name=None, dept_id=None, phonenumber=None, email=None, user_name=None, password=None, sex=None, status='0', remark=None) + post_option = detail_info['posts'] + role_option = detail_info['roles'] + user_info = dict( + nick_name=None, + dept_id=None, + phonenumber=None, + email=None, + user_name=None, + password=None, + sex=None, + status='0', + remark=None, + ) return dict( modal_visible=True, @@ -280,9 +309,15 @@ def add_user_modal(add_click): form_label_validate_info=[None] * len(form_label_list), user_post=None, user_role=None, - post_option=[dict(label=item['post_name'], value=item['post_id']) for item in post_option], - role_option=[dict(label=item['role_name'], value=item['role_id']) for item in role_option], - api_check_token_trigger={'timestamp': time.time()} + post_option=[ + dict(label=item['post_name'], value=item['post_id']) + for item in post_option + ], + role_option=[ + dict(label=item['role_name'], value=item['role_id']) + for item in role_option + ], + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -295,7 +330,7 @@ def add_user_modal(add_click): user_role=dash.no_update, post_option=dash.no_update, role_option=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -303,46 +338,78 @@ def add_user_modal(add_click): @app.callback( output=dict( - form_label_validate_status=Output({'type': 'user_add-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'user_add-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'user_add-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'user_add-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('user-add-modal', 'visible', allow_duplicate=True), - operations=Output('user-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - add_confirm=Input('user-add-modal', 'okCounts') + operations=Output( + 'user-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(add_confirm=Input('user-add-modal', 'okCounts')), state=dict( post=State('user-add-post', 'value'), role=State('user-add-role', 'value'), - form_value=State({'type': 'user_add-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'user_add-form-label', 'index': ALL, 'required': True}, 'label') + form_value=State( + {'type': 'user_add-form-value', 'index': ALL}, 'value' + ), + form_label=State( + {'type': 'user_add-form-label', 'index': ALL, 'required': True}, + 'label', + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) def usr_add_confirm(add_confirm, post, role, form_value, form_label): if add_confirm: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + } - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params = form_value_state - params['post_id'] = ','.join(map(str, post)) if post else '' - params['role_id'] = ','.join(map(str, role)) if role else '' - add_button_result = add_user_api(params) + params['post_ids'] = post if post else '' + params['role_ids'] = role if role else '' + add_button_result = UserApi.add_user(params) if add_button_result['code'] == 200: return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'add'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '新增成功', type='success' + ), ) return dict( @@ -351,16 +418,30 @@ def usr_add_confirm(add_confirm, post, role, form_value, form_label): modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '新增失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('新增失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '新增失败', type='error' + ), ) raise PreventUpdate @@ -368,45 +449,72 @@ def usr_add_confirm(add_confirm, post, role, form_value, form_label): @app.callback( output=dict( - modal_visible=Output('user-edit-modal', 'visible', allow_duplicate=True), - dept_tree=Output({'type': 'user_edit-form-value', 'index': 'dept_id'}, 'treeData'), - form_value=Output({'type': 'user_edit-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'user_edit-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'user_edit-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), + modal_visible=Output( + 'user-edit-modal', 'visible', allow_duplicate=True + ), + dept_tree=Output( + {'type': 'user_edit-form-value', 'index': 'dept_id'}, 'treeData' + ), + form_value=Output( + {'type': 'user_edit-form-value', 'index': ALL}, 'value' + ), + form_label_validate_status=Output( + {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), user_post=Output('user-edit-post', 'value'), user_role=Output('user-edit-role', 'value'), post_option=Output('user-edit-post', 'options'), role_option=Output('user-edit-role', 'options'), edit_row_info=Output('user-edit-id-store', 'data'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), ), inputs=dict( - operation_click=Input({'type': 'user-operation-button', 'index': ALL}, 'nClicks'), - dropdown_click=Input('user-list-table', 'nClicksDropdownItem') + operation_click=Input( + {'type': 'user-operation-button', 'index': ALL}, 'nClicks' + ), + dropdown_click=Input('user-list-table', 'nClicksDropdownItem'), ), state=dict( selected_row_keys=State('user-list-table', 'selectedRowKeys'), - recently_clicked_dropdown_item_title=State('user-list-table', 'recentlyClickedDropdownItemTitle'), - recently_dropdown_item_clicked_row=State('user-list-table', 'recentlyDropdownItemClickedRow') + recently_clicked_dropdown_item_title=State( + 'user-list-table', 'recentlyClickedDropdownItemTitle' + ), + recently_dropdown_item_clicked_row=State( + 'user-list-table', 'recentlyDropdownItemClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def user_edit_modal(operation_click, dropdown_click, - selected_row_keys, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row): +def user_edit_modal( + operation_click, + dropdown_click, + selected_row_keys, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, +): """ 显示编辑用户弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'edit', 'type': 'user-operation-button'} or (trigger_id == 'user-list-table' and recently_clicked_dropdown_item_title == '修改'): + if trigger_id == {'index': 'edit', 'type': 'user-operation-button'} or ( + trigger_id == 'user-list-table' + and recently_clicked_dropdown_item_title == '修改' + ): # 获取所有输出表单项对应value的index form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] # 获取所有输出表单项对应label的index form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] - dept_params = dict(dept_name='') - tree_data = get_dept_tree_api(dept_params)['data'] - post_option = get_post_select_option_api()['data'] - role_option = get_role_select_option_api()['data'] + tree_data = UserApi.dept_tree_select()['data'] if trigger_id == {'index': 'edit', 'type': 'user-operation-button'}: user_id = int(selected_row_keys[0]) @@ -416,25 +524,40 @@ def user_edit_modal(operation_click, dropdown_click, else: raise PreventUpdate - edit_button_info = get_user_detail_api(user_id) + edit_button_info = UserApi.get_user(user_id) if edit_button_info['code'] == 200: edit_button_result = edit_button_info['data'] - user = edit_button_result['user'] - role = edit_button_result['role'] - post = edit_button_result['post'] + post_option = edit_button_info['posts'] + role_option = edit_button_info['roles'] + role_ids = edit_button_result['role_ids'] + post_ids = edit_button_result['post_ids'] return dict( modal_visible=True, dept_tree=tree_data, - form_value=[user.get(k) for k in form_value_list], + form_value=[edit_button_result.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), - user_post=[item['post_id'] for item in post if item] or [], - user_role=[item['role_id'] for item in role if item] or [], - post_option=[dict(label=item['post_name'], value=item['post_id']) for item in post_option if item] or [], - role_option=[dict(label=item['role_name'], value=item['role_id']) for item in role_option if item] or [], + user_post=[int(item) for item in post_ids.split(',')] + if post_ids + else [], + user_role=[int(item) for item in role_ids.split(',')] + if role_ids + else [], + post_option=[ + dict(label=item['post_name'], value=item['post_id']) + for item in post_option + if item + ] + or [], + role_option=[ + dict(label=item['role_name'], value=item['role_id']) + for item in role_option + if item + ] + or [], edit_row_info={'user_id': user_id}, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) return dict( @@ -448,7 +571,7 @@ def user_edit_modal(operation_click, dropdown_click, post_option=dash.no_update, role_option=dash.no_update, edit_row_info=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -456,48 +579,86 @@ def user_edit_modal(operation_click, dropdown_click, @app.callback( output=dict( - form_label_validate_status=Output({'type': 'user_edit-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'user_edit-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), - modal_visible=Output('user-edit-modal', 'visible', allow_duplicate=True), - operations=Output('user-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - edit_confirm=Input('user-edit-modal', 'okCounts') + form_label_validate_status=Output( + {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), + modal_visible=Output( + 'user-edit-modal', 'visible', allow_duplicate=True + ), + operations=Output( + 'user-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(edit_confirm=Input('user-edit-modal', 'okCounts')), state=dict( post=State('user-edit-post', 'value'), role=State('user-edit-role', 'value'), edit_row_info=State('user-edit-id-store', 'data'), - form_value=State({'type': 'user_edit-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'user_edit-form-label', 'index': ALL, 'required': True}, 'label') + form_value=State( + {'type': 'user_edit-form-value', 'index': ALL}, 'value' + ), + form_label=State( + {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, + 'label', + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def usr_edit_confirm(edit_confirm, edit_row_info, post, role, form_value, form_label): +def usr_edit_confirm( + edit_confirm, edit_row_info, post, role, form_value, form_label +): if edit_confirm: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [ + x['id']['index'] for x in dash.ctx.outputs_list[0] + ] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} + form_value_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + } - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params = form_value_state - params['user_id'] = edit_row_info.get('user_id') if edit_row_info else None - params['post_id'] = ','.join(map(str, post)) if post else '' - params['role_id'] = ','.join(map(str, role)) if role else '' - edit_button_result = edit_user_api(params) + params['user_id'] = ( + edit_row_info.get('user_id') if edit_row_info else None + ) + params['post_ids'] = ','.join(map(str, post)) if post else '' + params['role_ids'] = ','.join(map(str, role)) if role else '' + edit_button_result = UserApi.update_user(params) if edit_button_result['code'] == 200: return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), modal_visible=False, operations={'type': 'edit'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '编辑成功', type='success' + ), ) return dict( @@ -506,76 +667,107 @@ def usr_edit_confirm(edit_confirm, edit_row_info, post, role, form_value, form_l modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '编辑失败', type='error' + ), ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], modal_visible=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('编辑失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '编辑失败', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('user-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], - [Input('user-list-table', 'recentlySwitchDataIndex'), - Input('user-list-table', 'recentlySwitchStatus'), - Input('user-list-table', 'recentlySwitchRow')], - prevent_initial_call=True + [ + Output('user-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], + [ + Input('user-list-table', 'recentlySwitchDataIndex'), + Input('user-list-table', 'recentlySwitchStatus'), + Input('user-list-table', 'recentlySwitchRow'), + ], + prevent_initial_call=True, ) -def table_switch_user_status(recently_switch_data_index, recently_switch_status, recently_switch_row): +def table_switch_user_status( + recently_switch_data_index, recently_switch_status, recently_switch_row +): """ 表格内切换用户状态回调 """ if recently_switch_data_index: - if recently_switch_status: - params = dict(user_id=int(recently_switch_row['key']), status='0', type='status') - else: - params = dict(user_id=int(recently_switch_row['key']), status='1', type='status') - edit_button_result = edit_user_api(params) + edit_button_result = UserApi.change_user_status( + user_id=recently_switch_row['key'], + status='0' if recently_switch_status else '1', + ) if edit_button_result['code'] == 200: - return [ {'type': 'switch-status'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success') + fuc.FefferyFancyMessage('修改成功', type='success'), ] return [ {'type': 'switch-status'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error') + fuc.FefferyFancyMessage('修改失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('user-delete-text', 'children'), - Output('user-delete-confirm-modal', 'visible'), - Output('user-delete-ids-store', 'data')], - [Input({'type': 'user-operation-button', 'index': ALL}, 'nClicks'), - Input('user-list-table', 'nClicksDropdownItem')], - [State('user-list-table', 'selectedRowKeys'), - State('user-list-table', 'recentlyClickedDropdownItemTitle'), - State('user-list-table', 'recentlyDropdownItemClickedRow')], - prevent_initial_call=True + [ + Output('user-delete-text', 'children'), + Output('user-delete-confirm-modal', 'visible'), + Output('user-delete-ids-store', 'data'), + ], + [ + Input({'type': 'user-operation-button', 'index': ALL}, 'nClicks'), + Input('user-list-table', 'nClicksDropdownItem'), + ], + [ + State('user-list-table', 'selectedRowKeys'), + State('user-list-table', 'recentlyClickedDropdownItemTitle'), + State('user-list-table', 'recentlyDropdownItemClickedRow'), + ], + prevent_initial_call=True, ) -def user_delete_modal(operation_click, dropdown_click, - selected_row_keys, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row): +def user_delete_modal( + operation_click, + dropdown_click, + selected_row_keys, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, +): """ 显示删除用户二次确认弹窗回调 """ trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'delete', 'type': 'user-operation-button'} or (trigger_id == 'user-list-table' and recently_clicked_dropdown_item_title == '删除'): - + if trigger_id == {'index': 'delete', 'type': 'user-operation-button'} or ( + trigger_id == 'user-list-table' + and recently_clicked_dropdown_item_title == '删除' + ): if trigger_id == {'index': 'delete', 'type': 'user-operation-button'}: user_ids = ','.join(selected_row_keys) else: @@ -587,54 +779,63 @@ def user_delete_modal(operation_click, dropdown_click, return [ f'是否确认删除用户编号为{user_ids}的用户?', True, - {'user_ids': user_ids} + user_ids, ] raise PreventUpdate @app.callback( - [Output('user-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('user-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('user-delete-confirm-modal', 'okCounts'), State('user-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def user_delete_confirm(delete_confirm, user_ids_data): """ 删除用户弹窗确认回调,实现删除操作 """ if delete_confirm: - params = user_ids_data - delete_button_info = delete_user_api(params) + delete_button_info = UserApi.del_user(params) if delete_button_info['code'] == 200: return [ {'type': 'delete'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') + fuc.FefferyFancyMessage('删除成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') + fuc.FefferyFancyMessage('删除失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('user-reset-password-confirm-modal', 'visible'), - Output('reset-password-row-key-store', 'data'), - Output('reset-password-input', 'value')], + [ + Output('user-reset-password-confirm-modal', 'visible'), + Output('reset-password-row-key-store', 'data'), + Output('reset-password-input', 'value'), + ], Input('user-list-table', 'nClicksDropdownItem'), - [State('user-list-table', 'recentlyClickedDropdownItemTitle'), - State('user-list-table', 'recentlyDropdownItemClickedRow')], - prevent_initial_call=True + [ + State('user-list-table', 'recentlyClickedDropdownItemTitle'), + State('user-list-table', 'recentlyDropdownItemClickedRow'), + ], + prevent_initial_call=True, ) -def user_reset_password_modal(dropdown_click, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row): +def user_reset_password_modal( + dropdown_click, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, +): """ 显示重置用户密码弹窗回调 """ @@ -644,69 +845,82 @@ def user_reset_password_modal(dropdown_click, recently_clicked_dropdown_item_tit else: raise PreventUpdate - return [ - True, - {'user_id': user_id}, - None - ] + return [True, user_id, None] raise PreventUpdate @app.callback( - [Output('user-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('user-operations-store', 'data', allow_duplicate=True), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('user-reset-password-confirm-modal', 'okCounts'), - [State('reset-password-row-key-store', 'data'), - State('reset-password-input', 'value')], - prevent_initial_call=True + [ + State('reset-password-row-key-store', 'data'), + State('reset-password-input', 'value'), + ], + prevent_initial_call=True, ) def user_reset_password_confirm(reset_confirm, user_id_data, reset_password): """ 重置用户密码弹窗确认回调,实现重置密码操作 """ if reset_confirm: - - user_id_data['password'] = reset_password - params = user_id_data - reset_button_info = reset_user_password_api(params) + reset_button_info = UserApi.reset_user_pwd( + user_id=user_id_data, password=reset_password + ) if reset_button_info['code'] == 200: return [ {'type': 'reset-password'}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('重置成功', type='success') + fuc.FefferyFancyMessage('重置成功', type='success'), ] return [ dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('重置失败', type='error') + fuc.FefferyFancyMessage('重置失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('user_to_allocated_role-modal', 'visible'), - Output({'type': 'allocate_role-search', 'index': 'allocated'}, 'nClicks'), - Output('allocate_role-user_id-container', 'data')], + [ + Output('user_to_allocated_role-modal', 'visible'), + Output( + {'type': 'allocate_role-search', 'index': 'allocated'}, 'nClicks' + ), + Output('allocate_role-user_id-container', 'data'), + ], Input('user-list-table', 'nClicksDropdownItem'), - [State('user-list-table', 'recentlyClickedDropdownItemTitle'), - State('user-list-table', 'recentlyDropdownItemClickedRow'), - State({'type': 'allocate_role-search', 'index': 'allocated'}, 'nClicks')], - prevent_initial_call=True + [ + State('user-list-table', 'recentlyClickedDropdownItemTitle'), + State('user-list-table', 'recentlyDropdownItemClickedRow'), + State( + {'type': 'allocate_role-search', 'index': 'allocated'}, 'nClicks' + ), + ], + prevent_initial_call=True, ) -def role_to_allocated_user_modal(dropdown_click, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row, allocated_role_search_nclick): +def role_to_allocated_user_modal( + dropdown_click, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, + allocated_role_search_nclick, +): """ 显示用户分配角色弹窗回调 """ if dropdown_click and recently_clicked_dropdown_item_title == '分配角色': - return [ True, - allocated_role_search_nclick + 1 if allocated_role_search_nclick else 1, - recently_dropdown_item_clicked_row['key'] + allocated_role_search_nclick + 1 + if allocated_role_search_nclick + else 1, + recently_dropdown_item_clicked_row['key'], ] raise PreventUpdate @@ -714,7 +928,7 @@ def role_to_allocated_user_modal(dropdown_click, recently_clicked_dropdown_item_ # 显示用户导入弹窗及重置上传弹窗组件状态回调 app.clientside_callback( - ''' + """ (nClicks) => { if (nClicks) { return [ @@ -731,13 +945,15 @@ app.clientside_callback( window.dash_clientside.no_update ]; } - ''', - [Output('user-import-confirm-modal', 'visible'), - Output('user-upload-choose', 'listUploadTaskRecord'), - Output('user-upload-choose', 'defaultFileList'), - Output('user-import-update-check', 'checked')], + """, + [ + Output('user-import-confirm-modal', 'visible'), + Output('user-upload-choose', 'listUploadTaskRecord'), + Output('user-upload-choose', 'defaultFileList'), + Output('user-import-update-check', 'checked'), + ], Input('user-import', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) @@ -746,45 +962,58 @@ app.clientside_callback( confirm_loading=Output('user-import-confirm-modal', 'confirmLoading'), modal_visible=Output('batch-result-modal', 'visible'), batch_result=Output('batch-result-content', 'children'), - operations=Output('user-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - import_confirm=Input('user-import-confirm-modal', 'okCounts') + operations=Output( + 'user-operations-store', 'data', allow_duplicate=True + ), + api_check_token_trigger=Output( + 'api-check-token', 'data', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(import_confirm=Input('user-import-confirm-modal', 'okCounts')), state=dict( - list_upload_task_record=State('user-upload-choose', 'listUploadTaskRecord'), - is_update=State('user-import-update-check', 'checked') + contents=State('user-upload-choose', 'contents'), + is_update=State('user-import-update-check', 'checked'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def user_import_confirm(import_confirm, list_upload_task_record, is_update): +def user_import_confirm(import_confirm, contents, is_update): """ 用户导入弹窗确认回调,实现批量导入用户操作 """ if import_confirm: - if list_upload_task_record: - url = list_upload_task_record[-1].get('url') - batch_param = dict(url=url, is_update=is_update) - batch_import_result = batch_import_user_api(batch_param) + if contents: + # url = list_upload_task_record[-1].get('url') + # batch_param = dict(url=url, is_update=is_update) + batch_import_result = UserApi.import_user( + file=BytesIO(base64.b64decode(contents.split(',', 1)[1])), + update_support=is_update, + ) if batch_import_result.get('code') == 200: return dict( confirm_loading=False, - modal_visible=True if batch_import_result.get('message') else False, - batch_result=batch_import_result.get('message'), + modal_visible=True + if batch_import_result.get('msg') + else False, + batch_result=batch_import_result.get('msg'), operations={'type': 'batch-import'}, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('导入成功', type='success') + global_message_container=fuc.FefferyFancyMessage( + '导入成功', type='success' + ), ) return dict( confirm_loading=False, modal_visible=True, - batch_result=batch_import_result.get('message'), + batch_result=batch_import_result.get('msg'), operations=dash.no_update, api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('导入失败', type='error') + global_message_container=fuc.FefferyFancyMessage( + '导入失败', type='error' + ), ) else: return dict( @@ -793,20 +1022,26 @@ def user_import_confirm(import_confirm, list_upload_task_record, is_update): batch_result=dash.no_update, operations=dash.no_update, api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('请上传需要导入的文件', type='error') + global_message_container=fuc.FefferyFancyMessage( + '请上传需要导入的文件', type='error' + ), ) raise PreventUpdate @app.callback( - [Output('user-export-container', 'data', allow_duplicate=True), - Output('user-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], - [Input('user-export', 'nClicks'), - Input('download-user-import-template', 'nClicks')], - prevent_initial_call=True + [ + Output('user-export-container', 'data', allow_duplicate=True), + Output('user-export-complete-judge-container', 'data'), + Output('api-check-token', 'data', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], + [ + Input('user-export', 'nClicks'), + Input('download-user-import-template', 'nClicks'), + ], + prevent_initial_call=True, ) def export_user_list(export_click, download_click): """ @@ -814,43 +1049,48 @@ def export_user_list(export_click, download_click): """ trigger_id = dash.ctx.triggered_id if export_click or download_click: - if trigger_id == 'user-export': - export_user_res = export_user_list_api({}) + export_user_res = UserApi.export_user({}) if export_user_res.status_code == 200: export_user = export_user_res.content return [ - dcc.send_bytes(export_user, f'用户信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + export_user, + f'用户信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') + fuc.FefferyFancyMessage('导出成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') + fuc.FefferyFancyMessage('导出失败', type='error'), ] if trigger_id == 'download-user-import-template': - download_template_res = download_user_import_template_api() + download_template_res = UserApi.download_template() if download_template_res.status_code == 200: download_template = download_template_res.content return [ - dcc.send_bytes(download_template, f'用户导入模板_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), + dcc.send_bytes( + download_template, + f'用户导入模板_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('下载成功', type='success') + fuc.FefferyFancyMessage('下载成功', type='success'), ] return [ dash.no_update, dash.no_update, {'timestamp': time.time()}, - fuc.FefferyFancyMessage('下载失败', type='error') + fuc.FefferyFancyMessage('下载失败', type='error'), ] raise PreventUpdate @@ -859,7 +1099,7 @@ def export_user_list(export_click, download_click): @app.callback( Output('user-export-container', 'data', allow_duplicate=True), Input('user-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_user_export_status(data): """ @@ -867,7 +1107,6 @@ def reset_user_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 934d9b6..3380f48 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -2,20 +2,19 @@ from dash import dcc, html import feffery_antd_components as fac from flask import session -from . import profile, allocate_role -from api.user import get_user_list_api -from api.dept import get_dept_tree_api +from . import allocate_role +from api.system.user import UserApi +from utils.permission_util import PermissionManager from config.global_config import ApiBaseUrlConfig -import callbacks.system_c.user_c.user_c +import callbacks.system_c.user_c.user_c # noqa: F401 def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - dept_params = dict(dept_name='') user_params = dict(page_num=1, page_size=10) - tree_info = get_dept_tree_api(dept_params) - table_info = get_user_list_api(user_params) + tree_info = UserApi.dept_tree_select() + table_info = UserApi.list_user(user_params) tree_data = [] table_data = [] page_num = 1 @@ -24,36 +23,36 @@ def render(*args, **kwargs): if tree_info['code'] == 200: tree_data = tree_info['data'] if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] for item in table_data: if item['status'] == '0': - item['status'] = dict(checked=True, disabled=item['user_id'] == 1) + item['status'] = dict( + checked=True, disabled=item['user_id'] == 1 + ) else: - item['status'] = dict(checked=False, disabled=item['user_id'] == 1) + item['status'] = dict( + checked=False, disabled=item['user_id'] == 1 + ) item['key'] = str(item['user_id']) if item['user_id'] == 1: item['operation'] = [] else: item['operation'] = [ - { - 'title': '修改', - 'icon': 'antd-edit' - } if 'system:user:edit' in button_perms else None, - { - 'title': '删除', - 'icon': 'antd-delete' - } if 'system:user:remove' in button_perms else None, - { - 'title': '重置密码', - 'icon': 'antd-key' - } if 'system:user:resetPwd' in button_perms else None, - { - 'title': '分配角色', - 'icon': 'antd-check-circle' - } if 'system:user:edit' in button_perms else None + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:user:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:user:remove') + else None, + {'title': '重置密码', 'icon': 'antd-key'} + if PermissionManager.check_perms('system:user:resetPwd') + else None, + {'title': '分配角色', 'icon': 'antd-check-circle'} + if PermissionManager.check_perms('system:user:edit') + else None, ] return [ @@ -77,24 +76,18 @@ def render(*args, **kwargs): placeholder='请输入部门名称', autoComplete='off', allowClear=True, - prefix=fac.AntdIcon( - icon='antd-search' - ), - style={ - 'width': '85%' - } + prefix=fac.AntdIcon(icon='antd-search'), + style={'width': '85%'}, ), fac.AntdTree( id='dept-tree', treeData=tree_data, defaultExpandAll=True, showLine=False, - style={ - 'margin-top': '10px' - } - ) + style={'margin-top': '10px'}, + ), ], - span=4 + span=4, ), fac.AntdCol( [ @@ -115,9 +108,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), - label='用户名称' + label='用户名称', ), fac.AntdFormItem( fac.AntdInput( @@ -127,9 +120,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 240 - } + }, ), - label='手机号码' + label='手机号码', ), fac.AntdFormItem( fac.AntdSelect( @@ -138,23 +131,23 @@ def render(*args, **kwargs): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '停用', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 240 - } + }, ), - label='用户状态' + label='用户状态', ), ], style={ 'paddingBottom': '10px' - } + }, ), fac.AntdSpace( [ @@ -163,9 +156,9 @@ def render(*args, **kwargs): id='user-create_time-range', style={ 'width': 240 - } + }, ), - label='创建时间' + label='创建时间', ), fac.AntdFormItem( fac.AntdButton( @@ -174,7 +167,7 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ) ), fac.AntdFormItem( @@ -183,20 +176,20 @@ def render(*args, **kwargs): id='user-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ) - ) + ), ], style={ 'paddingBottom': '10px' - } + }, ), ], layout='inline', ) ], id='user-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -217,9 +210,13 @@ def render(*args, **kwargs): style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:user:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'system:user:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -229,15 +226,19 @@ def render(*args, **kwargs): ], id={ 'type': 'user-operation-button', - 'index': 'edit' + 'index': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', - 'border-color': '#d0f5e0' - } - ) if 'system:user:edit' in button_perms else [], + 'border-color': '#d0f5e0', + }, + ) + if PermissionManager.check_perms( + 'system:user:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -247,15 +248,19 @@ def render(*args, **kwargs): ], id={ 'type': 'user-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:user:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:user:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -267,9 +272,13 @@ def render(*args, **kwargs): style={ 'color': '#909399', 'background': '#f4f4f5', - 'border-color': '#d3d4d6' - } - ) if 'system:user:export' in button_perms else [], + 'border-color': '#d3d4d6', + }, + ) + if PermissionManager.check_perms( + 'system:user:import' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -281,15 +290,17 @@ def render(*args, **kwargs): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'system:user:import' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'system:user:export' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -303,10 +314,10 @@ def render(*args, **kwargs): ), ], id='user-hidden', - shape='circle' + shape='circle', ), id='user-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -318,24 +329,22 @@ def render(*args, **kwargs): ), ], id='user-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -408,9 +417,9 @@ def render(*args, **kwargs): 'renderType': 'dropdown', 'dropdownProps': { 'title': '更多' - } + }, }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -419,28 +428,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'paddingRight': '10px' - } + 'paddingRight': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=20 - ) + span=20, + ), ], - gutter=5 + gutter=5, ), - # 新增用户表单modal fac.AntdModal( [ @@ -452,47 +465,41 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'user_add-form-value', - 'index': 'nick_name' + 'index': 'nick_name', }, placeholder='请输入用户昵称', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户昵称', required=True, id={ 'type': 'user_add-form-label', 'index': 'nick_name', - 'required': True - } + 'required': True, + }, ), fac.AntdFormItem( fac.AntdTreeSelect( id={ 'type': 'user_add-form-value', - 'index': 'dept_id' + 'index': 'dept_id', }, placeholder='请选择归属部门', treeData=[], treeNodeFilterProp='title', - style={ - 'width': 200 - } + style={'width': 200}, ), label='归属部门', id={ 'type': 'user_add-form-label', 'index': 'dept_id', - 'required': False - }, - labelCol={ - 'offset': 1 + 'required': False, }, + labelCol={'offset': 1}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -500,48 +507,40 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'user_add-form-value', - 'index': 'phonenumber' + 'index': 'phonenumber', }, placeholder='请输入手机号码', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='手机号码', id={ 'type': 'user_add-form-label', 'index': 'phonenumber', - 'required': False - }, - labelCol={ - 'offset': 1 + 'required': False, }, + labelCol={'offset': 1}, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'user_add-form-value', - 'index': 'email' + 'index': 'email', }, placeholder='请输入邮箱', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='邮箱', id={ 'type': 'user_add-form-label', 'index': 'email', - 'required': False - }, - labelCol={ - 'offset': 5 + 'required': False, }, + labelCol={'offset': 5}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -549,45 +548,41 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'user_add-form-value', - 'index': 'user_name' + 'index': 'user_name', }, placeholder='请输入用户名称', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户名称', required=True, id={ 'type': 'user_add-form-label', 'index': 'user_name', - 'required': True - } + 'required': True, + }, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'user_add-form-value', - 'index': 'password' + 'index': 'password', }, placeholder='请输入密码', mode='password', passwordUseMd5=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户密码', required=True, id={ 'type': 'user_add-form-label', 'index': 'password', - 'required': True - } + 'required': True, + }, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -595,70 +590,47 @@ def render(*args, **kwargs): fac.AntdSelect( id={ 'type': 'user_add-form-value', - 'index': 'sex' + 'index': 'sex', }, placeholder='请选择性别', options=[ - { - 'label': '男', - 'value': '0' - }, - { - 'label': '女', - 'value': '1' - }, - { - 'label': '未知', - 'value': '2' - }, + {'label': '男', 'value': '0'}, + {'label': '女', 'value': '1'}, + {'label': '未知', 'value': '2'}, ], - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户性别', id={ 'type': 'user_add-form-label', 'index': 'sex', - 'required': False - }, - labelCol={ - 'offset': 1 + 'required': False, }, + labelCol={'offset': 1}, ), fac.AntdFormItem( fac.AntdRadioGroup( id={ 'type': 'user_add-form-value', - 'index': 'status' + 'index': 'status', }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '停用', 'value': '1'}, ], defaultValue='0', - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户状态', id={ 'type': 'user_add-form-label', 'index': 'status', - 'required': False + 'required': False, }, - labelCol={ - 'offset': 2 - }, - ) + labelCol={'offset': 2}, + ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -669,15 +641,11 @@ def render(*args, **kwargs): options=[], mode='multiple', optionFilterProp='label', - style={ - 'width': 200 - } + style={'width': 200}, ), label='岗位', id='user-add-post-form-item', - labelCol={ - 'offset': 4 - }, + labelCol={'offset': 4}, ), fac.AntdFormItem( fac.AntdSelect( @@ -686,18 +654,14 @@ def render(*args, **kwargs): options=[], mode='multiple', optionFilterProp='label', - style={ - 'width': 200 - } + style={'width': 200}, ), label='角色', id='user-add-role-form-item', - labelCol={ - 'offset': 8 - }, + labelCol={'offset': 8}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -705,27 +669,23 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'user_add-form-value', - 'index': 'remark' + 'index': 'remark', }, placeholder='请输入内容', allowClear=True, mode='text-area', - style={ - 'width': 490 - } + style={'width': 490}, ), label='备注', id={ 'type': 'user_add-form-label', 'index': 'remark', - 'required': False - }, - labelCol={ - 'offset': 2 + 'required': False, }, + labelCol={'offset': 2}, ), ] - ) + ), ] ) ], @@ -734,9 +694,8 @@ def render(*args, **kwargs): mask=False, width=650, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 编辑用户表单modal fac.AntdModal( [ @@ -748,44 +707,40 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'user_edit-form-value', - 'index': 'nick_name' + 'index': 'nick_name', }, placeholder='请输入用户昵称', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户昵称', required=True, id={ 'type': 'user_edit-form-label', 'index': 'nick_name', - 'required': True - } + 'required': True, + }, ), fac.AntdFormItem( fac.AntdTreeSelect( id={ 'type': 'user_edit-form-value', - 'index': 'dept_id' + 'index': 'dept_id', }, placeholder='请选择归属部门', treeData=[], treeNodeFilterProp='title', - style={ - 'width': 200 - } + style={'width': 200}, ), label='归属部门', id={ 'type': 'user_edit-form-label', 'index': 'dept_id', - 'required': False - } + 'required': False, + }, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -793,48 +748,40 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'user_edit-form-value', - 'index': 'phonenumber' + 'index': 'phonenumber', }, placeholder='请输入手机号码', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='手机号码', id={ 'type': 'user_edit-form-label', 'index': 'phonenumber', - 'required': False - }, - labelCol={ - 'offset': 1 + 'required': False, }, + labelCol={'offset': 1}, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'user_edit-form-value', - 'index': 'email' + 'index': 'email', }, placeholder='请输入邮箱', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label='邮箱', id={ 'type': 'user_edit-form-label', 'index': 'email', - 'required': False - }, - labelCol={ - 'offset': 4 + 'required': False, }, + labelCol={'offset': 4}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -842,69 +789,46 @@ def render(*args, **kwargs): fac.AntdSelect( id={ 'type': 'user_edit-form-value', - 'index': 'sex' + 'index': 'sex', }, placeholder='请选择性别', options=[ - { - 'label': '男', - 'value': '0' - }, - { - 'label': '女', - 'value': '1' - }, - { - 'label': '未知', - 'value': '2' - }, + {'label': '男', 'value': '0'}, + {'label': '女', 'value': '1'}, + {'label': '未知', 'value': '2'}, ], - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户性别', id={ 'type': 'user_edit-form-label', 'index': 'sex', - 'required': False - }, - labelCol={ - 'offset': 1 + 'required': False, }, + labelCol={'offset': 1}, ), fac.AntdFormItem( fac.AntdRadioGroup( id={ 'type': 'user_edit-form-value', - 'index': 'status' + 'index': 'status', }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '停用', 'value': '1'}, ], - style={ - 'width': 200 - } + style={'width': 200}, ), label='用户状态', id={ 'type': 'user_edit-form-label', 'index': 'status', - 'required': False - }, - labelCol={ - 'offset': 1 + 'required': False, }, - ) + labelCol={'offset': 1}, + ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -915,15 +839,11 @@ def render(*args, **kwargs): options=[], mode='multiple', optionFilterProp='label', - style={ - 'width': 200 - } + style={'width': 200}, ), label='岗位', id='user-edit-post-form-item', - labelCol={ - 'offset': 4 - }, + labelCol={'offset': 4}, ), fac.AntdFormItem( fac.AntdSelect( @@ -932,18 +852,14 @@ def render(*args, **kwargs): options=[], mode='multiple', optionFilterProp='label', - style={ - 'width': 200 - } + style={'width': 200}, ), label='角色', id='user-edit-role-form-item', - labelCol={ - 'offset': 7 - }, + labelCol={'offset': 7}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -951,27 +867,23 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'user_edit-form-value', - 'index': 'remark' + 'index': 'remark', }, placeholder='请输入内容', allowClear=True, mode='text-area', - style={ - 'width': 485 - } + style={'width': 485}, ), label='备注', id={ 'type': 'user_edit-form-label', 'index': 'remark', - 'required': False - }, - labelCol={ - 'offset': 2 + 'required': False, }, + labelCol={'offset': 2}, ), ] - ) + ), ] ) ], @@ -980,9 +892,8 @@ def render(*args, **kwargs): mask=False, width=650, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除用户二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='user-delete-text'), @@ -990,46 +901,74 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), - # 用户导入modal fac.AntdModal( [ html.Div( - fac.AntdDraggerUpload( + dcc.Upload( + html.Span( + html.Div( + html.Span( + html.Div( + [ + html.P( + fac.AntdIcon( + icon='antd-cloud-upload' + ), + className='ant-upload-drag-icon', + ), + html.P( + fac.AntdText('用户导入'), + className='ant-upload-text', + ), + html.P( + fac.AntdText( + '点击或拖拽文件至此处进行上传' + ), + className='ant-upload-hint', + ), + ], + className='ant-upload-drag-container', + ), + tabIndex='0', + role='button', + className='ant-upload ant-upload-btn', + ), + className='css-1gwfwyx ant-upload ant-upload-drag', + ), + className='ant-upload-wrapper css-1gwfwyx', + ), id='user-upload-choose', - apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', - apiUrlExtraParams={'taskPath': 'userUpload'}, - downloadUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/caches', - downloadUrlExtraParams={'taskPath': 'userUpload', 'token': session.get('Authorization')}, - headers={'Authorization': 'Bearer ' + session.get('Authorization')}, - fileTypes=['xls', 'xlsx'], - fileListMaxLength=1, - text='用户导入', - hint='点击或拖拽文件至此处进行上传' + accept='.xls,.xlsx', ), - style={ - 'marginTop': '10px' - } + # fac.AntdDraggerUpload( + # id='user-upload-choose', + # apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', + # downloadUrlFromBackend=True, + # headers={ + # 'Authorization': 'Bearer ' + # + session.get('Authorization') + # }, + # fileTypes=['xls', 'xlsx'], + # fileListMaxLength=1, + # text='用户导入', + # hint='点击或拖拽文件至此处进行上传', + # ), + style={'marginTop': '10px'}, ), html.Div( [ fac.AntdCheckbox( - id='user-import-update-check', - checked=False + id='user-import-update-check', checked=False ), fac.AntdText( '是否更新已经存在的用户数据', - style={ - 'marginLeft': '5px' - } - ) + style={'marginLeft': '5px'}, + ), ], - style={ - 'textAlign': 'center', - 'marginTop': '10px' - } + style={'textAlign': 'center', 'marginTop': '10px'}, ), html.Div( [ @@ -1037,14 +976,11 @@ def render(*args, **kwargs): fac.AntdButton( '下载模板', id='download-user-import-template', - type='link' - ) + type='link', + ), ], - style={ - 'textAlign': 'center', - 'marginTop': '10px' - } - ) + style={'textAlign': 'center', 'marginTop': '10px'}, + ), ], id='user-import-confirm-modal', visible=False, @@ -1055,23 +991,19 @@ def render(*args, **kwargs): okText='导入', confirmAutoSpin=True, loadingOkText='导入中', - okClickClose=False + okClickClose=False, ), - fac.AntdModal( fac.AntdText( id='batch-result-content', - className={ - 'whiteSpace': 'break-spaces' - } + className={'whiteSpace': 'break-spaces'}, ), id='batch-result-modal', visible=False, title='用户导入结果', renderFooter=False, - centered=True + centered=True, ), - # 重置密码modal fac.AntdModal( [ @@ -1079,23 +1011,21 @@ def render(*args, **kwargs): [ fac.AntdFormItem( fac.AntdInput( - id='reset-password-input', - mode='password' + id='reset-password-input', mode='password' ), - label='请输入新密码' + label='请输入新密码', ), ], - layout='vertical' + layout='vertical', ), - dcc.Store(id='reset-password-row-key-store') + dcc.Store(id='reset-password-row-key-store'), ], id='user-reset-password-confirm-modal', visible=False, title='重置密码', renderFooter=True, - centered=True + centered=True, ), - # 分配角色modal fac.AntdModal( allocate_role.render(button_perms), @@ -1105,6 +1035,6 @@ def render(*args, **kwargs): maskClosable=False, width=1000, renderFooter=False, - okClickClose=False - ) + okClickClose=False, + ), ] diff --git a/dash-fastapi-frontend/views/system/user/allocate_role.py b/dash-fastapi-frontend/views/system/user/allocate_role.py index 0b3f60f..e42399d 100644 --- a/dash-fastapi-frontend/views/system/user/allocate_role.py +++ b/dash-fastapi-frontend/views/system/user/allocate_role.py @@ -1,32 +1,42 @@ -from dash import dcc, html +from dash import dcc import feffery_antd_components as fac from .component import query_form_table -import callbacks.system_c.user_c.allocate_role_c +import callbacks.system_c.user_c.allocate_role_c # noqa: F401 def render(button_perms): - return [ dcc.Store(id='allocate_role-button-perms-container', data=button_perms), dcc.Store(id='allocate_role-user_id-container'), # 分配角色模块操作类型存储容器 - dcc.Store(id={ - 'type': 'allocate_role-operations-container', - 'index': 'allocated' - }), - dcc.Store(id={ - 'type': 'allocate_role-operations-container', - 'index': 'unallocated' - }), + dcc.Store( + id={ + 'type': 'allocate_role-operations-container', + 'index': 'allocated', + } + ), + dcc.Store( + id={ + 'type': 'allocate_role-operations-container', + 'index': 'unallocated', + } + ), # 分配角色模块删除操作行key存储容器 dcc.Store(id='allocate_role-delete-ids-store'), - query_form_table.render(button_perms=button_perms, allocate_index='allocated', is_operation=True), - + query_form_table.render( + button_perms=button_perms, + allocate_index='allocated', + is_operation=True, + ), # 添加用户表单modal fac.AntdModal( [ - query_form_table.render(button_perms=button_perms, allocate_index='unallocated', is_operation=False), + query_form_table.render( + button_perms=button_perms, + allocate_index='unallocated', + is_operation=False, + ), ], id='allocate_role-modal', title='选择角色', @@ -34,15 +44,14 @@ def render(button_perms): maskClosable=False, width=900, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 取消授权二次确认modal fac.AntdModal( fac.AntdText('是否确认取消授权?', id='allocate_role-delete-text'), id='allocate_role-delete-confirm-modal', visible=False, title='提示', - renderFooter=True + renderFooter=True, ), ] diff --git a/dash-fastapi-frontend/views/system/user/component/query_form_table.py b/dash-fastapi-frontend/views/system/user/component/query_form_table.py index 7a74b13..3d606f8 100644 --- a/dash-fastapi-frontend/views/system/user/component/query_form_table.py +++ b/dash-fastapi-frontend/views/system/user/component/query_form_table.py @@ -1,6 +1,8 @@ from dash import html import feffery_antd_components as fac +from utils.permission_util import PermissionManager + def render(button_perms, allocate_index, is_operation): table_column = [ @@ -12,37 +14,27 @@ def render(button_perms, allocate_index, is_operation): { 'dataIndex': 'role_name', 'title': '角色名称', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, { 'dataIndex': 'role_key', 'title': '权限字符', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, { 'dataIndex': 'role_sort', 'title': '显示顺序', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, { 'dataIndex': 'status', 'title': '状态', - 'renderOptions': { - 'renderType': 'tags' - }, + 'renderOptions': {'renderType': 'tags'}, }, { 'dataIndex': 'create_time', 'title': '创建时间', - 'renderOptions': { - 'renderType': 'ellipsis' - }, + 'renderOptions': {'renderType': 'ellipsis'}, }, ] @@ -53,231 +45,242 @@ def render(button_perms, allocate_index, is_operation): 'dataIndex': 'operation', 'fixed': 'right', 'width': 150, - 'renderOptions': { - 'renderType': 'button' - }, + 'renderOptions': {'renderType': 'button'}, } ) return fac.AntdRow( - [ - fac.AntdCol( - [ - fac.AntdRow( - [ - fac.AntdCol( - html.Div( - [ - fac.AntdForm( - [ - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'allocate_role-role_name-input', - 'index': allocate_index - }, - placeholder='请输入角色名称', - autoComplete='off', - allowClear=True, - style={ - 'width': 240 - } - ), - label='角色名称', - style={'paddingBottom': '10px'}, - ), - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'allocate_role-role_key-input', - 'index': allocate_index - }, - placeholder='请输入权限字符', - autoComplete='off', - allowClear=True, - style={ - 'width': 240 - } - ), - label='权限字符', - style={'paddingBottom': '10px'}, - ), - fac.AntdFormItem( - fac.AntdButton( - '搜索', - id={ - 'type': 'allocate_role-search', - 'index': allocate_index - }, - type='primary', - icon=fac.AntdIcon( - icon='antd-search' - ) - ), - style={'paddingBottom': '10px'}, - ), - fac.AntdFormItem( - fac.AntdButton( - '重置', - id={ - 'type': 'allocate_role-reset', - 'index': allocate_index - }, - icon=fac.AntdIcon( - icon='antd-sync' - ) - ), - style={'paddingBottom': '10px'}, - ) - ], - layout='inline', - ) - ], - id={ - 'type': 'allocate_role-search-form-container', - 'index': allocate_index - }, - hidden=False - ), - ) - ] - ), - fac.AntdRow( - [ - fac.AntdCol( - fac.AntdSpace( - [ - fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-plus' + [ + fac.AntdCol( + [ + fac.AntdRow( + [ + fac.AntdCol( + html.Div( + [ + fac.AntdForm( + [ + fac.AntdFormItem( + fac.AntdInput( + id={ + 'type': 'allocate_role-role_name-input', + 'index': allocate_index, + }, + placeholder='请输入角色名称', + autoComplete='off', + allowClear=True, + style={'width': 240}, ), - '添加角色', - ], - id='allocate_role-add', - style={ - 'color': '#1890ff', - 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'system:user:edit' in button_perms else [], - fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-close-circle' + label='角色名称', + style={ + 'paddingBottom': '10px' + }, + ), + fac.AntdFormItem( + fac.AntdInput( + id={ + 'type': 'allocate_role-role_key-input', + 'index': allocate_index, + }, + placeholder='请输入权限字符', + autoComplete='off', + allowClear=True, + style={'width': 240}, ), - '批量取消授权', - ], - id={ - 'type': 'allocate_role-operation-button', - 'index': 'delete' - }, - disabled=True, - style={ - 'color': '#ff9292', - 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'system:user:edit' in button_perms else [], - ], - style={ - 'paddingBottom': '10px' - } - ), - span=16 - ) if is_operation else [], - fac.AntdCol( - fac.AntdSpace( - [ - html.Div( - fac.AntdTooltip( + label='权限字符', + style={ + 'paddingBottom': '10px' + }, + ), + fac.AntdFormItem( fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-search' - ), - ], + '搜索', id={ - 'type': 'allocate_role-hidden', - 'index': allocate_index + 'type': 'allocate_role-search', + 'index': allocate_index, }, - shape='circle' + type='primary', + icon=fac.AntdIcon( + icon='antd-search' + ), ), - id={ - 'type': 'allocate_role-hidden-tooltip', - 'index': allocate_index + style={ + 'paddingBottom': '10px' }, - title='隐藏搜索' - ) - ), - html.Div( - fac.AntdTooltip( + ), + fac.AntdFormItem( fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-sync' - ), - ], + '重置', id={ - 'type': 'allocate_role-refresh', - 'index': allocate_index + 'type': 'allocate_role-reset', + 'index': allocate_index, }, - shape='circle' + icon=fac.AntdIcon( + icon='antd-sync' + ), ), - title='刷新' - ) - ), - ], - style={ - 'float': 'right', - 'paddingBottom': '10px' - } - ), - span=8 if is_operation else 24, - style={ - 'paddingRight': '10px' - } - ) - ], - gutter=5 - ), - fac.AntdRow( - [ - fac.AntdCol( - fac.AntdSpin( - fac.AntdTable( - id={ - 'type': 'allocate_role-list-table', - 'index': allocate_index + style={ + 'paddingBottom': '10px' + }, + ), + ], + layout='inline', + ) + ], + id={ + 'type': 'allocate_role-search-form-container', + 'index': allocate_index, + }, + hidden=False, + ), + ) + ] + ), + fac.AntdRow( + [ + fac.AntdCol( + fac.AntdSpace( + [ + fac.AntdButton( + [ + fac.AntdIcon(icon='antd-plus'), + '添加角色', + ], + id='allocate_role-add', + style={ + 'color': '#1890ff', + 'background': '#e8f4ff', + 'border-color': '#a3d3ff', }, - data=[], - columns=table_column, - rowSelectionType='checkbox', - rowSelectionWidth=50, - bordered=True, - maxWidth=1000, - pagination={ - 'pageSize': 10, - 'current': 1, - 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], - 'showQuickJumper': True, - 'total': 0 + ) + if PermissionManager.check_perms( + 'system:user:edit' + ) + else [], + fac.AntdButton( + [ + fac.AntdIcon( + icon='antd-close-circle' + ), + '批量取消授权', + ], + id={ + 'type': 'allocate_role-operation-button', + 'index': 'delete', }, - mode='server-side', + disabled=True, style={ - 'width': '100%', - 'padding-right': '10px' - } + 'color': '#ff9292', + 'background': '#ffeded', + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'system:user:edit' + ) + else [], + ], + style={'paddingBottom': '10px'}, + ), + span=16, + ) + if is_operation + else [], + fac.AntdCol( + fac.AntdSpace( + [ + html.Div( + fac.AntdTooltip( + fac.AntdButton( + [ + fac.AntdIcon( + icon='antd-search' + ), + ], + id={ + 'type': 'allocate_role-hidden', + 'index': allocate_index, + }, + shape='circle', + ), + id={ + 'type': 'allocate_role-hidden-tooltip', + 'index': allocate_index, + }, + title='隐藏搜索', + ) ), - text='数据加载中' + html.Div( + fac.AntdTooltip( + fac.AntdButton( + [ + fac.AntdIcon( + icon='antd-sync' + ), + ], + id={ + 'type': 'allocate_role-refresh', + 'index': allocate_index, + }, + shape='circle', + ), + title='刷新', + ) + ), + ], + style={ + 'float': 'right', + 'paddingBottom': '10px', + }, + ), + span=8 if is_operation else 24, + style={'paddingRight': '10px'}, + ), + ], + gutter=5, + ), + fac.AntdRow( + [ + fac.AntdCol( + fac.AntdSpin( + fac.AntdTable( + id={ + 'type': 'allocate_role-list-table', + 'index': allocate_index, + }, + data=[], + columns=table_column, + rowSelectionType='checkbox', + rowSelectionWidth=50, + bordered=True, + maxWidth=1000, + pagination={ + 'pageSize': 10, + 'current': 1, + 'showSizeChanger': True, + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], + 'showQuickJumper': True, + 'total': 0, + }, + mode='server-side', + style={ + 'width': '100%', + 'padding-right': '10px', + }, ), - ) - ] - ), - ], - span=24 - ) - ], - gutter=5 - ) + text='数据加载中', + ), + ) + ] + ), + ], + span=24, + ) + ], + gutter=5, + ) -- Gitee From 04218b6ceee52644b20bab1e90937a67425ba743 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 4 Sep 2024 23:24:49 +0800 Subject: [PATCH 033/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/ManuallyUpload.py | 116 ++++++++++++++++++ .../views/components/__init__.py | 1 + .../views/system/user/__init__.py | 67 +++------- 3 files changed, 135 insertions(+), 49 deletions(-) create mode 100644 dash-fastapi-frontend/views/components/ManuallyUpload.py create mode 100644 dash-fastapi-frontend/views/components/__init__.py diff --git a/dash-fastapi-frontend/views/components/ManuallyUpload.py b/dash-fastapi-frontend/views/components/ManuallyUpload.py new file mode 100644 index 0000000..2337fbc --- /dev/null +++ b/dash-fastapi-frontend/views/components/ManuallyUpload.py @@ -0,0 +1,116 @@ +from dash import dcc, html +import feffery_antd_components as fac +import feffery_utils_components as fuc + + +class ManuallyUpload: + def __init__(self): + pass + + def render(self): + return fuc.FefferyShadowDom( + [ + dcc.Upload( + html.Div( + html.Span( + html.Div( + html.Span( + html.Div( + [ + html.P( + fac.AntdIcon( + icon='antd-cloud-upload', + ), + className='ant-upload-drag-icon', + ), + html.P( + '用户导入', + className='ant-upload-text', + ), + html.P( + '点击或拖拽文件至此处进行上传', + className='ant-upload-hint', + ), + ], + className='ant-upload-drag-container', + ), + tabIndex='0', + role='button', + className='ant-upload ant-upload-btn', + ), + className='ant-upload ant-upload-drag', + ), + className='ant-upload-wrapper', + ), + className='ant-droag-upload-container', + ), + id='user-upload-choose', + accept='.xls,.xlsx', + ), + fuc.FefferyStyle( + rawStyle=""" + .ant-droag-upload-container { + border: 1px solid transparent; + transition: border 0.3s; + } + .ant-upload-wrapper { + box-sizing: border-box; + margin: 0; + padding: 0; + color: rgba(0, 0, 0, 0.88); + font-size: 14px; + line-height: 1.5714285714285714; + list-style: none; + font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,'Noto Sans',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji'; + } + .ant-upload-wrapper .ant-upload-drag { + position: relative; + width: 100%; + height: 100%; + text-align: center; + background: rgba(0, 0, 0, 0.02); + border: 1px dashed #d9d9d9; + border-radius: 8px; + cursor: pointer; + transition: border-color 0.3s; + } + .ant-upload-wrapper .ant-upload-drag:not(.ant-upload-disabled):hover, .ant-upload-wrapper .ant-upload-drag-hover:not(.ant-upload-disabled) { + border-color: #4096ff; + } + .ant-upload-wrapper .ant-upload-drag .ant-upload-btn { + display: table; + width: 100%; + height: 100%; + outline: none; + border-radius: 8px; + } + .ant-upload-wrapper .ant-upload-drag .ant-upload { + padding: 16px; + } + .ant-upload-wrapper .ant-upload-drag .ant-upload-drag-container { + display: table-cell; + vertical-align: middle; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-drag-icon { + margin-bottom: 16px; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-drag-icon .anticon { + color: #1677ff; + font-size: 48px; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-text { + margin: 0 0 4px; + color: rgba(0, 0, 0, 0.88); + font-size: 16px; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-hint { + color: rgba(0, 0, 0, 0.45); + font-size: 14px; + } + .ant-upload-wrapper [class^="ant-upload"], .ant-upload-wrapper [class*=" ant-upload"] { + box-sizing: border-box; + } + """ + ), + ] + ) diff --git a/dash-fastapi-frontend/views/components/__init__.py b/dash-fastapi-frontend/views/components/__init__.py new file mode 100644 index 0000000..9889693 --- /dev/null +++ b/dash-fastapi-frontend/views/components/__init__.py @@ -0,0 +1 @@ +from .ManuallyUpload import ManuallyUpload # noqa: F401 diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 3380f48..b156252 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -1,8 +1,10 @@ from dash import dcc, html import feffery_antd_components as fac +import feffery_utils_components as fuc from flask import session from . import allocate_role +from views.components import ManuallyUpload from api.system.user import UserApi from utils.permission_util import PermissionManager from config.global_config import ApiBaseUrlConfig @@ -907,55 +909,22 @@ def render(*args, **kwargs): fac.AntdModal( [ html.Div( - dcc.Upload( - html.Span( - html.Div( - html.Span( - html.Div( - [ - html.P( - fac.AntdIcon( - icon='antd-cloud-upload' - ), - className='ant-upload-drag-icon', - ), - html.P( - fac.AntdText('用户导入'), - className='ant-upload-text', - ), - html.P( - fac.AntdText( - '点击或拖拽文件至此处进行上传' - ), - className='ant-upload-hint', - ), - ], - className='ant-upload-drag-container', - ), - tabIndex='0', - role='button', - className='ant-upload ant-upload-btn', - ), - className='css-1gwfwyx ant-upload ant-upload-drag', - ), - className='ant-upload-wrapper css-1gwfwyx', - ), - id='user-upload-choose', - accept='.xls,.xlsx', - ), - # fac.AntdDraggerUpload( - # id='user-upload-choose', - # apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', - # downloadUrlFromBackend=True, - # headers={ - # 'Authorization': 'Bearer ' - # + session.get('Authorization') - # }, - # fileTypes=['xls', 'xlsx'], - # fileListMaxLength=1, - # text='用户导入', - # hint='点击或拖拽文件至此处进行上传', - # ), + [ + ManuallyUpload().render(), + # fac.AntdDraggerUpload( + # id='user-upload-choose', + # apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', + # downloadUrlFromBackend=True, + # headers={ + # 'Authorization': 'Bearer ' + # + session.get('Authorization') + # }, + # fileTypes=['xls', 'xlsx'], + # fileListMaxLength=1, + # text='用户导入', + # hint='点击或拖拽文件至此处进行上传', + # ), + ], style={'marginTop': '10px'}, ), html.Div( -- Gitee From b511be586ed2021d624692a9d304a9b65312d6d9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 5 Sep 2024 17:34:10 +0800 Subject: [PATCH 034/229] =?UTF-8?q?feat:=20=E5=9F=BA=E4=BA=8Edash2.18?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/config/exception.py | 60 +++++++++++++++++++++++ dash-fastapi-frontend/server.py | 2 + 2 files changed, 62 insertions(+) create mode 100644 dash-fastapi-frontend/config/exception.py diff --git a/dash-fastapi-frontend/config/exception.py b/dash-fastapi-frontend/config/exception.py new file mode 100644 index 0000000..2472604 --- /dev/null +++ b/dash-fastapi-frontend/config/exception.py @@ -0,0 +1,60 @@ +from dash import set_props, ctx, no_update +from utils.feedback_util import MessageManager, NotificationManager + + +class AuthException(Exception): + """ + 自定义令牌异常AuthException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class RequestException(Exception): + """ + 自定义请求异常RequestException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class ServiceException(Exception): + """ + 自定义服务异常ServiceException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class ServiceWarning(Exception): + """ + 自定义服务警告ServiceWarning + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +def global_exception_handler(error): + print(error) + if isinstance(error, AuthException): + set_props('token-invalid-modal', {'visible': True}) + elif isinstance(error, RequestException): + NotificationManager.error(description=error.message) + elif isinstance(error, ServiceWarning): + MessageManager.warning(content=error.message) + elif isinstance(error, ServiceException): + MessageManager.error(content=error.message) + else: + NotificationManager.error(description=str(error)) + # dash2.18版本对输出为字典形式的回调进行异常处理会报错,临时采用此方法解决 + outputs_grouping = ctx.outputs_grouping + if isinstance(outputs_grouping, dict): + return {key: no_update for key, value in outputs_grouping.items()} diff --git a/dash-fastapi-frontend/server.py b/dash-fastapi-frontend/server.py index 7e4e88e..919dec8 100644 --- a/dash-fastapi-frontend/server.py +++ b/dash-fastapi-frontend/server.py @@ -5,6 +5,7 @@ from loguru import logger from flask import request, session from user_agents import parse from config.env import AppConfig +from config.exception import global_exception_handler from config.global_config import PathConfig app = dash.Dash( @@ -12,6 +13,7 @@ app = dash.Dash( compress=True, suppress_callback_exceptions=True, update_title=None, + on_error=global_exception_handler, ) server = app.server -- Gitee From f7c0cfe5a6ae1706e6cbc9d79271d02bc8ee5a0a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 5 Sep 2024 17:35:33 +0800 Subject: [PATCH 035/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E6=8F=90=E7=A4=BA=E5=92=8C=E9=80=9A=E7=9F=A5=E6=8F=90?= =?UTF-8?q?=E9=86=92=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/feedback_util.py | 492 +++++++++++++++++++ 1 file changed, 492 insertions(+) create mode 100644 dash-fastapi-frontend/utils/feedback_util.py diff --git a/dash-fastapi-frontend/utils/feedback_util.py b/dash-fastapi-frontend/utils/feedback_util.py new file mode 100644 index 0000000..9494a7c --- /dev/null +++ b/dash-fastapi-frontend/utils/feedback_util.py @@ -0,0 +1,492 @@ +from dash import set_props +from typing import Dict, Literal, Optional, Union +from uuid import uuid4 + + +class MessageManager: + """ + 全局提示管理器 + """ + + @classmethod + def default( + cls, + container_id: Optional[Union[str, Dict]] = 'global-message-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + className: Optional[str] = None, + content: Optional[str] = '请求成功', + duration: Optional[int] = 3, + icon: Optional[str] = None, + iconRenderer: Optional[Literal['AntdIcon', 'fontawesome']] = 'AntdIcon', + key: Optional[str] = None, + maxCount: Optional[int] = None, + style: Optional[Dict] = None, + top: Optional[int] = 8, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'className': className, + 'content': content, + 'duration': duration, + 'icon': icon, + 'iconRenderer': iconRenderer, + 'key': key, + 'maxCount': maxCount, + 'style': style, + 'top': top, + 'type': 'default', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdMessage', + 'namespace': 'feffery_antd_components', + } + }, + ) + + @classmethod + def info( + cls, + container_id: Optional[Union[str, Dict]] = 'global-message-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + className: Optional[str] = None, + content: Optional[str] = '请求成功', + duration: Optional[int] = 3, + icon: Optional[str] = None, + iconRenderer: Optional[Literal['AntdIcon', 'fontawesome']] = 'AntdIcon', + key: Optional[str] = None, + maxCount: Optional[int] = None, + style: Optional[Dict] = None, + top: Optional[int] = 8, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'className': className, + 'content': content, + 'duration': duration, + 'icon': icon, + 'iconRenderer': iconRenderer, + 'key': key, + 'maxCount': maxCount, + 'style': style, + 'top': top, + 'type': 'info', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdMessage', + 'namespace': 'feffery_antd_components', + } + }, + namespace='feffery_antd_components', + ) + + @classmethod + def success( + cls, + container_id: Optional[Union[str, Dict]] = 'global-message-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + className: Optional[str] = None, + content: Optional[str] = '请求成功', + duration: Optional[int] = 3, + icon: Optional[str] = None, + iconRenderer: Optional[Literal['AntdIcon', 'fontawesome']] = 'AntdIcon', + key: Optional[str] = None, + maxCount: Optional[int] = None, + style: Optional[Dict] = None, + top: Optional[int] = 8, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'className': className, + 'content': content, + 'duration': duration, + 'icon': icon, + 'iconRenderer': iconRenderer, + 'key': key, + 'maxCount': maxCount, + 'style': style, + 'top': top, + 'type': 'success', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdMessage', + 'namespace': 'feffery_antd_components', + } + }, + ) + + @classmethod + def warning( + cls, + container_id: Optional[Union[str, Dict]] = 'global-message-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + className: Optional[str] = None, + content: Optional[str] = '请求失败', + duration: Optional[int] = 3, + icon: Optional[str] = None, + iconRenderer: Optional[Literal['AntdIcon', 'fontawesome']] = 'AntdIcon', + key: Optional[str] = None, + maxCount: Optional[int] = None, + style: Optional[Dict] = None, + top: Optional[int] = 8, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'className': className, + 'content': content, + 'duration': duration, + 'icon': icon, + 'iconRenderer': iconRenderer, + 'key': key, + 'maxCount': maxCount, + 'style': style, + 'top': top, + 'type': 'warning', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdMessage', + 'namespace': 'feffery_antd_components', + } + }, + ) + + @classmethod + def error( + cls, + container_id: Optional[Union[str, Dict]] = 'global-message-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + className: Optional[str] = None, + content: Optional[str] = '请求异常', + duration: Optional[int] = 3, + icon: Optional[str] = None, + iconRenderer: Optional[Literal['AntdIcon', 'fontawesome']] = 'AntdIcon', + key: Optional[str] = None, + maxCount: Optional[int] = None, + style: Optional[Dict] = None, + top: Optional[int] = 8, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'className': className, + 'content': content, + 'duration': duration, + 'icon': icon, + 'iconRenderer': iconRenderer, + 'key': key, + 'maxCount': maxCount, + 'style': style, + 'top': top, + 'type': 'error', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdMessage', + 'namespace': 'feffery_antd_components', + } + }, + namespace='feffery_antd_components', + ) + + +class NotificationManager: + """ + 通知提醒管理器 + """ + + @classmethod + def default( + cls, + container_id: Optional[ + Union[str, Dict] + ] = 'global-notification-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + bottom: Optional[int] = 24, + className: Optional[str] = None, + closeable: Optional[bool] = True, + closeButton: Optional[Dict] = None, + description: Optional[str] = None, + duration: Optional[Union[float, int]] = 4.5, + key: Optional[str] = None, + message: Optional[str] = '请求成功', + placement: Optional[ + Literal[ + 'top', + 'bottom', + 'topLeft', + 'topRight', + 'bottomLeft', + 'bottomRight', + ] + ] = 'topRight', + style: Optional[Dict] = None, + top: Optional[int] = 24, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'bottom': bottom, + 'className': className, + 'closeable': closeable, + 'closeButton': closeButton, + 'description': description, + 'duration': duration, + 'key': key, + 'message': message, + 'placement': placement, + 'style': style, + 'top': top, + 'type': 'default', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdNotification', + 'namespace': 'feffery_antd_components', + } + }, + ) + + @classmethod + def info( + cls, + container_id: Optional[ + Union[str, Dict] + ] = 'global-notification-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + bottom: Optional[int] = 24, + className: Optional[str] = None, + closeable: Optional[bool] = True, + closeButton: Optional[Dict] = None, + description: Optional[str] = None, + duration: Optional[Union[float, int]] = 4.5, + key: Optional[str] = None, + message: Optional[str] = '请求成功', + placement: Optional[ + Literal[ + 'top', + 'bottom', + 'topLeft', + 'topRight', + 'bottomLeft', + 'bottomRight', + ] + ] = 'topRight', + style: Optional[Dict] = None, + top: Optional[int] = 24, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'bottom': bottom, + 'className': className, + 'closeable': closeable, + 'closeButton': closeButton, + 'description': description, + 'duration': duration, + 'key': key, + 'message': message, + 'placement': placement, + 'style': style, + 'top': top, + 'type': 'info', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdNotification', + 'namespace': 'feffery_antd_components', + } + }, + ) + + @classmethod + def success( + cls, + container_id: Optional[ + Union[str, Dict] + ] = 'global-notification-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + bottom: Optional[int] = 24, + className: Optional[str] = None, + closeable: Optional[bool] = True, + closeButton: Optional[Dict] = None, + description: Optional[str] = None, + duration: Optional[Union[float, int]] = 4.5, + key: Optional[str] = None, + message: Optional[str] = '请求成功', + placement: Optional[ + Literal[ + 'top', + 'bottom', + 'topLeft', + 'topRight', + 'bottomLeft', + 'bottomRight', + ] + ] = 'topRight', + style: Optional[Dict] = None, + top: Optional[int] = 24, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'bottom': bottom, + 'className': className, + 'closeable': closeable, + 'closeButton': closeButton, + 'description': description, + 'duration': duration, + 'key': key, + 'message': message, + 'placement': placement, + 'style': style, + 'top': top, + 'type': 'success', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdNotification', + 'namespace': 'feffery_antd_components', + } + }, + ) + + @classmethod + def warning( + cls, + container_id: Optional[ + Union[str, Dict] + ] = 'global-notification-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + bottom: Optional[int] = 24, + className: Optional[str] = None, + closeable: Optional[bool] = True, + closeButton: Optional[Dict] = None, + description: Optional[str] = None, + duration: Optional[Union[float, int]] = 4.5, + key: Optional[str] = None, + message: Optional[str] = '请求失败', + placement: Optional[ + Literal[ + 'top', + 'bottom', + 'topLeft', + 'topRight', + 'bottomLeft', + 'bottomRight', + ] + ] = 'topRight', + style: Optional[Dict] = None, + top: Optional[int] = 24, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'bottom': bottom, + 'className': className, + 'closeable': closeable, + 'closeButton': closeButton, + 'description': description, + 'duration': duration, + 'key': key, + 'message': message, + 'placement': placement, + 'style': style, + 'top': top, + 'type': 'warning', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdNotification', + 'namespace': 'feffery_antd_components', + } + }, + ) + + @classmethod + def error( + cls, + container_id: Optional[ + Union[str, Dict] + ] = 'global-notification-container', + id: Optional[Union[str, Dict]] = str(uuid4()), + bottom: Optional[int] = 24, + className: Optional[str] = None, + closeable: Optional[bool] = True, + closeButton: Optional[Dict] = None, + description: Optional[str] = None, + duration: Optional[Union[float, int]] = 4.5, + key: Optional[str] = None, + message: Optional[str] = '请求异常', + placement: Optional[ + Literal[ + 'top', + 'bottom', + 'topLeft', + 'topRight', + 'bottomLeft', + 'bottomRight', + ] + ] = 'topRight', + style: Optional[Dict] = None, + top: Optional[int] = 24, + underCompatibilityMode: Optional[bool] = False, + ): + set_props( + container_id, + { + 'children': { + 'props': { + 'id': id, + 'bottom': bottom, + 'className': className, + 'closeable': closeable, + 'closeButton': closeButton, + 'description': description, + 'duration': duration, + 'key': key, + 'message': message, + 'placement': placement, + 'style': style, + 'top': top, + 'type': 'error', + 'underCompatibilityMode': underCompatibilityMode, + }, + 'type': 'AntdNotification', + 'namespace': 'feffery_antd_components', + } + }, + ) -- Gitee From 6cdf067a1fd275c35339ad9b4552f763793afbd6 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 5 Sep 2024 17:36:23 +0800 Subject: [PATCH 036/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8E=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E9=87=8D=E6=9E=84api=E8=AF=B7=E6=B1=82=E5=88=A4=E6=96=AD?= =?UTF-8?q?=EF=BC=8C=E5=AE=9E=E7=8E=B0=E7=B1=BBaxios=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/app.py | 161 ++++++++--------- dash-fastapi-frontend/callbacks/app_c.py | 19 -- dash-fastapi-frontend/utils/request.py | 217 ++++++++++++----------- 3 files changed, 189 insertions(+), 208 deletions(-) diff --git a/dash-fastapi-frontend/app.py b/dash-fastapi-frontend/app.py index 8b7682a..199181d 100644 --- a/dash-fastapi-frontend/app.py +++ b/dash-fastapi-frontend/app.py @@ -58,14 +58,15 @@ app.layout = html.Div( icon='fc-high-priority', style={'font-size': '28px'} ), fac.AntdText( - '用户信息已过期,请重新登录', + '登录状态已过期,您可以继续留在该页面,或者重新登录', style={'margin-left': '5px'}, ), ] ), id='token-invalid-modal', visible=False, - title='提示', + title='系统提示', + okText='重新登录', renderFooter=True, centered=True, ), @@ -107,114 +108,100 @@ def router(pathname, url_trigger, session_token): token_result = session.get('Authorization') # 若已登录 if token_result and session_token and token_result == session_token: - try: + if url_trigger == 'load': + current_user_result = LoginApi.get_info() + router_list_result = RouterApi.get_routers() + if ( + current_user_result['code'] == 200 + and router_list_result['code'] == 200 + ): + current_user = current_user_result + router_list = router_list_result['data'] + menu_info = RouterUtil.generate_menu_tree(router_list) + # search_panel_data = get_search_panel_data(user_menu_list) + search_panel_data = [] + session['user_info'] = current_user['user'] + permissions = { + 'perms': current_user['permissions'], + 'roles': current_user['roles'], + } + cache_obj = dict( + user_info=current_user['user'], + permissions=permissions, + menu_info=menu_info, + search_panel_data=search_panel_data, + ) + CacheManager.set(cache_obj) + else: + return dict( + app_mount=dash.no_update, + redirect_container=dash.no_update, + global_message_container=dash.no_update, + api_check_token_trigger={'timestamp': time.time()}, + menu_current_key=dash.no_update, + search_panel_data=dash.no_update, + ) + menu_info = CacheManager.get('menu_info') + search_panel_data = CacheManager.get('search_panel_data') + dynamic_valid_pathname_list = find_node_values(menu_info, 'href') + valid_href_list = ( + dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME + ) + if pathname in valid_href_list: + current_key = find_key_by_href(menu_info, pathname) + if pathname == '/': + current_key = '首页' + if pathname == '/user/profile': + current_key = '个人资料' if url_trigger == 'load': - current_user_result = LoginApi.get_info() - router_list_result = RouterApi.get_routers() - if ( - current_user_result['code'] == 200 - and router_list_result['code'] == 200 - ): - current_user = current_user_result - router_list = router_list_result['data'] - menu_info = RouterUtil.generate_menu_tree(router_list) - # search_panel_data = get_search_panel_data(user_menu_list) - search_panel_data = [] - session['user_info'] = current_user['user'] - permissions = { - 'perms': current_user['permissions'], - 'roles': current_user['roles'], - } - cache_obj = dict( - user_info=current_user['user'], - permissions=permissions, - menu_info=menu_info, - search_panel_data=search_panel_data, - ) - CacheManager.set(cache_obj) - else: + # 根据pathname控制渲染行为 + if pathname == '/login' or pathname == '/forget': + # 重定向到主页面 return dict( app_mount=dash.no_update, - redirect_container=dash.no_update, - global_message_container=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, - ) - menu_info = CacheManager.get('menu_info') - search_panel_data = CacheManager.get('search_panel_data') - dynamic_valid_pathname_list = find_node_values(menu_info, 'href') - valid_href_list = ( - dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME - ) - if pathname in valid_href_list: - current_key = find_key_by_href(menu_info, pathname) - if pathname == '/': - current_key = '首页' - if pathname == '/user/profile': - current_key = '个人资料' - if url_trigger == 'load': - # 根据pathname控制渲染行为 - if pathname == '/login' or pathname == '/forget': - # 重定向到主页面 - return dict( - app_mount=dash.no_update, - redirect_container=dcc.Location( - pathname='/', id='router-redirect' - ), - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, - menu_current_key={'current_key': current_key}, - search_panel_data=search_panel_data, - ) - - user_menu_info = RouterUtil.generate_menu_tree( - RouterUtil.get_visible_routers(router_list) - ) - # 否则正常渲染主页面 - return dict( - app_mount=views.layout.render_content(user_menu_info), - redirect_container=None, + redirect_container=dcc.Location( + pathname='/', id='router-redirect' + ), global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key={'current_key': current_key}, search_panel_data=search_panel_data, ) - else: - return dict( - app_mount=dash.no_update, - redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, - menu_current_key={'current_key': current_key}, - search_panel_data=search_panel_data, - ) + user_menu_info = RouterUtil.generate_menu_tree( + RouterUtil.get_visible_routers(router_list) + ) + # 否则正常渲染主页面 + return dict( + app_mount=views.layout.render_content(user_menu_info), + redirect_container=None, + global_message_container=None, + api_check_token_trigger={'timestamp': time.time()}, + menu_current_key={'current_key': current_key}, + search_panel_data=search_panel_data, + ) else: - # 渲染404状态页 return dict( - app_mount=views.page_404.render_content(), + app_mount=dash.no_update, redirect_container=None, global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, + menu_current_key={'current_key': current_key}, + search_panel_data=search_panel_data, ) - except Exception as e: - logger.exception(e) - + else: + # 渲染404状态页 return dict( - app_mount=dash.no_update, + app_mount=views.page_404.render_content(), redirect_container=None, - global_message_container=fuc.FefferyFancyNotification( - '接口异常', type='error', autoClose=2000 - ), + global_message_container=None, api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, search_panel_data=dash.no_update, ) + else: # 若未登录 # 根据pathname控制渲染行为 diff --git a/dash-fastapi-frontend/callbacks/app_c.py b/dash-fastapi-frontend/callbacks/app_c.py index fe7bf28..2b3194b 100644 --- a/dash-fastapi-frontend/callbacks/app_c.py +++ b/dash-fastapi-frontend/callbacks/app_c.py @@ -7,25 +7,6 @@ from server import app from api.config import query_config_list_api -# api拦截器——根据api返回编码确定是否强制退出 -@app.callback( - [Output('token-invalid-modal', 'visible'), - Output('global-notification-container', 'children', allow_duplicate=True)], - Input('api-check-token', 'data'), - prevent_initial_call=True -) -def check_api_response(data): - - if session.get('code') == 401 and 'token' in session.get('message'): - return [True, fuc.FefferyFancyNotification(session.get('message'), type='error', autoClose=2000)] - - elif session.get('code') == 200: - return [dash.no_update, dash.no_update] - - else: - return [dash.no_update, fuc.FefferyFancyNotification(session.get('message'), type='warning', autoClose=2000)] - - # api拦截器——退出登录二次确认 @app.callback( [Output('redirect-container', 'children', allow_duplicate=True), diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index 9c8f403..af0c038 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -2,6 +2,12 @@ import requests from typing import Dict, Literal, Optional from flask import session, request from config.env import AppConfig +from config.exception import ( + AuthException, + RequestException, + ServiceException, + ServiceWarning, +) from config.global_config import ApiBaseUrlConfig from server import logger @@ -56,112 +62,119 @@ def api_request( ) if is_token: api_headers.update({'Authorization': 'Bearer ' + authorization}) - try: - if api_method == 'get': - response = requests.get( - url=api_url, - params=params, - data=data, - json=json, - files=files, - headers=api_headers, - timeout=timeout, - stream=stream, - ) - elif api_method == 'post': - response = requests.post( - url=api_url, - params=params, - data=data, - json=json, - files=files, - headers=api_headers, - timeout=timeout, - stream=stream, - ) - elif api_method == 'delete': - response = requests.delete( - url=api_url, - params=params, - data=data, - json=json, - files=files, - headers=api_headers, - timeout=timeout, - stream=stream, - ) - elif api_method == 'put': - response = requests.put( - url=api_url, - params=params, - data=data, - json=json, - files=files, - headers=api_headers, - timeout=timeout, - stream=stream, - ) - elif api_method == 'patch': - response = requests.patch( - url=api_url, - params=params, - data=data, - json=json, - files=files, - headers=api_headers, - timeout=timeout, - stream=stream, - ) + if api_method == 'get': + response = requests.get( + url=api_url, + params=params, + data=data, + json=json, + files=files, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'post': + response = requests.post( + url=api_url, + params=params, + data=data, + json=json, + files=files, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'delete': + response = requests.delete( + url=api_url, + params=params, + data=data, + json=json, + files=files, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'put': + response = requests.put( + url=api_url, + params=params, + data=data, + json=json, + files=files, + headers=api_headers, + timeout=timeout, + stream=stream, + ) + elif api_method == 'patch': + response = requests.patch( + url=api_url, + params=params, + data=data, + json=json, + files=files, + headers=api_headers, + timeout=timeout, + stream=stream, + ) - data_list = [params, data, json] + data_list = [params, data, json, files] + status_code = response.status_code + request_user = ( + session.get('user_info').get('user_name') + if session.get('user_info') + else None + ) + request_params = ','.join([str(x) for x in data_list if x]) + log_message = LogMessage( + request_user, + remote_addr, + api_method, + url, + request_params, + ) + if status_code == 200: if stream: - response_code = response.status_code - response_message = ( - '获取成功' if response_code == 200 else '获取失败' - ) + logger.info(log_message.generate('获取成功')) + return response else: response_code = response.json().get('code') response_message = response.json().get('msg') - session['code'] = response_code - session['message'] = response_message - if response_code == 200: - logger.info( - '[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求参数:{}||请求结果:{}', - session.get('user_info').get('user_name') - if session.get('user_info') - else None, - remote_addr, - method, - url, - ','.join([str(x) for x in data_list if x]), - response_message, - ) - else: - logger.warning( - '[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求参数:{}||请求结果:{}', - session.get('user_info').get('user_name') - if session.get('user_info') - else None, - remote_addr, - method, - url, - ','.join([str(x) for x in data_list if x]), - response_message, - ) + response_log = log_message.generate(response_message) + if response_code == 200: + logger.info(response_log) + return response.json() + elif response_code == 401: + logger.warning(response_log) + raise AuthException(message=response_message) + elif response_code == 500: + logger.error(response_log) + raise ServiceException(message=response_message) + elif response_code == 601: + logger.warning(response_log) + raise ServiceWarning(message=response_message) + else: + logger.error(response_log) + raise RequestException(message=response_message) + else: + logger.error(log_message.generate('请求异常')) + raise RequestException(message='请求异常') - return response if stream else response.json() - except Exception as e: - logger.error( - '[api]请求人:{}||请求IP:{}||请求方法:{}||请求Api:{}||请求结果:{}', - session.get('user_info').get('user_name') - if session.get('user_info') - else None, - remote_addr, - method, - url, - str(e), - ) - session['code'] = 500 - session['msg'] = str(e) - return dict(code=500, data='', message=str(e)) +class LogMessage: + def __init__( + self, + request_user: str, + request_ip: str, + request_method: str, + request_url: str, + request_params: str, + ): + self.request_user = request_user + self.request_ip = request_ip + self.request_method = request_method + self.request_url = request_url + self.request_params = request_params + + def generate(self, message: str): + return f'[api]请求人:{self.request_user}||请求IP:{self.request_ip}||请求方法:{self.request_method}||请求Api:{self.request_url}||请求参数:{self.request_params}||请求结果:{message}' -- Gitee From bb3cdc3d50c705fa6727935892457d36577b0ac5 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 5 Sep 2024 22:54:32 +0800 Subject: [PATCH 037/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=A8=A1=E5=9D=97=E5=9B=9E=E8=B0=83=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=BC=96=E6=8E=92=E5=8F=8Aapi=E8=AF=B7=E6=B1=82=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/app.py | 110 ++-- dash-fastapi-frontend/callbacks/login_c.py | 160 ++---- .../callbacks/system_c/config_c.py | 275 ++++----- .../callbacks/system_c/dept_c.py | 381 ++++++------- .../callbacks/system_c/notice_c.py | 266 ++++----- .../callbacks/system_c/post_c.py | 277 ++++------ .../callbacks/system_c/user_c/user_c.py | 522 ++++++------------ .../views/monitor/logininfor/__init__.py | 30 +- .../views/monitor/operlog/__init__.py | 86 ++- .../views/system/config/__init__.py | 47 +- .../views/system/dept/__init__.py | 85 ++- .../views/system/dict/__init__.py | 57 +- .../views/system/menu/__init__.py | 77 ++- .../views/system/notice/__init__.py | 93 ++-- .../views/system/post/__init__.py | 46 +- .../views/system/role/__init__.py | 179 +++--- .../views/system/user/__init__.py | 79 ++- 17 files changed, 1049 insertions(+), 1721 deletions(-) diff --git a/dash-fastapi-frontend/app.py b/dash-fastapi-frontend/app.py index 199181d..f2cf72c 100644 --- a/dash-fastapi-frontend/app.py +++ b/dash-fastapi-frontend/app.py @@ -1,31 +1,21 @@ import dash -import time -from dash import html, dcc -from dash.dependencies import Input, Output, State import feffery_antd_components as fac import feffery_utils_components as fuc +from dash import dcc, html +from dash.dependencies import Input, Output, State from flask import session -from operator import itemgetter - -from server import app, logger +from api.login import LoginApi +from api.router import RouterApi +from callbacks import app_c # noqa: F401 from config.env import AppConfig from config.global_config import RouterConfig +from server import app from store.store import render_store_container - -# 载入子页面 -import views - -from callbacks import app_c -from api.login import LoginApi -from api.router import RouterApi from utils.cache_util import CacheManager from utils.router_util import RouterUtil -from utils.tree_tool import ( - find_node_values, - find_key_by_href, - deal_user_menu_info, - get_search_panel_data, -) +from utils.tree_tool import find_key_by_href, find_node_values +from views import forget, layout, login, page_404 + app.layout = html.Div( [ @@ -84,12 +74,6 @@ app.layout = html.Div( redirect_container=Output( 'redirect-container', 'children', allow_duplicate=True ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), menu_current_key=Output('current-key-container', 'data'), search_panel_data=Output('search-panel', 'data'), ), @@ -109,38 +93,24 @@ def router(pathname, url_trigger, session_token): # 若已登录 if token_result and session_token and token_result == session_token: if url_trigger == 'load': - current_user_result = LoginApi.get_info() + current_user = LoginApi.get_info() router_list_result = RouterApi.get_routers() - if ( - current_user_result['code'] == 200 - and router_list_result['code'] == 200 - ): - current_user = current_user_result - router_list = router_list_result['data'] - menu_info = RouterUtil.generate_menu_tree(router_list) - # search_panel_data = get_search_panel_data(user_menu_list) - search_panel_data = [] - session['user_info'] = current_user['user'] - permissions = { - 'perms': current_user['permissions'], - 'roles': current_user['roles'], - } - cache_obj = dict( - user_info=current_user['user'], - permissions=permissions, - menu_info=menu_info, - search_panel_data=search_panel_data, - ) - CacheManager.set(cache_obj) - else: - return dict( - app_mount=dash.no_update, - redirect_container=dash.no_update, - global_message_container=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, - ) + router_list = router_list_result['data'] + menu_info = RouterUtil.generate_menu_tree(router_list) + # search_panel_data = get_search_panel_data(user_menu_list) + search_panel_data = [] + session['user_info'] = current_user['user'] + permissions = { + 'perms': current_user['permissions'], + 'roles': current_user['roles'], + } + cache_obj = dict( + user_info=current_user['user'], + permissions=permissions, + menu_info=menu_info, + search_panel_data=search_panel_data, + ) + CacheManager.set(cache_obj) menu_info = CacheManager.get('menu_info') search_panel_data = CacheManager.get('search_panel_data') dynamic_valid_pathname_list = find_node_values(menu_info, 'href') @@ -162,8 +132,6 @@ def router(pathname, url_trigger, session_token): redirect_container=dcc.Location( pathname='/', id='router-redirect' ), - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key={'current_key': current_key}, search_panel_data=search_panel_data, ) @@ -173,10 +141,8 @@ def router(pathname, url_trigger, session_token): ) # 否则正常渲染主页面 return dict( - app_mount=views.layout.render_content(user_menu_info), + app_mount=layout.render_content(user_menu_info), redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key={'current_key': current_key}, search_panel_data=search_panel_data, ) @@ -185,8 +151,6 @@ def router(pathname, url_trigger, session_token): return dict( app_mount=dash.no_update, redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key={'current_key': current_key}, search_panel_data=search_panel_data, ) @@ -194,14 +158,12 @@ def router(pathname, url_trigger, session_token): else: # 渲染404状态页 return dict( - app_mount=views.page_404.render_content(), + app_mount=page_404.render_content(), redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, search_panel_data=dash.no_update, ) - + else: # 若未登录 # 根据pathname控制渲染行为 @@ -209,30 +171,24 @@ def router(pathname, url_trigger, session_token): if pathname not in RouterConfig.BASIC_VALID_PATHNAME: # 渲染404状态页 return dict( - app_mount=views.page_404.render_content(), + app_mount=page_404.render_content(), redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, search_panel_data=dash.no_update, ) if pathname == '/login': return dict( - app_mount=views.login.render_content(), + app_mount=login.render_content(), redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, search_panel_data=dash.no_update, ) if pathname == '/forget': return dict( - app_mount=views.forget.render_forget_content(), + app_mount=forget.render_forget_content(), redirect_container=None, - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, search_panel_data=dash.no_update, ) @@ -243,8 +199,6 @@ def router(pathname, url_trigger, session_token): redirect_container=dcc.Location( pathname='/login', id='router-redirect' ), - global_message_container=None, - api_check_token_trigger={'timestamp': time.time()}, menu_current_key=dash.no_update, search_panel_data=dash.no_update, ) diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index 6a09ee6..6548153 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -1,13 +1,10 @@ -import dash -from dash import dcc -import feffery_utils_components as fuc +from dash import dcc, get_asset_url, no_update from dash.dependencies import Input, Output, State from flask import session -import time - +from api.login import LoginApi from server import app from utils.common import validate_data_not_empty -from api.login import LoginApi +from utils.feedback_util import MessageManager @app.callback( @@ -28,9 +25,6 @@ from api.login import LoginApi redirect_container=Output( 'redirect-container', 'children', allow_duplicate=True ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(nClicks=Input('login-submit', 'nClicks')), state=dict( @@ -60,68 +54,30 @@ def login_auth( validate_data_not_empty(item) for item in [username, password, input_captcha] ): - try: - user_params = dict( - username=username, - password=password, - code=input_captcha, - uuid=session_id, - ) - userinfo_result = LoginApi.login(user_params) - if userinfo_result['code'] == 200: - token = userinfo_result['token'] - session['Authorization'] = token - return dict( - username_form_status=None, - password_form_status=None, - captcha_form_status=None, - username_form_help=None, - password_form_help=None, - captcha_form_help=None, - image_click=dash.no_update, - submit_loading=False, - token=token, - redirect_container=dcc.Location( - pathname='/', id='login-redirect' - ), - global_message_container=fuc.FefferyFancyMessage( - '登录成功', type='success' - ), - ) - - else: - return dict( - username_form_status=None, - password_form_status=None, - captcha_form_status=None, - username_form_help=None, - password_form_help=None, - captcha_form_help=None, - image_click=image_click + 1, - submit_loading=False, - token=None, - redirect_container=None, - global_message_container=fuc.FefferyFancyMessage( - userinfo_result.get('msg'), type='error' - ), - ) - except Exception as e: - print(e) - return dict( - username_form_status=None, - password_form_status=None, - captcha_form_status=None, - username_form_help=None, - password_form_help=None, - captcha_form_help=None, - image_click=image_click + 1, - submit_loading=False, - token=None, - redirect_container=None, - global_message_container=fuc.FefferyFancyMessage( - '接口异常', type='error' - ), - ) + user_params = dict( + username=username, + password=password, + code=input_captcha, + uuid=session_id, + ) + userinfo_result = LoginApi.login(user_params) + token = userinfo_result['token'] + session['Authorization'] = token + MessageManager.success(content='登录成功') + return dict( + username_form_status=None, + password_form_status=None, + captcha_form_status=None, + username_form_help=None, + password_form_help=None, + captcha_form_help=None, + image_click=no_update, + submit_loading=False, + token=token, + redirect_container=dcc.Location( + pathname='/', id='login-redirect' + ), + ) return dict( username_form_status=None @@ -142,25 +98,23 @@ def login_auth( captcha_form_help=None if validate_data_not_empty(input_captcha) else '请输入验证码!', - image_click=dash.no_update, + image_click=no_update, submit_loading=False, token=None, redirect_container=None, - global_message_container=None, ) return dict( - username_form_status=dash.no_update, - password_form_status=dash.no_update, - captcha_form_status=dash.no_update, - username_form_help=dash.no_update, - password_form_help=dash.no_update, - captcha_form_help=dash.no_update, + username_form_status=no_update, + password_form_status=no_update, + captcha_form_status=no_update, + username_form_help=no_update, + password_form_help=no_update, + captcha_form_help=no_update, image_click=image_click + 1, - submit_loading=dash.no_update, - token=dash.no_update, - redirect_container=dash.no_update, - global_message_container=dash.no_update, + submit_loading=no_update, + token=no_update, + redirect_container=no_update, ) @@ -168,44 +122,22 @@ def login_auth( [ Output('login-captcha-image', 'src'), Output('captcha_image-session_id-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('login-captcha-image-container', 'n_clicks'), prevent_initial_call=True, ) def change_login_captcha_image(captcha_click): if captcha_click: - try: - captcha_image_info = LoginApi.get_code_img() - if captcha_image_info.get('code') == 200: - captcha_image = ( - f"data:image/gif;base64,{captcha_image_info.get('img')}" - ) - session_id = captcha_image_info.get('uuid') + captcha_image_info = LoginApi.get_code_img() + captcha_image = f"data:image/gif;base64,{captcha_image_info.get('img')}" + session_id = captcha_image_info.get('uuid') - return [ - captcha_image, - session_id, - dash.no_update, - dash.no_update, - ] - else: - return [ - dash.no_update, - dash.no_update, - {'timestamp': time.time()}, - dash.no_update, - ] - except Exception as e: - return [ - dash.no_update, - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('接口异常', type='error'), - ] + return [ + captcha_image, + session_id, + ] - return [dash.no_update] * 4 + return [no_update] * 2 @app.callback( @@ -217,7 +149,7 @@ def random_bg(pathname, old_style): return { **old_style, 'backgroundImage': 'url({})'.format( - dash.get_asset_url('imgs/login-background.jpg') + get_asset_url('imgs/login-background.jpg') ), 'backgroundRepeat': 'no-repeat', 'backgroundSize': 'cover', diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index aee4469..883f70e 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -1,14 +1,12 @@ -import dash import time import uuid -from dash import dcc -from dash.dependencies import Input, Output, State, ALL +from dash import ctx, dcc, no_update +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.config import ConfigApi from server import app from utils.common import validate_data_not_empty -from api.system.config import ConfigApi +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -24,9 +22,6 @@ from utils.permission_util import PermissionManager config_table_selectedrowkeys=Output( 'config-list-table', 'selectedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('config-search', 'nClicks'), @@ -70,7 +65,7 @@ def get_config_table_data( page_num=1, page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'config-list-table': query_params.update( { @@ -80,45 +75,35 @@ def get_config_table_data( ) if search_click or refresh_click or pagination or operations: table_info = ConfigApi.list_config(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['config_type'] == 'Y': - item['config_type'] = dict(tag='是', color='blue') - else: - item['config_type'] = dict(tag='否', color='volcano') - item['key'] = str(item['config_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:config:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:config:remove') - else {}, - ] - - return dict( - config_table_data=table_data, - config_table_pagination=table_pagination, - config_table_key=str(uuid.uuid4()), - config_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['config_type'] == 'Y': + item['config_type'] = dict(tag='是', color='blue') + else: + item['config_type'] = dict(tag='否', color='volcano') + item['key'] = str(item['config_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:config:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:config:remove') + else {}, + ] return dict( - config_table_data=dash.no_update, - config_table_pagination=dash.no_update, - config_table_key=dash.no_update, - config_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + config_table_data=table_data, + config_table_pagination=table_pagination, + config_table_key=str(uuid.uuid4()), + config_table_selectedrowkeys=None, ) raise PreventUpdate @@ -178,7 +163,7 @@ def change_config_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1: @@ -200,7 +185,7 @@ def change_config_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -225,9 +210,6 @@ def change_config_delete_button_status(table_rows_selected): 'help', allow_duplicate=True, ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('config-edit-id-store', 'data'), modal_type=Output('config-operations-store-bk', 'data'), ), @@ -256,16 +238,16 @@ def add_edit_config_modal( """ 显示新增或编辑参数设置弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if ( trigger_id == {'index': 'add', 'type': 'config-operation-button'} or trigger_id == {'index': 'edit', 'type': 'config-operation-button'} or (trigger_id == 'config-list-table' and clicked_content == '修改') ): # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'config-operation-button'}: config_info = dict( config_name=None, @@ -280,7 +262,6 @@ def add_edit_config_modal( form_value=[config_info.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger=dash.no_update, edit_row_info=None, modal_type={'type': 'add'}, ) @@ -296,26 +277,23 @@ def add_edit_config_modal( else: config_id = int(recently_button_clicked_row['key']) config_info_res = ConfigApi.get_config(config_id=config_id) - if config_info_res['code'] == 200: - config_info = config_info_res['data'] - return dict( - modal_visible=True, - modal_title='编辑参数', - form_value=[config_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=config_info if config_info else None, - modal_type={'type': 'edit'}, - ) + config_info = config_info_res['data'] + return dict( + modal_visible=True, + modal_title='编辑参数', + form_value=[config_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + edit_row_info=config_info if config_info else None, + modal_type={'type': 'edit'}, + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=no_update, + modal_title=no_update, + form_value=[no_update] * len(form_value_list), + form_label_validate_status=[no_update] * len(form_label_list), + form_label_validate_info=[no_update] * len(form_label_list), edit_row_info=None, modal_type=None, ) @@ -339,12 +317,6 @@ def add_edit_config_modal( operations=Output( 'config-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('config-modal', 'okCounts')), state=dict( @@ -367,14 +339,14 @@ def config_confirm( if confirm_trigger: # 获取所有输出表单项对应label的index form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] + x['id']['index'] for x in ctx.outputs_list[0] ] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + x['id']['index']: x.get('value') for x in ctx.states_list[-2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) @@ -387,49 +359,39 @@ def config_confirm( params_edit['config_id'] = ( edit_row_info.get('config_id') if edit_row_info else None ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = ConfigApi.add_config(params_add) + ConfigApi.add_config(params_add) + if modal_type == 'edit': + ConfigApi.update_config(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'add'}, + ) if modal_type == 'edit': - api_res = ConfigApi.update_config(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MessageManager.success(content='编辑成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -445,12 +407,8 @@ def config_confirm( else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @@ -483,7 +441,7 @@ def config_delete_modal( """ 显示删除参数设置二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'config-operation-button'} or ( trigger_id == 'config-list-table' and clicked_content == '删除' ): @@ -493,7 +451,7 @@ def config_delete_modal( if clicked_content == '删除': config_ids = recently_button_clicked_row['key'] else: - return dash.no_update + return no_update return [ f'是否确认删除参数编号为{config_ids}的参数设置?', @@ -505,11 +463,7 @@ def config_delete_modal( @app.callback( - [ - Output('config-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('config-operations-store', 'data', allow_duplicate=True), Input('config-delete-confirm-modal', 'okCounts'), State('config-delete-ids-store', 'data'), prevent_initial_call=True, @@ -520,19 +474,10 @@ def config_delete_confirm(delete_confirm, config_ids_data): """ if delete_confirm: params = config_ids_data - delete_button_info = ConfigApi.del_config(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + ConfigApi.del_config(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -541,8 +486,6 @@ def config_delete_confirm(delete_confirm, config_ids_data): [ Output('config-export-container', 'data', allow_duplicate=True), Output('config-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('config-export', 'nClicks'), prevent_initial_call=True, @@ -553,24 +496,15 @@ def export_config_list(export_click): """ if export_click: export_config_res = ConfigApi.export_config({}) - if export_config_res.status_code == 200: - export_config = export_config_res.content - - return [ - dcc.send_bytes( - export_config, - f'参数配置信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + export_config = export_config_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_config, + f'参数配置信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -593,10 +527,6 @@ def reset_config_export_status(data): @app.callback( - [ - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], Input('config-refresh-cache', 'nClicks'), prevent_initial_call=True, ) @@ -605,16 +535,5 @@ def refresh_config_cache(refresh_click): 刷新缓存回调 """ if refresh_click: - refresh_info_res = ConfigApi.refresh_cache() - if refresh_info_res.get('code') == 200: - return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新成功', type='success'), - ] - - return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新失败', type='error'), - ] - - raise PreventUpdate + ConfigApi.refresh_cache() + MessageManager.success(content='刷新成功') diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 6667c0a..6d58341 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -1,13 +1,11 @@ -import dash -import time import uuid +from dash import ctx, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.dept import DeptApi from server import app from utils.common import validate_data_not_empty -from api.system.dept import DeptApi +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree, list_to_tree_select @@ -19,9 +17,6 @@ from utils.tree_tool import list_to_tree, list_to_tree_select dept_table_defaultexpandedrowkeys=Output( 'dept-list-table', 'defaultExpandedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), fold_click=Output('dept-fold', 'nClicks'), ), inputs=dict( @@ -55,86 +50,74 @@ def get_dept_table_data( if search_click or refresh_click or operations or fold_click: table_info = DeptApi.list_dept(query_params) default_expanded_row_keys = [] - if table_info['code'] == 200: - table_data = table_info['data'] - for item in table_data: - default_expanded_row_keys.append(str(item['dept_id'])) - item['key'] = str(item['dept_id']) - if item['parent_id'] == 0: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - ] - elif item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') - - if fold_click: - if in_default_expanded_row_keys: - return dict( - dept_table_data=table_data_new, - dept_table_key=str(uuid.uuid4()), - dept_table_defaultexpandedrowkeys=[], - api_check_token_trigger={'timestamp': time.time()}, - fold_click=None, - ) + table_data = table_info['data'] + for item in table_data: + default_expanded_row_keys.append(str(item['dept_id'])) + item['key'] = str(item['dept_id']) + if item['parent_id'] == 0: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, + ] + elif item['status'] == '1': + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + { + 'content': '删除', + 'type': 'link', + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:dept:remove') + else {}, + ] + else: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, + { + 'content': '删除', + 'type': 'link', + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:dept:remove') + else {}, + ] + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') - return dict( - dept_table_data=table_data_new, - dept_table_key=str(uuid.uuid4()), - dept_table_defaultexpandedrowkeys=default_expanded_row_keys, - api_check_token_trigger={'timestamp': time.time()}, - fold_click=None, - ) + if fold_click: + if in_default_expanded_row_keys: + return dict( + dept_table_data=table_data_new, + dept_table_key=str(uuid.uuid4()), + dept_table_defaultexpandedrowkeys=[], + fold_click=None, + ) return dict( - dept_table_data=dash.no_update, - dept_table_key=dash.no_update, - dept_table_defaultexpandedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + dept_table_data=table_data_new, + dept_table_key=str(uuid.uuid4()), + dept_table_defaultexpandedrowkeys=default_expanded_row_keys, fold_click=None, ) return dict( - dept_table_data=dash.no_update, - dept_table_key=dash.no_update, - dept_table_defaultexpandedrowkeys=dash.no_update, - api_check_token_trigger=dash.no_update, + dept_table_data=no_update, + dept_table_key=no_update, + dept_table_defaultexpandedrowkeys=no_update, fold_click=None, ) @@ -200,9 +183,6 @@ app.clientside_callback( 'help', allow_duplicate=True, ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('dept-edit-id-store', 'data'), modal_type=Output('dept-operations-store-bk', 'data'), ), @@ -226,14 +206,14 @@ def add_edit_dept_modal( """ 显示新增或编辑部门弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'add', 'type': 'dept-operation-button'} or ( trigger_id == 'dept-list-table' and clicked_content != '删除' ): # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[4]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[4]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[5]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[5]] if trigger_id == 'dept-list-table' and clicked_content == '修改': tree_info = DeptApi.list_dept_exclude_child( dept_id=int(recently_button_clicked_row['key']) @@ -241,73 +221,65 @@ def add_edit_dept_modal( else: dept_params = dict(dept_name='') tree_info = DeptApi.list_dept(dept_params) - if tree_info['code'] == 200: - tree_data = list_to_tree_select( - tree_info['data'], - 'dept_name', - 'dept_id', - 'dept_id', - 'parent_id', - ) + tree_data = list_to_tree_select( + tree_info['data'], + 'dept_name', + 'dept_id', + 'dept_id', + 'parent_id', + ) - if trigger_id == { - 'index': 'add', - 'type': 'dept-operation-button', - } or ( - trigger_id == 'dept-list-table' and clicked_content == '新增' - ): - dept_info = dict( - parent_id=None - if trigger_id - == {'index': 'add', 'type': 'dept-operation-button'} - else str(recently_button_clicked_row['key']), - dept_name=None, - order_num=None, - leader=None, - phone=None, - email=None, - status='0', - ) - return dict( - modal_visible=True, - modal_title='新增部门', - parent_id_div_ishidden=False, - parent_id_tree=tree_data, - form_value=[dept_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=None, - modal_type={'type': 'add'}, - ) - elif trigger_id == 'dept-list-table' and clicked_content == '修改': - dept_id = int(recently_button_clicked_row['key']) - dept_info_res = DeptApi.get_dept(dept_id=dept_id) - if dept_info_res['code'] == 200: - dept_info = dept_info_res['data'] - return dict( - modal_visible=True, - modal_title='编辑部门', - parent_id_div_ishidden=dept_info.get('parent_id') == 0, - parent_id_tree=tree_data, - form_value=[dept_info.get(k) for k in form_value_list], - form_label_validate_status=[None] - * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=dept_info, - modal_type={'type': 'edit'}, - ) + if trigger_id == { + 'index': 'add', + 'type': 'dept-operation-button', + } or (trigger_id == 'dept-list-table' and clicked_content == '新增'): + dept_info = dict( + parent_id=None + if trigger_id + == {'index': 'add', 'type': 'dept-operation-button'} + else str(recently_button_clicked_row['key']), + dept_name=None, + order_num=None, + leader=None, + phone=None, + email=None, + status='0', + ) + return dict( + modal_visible=True, + modal_title='新增部门', + parent_id_div_ishidden=False, + parent_id_tree=tree_data, + form_value=[dept_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + edit_row_info=None, + modal_type={'type': 'add'}, + ) + elif trigger_id == 'dept-list-table' and clicked_content == '修改': + dept_id = int(recently_button_clicked_row['key']) + dept_info_res = DeptApi.get_dept(dept_id=dept_id) + dept_info = dept_info_res['data'] + return dict( + modal_visible=True, + modal_title='编辑部门', + parent_id_div_ishidden=dept_info.get('parent_id') == 0, + parent_id_tree=tree_data, + form_value=[dept_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + edit_row_info=dept_info, + modal_type={'type': 'edit'}, + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - parent_id_div_ishidden=dash.no_update, - parent_id_tree=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=no_update, + modal_title=no_update, + parent_id_div_ishidden=no_update, + parent_id_tree=no_update, + form_value=[no_update] * len(form_value_list), + form_label_validate_status=[no_update] * len(form_label_list), + form_label_validate_info=[no_update] * len(form_label_list), edit_row_info=None, modal_type=None, ) @@ -331,12 +303,6 @@ def add_edit_dept_modal( operations=Output( 'dept-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('dept-modal', 'okCounts')), state=dict( @@ -357,15 +323,13 @@ def dept_confirm( """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] - ] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + x['id']['index']: x.get('value') for x in ctx.states_list[-2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) @@ -378,49 +342,39 @@ def dept_confirm( params_edit['dept_id'] = ( edit_row_info.get('dept_id') if edit_row_info else None ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = DeptApi.add_dept(params_add) + DeptApi.add_dept(params_add) + if modal_type == 'edit': + DeptApi.update_dept(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'add'}, + ) if modal_type == 'edit': - api_res = DeptApi.update_dept(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MessageManager.success(content='编辑成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -436,12 +390,8 @@ def dept_confirm( else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @@ -470,7 +420,7 @@ def dept_delete_modal( if clicked_content == '删除': dept_ids = recently_button_clicked_row['key'] else: - return dash.no_update + raise PreventUpdate return [ f'是否确认删除部门编号为{dept_ids}的部门?', @@ -482,11 +432,7 @@ def dept_delete_modal( @app.callback( - [ - Output('dept-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('dept-operations-store', 'data', allow_duplicate=True), Input('dept-delete-confirm-modal', 'okCounts'), State('dept-delete-ids-store', 'data'), prevent_initial_call=True, @@ -497,18 +443,9 @@ def dept_delete_confirm(delete_confirm, dept_ids_data): """ if delete_confirm: params = dept_ids_data - delete_button_info = DeptApi.del_dept(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + DeptApi.del_dept(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 53ad908..c04a14e 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -1,15 +1,12 @@ -import dash -import time import uuid -import json -from dash.dependencies import Input, Output, State, ALL +from dash import ctx, no_update +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.dict.data import DictDataApi +from api.system.notice import NoticeApi from server import app from utils.common import validate_data_not_empty -from api.system.notice import NoticeApi -from api.system.dict.data import DictDataApi +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -25,9 +22,6 @@ from utils.permission_util import PermissionManager notice_table_selectedrowkeys=Output( 'notice-list-table', 'selectedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('notice-search', 'nClicks'), @@ -71,7 +65,7 @@ def get_notice_table_data( page_num=1, page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'notice-list-table': query_params.update( { @@ -80,68 +74,54 @@ def get_notice_table_data( } ) if search_click or refresh_click or pagination or operations: - option_table = [] info = DictDataApi.get_dicts(dict_type='sys_notice_type') - if info.get('code') == 200: - data = info.get('data') - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] + data = info.get('data') + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} table_info = NoticeApi.list_notice(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='关闭', color='volcano') + item['notice_type'] = dict( + tag=option_dict.get(str(item.get('notice_type'))).get('label'), + color='blue', ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='关闭', color='volcano') - item['notice_type'] = dict( - tag=option_dict.get(str(item.get('notice_type'))).get( - 'label' - ), - color='blue', - ) - item['key'] = str(item['notice_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:notice:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:notice:remove') - else {}, - ] + item['key'] = str(item['notice_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:notice:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:notice:remove') + else {}, + ] return dict( notice_table_data=table_data, notice_table_pagination=table_pagination, notice_table_key=str(uuid.uuid4()), notice_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, ) - return dict( - notice_table_data=dash.no_update, - notice_table_pagination=dash.no_update, - notice_table_key=dash.no_update, - notice_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - ) - raise PreventUpdate @@ -199,7 +179,7 @@ def change_notice_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1: @@ -221,7 +201,7 @@ def change_notice_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -263,9 +243,6 @@ def change_notice_delete_button_status(table_rows_selected): ), ], other=dict( - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('notice-edit-id-store', 'data'), modal_type=Output('notice-operations-store-bk', 'data'), ), @@ -295,7 +272,7 @@ def add_edit_notice_modal( """ 显示新增或编辑通知公告弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if ( trigger_id == {'index': 'add', 'type': 'notice-operation-button'} or trigger_id == {'index': 'edit', 'type': 'notice-operation-button'} @@ -313,7 +290,6 @@ def add_edit_notice_modal( ), form_validate=[None] * 4, other=dict( - api_check_token_trigger=dash.no_update, edit_row_info=None, modal_type={'type': 'add'}, ), @@ -330,39 +306,36 @@ def add_edit_notice_modal( else: notice_id = int(recently_button_clicked_row['key']) notice_info_res = NoticeApi.get_notice(notice_id=notice_id) - if notice_info_res['code'] == 200: - notice_info = notice_info_res['data'] - notice_content = notice_info.get('notice_content') + notice_info = notice_info_res['data'] + notice_content = notice_info.get('notice_content') - return dict( - modal=dict(visible=True, title='编辑通知公告'), - form_value=dict( - notice_title=notice_info.get('notice_title'), - notice_type=notice_info.get('notice_type'), - status=notice_info.get('status'), - notice_content=notice_content, - editor_key=str(uuid.uuid4()), - ), - form_validate=[None] * 4, - other=dict( - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=notice_info if notice_info else None, - modal_type={'type': 'edit'}, - ), - ) + return dict( + modal=dict(visible=True, title='编辑通知公告'), + form_value=dict( + notice_title=notice_info.get('notice_title'), + notice_type=notice_info.get('notice_type'), + status=notice_info.get('status'), + notice_content=notice_content, + editor_key=str(uuid.uuid4()), + ), + form_validate=[None] * 4, + other=dict( + edit_row_info=notice_info if notice_info else None, + modal_type={'type': 'edit'}, + ), + ) return dict( - modal=dict(visible=dash.no_update, title=dash.no_update), + modal=dict(visible=no_update, title=no_update), form_value=dict( - notice_title=dash.no_update, - notice_type=dash.no_update, - status=dash.no_update, - notice_content=dash.no_update, - editor_key=dash.no_update, + notice_title=no_update, + notice_type=no_update, + status=no_update, + notice_content=no_update, + editor_key=no_update, ), - form_validate=[dash.no_update] * 4, + form_validate=[no_update] * 4, other=dict( - api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, modal_type=None, ), @@ -393,12 +366,6 @@ def add_edit_notice_modal( operations=Output( 'notice-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('notice-modal', 'okCounts')), state=dict( @@ -443,51 +410,41 @@ def notice_confirm( status=status, notice_content=notice_content, ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = NoticeApi.add_notice(params_add) + NoticeApi.add_notice(params_add) + if modal_type == 'edit': + NoticeApi.update_notice(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + notice_title_form_status=None, + notice_type_form_status=None, + notice_title_form_help=None, + notice_type_form_help=None, + modal_visible=False, + operations={'type': 'add'}, + ) if modal_type == 'edit': - api_res = NoticeApi.update_notice(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - notice_title_form_status=None, - notice_type_form_status=None, - notice_title_form_help=None, - notice_type_form_help=None, - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - notice_title_form_status=None, - notice_type_form_status=None, - notice_title_form_help=None, - notice_type_form_help=None, - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MessageManager.success(content='编辑成功') + + return dict( + notice_title_form_status=None, + notice_type_form_status=None, + notice_title_form_help=None, + notice_type_form_help=None, + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( notice_title_form_status=None, notice_type_form_status=None, notice_title_form_help=None, notice_type_form_help=None, - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -503,12 +460,8 @@ def notice_confirm( notice_type_form_help=None if validate_data_not_empty(notice_type) else '请输入公告类型!', - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @@ -541,11 +494,11 @@ def notice_delete_modal( """ 显示删除通知公告二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'notice-operation-button'} or ( trigger_id == 'notice-list-table' and clicked_content == '删除' ): - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'notice-operation-button'}: notice_ids = ','.join(selected_row_keys) @@ -553,7 +506,7 @@ def notice_delete_modal( if clicked_content == '删除': notice_ids = recently_button_clicked_row['key'] else: - return dash.no_update + return no_update return [f'是否确认删除序号为{notice_ids}的通知公告?', True, notice_ids] @@ -561,11 +514,7 @@ def notice_delete_modal( @app.callback( - [ - Output('notice-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('notice-operations-store', 'data', allow_duplicate=True), Input('notice-delete-confirm-modal', 'okCounts'), State('notice-delete-ids-store', 'data'), prevent_initial_call=True, @@ -576,18 +525,9 @@ def notice_delete_confirm(delete_confirm, notice_ids_data): """ if delete_confirm: params = notice_ids_data - delete_button_info = NoticeApi.del_notice(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + NoticeApi.del_notice(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return ({'type': 'delete'},) raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index f23b3b1..e73af39 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -1,23 +1,13 @@ -import dash import time import uuid -from dash import dcc -from dash.dependencies import Input, Output, State, ALL +from dash import ctx, dcc, no_update +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.post import PostApi from server import app from utils.common import validate_data_not_empty -from api.system.post import PostApi +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager -from api.post import ( - get_post_list_api, - get_post_detail_api, - add_post_api, - edit_post_api, - delete_post_api, - export_post_list_api, -) @app.callback( @@ -28,9 +18,6 @@ from api.post import ( ), post_table_key=Output('post-list-table', 'key'), post_table_selectedrowkeys=Output('post-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('post-search', 'nClicks'), @@ -42,7 +29,6 @@ from api.post import ( post_code=State('post-post_code-input', 'value'), post_name=State('post-post_name-input', 'value'), status_select=State('post-status-select', 'value'), - button_perms=State('post-button-perms-container', 'data'), ), prevent_initial_call=True, ) @@ -54,7 +40,6 @@ def get_post_table_data( post_code, post_name, status_select, - button_perms, ): """ 获取岗位表格数据回调(进行表格相关增删查改操作后均会触发此回调) @@ -67,55 +52,44 @@ def get_post_table_data( page_num=1, page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'post-list-table': - query_params = dict( - post_code=post_code, - post_name=post_name, - status=status_select, - page_num=pagination['current'], - page_size=pagination['pageSize'], + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: table_info = PostApi.list_post(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - item['key'] = str(item['post_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:post:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:post:remove') - else {}, - ] - return dict( - post_table_data=table_data, - post_table_pagination=table_pagination, - post_table_key=str(uuid.uuid4()), - post_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) - + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + item['key'] = str(item['post_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:post:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:post:remove') + else {}, + ] return dict( - post_table_data=dash.no_update, - post_table_pagination=dash.no_update, - post_table_key=dash.no_update, - post_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + post_table_data=table_data, + post_table_pagination=table_pagination, + post_table_key=str(uuid.uuid4()), + post_table_selectedrowkeys=None, ) raise PreventUpdate @@ -174,7 +148,7 @@ def change_post_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1: @@ -196,7 +170,7 @@ def change_post_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -221,9 +195,6 @@ def change_post_delete_button_status(table_rows_selected): 'help', allow_duplicate=True, ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('post-edit-id-store', 'data'), modal_type=Output('post-operations-store-bk', 'data'), ), @@ -252,16 +223,16 @@ def add_edit_post_modal( """ 显示新增或编辑岗位弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if ( trigger_id == {'index': 'add', 'type': 'post-operation-button'} or trigger_id == {'index': 'edit', 'type': 'post-operation-button'} or (trigger_id == 'post-list-table' and clicked_content == '修改') ): # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'post-operation-button'}: post_info = dict( post_name=None, @@ -276,7 +247,6 @@ def add_edit_post_modal( form_value=[post_info.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger=dash.no_update, edit_row_info=None, modal_type={'type': 'add'}, ) @@ -289,26 +259,23 @@ def add_edit_post_modal( else: post_id = int(recently_button_clicked_row['key']) post_info_res = PostApi.get_post(post_id=post_id) - if post_info_res['code'] == 200: - post_info = post_info_res['data'] - return dict( - modal_visible=True, - modal_title='编辑岗位', - form_value=[post_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=post_info if post_info else None, - modal_type={'type': 'edit'}, - ) + post_info = post_info_res['data'] + return dict( + modal_visible=True, + modal_title='编辑岗位', + form_value=[post_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + edit_row_info=post_info if post_info else None, + modal_type={'type': 'edit'}, + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=no_update, + modal_title=no_update, + form_value=[no_update] * len(form_value_list), + form_label_validate_status=[no_update] * len(form_label_list), + form_label_validate_info=[no_update] * len(form_label_list), edit_row_info=None, modal_type=None, ) @@ -332,12 +299,6 @@ def add_edit_post_modal( operations=Output( 'post-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('post-modal', 'okCounts')), state=dict( @@ -358,15 +319,13 @@ def post_confirm( """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] - ] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + x['id']['index']: x.get('value') for x in ctx.states_list[-2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) @@ -379,49 +338,39 @@ def post_confirm( params_edit['post_id'] = ( edit_row_info.get('post_id') if edit_row_info else None ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = PostApi.add_post(params_add) + PostApi.add_post(params_add) if modal_type == 'edit': - api_res = PostApi.update_post(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + PostApi.update_post(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'add'}, + ) + if modal_type == 'edit': + MessageManager.success(content='编辑成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -437,12 +386,8 @@ def post_confirm( else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @@ -475,7 +420,7 @@ def post_delete_modal( """ 显示删除岗位二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'post-operation-button'} or ( trigger_id == 'post-list-table' and clicked_content == '删除' ): @@ -493,11 +438,7 @@ def post_delete_modal( @app.callback( - [ - Output('post-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('post-operations-store', 'data', allow_duplicate=True), Input('post-delete-confirm-modal', 'okCounts'), State('post-delete-ids-store', 'data'), prevent_initial_call=True, @@ -508,19 +449,10 @@ def post_delete_confirm(delete_confirm, post_ids_data): """ if delete_confirm: params = post_ids_data - delete_button_info = PostApi.del_post(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + PostApi.del_post(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -529,8 +461,6 @@ def post_delete_confirm(delete_confirm, post_ids_data): [ Output('post-export-container', 'data', allow_duplicate=True), Output('post-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('post-export', 'nClicks'), prevent_initial_call=True, @@ -541,24 +471,15 @@ def export_post_list(export_click): """ if export_click: export_post_res = PostApi.export_post({}) - if export_post_res.status_code == 200: - export_post = export_post_res.content - - return [ - dcc.send_bytes( - export_post, - f'岗位信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + export_post = export_post_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_post, + f'岗位信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 1818f60..dd2966f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -1,16 +1,14 @@ -import dash +import base64 import time import uuid -import base64 from io import BytesIO -from dash import dcc -from dash.dependencies import Input, Output, State, ALL +from dash import ctx, dcc, no_update +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.user import UserApi from server import app from utils.common import validate_data_not_empty -from api.system.user import UserApi +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -30,9 +28,6 @@ app.clientside_callback( ), user_table_key=Output('user-list-table', 'key'), user_table_selectedrowkeys=Output('user-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( selected_dept_tree=Input('dept-tree', 'selectedKeys'), @@ -81,7 +76,7 @@ def get_user_table_data_by_dept_tree( page_num=1, page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'user-list-table': query_params.update( { @@ -97,58 +92,48 @@ def get_user_table_data_by_dept_tree( or operations ): table_info = UserApi.list_user(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict( - checked=True, disabled=item['user_id'] == 1 - ) - else: - item['status'] = dict( - checked=False, disabled=item['user_id'] == 1 - ) - item['key'] = str(item['user_id']) - if item['user_id'] == 1: - item['operation'] = [] - else: - item['operation'] = [ - {'title': '修改', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:user:edit') - else None, - {'title': '删除', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:user:remove') - else None, - {'title': '重置密码', 'icon': 'antd-key'} - if PermissionManager.check_perms('system:user:resetPwd') - else None, - {'title': '分配角色', 'icon': 'antd-check-circle'} - if PermissionManager.check_perms('system:user:edit') - else None, - ] - - return dict( - user_table_data=table_data, - user_table_pagination=table_pagination, - user_table_key=str(uuid.uuid4()), - user_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict( + checked=True, disabled=item['user_id'] == 1 + ) + else: + item['status'] = dict( + checked=False, disabled=item['user_id'] == 1 + ) + item['key'] = str(item['user_id']) + if item['user_id'] == 1: + item['operation'] = [] + else: + item['operation'] = [ + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:user:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:user:remove') + else None, + {'title': '重置密码', 'icon': 'antd-key'} + if PermissionManager.check_perms('system:user:resetPwd') + else None, + {'title': '分配角色', 'icon': 'antd-check-circle'} + if PermissionManager.check_perms('system:user:edit') + else None, + ] return dict( - user_table_data=dash.no_update, - user_table_pagination=dash.no_update, - user_table_key=dash.no_update, - user_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + user_table_data=table_data, + user_table_pagination=table_pagination, + user_table_key=str(uuid.uuid4()), + user_table_selectedrowkeys=None, ) raise PreventUpdate @@ -209,7 +194,7 @@ def change_user_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1 or '1' in table_rows_selected: @@ -231,7 +216,7 @@ def change_user_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if '1' in table_rows_selected: @@ -267,9 +252,6 @@ def change_user_delete_button_status(table_rows_selected): user_role=Output('user-add-role', 'value'), post_option=Output('user-add-post', 'options'), role_option=Output('user-add-role', 'options'), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict(add_click=Input('user-add', 'nClicks')), prevent_initial_call=True, @@ -280,57 +262,42 @@ def add_user_modal(add_click): """ if add_click: # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] tree_info = UserApi.dept_tree_select() detail_info = UserApi.get_user(user_id='') - if tree_info['code'] == 200 and detail_info['code'] == 200: - tree_data = tree_info['data'] - post_option = detail_info['posts'] - role_option = detail_info['roles'] - user_info = dict( - nick_name=None, - dept_id=None, - phonenumber=None, - email=None, - user_name=None, - password=None, - sex=None, - status='0', - remark=None, - ) - - return dict( - modal_visible=True, - dept_tree=tree_data, - form_value=[user_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - user_post=None, - user_role=None, - post_option=[ - dict(label=item['post_name'], value=item['post_id']) - for item in post_option - ], - role_option=[ - dict(label=item['role_name'], value=item['role_id']) - for item in role_option - ], - api_check_token_trigger={'timestamp': time.time()}, - ) + tree_data = tree_info['data'] + post_option = detail_info['posts'] + role_option = detail_info['roles'] + user_info = dict( + nick_name=None, + dept_id=None, + phonenumber=None, + email=None, + user_name=None, + password=None, + sex=None, + status='0', + remark=None, + ) return dict( - modal_visible=dash.no_update, - dept_tree=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - user_post=dash.no_update, - user_role=dash.no_update, - post_option=dash.no_update, - role_option=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=True, + dept_tree=tree_data, + form_value=[user_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + user_post=None, + user_role=None, + post_option=[ + dict(label=item['post_name'], value=item['post_id']) + for item in post_option + ], + role_option=[ + dict(label=item['role_name'], value=item['role_id']) + for item in role_option + ], ) raise PreventUpdate @@ -352,12 +319,6 @@ def add_user_modal(add_click): operations=Output( 'user-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(add_confirm=Input('user-add-modal', 'okCounts')), state=dict( @@ -376,15 +337,13 @@ def add_user_modal(add_click): def usr_add_confirm(add_confirm, post, role, form_value, form_label): if add_confirm: # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] - ] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + x['id']['index']: x.get('value') for x in ctx.states_list[-2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( @@ -396,31 +355,14 @@ def usr_add_confirm(add_confirm, post, role, form_value, form_label): params = form_value_state params['post_ids'] = post if post else '' params['role_ids'] = role if role else '' - add_button_result = UserApi.add_user(params) - - if add_button_result['code'] == 200: - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) + UserApi.add_user(params) + MessageManager.success(content='新增成功') return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增失败', type='error' - ), + modal_visible=False, + operations={'type': 'add'}, ) return dict( @@ -436,12 +378,8 @@ def usr_add_confirm(add_confirm, post, role, form_value, form_label): else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '新增失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @@ -473,9 +411,6 @@ def usr_add_confirm(add_confirm, post, role, form_value, form_label): post_option=Output('user-edit-post', 'options'), role_option=Output('user-edit-role', 'options'), edit_row_info=Output('user-edit-id-store', 'data'), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( operation_click=Input( @@ -504,15 +439,15 @@ def user_edit_modal( """ 显示编辑用户弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'edit', 'type': 'user-operation-button'} or ( trigger_id == 'user-list-table' and recently_clicked_dropdown_item_title == '修改' ): # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] tree_data = UserApi.dept_tree_select()['data'] @@ -525,53 +460,37 @@ def user_edit_modal( raise PreventUpdate edit_button_info = UserApi.get_user(user_id) - if edit_button_info['code'] == 200: - edit_button_result = edit_button_info['data'] - post_option = edit_button_info['posts'] - role_option = edit_button_info['roles'] - role_ids = edit_button_result['role_ids'] - post_ids = edit_button_result['post_ids'] - - return dict( - modal_visible=True, - dept_tree=tree_data, - form_value=[edit_button_result.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - user_post=[int(item) for item in post_ids.split(',')] - if post_ids - else [], - user_role=[int(item) for item in role_ids.split(',')] - if role_ids - else [], - post_option=[ - dict(label=item['post_name'], value=item['post_id']) - for item in post_option - if item - ] - or [], - role_option=[ - dict(label=item['role_name'], value=item['role_id']) - for item in role_option - if item - ] - or [], - edit_row_info={'user_id': user_id}, - api_check_token_trigger={'timestamp': time.time()}, - ) + edit_button_result = edit_button_info['data'] + post_option = edit_button_info['posts'] + role_option = edit_button_info['roles'] + role_ids = edit_button_result['role_ids'] + post_ids = edit_button_result['post_ids'] return dict( - modal_visible=dash.no_update, - dept_tree=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - user_post=dash.no_update, - user_role=dash.no_update, - post_option=dash.no_update, - role_option=dash.no_update, - edit_row_info=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=True, + dept_tree=tree_data, + form_value=[edit_button_result.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + user_post=[int(item) for item in post_ids.split(',')] + if post_ids + else [], + user_role=[int(item) for item in role_ids.split(',')] + if role_ids + else [], + post_option=[ + dict(label=item['post_name'], value=item['post_id']) + for item in post_option + if item + ] + or [], + role_option=[ + dict(label=item['role_name'], value=item['role_id']) + for item in role_option + if item + ] + or [], + edit_row_info={'user_id': user_id}, ) raise PreventUpdate @@ -595,12 +514,6 @@ def user_edit_modal( operations=Output( 'user-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(edit_confirm=Input('user-edit-modal', 'okCounts')), state=dict( @@ -622,15 +535,13 @@ def usr_edit_confirm( ): if edit_confirm: # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] - ] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + x['id']['index']: x.get('value') for x in ctx.states_list[-2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( @@ -645,31 +556,14 @@ def usr_edit_confirm( ) params['post_ids'] = ','.join(map(str, post)) if post else '' params['role_ids'] = ','.join(map(str, role)) if role else '' - edit_button_result = UserApi.update_user(params) - - if edit_button_result['code'] == 200: - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + UserApi.update_user(params) + MessageManager.success(content='编辑成功') return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑失败', type='error' - ), + modal_visible=False, + operations={'type': 'edit'}, ) return dict( @@ -685,23 +579,15 @@ def usr_edit_confirm( else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '编辑失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @app.callback( - [ - Output('user-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('user-operations-store', 'data', allow_duplicate=True), [ Input('user-list-table', 'recentlySwitchDataIndex'), Input('user-list-table', 'recentlySwitchStatus'), @@ -716,22 +602,13 @@ def table_switch_user_status( 表格内切换用户状态回调 """ if recently_switch_data_index: - edit_button_result = UserApi.change_user_status( + UserApi.change_user_status( user_id=recently_switch_row['key'], status='0' if recently_switch_status else '1', ) - if edit_button_result['code'] == 200: - return [ - {'type': 'switch-status'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success'), - ] + MessageManager.success(content='修改成功') - return [ - {'type': 'switch-status'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error'), - ] + return {'type': 'switch-status'} raise PreventUpdate @@ -763,7 +640,7 @@ def user_delete_modal( """ 显示删除用户二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'user-operation-button'} or ( trigger_id == 'user-list-table' and recently_clicked_dropdown_item_title == '删除' @@ -786,11 +663,7 @@ def user_delete_modal( @app.callback( - [ - Output('user-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('user-operations-store', 'data', allow_duplicate=True), Input('user-delete-confirm-modal', 'okCounts'), State('user-delete-ids-store', 'data'), prevent_initial_call=True, @@ -801,19 +674,10 @@ def user_delete_confirm(delete_confirm, user_ids_data): """ if delete_confirm: params = user_ids_data - delete_button_info = UserApi.del_user(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + UserApi.del_user(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -851,11 +715,7 @@ def user_reset_password_modal( @app.callback( - [ - Output('user-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('user-operations-store', 'data', allow_duplicate=True), Input('user-reset-password-confirm-modal', 'okCounts'), [ State('reset-password-row-key-store', 'data'), @@ -868,21 +728,10 @@ def user_reset_password_confirm(reset_confirm, user_id_data, reset_password): 重置用户密码弹窗确认回调,实现重置密码操作 """ if reset_confirm: - reset_button_info = UserApi.reset_user_pwd( - user_id=user_id_data, password=reset_password - ) - if reset_button_info['code'] == 200: - return [ - {'type': 'reset-password'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('重置成功', type='success'), - ] + UserApi.reset_user_pwd(user_id=user_id_data, password=reset_password) + MessageManager.success(content='重置成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('重置失败', type='error'), - ] + return {'type': 'reset-password'} raise PreventUpdate @@ -965,12 +814,6 @@ app.clientside_callback( operations=Output( 'user-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(import_confirm=Input('user-import-confirm-modal', 'okCounts')), state=dict( @@ -991,40 +834,22 @@ def user_import_confirm(import_confirm, contents, is_update): file=BytesIO(base64.b64decode(contents.split(',', 1)[1])), update_support=is_update, ) - if batch_import_result.get('code') == 200: - return dict( - confirm_loading=False, - modal_visible=True - if batch_import_result.get('msg') - else False, - batch_result=batch_import_result.get('msg'), - operations={'type': 'batch-import'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '导入成功', type='success' - ), - ) + MessageManager.success(content='导入成功') return dict( confirm_loading=False, - modal_visible=True, + modal_visible=True if batch_import_result.get('msg') else False, batch_result=batch_import_result.get('msg'), - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '导入失败', type='error' - ), + operations={'type': 'batch-import'}, ) else: + MessageManager.warning(content='请上传需要导入的文件') + return dict( confirm_loading=False, - modal_visible=dash.no_update, - batch_result=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '请上传需要导入的文件', type='error' - ), + modal_visible=no_update, + batch_result=no_update, + operations=no_update, ) raise PreventUpdate @@ -1034,8 +859,6 @@ def user_import_confirm(import_confirm, contents, is_update): [ Output('user-export-container', 'data', allow_duplicate=True), Output('user-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], [ Input('user-export', 'nClicks'), @@ -1047,50 +870,33 @@ def export_user_list(export_click, download_click): """ 导出用户信息回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if export_click or download_click: if trigger_id == 'user-export': export_user_res = UserApi.export_user({}) - if export_user_res.status_code == 200: - export_user = export_user_res.content - - return [ - dcc.send_bytes( - export_user, - f'用户信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + MessageManager.success(content='导出成功') + + export_user = export_user_res.content return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_user, + f'用户信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] if trigger_id == 'download-user-import-template': download_template_res = UserApi.download_template() - if download_template_res.status_code == 200: - download_template = download_template_res.content - - return [ - dcc.send_bytes( - download_template, - f'用户导入模板_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('下载成功', type='success'), - ] + download_template = download_template_res.content + MessageManager.success(content='下载成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + download_template, + f'用户导入模板_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('下载失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py index b34f674..b26971b 100644 --- a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py @@ -1,8 +1,7 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.monitor_c.logininfor_c # noqa: F401 +from dash import dcc, html from api.monitor.logininfor import LogininforApi +from callbacks.monitor_c import logininfor_c # noqa: F401 from utils.permission_util import PermissionManager @@ -11,21 +10,16 @@ def render(*args, **kwargs): login_log_params = dict(page_num=1, page_size=10) table_info = LogininforApi.list_logininfor(login_log_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - item['key'] = str(item['info_id']) + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='成功', color='blue') + else: + item['status'] = dict(tag='失败', color='volcano') + item['key'] = str(item['info_id']) return [ dcc.Store(id='login_log-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index 933e7e8..49f31e0 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -1,64 +1,54 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.monitor_c.operlog_c # noqa: F401 +from dash import dcc, html from api.monitor.operlog import OperlogApi from api.system.dict.data import DictDataApi +from callbacks.monitor_c import operlog_c # noqa: F401 from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - - option = [] - option_table = [] info = DictDataApi.get_dicts(dict_type='sys_oper_type') - if info.get('code') == 200: - data = info.get('data') - option = [ - dict(label=item.get('dict_label'), value=item.get('dict_value')) - for item in data - ] - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] + data = info.get('data') + option = [ + dict(label=item.get('dict_label'), value=item.get('dict_value')) + for item in data + ] + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} operation_log_params = dict(page_num=1, page_size=10) table_info = OperlogApi.list_operlog(operation_log_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == 0: - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - if str(item.get('business_type')) in option_dict.keys(): - item['business_type'] = dict( - tag=option_dict.get(str(item.get('business_type'))).get( - 'label' - ), - color='blue', - ) - item['key'] = str(item['oper_id']) - item['cost_time'] = f"{item['cost_time']}毫秒" - item['operation'] = [ - {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} - if PermissionManager.check_perms('monitor:operlog:query') - else {}, - ] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == 0: + item['status'] = dict(tag='成功', color='blue') + else: + item['status'] = dict(tag='失败', color='volcano') + if str(item.get('business_type')) in option_dict.keys(): + item['business_type'] = dict( + tag=option_dict.get(str(item.get('business_type'))).get( + 'label' + ), + color='blue', + ) + item['key'] = str(item['oper_id']) + item['cost_time'] = f"{item['cost_time']}毫秒" + item['operation'] = [ + {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:operlog:query') + else {}, + ] return [ dcc.Store(id='operation_log-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index 8aa8aa5..8b1d9e9 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -1,39 +1,32 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.system_c.config_c # noqa: F401 +from dash import dcc, html from api.system.config import ConfigApi +from callbacks.system_c import config_c # noqa: F401 from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - config_params = dict(page_num=1, page_size=10) table_info = ConfigApi.list_config(config_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['config_type'] == 'Y': - item['config_type'] = dict(tag='是', color='blue') - else: - item['config_type'] = dict(tag='否', color='volcano') - item['key'] = str(item['config_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:config:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:config:remove') - else {}, - ] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['config_type'] == 'Y': + item['config_type'] = dict(tag='是', color='blue') + else: + item['config_type'] = dict(tag='否', color='volcano') + item['key'] = str(item['config_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:config:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:config:remove') + else {}, + ] return [ dcc.Store(id='config-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/system/dept/__init__.py b/dash-fastapi-frontend/views/system/dept/__init__.py index ba530a4..ec1aa09 100644 --- a/dash-fastapi-frontend/views/system/dept/__init__.py +++ b/dash-fastapi-frontend/views/system/dept/__init__.py @@ -1,57 +1,54 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.system_c.dept_c # noqa: F401 +from dash import dcc, html from api.system.dept import DeptApi +from callbacks.system_c import dept_c # noqa: F401 from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - table_data_new = [] default_expanded_row_keys = [] table_info = DeptApi.list_dept({}) - if table_info['code'] == 200: - table_data = table_info['data'] - for item in table_data: - default_expanded_row_keys.append(str(item['dept_id'])) - item['key'] = str(item['dept_id']) - if item['parent_id'] == 0: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - ] - elif item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') + table_data = table_info['data'] + for item in table_data: + default_expanded_row_keys.append(str(item['dept_id'])) + item['key'] = str(item['dept_id']) + if item['parent_id'] == 0: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, + ] + elif item['status'] == '1': + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dept:remove') + else {}, + ] + else: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dept:remove') + else {}, + ] + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') return [ dcc.Store(id='dept-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index 2d67bf4..1a193b7 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -1,44 +1,37 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.system_c.dict_c.dict_c # noqa: F401 -from . import dict_data +from dash import dcc, html from api.system.dict.type import DictTypeApi +from callbacks.system_c.dict_c import dict_c # noqa: F401 from utils.permission_util import PermissionManager +from . import dict_data def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - dict_type_params = dict(page_num=1, page_size=10) table_info = DictTypeApi.list_type(dict_type_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - item['key'] = str(item['dict_id']) - item['dict_type'] = { - 'content': item['dict_type'], - 'type': 'link', - } - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dict:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dict:remove') - else {}, - ] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + item['key'] = str(item['dict_id']) + item['dict_type'] = { + 'content': item['dict_type'], + 'type': 'link', + } + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dict:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dict:remove') + else {}, + ] return [ dcc.Store(id='dict_type-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index 7f7a9b2..1c22764 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -1,54 +1,51 @@ -from dash import dcc, html import feffery_antd_components as fac - +from dash import dcc, html from api.system.menu import MenuApi +from callbacks.system_c.menu_c import menu_c # noqa: F401 from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree from views.system.menu.components.icon_category import render_icon -import callbacks.system_c.menu_c.menu_c # noqa: F401 def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - table_data_new = [] table_info = MenuApi.list_menu({}) - if table_info['code'] == 200: - table_data = table_info['data'] - for item in table_data: - item['key'] = str(item['menu_id']) - item['icon'] = [ - { - 'type': 'link', - 'icon': item['icon'], - 'disabled': True, - 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, - }, + table_data = table_info['data'] + for item in table_data: + item['key'] = str(item['menu_id']) + item['icon'] = [ + { + 'type': 'link', + 'icon': item['icon'], + 'disabled': True, + 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, + }, + ] + if item['status'] == '1': + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:menu:remove') + else {}, + ] + else: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:menu:add') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:menu:remove') + else {}, ] - if item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:menu:add') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') return [ diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index 9be14bd..a3d7e31 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -1,71 +1,58 @@ -from dash import dcc, html import feffery_antd_components as fac import feffery_utils_components as fuc -from flask import session -import json import uuid - -import callbacks.system_c.notice_c -from config.global_config import ApiBaseUrlConfig +from dash import dcc, html +from flask import session from api.system.notice import NoticeApi from api.system.dict.data import DictDataApi +from callbacks.system_c import notice_c # noqa: F401 +from config.global_config import ApiBaseUrlConfig from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - - option = [] - option_table = [] info = DictDataApi.get_dicts(dict_type='sys_notice_type') - if info.get('code') == 200: - data = info.get('data') - option = [ - dict(label=item.get('dict_label'), value=item.get('dict_value')) - for item in data - ] - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] + data = info.get('data') + option = [ + dict(label=item.get('dict_label'), value=item.get('dict_value')) + for item in data + ] + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} notice_params = dict(page_num=1, page_size=10) table_info = NoticeApi.list_notice(notice_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='关闭', color='volcano') - if str(item.get('notice_type')) in option_dict.keys(): - item['notice_type'] = dict( - tag=option_dict.get(str(item.get('notice_type'))).get( - 'label' - ), - color='blue', - ) - item['key'] = str(item['notice_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:notice:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:notice:remove') - else {}, - ] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='关闭', color='volcano') + if str(item.get('notice_type')) in option_dict.keys(): + item['notice_type'] = dict( + tag=option_dict.get(str(item.get('notice_type'))).get('label'), + color='blue', + ) + item['key'] = str(item['notice_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:notice:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:notice:remove') + else {}, + ] return [ dcc.Store(id='notice-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index ac2019b..576c915 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -1,8 +1,7 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.system_c.post_c +from dash import dcc, html from api.system.post import PostApi +from callbacks.system_c import post_c # noqa: F401 from utils.permission_util import PermissionManager @@ -11,29 +10,24 @@ def render(*args, **kwargs): post_params = dict(page_num=1, page_size=10) table_info = PostApi.list_post(post_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - item['key'] = str(item['post_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:post:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:post:remove') - else {}, - ] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + item['key'] = str(item['post_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:post:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:post:remove') + else {}, + ] return [ dcc.Store(id='post-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index e31a593..3bf7824 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -1,111 +1,98 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.system_c.role_c.role_c # noqa: F401 -from . import data_scope, allocate_user +from dash import dcc, html from api.system.role import RoleApi +from callbacks.system_c.role_c import role_c # noqa: F401 from utils.permission_util import PermissionManager +from . import data_scope, allocate_user def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - role_params = dict(page_num=1, page_size=10) table_info = RoleApi.list_role(role_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict( - checked=True, disabled=item['role_id'] == 1 - ) - else: - item['status'] = dict( - checked=False, disabled=item['role_id'] == 1 - ) - item['key'] = str(item['role_id']) - if item['role_id'] == 1: - item['operation'] = [] - else: - item['operation'] = fac.AntdSpace( - [ + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == '0': + item['status'] = dict(checked=True, disabled=item['role_id'] == 1) + else: + item['status'] = dict(checked=False, disabled=item['role_id'] == 1) + item['key'] = str(item['role_id']) + if item['role_id'] == 1: + item['operation'] = [] + else: + item['operation'] = fac.AntdSpace( + [ + fac.AntdButton( + '修改', + id={ + 'type': 'role-operation-table', + 'operation': 'edit', + 'index': str(item['role_id']), + }, + type='link', + icon=fac.AntdIcon(icon='antd-edit'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:edit') + else [], + fac.AntdButton( + '删除', + id={ + 'type': 'role-operation-table', + 'operation': 'delete', + 'index': str(item['role_id']), + }, + type='link', + icon=fac.AntdIcon(icon='antd-delete'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:remove') + else [], + fac.AntdPopover( fac.AntdButton( - '修改', - id={ - 'type': 'role-operation-table', - 'operation': 'edit', - 'index': str(item['role_id']), - }, - type='link', - icon=fac.AntdIcon(icon='antd-edit'), - style={'padding': 0}, - ) - if PermissionManager.check_perms('system:role:edit') - else [], - fac.AntdButton( - '删除', - id={ - 'type': 'role-operation-table', - 'operation': 'delete', - 'index': str(item['role_id']), - }, + '更多', type='link', - icon=fac.AntdIcon(icon='antd-delete'), + icon=fac.AntdIcon(icon='antd-more'), style={'padding': 0}, - ) - if PermissionManager.check_perms('system:role:remove') - else [], - fac.AntdPopover( - fac.AntdButton( - '更多', - type='link', - icon=fac.AntdIcon(icon='antd-more'), - style={'padding': 0}, - ), - content=fac.AntdSpace( - [ - fac.AntdButton( - '数据权限', - id={ - 'type': 'role-operation-table', - 'operation': 'datascope', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon( - icon='antd-check-circle' - ), - style={'padding': 0}, - ), - fac.AntdButton( - '分配用户', - id={ - 'type': 'role-operation-table', - 'operation': 'allocation', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon(icon='antd-user'), - style={'padding': 0}, - ), - ], - direction='vertical', - ), - placement='bottomRight', - ) - if PermissionManager.check_perms('system:role:edit') - else [], - ] - ) + ), + content=fac.AntdSpace( + [ + fac.AntdButton( + '数据权限', + id={ + 'type': 'role-operation-table', + 'operation': 'datascope', + 'index': str(item['role_id']), + }, + type='text', + block=True, + icon=fac.AntdIcon(icon='antd-check-circle'), + style={'padding': 0}, + ), + fac.AntdButton( + '分配用户', + id={ + 'type': 'role-operation-table', + 'operation': 'allocation', + 'index': str(item['role_id']), + }, + type='text', + block=True, + icon=fac.AntdIcon(icon='antd-user'), + style={'padding': 0}, + ), + ], + direction='vertical', + ), + placement='bottomRight', + ) + if PermissionManager.check_perms('system:role:edit') + else [], + ] + ) return [ dcc.Store(id='role-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index b156252..2d2413d 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -1,15 +1,13 @@ -from dash import dcc, html import feffery_antd_components as fac import feffery_utils_components as fuc +from dash import dcc, html from flask import session - -from . import allocate_role -from views.components import ManuallyUpload from api.system.user import UserApi -from utils.permission_util import PermissionManager from config.global_config import ApiBaseUrlConfig - -import callbacks.system_c.user_c.user_c # noqa: F401 +from callbacks.system_c.user_c import user_c # noqa: F401 +from utils.permission_util import PermissionManager +from views.components import ManuallyUpload +from . import allocate_role def render(*args, **kwargs): @@ -17,45 +15,34 @@ def render(*args, **kwargs): user_params = dict(page_num=1, page_size=10) tree_info = UserApi.dept_tree_select() table_info = UserApi.list_user(user_params) - tree_data = [] - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if tree_info['code'] == 200: - tree_data = tree_info['data'] - if table_info['code'] == 200: - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict( - checked=True, disabled=item['user_id'] == 1 - ) - else: - item['status'] = dict( - checked=False, disabled=item['user_id'] == 1 - ) - item['key'] = str(item['user_id']) - if item['user_id'] == 1: - item['operation'] = [] - else: - item['operation'] = [ - {'title': '修改', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:user:edit') - else None, - {'title': '删除', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:user:remove') - else None, - {'title': '重置密码', 'icon': 'antd-key'} - if PermissionManager.check_perms('system:user:resetPwd') - else None, - {'title': '分配角色', 'icon': 'antd-check-circle'} - if PermissionManager.check_perms('system:user:edit') - else None, - ] + tree_data = tree_info['data'] + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == '0': + item['status'] = dict(checked=True, disabled=item['user_id'] == 1) + else: + item['status'] = dict(checked=False, disabled=item['user_id'] == 1) + item['key'] = str(item['user_id']) + if item['user_id'] == 1: + item['operation'] = [] + else: + item['operation'] = [ + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:user:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:user:remove') + else None, + {'title': '重置密码', 'icon': 'antd-key'} + if PermissionManager.check_perms('system:user:resetPwd') + else None, + {'title': '分配角色', 'icon': 'antd-check-circle'} + if PermissionManager.check_perms('system:user:edit') + else None, + ] return [ dcc.Store(id='user-button-perms-container', data=button_perms), -- Gitee From e2cab7def2edea469cdb25bcbf9555cd0dc23628 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:30:41 +0800 Subject: [PATCH 038/229] =?UTF-8?q?feat:=20=E5=9C=A8=E7=BA=BF=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=96=B0=E5=A2=9E=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/online_controller.py | 24 +++++++++++++++++-- .../module_admin/entity/vo/online_vo.py | 12 +++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/dash-fastapi-backend/module_admin/controller/online_controller.py b/dash-fastapi-backend/module_admin/controller/online_controller.py index 03eb70f..56c6555 100644 --- a/dash-fastapi-backend/module_admin/controller/online_controller.py +++ b/dash-fastapi-backend/module_admin/controller/online_controller.py @@ -4,11 +4,11 @@ from config.enums import BusinessType from config.get_db import get_db from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.entity.vo.online_vo import DeleteOnlineModel, OnlineQueryModel +from module_admin.entity.vo.online_vo import DeleteOnlineModel, OnlinePageQueryModel, OnlineQueryModel from module_admin.service.login_service import LoginService from module_admin.service.online_service import OnlineService from utils.log_util import logger -from utils.page_util import PageResponseModel +from utils.page_util import PageResponseModel, PageUtil from utils.response_util import ResponseUtil @@ -30,6 +30,26 @@ async def get_monitor_online_list( ) +@onlineController.get( + '/list/page', + response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:list'))], +) +async def get_monitor_online_page_list( + request: Request, online_page_query: OnlinePageQueryModel = Depends(OnlinePageQueryModel.as_query) +): + online_query = OnlineQueryModel(**online_page_query.model_dump(by_alias=True)) + # 获取全量数据 + online_query_result = await OnlineService.get_online_list_services(request, online_query) + # 获取分页数据 + online_page_query_result = PageUtil.get_page_obj( + online_query_result, online_page_query.page_num, online_page_query.page_size + ) + logger.info('获取成功') + + return ResponseUtil.success(model_content=online_page_query_result) + + @onlineController.delete('/{token_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:forceLogout'))]) @Log(title='在线用户', business_type=BusinessType.FORCE) async def delete_monitor_online(request: Request, token_ids: str, query_db: AsyncSession = Depends(get_db)): diff --git a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py index 8c24789..a0a0eb7 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py @@ -22,13 +22,23 @@ class OnlineModel(BaseModel): @as_query class OnlineQueryModel(OnlineModel): """ - 岗位管理不分页查询模型 + 在线用户不分页查询模型 """ begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') +@as_query +class OnlinePageQueryModel(OnlineQueryModel): + """ + 在线用户分页查询模型 + """ + + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') + + class DeleteOnlineModel(BaseModel): """ 强退在线用户模型 -- Gitee From 3885d6f49eebcb98ef0bf6b976bf172c234f71c3 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:31:22 +0800 Subject: [PATCH 039/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E7=94=A8=E6=88=B7=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/monitor/online.py | 2 +- .../callbacks/monitor_c/online_c.py | 215 +++++++++--------- .../views/monitor/online/__init__.py | 119 +++++----- 3 files changed, 163 insertions(+), 173 deletions(-) diff --git a/dash-fastapi-frontend/api/monitor/online.py b/dash-fastapi-frontend/api/monitor/online.py index ef7e47e..d22734d 100644 --- a/dash-fastapi-frontend/api/monitor/online.py +++ b/dash-fastapi-frontend/api/monitor/online.py @@ -15,7 +15,7 @@ class OnlineApi: :return: """ return api_request( - url='/monitor/online/list', + url='/monitor/online/list/page', method='get', params=query, ) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py index 8a63b45..f52de32 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py @@ -1,89 +1,86 @@ -import dash -import time import uuid -from dash.dependencies import Input, Output, State, ALL +from dash import ctx +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.monitor.online import OnlineApi from server import app -from api.online import get_online_list_api, force_logout_online_api, batch_logout_online_api +from utils.feedback_util import MessageManager +from utils.permission_util import PermissionManager @app.callback( output=dict( - online_table_data=Output('online-list-table', 'data', allow_duplicate=True), - online_table_pagination=Output('online-list-table', 'pagination', allow_duplicate=True), + online_table_data=Output( + 'online-list-table', 'data', allow_duplicate=True + ), + online_table_pagination=Output( + 'online-list-table', 'pagination', allow_duplicate=True + ), online_table_key=Output('online-list-table', 'key'), - online_table_selectedrowkeys=Output('online-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + online_table_selectedrowkeys=Output( + 'online-list-table', 'selectedRowKeys' + ), ), inputs=dict( search_click=Input('online-search', 'nClicks'), refresh_click=Input('online-refresh', 'nClicks'), pagination=Input('online-list-table', 'pagination'), - operations=Input('online-operations-store', 'data') + operations=Input('online-operations-store', 'data'), ), state=dict( ipaddr=State('online-ipaddr-input', 'value'), user_name=State('online-user_name-input', 'value'), - button_perms=State('online-button-perms-container', 'data') + button_perms=State('online-button-perms-container', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_online_table_data(search_click, refresh_click, pagination, operations, ipaddr, user_name, button_perms): +def get_online_table_data( + search_click, + refresh_click, + pagination, + operations, + ipaddr, + user_name, + button_perms, +): """ 获取在线用户表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ query_params = dict( - ipaddr=ipaddr, - user_name=user_name, - page_num=1, - page_size=10 + ipaddr=ipaddr, user_name=user_name, page_num=1, page_size=10 ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'online-list-table': - query_params = dict( - ipaddr=ipaddr, - user_name=user_name, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - table_info = get_online_list_api(query_params) - if table_info['code'] == 200: - table_data = table_info['data']['rows'] - table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['data']['total'] - ) - for item in table_data: - item['key'] = str(item['session_id']) - item['operation'] = [ - { - 'content': '强退', - 'type': 'link', - 'icon': 'antd-delete' - } if 'monitor:online:forceLogout' in button_perms else {}, - ] - - return dict( - online_table_data=table_data, - online_table_pagination=table_pagination, - online_table_key=str(uuid.uuid4()), - online_table_selectedrowkeys=None, - api_check_token_trigger= {'timestamp': time.time()} - ) + table_info = OnlineApi.list_online(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['key'] = str(item['token_id']) + item['operation'] = [ + {'content': '强退', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('monitor:online:forceLogout') + else {}, + ] return dict( - online_table_data=dash.no_update, - online_table_pagination=dash.no_update, - online_table_key=dash.no_update, - online_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + online_table_data=table_data, + online_table_pagination=table_pagination, + online_table_key=str(uuid.uuid4()), + online_table_selectedrowkeys=None, ) raise PreventUpdate @@ -91,25 +88,27 @@ def get_online_table_data(search_click, refresh_click, pagination, operations, i # 重置在线用户搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('online-ipaddr-input', 'value'), - Output('online-user_name-input', 'value'), - Output('online-operations-store', 'data')], + """, + [ + Output('online-ipaddr-input', 'value'), + Output('online-user_name-input', 'value'), + Output('online-operations-store', 'data'), + ], Input('online-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示在线用户搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -119,28 +118,29 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('online-search-form-container', 'hidden'), - Output('online-hidden-tooltip', 'title')], + """, + [ + Output('online-search-form-container', 'hidden'), + Output('online-hidden-tooltip', 'title'), + ], Input('online-hidden', 'nClicks'), State('online-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'online-operation-button', 'index': 'delete'}, 'disabled'), Input('online-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_online_edit_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制批量强退按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -149,75 +149,68 @@ def change_online_edit_delete_button_status(table_rows_selected): @app.callback( - [Output('online-delete-text', 'children'), - Output('online-delete-confirm-modal', 'visible'), - Output('online-delete-ids-store', 'data')], - [Input({'type': 'online-operation-button', 'index': ALL}, 'nClicks'), - Input('online-list-table', 'nClicksButton')], - [State('online-list-table', 'selectedRowKeys'), - State('online-list-table', 'clickedContent'), - State('online-list-table', 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + Output('online-delete-text', 'children'), + Output('online-delete-confirm-modal', 'visible'), + Output('online-delete-ids-store', 'data'), + ], + [ + Input({'type': 'online-operation-button', 'index': ALL}, 'nClicks'), + Input('online-list-table', 'nClicksButton'), + ], + [ + State('online-list-table', 'selectedRowKeys'), + State('online-list-table', 'clickedContent'), + State('online-list-table', 'recentlyButtonClickedRow'), + ], + prevent_initial_call=True, ) -def online_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): +def online_delete_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示强退在线用户二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'online-operation-button'} or ( - trigger_id == 'online-list-table' and clicked_content == '强退'): - logout_type = '' - + trigger_id == 'online-list-table' and clicked_content == '强退' + ): if trigger_id == {'index': 'delete', 'type': 'online-operation-button'}: session_ids = ','.join(selected_row_keys) else: if clicked_content == '强退': session_ids = recently_button_clicked_row['key'] - logout_type = 'force' else: - return dash.no_update + raise PreventUpdate return [ f'是否确认强退会话编号为{session_ids}的会话?', True, - {'session_ids': session_ids, 'logout_type': logout_type} + session_ids, ] raise PreventUpdate @app.callback( - [Output('online-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + Output('online-operations-store', 'data', allow_duplicate=True), Input('online-delete-confirm-modal', 'okCounts'), State('online-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def online_delete_confirm(delete_confirm, session_ids_data): """ 强退在线用户弹窗确认回调,实现强退操作 """ if delete_confirm: + params = session_ids_data + OnlineApi.force_logout(params) + MessageManager.success(content='强退成功') - params = dict(session_ids=session_ids_data.get('session_ids')) - logout_type = session_ids_data.get('logout_type') - if logout_type == 'force': - delete_button_info = force_logout_online_api(params) - else: - delete_button_info = batch_logout_online_api(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'force'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('强退成功', type='success') - ] - - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('强退失败', type='error') - ] + return {'type': 'force'} raise PreventUpdate diff --git a/dash-fastapi-frontend/views/monitor/online/__init__.py b/dash-fastapi-frontend/views/monitor/online/__init__.py index db80ae5..0ab396d 100644 --- a/dash-fastapi-frontend/views/monitor/online/__init__.py +++ b/dash-fastapi-frontend/views/monitor/online/__init__.py @@ -1,33 +1,26 @@ from dash import dcc, html import feffery_antd_components as fac - -import callbacks.monitor_c.online_c -from api.online import get_online_list_api +from api.monitor.online import OnlineApi +from callbacks.monitor_c import online_c # noqa: F401 +from utils.permission_util import PermissionManager def render(*args, **kwargs): button_perms = kwargs.get('button_perms') online_params = dict(page_num=1, page_size=10) - table_info = get_online_list_api(online_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] - for item in table_data: - item['key'] = str(item['session_id']) - item['operation'] = [ - { - 'content': '强退', - 'type': 'link', - 'icon': 'antd-delete' - } if 'monitor:online:forceLogout' in button_perms else {}, - ] + table_info = OnlineApi.list_online(online_params) + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + item['key'] = str(item['token_id']) + item['operation'] = [ + {'content': '强退', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('monitor:online:forceLogout') + else {}, + ] return [ dcc.Store(id='online-button-perms-container', data=button_perms), @@ -57,9 +50,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 210 - } + }, ), - label='登录地址' + label='登录地址', ), fac.AntdFormItem( fac.AntdInput( @@ -69,9 +62,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 210 - } + }, ), - label='用户名称' + label='用户名称', ), fac.AntdFormItem( fac.AntdButton( @@ -80,7 +73,7 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ) ), fac.AntdFormItem( @@ -89,20 +82,20 @@ def render(*args, **kwargs): id='online-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ) - ) + ), ], style={ 'paddingBottom': '10px' - } + }, ), ], layout='inline', ) ], id='online-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -121,21 +114,23 @@ def render(*args, **kwargs): ], id={ 'type': 'online-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'monitor:online:batchLogout' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:online:batchLogout' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -149,10 +144,10 @@ def render(*args, **kwargs): ), ], id='online-hidden', - shape='circle' + shape='circle', ), id='online-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -164,24 +159,22 @@ def render(*args, **kwargs): ), ], id='online-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -192,7 +185,7 @@ def render(*args, **kwargs): data=table_data, columns=[ { - 'dataIndex': 'session_id', + 'dataIndex': 'token_id', 'title': '会话编号', 'renderOptions': { 'renderType': 'ellipsis' @@ -253,7 +246,7 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -262,28 +255,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 强退会话二次确认modal fac.AntdModal( fac.AntdText('是否确认强退?', id='online-delete-text'), @@ -291,6 +288,6 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] -- Gitee From 4a75139fac1206f17125d6d21a1a82b0b47598a8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:32:07 +0800 Subject: [PATCH 040/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/monitor/job.py | 8 +- .../callbacks/monitor_c/job_c/job_c.py | 742 ++++++++++-------- .../callbacks/monitor_c/job_c/job_log_c.py | 334 ++++---- .../views/monitor/job/__init__.py | 644 +++++++-------- .../views/monitor/job/job_log.py | 12 +- 5 files changed, 834 insertions(+), 906 deletions(-) diff --git a/dash-fastapi-frontend/api/monitor/job.py b/dash-fastapi-frontend/api/monitor/job.py index 334ba13..99dbac5 100644 --- a/dash-fastapi-frontend/api/monitor/job.py +++ b/dash-fastapi-frontend/api/monitor/job.py @@ -21,7 +21,7 @@ class JobApi: ) @classmethod - def get_job(cls, job_id: str): + def get_job(cls, job_id: int): """ 查询定时任务调度详情接口 @@ -90,9 +90,9 @@ class JobApi: ) @classmethod - def change_job_status(cls, job_id: str, status: str): + def change_job_status(cls, job_id: int, status: str): """ - 角色状态修改接口 + 定时任务调度状态修改接口 :param job_id: 定时任务id :param status: 定时任务状态 @@ -105,7 +105,7 @@ class JobApi: ) @classmethod - def run_job(cls, job_id: str, job_group: str): + def run_job(cls, job_id: int, job_group: str): """ 定时任务立即执行一次接口 diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 2421013..a3ac6f3 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -1,42 +1,49 @@ -import dash import time import uuid -import json -from dash import dcc -from dash.dependencies import Input, Output, State, ALL +from dash import ctx, dcc, no_update +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.monitor.job import JobApi +from api.system.dict.data import DictDataApi from server import app from utils.common import validate_data_not_empty -from api.job import get_job_list_api, get_job_detail_api, add_job_api, edit_job_api, execute_job_api, delete_job_api, export_job_list_api -from api.dict import query_dict_data_list_api +from utils.feedback_util import MessageManager +from utils.permission_util import PermissionManager @app.callback( output=dict( job_table_data=Output('job-list-table', 'data', allow_duplicate=True), - job_table_pagination=Output('job-list-table', 'pagination', allow_duplicate=True), + job_table_pagination=Output( + 'job-list-table', 'pagination', allow_duplicate=True + ), job_table_key=Output('job-list-table', 'key'), job_table_selectedrowkeys=Output('job-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) ), inputs=dict( search_click=Input('job-search', 'nClicks'), refresh_click=Input('job-refresh', 'nClicks'), pagination=Input('job-list-table', 'pagination'), - operations=Input('job-operations-store', 'data') + operations=Input('job-operations-store', 'data'), ), state=dict( job_name=State('job-job_name-input', 'value'), job_group=State('job-job_group-select', 'value'), status_select=State('job-status-select', 'value'), - button_perms=State('job-button-perms-container', 'data') + button_perms=State('job-button-perms-container', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_job_table_data(search_click, refresh_click, pagination, operations, job_name, job_group, status_select, - button_perms): +def get_job_table_data( + search_click, + refresh_click, + pagination, + operations, + job_name, + job_group, + status_select, + button_perms, +): """ 获取定时任务表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ @@ -45,87 +52,75 @@ def get_job_table_data(search_click, refresh_click, pagination, operations, job_ job_group=job_group, status=status_select, page_num=1, - page_size=10 + page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'job-list-table': - query_params = dict( - job_name=job_name, - job_group=job_group, - status=status_select, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - option_table = [] - info = query_dict_data_list_api(dict_type='sys_job_group') - if info.get('code') == 200: - data = info.get('data') - option_table = [ - dict(label=item.get('dict_label'), value=item.get('dict_value'), css_class=item.get('css_class')) for - item - in data] - option_dict = {item.get('value'): item for item in option_table} - - table_info = get_job_list_api(query_params) - if table_info['code'] == 200: - table_data = table_info['data']['rows'] - table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['data']['total'] + info = DictDataApi.get_dicts(dict_type='sys_job_group') + data = info.get('data') + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(checked=True) - else: - item['status'] = dict(checked=False) - if str(item.get('job_group')) in option_dict.keys(): - item['job_group'] = dict( - tag=option_dict.get(str(item.get('job_group'))).get('label'), - color=json.loads(option_dict.get(str(item.get('job_group'))).get('css_class')).get('color') - ) - item['key'] = str(item['job_id']) - item['operation'] = [ - { - 'title': '修改', - 'icon': 'antd-edit' - } if 'monitor:job:edit' in button_perms else None, - { - 'title': '删除', - 'icon': 'antd-delete' - } if 'monitor:job:remove' in button_perms else None, - { - 'title': '执行一次', - 'icon': 'antd-rocket' - } if 'monitor:job:changeStatus' in button_perms else None, - { - 'title': '任务详细', - 'icon': 'antd-eye' - } if 'monitor:job:query' in button_perms else None, - { - 'title': '调度日志', - 'icon': 'antd-history' - } if 'monitor:job:query' in button_perms else None - ] + for item in data + ] + option_dict = {item.get('value'): item for item in option_table} - return dict( - job_table_data=table_data, - job_table_pagination=table_pagination, - job_table_key=str(uuid.uuid4()), - job_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} - ) + table_info = JobApi.list_job(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(checked=True) + else: + item['status'] = dict(checked=False) + if str(item.get('job_group')) in option_dict.keys(): + item['job_group'] = dict( + tag=option_dict.get(str(item.get('job_group'))).get( + 'label' + ), + color='blue', + ) + item['key'] = str(item['job_id']) + item['operation'] = [ + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('monitor:job:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('monitor:job:remove') + else None, + {'title': '执行一次', 'icon': 'antd-rocket'} + if PermissionManager.check_perms('monitor:job:changeStatus') + else None, + {'title': '任务详细', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:job:query') + else None, + {'title': '调度日志', 'icon': 'antd-history'} + if PermissionManager.check_perms('monitor:job:query') + else None, + ] return dict( - job_table_data=dash.no_update, - job_table_pagination=dash.no_update, - job_table_key=dash.no_update, - job_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + job_table_data=table_data, + job_table_pagination=table_pagination, + job_table_key=str(uuid.uuid4()), + job_table_selectedrowkeys=None, ) raise PreventUpdate @@ -133,26 +128,28 @@ def get_job_table_data(search_click, refresh_click, pagination, operations, job_ # 重置定时任务搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('job-job_name-input', 'value'), - Output('job-job_group-select', 'value'), - Output('job-status-select', 'value'), - Output('job-operations-store', 'data')], + """, + [ + Output('job-job_name-input', 'value'), + Output('job-job_group-select', 'value'), + Output('job-status-select', 'value'), + Output('job-operations-store', 'data'), + ], Input('job-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示定时任务搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -162,25 +159,27 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('job-search-form-container', 'hidden'), - Output('job-hidden-tooltip', 'title')], + """, + [ + Output('job-search-form-container', 'hidden'), + Output('job-hidden-tooltip', 'title'), + ], Input('job-hidden', 'nClicks'), State('job-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( Output({'type': 'job-operation-button', 'index': 'edit'}, 'disabled'), Input('job-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_job_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1: @@ -196,16 +195,15 @@ def change_job_edit_button_status(table_rows_selected): @app.callback( Output({'type': 'job-operation-button', 'index': 'delete'}, 'disabled'), Input('job-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_job_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -218,36 +216,59 @@ def change_job_delete_button_status(table_rows_selected): modal_visible=Output('job-modal', 'visible', allow_duplicate=True), modal_title=Output('job-modal', 'title'), form_value=Output({'type': 'job-form-value', 'index': ALL}, 'value'), - form_label_validate_status=Output({'type': 'job-form-label', 'index': ALL, 'required': True}, 'validateStatus', allow_duplicate=True), - form_label_validate_info=Output({'type': 'job-form-label', 'index': ALL, 'required': True}, 'help', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'job-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'job-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), edit_row_info=Output('job-edit-id-store', 'data'), - modal_type=Output('job-operations-store-bk', 'data') + modal_type=Output('job-operations-store-bk', 'data'), ), inputs=dict( - operation_click=Input({'type': 'job-operation-button', 'index': ALL}, 'nClicks'), - dropdown_click=Input('job-list-table', 'nClicksDropdownItem') + operation_click=Input( + {'type': 'job-operation-button', 'index': ALL}, 'nClicks' + ), + dropdown_click=Input('job-list-table', 'nClicksDropdownItem'), ), state=dict( selected_row_keys=State('job-list-table', 'selectedRowKeys'), - recently_clicked_dropdown_item_title=State('job-list-table', 'recentlyClickedDropdownItemTitle'), - recently_dropdown_item_clicked_row=State('job-list-table', 'recentlyDropdownItemClickedRow') + recently_clicked_dropdown_item_title=State( + 'job-list-table', 'recentlyClickedDropdownItemTitle' + ), + recently_dropdown_item_clicked_row=State( + 'job-list-table', 'recentlyDropdownItemClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_job_modal(operation_click, dropdown_click, selected_row_keys, recently_clicked_dropdown_item_title, - recently_dropdown_item_clicked_row): +def add_edit_job_modal( + operation_click, + dropdown_click, + selected_row_keys, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, +): """ 显示新增或编辑定时任务弹窗回调 """ - trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'add', 'type': 'job-operation-button'} \ - or trigger_id == {'index': 'edit', 'type': 'job-operation-button'} \ - or (trigger_id == 'job-list-table' and recently_clicked_dropdown_item_title == '修改'): + trigger_id = ctx.triggered_id + if ( + trigger_id == {'index': 'add', 'type': 'job-operation-button'} + or trigger_id == {'index': 'edit', 'type': 'job-operation-button'} + or ( + trigger_id == 'job-list-table' + and recently_clicked_dropdown_item_title == '修改' + ) + ): # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'job-operation-button'}: job_info = dict( job_name=None, @@ -258,7 +279,7 @@ def add_edit_job_modal(operation_click, dropdown_click, selected_row_keys, recen job_kwargs=None, misfire_policy='1', concurrent='1', - status='0' + status='0', ) return dict( modal_visible=True, @@ -266,38 +287,40 @@ def add_edit_job_modal(operation_click, dropdown_click, selected_row_keys, recen form_value=[job_info.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger=dash.no_update, edit_row_info=None, - modal_type={'type': 'add'} + modal_type={'type': 'add'}, ) - elif trigger_id == {'index': 'edit', 'type': 'job-operation-button'} or (trigger_id == 'job-list-table' and recently_clicked_dropdown_item_title == '修改'): + elif trigger_id == { + 'index': 'edit', + 'type': 'job-operation-button', + } or ( + trigger_id == 'job-list-table' + and recently_clicked_dropdown_item_title == '修改' + ): if trigger_id == {'index': 'edit', 'type': 'job-operation-button'}: job_id = int(','.join(selected_row_keys)) else: job_id = int(recently_dropdown_item_clicked_row['key']) - job_info_res = get_job_detail_api(job_id=job_id) - if job_info_res['code'] == 200: - job_info = job_info_res['data'] - return dict( - modal_visible=True, - modal_title='编辑任务', - form_value=[job_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=job_info if job_info else None, - modal_type={'type': 'edit'} - ) + job_info_res = JobApi.get_job(job_id=job_id) + job_info = job_info_res['data'] + return dict( + modal_visible=True, + modal_title='编辑任务', + form_value=[job_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + edit_row_info=job_info if job_info else None, + modal_type={'type': 'edit'}, + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=no_update, + modal_title=no_update, + form_value=[no_update] * len(form_value_list), + form_label_validate_status=[no_update] * len(form_label_list), + form_label_validate_info=[no_update] * len(form_label_list), edit_row_info=None, - modal_type=None + modal_type=None, ) raise PreventUpdate @@ -305,265 +328,273 @@ def add_edit_job_modal(operation_click, dropdown_click, selected_row_keys, recen @app.callback( output=dict( - form_label_validate_status=Output({'type': 'job-form-label', 'index': ALL, 'required': True}, 'validateStatus', - allow_duplicate=True), - form_label_validate_info=Output({'type': 'job-form-label', 'index': ALL, 'required': True}, 'help', - allow_duplicate=True), + form_label_validate_status=Output( + {'type': 'job-form-label', 'index': ALL, 'required': True}, + 'validateStatus', + allow_duplicate=True, + ), + form_label_validate_info=Output( + {'type': 'job-form-label', 'index': ALL, 'required': True}, + 'help', + allow_duplicate=True, + ), modal_visible=Output('job-modal', 'visible'), operations=Output('job-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('job-modal', 'okCounts') ), + inputs=dict(confirm_trigger=Input('job-modal', 'okCounts')), state=dict( modal_type=State('job-operations-store-bk', 'data'), edit_row_info=State('job-edit-id-store', 'data'), form_value=State({'type': 'job-form-value', 'index': ALL}, 'value'), - form_label=State({'type': 'job-form-label', 'index': ALL, 'required': True}, 'label') + form_label=State( + {'type': 'job-form-label', 'index': ALL, 'required': True}, 'label' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def job_confirm(confirm_trigger, modal_type, edit_row_info, form_value, form_label): +def job_confirm( + confirm_trigger, modal_type, edit_row_info, form_value, form_label +): """ 新增或编定时任务弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in dash.ctx.outputs_list[0]] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2]} - form_label_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1]} - if all(validate_data_not_empty(item) for item in [form_value_state.get(k) for k in form_label_output_list]): + form_value_state = { + x['id']['index']: x.get('value') for x in ctx.states_list[-2] + } + form_label_state = { + x['id']['index']: x.get('value') for x in ctx.states_list[-1] + } + if all( + validate_data_not_empty(item) + for item in [ + form_value_state.get(k) for k in form_label_output_list + ] + ): params_add = form_value_state params_edit = params_add.copy() - params_edit['job_id'] = edit_row_info.get('job_id') if edit_row_info else None - api_res = {} + params_edit['job_id'] = ( + edit_row_info.get('job_id') if edit_row_info else None + ) modal_type = modal_type.get('type') if modal_type == 'add': - api_res = add_job_api(params_add) + JobApi.add_job(params_add) if modal_type == 'edit': - api_res = edit_job_api(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('新增成功', type='success') - ) - if modal_type == 'edit': - return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('编辑成功', type='success') - ) + JobApi.update_job(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'add'}, + ) + if modal_type == 'edit': + MessageManager.success(content='编辑成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + modal_visible=no_update, + operations=no_update, ) return dict( - form_label_validate_status=[None if validate_data_not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list], - form_label_validate_info=[None if validate_data_not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage('处理失败', type='error') + form_label_validate_status=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else 'error' + for k in form_label_output_list + ], + form_label_validate_info=[ + None + if validate_data_not_empty(form_value_state.get(k)) + else f'{form_label_state.get(k)}不能为空!' + for k in form_label_output_list + ], + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @app.callback( - [Output('job-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], - [Input('job-list-table', 'recentlySwitchDataIndex'), - Input('job-list-table', 'recentlySwitchStatus'), - Input('job-list-table', 'recentlySwitchRow')], - prevent_initial_call=True + Output('job-operations-store', 'data', allow_duplicate=True), + [ + Input('job-list-table', 'recentlySwitchDataIndex'), + Input('job-list-table', 'recentlySwitchStatus'), + Input('job-list-table', 'recentlySwitchRow'), + ], + prevent_initial_call=True, ) -def table_switch_job_status(recently_switch_data_index, recently_switch_status, recently_switch_row): +def table_switch_job_status( + recently_switch_data_index, recently_switch_status, recently_switch_row +): """ 表格内切换定时任务状态回调 """ if recently_switch_data_index: - if recently_switch_status: - params = dict(job_id=int(recently_switch_row['key']), status='0', type='status') - else: - params = dict(job_id=int(recently_switch_row['key']), status='1', type='status') - edit_button_result = edit_job_api(params) - if edit_button_result['code'] == 200: - - return [ - {'type': 'switch-status'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success') - ] + JobApi.change_job_status( + job_id=int(recently_switch_row['key']), + status='0' if recently_switch_status else '1', + ) + MessageManager.success(content='修改成功') - return [ - {'type': 'switch-status'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error') - ] + return {'type': 'switch-status'} raise PreventUpdate @app.callback( output=dict( - modal_visible=Output('job_detail-modal', 'visible', allow_duplicate=True), + modal_visible=Output( + 'job_detail-modal', 'visible', allow_duplicate=True + ), modal_title=Output('job_detail-modal', 'title'), - form_value=Output({'type': 'job_detail-form-value', 'index': ALL}, 'children'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - dropdown_click=Input('job-list-table', 'nClicksDropdownItem') + form_value=Output( + {'type': 'job_detail-form-value', 'index': ALL}, 'children' + ), ), + inputs=dict(dropdown_click=Input('job-list-table', 'nClicksDropdownItem')), state=dict( - recently_clicked_dropdown_item_title=State('job-list-table', 'recentlyClickedDropdownItemTitle'), - recently_dropdown_item_clicked_row=State('job-list-table', 'recentlyDropdownItemClickedRow') + recently_clicked_dropdown_item_title=State( + 'job-list-table', 'recentlyClickedDropdownItemTitle' + ), + recently_dropdown_item_clicked_row=State( + 'job-list-table', 'recentlyDropdownItemClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_job_detail_modal(dropdown_click, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row): +def get_job_detail_modal( + dropdown_click, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, +): """ 显示定时任务详情弹窗回调及执行一次定时任务回调 """ # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[-3]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[-1]] # 显示定时任务详情弹窗 if dropdown_click and recently_clicked_dropdown_item_title == '任务详细': job_id = int(recently_dropdown_item_clicked_row['key']) - job_info_res = get_job_detail_api(job_id=job_id) - if job_info_res['code'] == 200: - job_info = job_info_res['data'] - if job_info.get('misfire_policy') == '1': - job_info['misfire_policy'] = '立即执行' - elif job_info.get('misfire_policy') == '2': - job_info['misfire_policy'] = '执行一次' - else: - job_info['misfire_policy'] = '放弃执行' - job_info['concurrent'] = '是' if job_info.get('concurrent') == '0' else '否' - job_info['status'] = '正常' if job_info.get('status') == '0' else '停用' - return dict( - modal_visible=True, - modal_title='任务详情', - form_value=[job_info.get(k) for k in form_value_list], - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=None - ) - + job_info_res = JobApi.get_job(job_id=job_id) + job_info = job_info_res['data'] + if job_info.get('misfire_policy') == '1': + job_info['misfire_policy'] = '立即执行' + elif job_info.get('misfire_policy') == '2': + job_info['misfire_policy'] = '执行一次' + else: + job_info['misfire_policy'] = '放弃执行' + job_info['concurrent'] = ( + '是' if job_info.get('concurrent') == '0' else '否' + ) + job_info['status'] = '正常' if job_info.get('status') == '0' else '停用' return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=None + modal_visible=True, + modal_title='任务详情', + form_value=[job_info.get(k) for k in form_value_list], ) # 执行一次定时任务 if dropdown_click and recently_clicked_dropdown_item_title == '执行一次': - job_id = int(recently_dropdown_item_clicked_row['key']) - job_info_res = execute_job_api(dict(job_id=job_id)) - if job_info_res['code'] == 200: - return dict( - modal_visible=False, - modal_title=None, - form_value=[None] * len(form_value_list), - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('执行成功', type='success') - ) + job_info_res = JobApi.run_job( + job_id=int(recently_dropdown_item_clicked_row['key']), + job_group=recently_dropdown_item_clicked_row['job_group'], + ) + MessageManager.success(content='执行成功') return dict( modal_visible=False, modal_title=None, form_value=[None] * len(form_value_list), - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('执行失败', type='error') ) raise PreventUpdate @app.callback( - [Output('job-delete-text', 'children'), - Output('job-delete-confirm-modal', 'visible'), - Output('job-delete-ids-store', 'data')], - [Input({'type': 'job-operation-button', 'index': ALL}, 'nClicks'), - Input('job-list-table', 'nClicksDropdownItem')], - [State('job-list-table', 'selectedRowKeys'), - State('job-list-table', 'recentlyClickedDropdownItemTitle'), - State('job-list-table', 'recentlyDropdownItemClickedRow')], - prevent_initial_call=True + [ + Output('job-delete-text', 'children'), + Output('job-delete-confirm-modal', 'visible'), + Output('job-delete-ids-store', 'data'), + ], + [ + Input({'type': 'job-operation-button', 'index': ALL}, 'nClicks'), + Input('job-list-table', 'nClicksDropdownItem'), + ], + [ + State('job-list-table', 'selectedRowKeys'), + State('job-list-table', 'recentlyClickedDropdownItemTitle'), + State('job-list-table', 'recentlyDropdownItemClickedRow'), + ], + prevent_initial_call=True, ) -def job_delete_modal(operation_click, dropdown_click, - selected_row_keys, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row): +def job_delete_modal( + operation_click, + dropdown_click, + selected_row_keys, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, +): """ 显示删除定时任务二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'delete', 'type': 'job-operation-button'} or ( - trigger_id == 'job-list-table' and recently_clicked_dropdown_item_title == '删除'): - + trigger_id == 'job-list-table' + and recently_clicked_dropdown_item_title == '删除' + ): if trigger_id == {'index': 'delete', 'type': 'job-operation-button'}: job_ids = ','.join(selected_row_keys) else: if recently_clicked_dropdown_item_title == '删除': job_ids = recently_dropdown_item_clicked_row['key'] else: - return [dash.no_update] * 3 + return [no_update] * 3 return [ f'是否确认删除任务编号为{job_ids}的任务?', True, - {'job_ids': job_ids} + job_ids, ] raise PreventUpdate @app.callback( - [Output('job-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + Output('job-operations-store', 'data', allow_duplicate=True), Input('job-delete-confirm-modal', 'okCounts'), State('job-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def job_delete_confirm(delete_confirm, job_ids_data): """ 删除定时任务弹窗确认回调,实现删除操作 """ if delete_confirm: - params = job_ids_data - delete_button_info = delete_job_api(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') - ] + JobApi.del_job(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') - ] + return {'type': 'delete'} raise PreventUpdate @@ -572,86 +603,105 @@ def job_delete_confirm(delete_confirm, job_ids_data): output=dict( job_log_modal_visible=Output('job_to_job_log-modal', 'visible'), job_log_modal_title=Output('job_to_job_log-modal', 'title'), - job_log_job_name=Output('job_log-job_name-input', 'value', allow_duplicate=True), + job_log_job_name=Output( + 'job_log-job_name-input', 'value', allow_duplicate=True + ), job_log_job_group_options=Output('job_log-job_group-select', 'options'), job_log_search_nclick=Output('job_log-search', 'nClicks'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) ), inputs=dict( - operation_click=Input({'type': 'job-operation-log', 'index': ALL}, 'nClicks'), - dropdown_click=Input('job-list-table', 'nClicksDropdownItem') + operation_click=Input( + {'type': 'job-operation-log', 'index': ALL}, 'nClicks' + ), + dropdown_click=Input('job-list-table', 'nClicksDropdownItem'), ), state=dict( - recently_clicked_dropdown_item_title=State('job-list-table', 'recentlyClickedDropdownItemTitle'), - recently_dropdown_item_clicked_row=State('job-list-table', 'recentlyDropdownItemClickedRow'), - job_log_search_nclick=State('job_log-search', 'nClicks') + recently_clicked_dropdown_item_title=State( + 'job-list-table', 'recentlyClickedDropdownItemTitle' + ), + recently_dropdown_item_clicked_row=State( + 'job-list-table', 'recentlyDropdownItemClickedRow' + ), + job_log_search_nclick=State('job_log-search', 'nClicks'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def job_to_job_log_modal(operation_click, dropdown_click, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row, job_log_search_nclick): +def job_to_job_log_modal( + operation_click, + dropdown_click, + recently_clicked_dropdown_item_title, + recently_dropdown_item_clicked_row, + job_log_search_nclick, +): """ 显示定时任务对应调度日志表格弹窗回调 """ - trigger_id = dash.ctx.triggered_id - if trigger_id == {'index': 'log', 'type': 'job-operation-log'} or (trigger_id == 'job-list-table' and recently_clicked_dropdown_item_title == '调度日志'): + trigger_id = ctx.triggered_id + if trigger_id == {'index': 'log', 'type': 'job-operation-log'} or ( + trigger_id == 'job-list-table' + and recently_clicked_dropdown_item_title == '调度日志' + ): option_table = [] - info = query_dict_data_list_api(dict_type='sys_job_group') - if info.get('code') == 200: - data = info.get('data') - option_table = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in data] + info = DictDataApi.get_dicts(dict_type='sys_job_group') + data = info.get('data') + option_table = [ + dict(label=item.get('dict_label'), value=item.get('dict_value')) + for item in data + ] - if trigger_id == 'job-list-table' and recently_clicked_dropdown_item_title == '调度日志': - return dict( - job_log_modal_visible=True, - job_log_modal_title='任务调度日志', - job_log_job_name=recently_dropdown_item_clicked_row.get('job_name'), - job_log_job_group_options=option_table, - job_log_search_nclick=job_log_search_nclick + 1 if job_log_search_nclick else 1, - api_check_token_trigger={'timestamp': time.time()} - ) + if ( + trigger_id == 'job-list-table' + and recently_clicked_dropdown_item_title == '调度日志' + ): + return dict( + job_log_modal_visible=True, + job_log_modal_title='任务调度日志', + job_log_job_name=recently_dropdown_item_clicked_row.get( + 'job_name' + ), + job_log_job_group_options=option_table, + job_log_search_nclick=job_log_search_nclick + 1 + if job_log_search_nclick + else 1, + ) return dict( job_log_modal_visible=True, job_log_modal_title='任务调度日志', job_log_job_name=None, job_log_job_group_options=option_table, - job_log_search_nclick=job_log_search_nclick + 1 if job_log_search_nclick else 1, - api_check_token_trigger={'timestamp': time.time()} + job_log_search_nclick=job_log_search_nclick + 1 + if job_log_search_nclick + else 1, ) raise PreventUpdate @app.callback( - [Output('job-export-container', 'data', allow_duplicate=True), - Output('job-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('job-export-container', 'data', allow_duplicate=True), + Output('job-export-complete-judge-container', 'data'), + ], Input('job-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_job_list(export_click): """ 导出定时任务信息回调 """ if export_click: - export_job_res = export_job_list_api({}) - if export_job_res.status_code == 200: - export_job = export_job_res.content - - return [ - dcc.send_bytes(export_job, f'定时任务信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') - ] + export_job_res = JobApi.export_job({}) + export_job = export_job_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_job, + f'定时任务信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') ] raise PreventUpdate @@ -660,7 +710,7 @@ def export_job_list(export_click): @app.callback( Output('job-export-container', 'data', allow_duplicate=True), Input('job-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_job_export_status(data): """ diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index 7b827ac..a0bc76e 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -1,122 +1,127 @@ -import dash import time import uuid -import json -from dash import dcc -from dash.dependencies import Input, Output, State, ALL +from dash import ctx, dcc +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.monitor.job_log import JobLogApi +from api.system.dict.data import DictDataApi from server import app -from api.job import get_job_log_list_api, get_job_log_detail_api, delete_job_log_api, clear_job_log_api, export_job_log_list_api -from api.dict import query_dict_data_list_api +from utils.feedback_util import MessageManager +from utils.permission_util import PermissionManager @app.callback( output=dict( - job_log_table_data=Output('job_log-list-table', 'data', allow_duplicate=True), - job_log_table_pagination=Output('job_log-list-table', 'pagination', allow_duplicate=True), + job_log_table_data=Output( + 'job_log-list-table', 'data', allow_duplicate=True + ), + job_log_table_pagination=Output( + 'job_log-list-table', 'pagination', allow_duplicate=True + ), job_log_table_key=Output('job_log-list-table', 'key'), - job_log_table_selectedrowkeys=Output('job_log-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) + job_log_table_selectedrowkeys=Output( + 'job_log-list-table', 'selectedRowKeys' + ), ), inputs=dict( search_click=Input('job_log-search', 'nClicks'), refresh_click=Input('job_log-refresh', 'nClicks'), pagination=Input('job_log-list-table', 'pagination'), - operations=Input('job_log-operations-store', 'data') + operations=Input('job_log-operations-store', 'data'), ), state=dict( job_name=State('job_log-job_name-input', 'value'), job_group=State('job_log-job_group-select', 'value'), status_select=State('job_log-status-select', 'value'), create_time_range=State('job_log-create_time-range', 'value'), - button_perms=State('job_log-button-perms-container', 'data') + button_perms=State('job_log-button-perms-container', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_job_log_table_data(search_click, refresh_click, pagination, operations, job_name, job_group, status_select, create_time_range, button_perms): +def get_job_log_table_data( + search_click, + refresh_click, + pagination, + operations, + job_name, + job_group, + status_select, + create_time_range, + button_perms, +): """ 获取定时任务对应调度日志表格数据回调(进行表格相关增删查改操作后均会触发此回调) """ - create_time_start = None - create_time_end = None + begin_time = None + end_time = None if create_time_range: - create_time_start = create_time_range[0] - create_time_end = create_time_range[1] + begin_time = create_time_range[0] + end_time = create_time_range[1] query_params = dict( job_name=job_name, job_group=job_group, status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, + begin_time=begin_time, + end_time=end_time, page_num=1, - page_size=10 + page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'job_log-list-table': - query_params = dict( - job_name=job_name, - job_group=job_group, - status=status_select, - create_time_start=create_time_start, - create_time_end=create_time_end, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: - option_table = [] - info = query_dict_data_list_api(dict_type='sys_job_group') - if info.get('code') == 200: - data = info.get('data') - option_table = [dict(label=item.get('dict_label'), value=item.get('dict_value'), css_class=item.get('css_class')) for item in data] + info = DictDataApi.get_dicts(dict_type='sys_job_group') + data = info.get('data') + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} - table_info = get_job_log_list_api(query_params) - if table_info['code'] == 200: - table_data = table_info['data']['rows'] - table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['data']['total'] - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - if str(item.get('job_group')) in option_dict.keys(): - item['job_group'] = dict( - tag=option_dict.get(str(item.get('job_group'))).get('label'), - color=json.loads(option_dict.get(str(item.get('job_group'))).get('css_class')).get('color') - ) - item['key'] = str(item['job_log_id']) - item['operation'] = [ - { - 'content': '详情', - 'type': 'link', - 'icon': 'antd-eye' - } if 'monitor:job:query' in button_perms else {}, - ] - - return dict( - job_log_table_data=table_data, - job_log_table_pagination=table_pagination, - job_log_table_key=str(uuid.uuid4()), - job_log_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()} - ) + table_info = JobLogApi.list_job_log(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='成功', color='blue') + else: + item['status'] = dict(tag='失败', color='volcano') + if str(item.get('job_group')) in option_dict.keys(): + item['job_group'] = dict( + tag=option_dict.get(str(item.get('job_group'))).get( + 'label' + ), + color='blue', + ) + item['key'] = str(item['job_log_id']) + item['operation'] = [ + {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:job:query') + else {}, + ] return dict( - job_log_table_data=dash.no_update, - job_log_table_pagination=dash.no_update, - job_log_table_key=dash.no_update, - job_log_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + job_log_table_data=table_data, + job_log_table_pagination=table_pagination, + job_log_table_key=str(uuid.uuid4()), + job_log_table_selectedrowkeys=None, ) raise PreventUpdate @@ -124,27 +129,29 @@ def get_job_log_table_data(search_click, refresh_click, pagination, operations, # 重置定时任务调度日志搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output('job_log-job_name-input', 'value'), - Output('job_log-job_group-select', 'value'), - Output('job_log-status-select', 'value'), - Output('job_log-create_time-range', 'value'), - Output('job_log-operations-store', 'data')], + """, + [ + Output('job_log-job_name-input', 'value'), + Output('job_log-job_group-select', 'value'), + Output('job_log-status-select', 'value'), + Output('job_log-create_time-range', 'value'), + Output('job_log-operations-store', 'data'), + ], Input('job_log-reset', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示定时任务调度日志搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -154,12 +161,14 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('job_log-search-form-container', 'hidden'), - Output('job_log-hidden-tooltip', 'title')], + """, + [ + Output('job_log-search-form-container', 'hidden'), + Output('job_log-hidden-tooltip', 'title'), + ], Input('job_log-hidden', 'nClicks'), State('job_log-search-form-container', 'hidden'), - prevent_initial_call=True + prevent_initial_call=True, ) @@ -167,39 +176,33 @@ app.clientside_callback( output=dict( modal_visible=Output('job_log-modal', 'visible', allow_duplicate=True), modal_title=Output('job_log-modal', 'title'), - form_value=Output({'type': 'job_log-form-value', 'index': ALL}, 'children'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) - ), - inputs=dict( - button_click=Input('job_log-list-table', 'nClicksButton') + form_value=Output( + {'type': 'job_log-form-value', 'index': ALL}, 'children' + ), ), + inputs=dict(button_click=Input('job_log-list-table', 'nClicksButton')), state=dict( clicked_content=State('job_log-list-table', 'clickedContent'), - recently_button_clicked_row=State('job_log-list-table', 'recentlyButtonClickedRow') + recently_button_clicked_row=State( + 'job_log-list-table', 'recentlyButtonClickedRow' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def add_edit_job_log_modal(button_click, clicked_content, recently_button_clicked_row): +def add_edit_job_log_modal( + button_click, clicked_content, recently_button_clicked_row +): if button_click: # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[-2]] - job_log_id = int(recently_button_clicked_row['key']) - job_log_info_res = get_job_log_detail_api(job_log_id=job_log_id) - if job_log_info_res['code'] == 200: - job_log_info = job_log_info_res['data'] - job_log_info['status'] = '成功' if job_log_info.get('status') == '0' else '失败' - return dict( - modal_visible=True, - modal_title='任务执行日志详情', - form_value=[job_log_info.get(k) for k in form_value_list], - api_check_token_trigger={'timestamp': time.time()} - ) - + form_value_list = [x['id']['index'] for x in ctx.outputs_list[-1]] + job_log_info = recently_button_clicked_row + job_log_info['status'] = ( + '成功' if job_log_info.get('status') == '0' else '失败' + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - api_check_token_trigger={'timestamp': time.time()} + modal_visible=True, + modal_title='任务执行日志详情', + form_value=[job_log_info.get(k) for k in form_value_list], ) raise PreventUpdate @@ -208,16 +211,15 @@ def add_edit_job_log_modal(button_click, clicked_content, recently_button_clicke @app.callback( Output({'type': 'job_log-operation-button', 'index': 'delete'}, 'disabled'), Input('job_log-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_job_log_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: - return False return True @@ -226,18 +228,20 @@ def change_job_log_delete_button_status(table_rows_selected): @app.callback( - [Output('job_log-delete-text', 'children'), - Output('job_log-delete-confirm-modal', 'visible'), - Output('job_log-delete-ids-store', 'data')], + [ + Output('job_log-delete-text', 'children'), + Output('job_log-delete-confirm-modal', 'visible'), + Output('job_log-delete-ids-store', 'data'), + ], Input({'type': 'job_log-operation-button', 'index': ALL}, 'nClicks'), State('job_log-list-table', 'selectedRowKeys'), - prevent_initial_call=True + prevent_initial_call=True, ) def job_log_delete_modal(operation_click, selected_row_keys): """ 显示删除或清空定时任务调度日志二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.index in ['delete', 'clear']: if trigger_id.index == 'delete': job_log_ids = ','.join(selected_row_keys) @@ -245,97 +249,70 @@ def job_log_delete_modal(operation_click, selected_row_keys): return [ f'是否确认删除日志编号为{job_log_ids}的任务执行日志?', True, - {'oper_type': 'delete', 'job_log_ids': job_log_ids} + {'oper_type': 'delete', 'job_log_ids': job_log_ids}, ] elif trigger_id.index == 'clear': return [ - f'是否确认清除所有的任务执行日志?', + '是否确认清除所有的任务执行日志?', True, - {'oper_type': 'clear', 'job_log_ids': ''} + {'oper_type': 'clear'}, ] raise PreventUpdate @app.callback( - [Output('job_log-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + Output('job_log-operations-store', 'data', allow_duplicate=True), Input('job_log-delete-confirm-modal', 'okCounts'), State('job_log-delete-ids-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def job_log_delete_confirm(delete_confirm, job_log_ids_data): """ 删除或清空定时任务调度日志弹窗确认回调,实现删除或清空操作 """ if delete_confirm: - oper_type = job_log_ids_data.get('oper_type') if oper_type == 'clear': - params = dict(oper_type=job_log_ids_data.get('oper_type')) - clear_button_info = clear_job_log_api(params) - if clear_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除成功', type='success') - ] + JobLogApi.clean_job_log() + MessageManager.success(content='清除成功') + + return {'type': 'clear'} - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除失败', type='error') - ] else: - params = dict(job_log_ids=job_log_ids_data.get('job_log_ids')) - delete_button_info = delete_job_log_api(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success') - ] + params = job_log_ids_data.get('job_log_ids') + JobLogApi.del_job_log(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error') - ] + return {'type': 'delete'} raise PreventUpdate @app.callback( - [Output('job_log-export-container', 'data', allow_duplicate=True), - Output('job_log-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('job_log-export-container', 'data', allow_duplicate=True), + Output('job_log-export-complete-judge-container', 'data'), + ], Input('job_log-export', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def export_job_log_list(export_click): """ 导出定时任务调度日志信息回调 """ if export_click: - export_job_log_res = export_job_log_list_api({}) - if export_job_log_res.status_code == 200: - export_job_log = export_job_log_res.content - - return [ - dcc.send_bytes(export_job_log, f'任务执行日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx'), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success') - ] + export_job_log_res = JobLogApi.export_job_log({}) + export_job_log = export_job_log_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_job_log, + f'任务执行日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error') ] raise PreventUpdate @@ -344,7 +321,7 @@ def export_job_log_list(export_click): @app.callback( Output('job_log-export-container', 'data', allow_duplicate=True), Input('job_log-export-complete-judge-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) def reset_job_log_export_status(data): """ @@ -352,7 +329,6 @@ def reset_job_log_export_status(data): """ time.sleep(0.5) if data: - return None raise PreventUpdate diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index 03dec39..368343b 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -1,71 +1,64 @@ -from dash import dcc, html import feffery_antd_components as fac -import json - -import callbacks.monitor_c.job_c.job_c +from dash import dcc, html +from api.monitor.job import JobApi +from api.system.dict.data import DictDataApi +from callbacks.monitor_c.job_c import job_c # noqa: F401 +from utils.permission_util import PermissionManager from . import job_log -from api.job import get_job_list_api -from api.dict import query_dict_data_list_api def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - - option = [] - option_table = [] - info = query_dict_data_list_api(dict_type='sys_job_group') - if info.get('code') == 200: - data = info.get('data') - option = [dict(label=item.get('dict_label'), value=item.get('dict_value')) for item in data] - option_table = [ - dict(label=item.get('dict_label'), value=item.get('dict_value'), css_class=item.get('css_class')) for item - in data] + info = DictDataApi.get_dicts(dict_type='sys_job_group') + data = info.get('data') + option = [ + dict(label=item.get('dict_label'), value=item.get('dict_value')) + for item in data + ] + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] option_dict = {item.get('value'): item for item in option_table} job_params = dict(page_num=1, page_size=10) - table_info = get_job_list_api(job_params) - table_data = [] - page_num = 1 - page_size = 10 - total = 0 - if table_info['code'] == 200: - table_data = table_info['data']['rows'] - page_num = table_info['data']['page_num'] - page_size = table_info['data']['page_size'] - total = table_info['data']['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(checked=True) - else: - item['status'] = dict(checked=False) - if str(item.get('job_group')) in option_dict.keys(): - item['job_group'] = dict( - tag=option_dict.get(str(item.get('job_group'))).get('label'), - color=json.loads(option_dict.get(str(item.get('job_group'))).get('css_class')).get('color') - ) - item['key'] = str(item['job_id']) - item['operation'] = [ - { - 'title': '修改', - 'icon': 'antd-edit' - } if 'monitor:job:edit' in button_perms else None, - { - 'title': '删除', - 'icon': 'antd-delete' - } if 'monitor:job:remove' in button_perms else None, - { - 'title': '执行一次', - 'icon': 'antd-rocket' - } if 'monitor:job:changeStatus' in button_perms else None, - { - 'title': '任务详细', - 'icon': 'antd-eye' - } if 'monitor:job:query' in button_perms else None, - { - 'title': '调度日志', - 'icon': 'antd-history' - } if 'monitor:job:query' in button_perms else None - ] + table_info = JobApi.list_job(job_params) + table_data = table_info['rows'] + page_num = table_info['page_num'] + page_size = table_info['page_size'] + total = table_info['total'] + for item in table_data: + if item['status'] == '0': + item['status'] = dict(checked=True) + else: + item['status'] = dict(checked=False) + if str(item.get('job_group')) in option_dict.keys(): + item['job_group'] = dict( + tag=option_dict.get(str(item.get('job_group'))).get('label'), + color='blue', + ) + item['key'] = str(item['job_id']) + item['operation'] = [ + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('monitor:job:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('monitor:job:remove') + else None, + {'title': '执行一次', 'icon': 'antd-rocket'} + if PermissionManager.check_perms('monitor:job:changeStatus') + else None, + {'title': '任务详细', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:job:query') + else None, + {'title': '调度日志', 'icon': 'antd-history'} + if PermissionManager.check_perms('monitor:job:query') + else None, + ] return [ dcc.Store(id='job-button-perms-container', data=button_perms), @@ -105,9 +98,9 @@ def render(*args, **kwargs): allowClear=True, style={ 'width': 210 - } + }, ), - label='任务名称' + label='任务名称', ), fac.AntdFormItem( fac.AntdSelect( @@ -116,9 +109,9 @@ def render(*args, **kwargs): options=option, style={ 'width': 210 - } + }, ), - label='任务组名' + label='任务组名', ), fac.AntdFormItem( fac.AntdSelect( @@ -127,18 +120,18 @@ def render(*args, **kwargs): options=[ { 'label': '正常', - 'value': '0' + 'value': '0', }, { 'label': '暂停', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 200 - } + }, ), - label='任务状态' + label='任务状态', ), fac.AntdFormItem( fac.AntdButton( @@ -147,7 +140,7 @@ def render(*args, **kwargs): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ) ), fac.AntdFormItem( @@ -156,20 +149,20 @@ def render(*args, **kwargs): id='job-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ) - ) + ), ], style={ 'paddingBottom': '10px' - } + }, ), ], layout='inline', ) ], id='job-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -188,14 +181,18 @@ def render(*args, **kwargs): ], id={ 'type': 'job-operation-button', - 'index': 'add' + 'index': 'add', }, style={ 'color': '#1890ff', 'background': '#e8f4ff', - 'border-color': '#a3d3ff' - } - ) if 'monitor:job:add' in button_perms else [], + 'border-color': '#a3d3ff', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:add' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -205,15 +202,19 @@ def render(*args, **kwargs): ], id={ 'type': 'job-operation-button', - 'index': 'edit' + 'index': 'edit', }, disabled=True, style={ 'color': '#71e2a3', 'background': '#e7faf0', - 'border-color': '#d0f5e0' - } - ) if 'monitor:job:edit' in button_perms else [], + 'border-color': '#d0f5e0', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:edit' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -223,15 +224,19 @@ def render(*args, **kwargs): ], id={ 'type': 'job-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if 'monitor:job:remove' in button_perms else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -243,9 +248,13 @@ def render(*args, **kwargs): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if 'monitor:job:export' in button_perms else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:export' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -255,20 +264,22 @@ def render(*args, **kwargs): ], id={ 'type': 'job-operation-log', - 'index': 'log' + 'index': 'log', }, style={ 'color': '#909399', 'background': '#f4f4f5', - 'border-color': '#d3d4d6' - } - ) if 'monitor:job:query' in button_perms else [], + 'border-color': '#d3d4d6', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:query' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -282,10 +293,10 @@ def render(*args, **kwargs): ), ], id='job-hidden', - shape='circle' + shape='circle', ), id='job-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -297,24 +308,22 @@ def render(*args, **kwargs): ), ], id='job-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -373,9 +382,9 @@ def render(*args, **kwargs): 'renderType': 'dropdown', 'dropdownProps': { 'title': '更多' - } + }, }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -384,28 +393,32 @@ def render(*args, **kwargs): 'pageSize': page_size, 'current': page_num, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': total + 'total': total, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 新增和编辑定时任务表单modal fac.AntdModal( [ @@ -418,59 +431,47 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'job-form-value', - 'index': 'job_name' + 'index': 'job_name', }, placeholder='请输入任务名称', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id={ 'type': 'job-form-label', 'index': 'job_name', - 'required': True + 'required': True, }, required=True, label='任务名称', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdSelect( id={ 'type': 'job-form-value', - 'index': 'job_group' + 'index': 'job_group', }, placeholder='请选择任务分组', options=option, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id={ 'type': 'job-form-label', 'index': 'job_group', - 'required': False + 'required': False, }, label='任务分组', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 - ) + span=12, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -479,31 +480,25 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'job-form-value', - 'index': 'invoke_target' + 'index': 'invoke_target', }, placeholder='请输入调用目标字符串', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id={ 'type': 'job-form-label', 'index': 'invoke_target', - 'required': True + 'required': True, }, required=True, label='调用方法', - labelCol={ - 'span': 3 - }, - wrapperCol={ - 'span': 21 - } + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=24 + span=24, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -512,57 +507,45 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'job-form-value', - 'index': 'job_args' + 'index': 'job_args', }, placeholder='请输入位置参数', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id={ 'type': 'job-form-label', 'index': 'job_args', - 'required': False + 'required': False, }, label='位置参数', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdInput( id={ 'type': 'job-form-value', - 'index': 'job_kwargs' + 'index': 'job_kwargs', }, placeholder='请输入关键字参数', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id={ 'type': 'job-form-label', 'index': 'job_kwargs', - 'required': False + 'required': False, }, label='关键字参数', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 - ) + span=12, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -571,42 +554,40 @@ def render(*args, **kwargs): fac.AntdInput( id={ 'type': 'job-form-value', - 'index': 'cron_expression' + 'index': 'cron_expression', }, placeholder='请输入cron执行表达式', addonAfter=html.Div( [ fac.AntdSpace( [ - fac.AntdText('生成表达式'), - fac.AntdIcon(icon='antd-field-time') + fac.AntdText( + '生成表达式' + ), + fac.AntdIcon( + icon='antd-field-time' + ), ] ) ], - id='generate-expression' + id='generate-expression', ), - style={ - 'width': '100%' - } + style={'width': '100%'}, ), id={ 'type': 'job-form-label', 'index': 'cron_expression', - 'required': True + 'required': True, }, required=True, label='cron表达式', - labelCol={ - 'span': 3 - }, - wrapperCol={ - 'span': 21 - } + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=24 + span=24, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -615,43 +596,39 @@ def render(*args, **kwargs): fac.AntdRadioGroup( id={ 'type': 'job-form-value', - 'index': 'misfire_policy' + 'index': 'misfire_policy', }, options=[ { 'label': '立即执行', - 'value': '1' + 'value': '1', }, { 'label': '执行一次', - 'value': '2' + 'value': '2', }, { 'label': '放弃执行', - 'value': '3' - } + 'value': '3', + }, ], defaultValue='1', optionType='button', - buttonStyle='solid' + buttonStyle='solid', ), id={ 'type': 'job-form-label', 'index': 'misfire_policy', - 'required': False + 'required': False, }, label='执行策略', - labelCol={ - 'span': 3 - }, - wrapperCol={ - 'span': 21 - } + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=24 + span=24, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -660,87 +637,64 @@ def render(*args, **kwargs): fac.AntdRadioGroup( id={ 'type': 'job-form-value', - 'index': 'concurrent' + 'index': 'concurrent', }, options=[ - { - 'label': '允许', - 'value': '0' - }, - { - 'label': '禁止', - 'value': '1' - } + {'label': '允许', 'value': '0'}, + {'label': '禁止', 'value': '1'}, ], defaultValue='1', optionType='button', - buttonStyle='solid' + buttonStyle='solid', ), id={ 'type': 'job-form-label', 'index': 'concurrent', - 'required': False + 'required': False, }, label='是否并发', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( id={ 'type': 'job-form-value', - 'index': 'status' + 'index': 'status', }, options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '暂停', - 'value': '1' - }, + {'label': '正常', 'value': '0'}, + {'label': '暂停', 'value': '1'}, ], defaultValue='0', ), id={ 'type': 'job-form-label', 'index': 'status', - 'required': False + 'required': False, }, label='状态', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - span=12 + span=12, ), ], - gutter=5 - ) + gutter=5, + ), ], - style={ - 'marginRight': '30px' - } + style={'marginRight': '30px'}, ) ], id='job-modal', mask=False, width=850, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 删除定时任务二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='job-delete-text'), @@ -748,9 +702,8 @@ def render(*args, **kwargs): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), - # 任务调度日志modal fac.AntdModal( job_log.render(button_perms), @@ -759,9 +712,8 @@ def render(*args, **kwargs): maskClosable=False, width=1050, renderFooter=False, - okClickClose=False + okClickClose=False, ), - # 任务明细modal fac.AntdModal( [ @@ -774,49 +726,41 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'job_name' + 'index': 'job_name', } ), label='任务名称', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'job_name' - }, - labelCol={ - 'span': 8 + 'index': 'job_name', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'job_group' + 'index': 'job_group', } ), label='任务分组', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'job_group' - }, - labelCol={ - 'span': 8 + 'index': 'job_group', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -825,49 +769,41 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'job_executor' + 'index': 'job_executor', } ), label='任务执行器', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'job_executor' - }, - labelCol={ - 'span': 8 + 'index': 'job_executor', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'invoke_target' + 'index': 'invoke_target', } ), label='调用目标函数', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'invoke_target' - }, - labelCol={ - 'span': 8 + 'index': 'invoke_target', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -876,49 +812,41 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'job_args' + 'index': 'job_args', } ), label='位置参数', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'job_args' - }, - labelCol={ - 'span': 8 + 'index': 'job_args', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'job_kwargs' + 'index': 'job_kwargs', } ), label='关键字参数', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'job_kwargs' - }, - labelCol={ - 'span': 8 + 'index': 'job_kwargs', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -927,23 +855,19 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'cron_expression' + 'index': 'cron_expression', } ), label='cron表达式', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'cron_expression' - }, - labelCol={ - 'span': 4 + 'index': 'cron_expression', }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - span=24 + span=24, ), ], ), @@ -954,49 +878,41 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'misfire_policy' + 'index': 'misfire_policy', } ), label='执行策略', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'misfire_policy' - }, - labelCol={ - 'span': 8 + 'index': 'misfire_policy', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'concurrent' + 'index': 'concurrent', } ), label='是否并发', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'concurrent' - }, - labelCol={ - 'span': 8 + 'index': 'concurrent', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -1005,59 +921,45 @@ def render(*args, **kwargs): fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'status' + 'index': 'status', } ), label='任务状态', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'status' - }, - labelCol={ - 'span': 8 + 'index': 'status', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_detail-form-value', - 'index': 'create_time' + 'index': 'create_time', } ), label='创建时间', required=True, id={ 'type': 'job_detail-form-label', - 'index': 'create_time' - }, - labelCol={ - 'span': 8 + 'index': 'create_time', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], ), ], - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - }, - style={ - 'marginRight': '15px' - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, + style={'marginRight': '15px'}, ) ], id='job_detail-modal', diff --git a/dash-fastapi-frontend/views/monitor/job/job_log.py b/dash-fastapi-frontend/views/monitor/job/job_log.py index ba5f97d..9de5c81 100644 --- a/dash-fastapi-frontend/views/monitor/job/job_log.py +++ b/dash-fastapi-frontend/views/monitor/job/job_log.py @@ -1,7 +1,7 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.monitor_c.job_c.job_log_c +from dash import dcc, html +from callbacks.monitor_c.job_c import job_log_c # noqa: F401 +from utils.permission_util import PermissionManager def render(button_perms): @@ -131,7 +131,7 @@ def render(button_perms): 'background': '#ffeded', 'border-color': '#ffdbdb' } - ) if 'monitor:job:remove' in button_perms else [], + ) if PermissionManager.check_perms('monitor:job:remove') else [], fac.AntdButton( [ fac.AntdIcon( @@ -148,7 +148,7 @@ def render(button_perms): 'background': '#ffeded', 'border-color': '#ffdbdb' } - ) if 'monitor:job:remove' in button_perms else [], + ) if PermissionManager.check_perms('monitor:job:remove') else [], fac.AntdButton( [ fac.AntdIcon( @@ -162,7 +162,7 @@ def render(button_perms): 'background': '#fff8e6', 'border-color': '#ffe399' } - ) if 'monitor:job:export' in button_perms else [], + ) if PermissionManager.check_perms('monitor:job:export') else [], ], style={ 'paddingBottom': '10px' -- Gitee From c2d3bb554ff2f6d901e715de4765d68e864add7a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:32:44 +0800 Subject: [PATCH 041/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=97=A5=E5=BF=97=E5=86=99=E5=85=A5?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/config/get_scheduler.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/dash-fastapi-backend/config/get_scheduler.py b/dash-fastapi-backend/config/get_scheduler.py index 589e457..f6beeb9 100644 --- a/dash-fastapi-backend/config/get_scheduler.py +++ b/dash-fastapi-backend/config/get_scheduler.py @@ -243,17 +243,17 @@ class SchedulerUtil: # 构造日志消息 job_message = f"事件类型: {event_type}, 任务ID: {job_id}, 任务名称: {job_name}, 执行于{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" job_log = JobLogModel( - jobName=job_name, - jobGroup=job_group, - jobExecutor=job_executor, - invokeTarget=invoke_target, - jobArgs=job_args, - jobKwargs=job_kwargs, - jobTrigger=job_trigger, - jobMessage=job_message, + job_name=job_name, + job_group=job_group, + job_executor=job_executor, + invoke_target=invoke_target, + job_args=job_args, + job_kwargs=job_kwargs, + job_trigger=job_trigger, + job_message=job_message, status=status, - exceptionInfo=exception_info, - createTime=datetime.now(), + exception_info=exception_info, + create_time=datetime.now(), ) session = SessionLocal() JobLogService.add_job_log_services(session, job_log) -- Gitee From 97d41a5e65b75c4de10cb819a6e2e76848084d49 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:33:31 +0800 Subject: [PATCH 042/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/cache_c/control_c.py | 3 +- .../callbacks/monitor_c/cache_c/list_c.py | 266 ++++++++---------- .../views/monitor/cache/control/__init__.py | 20 +- .../views/monitor/cache/list/__init__.py | 104 ++++--- 4 files changed, 180 insertions(+), 213 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/control_c.py b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/control_c.py index d735092..11e97af 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/control_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/control_c.py @@ -1,5 +1,4 @@ -from dash.dependencies import Input, Output, State, ClientsideFunction - +from dash.dependencies import ClientsideFunction, Input, Output, State from server import app diff --git a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py index c701177..3605134 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py @@ -4,39 +4,39 @@ import uuid from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate import feffery_utils_components as fuc - +from api.monitor.cache import CacheApi from server import app -from api.cache import get_cache_name_list_api, get_cache_key_list_api, get_cache_value_api, clear_cache_name_api, clear_cache_key_api, clear_all_cache_api +from utils.feedback_util import MessageManager @app.callback( - [Output('cache_name-list-table', 'data'), - Output('cache_name-list-table', 'key'), - Output('api-check-token', 'data', allow_duplicate=True)], + [ + Output('cache_name-list-table', 'data'), + Output('cache_name-list-table', 'key'), + ], Input('refresh-cache_name', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def get_cache_name_list(refresh_click): """ 刷新键名列表回调 """ if refresh_click: - - cache_name_res = get_cache_name_list_api() - if cache_name_res.get('code') == 200: - cache_name_list = cache_name_res.get('data') - cache_name_data = [{'key': item.get('cache_name'), 'id': index + 1, 'operation': {'type': 'link', 'icon': 'antd-delete'}, **item} for index, item in enumerate(cache_name_list)] - - return [ - cache_name_data, - str(uuid.uuid4()), - {'timestamp': time.time()} - ] + cache_name_res = CacheApi.list_cache_name() + cache_name_list = cache_name_res.get('data') + cache_name_data = [ + { + 'key': item.get('cache_name'), + 'id': index + 1, + 'operation': {'type': 'link', 'icon': 'antd-delete'}, + **item, + } + for index, item in enumerate(cache_name_list) + ] return [ - dash.no_update, - dash.no_update, - {'timestamp': time.time()} + cache_name_data, + str(uuid.uuid4()), ] raise PreventUpdate @@ -47,42 +47,49 @@ def get_cache_name_list(refresh_click): cache_key_table_data=Output('cache_key-list-table', 'data'), cache_key_table_key=Output('cache_key-list-table', 'key'), cache_name_store=Output('current-cache_name-store', 'data'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) ), inputs=dict( - cache_name_table_row_click=Input('cache_name-list-table', 'nClicksCell'), + cache_name_table_row_click=Input( + 'cache_name-list-table', 'nClicksCell' + ), cache_key_refresh_click=Input('refresh-cache_key', 'nClicks'), - operations=Input('cache_list-operations-store', 'data') + operations=Input('cache_list-operations-store', 'data'), ), state=dict( - cache_name_table_click_row_record=State('cache_name-list-table', 'recentlyCellClickRecord'), + cache_name_table_click_row_record=State( + 'cache_name-list-table', 'recentlyCellClickRecord' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_cache_key_list(cache_name_table_row_click, cache_key_refresh_click, operations, cache_name_table_click_row_record): +def get_cache_key_list( + cache_name_table_row_click, + cache_key_refresh_click, + operations, + cache_name_table_click_row_record, +): """ 获取键名列表回调 """ if cache_name_table_row_click or cache_key_refresh_click or operations: - - cache_key_res = get_cache_key_list_api(cache_name=cache_name_table_click_row_record.get('key')) - if cache_key_res.get('code') == 200: - cache_key_list = cache_key_res.get('data') - cache_key_data = [ - {'key': item, 'id': index + 1, 'cache_key': item, 'operation': {'type': 'link', 'icon': 'antd-delete'}} for index, item in enumerate(cache_key_list)] - - return dict( - cache_key_table_data=cache_key_data, - cache_key_table_key=str(uuid.uuid4()), - cache_name_store=cache_name_table_click_row_record.get('key'), - api_check_token_trigger={'timestamp': time.time()} - ) + cache_key_res = CacheApi.list_cache_key( + cache_name=cache_name_table_click_row_record.get('key') + ) + cache_key_list = cache_key_res.get('data') + cache_key_data = [ + { + 'key': item, + 'id': index + 1, + 'cache_key': item, + 'operation': {'type': 'link', 'icon': 'antd-delete'}, + } + for index, item in enumerate(cache_key_list) + ] return dict( - cache_key_table_data=dash.no_update, - cache_key_table_key=dash.no_update, - cache_name_store=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + cache_key_table_data=cache_key_data, + cache_key_table_key=str(uuid.uuid4()), + cache_name_store=cache_name_table_click_row_record.get('key'), ) raise PreventUpdate @@ -94,73 +101,60 @@ def get_cache_key_list(cache_name_table_row_click, cache_key_refresh_click, oper cache_key=Output('cache_key-input', 'value', allow_duplicate=True), cache_value=Output('cache_value-input', 'value', allow_duplicate=True), cache_key_store=Output('current-cache_key-store', 'data'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True) ), inputs=dict( cache_key_table_row_click=Input('cache_key-list-table', 'nClicksCell') ), state=dict( - cache_key_table_click_row_record=State('cache_key-list-table', 'recentlyCellClickRecord'), + cache_key_table_click_row_record=State( + 'cache_key-list-table', 'recentlyCellClickRecord' + ), cache_name_store=State('current-cache_name-store', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def get_cache_value(cache_key_table_row_click, cache_key_table_click_row_record, cache_name_store): +def get_cache_value( + cache_key_table_row_click, + cache_key_table_click_row_record, + cache_name_store, +): """ 获取缓存内容回调 """ if cache_key_table_row_click: - - cache_value_res = get_cache_value_api(cache_name=cache_name_store, cache_key=cache_key_table_click_row_record.get('key')) - if cache_value_res.get('code') == 200: - cache = cache_value_res.get('data') - - return dict( - cache_name=cache.get('cache_name'), - cache_key=cache.get('cache_key'), - cache_value=cache.get('cache_value'), - cache_key_store=cache_key_table_click_row_record.get('key'), - api_check_token_trigger={'timestamp': time.time()} - ) + cache_value_res = CacheApi.get_cache_value( + cache_name=cache_name_store, + cache_key=cache_key_table_click_row_record.get('key'), + ) + cache = cache_value_res.get('data') return dict( - cache_name=dash.no_update, - cache_key=dash.no_update, - cache_value=dash.no_update, - cache_key_store=dash.no_update, - api_check_token_trigger={'timestamp': time.time()} + cache_name=cache.get('cache_name'), + cache_key=cache.get('cache_key'), + cache_value=cache.get('cache_value'), + cache_key_store=cache_key_table_click_row_record.get('key'), ) raise PreventUpdate @app.callback( - [Output('cache_list-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + Output('cache_list-operations-store', 'data', allow_duplicate=True), Input('cache_name-list-table', 'nClicksButton'), State('cache_name-list-table', 'recentlyButtonClickedRow'), - prevent_initial_call=True + prevent_initial_call=True, ) def clear_cache_name(clear_click, recently_button_clicked_row): """ 缓存列表表格内部清除缓存回调 """ if clear_click: - clear_cache_name_res = clear_cache_name_api(cache_name=recently_button_clicked_row.get('key')) - if clear_cache_name_res.get('code') == 200: + CacheApi.clear_cache_name( + cache_name=recently_button_clicked_row.get('key') + ) + MessageManager.success(content='清除成功') - return [ - {'type': 'clear_cache_name'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage(clear_cache_name_res.get('message'), type='success') - ] - - return [ - {'type': 'clear_cache_name'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage(clear_cache_name_res.get('message'), type='error') - ] + return {'type': 'clear_cache_name'} raise PreventUpdate @@ -170,54 +164,43 @@ def clear_cache_name(clear_click, recently_button_clicked_row): cache_name=Output('cache_name-input', 'value', allow_duplicate=True), cache_key=Output('cache_key-input', 'value', allow_duplicate=True), cache_value=Output('cache_value-input', 'value', allow_duplicate=True), - operations=Output('cache_list-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - clear_click=Input('cache_key-list-table', 'nClicksButton') + operations=Output( + 'cache_list-operations-store', 'data', allow_duplicate=True + ), ), + inputs=dict(clear_click=Input('cache_key-list-table', 'nClicksButton')), state=dict( - recently_button_clicked_row=State('cache_key-list-table', 'recentlyButtonClickedRow'), - cache_name_store=State('current-cache_name-store', 'data'), - cache_key_store=State('current-cache_key-store', 'data') + recently_button_clicked_row=State( + 'cache_key-list-table', 'recentlyButtonClickedRow' + ), + cache_key_store=State('current-cache_key-store', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def clear_cache_key(clear_click, recently_button_clicked_row, cache_name_store, cache_key_store): +def clear_cache_key(clear_click, recently_button_clicked_row, cache_key_store): """ 键名列表表格内部清除键名回调 """ if clear_click: - clear_cache_key_res = clear_cache_key_api(cache_name=cache_name_store, cache_key=recently_button_clicked_row.get('key')) - if clear_cache_key_res.get('code') == 200: - if cache_key_store == recently_button_clicked_row.get('key'): - return dict( - cache_name=None, - cache_key=None, - cache_value=None, - operations={'type': 'clear_cache_key'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage(clear_cache_key_res.get('message'), type='success') - ) - else: - return dict( - cache_name=dash.no_update, - cache_key=dash.no_update, - cache_value=dash.no_update, - operations={'type': 'clear_cache_key'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage(clear_cache_key_res.get('message'), type='success') - ) - - return dict( - cache_name=dash.no_update, - cache_key=dash.no_update, - cache_value=dash.no_update, - operations={'type': 'clear_cache_key'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage(clear_cache_key_res.get('message'), type='error') + CacheApi.clear_cache_key( + cache_key=recently_button_clicked_row.get('key'), ) + if cache_key_store == recently_button_clicked_row.get('key'): + MessageManager.success(content='清除成功') + + return dict( + cache_name=None, + cache_key=None, + cache_value=None, + operations={'type': 'clear_cache_key'}, + ) + else: + return dict( + cache_name=dash.no_update, + cache_key=dash.no_update, + cache_value=dash.no_update, + operations={'type': 'clear_cache_key'}, + ) raise PreventUpdate @@ -229,43 +212,34 @@ def clear_cache_key(clear_click, recently_button_clicked_row, cache_name_store, cache_value=Output('cache_value-input', 'value', allow_duplicate=True), refresh_cache_name=Output('refresh-cache_name', 'nClicks'), refresh_cache_key=Output('refresh-cache_key', 'nClicks'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - clear_all_click=Input('clear-all-cache', 'nClicks') ), + inputs=dict(clear_all_click=Input('clear-all-cache', 'nClicks')), state=dict( refresh_cache_name_click=State('refresh-cache_name', 'nClicks'), - refresh_cache_key_click=State('refresh-cache_key', 'nClicks') + refresh_cache_key_click=State('refresh-cache_key', 'nClicks'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def clear_all_cache(clear_all_click, refresh_cache_name_click, refresh_cache_key_click): +def clear_all_cache( + clear_all_click, refresh_cache_name_click, refresh_cache_key_click +): """ 清除所有缓存回调 """ if clear_all_click: - clear_all_cache_res = clear_all_cache_api() - if clear_all_cache_res.get('code') == 200: - return dict( - cache_name=None, - cache_key=None, - cache_value=None, - refresh_cache_name=refresh_cache_name_click + 1 if refresh_cache_name_click else 1, - refresh_cache_key=refresh_cache_key_click + 1 if refresh_cache_key_click else 1, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage(clear_all_cache_res.get('message'), type='success') - ) + CacheApi.clear_cache_all() + MessageManager.success(content='清除成功') return dict( - cache_name=dash.no_update, - cache_key=dash.no_update, - cache_value=dash.no_update, - refresh_cache_name=dash.no_update, - refresh_cache_key=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage(clear_all_cache_res.get('message'), type='error') + cache_name=None, + cache_key=None, + cache_value=None, + refresh_cache_name=refresh_cache_name_click + 1 + if refresh_cache_name_click + else 1, + refresh_cache_key=refresh_cache_key_click + 1 + if refresh_cache_key_click + else 1, ) raise PreventUpdate diff --git a/dash-fastapi-frontend/views/monitor/cache/control/__init__.py b/dash-fastapi-frontend/views/monitor/cache/control/__init__.py index 08dd3fb..77d959d 100644 --- a/dash-fastapi-frontend/views/monitor/cache/control/__init__.py +++ b/dash-fastapi-frontend/views/monitor/cache/control/__init__.py @@ -1,21 +1,17 @@ -from dash import html, dcc import feffery_antd_components as fac +from dash import dcc, html +from api.monitor.cache import CacheApi +from callbacks.monitor_c.cache_c import control_c # noqa: F401 -import callbacks.monitor_c.cache_c.control_c -from api.cache import get_cache_statistical_info_api def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - command_stats = [] - db_size = '' - info = {} - cache_info_res = get_cache_statistical_info_api() - if cache_info_res.get('code') == 200: - cache_info = cache_info_res.get('data') - command_stats = cache_info.get('command_stats') - db_size = cache_info.get('db_size') - info = cache_info.get('info') + cache_info_res = CacheApi.get_cache() + cache_info = cache_info_res.get('data') + command_stats = cache_info.get('command_stats') + db_size = cache_info.get('db_size') + info = cache_info.get('info') return [ dcc.Store(id='control-button-perms-container', data=button_perms), diff --git a/dash-fastapi-frontend/views/monitor/cache/list/__init__.py b/dash-fastapi-frontend/views/monitor/cache/list/__init__.py index 015739c..d40728c 100644 --- a/dash-fastapi-frontend/views/monitor/cache/list/__init__.py +++ b/dash-fastapi-frontend/views/monitor/cache/list/__init__.py @@ -1,16 +1,21 @@ -from dash import html, dcc import feffery_antd_components as fac - -from api.cache import get_cache_name_list_api -import callbacks.monitor_c.cache_c.list_c +from dash import dcc, html +from api.monitor.cache import CacheApi +from callbacks.monitor_c.cache_c import list_c # noqa: F401 def render(*args, **kwargs): - cache_name_data = [] - cache_name_res = get_cache_name_list_api() - if cache_name_res.get('code') == 200: - cache_name_list = cache_name_res.get('data') - cache_name_data = [{'key': item.get('cache_name'), 'id': index + 1, 'operation': {'type': 'link', 'icon': 'antd-delete'}, **item} for index, item in enumerate(cache_name_list)] + cache_name_res = CacheApi.list_cache_name() + cache_name_list = cache_name_res.get('data') + cache_name_data = [ + { + 'key': item.get('cache_name'), + 'id': index + 1, + 'operation': {'type': 'link', 'icon': 'antd-delete'}, + **item, + } + for index, item in enumerate(cache_name_list) + ] return html.Div( [ @@ -53,36 +58,38 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, + ], + enableCellClickListenColumns=[ + 'id', + 'cache_name', + 'remark', ], - enableCellClickListenColumns=['id', 'cache_name', 'remark'], bordered=False, pagination={ 'showSizeChanger': True, 'showQuickJumper': True, - 'hideOnSinglePage': True + 'hideOnSinglePage': True, }, ) ), title=fac.AntdSpace( [ fac.AntdIcon(icon='antd-book'), - fac.AntdText('缓存列表') + fac.AntdText('缓存列表'), ] ), extra=fac.AntdButton( id='refresh-cache_name', type='link', - icon=fac.AntdIcon( - icon='antd-reload' - ) + icon=fac.AntdIcon(icon='antd-reload'), ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=8 + span=8, ), fac.AntdCol( fac.AntdCard( @@ -111,36 +118,37 @@ def render(*args, **kwargs): 'renderOptions': { 'renderType': 'button' }, - } + }, + ], + enableCellClickListenColumns=[ + 'id', + 'cache_key', ], - enableCellClickListenColumns=['id', 'cache_key'], bordered=False, pagination={ 'showSizeChanger': True, 'showQuickJumper': True, 'hideOnSinglePage': True, - } + }, ) ), title=fac.AntdSpace( [ fac.AntdIcon(icon='antd-key'), - fac.AntdText('键名列表') + fac.AntdText('键名列表'), ] ), extra=fac.AntdButton( id='refresh-cache_key', type='link', - icon=fac.AntdIcon( - icon='antd-reload' - ) + icon=fac.AntdIcon(icon='antd-reload'), ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=8 + span=8, ), fac.AntdCol( fac.AntdCard( @@ -150,21 +158,17 @@ def render(*args, **kwargs): fac.AntdInput( id='cache_name-input', readOnly=True, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), - label='缓存名称' + label='缓存名称', ), fac.AntdFormItem( fac.AntdInput( id='cache_key-input', readOnly=True, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), - label='缓存键名' + label='缓存键名', ), fac.AntdFormItem( fac.AntdInput( @@ -173,43 +177,37 @@ def render(*args, **kwargs): readOnly=True, autoSize={ 'minRows': 5, - 'maxRows': 10 + 'maxRows': 10, }, - style={ - 'width': '100%' - } + style={'width': '100%'}, ), - label='缓存内容' - ) + label='缓存内容', + ), ], layout='vertical', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), title=fac.AntdSpace( [ fac.AntdIcon(icon='antd-file-text'), - fac.AntdText('缓存内容') + fac.AntdText('缓存内容'), ] ), extra=fac.AntdButton( '清除全部', id='clear-all-cache', type='link', - icon=fac.AntdIcon( - icon='antd-clear' - ) + icon=fac.AntdIcon(icon='antd-clear'), ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=8 - ) + span=8, + ), ], - gutter=10 - ) + gutter=10, + ), ] ) -- Gitee From a54edfe897f657cd01ec0d139e12f8ffff28484d Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:33:55 +0800 Subject: [PATCH 043/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=9B=91=E6=8E=A7=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/monitor/server/__init__.py | 188 +++++++++--------- 1 file changed, 92 insertions(+), 96 deletions(-) diff --git a/dash-fastapi-frontend/views/monitor/server/__init__.py b/dash-fastapi-frontend/views/monitor/server/__init__.py index b88944e..56fd55f 100644 --- a/dash-fastapi-frontend/views/monitor/server/__init__.py +++ b/dash-fastapi-frontend/views/monitor/server/__init__.py @@ -1,42 +1,45 @@ -from dash import html, dcc import feffery_antd_components as fac - -from api.server import get_server_statistical_info_api +from dash import dcc, html +from api.monitor.server import ServerApi def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - cpu = {} - mem = {} - sys = {} - py = {} - sys_files = [] - server_info_res = get_server_statistical_info_api() - if server_info_res.get('code') == 200: - server_info = server_info_res.get('data') - cpu = [dict(name=key, value=value) for key, value in server_info.get('cpu').items()] - for item in cpu: - if item.get('name') == 'cpu_num': - item['name'] = '核心数' - if item.get('name') == 'used': - item['name'] = '用户使用率' - if item.get('name') == 'sys': - item['name'] = '系统使用率' - if item.get('name') == 'free': - item['name'] = '当前空闲率' - mem = [dict(name=key, value=value) for key, value in server_info.get('mem').items()] - for item in mem: - if item.get('name') == 'total': - item['name'] = '总内存' - if item.get('name') == 'used': - item['name'] = '已用内存' - if item.get('name') == 'free': - item['name'] = '剩余内存' - if item.get('name') == 'usage': - item['name'] = '使用率' - sys = server_info.get('sys') - py = server_info.get('py') - sys_files = server_info.get('sys_files') + server_info_res = ServerApi.get_server() + server_info = server_info_res.get('data') + cpu = [ + dict(name=key, value=value) + for key, value in server_info.get('cpu').items() + ] + for item in cpu: + if item.get('name') == 'cpu_num': + item['name'] = '核心数' + if item.get('name') == 'used': + item['name'] = '用户使用率' + item['value'] = f"{item['value']}%" + if item.get('name') == 'sys': + item['name'] = '系统使用率' + item['value'] = f"{item['value']}%" + if item.get('name') == 'free': + item['name'] = '当前空闲率' + item['value'] = f"{item['value']}%" + mem = [ + dict(name=key, value=value) + for key, value in server_info.get('mem').items() + ] + for item in mem: + if item.get('name') == 'total': + item['name'] = '总内存' + if item.get('name') == 'used': + item['name'] = '已用内存' + if item.get('name') == 'free': + item['name'] = '剩余内存' + if item.get('name') == 'usage': + item['name'] = '使用率' + item['value'] = f"{item['value']}%" + sys = server_info.get('sys') + py = server_info.get('py') + sys_files = server_info.get('sys_files') return [ dcc.Store(id='server-button-perms-container', data=button_perms), @@ -66,23 +69,23 @@ def render(*args, **kwargs): }, ], bordered=False, - pagination={ - 'hideOnSinglePage': True - } + pagination={'hideOnSinglePage': True}, ) ], title=html.Div( [ fac.AntdIcon(icon='antd-box-plot'), - fac.AntdText('CPU', style={'marginLeft': '10px'}) + fac.AntdText( + 'CPU', style={'marginLeft': '10px'} + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdCard( @@ -106,26 +109,26 @@ def render(*args, **kwargs): }, ], bordered=False, - pagination={ - 'hideOnSinglePage': True - } + pagination={'hideOnSinglePage': True}, ) ], title=html.Div( [ fac.AntdIcon(icon='antd-file-text'), - fac.AntdText('内存', style={'marginLeft': '10px'}) + fac.AntdText( + '内存', style={'marginLeft': '10px'} + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=12 + span=12, ), ], - gutter=20 + gutter=20, ), fac.AntdRow( [ @@ -136,53 +139,51 @@ def render(*args, **kwargs): [ fac.AntdDescriptionItem( sys.get('computer_name'), - label='服务器名称' + label='服务器名称', ), fac.AntdDescriptionItem( sys.get('os_name'), - label='操作系统' + label='操作系统', ), fac.AntdDescriptionItem( sys.get('computer_ip'), - label='服务器IP' + label='服务器IP', ), fac.AntdDescriptionItem( sys.get('os_arch'), - label='系统架构' + label='系统架构', ), ], bordered=True, column=2, - labelStyle={ - 'textAlign': 'center' - }, + labelStyle={'textAlign': 'center'}, style={ 'width': '100%', 'textAlign': 'center', 'marginLeft': '20px', - 'marginRight': '20px' - } + 'marginRight': '20px', + }, ) ], title=html.Div( [ fac.AntdIcon(icon='antd-desktop'), - fac.AntdText('服务器信息', style={'marginLeft': '10px'}) + fac.AntdText( + '服务器信息', + style={'marginLeft': '10px'}, + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=24 + span=24, ), ], gutter=20, - style={ - 'marginTop': '20px', - 'marginBottom': '20px' - } + style={'marginTop': '20px', 'marginBottom': '20px'}, ), fac.AntdRow( [ @@ -193,61 +194,58 @@ def render(*args, **kwargs): [ fac.AntdDescriptionItem( py.get('name'), - label='Python名称' + label='Python名称', ), fac.AntdDescriptionItem( py.get('version'), - label='Python版本' + label='Python版本', ), fac.AntdDescriptionItem( py.get('start_time'), - label='启动时间' + label='启动时间', ), fac.AntdDescriptionItem( py.get('run_time'), - label='运行时长' + label='运行时长', ), fac.AntdDescriptionItem( - py.get('home'), - label='安装路径' + py.get('home'), label='安装路径' ), fac.AntdDescriptionItem( - py.get('project_dir'), - label='项目路径' + sys.get('user_dir'), + label='项目路径', ), ], bordered=True, column=2, - labelStyle={ - 'textAlign': 'center' - }, + labelStyle={'textAlign': 'center'}, style={ 'width': '100%', 'textAlign': 'center', 'marginLeft': '20px', - 'marginRight': '20px' - } + 'marginRight': '20px', + }, ) ], title=html.Div( [ fac.AntdIcon(icon='antd-filter'), - fac.AntdText('Python解释器信息', style={'marginLeft': '10px'}) + fac.AntdText( + 'Python解释器信息', + style={'marginLeft': '10px'}, + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=24 + span=24, ), ], gutter=20, - style={ - 'marginTop': '20px', - 'marginBottom': '20px' - } + style={'marginTop': '20px', 'marginBottom': '20px'}, ), fac.AntdRow( [ @@ -272,8 +270,8 @@ def render(*args, **kwargs): }, }, { - 'dataIndex': 'disk_name', - 'title': '盘符类型', + 'dataIndex': 'type_name', + 'title': '盘符名称', 'renderOptions': { 'renderType': 'ellipsis' }, @@ -308,31 +306,29 @@ def render(*args, **kwargs): }, ], bordered=False, - pagination={ - 'hideOnSinglePage': True - } + pagination={'hideOnSinglePage': True}, ) ], title=html.Div( [ fac.AntdIcon(icon='antd-file-sync'), - fac.AntdText('磁盘状态', style={'marginLeft': '10px'}) + fac.AntdText( + '磁盘状态', + style={'marginLeft': '10px'}, + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=24 + span=24, ), ], gutter=20, - style={ - 'marginTop': '20px', - 'marginBottom': '20px' - } + style={'marginTop': '20px', 'marginBottom': '20px'}, ), ], - ) + ), ] -- Gitee From ba6efc3b0126d75837d6cf80edc86583a790dbde Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:34:25 +0800 Subject: [PATCH 044/229] =?UTF-8?q?chore:=20=E6=8A=BD=E7=A6=BBlogger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/log_util.py | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 dash-fastapi-frontend/utils/log_util.py diff --git a/dash-fastapi-frontend/utils/log_util.py b/dash-fastapi-frontend/utils/log_util.py new file mode 100644 index 0000000..edf2cdb --- /dev/null +++ b/dash-fastapi-frontend/utils/log_util.py @@ -0,0 +1,38 @@ +import os +import time +from loguru import logger +from config.global_config import PathConfig + + +log_time = time.strftime('%Y%m%d', time.localtime()) +# sys_log_file_path = os.path.join(PathConfig.ABS_ROOT_PATH, 'logs', 'sys_log', f'sys_request_log_{log_time}.log') +api_log_file_path = os.path.join( + PathConfig.ABS_ROOT_PATH, + 'logs', + 'api_log', + f'api_request_log_{log_time}.log', +) +exception_log_file_path = os.path.join( + PathConfig.ABS_ROOT_PATH, + 'logs', + 'exception_log', + f'exception_log_{log_time}.log', +) +# logger.add(sys_log_file_path, filter=lambda x: '[sys]' in x['message'], +# rotation="50MB", encoding="utf-8", enqueue=True, compression="zip") +logger.add( + api_log_file_path, + filter=lambda x: '[api]' in x['message'], + rotation='50MB', + encoding='utf-8', + enqueue=True, + compression='zip', +) +logger.add( + exception_log_file_path, + filter=lambda x: '[exception]' in x['message'], + rotation='50MB', + encoding='utf-8', + enqueue=True, + compression='zip', +) -- Gitee From a46b7f2ea998e457066f06f23834ef7d11279a43 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:35:12 +0800 Subject: [PATCH 045/229] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4logger?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/config/exception.py | 7 ++++--- dash-fastapi-frontend/server.py | 25 ++--------------------- dash-fastapi-frontend/utils/request.py | 2 +- 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/dash-fastapi-frontend/config/exception.py b/dash-fastapi-frontend/config/exception.py index 2472604..5f8711f 100644 --- a/dash-fastapi-frontend/config/exception.py +++ b/dash-fastapi-frontend/config/exception.py @@ -1,5 +1,6 @@ from dash import set_props, ctx, no_update from utils.feedback_util import MessageManager, NotificationManager +from utils.log_util import logger class AuthException(Exception): @@ -43,17 +44,17 @@ class ServiceWarning(Exception): def global_exception_handler(error): - print(error) if isinstance(error, AuthException): set_props('token-invalid-modal', {'visible': True}) elif isinstance(error, RequestException): - NotificationManager.error(description=error.message) + NotificationManager.error(description=error.message, message='请求异常') elif isinstance(error, ServiceWarning): MessageManager.warning(content=error.message) elif isinstance(error, ServiceException): MessageManager.error(content=error.message) else: - NotificationManager.error(description=str(error)) + logger.exception(f'[exception]{error}') + NotificationManager.error(description=str(error), message='服务异常') # dash2.18版本对输出为字典形式的回调进行异常处理会报错,临时采用此方法解决 outputs_grouping = ctx.outputs_grouping if isinstance(outputs_grouping, dict): diff --git a/dash-fastapi-frontend/server.py b/dash-fastapi-frontend/server.py index 919dec8..7b1eb10 100644 --- a/dash-fastapi-frontend/server.py +++ b/dash-fastapi-frontend/server.py @@ -1,12 +1,10 @@ import dash -import os -import time -from loguru import logger from flask import request, session from user_agents import parse from config.env import AppConfig from config.exception import global_exception_handler -from config.global_config import PathConfig +from utils.log_util import logger + app = dash.Dash( __name__, @@ -25,25 +23,6 @@ app.server.secret_key = AppConfig.app_secret_key app.server.config['COMPRESS_ALGORITHM'] = AppConfig.app_compress_algorithm app.server.config['COMPRESS_BR_LEVEL'] = AppConfig.app_compress_br_level -log_time = time.strftime('%Y%m%d', time.localtime()) -# sys_log_file_path = os.path.join(PathConfig.ABS_ROOT_PATH, 'log', 'sys_log', f'sys_request_log_{log_time}.log') -api_log_file_path = os.path.join( - PathConfig.ABS_ROOT_PATH, - 'log', - 'api_log', - f'api_request_log_{log_time}.log', -) -# logger.add(sys_log_file_path, filter=lambda x: '[sys]' in x['message'], -# rotation="50MB", encoding="utf-8", enqueue=True, compression="zip") -logger.add( - api_log_file_path, - filter=lambda x: '[api]' in x['message'], - rotation='50MB', - encoding='utf-8', - enqueue=True, - compression='zip', -) - # 获取用户浏览器信息 @server.before_request diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index af0c038..76e7ba4 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -9,7 +9,7 @@ from config.exception import ( ServiceWarning, ) from config.global_config import ApiBaseUrlConfig -from server import logger +from utils.log_util import logger def api_request( -- Gitee From f60374eb12ad93613d79b7660e1289d84d35d5ee Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:36:07 +0800 Subject: [PATCH 046/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=89=A9?= =?UTF-8?q?=E4=BD=99=E6=A8=A1=E5=9D=97=E5=9B=9E=E8=B0=83=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=BC=96=E6=8E=92=E5=8F=8Aapi=E8=AF=B7=E6=B1=82=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/logininfor_c.py | 149 ++--- .../callbacks/monitor_c/operlog_c.py | 180 +++--- .../callbacks/system_c/dict_c/dict_c.py | 313 ++++------ .../callbacks/system_c/dict_c/dict_data_c.py | 256 +++------ .../menu_c/components_c/button_type_c.py | 72 +-- .../menu_c/components_c/content_type_c.py | 72 +-- .../menu_c/components_c/menu_type_c.py | 72 +-- .../callbacks/system_c/menu_c/menu_c.py | 325 +++++------ .../callbacks/system_c/role_c/role_c.py | 534 ++++++++---------- .../callbacks/system_c/user_c/user_c.py | 4 +- .../views/system/menu/__init__.py | 2 +- 11 files changed, 756 insertions(+), 1223 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index def925b..8f8d23b 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -1,13 +1,11 @@ -import dash import time import uuid -from dash import dcc +from dash import ctx, dcc from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - -from server import app from api.monitor.logininfor import LogininforApi +from server import app +from utils.feedback_util import MessageManager @app.callback( @@ -22,9 +20,6 @@ from api.monitor.logininfor import LogininforApi login_log_table_selectedrowkeys=Output( 'login_log-list-table', 'selectedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('login_log-search', 'nClicks'), @@ -72,7 +67,7 @@ def get_login_log_table_data( page_num=1, page_size=10, ) - triggered_prop = dash.ctx.triggered[0].get('prop_id') + triggered_prop = ctx.triggered[0].get('prop_id') if triggered_prop == 'login_log-list-table.pagination': query_params.update( { @@ -82,37 +77,27 @@ def get_login_log_table_data( ) if search_click or refresh_click or pagination or operations: table_info = LogininforApi.list_logininfor(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - item['key'] = str(item['info_id']) - - return dict( - login_log_table_data=table_data, - login_log_table_pagination=table_pagination, - login_log_table_key=str(uuid.uuid4()), - login_log_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='成功', color='blue') + else: + item['status'] = dict(tag='失败', color='volcano') + item['key'] = str(item['info_id']) return dict( - login_log_table_data=dash.no_update, - login_log_table_pagination=dash.no_update, - login_log_table_key=dash.no_update, - login_log_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + login_log_table_data=table_data, + login_log_table_pagination=table_pagination, + login_log_table_key=str(uuid.uuid4()), + login_log_table_selectedrowkeys=None, ) raise PreventUpdate @@ -174,7 +159,7 @@ def change_login_log_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -193,7 +178,7 @@ def change_login_log_unlock_button_status(table_rows_selected): """ 根据选择的表格数据行数控制解锁按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1: @@ -220,7 +205,7 @@ def login_log_delete_modal(operation_click, selected_row_keys): """ 显示删除或清空登录日志二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.index in ['delete', 'clear']: if trigger_id.index == 'delete': info_ids = ','.join(selected_row_keys) @@ -228,25 +213,21 @@ def login_log_delete_modal(operation_click, selected_row_keys): return [ f'是否确认删除访问编号为{info_ids}的登录日志?', True, - info_ids, + {'oper_type': 'delete', 'info_ids': info_ids}, ] elif trigger_id.index == 'clear': return [ '是否确认清除所有的登录日志?', True, - None, + {'oper_type': 'clear'}, ] raise PreventUpdate @app.callback( - [ - Output('login_log-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('login_log-operations-store', 'data', allow_duplicate=True), Input('login_log-delete-confirm-modal', 'okCounts'), State('login_log-delete-ids-store', 'data'), prevent_initial_call=True, @@ -258,34 +239,16 @@ def login_log_delete_confirm(delete_confirm, info_ids_data): if delete_confirm: oper_type = info_ids_data.get('oper_type') if oper_type == 'clear': - clear_button_info = LogininforApi.clean_logininfor() - if clear_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除成功', type='success'), - ] + LogininforApi.clean_logininfor() + MessageManager.success(content='清除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除失败', type='error'), - ] + return {'type': 'clear'} else: params = info_ids_data.get('info_ids') - delete_button_info = LogininforApi.del_logininfor(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + LogininforApi.del_logininfor(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -294,8 +257,6 @@ def login_log_delete_confirm(delete_confirm, info_ids_data): [ Output('login_log-export-container', 'data', allow_duplicate=True), Output('login_log-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('login_log-export', 'nClicks'), prevent_initial_call=True, @@ -306,24 +267,15 @@ def export_login_log_list(export_click): """ if export_click: export_login_log_res = LogininforApi.export_logininfor({}) - if export_login_log_res.status_code == 200: - export_login_log = export_login_log_res.content - - return [ - dcc.send_bytes( - export_login_log, - f'登录日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + export_login_log = export_login_log_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_login_log, + f'登录日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -346,10 +298,6 @@ def reset_login_log_export_status(data): @app.callback( - [ - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], Input('login_log-unlock', 'nClicks'), State('login_log-list-table', 'selectedRows'), prevent_initial_call=True, @@ -360,16 +308,5 @@ def unlock_user(unlock_click, selected_rows): """ if unlock_click: user_name = selected_rows[0].get('user_name') - unlock_info_res = LogininforApi.unlock_logininfor(user_name=user_name) - if unlock_info_res.get('code') == 200: - return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('解锁成功', type='success'), - ] - - return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('解锁失败', type='error'), - ] - - raise PreventUpdate + LogininforApi.unlock_logininfor(user_name=user_name) + MessageManager.success(content='解锁成功') diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index 7322b44..4b4cb88 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -1,14 +1,12 @@ -import dash import time import uuid -from dash import dcc +from dash import ctx, dcc from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - -from server import app from api.monitor.operlog import OperlogApi from api.system.dict.data import DictDataApi +from server import app +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -24,9 +22,6 @@ from utils.permission_util import PermissionManager operation_log_table_selectedrowkeys=Output( 'operation_log-list-table', 'selectedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('operation_log-search', 'nClicks'), @@ -77,7 +72,7 @@ def get_operation_log_table_data( page_num=1, page_size=10, ) - triggered_prop = dash.ctx.triggered[0].get('prop_id') + triggered_prop = ctx.triggered[0].get('prop_id') if triggered_prop == 'operation_log-list-table.pagination': query_params.update( { @@ -88,63 +83,53 @@ def get_operation_log_table_data( if search_click or refresh_click or pagination or operations: option_table = [] info = DictDataApi.get_dicts(dict_type='sys_oper_type') - if info.get('code') == 200: - data = info.get('data') - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), + data = info.get('data') + option_table = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + ) + for item in data + ] + option_dict = {item.get('value'): item for item in option_table} + + table_info = OperlogApi.list_operlog(query_params) + if table_info['code'] == 200: + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == 0: + item['status'] = dict(tag='成功', color='blue') + else: + item['status'] = dict(tag='失败', color='volcano') + if str(item.get('business_type')) in option_dict.keys(): + item['business_type'] = dict( + tag=option_dict.get(str(item.get('business_type'))).get( + 'label' + ), + color='blue', ) - for item in data + item['key'] = str(item['oper_id']) + item['cost_time'] = f"{item['cost_time']}毫秒" + item['operation'] = [ + {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:operlog:query') + else {}, ] - option_dict = {item.get('value'): item for item in option_table} - - table_info = OperlogApi.list_operlog(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == 0: - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - if str(item.get('business_type')) in option_dict.keys(): - item['business_type'] = dict( - tag=option_dict.get(str(item.get('business_type'))).get( - 'label' - ), - color='blue', - ) - item['key'] = str(item['oper_id']) - item['cost_time'] = f"{item['cost_time']}毫秒" - item['operation'] = [ - {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} - if PermissionManager.check_perms('monitor:operlog:query') - else {}, - ] - - return dict( - operation_log_table_data=table_data, - operation_log_table_pagination=table_pagination, - operation_log_table_key=str(uuid.uuid4()), - operation_log_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) return dict( - operation_log_table_data=dash.no_update, - operation_log_table_pagination=dash.no_update, - operation_log_table_key=dash.no_update, - operation_log_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + operation_log_table_data=table_data, + operation_log_table_pagination=table_pagination, + operation_log_table_key=str(uuid.uuid4()), + operation_log_table_selectedrowkeys=None, ) raise PreventUpdate @@ -225,7 +210,7 @@ def add_edit_operation_log_modal( """ if button_click: # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[-1]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[-1]] operation_log_info = recently_button_clicked_row oper_name = ( operation_log_info.get('oper_name') @@ -272,7 +257,7 @@ def change_operation_log_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -296,7 +281,7 @@ def operation_log_delete_modal(operation_click, selected_row_keys): """ 显示删除或清空操作日志二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.index in ['delete', 'clear']: if trigger_id.index == 'delete': oper_ids = ','.join(selected_row_keys) @@ -304,25 +289,21 @@ def operation_log_delete_modal(operation_click, selected_row_keys): return [ f'是否确认删除日志编号为{oper_ids}的操作日志?', True, - oper_ids, + {'oper_type': 'delete', 'oper_ids': oper_ids}, ] elif trigger_id.index == 'clear': return [ '是否确认清除所有的操作日志?', True, - None, + {'oper_type': 'clear'}, ] raise PreventUpdate @app.callback( - [ - Output('operation_log-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('operation_log-operations-store', 'data', allow_duplicate=True), Input('operation_log-delete-confirm-modal', 'okCounts'), State('operation_log-delete-ids-store', 'data'), prevent_initial_call=True, @@ -334,34 +315,16 @@ def operation_log_delete_confirm(delete_confirm, oper_ids_data): if delete_confirm: oper_type = oper_ids_data.get('oper_type') if oper_type == 'clear': - clear_button_info = OperlogApi.clean_operlog() - if clear_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除成功', type='success'), - ] + OperlogApi.clean_operlog() + MessageManager.success(content='清除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('清除失败', type='error'), - ] + return {'type': 'clear'} else: - params = oper_ids_data - delete_button_info = OperlogApi.del_operlog(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + params = oper_ids_data.get('oper_ids') + OperlogApi.del_operlog(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -370,8 +333,6 @@ def operation_log_delete_confirm(delete_confirm, oper_ids_data): [ Output('operation_log-export-container', 'data', allow_duplicate=True), Output('operation_log-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('operation_log-export', 'nClicks'), prevent_initial_call=True, @@ -382,24 +343,15 @@ def export_operation_log_list(export_click): """ if export_click: export_operation_log_res = OperlogApi.export_operlog({}) - if export_operation_log_res.status_code == 200: - export_operation_log = export_operation_log_res.content - - return [ - dcc.send_bytes( - export_operation_log, - f'操作日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + export_operation_log = export_operation_log_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_operation_log, + f'操作日志信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index da67864..9ecbf2e 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -1,14 +1,12 @@ -import dash import time import uuid -from dash import dcc +from dash import ctx, dcc, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.dict.type import DictTypeApi from server import app from utils.common import validate_data_not_empty -from api.system.dict.type import DictTypeApi +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -24,9 +22,6 @@ from utils.permission_util import PermissionManager dict_type_table_selectedrowkeys=Output( 'dict_type-list-table', 'selectedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('dict_type-search', 'nClicks'), @@ -70,7 +65,7 @@ def get_dict_type_table_data( page_num=1, page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'dict_type-list-table': query_params.update( { @@ -80,49 +75,39 @@ def get_dict_type_table_data( ) if search_click or refresh_click or pagination or operations: table_info = DictTypeApi.list_type(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - item['key'] = str(item['dict_id']) - item['dict_type'] = { - 'content': item['dict_type'], - 'type': 'link', - } - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dict:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dict:remove') - else {}, - ] - - return dict( - dict_type_table_data=table_data, - dict_type_table_pagination=table_pagination, - dict_type_table_key=str(uuid.uuid4()), - dict_type_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + item['key'] = str(item['dict_id']) + item['dict_type'] = { + 'content': item['dict_type'], + 'type': 'link', + } + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dict:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dict:remove') + else {}, + ] return dict( - dict_type_table_data=dash.no_update, - dict_type_table_pagination=dash.no_update, - dict_type_table_key=dash.no_update, - dict_type_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + dict_type_table_data=table_data, + dict_type_table_pagination=table_pagination, + dict_type_table_key=str(uuid.uuid4()), + dict_type_table_selectedrowkeys=None, ) raise PreventUpdate @@ -182,7 +167,7 @@ def change_dict_type_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1: @@ -206,7 +191,7 @@ def change_dict_type_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -235,9 +220,6 @@ def change_dict_type_delete_button_status(table_rows_selected): 'help', allow_duplicate=True, ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('dict_type-edit-id-store', 'data'), modal_type=Output('dict_type-operations-store-bk', 'data'), ), @@ -266,16 +248,16 @@ def add_edit_dict_type_modal( """ 显示新增或编辑字典类型弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if ( trigger_id == {'index': 'add', 'type': 'dict_type-operation-button'} or trigger_id == {'index': 'edit', 'type': 'dict_type-operation-button'} or (trigger_id == 'dict_type-list-table' and clicked_content == '修改') ): # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'dict_type-operation-button'}: dict_type_info = dict( dict_name=None, @@ -289,7 +271,6 @@ def add_edit_dict_type_modal( form_value=[dict_type_info.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger=dash.no_update, edit_row_info=None, modal_type={'type': 'add'}, ) @@ -307,26 +288,23 @@ def add_edit_dict_type_modal( else: dict_id = int(recently_button_clicked_row['key']) dict_type_info_res = DictTypeApi.get_type(dict_id=dict_id) - if dict_type_info_res['code'] == 200: - dict_type_info = dict_type_info_res['data'] - return dict( - modal_visible=True, - modal_title='编辑字典类型', - form_value=[dict_type_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=dict_type_info if dict_type_info else None, - modal_type={'type': 'edit'}, - ) + dict_type_info = dict_type_info_res['data'] + return dict( + modal_visible=True, + modal_title='编辑字典类型', + form_value=[dict_type_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + edit_row_info=dict_type_info if dict_type_info else None, + modal_type={'type': 'edit'}, + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=no_update, + modal_title=no_update, + form_value=[no_update] * len(form_value_list), + form_label_validate_status=[no_update] * len(form_label_list), + form_label_validate_info=[no_update] * len(form_label_list), edit_row_info=None, modal_type=None, ) @@ -350,12 +328,6 @@ def add_edit_dict_type_modal( operations=Output( 'dict_type-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('dict_type-modal', 'okCounts')), state=dict( @@ -379,15 +351,13 @@ def dict_type_confirm( """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] - ] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + x['id']['index']: x.get('value') for x in ctx.states_list[-2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) @@ -400,49 +370,39 @@ def dict_type_confirm( params_edit['dict_id'] = ( edit_row_info.get('dict_id') if edit_row_info else None ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = DictTypeApi.add_type(params_add) + DictTypeApi.add_type(params_add) if modal_type == 'edit': - api_res = DictTypeApi.update_type(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + DictTypeApi.update_type(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'add'}, + ) + if modal_type == 'edit': + MessageManager.success(content='编辑成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -458,12 +418,8 @@ def dict_type_confirm( else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @@ -496,7 +452,7 @@ def dict_type_delete_modal( """ 显示删除字典类型二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == { 'index': 'delete', 'type': 'dict_type-operation-button', @@ -510,7 +466,7 @@ def dict_type_delete_modal( if clicked_content == '删除': dict_ids = recently_button_clicked_row['key'] else: - return dash.no_update + return no_update return [ f'是否确认删除字典编号为{dict_ids}的字典类型?', @@ -522,11 +478,7 @@ def dict_type_delete_modal( @app.callback( - [ - Output('dict_type-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('dict_type-operations-store', 'data', allow_duplicate=True), Input('dict_type-delete-confirm-modal', 'okCounts'), State('dict_type-delete-ids-store', 'data'), prevent_initial_call=True, @@ -537,19 +489,10 @@ def dict_type_delete_confirm(delete_confirm, dict_ids_data): """ if delete_confirm: params = dict_ids_data - delete_button_info = DictTypeApi.del_type(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + DictTypeApi.del_type(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -567,9 +510,6 @@ def dict_type_delete_confirm(delete_confirm, dict_ids_data): 'dict_data-dict_type-select', 'value', allow_duplicate=True ), dict_data_search_nclick=Output('dict_data-search', 'nClicks'), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict(button_click=Input('dict_type-list-table', 'nClicksButton')), state=dict( @@ -595,37 +535,22 @@ def dict_type_to_dict_data_modal( 'dict_type' ).get('content'): all_dict_type_info = DictTypeApi.optionselect() - if all_dict_type_info.get('code') == 200: - all_dict_type = all_dict_type_info.get('data') - dict_data_options = [ - dict(label=item.get('dict_name'), value=item.get('dict_type')) - for item in all_dict_type - ] - - return dict( - dict_data_modal_visible=True, - dict_data_modal_title='字典数据', - dict_data_select_options=dict_data_options, - dict_data_select_value=recently_button_clicked_row.get( - 'dict_type' - ).get('content'), - dict_data_search_nclick=dict_data_search_nclick + 1 - if dict_data_search_nclick - else 1, - api_check_token_trigger={'timestamp': time.time()}, - ) + all_dict_type = all_dict_type_info.get('data') + dict_data_options = [ + dict(label=item.get('dict_name'), value=item.get('dict_type')) + for item in all_dict_type + ] return dict( dict_data_modal_visible=True, dict_data_modal_title='字典数据', - dict_data_select_options=[], + dict_data_select_options=dict_data_options, dict_data_select_value=recently_button_clicked_row.get( 'dict_type' ).get('content'), dict_data_search_nclick=dict_data_search_nclick + 1 if dict_data_search_nclick else 1, - api_check_token_trigger={'timestamp': time.time()}, ) raise PreventUpdate @@ -635,8 +560,6 @@ def dict_type_to_dict_data_modal( [ Output('dict_type-export-container', 'data', allow_duplicate=True), Output('dict_type-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('dict_type-export', 'nClicks'), prevent_initial_call=True, @@ -647,24 +570,15 @@ def export_dict_type_list(export_click): """ if export_click: export_dict_type_res = DictTypeApi.export_type({}) - if export_dict_type_res.status_code == 200: - export_dict_type = export_dict_type_res.content - - return [ - dcc.send_bytes( - export_dict_type, - f'字典类型信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + export_dict_type = export_dict_type_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_dict_type, + f'字典类型信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate @@ -687,10 +601,6 @@ def reset_dict_type_export_status(data): @app.callback( - [ - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], Input('dict_type-refresh-cache', 'nClicks'), prevent_initial_call=True, ) @@ -699,16 +609,5 @@ def refresh_dict_cache(refresh_click): 刷新缓存回调 """ if refresh_click: - refresh_info_res = DictTypeApi.refresh_cache() - if refresh_info_res.get('code') == 200: - return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新成功', type='success'), - ] - - return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('刷新失败', type='error'), - ] - - raise PreventUpdate + DictTypeApi.refresh_cache() + MessageManager.success(content='刷新成功') diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index 1c46994..d0f21fa 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -1,14 +1,12 @@ -import dash import time import uuid -from dash import dcc +from dash import ctx, dcc, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.dict.data import DictDataApi from server import app from utils.common import validate_data_not_empty -from api.system.dict.data import DictDataApi +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -24,9 +22,6 @@ from utils.permission_util import PermissionManager dict_data_table_selectedrowkeys=Output( 'dict_data-list-table', 'selectedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('dict_data-search', 'nClicks'), @@ -61,7 +56,7 @@ def get_dict_data_table_data( page_num=1, page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'dict_data-list-table': query_params.update( { @@ -71,45 +66,35 @@ def get_dict_data_table_data( ) if search_click or refresh_click or pagination or operations: table_info = DictDataApi.list_data(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - item['key'] = str(item['dict_code']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dict:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dict:remove') - else {}, - ] - - return dict( - dict_data_table_data=table_data, - dict_data_table_pagination=table_pagination, - dict_data_table_key=str(uuid.uuid4()), - dict_data_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + item['key'] = str(item['dict_code']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dict:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dict:remove') + else {}, + ] return dict( - dict_data_table_data=dash.no_update, - dict_data_table_pagination=dash.no_update, - dict_data_table_key=dash.no_update, - dict_data_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + dict_data_table_data=table_data, + dict_data_table_pagination=table_pagination, + dict_data_table_key=str(uuid.uuid4()), + dict_data_table_selectedrowkeys=None, ) raise PreventUpdate @@ -167,7 +152,7 @@ def change_dict_data_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1: @@ -191,7 +176,7 @@ def change_dict_data_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -220,9 +205,6 @@ def change_dict_data_delete_button_status(table_rows_selected): 'help', allow_duplicate=True, ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('dict_data-edit-id-store', 'data'), modal_type=Output('dict_data-operations-store-bk', 'data'), ), @@ -253,16 +235,16 @@ def add_edit_dict_data_modal( """ 显示新增或编辑字典数据弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if ( trigger_id == {'index': 'add', 'type': 'dict_data-operation-button'} or trigger_id == {'index': 'edit', 'type': 'dict_data-operation-button'} or (trigger_id == 'dict_data-list-table' and clicked_content == '修改') ): # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'dict_data-operation-button'}: dict_data_info = dict( dict_type=dict_type_select, @@ -280,7 +262,6 @@ def add_edit_dict_data_modal( form_value=[dict_data_info.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger=dash.no_update, edit_row_info=None, modal_type={'type': 'add'}, ) @@ -298,26 +279,23 @@ def add_edit_dict_data_modal( else: dict_code = int(recently_button_clicked_row['key']) dict_data_info_res = DictDataApi.get_data(dict_code=dict_code) - if dict_data_info_res['code'] == 200: - dict_data_info = dict_data_info_res['data'] - return dict( - modal_visible=True, - modal_title='编辑字典数据', - form_value=[dict_data_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=dict_data_info if dict_data_info else None, - modal_type={'type': 'edit'}, - ) + dict_data_info = dict_data_info_res['data'] + return dict( + modal_visible=True, + modal_title='编辑字典数据', + form_value=[dict_data_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + edit_row_info=dict_data_info if dict_data_info else None, + modal_type={'type': 'edit'}, + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_label_list), - form_label_validate_info=[dash.no_update] * len(form_label_list), - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=no_update, + modal_title=no_update, + form_value=[no_update] * len(form_value_list), + form_label_validate_status=[no_update] * len(form_label_list), + form_label_validate_info=[no_update] * len(form_label_list), edit_row_info=None, modal_type=None, ) @@ -341,12 +319,6 @@ def add_edit_dict_data_modal( operations=Output( 'dict_data-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('dict_data-modal', 'okCounts')), state=dict( @@ -370,15 +342,13 @@ def dict_data_confirm( """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] - ] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-2] + x['id']['index']: x.get('value') for x in ctx.states_list[-2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[-1] + x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) @@ -391,49 +361,39 @@ def dict_data_confirm( params_edit['dict_code'] = ( edit_row_info.get('dict_code') if edit_row_info else None ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = DictDataApi.add_data(params_add) + DictDataApi.add_data(params_add) + if modal_type == 'edit': + DictDataApi.update_data(params_edit) + if modal_type == 'add': + MessageManager.success('新增成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'add'}, + ) if modal_type == 'edit': - api_res = DictDataApi.update_data(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MessageManager.success('编辑成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -449,12 +409,8 @@ def dict_data_confirm( else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @@ -487,7 +443,7 @@ def dict_data_delete_modal( """ 显示删除字典数据二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == { 'index': 'delete', 'type': 'dict_data-operation-button', @@ -501,7 +457,7 @@ def dict_data_delete_modal( if clicked_content == '删除': dict_codes = recently_button_clicked_row['key'] else: - return dash.no_update + return no_update return [ f'是否确认删除字典编码为{dict_codes}的数据?', @@ -513,11 +469,7 @@ def dict_data_delete_modal( @app.callback( - [ - Output('dict_data-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('dict_data-operations-store', 'data', allow_duplicate=True), Input('dict_data-delete-confirm-modal', 'okCounts'), State('dict_data-delete-ids-store', 'data'), prevent_initial_call=True, @@ -528,19 +480,10 @@ def dict_data_delete_confirm(delete_confirm, dict_codes_data): """ if delete_confirm: params = dict_codes_data - delete_button_info = DictDataApi.del_data(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + DictDataApi.del_data(params) + MessageManager.success('删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -549,8 +492,6 @@ def dict_data_delete_confirm(delete_confirm, dict_codes_data): [ Output('dict_data-export-container', 'data', allow_duplicate=True), Output('dict_data-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('dict_data-export', 'nClicks'), State('dict_data-dict_type-select', 'value'), @@ -564,24 +505,15 @@ def export_dict_data_list(export_click, dict_type): export_dict_data_res = DictDataApi.export_data( dict(dict_type=dict_type) ) - if export_dict_data_res.status_code == 200: - export_dict_data = export_dict_data_res.content - - return [ - dcc.send_bytes( - export_dict_data, - f'字典数据信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + export_dict_data = export_dict_data_res.content + MessageManager.success('导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_dict_data, + f'字典数据信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py index 77022f7..e447934 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py @@ -1,12 +1,10 @@ -import dash -import time +from dash import no_update from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.menu import MenuApi from server import app from utils.common import validate_data_not_empty -from api.system.menu import MenuApi +from utils.feedback_util import MessageManager @app.callback( @@ -35,12 +33,6 @@ from api.system.menu import MenuApi operations=Output( 'menu-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict( confirm_trigger=Input('menu-modal-F-trigger', 'data'), @@ -93,42 +85,32 @@ def menu_confirm_button( order_num=order_num, perms=perms, ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = MenuApi.add_menu(params_add) + MenuApi.add_menu(params_add) if modal_type == 'edit': - api_res = MenuApi.update_menu(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_validate=[None] * 6, - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_validate=[None] * 6, - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MenuApi.update_menu(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_validate=[None] * 6, + modal_visible=False, + operations={'type': 'add'}, + ) + if modal_type == 'edit': + MessageManager.success(content='编辑成功') + + return dict( + form_validate=[None] * 6, + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_validate=[None] * 6, - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -146,12 +128,8 @@ def menu_confirm_button( if validate_data_not_empty(order_num) else '请输入显示排序!', ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py index 10e28ae..cbb03a0 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py @@ -1,12 +1,10 @@ -import dash -import time +from dash import no_update from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.menu import MenuApi from server import app from utils.common import validate_data_not_empty -from api.system.menu import MenuApi +from utils.feedback_util import MessageManager @app.callback( @@ -37,12 +35,6 @@ from api.system.menu import MenuApi operations=Output( 'menu-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('menu-modal-M-trigger', 'data')), state=dict( @@ -105,42 +97,32 @@ def menu_confirm_content( visible=visible, status=status, ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = MenuApi.add_menu(params_add) + MenuApi.add_menu(params_add) if modal_type == 'edit': - api_res = MenuApi.update_menu(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_validate=[None] * 8, - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_validate=[None] * 8, - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MenuApi.update_menu(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_validate=[None] * 8, + modal_visible=False, + operations={'type': 'add'}, + ) + if modal_type == 'edit': + MessageManager.success(content='编辑成功') + + return dict( + form_validate=[None] * 8, + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_validate=[None] * 8, - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -160,12 +142,8 @@ def menu_confirm_content( else '请输入显示排序!', None if validate_data_not_empty(path) else '请输入路由地址!', ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py index e5c51e2..03ebd4c 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py @@ -1,12 +1,10 @@ -import dash -import time +from dash import no_update from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.menu import MenuApi from server import app from utils.common import validate_data_not_empty -from api.system.menu import MenuApi +from utils.feedback_util import MessageManager @app.callback( @@ -41,12 +39,6 @@ from api.system.menu import MenuApi operations=Output( 'menu-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('menu-modal-C-trigger', 'data')), state=dict( @@ -125,42 +117,32 @@ def menu_confirm_menu( visible=visible, status=status, ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = MenuApi.add_menu(params_add) + MenuApi.add_menu(params_add) if modal_type == 'edit': - api_res = MenuApi.update_menu(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_validate=[None] * 8, - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_validate=[None] * 8, - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MenuApi.update_menu(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_validate=[None] * 8, + modal_visible=False, + operations={'type': 'add'}, + ) + if modal_type == 'edit': + MessageManager.success(content='编辑成功') + + return dict( + form_validate=[None] * 8, + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_validate=[None] * 8, - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -180,12 +162,8 @@ def menu_confirm_menu( else '请输入显示排序!', None if validate_data_not_empty(path) else '请输入路由地址!', ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index 84de057..28d2e89 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -1,16 +1,15 @@ -import dash +import feffery_antd_components as fac import time import uuid +from dash import ctx, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate -import feffery_antd_components as fac -import feffery_utils_components as fuc - -from server import app from api.system.menu import MenuApi +from server import app +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree, list_to_tree_select -from views.system.menu.components import content_type, menu_type, button_type +from views.system.menu.components import button_type, content_type, menu_type @app.callback( @@ -20,9 +19,6 @@ from views.system.menu.components import content_type, menu_type, button_type menu_table_defaultexpandedrowkeys=Output( 'menu-list-table', 'defaultExpandedRowKeys' ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), fold_click=Output('menu-fold', 'nClicks'), ), inputs=dict( @@ -57,85 +53,73 @@ def get_menu_table_data( if search_click or refresh_click or operations or fold_click: table_info = MenuApi.list_menu(query_params) default_expanded_row_keys = [] - if table_info['code'] == 200: - table_data = table_info['data'] - for item in table_data: - default_expanded_row_keys.append(str(item['menu_id'])) - item['key'] = str(item['menu_id']) - item['icon'] = [ + table_data = table_info['data'] + for item in table_data: + default_expanded_row_keys.append(str(item['menu_id'])) + item['key'] = str(item['menu_id']) + item['icon'] = [ + { + 'type': 'link', + 'icon': item['icon'], + 'disabled': True, + 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, + }, + ] + if item['status'] == '1': + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, { + 'content': '删除', 'type': 'link', - 'icon': item['icon'], - 'disabled': True, - 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, - }, + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:menu:remove') + else {}, ] - if item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:menu:add') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') - - if fold_click: - if not in_default_expanded_row_keys: - return dict( - menu_table_data=table_data_new, - menu_table_key=str(uuid.uuid4()), - menu_table_defaultexpandedrowkeys=default_expanded_row_keys, - api_check_token_trigger={'timestamp': time.time()}, - fold_click=None, - ) - - return dict( - menu_table_data=table_data_new, - menu_table_key=str(uuid.uuid4()), - menu_table_defaultexpandedrowkeys=[], - api_check_token_trigger={'timestamp': time.time()}, - fold_click=None, - ) + else: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:menu:add') + else {}, + { + 'content': '删除', + 'type': 'link', + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:menu:remove') + else {}, + ] + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') + + if fold_click: + if not in_default_expanded_row_keys: + return dict( + menu_table_data=table_data_new, + menu_table_key=str(uuid.uuid4()), + menu_table_defaultexpandedrowkeys=default_expanded_row_keys, + fold_click=None, + ) return dict( - menu_table_data=dash.no_update, - menu_table_key=dash.no_update, - menu_table_defaultexpandedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + menu_table_data=table_data_new, + menu_table_key=str(uuid.uuid4()), + menu_table_defaultexpandedrowkeys=[], fold_click=None, ) return dict( - menu_table_data=dash.no_update, - menu_table_key=dash.no_update, - menu_table_defaultexpandedrowkeys=dash.no_update, - api_check_token_trigger=dash.no_update, + menu_table_data=no_update, + menu_table_key=no_update, + menu_table_defaultexpandedrowkeys=no_update, fold_click=None, ) @@ -235,9 +219,6 @@ def get_select_icon(icon): Output('menu-order_num-form-item', 'help', allow_duplicate=True), ], other=dict( - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('menu-edit-id-store', 'data'), modal_type=Output('menu-operations-store-bk', 'data'), ), @@ -262,104 +243,97 @@ def add_edit_menu_modal( """ 显示新增或编辑菜单弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == {'index': 'add', 'type': 'menu-operation-button'} or ( trigger_id == 'menu-list-table' and clicked_content != '删除' ): menu_params = dict(menu_name='') tree_info = MenuApi.list_menu(menu_params) - if tree_info['code'] == 200: - tree_data = [dict(title='主类目', value='0', key='0', children=[])] - tree_data[0]['children'] = list_to_tree_select( - tree_info['data'], - 'menu_name', - 'menu_id', - 'menu_id', - 'parent_id', - ) + tree_data = [dict(title='主类目', value='0', key='0', children=[])] + tree_data[0]['children'] = list_to_tree_select( + tree_info['data'], + 'menu_name', + 'menu_id', + 'menu_id', + 'parent_id', + ) - if trigger_id == {'index': 'add', 'type': 'menu-operation-button'}: - return dict( - modal=dict(visible=True, title='新增菜单'), - form_value=dict( - parent_tree=tree_data, - parent_id='0', - menu_type='M', - icon=None, - icon_prefix=None, - icon_category=None, - menu_name=None, - order_num=None, - ), - form_validate=[None] * 6, - other=dict( - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=None, - modal_type={'type': 'add'}, - ), - ) - elif trigger_id == 'menu-list-table' and clicked_content == '新增': + if trigger_id == {'index': 'add', 'type': 'menu-operation-button'}: + return dict( + modal=dict(visible=True, title='新增菜单'), + form_value=dict( + parent_tree=tree_data, + parent_id='0', + menu_type='M', + icon=None, + icon_prefix=None, + icon_category=None, + menu_name=None, + order_num=None, + ), + form_validate=[None] * 6, + other=dict( + edit_row_info=None, + modal_type={'type': 'add'}, + ), + ) + elif trigger_id == 'menu-list-table' and clicked_content == '新增': + return dict( + modal=dict(visible=True, title='新增菜单'), + form_value=dict( + parent_tree=tree_data, + parent_id=str(recently_button_clicked_row['key']), + menu_type='M', + icon=None, + icon_prefix=None, + icon_category=None, + menu_name=None, + order_num=None, + ), + form_validate=[None] * 6, + other=dict( + edit_row_info=None, + modal_type={'type': 'add'}, + ), + ) + elif trigger_id == 'menu-list-table' and clicked_content == '修改': + menu_id = int(recently_button_clicked_row['key']) + menu_info_res = MenuApi.get_menu(menu_id=menu_id) + if menu_info_res['code'] == 200: + menu_info = menu_info_res['data'] return dict( - modal=dict(visible=True, title='新增菜单'), + modal=dict(visible=True, title='编辑菜单'), form_value=dict( parent_tree=tree_data, - parent_id=str(recently_button_clicked_row['key']), - menu_type='M', - icon=None, - icon_prefix=None, - icon_category=None, - menu_name=None, - order_num=None, + parent_id=str(menu_info.get('parent_id')), + menu_type=menu_info.get('menu_type'), + icon=menu_info.get('icon'), + icon_prefix=fac.AntdIcon(icon=menu_info.get('icon')), + icon_category=menu_info.get('icon'), + menu_name=menu_info.get('menu_name'), + order_num=menu_info.get('order_num'), ), form_validate=[None] * 6, other=dict( - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=None, - modal_type={'type': 'add'}, + edit_row_info=menu_info, + modal_type={'type': 'edit'}, ), ) - elif trigger_id == 'menu-list-table' and clicked_content == '修改': - menu_id = int(recently_button_clicked_row['key']) - menu_info_res = MenuApi.get_menu(menu_id=menu_id) - if menu_info_res['code'] == 200: - menu_info = menu_info_res['data'] - return dict( - modal=dict(visible=True, title='编辑菜单'), - form_value=dict( - parent_tree=tree_data, - parent_id=str(menu_info.get('parent_id')), - menu_type=menu_info.get('menu_type'), - icon=menu_info.get('icon'), - icon_prefix=fac.AntdIcon( - icon=menu_info.get('icon') - ), - icon_category=menu_info.get('icon'), - menu_name=menu_info.get('menu_name'), - order_num=menu_info.get('order_num'), - ), - form_validate=[None] * 6, - other=dict( - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=menu_info, - modal_type={'type': 'edit'}, - ), - ) return dict( - modal=dict(visible=dash.no_update, title=dash.no_update), + modal=dict(visible=no_update, title=no_update), form_value=dict( - parent_tree=dash.no_update, - parent_id=dash.no_update, - menu_type=dash.no_update, - icon=dash.no_update, - icon_prefix=dash.no_update, - icon_category=dash.no_update, - menu_name=dash.no_update, - order_num=dash.no_update, + parent_tree=no_update, + parent_id=no_update, + menu_type=no_update, + icon=no_update, + icon_prefix=no_update, + icon_category=no_update, + menu_name=no_update, + order_num=no_update, ), - form_validate=[dash.no_update] * 6, + form_validate=[no_update] * 6, other=dict( - api_check_token_trigger={'timestamp': time.time()}, edit_row_info=None, modal_type=None, ), @@ -408,12 +382,12 @@ def modal_confirm_trigger(confirm, menu_type): """ if confirm: if menu_type.get('type') == 'M': - return [{'timestamp': time.time()}, dash.no_update, dash.no_update] + return [{'timestamp': time.time()}, no_update, no_update] if menu_type.get('type') == 'C': - return [dash.no_update, {'timestamp': time.time()}, dash.no_update] + return [no_update, {'timestamp': time.time()}, no_update] if menu_type.get('type') == 'F': - return [dash.no_update, dash.no_update, {'timestamp': time.time()}] + return [no_update, no_update, {'timestamp': time.time()}] raise PreventUpdate @@ -441,7 +415,7 @@ def menu_delete_modal( if clicked_content == '删除': menu_ids = recently_button_clicked_row['key'] else: - return dash.no_update + raise PreventUpdate return [ f'是否确认删除菜单编号为{menu_ids}的菜单?', @@ -453,11 +427,7 @@ def menu_delete_modal( @app.callback( - [ - Output('menu-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('menu-operations-store', 'data', allow_duplicate=True), Input('menu-delete-confirm-modal', 'okCounts'), State('menu-delete-ids-store', 'data'), prevent_initial_call=True, @@ -468,18 +438,9 @@ def menu_delete_confirm(delete_confirm, menu_ids_data): """ if delete_confirm: params = menu_ids_data - delete_button_info = MenuApi.del_menu(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + MenuApi.del_menu(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 0809a5b..2c7a2af 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -1,16 +1,14 @@ -import dash +import feffery_antd_components as fac import time import uuid -from dash import dcc -from dash.dependencies import Input, Output, State, ALL +from dash import ctx, dcc, no_update +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_antd_components as fac -import feffery_utils_components as fuc - -from server import app -from utils.common import validate_data_not_empty from api.system.menu import MenuApi from api.system.role import RoleApi +from server import app +from utils.common import validate_data_not_empty +from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -22,9 +20,6 @@ from utils.permission_util import PermissionManager ), role_table_key=Output('role-list-table', 'key'), role_table_selectedrowkeys=Output('role-list-table', 'selectedRowKeys'), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), ), inputs=dict( search_click=Input('role-search', 'nClicks'), @@ -68,7 +63,7 @@ def get_role_table_data( page_num=1, page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id == 'role-list-table': query_params.update( { @@ -78,118 +73,106 @@ def get_role_table_data( ) if search_click or refresh_click or pagination or operations: table_info = RoleApi.list_role(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict( - checked=True, disabled=item['role_id'] == 1 - ) - else: - item['status'] = dict( - checked=False, disabled=item['role_id'] == 1 - ) - item['key'] = str(item['role_id']) - if item['role_id'] == 1: - item['operation'] = [] - else: - item['operation'] = fac.AntdSpace( - [ - fac.AntdButton( - '修改', - id={ - 'type': 'role-operation-table', - 'operation': 'edit', - 'index': str(item['role_id']), - }, - type='link', - icon=fac.AntdIcon(icon='antd-edit'), - style={'padding': 0}, - ) - if PermissionManager.check_perms('system:role:edit') - else [], + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict( + checked=True, disabled=item['role_id'] == 1 + ) + else: + item['status'] = dict( + checked=False, disabled=item['role_id'] == 1 + ) + item['key'] = str(item['role_id']) + if item['role_id'] == 1: + item['operation'] = [] + else: + item['operation'] = fac.AntdSpace( + [ + fac.AntdButton( + '修改', + id={ + 'type': 'role-operation-table', + 'operation': 'edit', + 'index': str(item['role_id']), + }, + type='link', + icon=fac.AntdIcon(icon='antd-edit'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:edit') + else [], + fac.AntdButton( + '删除', + id={ + 'type': 'role-operation-table', + 'operation': 'delete', + 'index': str(item['role_id']), + }, + type='link', + icon=fac.AntdIcon(icon='antd-delete'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:remove') + else [], + fac.AntdPopover( fac.AntdButton( - '删除', - id={ - 'type': 'role-operation-table', - 'operation': 'delete', - 'index': str(item['role_id']), - }, + '更多', type='link', - icon=fac.AntdIcon(icon='antd-delete'), + icon=fac.AntdIcon(icon='antd-more'), style={'padding': 0}, - ) - if PermissionManager.check_perms( - 'system:role:remove' - ) - else [], - fac.AntdPopover( - fac.AntdButton( - '更多', - type='link', - icon=fac.AntdIcon(icon='antd-more'), - style={'padding': 0}, - ), - content=fac.AntdSpace( - [ - fac.AntdButton( - '数据权限', - id={ - 'type': 'role-operation-table', - 'operation': 'datascope', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon( - icon='antd-check-circle' - ), - style={'padding': 0}, - ), - fac.AntdButton( - '分配用户', - id={ - 'type': 'role-operation-table', - 'operation': 'allocation', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon(icon='antd-user'), - style={'padding': 0}, + ), + content=fac.AntdSpace( + [ + fac.AntdButton( + '数据权限', + id={ + 'type': 'role-operation-table', + 'operation': 'datascope', + 'index': str(item['role_id']), + }, + type='text', + block=True, + icon=fac.AntdIcon( + icon='antd-check-circle' ), - ], - direction='vertical', - ), - placement='bottomRight', - ) - if PermissionManager.check_perms('system:role:edit') - else [], - ] - ) - - return dict( - role_table_data=table_data, - role_table_pagination=table_pagination, - role_table_key=str(uuid.uuid4()), - role_table_selectedrowkeys=None, - api_check_token_trigger={'timestamp': time.time()}, - ) + style={'padding': 0}, + ), + fac.AntdButton( + '分配用户', + id={ + 'type': 'role-operation-table', + 'operation': 'allocation', + 'index': str(item['role_id']), + }, + type='text', + block=True, + icon=fac.AntdIcon(icon='antd-user'), + style={'padding': 0}, + ), + ], + direction='vertical', + ), + placement='bottomRight', + ) + if PermissionManager.check_perms('system:role:edit') + else [], + ] + ) return dict( - role_table_data=dash.no_update, - role_table_pagination=dash.no_update, - role_table_key=dash.no_update, - role_table_selectedrowkeys=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + role_table_data=table_data, + role_table_pagination=table_pagination, + role_table_key=str(uuid.uuid4()), + role_table_selectedrowkeys=None, ) raise PreventUpdate @@ -249,7 +232,7 @@ def change_role_edit_button_status(table_rows_selected): """ 根据选择的表格数据行数控制编辑按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if len(table_rows_selected) > 1 or '1' in table_rows_selected: @@ -259,7 +242,7 @@ def change_role_edit_button_status(table_rows_selected): return True - return dash.no_update + return no_update @app.callback( @@ -273,7 +256,7 @@ def change_role_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制删除按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: if '1' in table_rows_selected: @@ -283,7 +266,7 @@ def change_role_delete_button_status(table_rows_selected): return True - return dash.no_update + return no_update @app.callback( @@ -307,7 +290,7 @@ def fold_unfold_role_menu(fold_unfold, menu_info): else: return [] - return dash.no_update + return no_update @app.callback( @@ -331,7 +314,7 @@ def all_none_role_menu_mode(all_none, menu_info): else: return [] - return dash.no_update + return no_update @app.callback( @@ -396,9 +379,6 @@ def change_role_menu_mode(parent_children, current_role_menu): ), role_menu=Output('role-menu-store', 'data'), current_role_menu=Output('current-role-menu-store', 'data'), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), edit_row_info=Output('role-edit-id-store', 'data'), modal_type=Output('role-operations-store-bk', 'data'), ), @@ -418,42 +398,40 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): """ 显示新增或编辑角色弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.operation in ['add', 'edit']: # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[2]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in dash.ctx.outputs_list[3]] + form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if ( trigger_id.type == 'role-operation-button' and trigger_id.operation == 'add' ): tree_info = MenuApi.treeselect() - if tree_info.get('code') == 200: - tree_data = tree_info['data'] - role_info = dict( - role_name=None, - role_key=None, - role_sort=None, - status='0', - remark=None, - ) - return dict( - modal_visible=True, - modal_title='新增角色', - form_value=[role_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - menu_perms_tree=tree_data, - menu_perms_expandedkeys=[], - menu_perms_checkedkeys=None, - menu_perms_halfcheckedkeys=None, - role_menu=[], - current_role_menu=None, - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=None, - modal_type={'type': 'add'}, - ) + tree_data = tree_info['data'] + role_info = dict( + role_name=None, + role_key=None, + role_sort=None, + status='0', + remark=None, + ) + return dict( + modal_visible=True, + modal_title='新增角色', + form_value=[role_info.get(k) for k in form_value_list], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + menu_perms_tree=tree_data, + menu_perms_expandedkeys=[], + menu_perms_checkedkeys=None, + menu_perms_halfcheckedkeys=None, + role_menu=[], + current_role_menu=None, + edit_row_info=None, + modal_type={'type': 'add'}, + ) elif trigger_id.operation == 'edit': if trigger_id.type == 'role-operation-button': role_id = int(','.join(selected_row_keys)) @@ -461,56 +439,53 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): role_id = int(trigger_id.index) role_info_res = RoleApi.get_role(role_id=role_id) tree_info = MenuApi.role_menu_treeselect(role_id=role_id) - if role_info_res['code'] == 200 and tree_info.get('code') == 200: - role_info = role_info_res['data'] - tree_data = tree_info['menus'] - checked_menu = [] - checked_menu_all = [] - if role_info.get('menu')[0]: - for item in role_info.get('menu'): - checked_menu_all.append(str(item.get('menu_id'))) - has_children = False - for other_item in role_info.get('menu'): - if other_item['parent_id'] == item['menu_id']: - has_children = True - break - if not has_children: - checked_menu.append(str(item.get('menu_id'))) - half_checked_menu = [ - x for x in checked_menu_all if x not in checked_menu - ] - return dict( - modal_visible=True, - modal_title='编辑角色', - form_value=[ - role_info.get('role').get(k) for k in form_value_list - ], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - menu_perms_tree=tree_data, - menu_perms_expandedkeys=[], - menu_perms_checkedkeys=tree_data['checked_keys'], - menu_perms_halfcheckedkeys=half_checked_menu, - role_menu=[], - current_role_menu=role_info.get('menu'), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=role_info.get('role') if role_info else None, - modal_type={'type': 'edit'}, - ) + role_info = role_info_res['data'] + tree_data = tree_info['menus'] + checked_menu = [] + checked_menu_all = [] + if role_info.get('menu')[0]: + for item in role_info.get('menu'): + checked_menu_all.append(str(item.get('menu_id'))) + has_children = False + for other_item in role_info.get('menu'): + if other_item['parent_id'] == item['menu_id']: + has_children = True + break + if not has_children: + checked_menu.append(str(item.get('menu_id'))) + half_checked_menu = [ + x for x in checked_menu_all if x not in checked_menu + ] + return dict( + modal_visible=True, + modal_title='编辑角色', + form_value=[ + role_info.get('role').get(k) for k in form_value_list + ], + form_label_validate_status=[None] * len(form_label_list), + form_label_validate_info=[None] * len(form_label_list), + menu_perms_tree=tree_data, + menu_perms_expandedkeys=[], + menu_perms_checkedkeys=tree_data['checked_keys'], + menu_perms_halfcheckedkeys=half_checked_menu, + role_menu=[], + current_role_menu=role_info.get('menu'), + edit_row_info=role_info.get('role') if role_info else None, + modal_type={'type': 'edit'}, + ) return dict( - modal_visible=dash.no_update, - modal_title=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - form_label_validate_status=[dash.no_update] * len(form_value_list), - form_label_validate_info=[dash.no_update] * len(form_value_list), - menu_perms_tree=dash.no_update, - menu_perms_expandedkeys=dash.no_update, - menu_perms_checkedkeys=dash.no_update, - menu_perms_halfcheckedkeys=dash.no_update, - role_menu=dash.no_update, - current_role_menu=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, + modal_visible=no_update, + modal_title=no_update, + form_value=[no_update] * len(form_value_list), + form_label_validate_status=[no_update] * len(form_value_list), + form_label_validate_info=[no_update] * len(form_value_list), + menu_perms_tree=no_update, + menu_perms_expandedkeys=no_update, + menu_perms_checkedkeys=no_update, + menu_perms_halfcheckedkeys=no_update, + role_menu=no_update, + current_role_menu=no_update, edit_row_info=None, modal_type=None, ) @@ -534,12 +509,6 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): operations=Output( 'role-operations-store', 'data', allow_duplicate=True ), - api_check_token_trigger=Output( - 'api-check-token', 'data', allow_duplicate=True - ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(confirm_trigger=Input('role-modal', 'okCounts')), state=dict( @@ -576,14 +545,14 @@ def role_confirm( if confirm_trigger: # 获取所有输出表单项对应label的index form_label_output_list = [ - x['id']['index'] for x in dash.ctx.outputs_list[0] + x['id']['index'] for x in ctx.outputs_list[0] ] # 获取所有输入表单项对应的value及label form_value_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[2] + x['id']['index']: x.get('value') for x in ctx.states_list[2] } form_label_state = { - x['id']['index']: x.get('value') for x in dash.ctx.states_list[3] + x['id']['index']: x.get('value') for x in ctx.states_list[3] } if all( validate_data_not_empty(item) @@ -605,49 +574,39 @@ def role_confirm( params_edit['role_id'] = ( edit_row_info.get('role_id') if edit_row_info else None ) - api_res = {} modal_type = modal_type.get('type') if modal_type == 'add': - api_res = RoleApi.add_role(params_add) + RoleApi.add_role(params_add) + if modal_type == 'edit': + RoleApi.update_role(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'add'}, + ) if modal_type == 'edit': - api_res = RoleApi.update_role(params_edit) - if api_res.get('code') == 200: - if modal_type == 'add': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '新增成功', type='success' - ), - ) - if modal_type == 'edit': - return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '编辑成功', type='success' - ), - ) + MessageManager.success(content='编辑成功') + + return dict( + form_label_validate_status=[None] + * len(form_label_output_list), + form_label_validate_info=[None] + * len(form_label_output_list), + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( form_label_validate_status=[None] * len(form_label_output_list), form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) return dict( @@ -663,23 +622,15 @@ def role_confirm( else form_label_state.get(k) for k in form_label_output_list ], - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger=dash.no_update, - global_message_container=fuc.FefferyFancyMessage( - '处理失败', type='error' - ), + modal_visible=no_update, + operations=no_update, ) raise PreventUpdate @app.callback( - [ - Output('role-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('role-operations-store', 'data', allow_duplicate=True), [ Input('role-list-table', 'recentlySwitchDataIndex'), Input('role-list-table', 'recentlySwitchStatus'), @@ -694,22 +645,13 @@ def table_switch_role_status( 表格内切换角色状态回调 """ if recently_switch_data_index: - edit_button_result = RoleApi.change_role_status( - role_id=recently_switch_row['key'], + RoleApi.change_role_status( + role_id=int(recently_switch_row['key']), status='0' if recently_switch_status else '1', ) - if edit_button_result['code'] == 200: - return [ - {'type': 'switch-status'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success'), - ] + MessageManager.success(content='修改成功') - return [ - {'type': 'switch-status'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error'), - ] + return {'type': 'switch-status'} raise PreventUpdate @@ -734,7 +676,7 @@ def role_delete_modal(operation_click, button_click, selected_row_keys): """ 显示删除角色二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.operation == 'delete': if trigger_id.type == 'role-operation-button': role_ids = ','.join(selected_row_keys) @@ -754,11 +696,7 @@ def role_delete_modal(operation_click, button_click, selected_row_keys): @app.callback( - [ - Output('role-operations-store', 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - ], + Output('role-operations-store', 'data', allow_duplicate=True), Input('role-delete-confirm-modal', 'okCounts'), State('role-delete-ids-store', 'data'), prevent_initial_call=True, @@ -769,19 +707,10 @@ def role_delete_confirm(delete_confirm, role_ids_data): """ if delete_confirm: params = role_ids_data - delete_button_info = RoleApi.del_role(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除成功', type='success'), - ] + RoleApi.del_role(params) + MessageManager.success(content='删除成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('删除失败', type='error'), - ] + return {'type': 'delete'} raise PreventUpdate @@ -805,7 +734,7 @@ def role_to_allocated_user_modal(allocated_click, allocated_user_search_nclick): """ 显示角色分配用户弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.operation == 'allocation': return [ True, @@ -822,8 +751,6 @@ def role_to_allocated_user_modal(allocated_click, allocated_user_search_nclick): [ Output('role-export-container', 'data', allow_duplicate=True), Output('role-export-complete-judge-container', 'data'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('role-export', 'nClicks'), prevent_initial_call=True, @@ -834,24 +761,15 @@ def export_role_list(export_click): """ if export_click: export_role_res = RoleApi.export_role({}) - if export_role_res.status_code == 200: - export_role = export_role_res.content - - return [ - dcc.send_bytes( - export_role, - f'角色信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出成功', type='success'), - ] + export_role = export_role_res.content + MessageManager.success(content='导出成功') return [ - dash.no_update, - dash.no_update, + dcc.send_bytes( + export_role, + f'角色信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), {'timestamp': time.time()}, - fuc.FefferyFancyMessage('导出失败', type='error'), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index dd2966f..cd41fa9 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -603,7 +603,7 @@ def table_switch_user_status( """ if recently_switch_data_index: UserApi.change_user_status( - user_id=recently_switch_row['key'], + user_id=int(recently_switch_row['key']), status='0' if recently_switch_status else '1', ) MessageManager.success(content='修改成功') @@ -728,7 +728,7 @@ def user_reset_password_confirm(reset_confirm, user_id_data, reset_password): 重置用户密码弹窗确认回调,实现重置密码操作 """ if reset_confirm: - UserApi.reset_user_pwd(user_id=user_id_data, password=reset_password) + UserApi.reset_user_pwd(user_id=int(user_id_data), password=reset_password) MessageManager.success(content='重置成功') return {'type': 'reset-password'} diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index 1c22764..233fb54 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -46,7 +46,7 @@ def render(*args, **kwargs): item['status'] = dict(tag='正常', color='blue') else: item['status'] = dict(tag='停用', color='volcano') - table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') + table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') return [ dcc.Store(id='menu-button-perms-container', data=button_perms), -- Gitee From 38b25d1562f5bf4115d9294de9ced7e488f1af1a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 17:36:44 +0800 Subject: [PATCH 047/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=90=84?= =?UTF-8?q?=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD=E6=95=B0id?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/config.py | 2 +- dash-fastapi-frontend/api/system/dept.py | 4 ++-- dash-fastapi-frontend/api/system/dict/data.py | 2 +- dash-fastapi-frontend/api/system/dict/type.py | 2 +- dash-fastapi-frontend/api/system/menu.py | 4 ++-- dash-fastapi-frontend/api/system/notice.py | 2 +- dash-fastapi-frontend/api/system/post.py | 2 +- dash-fastapi-frontend/api/system/role.py | 6 +++--- dash-fastapi-frontend/api/system/user.py | 7 ++++--- 9 files changed, 16 insertions(+), 15 deletions(-) diff --git a/dash-fastapi-frontend/api/system/config.py b/dash-fastapi-frontend/api/system/config.py index f6d1d7b..a6dbf53 100644 --- a/dash-fastapi-frontend/api/system/config.py +++ b/dash-fastapi-frontend/api/system/config.py @@ -21,7 +21,7 @@ class ConfigApi: ) @classmethod - def get_config(cls, config_id: str): + def get_config(cls, config_id: int): """ 查询参数配置详情接口 diff --git a/dash-fastapi-frontend/api/system/dept.py b/dash-fastapi-frontend/api/system/dept.py index 910c3b1..9ba19f9 100644 --- a/dash-fastapi-frontend/api/system/dept.py +++ b/dash-fastapi-frontend/api/system/dept.py @@ -21,7 +21,7 @@ class DeptApi: ) @classmethod - def list_dept_exclude_child(cls, dept_id: str): + def list_dept_exclude_child(cls, dept_id: int): """ 查询部门列表(排除节点)接口 @@ -34,7 +34,7 @@ class DeptApi: ) @classmethod - def get_dept(cls, dept_id: str): + def get_dept(cls, dept_id: int): """ 查询部门详情接口 diff --git a/dash-fastapi-frontend/api/system/dict/data.py b/dash-fastapi-frontend/api/system/dict/data.py index acd440d..c3da8aa 100644 --- a/dash-fastapi-frontend/api/system/dict/data.py +++ b/dash-fastapi-frontend/api/system/dict/data.py @@ -21,7 +21,7 @@ class DictDataApi: ) @classmethod - def get_data(cls, dict_code: str): + def get_data(cls, dict_code: int): """ 查询字典数据详情接口 diff --git a/dash-fastapi-frontend/api/system/dict/type.py b/dash-fastapi-frontend/api/system/dict/type.py index 73dd76b..82019ba 100644 --- a/dash-fastapi-frontend/api/system/dict/type.py +++ b/dash-fastapi-frontend/api/system/dict/type.py @@ -21,7 +21,7 @@ class DictTypeApi: ) @classmethod - def get_type(cls, dict_id: str): + def get_type(cls, dict_id: int): """ 查询字典类型详情接口 diff --git a/dash-fastapi-frontend/api/system/menu.py b/dash-fastapi-frontend/api/system/menu.py index 930b2c6..887331b 100644 --- a/dash-fastapi-frontend/api/system/menu.py +++ b/dash-fastapi-frontend/api/system/menu.py @@ -21,7 +21,7 @@ class MenuApi: ) @classmethod - def get_menu(cls, menu_id: str): + def get_menu(cls, menu_id: int): """ 查询菜单详情接口 @@ -46,7 +46,7 @@ class MenuApi: ) @classmethod - def role_menu_treeselect(cls, role_id: str): + def role_menu_treeselect(cls, role_id: int): """ 根据角色id查询菜单下拉树结构接口 diff --git a/dash-fastapi-frontend/api/system/notice.py b/dash-fastapi-frontend/api/system/notice.py index b5203db..5b900a2 100644 --- a/dash-fastapi-frontend/api/system/notice.py +++ b/dash-fastapi-frontend/api/system/notice.py @@ -21,7 +21,7 @@ class NoticeApi: ) @classmethod - def get_notice(cls, notice_id: str): + def get_notice(cls, notice_id: int): """ 查询通知公告详情接口 diff --git a/dash-fastapi-frontend/api/system/post.py b/dash-fastapi-frontend/api/system/post.py index 2b32e95..03ece01 100644 --- a/dash-fastapi-frontend/api/system/post.py +++ b/dash-fastapi-frontend/api/system/post.py @@ -21,7 +21,7 @@ class PostApi: ) @classmethod - def get_post(cls, post_id: str): + def get_post(cls, post_id: int): """ 查询岗位详情接口 diff --git a/dash-fastapi-frontend/api/system/role.py b/dash-fastapi-frontend/api/system/role.py index b873bf7..67a169f 100644 --- a/dash-fastapi-frontend/api/system/role.py +++ b/dash-fastapi-frontend/api/system/role.py @@ -21,7 +21,7 @@ class RoleApi: ) @classmethod - def get_role(cls, role_id: str): + def get_role(cls, role_id: int): """ 查询角色详情接口 @@ -76,7 +76,7 @@ class RoleApi: ) @classmethod - def change_role_status(cls, role_id: str, status: str): + def change_role_status(cls, role_id: int, status: str): """ 角色状态修改接口 @@ -189,7 +189,7 @@ class RoleApi: ) @classmethod - def dept_tree_select(cls, role_id: str): + def dept_tree_select(cls, role_id: int): """ 根据角色id查询部门树结构接口 diff --git a/dash-fastapi-frontend/api/system/user.py b/dash-fastapi-frontend/api/system/user.py index e482c1c..5416313 100644 --- a/dash-fastapi-frontend/api/system/user.py +++ b/dash-fastapi-frontend/api/system/user.py @@ -1,3 +1,4 @@ +from typing import Union from utils.request import api_request @@ -21,7 +22,7 @@ class UserApi: ) @classmethod - def get_user(cls, user_id: str): + def get_user(cls, user_id: Union[int, str]): """ 查询用户详情接口 @@ -119,7 +120,7 @@ class UserApi: ) @classmethod - def reset_user_pwd(cls, user_id: str, password: str): + def reset_user_pwd(cls, user_id: int, password: str): """ 用户密码重置接口 @@ -134,7 +135,7 @@ class UserApi: ) @classmethod - def change_user_status(cls, user_id: str, status: str): + def change_user_status(cls, user_id: int, status: str): """ 用户状态修改接口 -- Gitee From a3fd9eeabc7602882e005dca5b865b3d8ba93124 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 6 Sep 2024 23:25:21 +0800 Subject: [PATCH 048/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F=E8=8F=9C=E5=8D=95=E8=87=AA=E5=8A=A8=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E5=92=8C=E8=87=AA=E5=8A=A8=E6=BB=9A=E5=8A=A8=E5=88=B0?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E8=8F=9C=E5=8D=95=E9=A1=B9=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/layout_c/index_c.py | 38 ++++++++++++-- .../views/layout/components/aside.py | 51 +++++++++---------- 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/layout_c/index_c.py b/dash-fastapi-frontend/callbacks/layout_c/index_c.py index b1e150e..1dbd3ba 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/index_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/index_c.py @@ -1,14 +1,13 @@ import dash +import feffery_antd_components as fac import importlib from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate -import feffery_antd_components as fac from jsonpath_ng import parse - from server import app -import views # noqa: F401 from utils.cache_util import CacheManager from utils.tree_tool import find_href_by_key +import views # noqa: F401 @app.callback( @@ -16,12 +15,14 @@ from utils.tree_tool import find_href_by_key Output('tabs-container', 'items', allow_duplicate=True), Output('tabs-container', 'activeKey', allow_duplicate=True), Output('header-breadcrumb', 'items'), + Output('index-side-menu', 'openKeys'), ], [ Input('index-side-menu', 'currentKey'), Input('tabs-container', 'tabCloseCounts'), ], [ + State('index-side-menu', 'currentKeyPath'), State('index-side-menu', 'currentItem'), State('index-side-menu', 'currentItemPath'), State('tabs-container', 'latestDeletePane'), @@ -33,6 +34,7 @@ from utils.tree_tool import find_href_by_key def handle_tab_switch_and_create( currentKey, tabCloseCounts, + currentKeyPath, currentItem, currentItemPath, latestDeletePane, @@ -71,7 +73,12 @@ def handle_tab_switch_and_create( ] # 判断当前新选中的菜单栏项对应标签页是否已创建 if currentKey in [item['key'] for item in origin_items]: - return [dash.no_update, currentKey, breadcrumb_items] + return [ + dash.no_update, + currentKey, + breadcrumb_items, + currentKeyPath, + ] if currentKey == '个人资料': menu_title = '个人资料' @@ -154,7 +161,7 @@ def handle_tab_switch_and_create( } ) - return [new_items, currentKey, breadcrumb_items] + return [new_items, currentKey, breadcrumb_items, currentKeyPath] elif trigger_id == 'tabs-container': # 如果删除的是当前标签页则回到最后新增的标签页,否则保持当前标签页不变 @@ -220,11 +227,32 @@ def handle_tab_switch_and_create( if activeKey == latestDeletePane else activeKey, dash.no_update, + dash.no_update, ] raise PreventUpdate +# 处理侧边菜单栏自动滚动到当前菜单项位置 +app.clientside_callback( + """ + (pathname) => { + + // 处理侧边菜单项滚动 + setTimeout(() => { + // 查找当前页面中name为pathname的元素 + let scrollTarget = document.getElementsByName(pathname) + if (scrollTarget.length > 0) { + // 滚动到该元素 + scrollTarget[0].scrollIntoView({ behavior: "smooth" }); + } + }, 1000) + } + """, + Input('url-container', 'pathname'), +) + + @app.callback( [ Output('tabs-container', 'items', allow_duplicate=True), diff --git a/dash-fastapi-frontend/views/layout/components/aside.py b/dash-fastapi-frontend/views/layout/components/aside.py index 5be584e..8cb5d25 100644 --- a/dash-fastapi-frontend/views/layout/components/aside.py +++ b/dash-fastapi-frontend/views/layout/components/aside.py @@ -1,11 +1,9 @@ -import feffery_antd_components as fac import dash - -import callbacks.layout_c.aside_c +import feffery_antd_components as fac +from callbacks.layout_c import aside_c # noqa: F401 def render_aside_content(menu_info): - return [ fac.AntdSider( [ @@ -22,8 +20,8 @@ def render_aside_content(menu_info): style={ 'height': '100%', 'display': 'flex', - 'alignItems': 'center' - } + 'alignItems': 'center', + }, ), fac.AntdCol( fac.AntdText( @@ -32,16 +30,16 @@ def render_aside_content(menu_info): style={ 'fontSize': '22px', # 'paddingLeft': '20px', - 'color': 'rgb(255, 255, 255)' - } + 'color': 'rgb(255, 255, 255)', + }, ), flex='5', style={ 'height': '100%', 'display': 'flex', 'alignItems': 'center', - } - ) + }, + ), ], style={ 'height': '50px', @@ -49,36 +47,33 @@ def render_aside_content(menu_info): 'position': 'sticky', 'top': 0, 'zIndex': 999, - 'paddingLeft': '10px' - } + 'paddingLeft': '10px', + }, ), fac.AntdMenu( id='index-side-menu', menuItems=[ - { - 'component': 'Item', - 'props': { - 'key': '首页', - 'title': '首页', - 'icon': 'antd-dashboard', - 'href': '/' - } - } - ] + menu_info, + { + 'component': 'Item', + 'props': { + 'key': '首页', + 'title': '首页', + 'icon': 'antd-dashboard', + 'href': '/', + }, + } + ] + + menu_info, mode='inline', theme='dark', defaultSelectedKey='首页', - defaultOpenKeys=['-1_1'], - style={ - 'width': '100%', - 'height': 'calc(100vh - 50px)' - } + style={'width': '100%', 'height': 'calc(100vh - 50px)'}, ), ], id='menu-collapse-sider-custom', collapsible=True, collapsedWidth=60, trigger=None, - width=210 + width=210, ), ] -- Gitee From 96ced7b388021f584ece5f9a10746b4e2f582f75 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 7 Sep 2024 17:13:16 +0800 Subject: [PATCH 049/229] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1a2dcce..a2a1869 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,11 @@ APScheduler==3.10.4 asyncmy==0.2.9 -dash==2.17.1 +cachebox==4.1.2 +dash==2.18.0 DateTime==5.5 fastapi[all]==0.112.2 feffery-antd-charts==0.1.0rc5 -feffery-antd-components==0.3.2 +feffery-antd-components==0.3.4 feffery-markdown-components==0.2.10 feffery-utils-components==0.2.0rc24 Flask-Compress==1.15 -- Gitee From a648735e572ab178598a9eb4c5a6fdc39276d3d6 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 7 Sep 2024 17:13:50 +0800 Subject: [PATCH 050/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E8=B5=84=E6=96=99=E6=A8=A1=E5=9D=97api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/user.py | 6 +- dash-fastapi-frontend/app.py | 1 - dash-fastapi-frontend/assets/imgs/profile.jpg | Bin 0 -> 8997 bytes .../system_c/user_c/profile_c/avatar_c.py | 79 +++++----- .../system_c/user_c/profile_c/reset_pwd_c.py | 81 ++++------ .../system_c/user_c/profile_c/user_info_c.py | 80 ++++------ .../views/dashboard/components/page_top.py | 116 +++++++------- .../views/layout/components/head.py | 143 +++++++---------- .../views/system/user/profile/__init__.py | 144 ++++++++++-------- .../views/system/user/profile/reset_pwd.py | 46 ++---- .../views/system/user/profile/user_avatar.py | 115 +++++++------- .../views/system/user/profile/user_info.py | 3 +- 12 files changed, 366 insertions(+), 448 deletions(-) create mode 100644 dash-fastapi-frontend/assets/imgs/profile.jpg diff --git a/dash-fastapi-frontend/api/system/user.py b/dash-fastapi-frontend/api/system/user.py index 5416313..dfebe75 100644 --- a/dash-fastapi-frontend/api/system/user.py +++ b/dash-fastapi-frontend/api/system/user.py @@ -191,17 +191,17 @@ class UserApi: ) @classmethod - def upload_avatar(cls, data: dict): + def upload_avatar(cls, files: dict): """ 用户头像上传接口 - :param data: 用户头像参数 + :param files: 用户头像参数 :return: """ return api_request( url='/system/user/profile/avatar', method='post', - data=data, + files=files, ) @classmethod diff --git a/dash-fastapi-frontend/app.py b/dash-fastapi-frontend/app.py index f2cf72c..8a1034a 100644 --- a/dash-fastapi-frontend/app.py +++ b/dash-fastapi-frontend/app.py @@ -99,7 +99,6 @@ def router(pathname, url_trigger, session_token): menu_info = RouterUtil.generate_menu_tree(router_list) # search_panel_data = get_search_panel_data(user_menu_list) search_panel_data = [] - session['user_info'] = current_user['user'] permissions = { 'perms': current_user['permissions'], 'roles': current_user['roles'], diff --git a/dash-fastapi-frontend/assets/imgs/profile.jpg b/dash-fastapi-frontend/assets/imgs/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94efdf359a5d11bb316b157b671cf851b578d1e0 GIT binary patch literal 8997 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 literal 0 HcmV?d00001 diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py index 45c886b..7cfd450 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py @@ -1,20 +1,21 @@ -import dash -import feffery_utils_components as fuc -import time +import base64 import uuid from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate +from io import BytesIO +from api.system.user import UserApi from server import app - -from api.user import change_user_avatar_api +from utils.feedback_util import MessageManager @app.callback( - [Output('avatar-cropper-modal', 'visible', allow_duplicate=True), - Output('avatar-cropper', 'src', allow_duplicate=True)], + [ + Output('avatar-cropper-modal', 'visible', allow_duplicate=True), + Output('avatar-cropper', 'src', allow_duplicate=True), + ], Input('avatar-edit-click', 'n_clicks'), State('user-avatar-image-info', 'src'), - prevent_initial_call=True + prevent_initial_call=True, ) def avatar_cropper_modal_visible(n_clicks, user_avatar_image_info): """ @@ -28,16 +29,15 @@ def avatar_cropper_modal_visible(n_clicks, user_avatar_image_info): @app.callback( Output('avatar-cropper', 'src', allow_duplicate=True), - Input('avatar-upload-choose', 'listUploadTaskRecord'), - prevent_initial_call=True + Input('avatar-upload-choose', 'contents'), + prevent_initial_call=True, ) -def upload_user_avatar(list_upload_task_record): +def upload_user_avatar(contents): """ 上传用户头像获取后端url回调 """ - if list_upload_task_record: - - return list_upload_task_record[-1].get('url') + if contents: + return contents raise PreventUpdate @@ -64,25 +64,26 @@ app.clientside_callback( } } """, - [Output('avatar-cropper', 'zoom'), - Output('avatar-cropper', 'rotate')], - [Input('zoom-out', 'nClicks'), - Input('zoom-in', 'nClicks'), - Input('rotate-left', 'nClicks'), - Input('rotate-right', 'nClicks')], - prevent_initial_call=True + [Output('avatar-cropper', 'zoom'), Output('avatar-cropper', 'rotate')], + [ + Input('zoom-out', 'nClicks'), + Input('zoom-in', 'nClicks'), + Input('rotate-left', 'nClicks'), + Input('rotate-right', 'nClicks'), + ], + prevent_initial_call=True, ) @app.callback( - [Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True), - Output('avatar-cropper-modal', 'visible', allow_duplicate=True), - Output('user-avatar-image-info', 'key'), - Output('avatar-info', 'key')], + [ + Output('avatar-cropper-modal', 'visible', allow_duplicate=True), + Output('user-avatar-image-info', 'key'), + Output('avatar-info', 'key'), + ], Input('change-avatar-submit', 'nClicks'), State('avatar-cropper', 'croppedImageData'), - prevent_initial_call=True + prevent_initial_call=True, ) def change_user_avatar_callback(submit_click, avatar_data): """ @@ -90,24 +91,16 @@ def change_user_avatar_callback(submit_click, avatar_data): """ if submit_click: - params = dict(type='avatar', avatar=avatar_data) - change_avatar_result = change_user_avatar_api(params) - if change_avatar_result.get('code') == 200: - - return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success'), - False, - str(uuid.uuid4()), - str(uuid.uuid4()) - ] + params = dict( + avatarfile=BytesIO(base64.b64decode(avatar_data.split(',', 1)[1])) + ) + UserApi.upload_avatar(params) + MessageManager.success(content='修改成功') return [ - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error'), - dash.no_update, - dash.no_update, - dash.no_update + False, + str(uuid.uuid4()), + str(uuid.uuid4()), ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py index 7fe7237..ea21fb9 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py @@ -1,62 +1,42 @@ -import dash -import feffery_utils_components as fuc -import time from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate +from api.system.user import UserApi from server import app - -from api.user import reset_user_password_api +from utils.feedback_util import MessageManager @app.callback( - [Output('reset-old-password-form-item', 'validateStatus'), - Output('reset-new-password-form-item', 'validateStatus'), - Output('reset-confirm-password-form-item', 'validateStatus'), - Output('reset-old-password-form-item', 'help'), - Output('reset-new-password-form-item', 'help'), - Output('reset-confirm-password-form-item', 'help'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('reset-old-password-form-item', 'validateStatus'), + Output('reset-new-password-form-item', 'validateStatus'), + Output('reset-confirm-password-form-item', 'validateStatus'), + Output('reset-old-password-form-item', 'help'), + Output('reset-new-password-form-item', 'help'), + Output('reset-confirm-password-form-item', 'help'), + ], Input('reset-password-submit', 'nClicks'), - [State('reset-old-password', 'value'), - State('reset-new-password', 'value'), - State('reset-confirm-password', 'value')], - prevent_initial_call=True + [ + State('reset-old-password', 'value'), + State('reset-new-password', 'value'), + State('reset-confirm-password', 'value'), + ], + prevent_initial_call=True, ) -def reset_submit_user_info(reset_click, old_password, new_password, confirm_password): +def reset_submit_user_info( + reset_click, old_password, new_password, confirm_password +): """ 重置当前用户密码回调 """ if reset_click: if all([old_password, new_password, confirm_password]): - if new_password == confirm_password: + UserApi.update_user_pwd( + old_password=old_password, new_password=new_password + ) + MessageManager.success(content='修改成功') - params = dict(type='avatar', old_password=old_password, password=new_password) - reset_password_result = reset_user_password_api(params) - if reset_password_result.get('code') == 200: - - return [ - None, - None, - None, - None, - None, - None, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success'), - ] - - return [ - None, - None, - None, - None, - None, - None, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error'), - ] + return [None] * 6 return [ None, @@ -65,8 +45,6 @@ def reset_submit_user_info(reset_click, old_password, new_password, confirm_pass None, None if new_password else '前后两次密码不一致!', None if confirm_password else '前后两次密码不一致!', - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error'), ] return [ @@ -76,25 +54,24 @@ def reset_submit_user_info(reset_click, old_password, new_password, confirm_pass None if old_password else '请输入旧密码!', None if new_password else '请输入新密码!', None if confirm_password else '请输入确认密码!', - dash.no_update, - fuc.FefferyFancyMessage('修改失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('tabs-container', 'latestDeletePane', allow_duplicate=True), - Output('tabs-container', 'tabCloseCounts', allow_duplicate=True)], + [ + Output('tabs-container', 'latestDeletePane', allow_duplicate=True), + Output('tabs-container', 'tabCloseCounts', allow_duplicate=True), + ], Input('reset-password-close', 'nClicks'), State('tabs-container', 'tabCloseCounts'), - prevent_initial_call=True + prevent_initial_call=True, ) def close_personal_info_modal(close_click, tab_close_counts): """ 关闭当前个人资料标签页回调 """ if close_click: - return ['个人资料', tab_close_counts + 1 if tab_close_counts else 1] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py index 087434d..1b93406 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py @@ -1,28 +1,27 @@ -import dash -import feffery_utils_components as fuc -import time from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate +from api.system.user import UserApi from server import app - -from api.user import change_user_info_api +from utils.feedback_util import MessageManager @app.callback( - [Output('reset-user-nick_name-form-item', 'validateStatus'), - Output('reset-user-phonenumber-form-item', 'validateStatus'), - Output('reset-user-email-form-item', 'validateStatus'), - Output('reset-user-nick_name-form-item', 'help'), - Output('reset-user-phonenumber-form-item', 'help'), - Output('reset-user-email-form-item', 'help'), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('reset-user-nick_name-form-item', 'validateStatus'), + Output('reset-user-phonenumber-form-item', 'validateStatus'), + Output('reset-user-email-form-item', 'validateStatus'), + Output('reset-user-nick_name-form-item', 'help'), + Output('reset-user-phonenumber-form-item', 'help'), + Output('reset-user-email-form-item', 'help'), + ], Input('reset-submit', 'nClicks'), - [State('reset-user-nick_name', 'value'), - State('reset-user-phonenumber', 'value'), - State('reset-user-email', 'value'), - State('reset-user-sex', 'value')], - prevent_initial_call=True + [ + State('reset-user-nick_name', 'value'), + State('reset-user-phonenumber', 'value'), + State('reset-user-email', 'value'), + State('reset-user-sex', 'value'), + ], + prevent_initial_call=True, ) def reset_submit_user_info(reset_click, nick_name, phonenumber, email, sex): """ @@ -30,32 +29,16 @@ def reset_submit_user_info(reset_click, nick_name, phonenumber, email, sex): """ if reset_click: if all([nick_name, phonenumber, email]): + params = dict( + nick_name=nick_name, + phonenumber=phonenumber, + email=email, + sex=sex, + ) + UserApi.update_user_profile(params) + MessageManager.success(content='修改成功') - params = dict(type='avatar', nick_name=nick_name, phonenumber=phonenumber, email=email, sex=sex) - change_user_info_result = change_user_info_api(params) - if change_user_info_result.get('code') == 200: - - return [ - None, - None, - None, - None, - None, - None, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改成功', type='success'), - ] - - return [ - None, - None, - None, - None, - None, - None, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('修改失败', type='error'), - ] + return [None] * 6 return [ None if nick_name else 'error', @@ -64,25 +47,24 @@ def reset_submit_user_info(reset_click, nick_name, phonenumber, email, sex): None if nick_name else '请输入用户昵称!', None if phonenumber else '请输入手机号码!', None if email else '请输入邮箱!', - dash.no_update, - fuc.FefferyFancyMessage('修改失败', type='error'), ] raise PreventUpdate @app.callback( - [Output('tabs-container', 'latestDeletePane', allow_duplicate=True), - Output('tabs-container', 'tabCloseCounts', allow_duplicate=True)], + [ + Output('tabs-container', 'latestDeletePane', allow_duplicate=True), + Output('tabs-container', 'tabCloseCounts', allow_duplicate=True), + ], Input('reset-close', 'nClicks'), State('tabs-container', 'tabCloseCounts'), - prevent_initial_call=True + prevent_initial_call=True, ) def close_personal_info_modal(close_click, tab_close_counts): """ 关闭当前个人资料标签页回调 """ if close_click: - return ['个人资料', tab_close_counts + 1 if tab_close_counts else 1] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/dashboard/components/page_top.py b/dash-fastapi-frontend/views/dashboard/components/page_top.py index e407348..ed4f587 100644 --- a/dash-fastapi-frontend/views/dashboard/components/page_top.py +++ b/dash-fastapi-frontend/views/dashboard/components/page_top.py @@ -1,63 +1,59 @@ -from dash import html import feffery_antd_components as fac import feffery_utils_components as fuc - -from flask import session +from dash import html from config.global_config import ApiBaseUrlConfig +from utils.cache_util import CacheManager def render_page_top(): - return html.Div( - [ - html.Div( - fac.AntdAvatar( - id='dashboard-avatar-info', - mode='image', - src=f"{ApiBaseUrlConfig.BaseUrl}{session.get('user_info').get('avatar')}&token={session.get('Authorization')}", - size='large' - ), - className='avatar', - ), - html.Div( - [ - html.Div( - fac.AntdText(f"早安,{session.get('user_info').get('nick_name')},祝你开心每一天!"), - className='content-title', - ), - html.Div('交互专家 |蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED') - ], - className='content', + [ + html.Div( + fac.AntdAvatar( + id='dashboard-avatar-info', + mode='image', + src=f"{ApiBaseUrlConfig.BaseUrl}{CacheManager.get('user_info').get('avatar')}" + if CacheManager.get('user_info').get('avatar') + else '/assets/imgs/profile.jpg', + size='large', ), - html.Div( - [ - html.Div( - fac.AntdStatistic( - title='项目数', - value=56 - ), - className='stat-item' + className='avatar', + ), + html.Div( + [ + html.Div( + fac.AntdText( + f"早安,{CacheManager.get('user_info').get('nick_name')},祝你开心每一天!" ), - html.Div( - fac.AntdStatistic( - title='团队内排名', - value=8, - suffix='/ 24' - ), - className='stat-item' - ), - html.Div( - fac.AntdStatistic( - title='项目访问', - value=2223 - ), - className='stat-item' + className='content-title', + ), + html.Div( + '交互专家 |蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED' + ), + ], + className='content', + ), + html.Div( + [ + html.Div( + fac.AntdStatistic(title='项目数', value=56), + className='stat-item', + ), + html.Div( + fac.AntdStatistic( + title='团队内排名', value=8, suffix='/ 24' ), - ], - className='extra-content' - ), - fuc.FefferyStyle( - rawStyle=''' + className='stat-item', + ), + html.Div( + fac.AntdStatistic(title='项目访问', value=2223), + className='stat-item', + ), + ], + className='extra-content', + ), + fuc.FefferyStyle( + rawStyle=""" .page-header-content { display: flex; } @@ -137,13 +133,13 @@ def render_page_top(): .extra-content .stat-item:last-child::after { display: none; } - ''' - ) - ], - className='page-header-content', - style={ - 'padding': '12px', - 'marginBottom': '24px', - 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px' - } - ) + """ + ), + ], + className='page-header-content', + style={ + 'padding': '12px', + 'marginBottom': '24px', + 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px', + }, + ) diff --git a/dash-fastapi-frontend/views/layout/components/head.py b/dash-fastapi-frontend/views/layout/components/head.py index 5f1e7fd..943c341 100644 --- a/dash-fastapi-frontend/views/layout/components/head.py +++ b/dash-fastapi-frontend/views/layout/components/head.py @@ -1,8 +1,8 @@ -from dash import html import feffery_antd_components as fac -from flask import session +from dash import html +from callbacks.layout_c import head_c # noqa: F401 from config.global_config import ApiBaseUrlConfig -import callbacks.layout_c.head_c +from utils.cache_util import CacheManager def render_head_content(): @@ -12,81 +12,53 @@ def render_head_content(): html.Div( fac.AntdButton( fac.AntdIcon( - id='fold-side-menu-icon', - icon='antd-menu-fold' + id='fold-side-menu-icon', icon='antd-menu-fold' ), id='fold-side-menu', type='text', shape='circle', size='large', - style={ - 'marginLeft': '5px', - 'background': 'white' - } + style={'marginLeft': '5px', 'background': 'white'}, ), style={ 'height': '100%', 'display': 'flex', - 'alignItems': 'center' - } + 'alignItems': 'center', + }, ), - flex='1' + flex='1', ), - # 页首面包屑区域 fac.AntdCol( fac.AntdBreadcrumb( items=[ - { - 'title': '首页', - 'icon': 'antd-dashboard', - 'href': '/#' - } + {'title': '首页', 'icon': 'antd-dashboard', 'href': '/#'} ], - id='header-breadcrumb' + id='header-breadcrumb', ), - style={ - 'height': '100%', - 'display': 'flex', - 'alignItems': 'center' - }, - flex='21' + style={'height': '100%', 'display': 'flex', 'alignItems': 'center'}, + flex='21', ), - # 页首中部搜索区域 fac.AntdCol( fac.AntdParagraph( [ fac.AntdText( - 'Ctrl', - keyboard=True, - style={ - 'color': '#8c8c8c' - } + 'Ctrl', keyboard=True, style={'color': '#8c8c8c'} ), fac.AntdText( - 'K', - keyboard=True, - style={ - 'color': '#8c8c8c' - } + 'K', keyboard=True, style={'color': '#8c8c8c'} ), - fac.AntdText( - '唤出搜索面板', - style={ - 'color': '#8c8c8c' - } - ) + fac.AntdText('唤出搜索面板', style={'color': '#8c8c8c'}), ], style={ 'height': '100%', 'display': 'flex', - 'alignItems': 'center' - } + 'alignItems': 'center', + }, ), - flex='6' + flex='6', ), - # 页首开源项目地址 fac.AntdCol( html.A( @@ -94,16 +66,11 @@ def render_head_content(): src='https://gitee.com/insistence2022/dash-fastapi-admin/badge/star.svg?theme=dark' ), href='https://gitee.com/insistence2022/dash-fastapi-admin', - target='_blank' + target='_blank', ), - style={ - 'height': '100%', - 'display': 'flex', - 'alignItems': 'center' - }, - flex='3' + style={'height': '100%', 'display': 'flex', 'alignItems': 'center'}, + flex='3', ), - # 页首右侧用户信息区域 fac.AntdCol( fac.AntdSpace( @@ -113,11 +80,13 @@ def render_head_content(): fac.AntdAvatar( id='avatar-info', mode='image', - src=f"{ApiBaseUrlConfig.BaseUrl}{session.get('user_info').get('avatar')}&token={session.get('Authorization')}", - size=36 + src=f"{ApiBaseUrlConfig.BaseUrl}{CacheManager.get('user_info').get('avatar')}" + if CacheManager.get('user_info').get('avatar') + else '/assets/imgs/profile.jpg', + size=36, ), count=6, - size='small' + size='small', ), content=fac.AntdTabs( items=[ @@ -135,18 +104,18 @@ def render_head_content(): 'padding': '5px 10px', 'height': 40, 'width': 300, - 'borderBottom': '1px solid #f1f3f5' - } + 'borderBottom': '1px solid #f1f3f5', + }, ) for i in range(1, 8) ], direction='vertical', style={ 'height': 280, - 'overflowY': 'auto' - } + 'overflowY': 'auto', + }, ) - ] + ], }, { 'key': '已读消息', @@ -162,63 +131,58 @@ def render_head_content(): 'padding': '5px 10px', 'height': 40, 'width': 300, - 'borderBottom': '1px solid #f1f3f5' - } + 'borderBottom': '1px solid #f1f3f5', + }, ) for i in range(8, 15) ], direction='vertical', style={ 'height': 280, - 'overflowY': 'auto' - } + 'overflowY': 'auto', + }, ) - ] + ], }, ], - centered=True + centered=True, ), - placement='bottomRight' + placement='bottomRight', ), - fac.AntdDropdown( id='index-header-dropdown', - title=session.get('user_info').get('user_name'), + title=CacheManager.get('user_info').get('user_name'), arrow=True, menuItems=[ { 'title': '个人资料', 'key': '个人资料', - 'icon': 'antd-idcard' + 'icon': 'antd-idcard', }, { 'title': '布局设置', 'key': '布局设置', - 'icon': 'antd-layout' - }, - { - 'isDivider': True + 'icon': 'antd-layout', }, + {'isDivider': True}, { 'title': '退出登录', 'key': '退出登录', - 'icon': 'antd-logout' + 'icon': 'antd-logout', }, ], placement='bottomRight', - overlayStyle={ - 'width': '100px' - } - ) + overlayStyle={'width': '100px'}, + ), ], style={ 'height': '100%', 'float': 'right', 'display': 'flex', - 'alignItems': 'center' - } + 'alignItems': 'center', + }, ), - flex='3' + flex='3', ), fac.AntdCol( # 全局刷新按钮 @@ -226,8 +190,7 @@ def render_head_content(): fac.AntdTooltip( fac.AntdButton( fac.AntdIcon( - id='index-reload-icon', - icon='fc-synchronize' + id='index-reload-icon', icon='fc-synchronize' ), id='index-reload', type='text', @@ -235,18 +198,18 @@ def render_head_content(): size='large', style={ 'backgroundColor': 'rgb(255 255 255 / 0%)', - } + }, ), title='刷新', - placement='bottom' + placement='bottom', ) ), style={ 'height': '100%', 'paddingRight': '3px', 'display': 'flex', - 'alignItems': 'center' + 'alignItems': 'center', }, - flex='1' + flex='1', ), ] diff --git a/dash-fastapi-frontend/views/system/user/profile/__init__.py b/dash-fastapi-frontend/views/system/user/profile/__init__.py index 4d73f63..cce91f9 100644 --- a/dash-fastapi-frontend/views/system/user/profile/__init__.py +++ b/dash-fastapi-frontend/views/system/user/profile/__init__.py @@ -1,11 +1,12 @@ -from dash import html -import feffery_utils_components as fuc import feffery_antd_components as fac -from flask import session -from . import user_avatar, user_info, reset_pwd +import feffery_utils_components as fuc +from dash import html +from api.system.user import UserApi +from . import reset_pwd, user_avatar, user_info def render(*args, **kwargs): + user_profile = UserApi.get_user_profile() return [ fac.AntdRow( @@ -16,96 +17,123 @@ def render(*args, **kwargs): html.Div( [ html.Div( - user_avatar.render(), + user_avatar.render( + user_profile.get('data').get( + 'avatar' + ) + ), style={ 'textAlign': 'center', - 'marginBottom': '10px' - } + 'marginBottom': '10px', + }, ), html.Ul( [ html.Li( [ - fac.AntdIcon(icon='antd-user'), + fac.AntdIcon( + icon='antd-user' + ), fac.AntdText('用户名称'), html.Div( - session.get('user_info').get('user_name'), + user_profile.get( + 'data' + ).get('user_name'), id='profile_c-username', - className='pull-right' - ) + className='pull-right', + ), ], - className='list-group-item' + className='list-group-item', ), html.Li( [ - fac.AntdIcon(icon='antd-mobile'), + fac.AntdIcon( + icon='antd-mobile' + ), fac.AntdText('手机号码'), html.Div( - session.get('user_info').get('phonenumber'), + user_profile.get( + 'data' + ).get('phonenumber'), id='profile_c-phonenumber', - className='pull-right' - ) + className='pull-right', + ), ], - className='list-group-item' + className='list-group-item', ), html.Li( [ - fac.AntdIcon(icon='antd-mail'), + fac.AntdIcon( + icon='antd-mail' + ), fac.AntdText('用户邮箱'), html.Div( - session.get('user_info').get('email'), + user_profile.get( + 'data' + ).get('email'), id='profile_c-email', - className='pull-right' - ) + className='pull-right', + ), ], - className='list-group-item' + className='list-group-item', ), html.Li( [ - fac.AntdIcon(icon='antd-cluster'), + fac.AntdIcon( + icon='antd-cluster' + ), fac.AntdText('所属部门'), html.Div( - session.get('dept_info').get('dept_name') if session.get( - 'dept_info') else "" + "/" + ','.join( - [item.get('post_name') for item in - session.get('post_info')]), + user_profile.get('data') + .get('dept') + .get('dept_name') + + ' / ' + + user_profile.get( + 'post_group' + ), id='profile_c-dept', - className='pull-right' - ) + className='pull-right', + ), ], - className='list-group-item' + className='list-group-item', ), html.Li( [ - fac.AntdIcon(icon='antd-team'), + fac.AntdIcon( + icon='antd-team' + ), fac.AntdText('所属角色'), html.Div( - ','.join([item.get('role_name') for item in - session.get('role_info')]), + user_profile.get( + 'role_group' + ), id='profile_c-role', - className='pull-right' - ) + className='pull-right', + ), ], - className='list-group-item' + className='list-group-item', ), html.Li( [ - fac.AntdIcon(icon='antd-schedule'), + fac.AntdIcon( + icon='antd-schedule' + ), fac.AntdText('创建日期'), html.Div( - session.get('user_info').get('create_time'), + user_profile.get( + 'data' + ).get('create_time'), id='profile_c-create_time', - className='pull-right' - ) + className='pull-right', + ), ], - className='list-group-item' + className='list-group-item', ), ], - className='list-group list-group-striped' + className='list-group list-group-striped', ), fuc.FefferyStyle( - rawStyle= - ''' + rawStyle=""" .list-group-striped > .list-group-item { border-left: 0; border-right: 0; @@ -130,21 +158,19 @@ def render(*args, **kwargs): .pull-right { float: right !important; } - ''' - ) + """ + ), ], - style={ - 'width': '100%' - } + style={'width': '100%'}, ), ], title='个人信息', size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=10 + span=10, ), fac.AntdCol( fac.AntdCard( @@ -154,17 +180,15 @@ def render(*args, **kwargs): { 'key': '基本资料', 'label': '基本资料', - 'children': user_info.render() + 'children': user_info.render(), }, { 'key': '修改密码', 'label': '修改密码', - 'children': reset_pwd.render() - } + 'children': reset_pwd.render(), + }, ], - style={ - 'width': '100%' - } + style={'width': '100%'}, ) ], 'size="small"', @@ -172,11 +196,11 @@ def render(*args, **kwargs): size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=14 + span=14, ), ], - gutter=10 + gutter=10, ), ] diff --git a/dash-fastapi-frontend/views/system/user/profile/reset_pwd.py b/dash-fastapi-frontend/views/system/user/profile/reset_pwd.py index b7b15b2..44ddfc9 100644 --- a/dash-fastapi-frontend/views/system/user/profile/reset_pwd.py +++ b/dash-fastapi-frontend/views/system/user/profile/reset_pwd.py @@ -1,66 +1,48 @@ import feffery_antd_components as fac - -import callbacks.system_c.user_c.profile_c.reset_pwd_c +from callbacks.system_c.user_c.profile_c import reset_pwd_c # noqa: F401 def render(): return fac.AntdForm( [ fac.AntdFormItem( - fac.AntdInput( - id='reset-old-password', - mode='password' - ), + fac.AntdInput(id='reset-old-password', mode='password'), id='reset-old-password-form-item', label='旧密码', - required=True + required=True, ), fac.AntdFormItem( - fac.AntdInput( - id='reset-new-password', - mode='password' - ), + fac.AntdInput(id='reset-new-password', mode='password'), id='reset-new-password-form-item', label='新密码', - required=True + required=True, ), fac.AntdFormItem( - fac.AntdInput( - id='reset-confirm-password', - mode='password' - ), + fac.AntdInput(id='reset-confirm-password', mode='password'), id='reset-confirm-password-form-item', label='确认密码', - required=True + required=True, ), fac.AntdFormItem( fac.AntdSpace( [ fac.AntdButton( - '保存', - id='reset-password-submit', - type='primary' + '保存', id='reset-password-submit', type='primary' ), fac.AntdButton( '关闭', id='reset-password-close', type='primary', - danger=True + danger=True, ), ], ), - wrapperCol={ - 'offset': 4 - } - ) + wrapperCol={'offset': 4}, + ), ], - labelCol={ - 'span': 4 - }, - wrapperCol={ - 'span': 20 - }, + labelCol={'span': 4}, + wrapperCol={'span': 20}, style={ 'margin': '0 auto' # 以快捷实现居中布局效果 - } + }, ) diff --git a/dash-fastapi-frontend/views/system/user/profile/user_avatar.py b/dash-fastapi-frontend/views/system/user/profile/user_avatar.py index 2c0a513..58089af 100644 --- a/dash-fastapi-frontend/views/system/user/profile/user_avatar.py +++ b/dash-fastapi-frontend/views/system/user/profile/user_avatar.py @@ -1,32 +1,30 @@ -from dash import html, dcc -import feffery_utils_components as fuc import feffery_antd_components as fac -from flask import session - +import feffery_utils_components as fuc +from dash import html, dcc +from callbacks.system_c.user_c.profile_c import avatar_c # noqa: F401 from config.global_config import ApiBaseUrlConfig -import callbacks.system_c.user_c.profile_c.avatar_c -def render(): +def render(avatar_path): return [ html.Div( [ fac.AntdImage( id='user-avatar-image-info', - src=f"{ApiBaseUrlConfig.BaseUrl}{session.get('user_info').get('avatar')}&token={session.get('Authorization')}", + src=f'{ApiBaseUrlConfig.BaseUrl}{avatar_path}' + if avatar_path + else '/assets/imgs/profile.jpg', preview=False, height='120px', width='120px', - style={ - 'borderRadius': '50%' - } + style={'borderRadius': '50%'}, ) ], id='avatar-edit-click', - className='user-info-head' + className='user-info-head', ), fuc.FefferyStyle( - rawStyle=''' + rawStyle=""" .user-info-head { position: relative; display: inline-block; @@ -50,7 +48,7 @@ def render(): line-height: 110px; border-radius: 50%; } - ''' + """ ), fac.AntdModal( [ @@ -60,7 +58,6 @@ def render(): [ html.Div( [ - fuc.FefferyImageCropper( id='avatar-cropper', alt='avatar', @@ -72,24 +69,21 @@ def render(): preview='#user-avatar-image-preview', style={ 'width': '100%', - 'height': '100%' - } + 'height': '100%', + }, ) ], id='avatar-cropper-container', - style={ - 'height': '350px', - 'width': '100%' - } + style={'height': '350px', 'width': '100%'}, ), ], - span=12 + span=12, ), fac.AntdCol( [ html.Div( id='user-avatar-image-preview', - className='avatar-upload-preview' + className='avatar-upload-preview', ), fuc.FefferyStyle( rawStyle=""" @@ -102,81 +96,90 @@ def render(): overflow: hidden; } """ - ) + ), ], - span=12 - ) + span=12, + ), ] ), html.Br(), fac.AntdRow( [ fac.AntdCol( - fac.AntdUpload( + dcc.Upload( + fac.AntdButton( + '选择', + icon=fac.AntdIcon(icon='antd-cloud-upload'), + ), id='avatar-upload-choose', - apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', - apiUrlExtraParams={'taskPath': 'avatarUpload'}, - downloadUrl=f"{ApiBaseUrlConfig.BaseUrl}/common/caches", - downloadUrlExtraParams={'taskPath': 'avatarUpload', 'token': session.get('Authorization')}, - headers={'Authorization': 'Bearer ' + session.get('Authorization')}, - fileMaxSize=10, - showUploadList=False, - fileTypes=['jpeg', 'jpg', 'png'], - buttonContent='选择' + accept='.jpeg,.jpg,.png', + max_size=10 * 1024 * 1024, ), - span=4 + # fac.AntdUpload( + # id='avatar-upload-choose', + # apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', + # apiUrlExtraParams={'taskPath': 'avatarUpload'}, + # downloadUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/caches', + # downloadUrlExtraParams={ + # 'taskPath': 'avatarUpload', + # 'token': session.get('Authorization'), + # }, + # headers={ + # 'Authorization': 'Bearer ' + # + session.get('Authorization') + # }, + # fileMaxSize=10, + # showUploadList=False, + # fileTypes=['jpeg', 'jpg', 'png'], + # buttonContent='选择', + # ), + span=4, ), fac.AntdCol( fac.AntdButton( id='zoom-out', - icon=fac.AntdIcon( - icon='antd-plus' - ) + icon=fac.AntdIcon(icon='antd-plus'), ), - span=2 + span=2, ), fac.AntdCol( fac.AntdButton( id='zoom-in', - icon=fac.AntdIcon( - icon='antd-minus' - ) + icon=fac.AntdIcon(icon='antd-minus'), ), - span=2 + span=2, ), fac.AntdCol( fac.AntdButton( icon=fac.AntdIcon( - id='rotate-left', - icon='antd-undo' + id='rotate-left', icon='antd-undo' ) ), - span=2 + span=2, ), fac.AntdCol( fac.AntdButton( icon=fac.AntdIcon( - id='rotate-right', - icon='antd-redo' + id='rotate-right', icon='antd-redo' ) ), - span=7 + span=7, ), fac.AntdCol( fac.AntdButton( '提交', id='change-avatar-submit', - type='primary' + type='primary', ), - span=7 + span=7, ), ], - gutter=10 - ) + gutter=10, + ), ], id='avatar-cropper-modal', title='修改头像', width=850, - mask=False - ) + mask=False, + ), ] diff --git a/dash-fastapi-frontend/views/system/user/profile/user_info.py b/dash-fastapi-frontend/views/system/user/profile/user_info.py index 75ca5ab..25dcb61 100644 --- a/dash-fastapi-frontend/views/system/user/profile/user_info.py +++ b/dash-fastapi-frontend/views/system/user/profile/user_info.py @@ -1,6 +1,5 @@ import feffery_antd_components as fac - -import callbacks.system_c.user_c.profile_c.user_info_c +from callbacks.system_c.user_c.profile_c import user_info_c # noqa: F401 def render(): -- Gitee From 487046a3c17cd9483d3beec3838cd42962719a8c Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:49:08 +0800 Subject: [PATCH 051/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/utils/common_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-backend/utils/common_util.py b/dash-fastapi-backend/utils/common_util.py index d37cd53..ba21db2 100644 --- a/dash-fastapi-backend/utils/common_util.py +++ b/dash-fastapi-backend/utils/common_util.py @@ -52,7 +52,7 @@ class SqlalchemyUtil: :param obj: sqlalchemy模型对象 :return: 字典结果 """ - base_dict = obj.__dict__ + base_dict = obj.__dict__.copy() base_dict.pop('_sa_instance_state', None) return base_dict -- Gitee From 7d20caa58a80578a93202f9d4ecf05bfb3c89848 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:49:56 +0800 Subject: [PATCH 052/229] =?UTF-8?q?chore:=20=E7=A7=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8api=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/cache.py | 36 ------------- dash-fastapi-frontend/api/config.py | 41 -------------- dash-fastapi-frontend/api/dept.py | 36 ------------- dash-fastapi-frontend/api/dict.py | 76 -------------------------- dash-fastapi-frontend/api/job.py | 61 --------------------- dash-fastapi-frontend/api/log.py | 51 ------------------ dash-fastapi-frontend/api/menu.py | 36 ------------- dash-fastapi-frontend/api/notice.py | 26 --------- dash-fastapi-frontend/api/online.py | 16 ------ dash-fastapi-frontend/api/post.py | 36 ------------- dash-fastapi-frontend/api/role.py | 61 --------------------- dash-fastapi-frontend/api/server.py | 6 --- dash-fastapi-frontend/api/user.py | 83 ----------------------------- 13 files changed, 565 deletions(-) delete mode 100644 dash-fastapi-frontend/api/cache.py delete mode 100644 dash-fastapi-frontend/api/config.py delete mode 100644 dash-fastapi-frontend/api/dept.py delete mode 100644 dash-fastapi-frontend/api/dict.py delete mode 100644 dash-fastapi-frontend/api/job.py delete mode 100644 dash-fastapi-frontend/api/log.py delete mode 100644 dash-fastapi-frontend/api/menu.py delete mode 100644 dash-fastapi-frontend/api/notice.py delete mode 100644 dash-fastapi-frontend/api/online.py delete mode 100644 dash-fastapi-frontend/api/post.py delete mode 100644 dash-fastapi-frontend/api/role.py delete mode 100644 dash-fastapi-frontend/api/server.py delete mode 100644 dash-fastapi-frontend/api/user.py diff --git a/dash-fastapi-frontend/api/cache.py b/dash-fastapi-frontend/api/cache.py deleted file mode 100644 index a29a58a..0000000 --- a/dash-fastapi-frontend/api/cache.py +++ /dev/null @@ -1,36 +0,0 @@ -from utils.request import api_request - - -def get_cache_statistical_info_api(): - - return api_request(method='post', url='/monitor/cache/statisticalInfo', is_headers=True) - - -def get_cache_name_list_api(): - - return api_request(method='post', url='/monitor/cache/getNames', is_headers=True) - - -def get_cache_key_list_api(cache_name: str): - - return api_request(method='post', url=f'/monitor/cache/getKeys/{cache_name}', is_headers=True) - - -def get_cache_value_api(cache_name: str, cache_key: str): - - return api_request(method='post', url=f'/monitor/cache/getValue/{cache_name}/{cache_key}', is_headers=True) - - -def clear_cache_name_api(cache_name: str): - - return api_request(method='post', url=f'/monitor/cache/clearCacheName/{cache_name}', is_headers=True) - - -def clear_cache_key_api(cache_name: str, cache_key: str): - - return api_request(method='post', url=f'/monitor/cache/clearCacheKey/{cache_name}/{cache_key}', is_headers=True) - - -def clear_all_cache_api(): - - return api_request(method='post', url='/monitor/cache/clearCacheAll', is_headers=True) diff --git a/dash-fastapi-frontend/api/config.py b/dash-fastapi-frontend/api/config.py deleted file mode 100644 index d2ab45b..0000000 --- a/dash-fastapi-frontend/api/config.py +++ /dev/null @@ -1,41 +0,0 @@ -from utils.request import api_request - - -def get_config_list_api(page_obj: dict): - - return api_request(method='post', url='/system/config/get', is_headers=True, json=page_obj) - - -def query_config_list_api(config_key: str): - - return api_request(method='get', url=f'/common/config/query/{config_key}', headers={'is_token': False}) - - -def add_config_api(page_obj: dict): - - return api_request(method='post', url='/system/config/add', is_headers=True, json=page_obj) - - -def edit_config_api(page_obj: dict): - - return api_request(method='patch', url='/system/config/edit', is_headers=True, json=page_obj) - - -def delete_config_api(page_obj: dict): - - return api_request(method='post', url='/system/config/delete', is_headers=True, json=page_obj) - - -def get_config_detail_api(config_id: int): - - return api_request(method='get', url=f'/system/config/{config_id}', is_headers=True) - - -def export_config_list_api(page_obj: dict): - - return api_request(method='post', url='/system/config/export', is_headers=True, json=page_obj, stream=True) - - -def refresh_config_api(page_obj: dict): - - return api_request(method='post', url='/system/config/refresh', is_headers=True, json=page_obj) diff --git a/dash-fastapi-frontend/api/dept.py b/dash-fastapi-frontend/api/dept.py deleted file mode 100644 index 00a3bcd..0000000 --- a/dash-fastapi-frontend/api/dept.py +++ /dev/null @@ -1,36 +0,0 @@ -from utils.request import api_request - - -def get_dept_tree_api(page_obj: dict): - - return api_request(method='post', url='/system/dept/tree', is_headers=True, json=page_obj) - - -def get_dept_tree_for_edit_option_api(page_obj: dict): - - return api_request(method='post', url='/system/dept/forEditOption', is_headers=True, json=page_obj) - - -def get_dept_list_api(page_obj: dict): - - return api_request(method='post', url='/system/dept/get', is_headers=True, json=page_obj) - - -def add_dept_api(page_obj: dict): - - return api_request(method='post', url='/system/dept/add', is_headers=True, json=page_obj) - - -def edit_dept_api(page_obj: dict): - - return api_request(method='patch', url='/system/dept/edit', is_headers=True, json=page_obj) - - -def delete_dept_api(page_obj: dict): - - return api_request(method='post', url='/system/dept/delete', is_headers=True, json=page_obj) - - -def get_dept_detail_api(dept_id: int): - - return api_request(method='get', url=f'/system/dept/{dept_id}', is_headers=True) diff --git a/dash-fastapi-frontend/api/dict.py b/dash-fastapi-frontend/api/dict.py deleted file mode 100644 index 92eca5f..0000000 --- a/dash-fastapi-frontend/api/dict.py +++ /dev/null @@ -1,76 +0,0 @@ -from utils.request import api_request - - -def get_dict_type_list_api(page_obj: dict): - - return api_request(method='post', url='/system/dictType/get', is_headers=True, json=page_obj) - - -def get_all_dict_type_api(page_obj: dict): - - return api_request(method='post', url='/system/dictType/all', is_headers=True, json=page_obj) - - -def add_dict_type_api(page_obj: dict): - - return api_request(method='post', url='/system/dictType/add', is_headers=True, json=page_obj) - - -def edit_dict_type_api(page_obj: dict): - - return api_request(method='patch', url='/system/dictType/edit', is_headers=True, json=page_obj) - - -def delete_dict_type_api(page_obj: dict): - - return api_request(method='post', url='/system/dictType/delete', is_headers=True, json=page_obj) - - -def get_dict_type_detail_api(dict_id: int): - - return api_request(method='get', url=f'/system/dictType/{dict_id}', is_headers=True) - - -def export_dict_type_list_api(page_obj: dict): - - return api_request(method='post', url='/system/dictType/export', is_headers=True, json=page_obj, stream=True) - - -def refresh_dict_api(page_obj: dict): - - return api_request(method='post', url='/system/dictType/refresh', is_headers=True, json=page_obj) - - -def get_dict_data_list_api(page_obj: dict): - - return api_request(method='post', url='/system/dictData/get', is_headers=True, json=page_obj) - - -def query_dict_data_list_api(dict_type: str): - - return api_request(method='get', url=f'/system/dictData/query/{dict_type}', is_headers=True) - - -def add_dict_data_api(page_obj: dict): - - return api_request(method='post', url='/system/dictData/add', is_headers=True, json=page_obj) - - -def edit_dict_data_api(page_obj: dict): - - return api_request(method='patch', url='/system/dictData/edit', is_headers=True, json=page_obj) - - -def delete_dict_data_api(page_obj: dict): - - return api_request(method='post', url='/system/dictData/delete', is_headers=True, json=page_obj) - - -def get_dict_data_detail_api(dict_code: int): - - return api_request(method='get', url=f'/system/dictData/{dict_code}', is_headers=True) - - -def export_dict_data_list_api(page_obj: dict): - - return api_request(method='post', url='/system/dictData/export', is_headers=True, json=page_obj, stream=True) diff --git a/dash-fastapi-frontend/api/job.py b/dash-fastapi-frontend/api/job.py deleted file mode 100644 index 5c125c9..0000000 --- a/dash-fastapi-frontend/api/job.py +++ /dev/null @@ -1,61 +0,0 @@ -from utils.request import api_request - - -def get_job_list_api(page_obj: dict): - - return api_request(method='post', url='/monitor/job/get', is_headers=True, json=page_obj) - - -def add_job_api(page_obj: dict): - - return api_request(method='post', url='/monitor/job/add', is_headers=True, json=page_obj) - - -def edit_job_api(page_obj: dict): - - return api_request(method='patch', url='/monitor/job/edit', is_headers=True, json=page_obj) - - -def execute_job_api(page_obj: dict): - - return api_request(method='post', url='/monitor/job/changeStatus', is_headers=True, json=page_obj) - - -def delete_job_api(page_obj: dict): - - return api_request(method='post', url='/monitor/job/delete', is_headers=True, json=page_obj) - - -def get_job_detail_api(job_id: int): - - return api_request(method='get', url=f'/monitor/job/{job_id}', is_headers=True) - - -def export_job_list_api(page_obj: dict): - - return api_request(method='post', url='/monitor/job/export', is_headers=True, json=page_obj, stream=True) - - -def get_job_log_list_api(page_obj: dict): - - return api_request(method='post', url='/monitor/jobLog/get', is_headers=True, json=page_obj) - - -def delete_job_log_api(page_obj: dict): - - return api_request(method='post', url='/monitor/jobLog/delete', is_headers=True, json=page_obj) - - -def clear_job_log_api(page_obj: dict): - - return api_request(method='post', url='/monitor/jobLog/clear', is_headers=True, json=page_obj) - - -def get_job_log_detail_api(job_log_id: int): - - return api_request(method='get', url=f'/monitor/jobLog/{job_log_id}', is_headers=True) - - -def export_job_log_list_api(page_obj: dict): - - return api_request(method='post', url='/monitor/jobLog/export', is_headers=True, json=page_obj, stream=True) diff --git a/dash-fastapi-frontend/api/log.py b/dash-fastapi-frontend/api/log.py deleted file mode 100644 index a58704e..0000000 --- a/dash-fastapi-frontend/api/log.py +++ /dev/null @@ -1,51 +0,0 @@ -from utils.request import api_request - - -def get_operation_log_list_api(page_obj: dict): - - return api_request(method='post', url='/system/log/operation/get', is_headers=True, json=page_obj) - - -def delete_operation_log_api(page_obj: dict): - - return api_request(method='post', url='/system/log/operation/delete', is_headers=True, json=page_obj) - - -def clear_operation_log_api(page_obj: dict): - - return api_request(method='post', url='/system/log/operation/clear', is_headers=True, json=page_obj) - - -def export_operation_log_list_api(page_obj: dict): - - return api_request(method='post', url='/system/log/operation/export', is_headers=True, json=page_obj, stream=True) - - -def get_operation_log_detail_api(oper_id: int): - - return api_request(method='get', url=f'/system/log/operation/{oper_id}', is_headers=True) - - -def get_login_log_list_api(page_obj: dict): - - return api_request(method='post', url='/system/log/login/get', is_headers=True, json=page_obj) - - -def delete_login_log_api(page_obj: dict): - - return api_request(method='post', url='/system/log/login/delete', is_headers=True, json=page_obj) - - -def clear_login_log_api(page_obj: dict): - - return api_request(method='post', url='/system/log/login/clear', is_headers=True, json=page_obj) - - -def unlock_user_api(page_obj: dict): - - return api_request(method='post', url='/system/log/login/unlock', is_headers=True, json=page_obj) - - -def export_login_log_list_api(page_obj: dict): - - return api_request(method='post', url='/system/log/login/export', is_headers=True, json=page_obj, stream=True) diff --git a/dash-fastapi-frontend/api/menu.py b/dash-fastapi-frontend/api/menu.py deleted file mode 100644 index 3581e57..0000000 --- a/dash-fastapi-frontend/api/menu.py +++ /dev/null @@ -1,36 +0,0 @@ -from utils.request import api_request - - -def get_menu_tree_api(page_obj: dict): - - return api_request(method='post', url='/system/menu/tree', is_headers=True, json=page_obj) - - -def get_menu_tree_for_edit_option_api(page_obj: dict): - - return api_request(method='post', url='/system/menu/forEditOption', is_headers=True, json=page_obj) - - -def get_menu_list_api(page_obj: dict): - - return api_request(method='post', url='/system/menu/get', is_headers=True, json=page_obj) - - -def add_menu_api(page_obj: dict): - - return api_request(method='post', url='/system/menu/add', is_headers=True, json=page_obj) - - -def edit_menu_api(page_obj: dict): - - return api_request(method='patch', url='/system/menu/edit', is_headers=True, json=page_obj) - - -def delete_menu_api(page_obj: dict): - - return api_request(method='post', url='/system/menu/delete', is_headers=True, json=page_obj) - - -def get_menu_detail_api(menu_id: int): - - return api_request(method='get', url=f'/system/menu/{menu_id}', is_headers=True) diff --git a/dash-fastapi-frontend/api/notice.py b/dash-fastapi-frontend/api/notice.py deleted file mode 100644 index af972ed..0000000 --- a/dash-fastapi-frontend/api/notice.py +++ /dev/null @@ -1,26 +0,0 @@ -from utils.request import api_request - - -def get_notice_list_api(page_obj: dict): - - return api_request(method='post', url='/system/notice/get', is_headers=True, json=page_obj) - - -def add_notice_api(page_obj: dict): - - return api_request(method='post', url='/system/notice/add', is_headers=True, json=page_obj) - - -def edit_notice_api(page_obj: dict): - - return api_request(method='patch', url='/system/notice/edit', is_headers=True, json=page_obj) - - -def delete_notice_api(page_obj: dict): - - return api_request(method='post', url='/system/notice/delete', is_headers=True, json=page_obj) - - -def get_notice_detail_api(notice_id: int): - - return api_request(method='get', url=f'/system/notice/{notice_id}', is_headers=True) diff --git a/dash-fastapi-frontend/api/online.py b/dash-fastapi-frontend/api/online.py deleted file mode 100644 index 0504b36..0000000 --- a/dash-fastapi-frontend/api/online.py +++ /dev/null @@ -1,16 +0,0 @@ -from utils.request import api_request - - -def get_online_list_api(page_obj: dict): - - return api_request(method='post', url='/monitor/online/get', is_headers=True, json=page_obj) - - -def force_logout_online_api(page_obj: dict): - - return api_request(method='post', url='/monitor/online/forceLogout', is_headers=True, json=page_obj) - - -def batch_logout_online_api(page_obj: dict): - - return api_request(method='post', url='/monitor/online/batchLogout', is_headers=True, json=page_obj) diff --git a/dash-fastapi-frontend/api/post.py b/dash-fastapi-frontend/api/post.py deleted file mode 100644 index 8c05851..0000000 --- a/dash-fastapi-frontend/api/post.py +++ /dev/null @@ -1,36 +0,0 @@ -from utils.request import api_request - - -def get_post_select_option_api(): - - return api_request(method='post', url='/system/post/forSelectOption', is_headers=True) - - -def get_post_list_api(page_obj: dict): - - return api_request(method='post', url='/system/post/get', is_headers=True, json=page_obj) - - -def add_post_api(page_obj: dict): - - return api_request(method='post', url='/system/post/add', is_headers=True, json=page_obj) - - -def edit_post_api(page_obj: dict): - - return api_request(method='patch', url='/system/post/edit', is_headers=True, json=page_obj) - - -def delete_post_api(page_obj: dict): - - return api_request(method='post', url='/system/post/delete', is_headers=True, json=page_obj) - - -def get_post_detail_api(post_id: int): - - return api_request(method='get', url=f'/system/post/{post_id}', is_headers=True) - - -def export_post_list_api(page_obj: dict): - - return api_request(method='post', url='/system/post/export', is_headers=True, json=page_obj, stream=True) diff --git a/dash-fastapi-frontend/api/role.py b/dash-fastapi-frontend/api/role.py deleted file mode 100644 index 2ddbeba..0000000 --- a/dash-fastapi-frontend/api/role.py +++ /dev/null @@ -1,61 +0,0 @@ -from utils.request import api_request - - -def get_role_select_option_api(): - - return api_request(method='post', url='/system/role/forSelectOption', is_headers=True) - - -def get_role_list_api(page_obj: dict): - - return api_request(method='post', url='/system/role/get', is_headers=True, json=page_obj) - - -def add_role_api(page_obj: dict): - - return api_request(method='post', url='/system/role/add', is_headers=True, json=page_obj) - - -def edit_role_api(page_obj: dict): - - return api_request(method='patch', url='/system/role/edit', is_headers=True, json=page_obj) - - -def role_datascope_api(page_obj: dict): - - return api_request(method='patch', url='/system/role/dataScope', is_headers=True, json=page_obj) - - -def delete_role_api(page_obj: dict): - - return api_request(method='post', url='/system/role/delete', is_headers=True, json=page_obj) - - -def get_role_detail_api(role_id: int): - - return api_request(method='get', url=f'/system/role/{role_id}', is_headers=True) - - -def export_role_list_api(page_obj: dict): - - return api_request(method='post', url='/system/role/export', is_headers=True, json=page_obj, stream=True) - - -def get_allocated_user_list_api(page_obj: dict): - - return api_request(method='post', url='/system/role/authUser/allocatedList', is_headers=True, json=page_obj) - - -def get_unallocated_user_list_api(page_obj: dict): - - return api_request(method='post', url='/system/role/authUser/unallocatedList', is_headers=True, json=page_obj) - - -def auth_user_select_all_api(page_obj: dict): - - return api_request(method='post', url='/system/role/authUser/selectAll', is_headers=True, json=page_obj) - - -def auth_user_cancel_api(page_obj: dict): - - return api_request(method='post', url='/system/role/authUser/cancel', is_headers=True, json=page_obj) diff --git a/dash-fastapi-frontend/api/server.py b/dash-fastapi-frontend/api/server.py deleted file mode 100644 index 9e8e3eb..0000000 --- a/dash-fastapi-frontend/api/server.py +++ /dev/null @@ -1,6 +0,0 @@ -from utils.request import api_request - - -def get_server_statistical_info_api(): - - return api_request(method='post', url='/monitor/server/statisticalInfo', is_headers=True) diff --git a/dash-fastapi-frontend/api/user.py b/dash-fastapi-frontend/api/user.py deleted file mode 100644 index c426534..0000000 --- a/dash-fastapi-frontend/api/user.py +++ /dev/null @@ -1,83 +0,0 @@ -from utils.request import api_request - - -def forget_user_pwd_api(page_obj: dict): - - return api_request(method='post', url='/login/forgetPwd', is_headers=False, json=page_obj) - - -def get_user_list_api(page_obj: dict): - - return api_request(method='post', url='/system/user/get', is_headers=True, json=page_obj) - - -def add_user_api(page_obj: dict): - - return api_request(method='post', url='/system/user/add', is_headers=True, json=page_obj) - - -def edit_user_api(page_obj: dict): - - return api_request(method='patch', url='/system/user/edit', is_headers=True, json=page_obj) - - -def delete_user_api(page_obj: dict): - - return api_request(method='post', url='/system/user/delete', is_headers=True, json=page_obj) - - -def get_user_detail_api(user_id: int): - - return api_request(method='get', url=f'/system/user/{user_id}', is_headers=True) - - -def change_user_avatar_api(page_obj: dict): - - return api_request(method='patch', url='/system/user/profile/changeAvatar', is_headers=True, json=page_obj) - - -def change_user_info_api(page_obj: dict): - - return api_request(method='patch', url='/system/user/profile/changeInfo', is_headers=True, json=page_obj) - - -def reset_user_password_api(page_obj: dict): - - return api_request(method='patch', url='/system/user/profile/resetPwd', is_headers=True, json=page_obj) - - -def batch_import_user_api(page_obj: dict): - - return api_request(method='post', url='/system/user/importData', is_headers=True, json=page_obj) - - -def download_user_import_template_api(): - - return api_request(method='post', url='/system/user/importTemplate', is_headers=True, stream=True) - - -def export_user_list_api(page_obj: dict): - - return api_request(method='post', url='/system/user/export', is_headers=True, json=page_obj, stream=True) - - -def get_allocated_role_list_api(page_obj: dict): - - return api_request(method='post', url='/system/user/authRole/allocatedList', is_headers=True, json=page_obj) - - -def get_unallocated_role_list_api(page_obj: dict): - - return api_request(method='post', url='/system/user/authRole/unallocatedList', is_headers=True, json=page_obj) - - -def auth_role_select_all_api(page_obj: dict): - - return api_request(method='post', url='/system/user/authRole/selectAll', is_headers=True, json=page_obj) - - -def auth_role_cancel_api(page_obj: dict): - - return api_request(method='post', url='/system/user/authRole/cancel', is_headers=True, json=page_obj) - - -- Gitee From 3656b73565f7ac0301b1bf135a95dd36161f4803 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:50:48 +0800 Subject: [PATCH 053/229] =?UTF-8?q?chore:=20=E7=A7=BB=E9=99=A4=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E9=94=99=E8=AF=AF=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/app_c.py | 32 ++-- dash-fastapi-frontend/callbacks/forget_c.py | 161 ++++++++++++------- dash-fastapi-frontend/views/login.py | 166 ++++++++++---------- 3 files changed, 202 insertions(+), 157 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/app_c.py b/dash-fastapi-frontend/callbacks/app_c.py index 2b3194b..9eb14ce 100644 --- a/dash-fastapi-frontend/callbacks/app_c.py +++ b/dash-fastapi-frontend/callbacks/app_c.py @@ -4,28 +4,22 @@ import feffery_utils_components as fuc from dash.dependencies import Input, Output, State from flask import session from server import app -from api.config import query_config_list_api # api拦截器——退出登录二次确认 @app.callback( - [Output('redirect-container', 'children', allow_duplicate=True), - Output('token-container', 'data', allow_duplicate=True)], + [ + Output('redirect-container', 'children', allow_duplicate=True), + Output('token-container', 'data', allow_duplicate=True), + ], Input('token-invalid-modal', 'okCounts'), - prevent_initial_call=True + prevent_initial_call=True, ) def redirect_page(okCounts): - if okCounts: session.clear() - return [ - dcc.Location( - pathname='/login', - id='index-redirect' - ), - None - ] + return [dcc.Location(pathname='/login', id='index-redirect'), None] return [dash.no_update] * 2 @@ -34,7 +28,7 @@ def redirect_page(okCounts): @app.callback( Output('system-app-primary-color-container', 'data'), Input('app-mount', 'id'), - State('custom-app-primary-color-container', 'data') + State('custom-app-primary-color-container', 'data'), ) def get_primary_color(_, custom_color): # if not custom_color: @@ -48,16 +42,18 @@ def get_primary_color(_, custom_color): app.clientside_callback( - ''' + """ (system_color, custom_color) => { if (custom_color) { return custom_color; } return system_color; } - ''', + """, Output('app-config-provider', 'primaryColor'), - [Input('system-app-primary-color-container', 'data'), - Input('custom-app-primary-color-container', 'data')], - prevent_initial_call=True + [ + Input('system-app-primary-color-container', 'data'), + Input('custom-app-primary-color-container', 'data'), + ], + prevent_initial_call=True, ) diff --git a/dash-fastapi-frontend/callbacks/forget_c.py b/dash-fastapi-frontend/callbacks/forget_c.py index 9c3ac5f..c1b0e39 100644 --- a/dash-fastapi-frontend/callbacks/forget_c.py +++ b/dash-fastapi-frontend/callbacks/forget_c.py @@ -6,47 +6,66 @@ from dash.exceptions import PreventUpdate from server import app from utils.common import validate_data_not_empty -from api.user import forget_user_pwd_api from api.message import send_message_api @app.callback( output=dict( - username_form_status=Output('forget-username-form-item', 'validateStatus'), - password_form_status=Output('forget-password-form-item', 'validateStatus'), - password_again_form_status=Output('forget-password-again-form-item', 'validateStatus'), - captcha_form_status=Output('forget-captcha-form-item', 'validateStatus'), + username_form_status=Output( + 'forget-username-form-item', 'validateStatus' + ), + password_form_status=Output( + 'forget-password-form-item', 'validateStatus' + ), + password_again_form_status=Output( + 'forget-password-again-form-item', 'validateStatus' + ), + captcha_form_status=Output( + 'forget-captcha-form-item', 'validateStatus' + ), username_form_help=Output('forget-username-form-item', 'help'), password_form_help=Output('forget-password-form-item', 'help'), - password_again_form_help=Output('forget-password-again-form-item', 'help'), + password_again_form_help=Output( + 'forget-password-again-form-item', 'help' + ), captcha_form_help=Output('forget-captcha-form-item', 'help'), submit_loading=Output('forget-submit', 'loading'), - redirect_container=Output('redirect-container', 'children', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - nClicks=Input('forget-submit', 'nClicks') + redirect_container=Output( + 'redirect-container', 'children', allow_duplicate=True + ), + global_message_container=Output( + 'global-message-container', 'children', allow_duplicate=True + ), ), + inputs=dict(nClicks=Input('forget-submit', 'nClicks')), state=dict( username=State('forget-username', 'value'), password=State('forget-password', 'value'), password_again=State('forget-password-again', 'value'), input_captcha=State('forget-input-captcha', 'value'), - session_id=State('sms_code-session_id-container', 'data') + session_id=State('sms_code-session_id-container', 'data'), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def forget_auth(nClicks, username, password, password_again, input_captcha, session_id): +def forget_auth( + nClicks, username, password, password_again, input_captcha, session_id +): if nClicks: - # 校验全部输入值是否不为空 - if all(validate_data_not_empty(item) for item in [username, password, password_again, input_captcha]): - + # 校验全部输入值是否不为空 + if all( + validate_data_not_empty(item) + for item in [username, password, password_again, input_captcha] + ): if password == password_again: try: - forget_params = dict(user_name=username, password=password, sms_code=input_captcha, session_id=session_id) + forget_params = dict( + user_name=username, + password=password, + sms_code=input_captcha, + session_id=session_id, + ) change_result = forget_user_pwd_api(forget_params) if change_result.get('code') == 200: - return dict( username_form_status=None, password_form_status=None, @@ -57,12 +76,15 @@ def forget_auth(nClicks, username, password, password_again, input_captcha, sess password_again_form_help=None, captcha_form_help=None, submit_loading=False, - redirect_container=dcc.Location(pathname='/login', id='forget-redirect'), - global_message_container=fuc.FefferyFancyMessage(change_result.get('message'), type='success') + redirect_container=dcc.Location( + pathname='/login', id='forget-redirect' + ), + global_message_container=fuc.FefferyFancyMessage( + change_result.get('message'), type='success' + ), ) else: - return dict( username_form_status=None, password_form_status=None, @@ -74,10 +96,11 @@ def forget_auth(nClicks, username, password, password_again, input_captcha, sess captcha_form_help=None, submit_loading=False, redirect_container=None, - global_message_container=fuc.FefferyFancyMessage(change_result.get('message'), type='error') + global_message_container=fuc.FefferyFancyMessage( + change_result.get('message'), type='error' + ), ) except Exception as e: - return dict( username_form_status=None, password_form_status=None, @@ -89,7 +112,9 @@ def forget_auth(nClicks, username, password, password_again, input_captcha, sess captcha_form_help=None, submit_loading=False, redirect_container=None, - global_message_container=fuc.FefferyFancyMessage(str(e), type='error') + global_message_container=fuc.FefferyFancyMessage( + str(e), type='error' + ), ) else: @@ -104,57 +129,80 @@ def forget_auth(nClicks, username, password, password_again, input_captcha, sess captcha_form_help=None, submit_loading=False, redirect_container=None, - global_message_container=None + global_message_container=None, ) return dict( - username_form_status=None if validate_data_not_empty(username) else 'error', - password_form_status=None if validate_data_not_empty(password) else 'error', - password_again_form_status=None if validate_data_not_empty(password_again) else 'error', - captcha_form_status=None if validate_data_not_empty(input_captcha) else 'error', - username_form_help=None if validate_data_not_empty(username) else '请输入用户名!', - password_form_help=None if validate_data_not_empty(password) else '请输入新密码!', - password_again_form_help=None if validate_data_not_empty(password_again) else '请再次输入新密码!', - captcha_form_help=None if validate_data_not_empty(input_captcha) else '请输入短信验证码!', + username_form_status=None + if validate_data_not_empty(username) + else 'error', + password_form_status=None + if validate_data_not_empty(password) + else 'error', + password_again_form_status=None + if validate_data_not_empty(password_again) + else 'error', + captcha_form_status=None + if validate_data_not_empty(input_captcha) + else 'error', + username_form_help=None + if validate_data_not_empty(username) + else '请输入用户名!', + password_form_help=None + if validate_data_not_empty(password) + else '请输入新密码!', + password_again_form_help=None + if validate_data_not_empty(password_again) + else '请再次输入新密码!', + captcha_form_help=None + if validate_data_not_empty(input_captcha) + else '请输入短信验证码!', submit_loading=False, redirect_container=None, - global_message_container=None + global_message_container=None, ) raise PreventUpdate @app.callback( - [Output('message-code-count-down', 'delay'), - Output('get-message-code', 'disabled', allow_duplicate=True), - Output('sms_code-session_id-container', 'data'), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output('message-code-count-down', 'delay'), + Output('get-message-code', 'disabled', allow_duplicate=True), + Output('sms_code-session_id-container', 'data'), + Output('global-message-container', 'children', allow_duplicate=True), + ], Input('get-message-code', 'nClicks'), - [State('forget-username', 'value'), - State('sms_code-session_id-container', 'data')], - prevent_initial_call=True + [ + State('forget-username', 'value'), + State('sms_code-session_id-container', 'data'), + ], + prevent_initial_call=True, ) def message_countdown(nClicks, username, session_id): if nClicks: - try: if username: - send_result = send_message_api(dict(user_name=username, session_id=session_id)) + send_result = send_message_api( + dict(user_name=username, session_id=session_id) + ) if send_result.get('code') == 200: - return [ 120, True, send_result.get('data').get('session_id'), - fuc.FefferyFancyMessage(send_result.get('message'), type='success') + fuc.FefferyFancyMessage( + send_result.get('message'), type='success' + ), ] else: - return [ dash.no_update, False, dash.no_update, - fuc.FefferyFancyMessage(send_result.get('message'), type='error') + fuc.FefferyFancyMessage( + send_result.get('message'), type='error' + ), ] else: @@ -162,46 +210,45 @@ def message_countdown(nClicks, username, session_id): dash.no_update, False, dash.no_update, - fuc.FefferyFancyMessage('请输入用户名', type='error') + fuc.FefferyFancyMessage('请输入用户名', type='error'), ] except Exception as e: - return [ dash.no_update, False, dash.no_update, - fuc.FefferyFancyMessage(str(e), type='error') + fuc.FefferyFancyMessage(str(e), type='error'), ] return [dash.no_update] * 4 app.clientside_callback( - ''' + """ (countdown) => { if (countdown) { return true; } return false; } - ''', + """, Output('get-message-code', 'disabled', allow_duplicate=True), Input('message-code-count-down', 'countdown'), - prevent_initial_call=True + prevent_initial_call=True, ) app.clientside_callback( - ''' + """ (countdown) => { if (countdown) { return `获取中${countdown}s` } return '获取验证码' } - ''', + """, Output('get-message-code', 'children'), Input('message-code-count-down', 'countdown'), - prevent_initial_call=True + prevent_initial_call=True, ) diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index 3ca28bd..4c623f4 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -2,7 +2,6 @@ from dash import html, dcc import feffery_antd_components as fac import callbacks.login_c -from api.config import query_config_list_api def render_content(): @@ -19,17 +18,17 @@ def render_content(): return html.Div( [ - dcc.Store(id="captcha_image-session_id-container"), + dcc.Store(id='captcha_image-session_id-container'), html.Div( [ html.Div( [ fac.AntdText( - "HELLO", + 'HELLO', style={ - "color": "rgba(255,255,255,0.8)", - "fontSize": "60px", - "fontWeight": "500", + 'color': 'rgba(255,255,255,0.8)', + 'fontSize': '60px', + 'fontWeight': '500', }, ) ], @@ -37,11 +36,11 @@ def render_content(): html.Div( [ fac.AntdText( - "WELCOME", + 'WELCOME', style={ - "color": "rgba(255,255,255,0.8)", - "fontSize": "60px", - "fontWeight": "500", + 'color': 'rgba(255,255,255,0.8)', + 'fontSize': '60px', + 'fontWeight': '500', }, ), ], @@ -49,24 +48,24 @@ def render_content(): html.Div( [ fac.AntdText( - "欢迎使用通用后台管理系统", + '欢迎使用通用后台管理系统', style={ - "color": "rgba(255,255,255,0.8)", - "fontSize": "20px", - "fontWeight": "600", - "marginTop": "25px", + 'color': 'rgba(255,255,255,0.8)', + 'fontSize': '20px', + 'fontWeight': '600', + 'marginTop': '25px', }, ), ], ), ], style={ - "position": "fixed", - "top": "20%", - "left": "26%", - "width": "430px", - "padding": "0px 30px", - "transform": "translateX(-50%)", + 'position': 'fixed', + 'top': '20%', + 'left': '26%', + 'width': '430px', + 'padding': '0px 30px', + 'transform': 'translateX(-50%)', }, ), fac.AntdCard( @@ -75,23 +74,23 @@ def render_content(): [ fac.AntdFormItem( fac.AntdInput( - placeholder="请输入用户名", - id="login-username", - size="large", - prefix=fac.AntdIcon(icon="antd-user"), + placeholder='请输入用户名', + id='login-username', + size='large', + prefix=fac.AntdIcon(icon='antd-user'), ), - id="login-username-form-item", + id='login-username-form-item', ), fac.AntdFormItem( fac.AntdInput( - placeholder="请输入密码", - id="login-password", - mode="password", + placeholder='请输入密码', + id='login-password', + mode='password', passwordUseMd5=True, - size="large", - prefix=fac.AntdIcon(icon="antd-lock"), + size='large', + prefix=fac.AntdIcon(icon='antd-lock'), ), - id="login-password-form-item", + id='login-password-form-item', ), html.Div( [ @@ -99,111 +98,114 @@ def render_content(): [ fac.AntdFormItem( fac.AntdInput( - placeholder="请输入验证码", - id="login-captcha", - size="large", + placeholder='请输入验证码', + id='login-captcha', + size='large', prefix=fac.AntdIcon( - icon="antd-check-circle" + icon='antd-check-circle' ), - style={"width": "210px"}, + style={'width': '210px'}, ), - id="login-captcha-form-item", + id='login-captcha-form-item', ), fac.AntdFormItem( html.Div( [ fac.AntdImage( - id="login-captcha-image", - src="", + id='login-captcha-image', + src='', height=37, width=100, preview=False, ) ], - id="login-captcha-image-container", + id='login-captcha-image-container', n_clicks=1, - style={"border": "1px solid #ccc"}, + style={ + 'border': '1px solid #ccc' + }, ) ), ], - align="end", + align='end', size=10, ), ], - id="captcha-row-container", + id='captcha-row-container', hidden=captcha_hidden, ), fac.AntdSpace( [ - html.Div(id="test"), + html.Div(id='test'), fac.AntdButton( - "忘记密码", - id="forget-password-link", - type="link", - href="/forget", - target="_self", + '忘记密码', + id='forget-password-link', + type='link', + href='/forget', + target='_self', ), ], - align="center", + align='center', size=240, ) if forget_show else [], fac.AntdFormItem( fac.AntdButton( - "登录", - id="login-submit", - type="primary", - loadingChildren="登录中", + '登录', + id='login-submit', + type='primary', + loadingChildren='登录中', autoSpin=True, block=True, - size="large", + size='large', ), - style={"marginTop": "20px"}, + style={'marginTop': '20px'}, ), ], - layout="vertical", - style={"width": "100%"}, + layout='vertical', + style={'width': '100%'}, ), ], - id="login-form-container", - title="登录", + id='login-form-container', + title='登录', hoverable=True, style={ - "position": "fixed", - "top": "16%", - "left": "70%", - "width": "430px", - "padding": "0px 30px", - "transform": "translateX(-50%)", + 'position': 'fixed', + 'top': '16%', + 'left': '70%', + 'width': '430px', + 'padding': '0px 30px', + 'transform': 'translateX(-50%)', }, ), fac.AntdFooter( html.Div( fac.AntdText( - "版权所有©2023 Dash-FastAPI-Admin", style={"margin": "0"} + '版权所有©2023 Dash-FastAPI-Admin', + style={'margin': '0'}, ), style={ - "display": "flex", - "height": "100%", - "justifyContent": "center", - "alignItems": "center", + 'display': 'flex', + 'height': '100%', + 'justifyContent': 'center', + 'alignItems': 'center', }, ), style={ - "backgroundColor": "rgb(255 255 255 / 0%)", - "height": "40px", - "position": "fixed", - "bottom": 0, - "left": "50%", - "width": "500px", - "padding": 0, - "transform": "translateX(-50%)", + 'backgroundColor': 'rgb(255 255 255 / 0%)', + 'height': '40px', + 'position': 'fixed', + 'bottom': 0, + 'left': '50%', + 'width': '500px', + 'padding': 0, + 'transform': 'translateX(-50%)', }, ), ], - id="container", + id='container', style={ - "height": "100vh", + 'height': '100vh', }, ) -- Gitee From e6ecc9a2f2771f1eb20a9467de06c2dbae60a274 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:51:09 +0800 Subject: [PATCH 054/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/cache_util.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/utils/cache_util.py b/dash-fastapi-frontend/utils/cache_util.py index 245fa0c..fb59185 100644 --- a/dash-fastapi-frontend/utils/cache_util.py +++ b/dash-fastapi-frontend/utils/cache_util.py @@ -19,8 +19,10 @@ class CacheManager: :param target_key: 缓存key :return: 缓存值 """ - cache_value = cache_manager.get(session.get('Authorization')).get( - target_key + cache_value = ( + cache_manager.get(session.get('Authorization')).get(target_key) + if cache_manager.get(session.get('Authorization')) + else None ) return cache_value -- Gitee From 99c320fe1ed4a345a2b79b38c19d8e655f2a9701 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:51:48 +0800 Subject: [PATCH 055/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E6=8F=90=E7=A4=BA=E7=AE=A1=E7=90=86=E5=99=A8=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/feedback_util.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dash-fastapi-frontend/utils/feedback_util.py b/dash-fastapi-frontend/utils/feedback_util.py index 9494a7c..f68f334 100644 --- a/dash-fastapi-frontend/utils/feedback_util.py +++ b/dash-fastapi-frontend/utils/feedback_util.py @@ -207,7 +207,6 @@ class MessageManager: 'namespace': 'feffery_antd_components', } }, - namespace='feffery_antd_components', ) -- Gitee From 23e6e2f66f5f70c5f96d7c32dfc965f88175190c Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:52:25 +0800 Subject: [PATCH 056/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96api=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/request.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index 76e7ba4..ffb294c 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -9,6 +9,7 @@ from config.exception import ( ServiceWarning, ) from config.global_config import ApiBaseUrlConfig +from utils.cache_util import CacheManager from utils.log_util import logger @@ -121,8 +122,8 @@ def api_request( data_list = [params, data, json, files] status_code = response.status_code request_user = ( - session.get('user_info').get('user_name') - if session.get('user_info') + CacheManager.get('user_info').get('user_name') + if CacheManager.get('user_info') else None ) request_params = ','.join([str(x) for x in data_list if x]) -- Gitee From cb5d243eaa73f9e3e85c254f53851506eceaa08b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:52:44 +0800 Subject: [PATCH 057/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=B7=A5=E5=85=B7=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/tree_tool.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dash-fastapi-frontend/utils/tree_tool.py b/dash-fastapi-frontend/utils/tree_tool.py index 1917e0e..e116261 100644 --- a/dash-fastapi-frontend/utils/tree_tool.py +++ b/dash-fastapi-frontend/utils/tree_tool.py @@ -301,3 +301,24 @@ def get_search_panel_data(menu_list: list): search_data.append(item_dict) return search_data + + +def find_tree_all_keys(tree, keys_list): + """ + 递归函数,用于查找树形数据结构中所有键名为'name'的值,并将它们添加到列表中。 + + :param tree: 树形数据结构,假设为嵌套字典或列表 + :param keys_list: 用于存储找到的'key'值的列表 + :return: 包含所有找到的'key'值的列表 + """ + if isinstance(tree, dict): + for key, value in tree.items(): + if key == 'key': + keys_list.append(value) + elif isinstance(value, (dict, list)): + find_tree_all_keys(value, keys_list) + elif isinstance(tree, list): + for item in tree: + find_tree_all_keys(item, keys_list) + + return keys_list -- Gitee From ef8f201bb5e6b1f4d577cc02dbfcbb55c645298b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:53:24 +0800 Subject: [PATCH 058/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/role.py | 12 +- .../system_c/role_c/allocate_user_c.py | 388 +++++++++++------- .../callbacks/system_c/role_c/data_scope_c.py | 267 ++++++------ .../callbacks/system_c/role_c/role_c.py | 121 ++---- .../views/system/role/__init__.py | 2 +- .../views/system/role/allocate_user.py | 44 +- .../system/role/component/query_form_table.py | 4 +- 7 files changed, 436 insertions(+), 402 deletions(-) diff --git a/dash-fastapi-frontend/api/system/role.py b/dash-fastapi-frontend/api/system/role.py index 67a169f..884815c 100644 --- a/dash-fastapi-frontend/api/system/role.py +++ b/dash-fastapi-frontend/api/system/role.py @@ -161,31 +161,31 @@ class RoleApi: ) @classmethod - def auth_user_cancel_all(cls, json: dict): + def auth_user_cancel_all(cls, params: dict): """ 批量取消用户授权角色接口 - :param json: 用户授权角色参数 + :param params: 用户授权角色参数 :return: """ return api_request( url='/system/role/authUser/cancelAll', method='put', - json=json, + params=params, ) @classmethod - def auth_user_select_all(cls, json: dict): + def auth_user_select_all(cls, params: dict): """ 授权用户选择接口 - :param json: 用户选择角色参数 + :param params: 用户选择角色参数 :return: """ return api_request( url='/system/role/authUser/selectAll', method='put', - json=json, + params=params, ) @classmethod diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py index 9c3a925..0de4c8a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py @@ -1,30 +1,62 @@ -import dash -import time import uuid -from dash.dependencies import Input, Output, State, ALL, MATCH +from dash import ctx, no_update +from dash.dependencies import ALL, Input, MATCH, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.role import RoleApi from server import app -from api.role import get_allocated_user_list_api, get_unallocated_user_list_api, auth_user_select_all_api, auth_user_cancel_api +from utils.feedback_util import MessageManager +from utils.permission_util import PermissionManager @app.callback( - [Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'data', allow_duplicate=True), - Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'pagination', allow_duplicate=True), - Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'key'), - Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'selectedRowKeys')], - [Input({'type': 'allocate_user-search', 'index': MATCH}, 'nClicks'), - Input({'type': 'allocate_user-refresh', 'index': MATCH}, 'nClicks'), - Input({'type': 'allocate_user-list-table', 'index': MATCH}, 'pagination'), - Input({'type': 'allocate_user-operations-container', 'index': MATCH}, 'data')], - [State({'type': 'allocate_user-user_name-input', 'index': MATCH}, 'value'), - State({'type': 'allocate_user-phonenumber-input', 'index': MATCH}, 'value'), - State('allocate_user-role_id-container', 'data'), - State('allocate_user-button-perms-container', 'data')], - prevent_initial_call=True + [ + Output( + {'type': 'allocate_user-list-table', 'index': MATCH}, + 'data', + allow_duplicate=True, + ), + Output( + {'type': 'allocate_user-list-table', 'index': MATCH}, + 'pagination', + allow_duplicate=True, + ), + Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'key'), + Output( + {'type': 'allocate_user-list-table', 'index': MATCH}, + 'selectedRowKeys', + ), + ], + [ + Input({'type': 'allocate_user-search', 'index': MATCH}, 'nClicks'), + Input({'type': 'allocate_user-refresh', 'index': MATCH}, 'nClicks'), + Input( + {'type': 'allocate_user-list-table', 'index': MATCH}, 'pagination' + ), + Input( + {'type': 'allocate_user-operations-container', 'index': MATCH}, + 'data', + ), + ], + [ + State( + {'type': 'allocate_user-user_name-input', 'index': MATCH}, 'value' + ), + State( + {'type': 'allocate_user-phonenumber-input', 'index': MATCH}, 'value' + ), + State('allocate_user-role_id-container', 'data'), + ], + prevent_initial_call=True, ) -def get_allocate_user_table_data(search_click, refresh_click, pagination, operations, user_name, phonenumber, role_id, button_perms): +def get_allocate_user_table_data( + search_click, + refresh_click, + pagination, + operations, + user_name, + phonenumber, + role_id, +): """ 使用模式匹配回调MATCH模式,根据不同类型获取角色已分配用户列表及未分配用户列表(进行表格相关增删查改操作后均会触发此回调) """ @@ -34,76 +66,87 @@ def get_allocate_user_table_data(search_click, refresh_click, pagination, operat user_name=user_name, phonenumber=phonenumber, page_num=1, - page_size=10 + page_size=10, ) - triggered_id = dash.ctx.triggered_id + triggered_id = ctx.triggered_id if triggered_id.type == 'allocate_user-list-table': - query_params = dict( - role_id=int(role_id), - user_name=user_name, - phonenumber=phonenumber, - page_num=pagination['current'], - page_size=pagination['pageSize'] + query_params.update( + { + 'page_num': pagination['current'], + 'page_size': pagination['pageSize'], + } ) if search_click or refresh_click or pagination or operations: table_info = {} if triggered_id.index == 'allocated': - table_info = get_allocated_user_list_api(query_params) + table_info = RoleApi.allocated_user_list(query_params) if triggered_id.index == 'unallocated': - table_info = get_unallocated_user_list_api(query_params) - if table_info.get('code') == 200: - table_data = table_info['data']['rows'] - table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['data']['total'] - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - item['key'] = str(item['user_id']) - if triggered_id.index == 'allocated': - item['operation'] = [ - { - 'content': '取消授权', - 'type': 'link', - 'icon': 'antd-close-circle' - } if 'system:role:edit' in button_perms else {}, - ] - - return [table_data, table_pagination, str(uuid.uuid4()), None] + table_info = RoleApi.unallocated_user_list(query_params) + table_data = table_info['rows'] + new_table_data = [ + {k: v for k, v in item.items() if k != 'admin'} + for item in table_data + ] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in new_table_data: + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + item['key'] = str(item['user_id']) + if triggered_id.index == 'allocated': + item['operation'] = [ + { + 'content': '取消授权', + 'type': 'link', + 'icon': 'antd-close-circle', + } + if PermissionManager.check_perms('system:role:remove') + else {}, + ] - return [dash.no_update, dash.no_update, dash.no_update, dash.no_update] + return [new_table_data, table_pagination, str(uuid.uuid4()), None] raise PreventUpdate # 重置分配用户搜索表单数据回调 app.clientside_callback( - ''' + """ (reset_click) => { if (reset_click) { return [null, null, {'type': 'reset'}] } return window.dash_clientside.no_update; } - ''', - [Output({'type': 'allocate_user-user_name-input', 'index': MATCH}, 'value'), - Output({'type': 'allocate_user-phonenumber-input', 'index': MATCH}, 'value'), - Output({'type': 'allocate_user-operations-container', 'index': MATCH}, 'data')], + """, + [ + Output( + {'type': 'allocate_user-user_name-input', 'index': MATCH}, 'value' + ), + Output( + {'type': 'allocate_user-phonenumber-input', 'index': MATCH}, 'value' + ), + Output( + {'type': 'allocate_user-operations-container', 'index': MATCH}, + 'data', + ), + ], Input({'type': 'allocate_user-reset', 'index': MATCH}, 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 隐藏/显示分配用户搜索表单回调 app.clientside_callback( - ''' + """ (hidden_click, hidden_status) => { if (hidden_click) { return [ @@ -113,25 +156,41 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output({'type': 'allocate_user-search-form-container', 'index': MATCH}, 'hidden'), - Output({'type': 'allocate_user-hidden-tooltip', 'index': MATCH}, 'title')], + """, + [ + Output( + {'type': 'allocate_user-search-form-container', 'index': MATCH}, + 'hidden', + ), + Output( + {'type': 'allocate_user-hidden-tooltip', 'index': MATCH}, 'title' + ), + ], Input({'type': 'allocate_user-hidden', 'index': MATCH}, 'nClicks'), - State({'type': 'allocate_user-search-form-container', 'index': MATCH}, 'hidden'), - prevent_initial_call=True + State( + {'type': 'allocate_user-search-form-container', 'index': MATCH}, + 'hidden', + ), + prevent_initial_call=True, ) @app.callback( - Output({'type': 'allocate_user-operation-button', 'index': 'delete'}, 'disabled'), - Input({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'selectedRowKeys'), - prevent_initial_call=True + Output( + {'type': 'allocate_user-operation-button', 'index': 'delete'}, + 'disabled', + ), + Input( + {'type': 'allocate_user-list-table', 'index': 'allocated'}, + 'selectedRowKeys', + ), + prevent_initial_call=True, ) def change_allocated_user_delete_button_status(table_rows_selected): """ 根据选择的表格数据行数控制取批量消授权按钮状态回调 """ - outputs_list = dash.ctx.outputs_list + outputs_list = ctx.outputs_list if outputs_list: if table_rows_selected: return False @@ -142,32 +201,54 @@ def change_allocated_user_delete_button_status(table_rows_selected): @app.callback( - [Output('allocate_user-modal', 'visible'), - Output({'type': 'allocate_user-search', 'index': 'unallocated'}, 'nClicks')], + [ + Output('allocate_user-modal', 'visible'), + Output( + {'type': 'allocate_user-search', 'index': 'unallocated'}, 'nClicks' + ), + ], Input('allocate_user-add', 'nClicks'), State({'type': 'allocate_user-search', 'index': 'unallocated'}, 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) def allocate_user_modal(add_click, unallocated_user): """ 分配用户弹框中添加用户按钮回调 """ if add_click: - return [True, unallocated_user + 1 if unallocated_user else 1] raise PreventUpdate @app.callback( - [Output({'type': 'allocate_user-operations-container', 'index': 'allocated'}, 'data', allow_duplicate=True), - Output({'type': 'allocate_user-operations-container', 'index': 'unallocated'}, 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + [ + Output( + { + 'type': 'allocate_user-operations-container', + 'index': 'allocated', + }, + 'data', + allow_duplicate=True, + ), + Output( + { + 'type': 'allocate_user-operations-container', + 'index': 'unallocated', + }, + 'data', + allow_duplicate=True, + ), + ], Input('allocate_user-modal', 'okCounts'), - [State({'type': 'allocate_user-list-table', 'index': 'unallocated'}, 'selectedRowKeys'), - State('allocate_user-role_id-container', 'data')], - prevent_initial_call=True + [ + State( + {'type': 'allocate_user-list-table', 'index': 'unallocated'}, + 'selectedRowKeys', + ), + State('allocate_user-role_id-container', 'data'), + ], + prevent_initial_call=True, ) def allocate_user_add_confirm(add_confirm, selected_row_keys, role_id): """ @@ -175,99 +256,122 @@ def allocate_user_add_confirm(add_confirm, selected_row_keys, role_id): """ if add_confirm: if selected_row_keys: - - params = {'user_ids': ','.join(selected_row_keys), 'role_ids': role_id} - add_button_info = auth_user_select_all_api(params) - if add_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('授权成功', type='success') - ] + params = { + 'user_ids': ','.join(selected_row_keys), + 'role_id': int(role_id), + } + RoleApi.auth_user_select_all(params) + MessageManager.success(content='授权成功') return [ - dash.no_update, - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('授权失败', type='error') + {'type': 'add'}, + {'type': 'add'}, ] + MessageManager.error(content='请选择用户') return [ - dash.no_update, - dash.no_update, - dash.no_update, - fuc.FefferyFancyMessage('请选择用户', type='error') + no_update, + no_update, ] raise PreventUpdate @app.callback( - [Output('allocate_user-delete-text', 'children'), - Output('allocate_user-delete-confirm-modal', 'visible'), - Output('allocate_user-delete-ids-store', 'data')], - [Input({'type': 'allocate_user-operation-button', 'index': ALL}, 'nClicks'), - Input({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'nClicksButton')], - [State({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'selectedRowKeys'), - State({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'clickedContent'), - State({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'recentlyButtonClickedRow')], - prevent_initial_call=True + [ + Output('allocate_user-delete-text', 'children'), + Output('allocate_user-delete-confirm-modal', 'visible'), + Output('allocate_user-delete-ids-store', 'data'), + ], + [ + Input( + {'type': 'allocate_user-operation-button', 'index': ALL}, 'nClicks' + ), + Input( + {'type': 'allocate_user-list-table', 'index': 'allocated'}, + 'nClicksButton', + ), + ], + [ + State( + {'type': 'allocate_user-list-table', 'index': 'allocated'}, + 'selectedRowKeys', + ), + State( + {'type': 'allocate_user-list-table', 'index': 'allocated'}, + 'clickedContent', + ), + State( + {'type': 'allocate_user-list-table', 'index': 'allocated'}, + 'recentlyButtonClickedRow', + ), + ], + prevent_initial_call=True, ) -def allocate_user_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): +def allocate_user_delete_modal( + operation_click, + button_click, + selected_row_keys, + clicked_content, + recently_button_clicked_row, +): """ 显示取消授权二次确认弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.type == 'allocate_user-operation-button' or ( - trigger_id.type == 'allocate_user-list-table' and clicked_content == '取消授权'): - + trigger_id.type == 'allocate_user-list-table' + and clicked_content == '取消授权' + ): if trigger_id.type == 'allocate_user-operation-button': user_ids = ','.join(selected_row_keys) + oper = {'oper_type': 'clear', 'user_ids': user_ids} else: if clicked_content == '取消授权': user_ids = recently_button_clicked_row['key'] + oper = {'oper_type': 'delete', 'user_ids': user_ids} else: - return dash.no_update + return no_update - return [ - f'是否确认取消用户id为{user_ids}的授权?', - True, - user_ids - ] + return [f'是否确认取消用户id为{user_ids}的授权?', True, oper] raise PreventUpdate @app.callback( - [Output({'type': 'allocate_user-operations-container', 'index': 'allocated'}, 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], + Output( + { + 'type': 'allocate_user-operations-container', + 'index': 'allocated', + }, + 'data', + allow_duplicate=True, + ), Input('allocate_user-delete-confirm-modal', 'okCounts'), - [State('allocate_user-delete-ids-store', 'data'), - State('allocate_user-role_id-container', 'data')], - prevent_initial_call=True + [ + State('allocate_user-delete-ids-store', 'data'), + State('allocate_user-role_id-container', 'data'), + ], + prevent_initial_call=True, ) def allocate_user_delete_confirm(delete_confirm, user_ids_data, role_id): """ 取消授权弹窗确认回调,实现取消授权操作 """ if delete_confirm: + oper_type = user_ids_data.get('oper_type') + user_ids = user_ids_data.get('user_ids') + if oper_type == 'clear': + params = {'user_ids': user_ids, 'role_id': int(role_id)} + RoleApi.auth_user_cancel_all(params) + MessageManager.success(content='取消授权成功') + + return {'type': 'clear'} + else: + params = {'user_id': int(user_ids), 'role_id': int(role_id)} + RoleApi.auth_user_cancel(params) + MessageManager.success(content='取消授权成功') - params = {'user_ids': user_ids_data, 'role_ids': role_id} - delete_button_info = auth_user_cancel_api(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('取消授权成功', type='success') - ] - - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('取消授权失败', type='error') - ] + return {'type': 'delete'} raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py index 808dab9..e323d50 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py @@ -1,197 +1,154 @@ -import dash -import time -from dash.dependencies import Input, Output, State, ALL +import uuid +from dash import ctx, no_update +from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.role import RoleApi from server import app -from api.role import get_role_detail_api, role_datascope_api -from api.dept import get_dept_tree_api, get_dept_list_api +from utils.feedback_util import MessageManager +from utils.tree_tool import find_tree_all_keys @app.callback( Output('role-dept-perms', 'expandedKeys'), Input('role-dept-perms-radio-fold-unfold', 'checked'), - State('role-dept-store', 'data'), - prevent_initial_call=True + State('role-dept-perms', 'treeData'), + prevent_initial_call=True, ) -def fold_unfold_role_dept(fold_unfold, dept_info): +def fold_unfold_role_dept(fold_unfold, dept_tree): """ 数据权限表单中展开/折叠checkbox回调 """ - if dept_info: - default_expanded_keys = [] - for item in dept_info: - if fold_unfold: - default_expanded_keys.append(str(item.get('dept_id'))) - else: - if item.get('parent_id') == 0: - default_expanded_keys.append(str(item.get('dept_id'))) - - return default_expanded_keys + if dept_tree and fold_unfold is not None: + expanded_keys = [ + dept.get('key') for dept in dept_tree[0].get('children') + ] + expanded_keys.append(dept_tree[0].get('key')) + if fold_unfold: + return expanded_keys + else: + return [] - return dash.no_update + return no_update @app.callback( Output('role-dept-perms', 'checkedKeys', allow_duplicate=True), Input('role-dept-perms-radio-all-none', 'checked'), - State('role-dept-store', 'data'), - prevent_initial_call=True + State('role-dept-perms', 'treeData'), + prevent_initial_call=True, ) -def all_none_role_dept_mode(all_none, dept_info): +def all_none_role_dept_mode(all_none, dept_tree): """ 数据权限表单中全选/全不选checkbox回调 """ - if dept_info: - default_expanded_keys = [] - for item in dept_info: - if item.get('parent_id') == 0: - default_expanded_keys.append(str(item.get('dept_id'))) - + if dept_tree and all_none is not None: if all_none: - return [str(item.get('dept_id')) for item in dept_info] + all_keys = find_tree_all_keys(dept_tree, []) + return all_keys else: return [] - return dash.no_update + return no_update @app.callback( - [Output('role-dept-perms', 'checkStrictly'), - Output('role-dept-perms', 'checkedKeys', allow_duplicate=True)], + [ + Output('role-dept-perms', 'checkStrictly'), + Output('role-dept-perms', 'keys', allow_duplicate=True), + ], Input('role-dept-perms-radio-parent-children', 'checked'), - State('current-role-dept-store', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) -def change_role_dept_mode(parent_children, current_role_dept): +def change_role_dept_mode(parent_children): """ 数据权限表单中父子联动checkbox回调 """ - checked_dept = [] - if parent_children: - if current_role_dept: - for item in current_role_dept: - has_children = False - for other_item in current_role_dept: - if other_item['parent_id'] == item['dept_id']: - has_children = True - break - if not has_children: - checked_dept.append(str(item.get('dept_id'))) - return [False, checked_dept] - else: - if current_role_dept: - checked_dept = [str(item.get('dept_id')) for item in current_role_dept if item] or [] - return [True, checked_dept] + return [not parent_children, str(uuid.uuid4())] @app.callback( output=dict( dept_div=Output('role-dept-perms-div', 'hidden'), dept_perms_tree=Output('role-dept-perms', 'treeData'), - dept_perms_expanded_check=Output('role-dept-perms-radio-fold-unfold', 'checked'), - dept_perms_checkedkeys=Output('role-dept-perms', 'checkedKeys', allow_duplicate=True), - dept_perms_halfcheckedkeys=Output('role-dept-perms', 'halfCheckedKeys', allow_duplicate=True), - role_dept=Output('role-dept-store', 'data'), - current_role_dept=Output('current-role-dept-store', 'data') + dept_perms_expanded_check=Output( + 'role-dept-perms-radio-fold-unfold', 'checked' + ), + dept_perms_checkedkeys=Output( + 'role-dept-perms', 'checkedKeys', allow_duplicate=True + ), + radio_parent_children=Output( + 'role-dept-perms-radio-parent-children', 'checked' + ), ), inputs=dict( - data_scope=Input({'type': 'datascope-form-value', 'index': 'data_scope'}, 'value'), - ), - state=dict( - role_info=State('role-edit-id-store', 'data') + data_scope=Input( + {'type': 'datascope-form-value', 'index': 'data_scope'}, 'value' + ), ), - prevent_initial_call=True + state=dict(role_info=State('role-edit-id-store', 'data')), + prevent_initial_call=True, ) def get_role_dept_info(data_scope, role_info): if data_scope == '2': - tree_info = get_dept_tree_api({}) - dept_list_info = get_dept_list_api({}) - if tree_info.get('code') == 200 and dept_list_info.get('code') == 200: - tree_data = tree_info['data'] - dept_list = [item for item in dept_list_info['data']['rows'] if item.get('status') == '0'] - checked_dept = [] - checked_dept_all = [] - if role_info.get('dept')[0]: - for item in role_info.get('dept'): - checked_dept_all.append(str(item.get('dept_id'))) - has_children = False - for other_item in role_info.get('dept'): - if other_item['parent_id'] == item['dept_id']: - has_children = True - break - if not has_children: - checked_dept.append(str(item.get('dept_id'))) - half_checked_dept = [x for x in checked_dept_all if x not in checked_dept] - - return dict( - dept_div=False, - dept_perms_tree=tree_data, - dept_perms_expanded_check=True, - dept_perms_checkedkeys=checked_dept, - dept_perms_halfcheckedkeys=half_checked_dept, - role_dept=dept_list, - current_role_dept=role_info.get('dept') - ) + tree_info = RoleApi.dept_tree_select( + role_id=int(role_info.get('role_id')) + ) + tree_data = tree_info['depts'] + checked_keys = [str(item) for item in tree_info['checked_keys']] return dict( dept_div=False, - dept_perms_tree=dash.no_update, - dept_perms_expanded_check=dash.no_update, - dept_perms_checkedkeys=dash.no_update, - dept_perms_halfcheckedkeys=dash.no_update, - role_dept=dash.no_update, - current_role_dept=dash.no_update + dept_perms_tree=tree_data, + dept_perms_expanded_check=True, + dept_perms_checkedkeys=checked_keys, + radio_parent_children=role_info.get('dept_check_strictly'), ) return dict( dept_div=True, - dept_perms_tree=dash.no_update, - dept_perms_expanded_check=dash.no_update, - dept_perms_checkedkeys=dash.no_update, - dept_perms_halfcheckedkeys=dash.no_update, - role_dept=dash.no_update, - current_role_dept=dash.no_update + dept_perms_tree=no_update, + dept_perms_expanded_check=no_update, + dept_perms_checkedkeys=no_update, + radio_parent_children=no_update, ) @app.callback( output=dict( - modal_visible=Output('role-datascope-modal', 'visible', allow_duplicate=True), - form_value=Output({'type': 'datascope-form-value', 'index': ALL}, 'value'), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - edit_row_info=Output('role-edit-id-store', 'data', allow_duplicate=True) + modal_visible=Output( + 'role-datascope-modal', 'visible', allow_duplicate=True + ), + form_value=Output( + {'type': 'datascope-form-value', 'index': ALL}, 'value' + ), + edit_row_info=Output( + 'role-edit-id-store', 'data', allow_duplicate=True + ), ), inputs=dict( - button_click=Input({'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, 'nClicks') + button_click=Input( + {'type': 'role-operation-table', 'operation': ALL, 'index': ALL}, + 'nClicks', + ) ), - prevent_initial_call=True + prevent_initial_call=True, ) def edit_role_datascope_modal(button_click): """ 显示角色数据权限弹窗回调 """ - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id.operation == 'datascope': # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in dash.ctx.outputs_list[1]] + form_value_list = [x['id']['index'] for x in ctx.outputs_list[1]] role_id = int(trigger_id.index) - role_info_res = get_role_detail_api(role_id=role_id) - if role_info_res['code'] == 200: - role_info = role_info_res['data'] - return dict( - modal_visible=True, - form_value=[role_info.get('role').get(k) for k in form_value_list], - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=role_info - ) + role_info_res = RoleApi.get_role(role_id=role_id) + role_info = role_info_res['data'] return dict( - modal_visible=dash.no_update, - form_value=[dash.no_update] * len(form_value_list), - api_check_token_trigger={'timestamp': time.time()}, - edit_row_info=None + modal_visible=True, + form_value=[role_info.get(k) for k in form_value_list], + edit_row_info=role_info, ) raise PreventUpdate @@ -200,52 +157,62 @@ def edit_role_datascope_modal(button_click): @app.callback( output=dict( modal_visible=Output('role-datascope-modal', 'visible'), - operations=Output('role-operations-store', 'data', allow_duplicate=True), - api_check_token_trigger=Output('api-check-token', 'data', allow_duplicate=True), - global_message_container=Output('global-message-container', 'children', allow_duplicate=True) - ), - inputs=dict( - confirm_trigger=Input('role-datascope-modal', 'okCounts') + operations=Output( + 'role-operations-store', 'data', allow_duplicate=True + ), ), + inputs=dict(confirm_trigger=Input('role-datascope-modal', 'okCounts')), state=dict( edit_row_info=State('role-edit-id-store', 'data'), - form_value=State({'type': 'datascope-form-value', 'index': ALL}, 'value'), + form_value=State( + {'type': 'datascope-form-value', 'index': ALL}, 'value' + ), dept_checked_keys=State('role-dept-perms', 'checkedKeys'), dept_half_checked_keys=State('role-dept-perms', 'halfCheckedKeys'), - parent_checked=State('role-dept-perms-radio-parent-children', 'checked') + parent_checked=State( + 'role-dept-perms-radio-parent-children', 'checked' + ), ), - prevent_initial_call=True + prevent_initial_call=True, ) -def role_datascope_confirm(confirm_trigger, edit_row_info, form_value, dept_checked_keys, dept_half_checked_keys, parent_checked): +def role_datascope_confirm( + confirm_trigger, + edit_row_info, + form_value, + dept_checked_keys, + dept_half_checked_keys, + parent_checked, +): """ 角色数据权限弹窗确认回调,实现分配数据权限的操作 """ if confirm_trigger: # 获取所有输入表单项对应的value - form_value_state = {x['id']['index']: x.get('value') for x in dash.ctx.states_list[1]} - dept_half_checked_keys = dept_half_checked_keys if dept_half_checked_keys else [] + form_value_state = { + x['id']['index']: x.get('value') for x in ctx.states_list[1] + } + dept_half_checked_keys = ( + dept_half_checked_keys if dept_half_checked_keys else [] + ) dept_checked_keys = dept_checked_keys if dept_checked_keys else [] if parent_checked: dept_perms = dept_half_checked_keys + dept_checked_keys else: dept_perms = dept_checked_keys params_datascope = form_value_state - params_datascope['dept_id'] = ','.join(dept_perms) if dept_perms else None - params_datascope['role_id'] = edit_row_info.get('role').get('role_id') if edit_row_info else None - api_res = role_datascope_api(params_datascope) - if api_res.get('code') == 200: - return dict( - modal_visible=False, - operations={'type': 'datascope'}, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('分配成功', type='success') - ) + params_datascope['dept_ids'] = ( + [int(item) for item in dept_perms] if dept_perms else [] + ) + params_datascope['dept_check_strictly'] = parent_checked + params_datascope['role_id'] = ( + edit_row_info.get('role_id') if edit_row_info else None + ) + RoleApi.data_scope(params_datascope) + MessageManager.success(content='分配成功') return dict( - modal_visible=dash.no_update, - operations=dash.no_update, - api_check_token_trigger={'timestamp': time.time()}, - global_message_container=fuc.FefferyFancyMessage('分配失败', type='error') + modal_visible=False, + operations={'type': 'datascope'}, ) raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 2c7a2af..94a2b66 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -10,6 +10,7 @@ from server import app from utils.common import validate_data_not_empty from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.tree_tool import find_tree_all_keys @app.callback( @@ -270,23 +271,19 @@ def change_role_delete_button_status(table_rows_selected): @app.callback( - Output('role-menu-perms', 'expandedKeys', allow_duplicate=True), + Output('role-menu-perms', 'expandedKeys'), Input('role-menu-perms-radio-fold-unfold', 'checked'), - State('role-menu-store', 'data'), + State('role-menu-perms', 'treeData'), prevent_initial_call=True, ) -def fold_unfold_role_menu(fold_unfold, menu_info): +def fold_unfold_role_menu(fold_unfold, menu_tree): """ 新增和编辑表单中展开/折叠checkbox回调 """ - if menu_info: - default_expanded_keys = [] - for item in menu_info: - if item.get('parent_id') == 0: - default_expanded_keys.append(str(item.get('menu_id'))) - + if menu_tree and fold_unfold is not None: + expanded_keys = [menu.get('key') for menu in menu_tree] if fold_unfold: - return default_expanded_keys + return expanded_keys else: return [] @@ -296,21 +293,17 @@ def fold_unfold_role_menu(fold_unfold, menu_info): @app.callback( Output('role-menu-perms', 'checkedKeys', allow_duplicate=True), Input('role-menu-perms-radio-all-none', 'checked'), - State('role-menu-store', 'data'), + State('role-menu-perms', 'treeData'), prevent_initial_call=True, ) -def all_none_role_menu_mode(all_none, menu_info): +def all_none_role_menu_mode(all_none, menu_tree): """ 新增和编辑表单中全选/全不选checkbox回调 """ - if menu_info: - default_expanded_keys = [] - for item in menu_info: - if item.get('parent_id') == 0: - default_expanded_keys.append(str(item.get('menu_id'))) - + if menu_tree and all_none is not None: if all_none: - return [str(item.get('menu_id')) for item in menu_info] + all_keys = find_tree_all_keys(menu_tree, []) + return all_keys else: return [] @@ -320,34 +313,16 @@ def all_none_role_menu_mode(all_none, menu_info): @app.callback( [ Output('role-menu-perms', 'checkStrictly'), - Output('role-menu-perms', 'checkedKeys', allow_duplicate=True), + Output('role-menu-perms', 'key', allow_duplicate=True), ], Input('role-menu-perms-radio-parent-children', 'checked'), - State('current-role-menu-store', 'data'), prevent_initial_call=True, ) -def change_role_menu_mode(parent_children, current_role_menu): +def change_role_menu_mode(parent_children): """ 新增和编辑表单中父子联动checkbox回调 """ - checked_menu = [] - if parent_children: - if current_role_menu: - for item in current_role_menu: - has_children = False - for other_item in current_role_menu: - if other_item['parent_id'] == item['menu_id']: - has_children = True - break - if not has_children: - checked_menu.append(str(item.get('menu_id'))) - return [False, checked_menu] - else: - if current_role_menu: - checked_menu = [ - str(item.get('menu_id')) for item in current_role_menu if item - ] or [] - return [True, checked_menu] + return [not parent_children, str(uuid.uuid4())] @app.callback( @@ -368,17 +343,14 @@ def change_role_menu_mode(parent_children, current_role_menu): allow_duplicate=True, ), menu_perms_tree=Output('role-menu-perms', 'treeData'), - menu_perms_expandedkeys=Output( - 'role-menu-perms', 'expandedKeys', allow_duplicate=True - ), menu_perms_checkedkeys=Output( 'role-menu-perms', 'checkedKeys', allow_duplicate=True ), - menu_perms_halfcheckedkeys=Output( - 'role-menu-perms', 'halfCheckedKeys', allow_duplicate=True + fold_unfold=Output('role-menu-perms-radio-fold-unfold', 'checked'), + all_none=Output('role-menu-perms-radio-all-none', 'checked'), + radio_parent_children=Output( + 'role-menu-perms-radio-parent-children', 'checked' ), - role_menu=Output('role-menu-store', 'data'), - current_role_menu=Output('current-role-menu-store', 'data'), edit_row_info=Output('role-edit-id-store', 'data'), modal_type=Output('role-operations-store-bk', 'data'), ), @@ -424,11 +396,10 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), menu_perms_tree=tree_data, - menu_perms_expandedkeys=[], menu_perms_checkedkeys=None, - menu_perms_halfcheckedkeys=None, - role_menu=[], - current_role_menu=None, + fold_unfold=None, + all_none=None, + radio_parent_children=no_update, edit_row_info=None, modal_type={'type': 'add'}, ) @@ -440,37 +411,21 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): role_info_res = RoleApi.get_role(role_id=role_id) tree_info = MenuApi.role_menu_treeselect(role_id=role_id) role_info = role_info_res['data'] + menu_check_strictly = role_info['menu_check_strictly'] tree_data = tree_info['menus'] - checked_menu = [] - checked_menu_all = [] - if role_info.get('menu')[0]: - for item in role_info.get('menu'): - checked_menu_all.append(str(item.get('menu_id'))) - has_children = False - for other_item in role_info.get('menu'): - if other_item['parent_id'] == item['menu_id']: - has_children = True - break - if not has_children: - checked_menu.append(str(item.get('menu_id'))) - half_checked_menu = [ - x for x in checked_menu_all if x not in checked_menu - ] + checked_keys = [str(item) for item in tree_info['checked_keys']] return dict( modal_visible=True, modal_title='编辑角色', - form_value=[ - role_info.get('role').get(k) for k in form_value_list - ], + form_value=[role_info.get(k) for k in form_value_list], form_label_validate_status=[None] * len(form_label_list), form_label_validate_info=[None] * len(form_label_list), menu_perms_tree=tree_data, - menu_perms_expandedkeys=[], - menu_perms_checkedkeys=tree_data['checked_keys'], - menu_perms_halfcheckedkeys=half_checked_menu, - role_menu=[], - current_role_menu=role_info.get('menu'), - edit_row_info=role_info.get('role') if role_info else None, + menu_perms_checkedkeys=checked_keys, + fold_unfold=None, + all_none=None, + radio_parent_children=menu_check_strictly, + edit_row_info=role_info if role_info else None, modal_type={'type': 'edit'}, ) @@ -481,11 +436,10 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): form_label_validate_status=[no_update] * len(form_value_list), form_label_validate_info=[no_update] * len(form_value_list), menu_perms_tree=no_update, - menu_perms_expandedkeys=no_update, menu_perms_checkedkeys=no_update, - menu_perms_halfcheckedkeys=no_update, - role_menu=no_update, - current_role_menu=no_update, + fold_unfold=no_update, + all_none=no_update, + radio_parent_children=no_update, edit_row_info=None, modal_type=None, ) @@ -544,9 +498,7 @@ def role_confirm( """ if confirm_trigger: # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in ctx.outputs_list[0] - ] + form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] # 获取所有输入表单项对应的value及label form_value_state = { x['id']['index']: x.get('value') for x in ctx.states_list[2] @@ -569,7 +521,10 @@ def role_confirm( else: menu_perms = menu_checked_keys params_add = form_value_state - params_add['menu_id'] = ','.join(menu_perms) if menu_perms else None + params_add['menu_ids'] = ( + [int(item) for item in menu_perms] if menu_perms else [] + ) + params_add['menu_check_strictly'] = parent_checked params_edit = params_add.copy() params_edit['role_id'] = ( edit_row_info.get('role_id') if edit_row_info else None diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index 3bf7824..d5a6091 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -417,7 +417,7 @@ def render(*args, **kwargs): }, { 'title': '操作', - 'width': 180, + 'width': 200, 'dataIndex': 'operation', }, ], diff --git a/dash-fastapi-frontend/views/system/role/allocate_user.py b/dash-fastapi-frontend/views/system/role/allocate_user.py index 2deaa70..8a02887 100644 --- a/dash-fastapi-frontend/views/system/role/allocate_user.py +++ b/dash-fastapi-frontend/views/system/role/allocate_user.py @@ -1,32 +1,41 @@ -from dash import dcc, html import feffery_antd_components as fac - +from dash import dcc +from callbacks.system_c.role_c import allocate_user_c # noqa: F401 from .component import query_form_table -import callbacks.system_c.role_c.allocate_user_c def render(button_perms): - return [ dcc.Store(id='allocate_user-button-perms-container', data=button_perms), dcc.Store(id='allocate_user-role_id-container'), # 分配用户模块操作类型存储容器 - dcc.Store(id={ - 'type': 'allocate_user-operations-container', - 'index': 'allocated' - }), - dcc.Store(id={ - 'type': 'allocate_user-operations-container', - 'index': 'unallocated' - }), + dcc.Store( + id={ + 'type': 'allocate_user-operations-container', + 'index': 'allocated', + } + ), + dcc.Store( + id={ + 'type': 'allocate_user-operations-container', + 'index': 'unallocated', + } + ), # 分配用户模块删除操作行key存储容器 dcc.Store(id='allocate_user-delete-ids-store'), - query_form_table.render(button_perms=button_perms, allocate_index='allocated', is_operation=True), - + query_form_table.render( + button_perms=button_perms, + allocate_index='allocated', + is_operation=True, + ), # 添加用户表单modal fac.AntdModal( [ - query_form_table.render(button_perms=button_perms, allocate_index='unallocated', is_operation=False), + query_form_table.render( + button_perms=button_perms, + allocate_index='unallocated', + is_operation=False, + ), ], id='allocate_user-modal', title='选择用户', @@ -34,15 +43,14 @@ def render(button_perms): maskClosable=False, width=900, renderFooter=True, - okClickClose=False + okClickClose=False, ), - # 取消授权二次确认modal fac.AntdModal( fac.AntdText('是否确认取消授权?', id='allocate_user-delete-text'), id='allocate_user-delete-confirm-modal', visible=False, title='提示', - renderFooter=True + renderFooter=True, ), ] diff --git a/dash-fastapi-frontend/views/system/role/component/query_form_table.py b/dash-fastapi-frontend/views/system/role/component/query_form_table.py index 5092f6d..731b708 100644 --- a/dash-fastapi-frontend/views/system/role/component/query_form_table.py +++ b/dash-fastapi-frontend/views/system/role/component/query_form_table.py @@ -158,7 +158,7 @@ def render(button_perms, allocate_index, is_operation): }, ) if PermissionManager.check_perms( - 'system:role:edit' + 'system:role:add' ) else [], fac.AntdButton( @@ -180,7 +180,7 @@ def render(button_perms, allocate_index, is_operation): }, ) if PermissionManager.check_perms( - 'system:role:edit' + 'system:role:remove' ) else [], ], -- Gitee From 044827f2b52e914621707da12a2526dbbafa7e75 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 8 Sep 2024 17:54:25 +0800 Subject: [PATCH 059/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=A8=A1=E5=9D=97api=E8=AF=B7=E6=B1=82=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/user.py | 16 +- .../system_c/user_c/allocate_role_c.py | 293 ++---------------- .../callbacks/system_c/user_c/user_c.py | 55 +++- .../views/system/user/allocate_role.py | 211 ++++++++++--- .../views/system/user/component/__init__.py | 3 - .../system/user/component/query_form_table.py | 286 ----------------- 6 files changed, 249 insertions(+), 615 deletions(-) delete mode 100644 dash-fastapi-frontend/views/system/user/component/__init__.py delete mode 100644 dash-fastapi-frontend/views/system/user/component/query_form_table.py diff --git a/dash-fastapi-frontend/api/system/user.py b/dash-fastapi-frontend/api/system/user.py index dfebe75..6bf9136 100644 --- a/dash-fastapi-frontend/api/system/user.py +++ b/dash-fastapi-frontend/api/system/user.py @@ -205,17 +205,27 @@ class UserApi: ) @classmethod - def update_auth_role(cls, json: dict): + def get_auth_role(cls, user_id: int): + """ + 查询授权角色接口 + """ + return api_request( + url=f'/system/user/authRole/{user_id}', + method='get', + ) + + @classmethod + def update_auth_role(cls, params: dict): """ 保存授权角色接口 - :param json: 授权角色参数 + :param params: 授权角色参数 :return: """ return api_request( url='/system/user/authRole', method='put', - json=json, + params=params, ) @classmethod diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py index 5ddf787..1f9069a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py @@ -1,273 +1,42 @@ -import dash -import time -import uuid -from dash.dependencies import Input, Output, State, ALL, MATCH +from dash import ctx +from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc - +from api.system.user import UserApi from server import app -from api.user import get_allocated_role_list_api, get_unallocated_role_list_api, auth_role_select_all_api, auth_role_cancel_api - - -@app.callback( - [Output({'type': 'allocate_role-list-table', 'index': MATCH}, 'data', allow_duplicate=True), - Output({'type': 'allocate_role-list-table', 'index': MATCH}, 'pagination', allow_duplicate=True), - Output({'type': 'allocate_role-list-table', 'index': MATCH}, 'key'), - Output({'type': 'allocate_role-list-table', 'index': MATCH}, 'selectedRowKeys')], - [Input({'type': 'allocate_role-search', 'index': MATCH}, 'nClicks'), - Input({'type': 'allocate_role-refresh', 'index': MATCH}, 'nClicks'), - Input({'type': 'allocate_role-list-table', 'index': MATCH}, 'pagination'), - Input({'type': 'allocate_role-operations-container', 'index': MATCH}, 'data')], - [State({'type': 'allocate_role-role_name-input', 'index': MATCH}, 'value'), - State({'type': 'allocate_role-role_key-input', 'index': MATCH}, 'value'), - State('allocate_role-user_id-container', 'data'), - State('allocate_role-button-perms-container', 'data')], - prevent_initial_call=True -) -def get_allocate_role_table_data(search_click, refresh_click, pagination, operations, role_name, role_key, user_id, button_perms): - """ - 使用模式匹配回调MATCH模式,根据不同类型获取用户已分配角色列表及未分配角色列表(进行表格相关增删查改操作后均会触发此回调) - """ - - query_params = dict( - user_id=int(user_id), - role_name=role_name, - role_key=role_key, - page_num=1, - page_size=10 - ) - triggered_id = dash.ctx.triggered_id - if triggered_id.type == 'allocate_role-list-table': - query_params = dict( - user_id=int(user_id), - role_name=role_name, - role_key=role_key, - page_num=pagination['current'], - page_size=pagination['pageSize'] - ) - if search_click or refresh_click or pagination or operations: - table_info = {} - if triggered_id.index == 'allocated': - table_info = get_allocated_role_list_api(query_params) - if triggered_id.index == 'unallocated': - table_info = get_unallocated_role_list_api(query_params) - if table_info.get('code') == 200: - table_data = table_info['data']['rows'] - table_pagination = dict( - pageSize=table_info['data']['page_size'], - current=table_info['data']['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['data']['total'] - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - item['key'] = str(item['role_id']) - if triggered_id.index == 'allocated': - item['operation'] = [ - { - 'content': '取消授权', - 'type': 'link', - 'icon': 'antd-close-circle' - } if 'system:user:edit' in button_perms else {}, - ] - - return [table_data, table_pagination, str(uuid.uuid4()), None] - - return [dash.no_update, dash.no_update, dash.no_update, dash.no_update] - - raise PreventUpdate - - -# 重置分配角色搜索表单数据回调 -app.clientside_callback( - ''' - (reset_click) => { - if (reset_click) { - return [null, null, {'type': 'reset'}] - } - return window.dash_clientside.no_update; - } - ''', - [Output({'type': 'allocate_role-role_name-input', 'index': MATCH}, 'value'), - Output({'type': 'allocate_role-role_key-input', 'index': MATCH}, 'value'), - Output({'type': 'allocate_role-operations-container', 'index': MATCH}, 'data')], - Input({'type': 'allocate_role-reset', 'index': MATCH}, 'nClicks'), - prevent_initial_call=True -) - - -# 隐藏/显示分配角色搜索表单回调 -app.clientside_callback( - ''' - (hidden_click, hidden_status) => { - if (hidden_click) { - return [ - !hidden_status, - hidden_status ? '隐藏搜索' : '显示搜索' - ] - } - return window.dash_clientside.no_update; - } - ''', - [Output({'type': 'allocate_role-search-form-container', 'index': MATCH}, 'hidden'), - Output({'type': 'allocate_role-hidden-tooltip', 'index': MATCH}, 'title')], - Input({'type': 'allocate_role-hidden', 'index': MATCH}, 'nClicks'), - State({'type': 'allocate_role-search-form-container', 'index': MATCH}, 'hidden'), - prevent_initial_call=True -) - - -@app.callback( - Output({'type': 'allocate_role-operation-button', 'index': 'delete'}, 'disabled'), - Input({'type': 'allocate_role-list-table', 'index': 'allocated'}, 'selectedRowKeys'), - prevent_initial_call=True -) -def change_allocated_role_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制取批量消授权按钮状态回调 - """ - outputs_list = dash.ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate - - -@app.callback( - [Output('allocate_role-modal', 'visible'), - Output({'type': 'allocate_role-search', 'index': 'unallocated'}, 'nClicks')], - Input('allocate_role-add', 'nClicks'), - State({'type': 'allocate_role-search', 'index': 'unallocated'}, 'nClicks'), - prevent_initial_call=True -) -def allocate_role_modal(add_click, unallocated_role): - """ - 分配角色弹框中添加角色按钮回调 - """ - if add_click: - - return [True, unallocated_role + 1 if unallocated_role else 1] - - raise PreventUpdate +from utils.feedback_util import MessageManager @app.callback( - [Output({'type': 'allocate_role-operations-container', 'index': 'allocated'}, 'data', allow_duplicate=True), - Output({'type': 'allocate_role-operations-container', 'index': 'unallocated'}, 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], - Input('allocate_role-modal', 'okCounts'), - [State({'type': 'allocate_role-list-table', 'index': 'unallocated'}, 'selectedRowKeys'), - State('allocate_role-user_id-container', 'data')], - prevent_initial_call=True -) -def allocate_user_add_confirm(add_confirm, selected_row_keys, user_id): + Output('user_to_allocated_role-modal', 'visible', allow_duplicate=True), + [ + Input('allocate_role-submit-button', 'nClicks'), + Input('allocate_role-back-button', 'nClicks'), + ], + [ + State('allocate_role-list-table', 'selectedRowKeys'), + State('allocate_role-user_id-container', 'data'), + ], + prevent_initial_call=True, +) +def allocate_user_add_confirm( + add_confirm, back_confirm, selected_row_keys, user_id +): """ 添加角色确认回调,实现给用户分配角色操作 """ - if add_confirm: - if selected_row_keys: - - params = {'user_ids': user_id, 'role_ids': ','.join(selected_row_keys)} - add_button_info = auth_role_select_all_api(params) - if add_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('授权成功', type='success') - ] - - return [ - dash.no_update, - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('授权失败', type='error') - ] - - return [ - dash.no_update, - dash.no_update, - dash.no_update, - fuc.FefferyFancyMessage('请选择角色', type='error') - ] - - raise PreventUpdate - - -@app.callback( - [Output('allocate_role-delete-text', 'children'), - Output('allocate_role-delete-confirm-modal', 'visible'), - Output('allocate_role-delete-ids-store', 'data')], - [Input({'type': 'allocate_role-operation-button', 'index': ALL}, 'nClicks'), - Input({'type': 'allocate_role-list-table', 'index': 'allocated'}, 'nClicksButton')], - [State({'type': 'allocate_role-list-table', 'index': 'allocated'}, 'selectedRowKeys'), - State({'type': 'allocate_role-list-table', 'index': 'allocated'}, 'clickedContent'), - State({'type': 'allocate_role-list-table', 'index': 'allocated'}, 'recentlyButtonClickedRow')], - prevent_initial_call=True -) -def allocate_role_delete_modal(operation_click, button_click, - selected_row_keys, clicked_content, recently_button_clicked_row): - """ - 显示取消授权二次确认弹窗回调 - """ - trigger_id = dash.ctx.triggered_id - if trigger_id.type == 'allocate_role-operation-button' or ( - trigger_id.type == 'allocate_role-list-table' and clicked_content == '取消授权'): - - if trigger_id.type == 'allocate_role-operation-button': - role_ids = ','.join(selected_row_keys) - else: - if clicked_content == '取消授权': - role_ids = recently_button_clicked_row['key'] - else: - return dash.no_update - - return [ - f'是否确认取消角色id为{role_ids}的授权?', - True, - role_ids - ] - - raise PreventUpdate - - -@app.callback( - [Output({'type': 'allocate_role-operations-container', 'index': 'allocated'}, 'data', allow_duplicate=True), - Output('api-check-token', 'data', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], - Input('allocate_role-delete-confirm-modal', 'okCounts'), - [State('allocate_role-delete-ids-store', 'data'), - State('allocate_role-user_id-container', 'data')], - prevent_initial_call=True -) -def allocate_role_delete_confirm(delete_confirm, role_ids_data, user_id): - """ - 取消授权弹窗确认回调,实现取消授权操作 - """ - if delete_confirm: - - params = {'user_ids': user_id, 'role_ids': role_ids_data} - delete_button_info = auth_role_cancel_api(params) - if delete_button_info['code'] == 200: - return [ - {'type': 'delete'}, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('取消授权成功', type='success') - ] + trigger_id = ctx.triggered_id + if trigger_id == 'allocate_role-submit-button': + params = { + 'user_id': int(user_id), + 'role_ids': ','.join(selected_row_keys) + if selected_row_keys + else '', + } + UserApi.update_auth_role(params) + MessageManager.success(content='分配成功') - return [ - dash.no_update, - {'timestamp': time.time()}, - fuc.FefferyFancyMessage('取消授权失败', type='error') - ] + return False + if trigger_id == 'allocate_role-back-button': + return False raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index cd41fa9..047276b 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -353,8 +353,8 @@ def usr_add_confirm(add_confirm, post, role, form_value, form_label): ] ): params = form_value_state - params['post_ids'] = post if post else '' - params['role_ids'] = role if role else '' + params['post_ids'] = [int(item) for item in post] if post else [] + params['role_ids'] = [int(item) for item in role] if role else [] UserApi.add_user(params) MessageManager.success(content='新增成功') @@ -554,8 +554,9 @@ def usr_edit_confirm( params['user_id'] = ( edit_row_info.get('user_id') if edit_row_info else None ) - params['post_ids'] = ','.join(map(str, post)) if post else '' - params['role_ids'] = ','.join(map(str, role)) if role else '' + params['post_ids'] = [int(item) for item in post] if post else [] + params['role_ids'] = [int(item) for item in role] if role else [] + params['role'] = [] UserApi.update_user(params) MessageManager.success(content='编辑成功') @@ -728,7 +729,9 @@ def user_reset_password_confirm(reset_confirm, user_id_data, reset_password): 重置用户密码弹窗确认回调,实现重置密码操作 """ if reset_confirm: - UserApi.reset_user_pwd(user_id=int(user_id_data), password=reset_password) + UserApi.reset_user_pwd( + user_id=int(user_id_data), password=reset_password + ) MessageManager.success(content='重置成功') return {'type': 'reset-password'} @@ -739,18 +742,16 @@ def user_reset_password_confirm(reset_confirm, user_id_data, reset_password): @app.callback( [ Output('user_to_allocated_role-modal', 'visible'), - Output( - {'type': 'allocate_role-search', 'index': 'allocated'}, 'nClicks' - ), Output('allocate_role-user_id-container', 'data'), + Output('allocate_role-nick_name-input', 'value'), + Output('allocate_role-user_name-input', 'value'), + Output('allocate_role-list-table', 'selectedRowKeys'), + Output('allocate_role-list-table', 'data'), ], Input('user-list-table', 'nClicksDropdownItem'), [ State('user-list-table', 'recentlyClickedDropdownItemTitle'), State('user-list-table', 'recentlyDropdownItemClickedRow'), - State( - {'type': 'allocate_role-search', 'index': 'allocated'}, 'nClicks' - ), ], prevent_initial_call=True, ) @@ -758,18 +759,40 @@ def role_to_allocated_user_modal( dropdown_click, recently_clicked_dropdown_item_title, recently_dropdown_item_clicked_row, - allocated_role_search_nclick, ): """ 显示用户分配角色弹窗回调 """ if dropdown_click and recently_clicked_dropdown_item_title == '分配角色': + user_id = int(recently_dropdown_item_clicked_row['key']) + allocated_role_info = UserApi.get_auth_role(user_id=user_id) + table_data = allocated_role_info.get('roles') + selected_row_keys = [] + for item in table_data: + item['key'] = str(item['role_id']) + if item.get('flag'): + selected_row_keys.append(str(item['role_id'])) + new_table_data = [ + { + k: v + for k, v in item.items() + if k + not in [ + 'admin', + 'dept_check_strictly', + 'flag', + 'menu_check_strictly', + ] + } + for item in table_data + ] return [ True, - allocated_role_search_nclick + 1 - if allocated_role_search_nclick - else 1, - recently_dropdown_item_clicked_row['key'], + user_id, + allocated_role_info.get('user').get('nick_name'), + allocated_role_info.get('user').get('user_name'), + selected_row_keys, + new_table_data, ] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/user/allocate_role.py b/dash-fastapi-frontend/views/system/user/allocate_role.py index e42399d..1cf448d 100644 --- a/dash-fastapi-frontend/views/system/user/allocate_role.py +++ b/dash-fastapi-frontend/views/system/user/allocate_role.py @@ -1,57 +1,178 @@ -from dash import dcc import feffery_antd_components as fac - -from .component import query_form_table -import callbacks.system_c.user_c.allocate_role_c # noqa: F401 +from dash import dcc +from callbacks.system_c.user_c import allocate_role_c # noqa: F401 def render(button_perms): return [ - dcc.Store(id='allocate_role-button-perms-container', data=button_perms), dcc.Store(id='allocate_role-user_id-container'), - # 分配角色模块操作类型存储容器 - dcc.Store( - id={ - 'type': 'allocate_role-operations-container', - 'index': 'allocated', - } + fac.AntdTitle( + '基本信息', + level=4, + style={ + 'fontSize': '15px', + 'color': '#6379bb', + 'borderBottom': '1px solid #ddd', + 'margin': '8px 10px 25px 10px', + 'paddingBottom': '5px', + }, ), - dcc.Store( - id={ - 'type': 'allocate_role-operations-container', - 'index': 'unallocated', - } + fac.AntdForm( + fac.AntdRow( + [ + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='allocate_role-nick_name-input', + placeholder='请输入用户昵称', + autoComplete='off', + disabled=True, + # style={'width': 240}, + ), + label='用户昵称', + style={'paddingBottom': '10px'}, + ), + span=8, + offset=2, + ), + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='allocate_role-user_name-input', + placeholder='请输入登录账号', + autoComplete='off', + disabled=True, + # style={'width': 240}, + ), + label='登录账号', + style={'paddingBottom': '10px'}, + ), + span=8, + offset=2, + ), + ] + ), ), - # 分配角色模块删除操作行key存储容器 - dcc.Store(id='allocate_role-delete-ids-store'), - query_form_table.render( - button_perms=button_perms, - allocate_index='allocated', - is_operation=True, + fac.AntdTitle( + '角色信息', + level=4, + style={ + 'fontSize': '15px', + 'color': '#6379bb', + 'borderBottom': '1px solid #ddd', + 'margin': '8px 10px 25px 10px', + 'paddingBottom': '5px', + }, ), - # 添加用户表单modal - fac.AntdModal( - [ - query_form_table.render( - button_perms=button_perms, - allocate_index='unallocated', - is_operation=False, - ), - ], - id='allocate_role-modal', - title='选择角色', - mask=False, - maskClosable=False, - width=900, - renderFooter=True, - okClickClose=False, + fac.AntdSpin( + fac.AntdTable( + id='allocate_role-list-table', + data=[], + columns=[ + { + 'dataIndex': 'role_id', + 'title': '角色id', + 'hidden': True, + }, + { + 'dataIndex': 'role_name', + 'title': '角色名称', + 'renderOptions': {'renderType': 'ellipsis'}, + }, + { + 'dataIndex': 'role_key', + 'title': '权限字符', + 'renderOptions': {'renderType': 'ellipsis'}, + }, + { + 'dataIndex': 'create_time', + 'title': '创建时间', + 'renderOptions': {'renderType': 'ellipsis'}, + }, + ], + rowSelectionType='checkbox', + rowSelectionWidth=50, + bordered=True, + pagination={ + 'pageSize': 10, + 'current': 1, + 'showSizeChanger': True, + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], + 'showQuickJumper': True, + 'total': 0, + }, + style={ + 'width': '100%', + 'padding-right': '10px', + }, + ), + text='数据加载中', ), - # 取消授权二次确认modal - fac.AntdModal( - fac.AntdText('是否确认取消授权?', id='allocate_role-delete-text'), - id='allocate_role-delete-confirm-modal', - visible=False, - title='提示', - renderFooter=True, + fac.AntdCenter( + fac.AntdSpace( + [ + fac.AntdButton( + '提交', id='allocate_role-submit-button', type='primary' + ), + fac.AntdButton( + '返回', + id='allocate_role-back-button', + ), + ] + ) ), ] + # return [ + # dcc.Store(id='allocate_role-button-perms-container', data=button_perms), + # dcc.Store(id='allocate_role-user_id-container'), + # # 分配角色模块操作类型存储容器 + # dcc.Store( + # id={ + # 'type': 'allocate_role-operations-container', + # 'index': 'allocated', + # } + # ), + # dcc.Store( + # id={ + # 'type': 'allocate_role-operations-container', + # 'index': 'unallocated', + # } + # ), + # # 分配角色模块删除操作行key存储容器 + # dcc.Store(id='allocate_role-delete-ids-store'), + # query_form_table.render( + # button_perms=button_perms, + # allocate_index='allocated', + # is_operation=True, + # ), + # # 添加用户表单modal + # fac.AntdModal( + # [ + # query_form_table.render( + # button_perms=button_perms, + # allocate_index='unallocated', + # is_operation=False, + # ), + # ], + # id='allocate_role-modal', + # title='选择角色', + # mask=False, + # maskClosable=False, + # width=900, + # renderFooter=True, + # okClickClose=False, + # ), + # # 取消授权二次确认modal + # fac.AntdModal( + # fac.AntdText('是否确认取消授权?', id='allocate_role-delete-text'), + # id='allocate_role-delete-confirm-modal', + # visible=False, + # title='提示', + # renderFooter=True, + # ), + # ] diff --git a/dash-fastapi-frontend/views/system/user/component/__init__.py b/dash-fastapi-frontend/views/system/user/component/__init__.py deleted file mode 100644 index 5ec896d..0000000 --- a/dash-fastapi-frontend/views/system/user/component/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from . import ( - query_form_table -) diff --git a/dash-fastapi-frontend/views/system/user/component/query_form_table.py b/dash-fastapi-frontend/views/system/user/component/query_form_table.py deleted file mode 100644 index 3d606f8..0000000 --- a/dash-fastapi-frontend/views/system/user/component/query_form_table.py +++ /dev/null @@ -1,286 +0,0 @@ -from dash import html -import feffery_antd_components as fac - -from utils.permission_util import PermissionManager - - -def render(button_perms, allocate_index, is_operation): - table_column = [ - { - 'dataIndex': 'role_id', - 'title': '角色id', - 'hidden': True, - }, - { - 'dataIndex': 'role_name', - 'title': '角色名称', - 'renderOptions': {'renderType': 'ellipsis'}, - }, - { - 'dataIndex': 'role_key', - 'title': '权限字符', - 'renderOptions': {'renderType': 'ellipsis'}, - }, - { - 'dataIndex': 'role_sort', - 'title': '显示顺序', - 'renderOptions': {'renderType': 'ellipsis'}, - }, - { - 'dataIndex': 'status', - 'title': '状态', - 'renderOptions': {'renderType': 'tags'}, - }, - { - 'dataIndex': 'create_time', - 'title': '创建时间', - 'renderOptions': {'renderType': 'ellipsis'}, - }, - ] - - if is_operation: - table_column.append( - { - 'title': '操作', - 'dataIndex': 'operation', - 'fixed': 'right', - 'width': 150, - 'renderOptions': {'renderType': 'button'}, - } - ) - - return fac.AntdRow( - [ - fac.AntdCol( - [ - fac.AntdRow( - [ - fac.AntdCol( - html.Div( - [ - fac.AntdForm( - [ - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'allocate_role-role_name-input', - 'index': allocate_index, - }, - placeholder='请输入角色名称', - autoComplete='off', - allowClear=True, - style={'width': 240}, - ), - label='角色名称', - style={ - 'paddingBottom': '10px' - }, - ), - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'allocate_role-role_key-input', - 'index': allocate_index, - }, - placeholder='请输入权限字符', - autoComplete='off', - allowClear=True, - style={'width': 240}, - ), - label='权限字符', - style={ - 'paddingBottom': '10px' - }, - ), - fac.AntdFormItem( - fac.AntdButton( - '搜索', - id={ - 'type': 'allocate_role-search', - 'index': allocate_index, - }, - type='primary', - icon=fac.AntdIcon( - icon='antd-search' - ), - ), - style={ - 'paddingBottom': '10px' - }, - ), - fac.AntdFormItem( - fac.AntdButton( - '重置', - id={ - 'type': 'allocate_role-reset', - 'index': allocate_index, - }, - icon=fac.AntdIcon( - icon='antd-sync' - ), - ), - style={ - 'paddingBottom': '10px' - }, - ), - ], - layout='inline', - ) - ], - id={ - 'type': 'allocate_role-search-form-container', - 'index': allocate_index, - }, - hidden=False, - ), - ) - ] - ), - fac.AntdRow( - [ - fac.AntdCol( - fac.AntdSpace( - [ - fac.AntdButton( - [ - fac.AntdIcon(icon='antd-plus'), - '添加角色', - ], - id='allocate_role-add', - style={ - 'color': '#1890ff', - 'background': '#e8f4ff', - 'border-color': '#a3d3ff', - }, - ) - if PermissionManager.check_perms( - 'system:user:edit' - ) - else [], - fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-close-circle' - ), - '批量取消授权', - ], - id={ - 'type': 'allocate_role-operation-button', - 'index': 'delete', - }, - disabled=True, - style={ - 'color': '#ff9292', - 'background': '#ffeded', - 'border-color': '#ffdbdb', - }, - ) - if PermissionManager.check_perms( - 'system:user:edit' - ) - else [], - ], - style={'paddingBottom': '10px'}, - ), - span=16, - ) - if is_operation - else [], - fac.AntdCol( - fac.AntdSpace( - [ - html.Div( - fac.AntdTooltip( - fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-search' - ), - ], - id={ - 'type': 'allocate_role-hidden', - 'index': allocate_index, - }, - shape='circle', - ), - id={ - 'type': 'allocate_role-hidden-tooltip', - 'index': allocate_index, - }, - title='隐藏搜索', - ) - ), - html.Div( - fac.AntdTooltip( - fac.AntdButton( - [ - fac.AntdIcon( - icon='antd-sync' - ), - ], - id={ - 'type': 'allocate_role-refresh', - 'index': allocate_index, - }, - shape='circle', - ), - title='刷新', - ) - ), - ], - style={ - 'float': 'right', - 'paddingBottom': '10px', - }, - ), - span=8 if is_operation else 24, - style={'paddingRight': '10px'}, - ), - ], - gutter=5, - ), - fac.AntdRow( - [ - fac.AntdCol( - fac.AntdSpin( - fac.AntdTable( - id={ - 'type': 'allocate_role-list-table', - 'index': allocate_index, - }, - data=[], - columns=table_column, - rowSelectionType='checkbox', - rowSelectionWidth=50, - bordered=True, - maxWidth=1000, - pagination={ - 'pageSize': 10, - 'current': 1, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': 0, - }, - mode='server-side', - style={ - 'width': '100%', - 'padding-right': '10px', - }, - ), - text='数据加载中', - ), - ) - ] - ), - ], - span=24, - ) - ], - gutter=5, - ) -- Gitee From 1e3affca749f385b242a543e3c76f8564a9fe5dc Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 10 Sep 2024 18:01:39 +0800 Subject: [PATCH 060/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/dict_util.py | 76 ++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 dash-fastapi-frontend/utils/dict_util.py diff --git a/dash-fastapi-frontend/utils/dict_util.py b/dash-fastapi-frontend/utils/dict_util.py new file mode 100644 index 0000000..184e522 --- /dev/null +++ b/dash-fastapi-frontend/utils/dict_util.py @@ -0,0 +1,76 @@ +from cachebox import cached, TTLCache +from flask import session +from typing import Any, Literal +from api.system.dict.data import DictDataApi + + +def _DictManager__custom_key_maker(*args, **kwargs): + key = args[1].get('dict_type') + if session.get('Authorization'): + key = f'{session.get("Authorization")}:{args[1].get("dict_type")}' + return key + + +class DictManager: + @classmethod + @cached(TTLCache(0, ttl=600), key_maker=_DictManager__custom_key_maker) + def get_dict_options(cls, dict_type: str): + dict_data = DictDataApi.get_dicts(dict_type=dict_type).get('data') + select_options = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + ) + for item in dict_data + ] + dict_options = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + list_class=item.get('list_class'), + ) + for item in dict_data + ] + + return [select_options, dict_options] + + @classmethod + def get_dict_label(cls, dict_type: str, dict_value: Any): + options = cls.get_dict_options(dict_type=dict_type)[1] + if dict_value is None: + return '' + + for option in options: + if option.get('value') == dict_value: + return option.get('label', '') + return str(dict_value) + + @classmethod + def get_tag_color( + cls, + tag_type: Literal[ + 'default', 'primary', 'success', 'info', 'warning', 'danger' + ] = 'default', + ): + if tag_type == 'primary': + return 'blue' + elif tag_type == 'success': + return 'green' + elif tag_type == 'info': + return 'cyan' + elif tag_type == 'warning': + return 'gold' + elif tag_type == 'danger': + return 'red' + return None + + @classmethod + def get_dict_tag(cls, dict_type: dict, dict_value: Any): + options = cls.get_dict_options(dict_type=dict_type)[1] + for option in options: + if option.get('value') == str(dict_value): + return dict( + tag=option.get('label'), + color=cls.get_tag_color(option.get('list_class')), + ) -- Gitee From e00a1dd49ef1490acc47e41d97063db842bc3f77 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 10 Sep 2024 18:02:30 +0800 Subject: [PATCH 061/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E4=B8=8B=E6=8B=89=E9=80=89=E6=8B=A9=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/ApiSelect/__init__.py | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 dash-fastapi-frontend/views/components/ApiSelect/__init__.py diff --git a/dash-fastapi-frontend/views/components/ApiSelect/__init__.py b/dash-fastapi-frontend/views/components/ApiSelect/__init__.py new file mode 100644 index 0000000..8f975b5 --- /dev/null +++ b/dash-fastapi-frontend/views/components/ApiSelect/__init__.py @@ -0,0 +1,108 @@ +from feffery_antd_components import AntdSelect +from typing import Any, Dict, List, Literal, Optional, Union +from utils.dict_util import DictManager + + +class ApiSelect(AntdSelect): + def __init__( + self, + dict_type: str, + id: Optional[Union[str, Dict]] = None, + key: Optional[str] = None, + style: Optional[Dict] = None, + className: Optional[Union[str, Dict]] = None, + popupClassName: Optional[str] = None, + name: Optional[str] = None, + locale: Optional[Literal['zh-cn', 'en-us', 'de-de']] = 'zh-cn', + listHeight: Optional[Union[int, float]] = 256, + colorsMode: Optional[Literal['sequential', 'diverging']] = 'sequential', + colorsNameWidth: Optional[Union[int, float]] = 40, + mode: Optional[Literal['multiple', 'tags']] = None, + disabled: Optional[bool] = False, + size: Optional[Literal['small', 'middle', 'large']] = 'middle', + bordered: Optional[bool] = True, + variant: Optional[Literal['outlined', 'borderless', 'filled']] = None, + placeholder: Optional[str] = None, + placement: Optional[ + Literal['bottomLeft', 'bottomRight', 'topLeft', 'topRight'] + ] = 'bottomLeft', + value: Optional[Any] = None, + defaultValue: Optional[Any] = None, + maxTagCount: Optional[Union[int, float, Literal['responsive']]] = 5, + status: Optional[Literal['error', 'warning']] = None, + optionFilterProp: Optional[Literal['value', 'label']] = 'value', + searchValue: Optional[str] = None, + optionFilterMode: Optional[ + Literal[ + 'case-insensitive', 'case-sensitive', 'regex', 'remote-match' + ] + ] = 'case-insensitive', + debounceSearchValue: Optional[Any] = None, + debounceWait: Optional[Union[int, float]] = 0, + autoSpin: Optional[bool] = False, + autoClearSearchValue: Optional[bool] = True, + emptyContent: Optional[Any] = None, + loadingEmptyContent: Optional[Any] = None, + dropdownBefore: Optional[Any] = None, + dropdownAfter: Optional[Any] = None, + allowClear: Optional[bool] = True, + autoFocus: Optional[bool] = False, + popupMatchSelectWidth: Optional[bool] = True, + readOnly: Optional[bool] = False, + popupContainer: Optional[Literal['parent', 'body']] = 'body', + batchPropsNames: Optional[List] = None, + batchPropsValues: Optional[Dict] = None, + loading_state: Optional[Any] = None, + persistence: Optional[Any] = None, + persisted_props: Optional[Any] = None, + persistence_type: Optional[Any] = None, + **kwargs: Any, + ): + self.options = DictManager.get_dict_options(dict_type=dict_type)[0] + super().__init__( + id=id, + key=key, + style=style, + className=className, + popupClassName=popupClassName, + name=name, + locale=locale, + options=self.options, + listHeight=listHeight, + colorsMode=colorsMode, + colorsNameWidth=colorsNameWidth, + mode=mode, + disabled=disabled, + size=size, + bordered=bordered, + variant=variant, + placeholder=placeholder, + placement=placement, + value=value, + defaultValue=defaultValue, + maxTagCount=maxTagCount, + status=status, + optionFilterProp=optionFilterProp, + searchValue=searchValue, + optionFilterMode=optionFilterMode, + debounceSearchValue=debounceSearchValue, + debounceWait=debounceWait, + autoSpin=autoSpin, + autoClearSearchValue=autoClearSearchValue, + emptyContent=emptyContent, + loadingEmptyContent=loadingEmptyContent, + dropdownBefore=dropdownBefore, + dropdownAfter=dropdownAfter, + allowClear=allowClear, + autoFocus=autoFocus, + popupMatchSelectWidth=popupMatchSelectWidth, + readOnly=readOnly, + popupContainer=popupContainer, + batchPropsNames=batchPropsNames, + batchPropsValues=batchPropsValues, + loading_state=loading_state, + persistence=persistence, + persisted_props=persisted_props, + persistence_type=persistence_type, + **kwargs, + ) -- Gitee From 3657a73a45bf6ac301a3584ed67f3e0606c7cded Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 10 Sep 2024 18:02:57 +0800 Subject: [PATCH 062/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E5=8D=95=E9=80=89=E6=A1=86=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ApiRadioGroup/__init__.py | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py diff --git a/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py b/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py new file mode 100644 index 0000000..94339ea --- /dev/null +++ b/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py @@ -0,0 +1,54 @@ +from feffery_antd_components import AntdRadioGroup +from typing import Any, Dict, List, Literal, Optional, Union +from utils.dict_util import DictManager + + +class ApiRadioGroup(AntdRadioGroup): + def __init__( + self, + dict_type: str, + id: Optional[Union[str, Dict]] = None, + key: Optional[str] = None, + style: Optional[Dict] = None, + className: Optional[Union[str, Dict]] = None, + name: Optional[str] = None, + direction: Optional[Literal['horizontal', 'vertical']] = 'horizontal', + disabled: Optional[bool] = False, + size: Optional[Literal['small', 'middle', 'large']] = 'middle', + value: Optional[Any] = None, + defaultValue: Optional[Any] = None, + optionType: Optional[Literal['default', 'button']] = 'default', + buttonStyle: Optional[Literal['outline', 'solid']] = 'outline', + readOnly: Optional[bool] = False, + batchPropsNames: Optional[List] = None, + batchPropsValues: Optional[Dict] = None, + loading_state: Optional[Any] = None, + persistence: Optional[Any] = None, + persisted_props: Optional[Any] = None, + persistence_type: Optional[Any] = None, + **kwargs: Any, + ): + self.options = DictManager.get_dict_options(dict_type=dict_type)[0] + super().__init__( + id=id, + key=key, + style=style, + className=className, + name=name, + direction=direction, + options=self.options, + disabled=disabled, + size=size, + value=value, + defaultValue=defaultValue, + optionType=optionType, + buttonStyle=buttonStyle, + readOnly=readOnly, + batchPropsNames=batchPropsNames, + batchPropsValues=batchPropsValues, + loading_state=loading_state, + persistence=persistence, + persisted_props=persisted_props, + persistence_type=persistence_type, + **kwargs, + ) -- Gitee From 7b0daa84a9054b463e7fe08c22e98b6c8fd187a3 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 10 Sep 2024 18:03:09 +0800 Subject: [PATCH 063/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/config/exception.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/config/exception.py b/dash-fastapi-frontend/config/exception.py index 5f8711f..16c9c13 100644 --- a/dash-fastapi-frontend/config/exception.py +++ b/dash-fastapi-frontend/config/exception.py @@ -58,4 +58,9 @@ def global_exception_handler(error): # dash2.18版本对输出为字典形式的回调进行异常处理会报错,临时采用此方法解决 outputs_grouping = ctx.outputs_grouping if isinstance(outputs_grouping, dict): - return {key: no_update for key, value in outputs_grouping.items()} + return { + key: [no_update] * len(value) + if isinstance(value, list) and len(value) > 0 + else no_update + for key, value in outputs_grouping.items() + } -- Gitee From 2271c10ae05adfe036f6e7b650944ac50d8ebcbb Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 10 Sep 2024 18:03:40 +0800 Subject: [PATCH 064/229] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ManuallyUpload/__init__.py | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 dash-fastapi-frontend/views/components/ManuallyUpload/__init__.py diff --git a/dash-fastapi-frontend/views/components/ManuallyUpload/__init__.py b/dash-fastapi-frontend/views/components/ManuallyUpload/__init__.py new file mode 100644 index 0000000..2337fbc --- /dev/null +++ b/dash-fastapi-frontend/views/components/ManuallyUpload/__init__.py @@ -0,0 +1,116 @@ +from dash import dcc, html +import feffery_antd_components as fac +import feffery_utils_components as fuc + + +class ManuallyUpload: + def __init__(self): + pass + + def render(self): + return fuc.FefferyShadowDom( + [ + dcc.Upload( + html.Div( + html.Span( + html.Div( + html.Span( + html.Div( + [ + html.P( + fac.AntdIcon( + icon='antd-cloud-upload', + ), + className='ant-upload-drag-icon', + ), + html.P( + '用户导入', + className='ant-upload-text', + ), + html.P( + '点击或拖拽文件至此处进行上传', + className='ant-upload-hint', + ), + ], + className='ant-upload-drag-container', + ), + tabIndex='0', + role='button', + className='ant-upload ant-upload-btn', + ), + className='ant-upload ant-upload-drag', + ), + className='ant-upload-wrapper', + ), + className='ant-droag-upload-container', + ), + id='user-upload-choose', + accept='.xls,.xlsx', + ), + fuc.FefferyStyle( + rawStyle=""" + .ant-droag-upload-container { + border: 1px solid transparent; + transition: border 0.3s; + } + .ant-upload-wrapper { + box-sizing: border-box; + margin: 0; + padding: 0; + color: rgba(0, 0, 0, 0.88); + font-size: 14px; + line-height: 1.5714285714285714; + list-style: none; + font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,'Noto Sans',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji'; + } + .ant-upload-wrapper .ant-upload-drag { + position: relative; + width: 100%; + height: 100%; + text-align: center; + background: rgba(0, 0, 0, 0.02); + border: 1px dashed #d9d9d9; + border-radius: 8px; + cursor: pointer; + transition: border-color 0.3s; + } + .ant-upload-wrapper .ant-upload-drag:not(.ant-upload-disabled):hover, .ant-upload-wrapper .ant-upload-drag-hover:not(.ant-upload-disabled) { + border-color: #4096ff; + } + .ant-upload-wrapper .ant-upload-drag .ant-upload-btn { + display: table; + width: 100%; + height: 100%; + outline: none; + border-radius: 8px; + } + .ant-upload-wrapper .ant-upload-drag .ant-upload { + padding: 16px; + } + .ant-upload-wrapper .ant-upload-drag .ant-upload-drag-container { + display: table-cell; + vertical-align: middle; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-drag-icon { + margin-bottom: 16px; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-drag-icon .anticon { + color: #1677ff; + font-size: 48px; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-text { + margin: 0 0 4px; + color: rgba(0, 0, 0, 0.88); + font-size: 16px; + } + .ant-upload-wrapper .ant-upload-drag p.ant-upload-hint { + color: rgba(0, 0, 0, 0.45); + font-size: 14px; + } + .ant-upload-wrapper [class^="ant-upload"], .ant-upload-wrapper [class*=" ant-upload"] { + box-sizing: border-box; + } + """ + ), + ] + ) -- Gitee From 4b35761f4a98929c013690ba433eb403dc204320 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 10 Sep 2024 18:04:53 +0800 Subject: [PATCH 065/229] =?UTF-8?q?refactor:=20=E9=80=9A=E7=9F=A5=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E3=80=81=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E3=80=81?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97=E7=9B=B8=E5=85=B3=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E9=80=89=E6=8B=A9=E3=80=81=E5=8D=95=E9=80=89=E6=A1=86?= =?UTF-8?q?=E5=9F=BA=E4=BA=8E=E5=AD=97=E5=85=B8=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 34 +- .../callbacks/monitor_c/job_c/job_log_c.py | 24 +- .../callbacks/monitor_c/operlog_c.py | 67 ++-- .../callbacks/system_c/notice_c.py | 30 +- .../views/components/ManuallyUpload.py | 116 ------- .../views/components/__init__.py | 2 + .../views/monitor/job/__init__.py | 56 +--- .../views/monitor/job/job_log.py | 310 ++++++++---------- .../views/monitor/logininfor/__init__.py | 22 +- .../views/monitor/operlog/__init__.py | 53 +-- .../views/system/notice/__init__.py | 50 +-- 11 files changed, 234 insertions(+), 530 deletions(-) delete mode 100644 dash-fastapi-frontend/views/components/ManuallyUpload.py diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index a3ac6f3..db360ea 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -7,6 +7,7 @@ from api.monitor.job import JobApi from api.system.dict.data import DictDataApi from server import app from utils.common import validate_data_not_empty +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -63,18 +64,6 @@ def get_job_table_data( } ) if search_click or refresh_click or pagination or operations: - info = DictDataApi.get_dicts(dict_type='sys_job_group') - data = info.get('data') - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] - option_dict = {item.get('value'): item for item in option_table} - table_info = JobApi.list_job(query_params) table_data = table_info['rows'] table_pagination = dict( @@ -90,13 +79,9 @@ def get_job_table_data( item['status'] = dict(checked=True) else: item['status'] = dict(checked=False) - if str(item.get('job_group')) in option_dict.keys(): - item['job_group'] = dict( - tag=option_dict.get(str(item.get('job_group'))).get( - 'label' - ), - color='blue', - ) + item['job_group'] = DictManager.get_dict_tag( + dict_type='sys_job_group', dict_value=item.get('job_group') + ) item['key'] = str(item['job_id']) item['operation'] = [ {'title': '修改', 'icon': 'antd-edit'} @@ -606,7 +591,6 @@ def job_delete_confirm(delete_confirm, job_ids_data): job_log_job_name=Output( 'job_log-job_name-input', 'value', allow_duplicate=True ), - job_log_job_group_options=Output('job_log-job_group-select', 'options'), job_log_search_nclick=Output('job_log-search', 'nClicks'), ), inputs=dict( @@ -642,14 +626,6 @@ def job_to_job_log_modal( trigger_id == 'job-list-table' and recently_clicked_dropdown_item_title == '调度日志' ): - option_table = [] - info = DictDataApi.get_dicts(dict_type='sys_job_group') - data = info.get('data') - option_table = [ - dict(label=item.get('dict_label'), value=item.get('dict_value')) - for item in data - ] - if ( trigger_id == 'job-list-table' and recently_clicked_dropdown_item_title == '调度日志' @@ -660,7 +636,6 @@ def job_to_job_log_modal( job_log_job_name=recently_dropdown_item_clicked_row.get( 'job_name' ), - job_log_job_group_options=option_table, job_log_search_nclick=job_log_search_nclick + 1 if job_log_search_nclick else 1, @@ -670,7 +645,6 @@ def job_to_job_log_modal( job_log_modal_visible=True, job_log_modal_title='任务调度日志', job_log_job_name=None, - job_log_job_group_options=option_table, job_log_search_nclick=job_log_search_nclick + 1 if job_log_search_nclick else 1, diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index a0bc76e..9c3ac32 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -4,8 +4,8 @@ from dash import ctx, dcc from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate from api.monitor.job_log import JobLogApi -from api.system.dict.data import DictDataApi from server import app +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -76,18 +76,6 @@ def get_job_log_table_data( } ) if search_click or refresh_click or pagination or operations: - info = DictDataApi.get_dicts(dict_type='sys_job_group') - data = info.get('data') - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] - option_dict = {item.get('value'): item for item in option_table} - table_info = JobLogApi.list_job_log(query_params) table_data = table_info['rows'] table_pagination = dict( @@ -103,13 +91,9 @@ def get_job_log_table_data( item['status'] = dict(tag='成功', color='blue') else: item['status'] = dict(tag='失败', color='volcano') - if str(item.get('job_group')) in option_dict.keys(): - item['job_group'] = dict( - tag=option_dict.get(str(item.get('job_group'))).get( - 'label' - ), - color='blue', - ) + item['job_group'] = DictManager.get_dict_tag( + dict_type='sys_job_group', dict_value=item.get('job_group') + ) item['key'] = str(item['job_log_id']) item['operation'] = [ {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index 4b4cb88..9e099e1 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -4,8 +4,8 @@ from dash import ctx, dcc from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate from api.monitor.operlog import OperlogApi -from api.system.dict.data import DictDataApi from server import app +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -81,49 +81,32 @@ def get_operation_log_table_data( } ) if search_click or refresh_click or pagination or operations: - option_table = [] - info = DictDataApi.get_dicts(dict_type='sys_oper_type') - data = info.get('data') - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), + table_info = OperlogApi.list_operlog(query_params) + if table_info['code'] == 200: + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], ) - for item in data - ] - option_dict = {item.get('value'): item for item in option_table} - - table_info = OperlogApi.list_operlog(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == 0: - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - if str(item.get('business_type')) in option_dict.keys(): - item['business_type'] = dict( - tag=option_dict.get(str(item.get('business_type'))).get( - 'label' - ), - color='blue', + for item in table_data: + item['status'] = DictManager.get_dict_tag( + dict_type='sys_common_status', dict_value=item.get('status') ) - item['key'] = str(item['oper_id']) - item['cost_time'] = f"{item['cost_time']}毫秒" - item['operation'] = [ - {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} - if PermissionManager.check_perms('monitor:operlog:query') - else {}, - ] + item['business_type'] = DictManager.get_dict_tag( + dict_type='sys_oper_type', + dict_value=item.get('business_type'), + ) + item['key'] = str(item['oper_id']) + item['cost_time'] = f"{item['cost_time']}毫秒" + item['operation'] = [ + {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:operlog:query') + else {}, + ] return dict( operation_log_table_data=table_data, diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index c04a14e..7826c26 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -6,6 +6,7 @@ from api.system.dict.data import DictDataApi from api.system.notice import NoticeApi from server import app from utils.common import validate_data_not_empty +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -74,18 +75,6 @@ def get_notice_table_data( } ) if search_click or refresh_click or pagination or operations: - info = DictDataApi.get_dicts(dict_type='sys_notice_type') - data = info.get('data') - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] - option_dict = {item.get('value'): item for item in option_table} - table_info = NoticeApi.list_notice(query_params) table_data = table_info['rows'] table_pagination = dict( @@ -101,9 +90,8 @@ def get_notice_table_data( item['status'] = dict(tag='正常', color='blue') else: item['status'] = dict(tag='关闭', color='volcano') - item['notice_type'] = dict( - tag=option_dict.get(str(item.get('notice_type'))).get('label'), - color='blue', + item['notice_type'] = DictManager.get_dict_tag( + dict_type='sys_notice_type', dict_value=item.get('notice_type') ) item['key'] = str(item['notice_id']) item['operation'] = [ @@ -115,12 +103,12 @@ def get_notice_table_data( else {}, ] - return dict( - notice_table_data=table_data, - notice_table_pagination=table_pagination, - notice_table_key=str(uuid.uuid4()), - notice_table_selectedrowkeys=None, - ) + return dict( + notice_table_data=table_data, + notice_table_pagination=table_pagination, + notice_table_key=str(uuid.uuid4()), + notice_table_selectedrowkeys=None, + ) raise PreventUpdate diff --git a/dash-fastapi-frontend/views/components/ManuallyUpload.py b/dash-fastapi-frontend/views/components/ManuallyUpload.py deleted file mode 100644 index 2337fbc..0000000 --- a/dash-fastapi-frontend/views/components/ManuallyUpload.py +++ /dev/null @@ -1,116 +0,0 @@ -from dash import dcc, html -import feffery_antd_components as fac -import feffery_utils_components as fuc - - -class ManuallyUpload: - def __init__(self): - pass - - def render(self): - return fuc.FefferyShadowDom( - [ - dcc.Upload( - html.Div( - html.Span( - html.Div( - html.Span( - html.Div( - [ - html.P( - fac.AntdIcon( - icon='antd-cloud-upload', - ), - className='ant-upload-drag-icon', - ), - html.P( - '用户导入', - className='ant-upload-text', - ), - html.P( - '点击或拖拽文件至此处进行上传', - className='ant-upload-hint', - ), - ], - className='ant-upload-drag-container', - ), - tabIndex='0', - role='button', - className='ant-upload ant-upload-btn', - ), - className='ant-upload ant-upload-drag', - ), - className='ant-upload-wrapper', - ), - className='ant-droag-upload-container', - ), - id='user-upload-choose', - accept='.xls,.xlsx', - ), - fuc.FefferyStyle( - rawStyle=""" - .ant-droag-upload-container { - border: 1px solid transparent; - transition: border 0.3s; - } - .ant-upload-wrapper { - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.88); - font-size: 14px; - line-height: 1.5714285714285714; - list-style: none; - font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,'Noto Sans',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji'; - } - .ant-upload-wrapper .ant-upload-drag { - position: relative; - width: 100%; - height: 100%; - text-align: center; - background: rgba(0, 0, 0, 0.02); - border: 1px dashed #d9d9d9; - border-radius: 8px; - cursor: pointer; - transition: border-color 0.3s; - } - .ant-upload-wrapper .ant-upload-drag:not(.ant-upload-disabled):hover, .ant-upload-wrapper .ant-upload-drag-hover:not(.ant-upload-disabled) { - border-color: #4096ff; - } - .ant-upload-wrapper .ant-upload-drag .ant-upload-btn { - display: table; - width: 100%; - height: 100%; - outline: none; - border-radius: 8px; - } - .ant-upload-wrapper .ant-upload-drag .ant-upload { - padding: 16px; - } - .ant-upload-wrapper .ant-upload-drag .ant-upload-drag-container { - display: table-cell; - vertical-align: middle; - } - .ant-upload-wrapper .ant-upload-drag p.ant-upload-drag-icon { - margin-bottom: 16px; - } - .ant-upload-wrapper .ant-upload-drag p.ant-upload-drag-icon .anticon { - color: #1677ff; - font-size: 48px; - } - .ant-upload-wrapper .ant-upload-drag p.ant-upload-text { - margin: 0 0 4px; - color: rgba(0, 0, 0, 0.88); - font-size: 16px; - } - .ant-upload-wrapper .ant-upload-drag p.ant-upload-hint { - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - } - .ant-upload-wrapper [class^="ant-upload"], .ant-upload-wrapper [class*=" ant-upload"] { - box-sizing: border-box; - } - """ - ), - ] - ) diff --git a/dash-fastapi-frontend/views/components/__init__.py b/dash-fastapi-frontend/views/components/__init__.py index 9889693..0f0cf32 100644 --- a/dash-fastapi-frontend/views/components/__init__.py +++ b/dash-fastapi-frontend/views/components/__init__.py @@ -1 +1,3 @@ +from .ApiRadioGroup import ApiRadioGroup # noqa: F401 +from .ApiSelect import ApiSelect # noqa: F401 from .ManuallyUpload import ManuallyUpload # noqa: F401 diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index 368343b..75c2153 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -1,30 +1,16 @@ import feffery_antd_components as fac from dash import dcc, html from api.monitor.job import JobApi -from api.system.dict.data import DictDataApi from callbacks.monitor_c.job_c import job_c # noqa: F401 +from utils.dict_util import DictManager from utils.permission_util import PermissionManager +from views.components.ApiRadioGroup import ApiRadioGroup +from views.components.ApiSelect import ApiSelect from . import job_log def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - info = DictDataApi.get_dicts(dict_type='sys_job_group') - data = info.get('data') - option = [ - dict(label=item.get('dict_label'), value=item.get('dict_value')) - for item in data - ] - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] - option_dict = {item.get('value'): item for item in option_table} - job_params = dict(page_num=1, page_size=10) table_info = JobApi.list_job(job_params) table_data = table_info['rows'] @@ -36,11 +22,9 @@ def render(*args, **kwargs): item['status'] = dict(checked=True) else: item['status'] = dict(checked=False) - if str(item.get('job_group')) in option_dict.keys(): - item['job_group'] = dict( - tag=option_dict.get(str(item.get('job_group'))).get('label'), - color='blue', - ) + item['job_group'] = DictManager.get_dict_tag( + dict_type='sys_job_group', dict_value=item.get('job_group') + ) item['key'] = str(item['job_id']) item['operation'] = [ {'title': '修改', 'icon': 'antd-edit'} @@ -103,10 +87,10 @@ def render(*args, **kwargs): label='任务名称', ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_job_group', id='job-job_group-select', placeholder='请选择任务组名', - options=option, style={ 'width': 210 }, @@ -114,19 +98,10 @@ def render(*args, **kwargs): label='任务组名', ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_job_status', id='job-status-select', placeholder='请选择任务状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '暂停', - 'value': '1', - }, - ], style={ 'width': 200 }, @@ -450,13 +425,13 @@ def render(*args, **kwargs): ), fac.AntdCol( fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_job_group', id={ 'type': 'job-form-value', 'index': 'job_group', }, placeholder='请选择任务分组', - options=option, style={'width': '100%'}, ), id={ @@ -660,15 +635,12 @@ def render(*args, **kwargs): ), fac.AntdCol( fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_job_status', id={ 'type': 'job-form-value', 'index': 'status', }, - options=[ - {'label': '正常', 'value': '0'}, - {'label': '暂停', 'value': '1'}, - ], defaultValue='0', ), id={ diff --git a/dash-fastapi-frontend/views/monitor/job/job_log.py b/dash-fastapi-frontend/views/monitor/job/job_log.py index 9de5c81..4bccdea 100644 --- a/dash-fastapi-frontend/views/monitor/job/job_log.py +++ b/dash-fastapi-frontend/views/monitor/job/job_log.py @@ -2,6 +2,7 @@ import feffery_antd_components as fac from dash import dcc, html from callbacks.monitor_c.job_c import job_log_c # noqa: F401 from utils.permission_util import PermissionManager +from views.components.ApiSelect import ApiSelect def render(button_perms): @@ -30,22 +31,26 @@ def render(button_perms): allowClear=True, style={ 'width': 240 - } + }, ), label='任务名称', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_job_group', id='job_log-job_group-select', placeholder='请选择任务组名', - options=[], style={ 'width': 240 - } + }, ), label='任务组名', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdSelect( @@ -54,29 +59,33 @@ def render(button_perms): options=[ { 'label': '成功', - 'value': '0' + 'value': '0', }, { 'label': '失败', - 'value': '1' - } + 'value': '1', + }, ], style={ 'width': 240 - } + }, ), label='执行状态', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdDateRangePicker( id='job_log-create_time-range', style={ 'width': 240 - } + }, ), label='执行时间', - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -85,9 +94,11 @@ def render(button_perms): type='primary', icon=fac.AntdIcon( icon='antd-search' - ) + ), ), - style={'paddingBottom': '10px'}, + style={ + 'paddingBottom': '10px' + }, ), fac.AntdFormItem( fac.AntdButton( @@ -95,16 +106,18 @@ def render(button_perms): id='job_log-reset', icon=fac.AntdIcon( icon='antd-sync' - ) + ), ), - style={'paddingBottom': '10px'}, - ) + style={ + 'paddingBottom': '10px' + }, + ), ], layout='inline', ) ], id='job_log-search-form-container', - hidden=False + hidden=False, ), ) ] @@ -123,15 +136,19 @@ def render(button_perms): ], id={ 'type': 'job_log-operation-button', - 'index': 'delete' + 'index': 'delete', }, disabled=True, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if PermissionManager.check_perms('monitor:job:remove') else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -141,14 +158,18 @@ def render(button_perms): ], id={ 'type': 'job_log-operation-button', - 'index': 'clear' + 'index': 'clear', }, style={ 'color': '#ff9292', 'background': '#ffeded', - 'border-color': '#ffdbdb' - } - ) if PermissionManager.check_perms('monitor:job:remove') else [], + 'border-color': '#ffdbdb', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:remove' + ) + else [], fac.AntdButton( [ fac.AntdIcon( @@ -160,15 +181,17 @@ def render(button_perms): style={ 'color': '#ffba00', 'background': '#fff8e6', - 'border-color': '#ffe399' - } - ) if PermissionManager.check_perms('monitor:job:export') else [], + 'border-color': '#ffe399', + }, + ) + if PermissionManager.check_perms( + 'monitor:job:export' + ) + else [], ], - style={ - 'paddingBottom': '10px' - } + style={'paddingBottom': '10px'}, ), - span=16 + span=16, ), fac.AntdCol( fac.AntdSpace( @@ -182,10 +205,10 @@ def render(button_perms): ), ], id='job_log-hidden', - shape='circle' + shape='circle', ), id='job_log-hidden-tooltip', - title='隐藏搜索' + title='隐藏搜索', ) ), html.Div( @@ -197,24 +220,22 @@ def render(button_perms): ), ], id='job_log-refresh', - shape='circle' + shape='circle', ), - title='刷新' + title='刷新', ) ), ], style={ 'float': 'right', - 'paddingBottom': '10px' - } + 'paddingBottom': '10px', + }, ), span=8, - style={ - 'paddingRight': '10px' - } - ) + style={'paddingRight': '10px'}, + ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -279,7 +300,7 @@ def render(button_perms): 'renderOptions': { 'renderType': 'button' }, - } + }, ], rowSelectionType='checkbox', rowSelectionWidth=50, @@ -288,28 +309,32 @@ def render(button_perms): 'pageSize': 10, 'current': 1, 'showSizeChanger': True, - 'pageSizeOptions': [10, 30, 50, 100], + 'pageSizeOptions': [ + 10, + 30, + 50, + 100, + ], 'showQuickJumper': True, - 'total': 0 + 'total': 0, }, mode='server-side', style={ 'width': '100%', - 'padding-right': '10px' - } + 'padding-right': '10px', + }, ), - text='数据加载中' + text='数据加载中', ), ) ] ), ], - span=24 + span=24, ) ], - gutter=5 + gutter=5, ), - # 任务调度日志明细modal,表单项id使用字典类型,index与后端数据库字段一一对应 fac.AntdModal( [ @@ -322,49 +347,41 @@ def render(button_perms): fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'job_name' + 'index': 'job_name', } ), label='任务名称', required=True, id={ 'type': 'job_log-form-label', - 'index': 'job_name' + 'index': 'job_name', }, - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'job_group' + 'index': 'job_group', } ), label='任务分组', required=True, id={ 'type': 'job_log-form-label', - 'index': 'job_group' - }, - labelCol={ - 'span': 8 + 'index': 'job_group', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -373,49 +390,41 @@ def render(button_perms): fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'job_executor' + 'index': 'job_executor', } ), label='任务执行器', required=True, id={ 'type': 'job_log-form-label', - 'index': 'job_executor' + 'index': 'job_executor', }, - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'invoke_target' + 'index': 'invoke_target', } ), label='调用目标字符串', required=True, id={ 'type': 'job_log-form-label', - 'index': 'invoke_target' - }, - labelCol={ - 'span': 8 + 'index': 'invoke_target', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -424,49 +433,41 @@ def render(button_perms): fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'job_args' + 'index': 'job_args', } ), label='位置参数', required=True, id={ 'type': 'job_log-form-label', - 'index': 'job_args' + 'index': 'job_args', }, - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'job_kwargs' + 'index': 'job_kwargs', } ), label='关键字参数', required=True, id={ 'type': 'job_log-form-label', - 'index': 'job_kwargs' - }, - labelCol={ - 'span': 8 + 'index': 'job_kwargs', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -475,23 +476,19 @@ def render(button_perms): fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'job_trigger' + 'index': 'job_trigger', } ), label='任务触发器', required=True, id={ 'type': 'job_log-form-label', - 'index': 'job_trigger' + 'index': 'job_trigger', }, - labelCol={ - 'span': 4 - }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - span=24 + span=24, ), ], ), @@ -502,23 +499,19 @@ def render(button_perms): fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'job_message' + 'index': 'job_message', } ), label='日志信息', required=True, id={ 'type': 'job_log-form-label', - 'index': 'job_message' - }, - labelCol={ - 'span': 4 + 'index': 'job_message', }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - span=24 + span=24, ), ], ), @@ -529,49 +522,41 @@ def render(button_perms): fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'status' + 'index': 'status', } ), label='执行状态', required=True, id={ 'type': 'job_log-form-label', - 'index': 'status' + 'index': 'status', }, - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdFormItem( fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'create_time' + 'index': 'create_time', } ), label='执行时间', required=True, id={ 'type': 'job_log-form-label', - 'index': 'create_time' - }, - labelCol={ - 'span': 8 + 'index': 'create_time', }, - wrapperCol={ - 'span': 16 - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, ), - span=12 + span=12, ), ], - gutter=5 + gutter=5, ), fac.AntdRow( [ @@ -580,36 +565,26 @@ def render(button_perms): fac.AntdText( id={ 'type': 'job_log-form-value', - 'index': 'exception_info' + 'index': 'exception_info', } ), label='异常信息', required=True, id={ 'type': 'job_log-form-label', - 'index': 'exception_info' + 'index': 'exception_info', }, - labelCol={ - 'span': 4 - }, - wrapperCol={ - 'span': 20 - } + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - span=24 + span=24, ), ], ), ], - labelCol={ - 'span': 8 - }, - wrapperCol={ - 'span': 16 - }, - style={ - 'marginRight': '15px' - } + labelCol={'span': 8}, + wrapperCol={'span': 16}, + style={'marginRight': '15px'}, ) ], id='job_log-modal', @@ -617,7 +592,6 @@ def render(button_perms): width=850, renderFooter=False, ), - # 删除任务调度日志二次确认modal fac.AntdModal( fac.AntdText('是否确认删除?', id='job_log-delete-text'), @@ -625,6 +599,6 @@ def render(button_perms): visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), ] diff --git a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py index b26971b..45a0171 100644 --- a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py @@ -2,7 +2,9 @@ import feffery_antd_components as fac from dash import dcc, html from api.monitor.logininfor import LogininforApi from callbacks.monitor_c import logininfor_c # noqa: F401 +from utils.dict_util import DictManager from utils.permission_util import PermissionManager +from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): @@ -15,10 +17,9 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_common_status', dict_value=item.get('status') + ) item['key'] = str(item['info_id']) return [ @@ -73,19 +74,10 @@ def render(*args, **kwargs): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_common_status', id='login_log-status-select', placeholder='登录状态', - options=[ - { - 'label': '成功', - 'value': 0, - }, - { - 'label': '失败', - 'value': 1, - }, - ], style={ 'width': 240 }, diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index 49f31e0..5b809f5 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -1,29 +1,14 @@ import feffery_antd_components as fac from dash import dcc, html from api.monitor.operlog import OperlogApi -from api.system.dict.data import DictDataApi from callbacks.monitor_c import operlog_c # noqa: F401 +from utils.dict_util import DictManager from utils.permission_util import PermissionManager +from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - info = DictDataApi.get_dicts(dict_type='sys_oper_type') - data = info.get('data') - option = [ - dict(label=item.get('dict_label'), value=item.get('dict_value')) - for item in data - ] - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] - option_dict = {item.get('value'): item for item in option_table} - operation_log_params = dict(page_num=1, page_size=10) table_info = OperlogApi.list_operlog(operation_log_params) table_data = table_info['rows'] @@ -31,17 +16,12 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - if item['status'] == 0: - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - if str(item.get('business_type')) in option_dict.keys(): - item['business_type'] = dict( - tag=option_dict.get(str(item.get('business_type'))).get( - 'label' - ), - color='blue', - ) + item['status'] = DictManager.get_dict_tag( + dict_type='sys_common_status', dict_value=item.get('status') + ) + item['business_type'] = DictManager.get_dict_tag( + dict_type='sys_oper_type', dict_value=item.get('business_type') + ) item['key'] = str(item['oper_id']) item['cost_time'] = f"{item['cost_time']}毫秒" item['operation'] = [ @@ -102,10 +82,10 @@ def render(*args, **kwargs): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_oper_type', id='operation_log-business_type-select', placeholder='操作类型', - options=option, style={ 'width': 240 }, @@ -116,19 +96,10 @@ def render(*args, **kwargs): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_common_status', id='operation_log-status-select', placeholder='操作状态', - options=[ - { - 'label': '成功', - 'value': 0, - }, - { - 'label': '失败', - 'value': 1, - }, - ], style={ 'width': 240 }, diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index a3d7e31..a58af8f 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -4,30 +4,16 @@ import uuid from dash import dcc, html from flask import session from api.system.notice import NoticeApi -from api.system.dict.data import DictDataApi from callbacks.system_c import notice_c # noqa: F401 from config.global_config import ApiBaseUrlConfig +from utils.dict_util import DictManager from utils.permission_util import PermissionManager +from views.components.ApiRadioGroup import ApiRadioGroup +from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): button_perms = kwargs.get('button_perms') - info = DictDataApi.get_dicts(dict_type='sys_notice_type') - data = info.get('data') - option = [ - dict(label=item.get('dict_label'), value=item.get('dict_value')) - for item in data - ] - option_table = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - ) - for item in data - ] - option_dict = {item.get('value'): item for item in option_table} - notice_params = dict(page_num=1, page_size=10) table_info = NoticeApi.list_notice(notice_params) table_data = table_info['rows'] @@ -35,15 +21,12 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='关闭', color='volcano') - if str(item.get('notice_type')) in option_dict.keys(): - item['notice_type'] = dict( - tag=option_dict.get(str(item.get('notice_type'))).get('label'), - color='blue', - ) + item['status'] = DictManager.get_dict_tag( + dict_type='sys_notice_status', dict_value=item.get('status') + ) + item['notice_type'] = DictManager.get_dict_tag( + dict_type='sys_notice_type', dict_value=item.get('notice_type') + ) item['key'] = str(item['notice_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} @@ -105,10 +88,10 @@ def render(*args, **kwargs): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_notice_type', id='notice-notice_type-select', placeholder='公告类型', - options=option, style={ 'width': 240 }, @@ -398,9 +381,9 @@ def render(*args, **kwargs): ), fac.AntdCol( fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_notice_type', id='notice-notice_type', - options=option, style={'width': '100%'}, ), id='notice-notice_type-form-item', @@ -418,12 +401,9 @@ def render(*args, **kwargs): [ fac.AntdCol( fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_notice_status', id='notice-status', - options=[ - {'label': '正常', 'value': '0'}, - {'label': '关闭', 'value': '1'}, - ], style={'width': '100%'}, ), id='notice-status-form-item', -- Gitee From c4a11ebe732b497a54001bac347559be1f070e02 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 11 Sep 2024 09:06:35 +0800 Subject: [PATCH 066/229] =?UTF-8?q?chore:=20=E7=A7=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E7=9A=84button=5Fperms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 3 - .../callbacks/monitor_c/job_c/job_log_c.py | 2 - .../callbacks/monitor_c/online_c.py | 2 - .../views/monitor/cache/control/__init__.py | 105 ++++++++++-------- .../views/monitor/job/__init__.py | 4 +- .../views/monitor/job/job_log.py | 3 +- .../views/monitor/logininfor/__init__.py | 3 - .../views/monitor/online/__init__.py | 3 - .../views/monitor/operlog/__init__.py | 2 - .../views/monitor/server/__init__.py | 2 - .../views/system/config/__init__.py | 2 - .../views/system/dept/__init__.py | 2 - .../views/system/dict/__init__.py | 4 +- .../views/system/dict/dict_data.py | 3 +- .../views/system/menu/__init__.py | 2 - .../views/system/notice/__init__.py | 2 - .../views/system/post/__init__.py | 3 - .../views/system/role/__init__.py | 4 +- .../views/system/role/allocate_user.py | 5 +- .../system/role/component/query_form_table.py | 2 +- .../views/system/user/__init__.py | 4 +- .../views/system/user/allocate_role.py | 51 +-------- 22 files changed, 70 insertions(+), 143 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index db360ea..2303310 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -4,7 +4,6 @@ from dash import ctx, dcc, no_update from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate from api.monitor.job import JobApi -from api.system.dict.data import DictDataApi from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -31,7 +30,6 @@ from utils.permission_util import PermissionManager job_name=State('job-job_name-input', 'value'), job_group=State('job-job_group-select', 'value'), status_select=State('job-status-select', 'value'), - button_perms=State('job-button-perms-container', 'data'), ), prevent_initial_call=True, ) @@ -43,7 +41,6 @@ def get_job_table_data( job_name, job_group, status_select, - button_perms, ): """ 获取定时任务表格数据回调(进行表格相关增删查改操作后均会触发此回调) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index 9c3ac32..d57519b 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -34,7 +34,6 @@ from utils.permission_util import PermissionManager job_group=State('job_log-job_group-select', 'value'), status_select=State('job_log-status-select', 'value'), create_time_range=State('job_log-create_time-range', 'value'), - button_perms=State('job_log-button-perms-container', 'data'), ), prevent_initial_call=True, ) @@ -47,7 +46,6 @@ def get_job_log_table_data( job_group, status_select, create_time_range, - button_perms, ): """ 获取定时任务对应调度日志表格数据回调(进行表格相关增删查改操作后均会触发此回调) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py index f52de32..de513c1 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py @@ -30,7 +30,6 @@ from utils.permission_util import PermissionManager state=dict( ipaddr=State('online-ipaddr-input', 'value'), user_name=State('online-user_name-input', 'value'), - button_perms=State('online-button-perms-container', 'data'), ), prevent_initial_call=True, ) @@ -41,7 +40,6 @@ def get_online_table_data( operations, ipaddr, user_name, - button_perms, ): """ 获取在线用户表格数据回调(进行表格相关增删查改操作后均会触发此回调) diff --git a/dash-fastapi-frontend/views/monitor/cache/control/__init__.py b/dash-fastapi-frontend/views/monitor/cache/control/__init__.py index 77d959d..ba88e21 100644 --- a/dash-fastapi-frontend/views/monitor/cache/control/__init__.py +++ b/dash-fastapi-frontend/views/monitor/cache/control/__init__.py @@ -4,9 +4,7 @@ from api.monitor.cache import CacheApi from callbacks.monitor_c.cache_c import control_c # noqa: F401 - def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') cache_info_res = CacheApi.get_cache() cache_info = cache_info_res.get('data') command_stats = cache_info.get('command_stats') @@ -14,14 +12,19 @@ def render(*args, **kwargs): info = cache_info.get('info') return [ - dcc.Store(id='control-button-perms-container', data=button_perms), - dcc.Store(id='init-echarts-data-container', data=dict(command_stats=command_stats, used_memory_human=info.get('used_memory_human'))), + dcc.Store( + id='init-echarts-data-container', + data=dict( + command_stats=command_stats, + used_memory_human=info.get('used_memory_human'), + ), + ), dcc.Store(id='echarts-data-container'), dcc.Interval( id='init-echarts-interval', n_intervals=0, interval=500, - disabled=False + disabled=False, ), html.Div( [ @@ -34,82 +37,93 @@ def render(*args, **kwargs): [ fac.AntdDescriptionItem( info.get('redis_version'), - label='Redis版本' + label='Redis版本', ), fac.AntdDescriptionItem( - '单机'if info.get('redis_mode') == 'standalone' else '集群', - label='运行模式' + '单机' + if info.get('redis_mode') + == 'standalone' + else '集群', + label='运行模式', ), fac.AntdDescriptionItem( info.get('tcp_port'), - label='端口' + label='端口', ), fac.AntdDescriptionItem( info.get('connected_clients'), - label='客户端数' + label='客户端数', ), fac.AntdDescriptionItem( info.get('uptime_in_days'), - label='运行时间(天)' + label='运行时间(天)', ), fac.AntdDescriptionItem( info.get('used_memory_human'), - label='使用内存' + label='使用内存', ), fac.AntdDescriptionItem( - info.get('used_cpu_user_children'), - label='使用CPU' + info.get( + 'used_cpu_user_children' + ), + label='使用CPU', ), fac.AntdDescriptionItem( info.get('maxmemory_human'), - label='内存配置' + label='内存配置', ), fac.AntdDescriptionItem( - '否' if info.get('aof_enabled') == 0 else '是', - label='AOF是否开启' + '否' + if info.get('aof_enabled') == 0 + else '是', + label='AOF是否开启', ), fac.AntdDescriptionItem( - info.get('rdb_last_bgsave_status'), - label='RDB是否成功' + info.get( + 'rdb_last_bgsave_status' + ), + label='RDB是否成功', ), fac.AntdDescriptionItem( - db_size, - label='Key数量' + db_size, label='Key数量' ), fac.AntdDescriptionItem( f"{info.get('instantaneous_input_kbps')}kps/{info.get('instantaneous_output_kbps')}kps", - label='网络入口/出口' + label='网络入口/出口', ), ], bordered=True, column=4, labelStyle={ 'fontWeight': 600, - 'textAlign': 'center' + 'textAlign': 'center', }, style={ 'width': '100%', 'textAlign': 'center', 'marginLeft': '20px', - 'marginRight': '20px' - } + 'marginRight': '20px', + }, ) ], title=html.Div( [ fac.AntdIcon(icon='antd-desktop'), - fac.AntdText('基本信息', style={'marginLeft': '10px'}) + fac.AntdText( + '基本信息', + style={'marginLeft': '10px'}, + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=24 + span=24, ), ], - gutter=20 + gutter=20, ), fac.AntdRow( [ @@ -120,22 +134,25 @@ def render(*args, **kwargs): id='command-stats-charts-container', style={ 'height': '420px', - 'width': '100%' - } + 'width': '100%', + }, ), ], title=html.Div( [ fac.AntdIcon(icon='antd-pie-chart'), - fac.AntdText('命令统计', style={'marginLeft': '10px'}) + fac.AntdText( + '命令统计', + style={'marginLeft': '10px'}, + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=12 + span=12, ), fac.AntdCol( fac.AntdCard( @@ -144,30 +161,30 @@ def render(*args, **kwargs): id='memory-charts-container', style={ 'height': '420px', - 'width': '100%' - } + 'width': '100%', + }, ), ], title=html.Div( [ fac.AntdIcon(icon='antd-compass'), - fac.AntdText('内存信息', style={'marginLeft': '10px'}) + fac.AntdText( + '内存信息', + style={'marginLeft': '10px'}, + ), ] ), size='small', style={ 'boxShadow': 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px' - } + }, ), - span=12 + span=12, ), ], gutter=20, - style={ - 'marginTop': '20px', - 'marginBottom': '20px' - } + style={'marginTop': '20px', 'marginBottom': '20px'}, ), ], - ) + ), ] diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index 75c2153..b7a675a 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -10,7 +10,6 @@ from . import job_log def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') job_params = dict(page_num=1, page_size=10) table_info = JobApi.list_job(job_params) table_data = table_info['rows'] @@ -45,7 +44,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='job-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='job-export-complete-judge-container'), # 绑定的导出组件 @@ -678,7 +676,7 @@ def render(*args, **kwargs): ), # 任务调度日志modal fac.AntdModal( - job_log.render(button_perms), + job_log.render(), id='job_to_job_log-modal', mask=False, maskClosable=False, diff --git a/dash-fastapi-frontend/views/monitor/job/job_log.py b/dash-fastapi-frontend/views/monitor/job/job_log.py index 4bccdea..17cabc1 100644 --- a/dash-fastapi-frontend/views/monitor/job/job_log.py +++ b/dash-fastapi-frontend/views/monitor/job/job_log.py @@ -5,9 +5,8 @@ from utils.permission_util import PermissionManager from views.components.ApiSelect import ApiSelect -def render(button_perms): +def render(): return [ - dcc.Store(id='job_log-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='job_log-export-complete-judge-container'), # 绑定的导出组件 diff --git a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py index 45a0171..32415c9 100644 --- a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py @@ -8,8 +8,6 @@ from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') - login_log_params = dict(page_num=1, page_size=10) table_info = LogininforApi.list_logininfor(login_log_params) table_data = table_info['rows'] @@ -23,7 +21,6 @@ def render(*args, **kwargs): item['key'] = str(item['info_id']) return [ - dcc.Store(id='login_log-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='login_log-export-complete-judge-container'), # 绑定的导出组件 diff --git a/dash-fastapi-frontend/views/monitor/online/__init__.py b/dash-fastapi-frontend/views/monitor/online/__init__.py index 0ab396d..169994d 100644 --- a/dash-fastapi-frontend/views/monitor/online/__init__.py +++ b/dash-fastapi-frontend/views/monitor/online/__init__.py @@ -6,8 +6,6 @@ from utils.permission_util import PermissionManager def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') - online_params = dict(page_num=1, page_size=10) table_info = OnlineApi.list_online(online_params) table_data = table_info['rows'] @@ -23,7 +21,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='online-button-perms-container', data=button_perms), # 在线用户模块操作类型存储容器 dcc.Store(id='online-operations-store'), dcc.Store(id='online-operations-store-bk'), diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index 5b809f5..578dffe 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -8,7 +8,6 @@ from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') operation_log_params = dict(page_num=1, page_size=10) table_info = OperlogApi.list_operlog(operation_log_params) table_data = table_info['rows'] @@ -31,7 +30,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='operation_log-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='operation_log-export-complete-judge-container'), # 绑定的导出组件 diff --git a/dash-fastapi-frontend/views/monitor/server/__init__.py b/dash-fastapi-frontend/views/monitor/server/__init__.py index 56fd55f..e0319a6 100644 --- a/dash-fastapi-frontend/views/monitor/server/__init__.py +++ b/dash-fastapi-frontend/views/monitor/server/__init__.py @@ -4,7 +4,6 @@ from api.monitor.server import ServerApi def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') server_info_res = ServerApi.get_server() server_info = server_info_res.get('data') cpu = [ @@ -42,7 +41,6 @@ def render(*args, **kwargs): sys_files = server_info.get('sys_files') return [ - dcc.Store(id='server-button-perms-container', data=button_perms), html.Div( [ fac.AntdRow( diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index 8b1d9e9..f42b486 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -6,7 +6,6 @@ from utils.permission_util import PermissionManager def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') config_params = dict(page_num=1, page_size=10) table_info = ConfigApi.list_config(config_params) table_data = table_info['rows'] @@ -29,7 +28,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='config-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='config-export-complete-judge-container'), # 绑定的导出组件 diff --git a/dash-fastapi-frontend/views/system/dept/__init__.py b/dash-fastapi-frontend/views/system/dept/__init__.py index ec1aa09..ed67522 100644 --- a/dash-fastapi-frontend/views/system/dept/__init__.py +++ b/dash-fastapi-frontend/views/system/dept/__init__.py @@ -7,7 +7,6 @@ from utils.tree_tool import list_to_tree def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') default_expanded_row_keys = [] table_info = DeptApi.list_dept({}) table_data = table_info['data'] @@ -51,7 +50,6 @@ def render(*args, **kwargs): table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') return [ - dcc.Store(id='dept-button-perms-container', data=button_perms), # 部门管理模块操作类型存储容器 dcc.Store(id='dept-operations-store'), dcc.Store(id='dept-operations-store-bk'), diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index 1a193b7..481f25f 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -7,7 +7,6 @@ from . import dict_data def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') dict_type_params = dict(page_num=1, page_size=10) table_info = DictTypeApi.list_type(dict_type_params) table_data = table_info['rows'] @@ -34,7 +33,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='dict_type-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='dict_type-export-complete-judge-container'), # 绑定的导出组件 @@ -536,7 +534,7 @@ def render(*args, **kwargs): ), # 字典数据modal fac.AntdModal( - dict_data.render(button_perms), + dict_data.render(), id='dict_type_to_dict_data-modal', mask=False, maskClosable=False, diff --git a/dash-fastapi-frontend/views/system/dict/dict_data.py b/dash-fastapi-frontend/views/system/dict/dict_data.py index 871d445..fedef36 100644 --- a/dash-fastapi-frontend/views/system/dict/dict_data.py +++ b/dash-fastapi-frontend/views/system/dict/dict_data.py @@ -5,9 +5,8 @@ import callbacks.system_c.dict_c.dict_data_c # noqa: F401 from utils.permission_util import PermissionManager -def render(button_perms): +def render(): return [ - dcc.Store(id='dict_data-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='dict_data-export-complete-judge-container'), # 绑定的导出组件 diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index 233fb54..e2a6941 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -8,7 +8,6 @@ from views.system.menu.components.icon_category import render_icon def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') table_info = MenuApi.list_menu({}) table_data = table_info['data'] for item in table_data: @@ -49,7 +48,6 @@ def render(*args, **kwargs): table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') return [ - dcc.Store(id='menu-button-perms-container', data=button_perms), # 菜单管理模块操作类型存储容器 dcc.Store(id='menu-operations-store'), dcc.Store(id='menu-operations-store-bk'), diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index a58af8f..29bbca4 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -13,7 +13,6 @@ from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') notice_params = dict(page_num=1, page_size=10) table_info = NoticeApi.list_notice(notice_params) table_data = table_info['rows'] @@ -38,7 +37,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='notice-button-perms-container', data=button_perms), # 通知公告管理模块操作类型存储容器 dcc.Store(id='notice-operations-store'), dcc.Store(id='notice-operations-store-bk'), diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index 576c915..03a9feb 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -6,8 +6,6 @@ from utils.permission_util import PermissionManager def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') - post_params = dict(page_num=1, page_size=10) table_info = PostApi.list_post(post_params) table_data = table_info['rows'] @@ -30,7 +28,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='post-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='post-export-complete-judge-container'), # 绑定的导出组件 diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index d5a6091..771db6e 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -7,7 +7,6 @@ from . import data_scope, allocate_user def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') role_params = dict(page_num=1, page_size=10) table_info = RoleApi.list_role(role_params) table_data = table_info['rows'] @@ -95,7 +94,6 @@ def render(*args, **kwargs): ) return [ - dcc.Store(id='role-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='role-export-complete-judge-container'), # 绑定的导出组件 @@ -663,7 +661,7 @@ def render(*args, **kwargs): ), # 分配用户modal fac.AntdModal( - allocate_user.render(button_perms), + allocate_user.render(), id='role_to_allocated_user-modal', title='分配用户', mask=False, diff --git a/dash-fastapi-frontend/views/system/role/allocate_user.py b/dash-fastapi-frontend/views/system/role/allocate_user.py index 8a02887..80f88e9 100644 --- a/dash-fastapi-frontend/views/system/role/allocate_user.py +++ b/dash-fastapi-frontend/views/system/role/allocate_user.py @@ -4,9 +4,8 @@ from callbacks.system_c.role_c import allocate_user_c # noqa: F401 from .component import query_form_table -def render(button_perms): +def render(): return [ - dcc.Store(id='allocate_user-button-perms-container', data=button_perms), dcc.Store(id='allocate_user-role_id-container'), # 分配用户模块操作类型存储容器 dcc.Store( @@ -24,7 +23,6 @@ def render(button_perms): # 分配用户模块删除操作行key存储容器 dcc.Store(id='allocate_user-delete-ids-store'), query_form_table.render( - button_perms=button_perms, allocate_index='allocated', is_operation=True, ), @@ -32,7 +30,6 @@ def render(button_perms): fac.AntdModal( [ query_form_table.render( - button_perms=button_perms, allocate_index='unallocated', is_operation=False, ), diff --git a/dash-fastapi-frontend/views/system/role/component/query_form_table.py b/dash-fastapi-frontend/views/system/role/component/query_form_table.py index 731b708..7566397 100644 --- a/dash-fastapi-frontend/views/system/role/component/query_form_table.py +++ b/dash-fastapi-frontend/views/system/role/component/query_form_table.py @@ -3,7 +3,7 @@ import feffery_antd_components as fac from utils.permission_util import PermissionManager -def render(button_perms, allocate_index, is_operation): +def render(allocate_index, is_operation): table_column = [ { 'dataIndex': 'user_id', diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 2d2413d..16a0ca9 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -11,7 +11,6 @@ from . import allocate_role def render(*args, **kwargs): - button_perms = kwargs.get('button_perms') user_params = dict(page_num=1, page_size=10) tree_info = UserApi.dept_tree_select() table_info = UserApi.list_user(user_params) @@ -45,7 +44,6 @@ def render(*args, **kwargs): ] return [ - dcc.Store(id='user-button-perms-container', data=button_perms), # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 dcc.Store(id='user-export-complete-judge-container'), # 绑定的导出组件 @@ -984,7 +982,7 @@ def render(*args, **kwargs): ), # 分配角色modal fac.AntdModal( - allocate_role.render(button_perms), + allocate_role.render(), id='user_to_allocated_role-modal', title='分配角色', mask=False, diff --git a/dash-fastapi-frontend/views/system/user/allocate_role.py b/dash-fastapi-frontend/views/system/user/allocate_role.py index 1cf448d..5b0bdba 100644 --- a/dash-fastapi-frontend/views/system/user/allocate_role.py +++ b/dash-fastapi-frontend/views/system/user/allocate_role.py @@ -3,7 +3,7 @@ from dash import dcc from callbacks.system_c.user_c import allocate_role_c # noqa: F401 -def render(button_perms): +def render(): return [ dcc.Store(id='allocate_role-user_id-container'), fac.AntdTitle( @@ -127,52 +127,3 @@ def render(button_perms): ) ), ] - # return [ - # dcc.Store(id='allocate_role-button-perms-container', data=button_perms), - # dcc.Store(id='allocate_role-user_id-container'), - # # 分配角色模块操作类型存储容器 - # dcc.Store( - # id={ - # 'type': 'allocate_role-operations-container', - # 'index': 'allocated', - # } - # ), - # dcc.Store( - # id={ - # 'type': 'allocate_role-operations-container', - # 'index': 'unallocated', - # } - # ), - # # 分配角色模块删除操作行key存储容器 - # dcc.Store(id='allocate_role-delete-ids-store'), - # query_form_table.render( - # button_perms=button_perms, - # allocate_index='allocated', - # is_operation=True, - # ), - # # 添加用户表单modal - # fac.AntdModal( - # [ - # query_form_table.render( - # button_perms=button_perms, - # allocate_index='unallocated', - # is_operation=False, - # ), - # ], - # id='allocate_role-modal', - # title='选择角色', - # mask=False, - # maskClosable=False, - # width=900, - # renderFooter=True, - # okClickClose=False, - # ), - # # 取消授权二次确认modal - # fac.AntdModal( - # fac.AntdText('是否确认取消授权?', id='allocate_role-delete-text'), - # id='allocate_role-delete-confirm-modal', - # visible=False, - # title='提示', - # renderFooter=True, - # ), - # ] -- Gitee From 9af9a8e493f6728748a33f14ee3bcd0a8f3e8f53 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 11:15:30 +0800 Subject: [PATCH 067/229] chore: dash -> 2.18.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a2a1869..f35711c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ APScheduler==3.10.4 asyncmy==0.2.9 cachebox==4.1.2 -dash==2.18.0 +dash==2.18.1 DateTime==5.5 fastapi[all]==0.112.2 feffery-antd-charts==0.1.0rc5 -- Gitee From 191bddebd48a091d8bd081f74b6762c609e1d87e Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 11:15:59 +0800 Subject: [PATCH 068/229] =?UTF-8?q?perf:=20=E7=A7=BB=E9=99=A4=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/config/exception.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/dash-fastapi-frontend/config/exception.py b/dash-fastapi-frontend/config/exception.py index 16c9c13..fac1304 100644 --- a/dash-fastapi-frontend/config/exception.py +++ b/dash-fastapi-frontend/config/exception.py @@ -1,4 +1,4 @@ -from dash import set_props, ctx, no_update +from dash import set_props from utils.feedback_util import MessageManager, NotificationManager from utils.log_util import logger @@ -55,12 +55,3 @@ def global_exception_handler(error): else: logger.exception(f'[exception]{error}') NotificationManager.error(description=str(error), message='服务异常') - # dash2.18版本对输出为字典形式的回调进行异常处理会报错,临时采用此方法解决 - outputs_grouping = ctx.outputs_grouping - if isinstance(outputs_grouping, dict): - return { - key: [no_update] * len(value) - if isinstance(value, list) and len(value) > 0 - else no_update - for key, value in outputs_grouping.items() - } -- Gitee From cf8cbceabc8c399b9e26f54c504b5e7e295807c7 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 11:22:24 +0800 Subject: [PATCH 069/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8Efac0.3.x?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=96=B0=E7=89=B9=E6=80=A7=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=B2=97=E4=BD=8D=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/post_c.py | 144 ++++++++---------- .../views/system/post/__init__.py | 39 ++--- 2 files changed, 82 insertions(+), 101 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index e73af39..fd0d815 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -180,23 +180,46 @@ def change_post_delete_button_status(table_rows_selected): raise PreventUpdate +@app.callback( + [ + Output('post-form-store', 'data', allow_duplicate=True), + Output('post-form', 'values'), + ], + [ + Input('post-form-store', 'data'), + Input('post-form', 'values'), + ], + State('post-modal_type-store', 'data'), + prevent_initial_call=True, +) +def show_post_form(row_data, form_value, modal_type): + """ + 岗位表单数据双向绑定回调 + """ + trigger_id = ctx.triggered_id + if trigger_id == 'post-form-store': + return no_update, row_data + if trigger_id == 'post-form': + if modal_type == 'add': + row_data = form_value + else: + row_data.update(form_value) + return row_data, no_update + raise PreventUpdate + + @app.callback( output=dict( modal_visible=Output('post-modal', 'visible', allow_duplicate=True), modal_title=Output('post-modal', 'title'), - form_value=Output({'type': 'post-form-value', 'index': ALL}, 'value'), + form_value=Output('post-form-store', 'data', allow_duplicate=True), form_label_validate_status=Output( - {'type': 'post-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'post-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'post-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'post-form', 'helps', allow_duplicate=True ), - edit_row_info=Output('post-edit-id-store', 'data'), - modal_type=Output('post-operations-store-bk', 'data'), + modal_type=Output('post-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -229,10 +252,6 @@ def add_edit_post_modal( or trigger_id == {'index': 'edit', 'type': 'post-operation-button'} or (trigger_id == 'post-list-table' and clicked_content == '修改') ): - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'post-operation-button'}: post_info = dict( post_name=None, @@ -244,10 +263,9 @@ def add_edit_post_modal( return dict( modal_visible=True, modal_title='新增岗位', - form_value=[post_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=None, + form_value=post_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'add'}, ) elif trigger_id == { @@ -263,37 +281,22 @@ def add_edit_post_modal( return dict( modal_visible=True, modal_title='编辑岗位', - form_value=[post_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=post_info if post_info else None, + form_value=post_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'edit'}, ) - return dict( - modal_visible=no_update, - modal_title=no_update, - form_value=[no_update] * len(form_value_list), - form_label_validate_status=[no_update] * len(form_label_list), - form_label_validate_info=[no_update] * len(form_label_list), - edit_row_info=None, - modal_type=None, - ) - raise PreventUpdate @app.callback( output=dict( form_label_validate_status=Output( - {'type': 'post-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'post-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'post-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'post-form', 'helps', allow_duplicate=True ), modal_visible=Output('post-modal', 'visible'), operations=Output( @@ -302,42 +305,31 @@ def add_edit_post_modal( ), inputs=dict(confirm_trigger=Input('post-modal', 'okCounts')), state=dict( - modal_type=State('post-operations-store-bk', 'data'), - edit_row_info=State('post-edit-id-store', 'data'), - form_value=State({'type': 'post-form-value', 'index': ALL}, 'value'), + modal_type=State('post-modal_type-store', 'data'), + form_value=State('post-form-store', 'data'), form_label=State( {'type': 'post-form-label', 'index': ALL, 'required': True}, 'label' ), ), prevent_initial_call=True, ) -def post_confirm( - confirm_trigger, modal_type, edit_row_info, form_value, form_label -): +def post_confirm(confirm_trigger, modal_type, form_value, form_label): """ 新增或编辑岗位弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } + # 获取所有必填表单项对应label的index + form_label_list = [x['id']['index'] for x in ctx.states_list[-1]] + # 获取所有输入必填表单项对应的label form_label_state = { x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] + for item in [form_value.get(k) for k in form_label_list] ): - params_add = form_value_state + params_add = form_value params_edit = params_add.copy() - params_edit['post_id'] = ( - edit_row_info.get('post_id') if edit_row_info else None - ) modal_type = modal_type.get('type') if modal_type == 'add': PostApi.add_post(params_add) @@ -345,47 +337,43 @@ def post_confirm( PostApi.update_post(params_edit) if modal_type == 'add': MessageManager.success(content='新增成功') - + return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'add'}, ) if modal_type == 'edit': MessageManager.success(content='编辑成功') - + return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'edit'}, ) return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=no_update, operations=no_update, ) return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) + form_label_validate_status={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) + for k in form_label_list + }, + form_label_validate_info={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], + for k in form_label_list + }, modal_visible=no_update, operations=no_update, ) diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index 03a9feb..8818f15 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -34,9 +34,10 @@ def render(*args, **kwargs): dcc.Download(id='post-export-container'), # 岗位管理模块操作类型存储容器 dcc.Store(id='post-operations-store'), - dcc.Store(id='post-operations-store-bk'), - # 岗位管理模块修改操作行key存储容器 - dcc.Store(id='post-edit-id-store'), + # 岗位管理模块弹窗类型存储容器 + dcc.Store(id='post-modal_type-store'), + # 岗位管理模块表单数据存储容器 + dcc.Store(id='post-form-store'), # 岗位管理模块删除操作行key存储容器 dcc.Store(id='post-delete-ids-store'), fac.AntdRow( @@ -367,10 +368,7 @@ def render(*args, **kwargs): [ fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'post-form-value', - 'index': 'post_name', - }, + name='post_name', placeholder='请输入岗位名称', allowClear=True, style={'width': 350}, @@ -382,13 +380,11 @@ def render(*args, **kwargs): 'index': 'post_name', 'required': True, }, + hasFeedback=True, ), fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'post-form-value', - 'index': 'post_code', - }, + name='post_code', placeholder='请输入岗位编码', allowClear=True, style={'width': 350}, @@ -400,13 +396,11 @@ def render(*args, **kwargs): 'index': 'post_code', 'required': True, }, + hasFeedback=True, ), fac.AntdFormItem( fac.AntdInputNumber( - id={ - 'type': 'post-form-value', - 'index': 'post_sort', - }, + name='post_sort', defaultValue=0, min=0, style={'width': 350}, @@ -418,13 +412,11 @@ def render(*args, **kwargs): 'index': 'post_sort', 'required': True, }, + hasFeedback=True, ), fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'post-form-value', - 'index': 'status', - }, + name='status', options=[ {'label': '正常', 'value': '0'}, {'label': '停用', 'value': '1'}, @@ -438,13 +430,11 @@ def render(*args, **kwargs): 'index': 'status', 'required': False, }, + hasFeedback=True, ), fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'post-form-value', - 'index': 'remark', - }, + name='remark', placeholder='请输入内容', allowClear=True, mode='text-area', @@ -456,8 +446,11 @@ def render(*args, **kwargs): 'index': 'remark', 'required': False, }, + hasFeedback=True, ), ], + id='post-form', + enableBatchControl=True, labelCol={'span': 6}, wrapperCol={'span': 18}, ) -- Gitee From 45d29bcbed2633a60ebfdd342b4e6ad70829c310 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 11:45:04 +0800 Subject: [PATCH 070/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96ApiSelect?= =?UTF-8?q?=E5=92=8CApiRadioGroup=E7=BB=84=E4=BB=B6id=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/ApiRadioGroup/__init__.py | 3 ++- dash-fastapi-frontend/views/components/ApiSelect/__init__.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py b/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py index 94339ea..3b16311 100644 --- a/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py +++ b/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py @@ -1,5 +1,6 @@ from feffery_antd_components import AntdRadioGroup from typing import Any, Dict, List, Literal, Optional, Union +from uuid import uuid4 from utils.dict_util import DictManager @@ -7,7 +8,7 @@ class ApiRadioGroup(AntdRadioGroup): def __init__( self, dict_type: str, - id: Optional[Union[str, Dict]] = None, + id: Optional[Union[str, Dict]] = str(uuid4()), key: Optional[str] = None, style: Optional[Dict] = None, className: Optional[Union[str, Dict]] = None, diff --git a/dash-fastapi-frontend/views/components/ApiSelect/__init__.py b/dash-fastapi-frontend/views/components/ApiSelect/__init__.py index 8f975b5..74535e1 100644 --- a/dash-fastapi-frontend/views/components/ApiSelect/__init__.py +++ b/dash-fastapi-frontend/views/components/ApiSelect/__init__.py @@ -1,5 +1,6 @@ from feffery_antd_components import AntdSelect from typing import Any, Dict, List, Literal, Optional, Union +from uuid import uuid4 from utils.dict_util import DictManager @@ -7,7 +8,7 @@ class ApiSelect(AntdSelect): def __init__( self, dict_type: str, - id: Optional[Union[str, Dict]] = None, + id: Optional[Union[str, Dict]] = str(uuid4()), key: Optional[str] = None, style: Optional[Dict] = None, className: Optional[Union[str, Dict]] = None, -- Gitee From 1ec227aad8d125959befe0183c79990ac3f15c86 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 11:45:36 +0800 Subject: [PATCH 071/229] =?UTF-8?q?feat:=20=E5=B2=97=E4=BD=8D=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/post_c.py | 8 ++--- .../views/system/post/__init__.py | 30 +++++++------------ 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index fd0d815..4490112 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -6,6 +6,7 @@ from dash.exceptions import PreventUpdate from api.system.post import PostApi from server import app from utils.common import validate_data_not_empty +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -72,10 +73,9 @@ def get_post_table_data( total=table_info['total'], ) for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) item['key'] = str(item['post_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index 8818f15..97bcb86 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -2,7 +2,10 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.post import PostApi from callbacks.system_c import post_c # noqa: F401 +from utils.dict_util import DictManager from utils.permission_util import PermissionManager +from views.components.ApiRadioGroup import ApiRadioGroup +from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): @@ -13,10 +16,9 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) item['key'] = str(item['post_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} @@ -78,19 +80,10 @@ def render(*args, **kwargs): label='岗位名称', ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_normal_disable', id='post-status-select', placeholder='岗位状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '停用', - 'value': '1', - }, - ], style={ 'width': 200 }, @@ -415,12 +408,9 @@ def render(*args, **kwargs): hasFeedback=True, ), fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', name='status', - options=[ - {'label': '正常', 'value': '0'}, - {'label': '停用', 'value': '1'}, - ], defaultValue='0', style={'width': 350}, ), -- Gitee From db78c4848fa08f6f2e23a7c832c5a7430a5ff58c Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 11:46:21 +0800 Subject: [PATCH 072/229] =?UTF-8?q?perf:=20=E5=85=A8=E5=B1=80=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=8F=90=E7=A4=BA=E5=AE=B9=E5=99=A8=E5=92=8C=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E9=80=9A=E7=9F=A5=E4=BF=A1=E6=81=AF=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA=E7=A9=BA=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/app.py b/dash-fastapi-frontend/app.py index 8a1034a..ae38e36 100644 --- a/dash-fastapi-frontend/app.py +++ b/dash-fastapi-frontend/app.py @@ -61,9 +61,9 @@ app.layout = html.Div( centered=True, ), # 注入全局消息提示容器 - html.Div(id='global-message-container'), + fac.Fragment(id='global-message-container'), # 注入全局通知信息容器 - html.Div(id='global-notification-container'), + fac.Fragment(id='global-notification-container'), ] ) -- Gitee From 9875ac37ec503824d908a0d83429dd10363b61c5 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 21:44:41 +0800 Subject: [PATCH 073/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8Efac0.3.x?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=96=B0=E7=89=B9=E6=80=A7=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/config_c.py | 142 ++++++++---------- .../views/system/config/__init__.py | 34 ++--- 2 files changed, 75 insertions(+), 101 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 883f70e..e96fcfe 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -195,23 +195,46 @@ def change_config_delete_button_status(table_rows_selected): raise PreventUpdate +@app.callback( + [ + Output('config-form-store', 'data', allow_duplicate=True), + Output('config-form', 'values'), + ], + [ + Input('config-form-store', 'data'), + Input('config-form', 'values'), + ], + State('config-modal_type-store', 'data'), + prevent_initial_call=True, +) +def show_config_form(row_data, form_value, modal_type): + """ + 参数配置表单数据双向绑定回调 + """ + trigger_id = ctx.triggered_id + if trigger_id == 'config-form-store': + return no_update, row_data + if trigger_id == 'config-form': + if modal_type == 'add': + row_data = form_value + else: + row_data.update(form_value) + return row_data, no_update + raise PreventUpdate + + @app.callback( output=dict( modal_visible=Output('config-modal', 'visible', allow_duplicate=True), modal_title=Output('config-modal', 'title'), - form_value=Output({'type': 'config-form-value', 'index': ALL}, 'value'), + form_value=Output('config-form-store', 'data', allow_duplicate=True), form_label_validate_status=Output( - {'type': 'config-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'config-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'config-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'config-form', 'helps', allow_duplicate=True ), - edit_row_info=Output('config-edit-id-store', 'data'), - modal_type=Output('config-operations-store-bk', 'data'), + modal_type=Output('config-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -244,10 +267,6 @@ def add_edit_config_modal( or trigger_id == {'index': 'edit', 'type': 'config-operation-button'} or (trigger_id == 'config-list-table' and clicked_content == '修改') ): - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'config-operation-button'}: config_info = dict( config_name=None, @@ -259,10 +278,9 @@ def add_edit_config_modal( return dict( modal_visible=True, modal_title='新增参数', - form_value=[config_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=None, + form_value=config_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'add'}, ) elif trigger_id == { @@ -281,37 +299,22 @@ def add_edit_config_modal( return dict( modal_visible=True, modal_title='编辑参数', - form_value=[config_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=config_info if config_info else None, + form_value=config_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'edit'}, ) - return dict( - modal_visible=no_update, - modal_title=no_update, - form_value=[no_update] * len(form_value_list), - form_label_validate_status=[no_update] * len(form_label_list), - form_label_validate_info=[no_update] * len(form_label_list), - edit_row_info=None, - modal_type=None, - ) - raise PreventUpdate @app.callback( output=dict( form_label_validate_status=Output( - {'type': 'config-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'config-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'config-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'config-form', 'helps', allow_duplicate=True ), modal_visible=Output('config-modal', 'visible'), operations=Output( @@ -320,9 +323,8 @@ def add_edit_config_modal( ), inputs=dict(confirm_trigger=Input('config-modal', 'okCounts')), state=dict( - modal_type=State('config-operations-store-bk', 'data'), - edit_row_info=State('config-edit-id-store', 'data'), - form_value=State({'type': 'config-form-value', 'index': ALL}, 'value'), + modal_type=State('config-modal_type-store', 'data'), + form_value=State('config-form-store', 'data'), form_label=State( {'type': 'config-form-label', 'index': ALL, 'required': True}, 'label', @@ -330,35 +332,23 @@ def add_edit_config_modal( ), prevent_initial_call=True, ) -def config_confirm( - confirm_trigger, modal_type, edit_row_info, form_value, form_label -): +def config_confirm(confirm_trigger, modal_type, form_value, form_label): """ 新增或编辑参数设置弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - # 获取所有输出表单项对应label的index - form_label_output_list = [ - x['id']['index'] for x in ctx.outputs_list[0] - ] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } + # 获取所有必填表单项对应label的index + form_label_list = [x['id']['index'] for x in ctx.states_list[-1]] + # 获取所有输入必填表单项对应的label form_label_state = { x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] + for item in [form_value.get(k) for k in form_label_list] ): - params_add = form_value_state + params_add = form_value params_edit = params_add.copy() - params_edit['config_id'] = ( - edit_row_info.get('config_id') if edit_row_info else None - ) modal_type = modal_type.get('type') if modal_type == 'add': ConfigApi.add_config(params_add) @@ -368,10 +358,8 @@ def config_confirm( MessageManager.success(content='新增成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'add'}, ) @@ -379,34 +367,32 @@ def config_confirm( MessageManager.success(content='编辑成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'edit'}, ) return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=no_update, operations=no_update, ) return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) + form_label_validate_status={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) + for k in form_label_list + }, + form_label_validate_info={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], + for k in form_label_list + }, modal_visible=no_update, operations=no_update, ) diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index f42b486..ed132f4 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -34,9 +34,10 @@ def render(*args, **kwargs): dcc.Download(id='config-export-container'), # 参数管理模块操作类型存储容器 dcc.Store(id='config-operations-store'), - dcc.Store(id='config-operations-store-bk'), - # 参数管理模块修改操作行key存储容器 - dcc.Store(id='config-edit-id-store'), + # 参数管理模块弹窗类型存储容器 + dcc.Store(id='config-modal_type-store'), + # 参数管理模块表单数据存储容器 + dcc.Store(id='config-form-store'), # 参数管理模块删除操作行key存储容器 dcc.Store(id='config-delete-ids-store'), fac.AntdRow( @@ -414,10 +415,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'config-form-value', - 'index': 'config_name', - }, + name='config_name', placeholder='请输入参数名称', allowClear=True, style={'width': 350}, @@ -439,10 +437,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'config-form-value', - 'index': 'config_key', - }, + name='config_key', placeholder='请输入参数键名', allowClear=True, style={'width': 350}, @@ -464,10 +459,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'config-form-value', - 'index': 'config_value', - }, + name='config_value', placeholder='请输入参数键值', allowClear=True, style={'width': 350}, @@ -489,10 +481,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'config-form-value', - 'index': 'config_type', - }, + name='config_type', options=[ {'label': '是', 'value': 'Y'}, {'label': '否', 'value': 'N'}, @@ -516,10 +505,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'config-form-value', - 'index': 'remark', - }, + name='remark', placeholder='请输入内容', allowClear=True, mode='text-area', @@ -537,6 +523,8 @@ def render(*args, **kwargs): ] ), ], + id='config-form', + enableBatchControl=True, labelCol={'span': 6}, wrapperCol={'span': 18}, ) -- Gitee From 1447764c5e31b4c49aad8cbab9852cd4361b161f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 21:50:36 +0800 Subject: [PATCH 074/229] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=B3=BB=E7=BB=9F=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=BC=95=E5=85=A5=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/config_c.py | 8 ++--- .../views/system/config/__init__.py | 32 +++++++------------ 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index e96fcfe..55770c3 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -6,6 +6,7 @@ from dash.exceptions import PreventUpdate from api.system.config import ConfigApi from server import app from utils.common import validate_data_not_empty +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -85,10 +86,9 @@ def get_config_table_data( total=table_info['total'], ) for item in table_data: - if item['config_type'] == 'Y': - item['config_type'] = dict(tag='是', color='blue') - else: - item['config_type'] = dict(tag='否', color='volcano') + item['config_type'] = DictManager.get_dict_tag( + dict_type='sys_yes_no', dict_value=item.get('config_type') + ) item['key'] = str(item['config_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index ed132f4..045b79f 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -2,7 +2,10 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.config import ConfigApi from callbacks.system_c import config_c # noqa: F401 +from utils.dict_util import DictManager from utils.permission_util import PermissionManager +from views.components.ApiRadioGroup import ApiRadioGroup +from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): @@ -13,10 +16,9 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - if item['config_type'] == 'Y': - item['config_type'] = dict(tag='是', color='blue') - else: - item['config_type'] = dict(tag='否', color='volcano') + item['config_type'] = DictManager.get_dict_tag( + dict_type='sys_yes_no', dict_value=item.get('config_type') + ) item['key'] = str(item['config_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} @@ -82,19 +84,10 @@ def render(*args, **kwargs): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_yes_no', id='config-config_type-select', placeholder='系统内置', - options=[ - { - 'label': '是', - 'value': 'Y', - }, - { - 'label': '否', - 'value': 'N', - }, - ], style={ 'width': 235 }, @@ -480,13 +473,10 @@ def render(*args, **kwargs): [ fac.AntdCol( fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_yes_no', name='config_type', - options=[ - {'label': '是', 'value': 'Y'}, - {'label': '否', 'value': 'N'}, - ], - defaultValue='0', + defaultValue='Y', style={'width': 350}, ), label='系统内置', -- Gitee From ca9e6b393948e49f74ec978c3a25a8eb283f5291 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 22:15:41 +0800 Subject: [PATCH 075/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E8=B5=84=E6=96=99=E5=9B=9E=E8=B0=83=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E6=9C=AA=E5=8A=A0=E8=BD=BD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/system/user/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 16a0ca9..c750bfa 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -7,7 +7,7 @@ from config.global_config import ApiBaseUrlConfig from callbacks.system_c.user_c import user_c # noqa: F401 from utils.permission_util import PermissionManager from views.components import ManuallyUpload -from . import allocate_role +from . import allocate_role, profile # noqa: F401 def render(*args, **kwargs): -- Gitee From 039af3f4415f12c263fd465929c8bd8aead00884 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 22:35:01 +0800 Subject: [PATCH 076/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8Efac0.3.x?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=96=B0=E7=89=B9=E6=80=A7=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 144 ++++++++---------- .../callbacks/system_c/dict_c/dict_data_c.py | 144 ++++++++---------- .../views/system/dict/__init__.py | 33 ++-- .../views/system/dict/dict_data.py | 42 ++--- 4 files changed, 150 insertions(+), 213 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 9ecbf2e..e007102 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -201,27 +201,48 @@ def change_dict_type_delete_button_status(table_rows_selected): raise PreventUpdate +@app.callback( + [ + Output('dict_type-form-store', 'data', allow_duplicate=True), + Output('dict_type-form', 'values'), + ], + [ + Input('dict_type-form-store', 'data'), + Input('dict_type-form', 'values'), + ], + State('dict_type-modal_type-store', 'data'), + prevent_initial_call=True, +) +def show_dict_type_form(row_data, form_value, modal_type): + """ + 字典类型表单数据双向绑定回调 + """ + trigger_id = ctx.triggered_id + if trigger_id == 'dict_type-form-store': + return no_update, row_data + if trigger_id == 'dict_type-form': + if modal_type == 'add': + row_data = form_value + else: + row_data.update(form_value) + return row_data, no_update + raise PreventUpdate + + @app.callback( output=dict( modal_visible=Output( 'dict_type-modal', 'visible', allow_duplicate=True ), modal_title=Output('dict_type-modal', 'title'), - form_value=Output( - {'type': 'dict_type-form-value', 'index': ALL}, 'value' - ), + form_value=Output('dict_type-form-store', 'data', allow_duplicate=True), form_label_validate_status=Output( - {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'dict_type-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'dict_type-form', 'helps', allow_duplicate=True ), - edit_row_info=Output('dict_type-edit-id-store', 'data'), - modal_type=Output('dict_type-operations-store-bk', 'data'), + modal_type=Output('dict_type-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -254,10 +275,6 @@ def add_edit_dict_type_modal( or trigger_id == {'index': 'edit', 'type': 'dict_type-operation-button'} or (trigger_id == 'dict_type-list-table' and clicked_content == '修改') ): - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'dict_type-operation-button'}: dict_type_info = dict( dict_name=None, @@ -268,10 +285,9 @@ def add_edit_dict_type_modal( return dict( modal_visible=True, modal_title='新增字典类型', - form_value=[dict_type_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=None, + form_value=dict_type_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'add'}, ) elif trigger_id == { @@ -292,37 +308,22 @@ def add_edit_dict_type_modal( return dict( modal_visible=True, modal_title='编辑字典类型', - form_value=[dict_type_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=dict_type_info if dict_type_info else None, + form_value=dict_type_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'edit'}, ) - return dict( - modal_visible=no_update, - modal_title=no_update, - form_value=[no_update] * len(form_value_list), - form_label_validate_status=[no_update] * len(form_label_list), - form_label_validate_info=[no_update] * len(form_label_list), - edit_row_info=None, - modal_type=None, - ) - raise PreventUpdate @app.callback( output=dict( form_label_validate_status=Output( - {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'dict_type-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'dict_type-form', 'helps', allow_duplicate=True ), modal_visible=Output('dict_type-modal', 'visible'), operations=Output( @@ -331,11 +332,8 @@ def add_edit_dict_type_modal( ), inputs=dict(confirm_trigger=Input('dict_type-modal', 'okCounts')), state=dict( - modal_type=State('dict_type-operations-store-bk', 'data'), - edit_row_info=State('dict_type-edit-id-store', 'data'), - form_value=State( - {'type': 'dict_type-form-value', 'index': ALL}, 'value' - ), + modal_type=State('dict_type-modal_type-store', 'data'), + form_value=State('dict_type-form-store', 'data'), form_label=State( {'type': 'dict_type-form-label', 'index': ALL, 'required': True}, 'label', @@ -343,33 +341,23 @@ def add_edit_dict_type_modal( ), prevent_initial_call=True, ) -def dict_type_confirm( - confirm_trigger, modal_type, edit_row_info, form_value, form_label -): +def dict_type_confirm(confirm_trigger, modal_type, form_value, form_label): """ 新增或编字典类型弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } + # 获取所有必填表单项对应label的index + form_label_list = [x['id']['index'] for x in ctx.states_list[-1]] + # 获取所有输入必填表单项对应的label form_label_state = { x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] + for item in [form_value.get(k) for k in form_label_list] ): - params_add = form_value_state + params_add = form_value params_edit = params_add.copy() - params_edit['dict_id'] = ( - edit_row_info.get('dict_id') if edit_row_info else None - ) modal_type = modal_type.get('type') if modal_type == 'add': DictTypeApi.add_type(params_add) @@ -379,10 +367,8 @@ def dict_type_confirm( MessageManager.success(content='新增成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'add'}, ) @@ -390,34 +376,32 @@ def dict_type_confirm( MessageManager.success(content='编辑成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'edit'}, ) return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=no_update, operations=no_update, ) return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) + form_label_validate_status={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) + for k in form_label_list + }, + form_label_validate_info={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], + for k in form_label_list + }, modal_visible=no_update, operations=no_update, ) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index d0f21fa..ac733c0 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -186,27 +186,48 @@ def change_dict_data_delete_button_status(table_rows_selected): raise PreventUpdate +@app.callback( + [ + Output('dict_data-form-store', 'data', allow_duplicate=True), + Output('dict_data-form', 'values'), + ], + [ + Input('dict_data-form-store', 'data'), + Input('dict_data-form', 'values'), + ], + State('dict_data-modal_type-store', 'data'), + prevent_initial_call=True, +) +def show_dict_data_form(row_data, form_value, modal_type): + """ + 字典数据表单数据双向绑定回调 + """ + trigger_id = ctx.triggered_id + if trigger_id == 'dict_data-form-store': + return no_update, row_data + if trigger_id == 'dict_data-form': + if modal_type == 'add': + row_data = form_value + else: + row_data.update(form_value) + return row_data, no_update + raise PreventUpdate + + @app.callback( output=dict( modal_visible=Output( 'dict_data-modal', 'visible', allow_duplicate=True ), modal_title=Output('dict_data-modal', 'title'), - form_value=Output( - {'type': 'dict_data-form-value', 'index': ALL}, 'value' - ), + form_value=Output('dict_data-form-store', 'data', allow_duplicate=True), form_label_validate_status=Output( - {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'dict_data-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'dict_data-form', 'helps', allow_duplicate=True ), - edit_row_info=Output('dict_data-edit-id-store', 'data'), - modal_type=Output('dict_data-operations-store-bk', 'data'), + modal_type=Output('dict_data-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -241,10 +262,6 @@ def add_edit_dict_data_modal( or trigger_id == {'index': 'edit', 'type': 'dict_data-operation-button'} or (trigger_id == 'dict_data-list-table' and clicked_content == '修改') ): - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'dict_data-operation-button'}: dict_data_info = dict( dict_type=dict_type_select, @@ -259,10 +276,9 @@ def add_edit_dict_data_modal( return dict( modal_visible=True, modal_title='新增字典数据', - form_value=[dict_data_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=None, + form_value=dict_data_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'add'}, ) elif trigger_id == { @@ -283,37 +299,22 @@ def add_edit_dict_data_modal( return dict( modal_visible=True, modal_title='编辑字典数据', - form_value=[dict_data_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=dict_data_info if dict_data_info else None, + form_value=dict_data_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'edit'}, ) - return dict( - modal_visible=no_update, - modal_title=no_update, - form_value=[no_update] * len(form_value_list), - form_label_validate_status=[no_update] * len(form_label_list), - form_label_validate_info=[no_update] * len(form_label_list), - edit_row_info=None, - modal_type=None, - ) - raise PreventUpdate @app.callback( output=dict( form_label_validate_status=Output( - {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'dict_data-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'dict_data-form', 'helps', allow_duplicate=True ), modal_visible=Output('dict_data-modal', 'visible'), operations=Output( @@ -322,11 +323,8 @@ def add_edit_dict_data_modal( ), inputs=dict(confirm_trigger=Input('dict_data-modal', 'okCounts')), state=dict( - modal_type=State('dict_data-operations-store-bk', 'data'), - edit_row_info=State('dict_data-edit-id-store', 'data'), - form_value=State( - {'type': 'dict_data-form-value', 'index': ALL}, 'value' - ), + modal_type=State('dict_data-modal_type-store', 'data'), + form_value=State('dict_data-form-store', 'data'), form_label=State( {'type': 'dict_data-form-label', 'index': ALL, 'required': True}, 'label', @@ -334,33 +332,23 @@ def add_edit_dict_data_modal( ), prevent_initial_call=True, ) -def dict_data_confirm( - confirm_trigger, modal_type, edit_row_info, form_value, form_label -): +def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): """ 新增或编字典数据弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } + # 获取所有必填表单项对应label的index + form_label_list = [x['id']['index'] for x in ctx.states_list[-1]] + # 获取所有输入必填表单项对应的label form_label_state = { x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] + for item in [form_value.get(k) for k in form_label_list] ): - params_add = form_value_state + params_add = form_value params_edit = params_add.copy() - params_edit['dict_code'] = ( - edit_row_info.get('dict_code') if edit_row_info else None - ) modal_type = modal_type.get('type') if modal_type == 'add': DictDataApi.add_data(params_add) @@ -370,10 +358,8 @@ def dict_data_confirm( MessageManager.success('新增成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'add'}, ) @@ -381,34 +367,32 @@ def dict_data_confirm( MessageManager.success('编辑成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'edit'}, ) return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=no_update, operations=no_update, ) return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) + form_label_validate_status={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) + for k in form_label_list + }, + form_label_validate_info={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], + for k in form_label_list + }, modal_visible=no_update, operations=no_update, ) diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index 481f25f..da5743a 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -39,12 +39,13 @@ def render(*args, **kwargs): dcc.Download(id='dict_type-export-container'), # 字典管理模块操作类型存储容器 dcc.Store(id='dict_type-operations-store'), - dcc.Store(id='dict_type-operations-store-bk'), dcc.Store(id='dict_data-operations-store'), - dcc.Store(id='dict_data-operations-store-bk'), - # 字典管理模块修改操作行key存储容器 - dcc.Store(id='dict_type-edit-id-store'), - dcc.Store(id='dict_data-edit-id-store'), + # 字典管理模块弹窗类型存储容器 + dcc.Store(id='dict_type-modal_type-store'), + dcc.Store(id='dict_data-modal_type-store'), + # 字典管理模块表单数据存储容器 + dcc.Store(id='dict_type-form-store'), + dcc.Store(id='dict_data-form-store'), # 字典管理模块删除操作行key存储容器 dcc.Store(id='dict_type-delete-ids-store'), dcc.Store(id='dict_data-delete-ids-store'), @@ -415,10 +416,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_type-form-value', - 'index': 'dict_name', - }, + name='dict_name', placeholder='请输入字典名称', allowClear=True, style={'width': 350}, @@ -440,10 +438,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_type-form-value', - 'index': 'dict_type', - }, + name='dict_type', placeholder='请输入字典类型', allowClear=True, style={'width': 350}, @@ -465,10 +460,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'dict_type-form-value', - 'index': 'status', - }, + name='status', options=[ {'label': '正常', 'value': '0'}, {'label': '停用', 'value': '1'}, @@ -492,10 +484,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_type-form-value', - 'index': 'remark', - }, + name='remark', placeholder='请输入内容', allowClear=True, mode='text-area', @@ -513,6 +502,8 @@ def render(*args, **kwargs): ] ), ], + id='dict_type-form', + enableBatchControl=True, labelCol={'span': 6}, wrapperCol={'span': 18}, ) diff --git a/dash-fastapi-frontend/views/system/dict/dict_data.py b/dash-fastapi-frontend/views/system/dict/dict_data.py index fedef36..6df8959 100644 --- a/dash-fastapi-frontend/views/system/dict/dict_data.py +++ b/dash-fastapi-frontend/views/system/dict/dict_data.py @@ -358,10 +358,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_data-form-value', - 'index': 'dict_type', - }, + name='dict_type', placeholder='请输入字典类型', disabled=True, style={'width': 350}, @@ -382,10 +379,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_data-form-value', - 'index': 'dict_label', - }, + name='dict_label', placeholder='请输入数据标签', allowClear=True, style={'width': 350}, @@ -407,10 +401,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_data-form-value', - 'index': 'dict_value', - }, + name='dict_value', placeholder='请输入数据键值', allowClear=True, style={'width': 350}, @@ -432,10 +423,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_data-form-value', - 'index': 'css_class', - }, + name='css_class', placeholder='请输入样式属性', allowClear=True, style={'width': 350}, @@ -456,10 +444,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdInputNumber( - id={ - 'type': 'dict_data-form-value', - 'index': 'dict_sort', - }, + name='dict_sort', defaultValue=0, min=0, style={'width': 350}, @@ -481,10 +466,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdSelect( - id={ - 'type': 'dict_data-form-value', - 'index': 'list_class', - }, + name='list_class', placeholder='回显样式', options=[ { @@ -530,10 +512,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'dict_data-form-value', - 'index': 'status', - }, + name='status', options=[ {'label': '正常', 'value': '0'}, {'label': '停用', 'value': '1'}, @@ -557,10 +536,7 @@ def render(): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dict_data-form-value', - 'index': 'remark', - }, + name='remark', placeholder='请输入内容', allowClear=True, mode='text-area', @@ -578,6 +554,8 @@ def render(): ] ), ], + id='dict_data-form', + enableBatchControl=True, labelCol={'span': 6}, wrapperCol={'span': 18}, ) -- Gitee From ec3b2b06d771d7a87efb14a724ee8a60810cea54 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 13 Sep 2024 22:41:00 +0800 Subject: [PATCH 077/229] =?UTF-8?q?feat:=20=E5=AD=97=E5=85=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 8 ++--- .../callbacks/system_c/dict_c/dict_data_c.py | 8 ++--- .../views/system/dict/__init__.py | 30 +++++++------------ .../views/system/dict/dict_data.py | 22 ++++---------- 4 files changed, 24 insertions(+), 44 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index e007102..5e5c84f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -6,6 +6,7 @@ from dash.exceptions import PreventUpdate from api.system.dict.type import DictTypeApi from server import app from utils.common import validate_data_not_empty +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -85,10 +86,9 @@ def get_dict_type_table_data( total=table_info['total'], ) for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) item['key'] = str(item['dict_id']) item['dict_type'] = { 'content': item['dict_type'], diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index ac733c0..c0d9d37 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -6,6 +6,7 @@ from dash.exceptions import PreventUpdate from api.system.dict.data import DictDataApi from server import app from utils.common import validate_data_not_empty +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -76,10 +77,9 @@ def get_dict_data_table_data( total=table_info['total'], ) for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) item['key'] = str(item['dict_code']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index da5743a..16ec261 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -2,7 +2,10 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.dict.type import DictTypeApi from callbacks.system_c.dict_c import dict_c # noqa: F401 +from utils.dict_util import DictManager from utils.permission_util import PermissionManager +from views.components.ApiRadioGroup import ApiRadioGroup +from views.components.ApiSelect import ApiSelect from . import dict_data @@ -14,10 +17,9 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) item['key'] = str(item['dict_id']) item['dict_type'] = { 'content': item['dict_type'], @@ -91,19 +93,10 @@ def render(*args, **kwargs): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_normal_disable', id='dict_type-status-select', placeholder='字典状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '停用', - 'value': '1', - }, - ], style={ 'width': 240 }, @@ -459,12 +452,9 @@ def render(*args, **kwargs): [ fac.AntdCol( fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', name='status', - options=[ - {'label': '正常', 'value': '0'}, - {'label': '停用', 'value': '1'}, - ], defaultValue='0', style={'width': 350}, ), diff --git a/dash-fastapi-frontend/views/system/dict/dict_data.py b/dash-fastapi-frontend/views/system/dict/dict_data.py index 6df8959..c0c8f14 100644 --- a/dash-fastapi-frontend/views/system/dict/dict_data.py +++ b/dash-fastapi-frontend/views/system/dict/dict_data.py @@ -3,6 +3,8 @@ import feffery_antd_components as fac import callbacks.system_c.dict_c.dict_data_c # noqa: F401 from utils.permission_util import PermissionManager +from views.components.ApiRadioGroup import ApiRadioGroup +from views.components.ApiSelect import ApiSelect def render(): @@ -53,19 +55,10 @@ def render(): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_normal_disable', id='dict_data-status-select', placeholder='数据状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '停用', - 'value': '1', - }, - ], style={ 'width': 240 }, @@ -511,12 +504,9 @@ def render(): [ fac.AntdCol( fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', name='status', - options=[ - {'label': '正常', 'value': '0'}, - {'label': '停用', 'value': '1'}, - ], defaultValue='0', style={'width': 350}, ), -- Gitee From 6b8b773e1ac4a0d5fddc5109c75322807494e30a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 14 Sep 2024 08:36:11 +0800 Subject: [PATCH 078/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4component?= =?UTF-8?q?s=E7=9B=AE=E5=BD=95=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{views => }/components/ApiRadioGroup/__init__.py | 0 .../{views => }/components/ApiSelect/__init__.py | 0 .../{views => }/components/ManuallyUpload/__init__.py | 0 dash-fastapi-frontend/{views => }/components/__init__.py | 0 dash-fastapi-frontend/views/monitor/job/__init__.py | 4 ++-- dash-fastapi-frontend/views/monitor/job/job_log.py | 2 +- .../views/monitor/logininfor/__init__.py | 2 +- dash-fastapi-frontend/views/monitor/operlog/__init__.py | 2 +- dash-fastapi-frontend/views/system/config/__init__.py | 4 ++-- dash-fastapi-frontend/views/system/dict/__init__.py | 4 ++-- dash-fastapi-frontend/views/system/dict/dict_data.py | 9 ++++----- dash-fastapi-frontend/views/system/notice/__init__.py | 4 ++-- dash-fastapi-frontend/views/system/post/__init__.py | 4 ++-- dash-fastapi-frontend/views/system/user/__init__.py | 4 ++-- 14 files changed, 19 insertions(+), 20 deletions(-) rename dash-fastapi-frontend/{views => }/components/ApiRadioGroup/__init__.py (100%) rename dash-fastapi-frontend/{views => }/components/ApiSelect/__init__.py (100%) rename dash-fastapi-frontend/{views => }/components/ManuallyUpload/__init__.py (100%) rename dash-fastapi-frontend/{views => }/components/__init__.py (100%) diff --git a/dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py b/dash-fastapi-frontend/components/ApiRadioGroup/__init__.py similarity index 100% rename from dash-fastapi-frontend/views/components/ApiRadioGroup/__init__.py rename to dash-fastapi-frontend/components/ApiRadioGroup/__init__.py diff --git a/dash-fastapi-frontend/views/components/ApiSelect/__init__.py b/dash-fastapi-frontend/components/ApiSelect/__init__.py similarity index 100% rename from dash-fastapi-frontend/views/components/ApiSelect/__init__.py rename to dash-fastapi-frontend/components/ApiSelect/__init__.py diff --git a/dash-fastapi-frontend/views/components/ManuallyUpload/__init__.py b/dash-fastapi-frontend/components/ManuallyUpload/__init__.py similarity index 100% rename from dash-fastapi-frontend/views/components/ManuallyUpload/__init__.py rename to dash-fastapi-frontend/components/ManuallyUpload/__init__.py diff --git a/dash-fastapi-frontend/views/components/__init__.py b/dash-fastapi-frontend/components/__init__.py similarity index 100% rename from dash-fastapi-frontend/views/components/__init__.py rename to dash-fastapi-frontend/components/__init__.py diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index b7a675a..8c5deb3 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -2,10 +2,10 @@ import feffery_antd_components as fac from dash import dcc, html from api.monitor.job import JobApi from callbacks.monitor_c.job_c import job_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from views.components.ApiRadioGroup import ApiRadioGroup -from views.components.ApiSelect import ApiSelect from . import job_log diff --git a/dash-fastapi-frontend/views/monitor/job/job_log.py b/dash-fastapi-frontend/views/monitor/job/job_log.py index 17cabc1..e1da734 100644 --- a/dash-fastapi-frontend/views/monitor/job/job_log.py +++ b/dash-fastapi-frontend/views/monitor/job/job_log.py @@ -1,8 +1,8 @@ import feffery_antd_components as fac from dash import dcc, html from callbacks.monitor_c.job_c import job_log_c # noqa: F401 +from components.ApiSelect import ApiSelect from utils.permission_util import PermissionManager -from views.components.ApiSelect import ApiSelect def render(): diff --git a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py index 32415c9..f574284 100644 --- a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py @@ -2,9 +2,9 @@ import feffery_antd_components as fac from dash import dcc, html from api.monitor.logininfor import LogininforApi from callbacks.monitor_c import logininfor_c # noqa: F401 +from components.ApiSelect import ApiSelect from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index 578dffe..6bbabc4 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -2,9 +2,9 @@ import feffery_antd_components as fac from dash import dcc, html from api.monitor.operlog import OperlogApi from callbacks.monitor_c import operlog_c # noqa: F401 +from components.ApiSelect import ApiSelect from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index 045b79f..028b7b0 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -2,10 +2,10 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.config import ConfigApi from callbacks.system_c import config_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from views.components.ApiRadioGroup import ApiRadioGroup -from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index 16ec261..e643368 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -2,10 +2,10 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.dict.type import DictTypeApi from callbacks.system_c.dict_c import dict_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from views.components.ApiRadioGroup import ApiRadioGroup -from views.components.ApiSelect import ApiSelect from . import dict_data diff --git a/dash-fastapi-frontend/views/system/dict/dict_data.py b/dash-fastapi-frontend/views/system/dict/dict_data.py index c0c8f14..6e303c3 100644 --- a/dash-fastapi-frontend/views/system/dict/dict_data.py +++ b/dash-fastapi-frontend/views/system/dict/dict_data.py @@ -1,10 +1,9 @@ -from dash import dcc, html import feffery_antd_components as fac - -import callbacks.system_c.dict_c.dict_data_c # noqa: F401 +from dash import dcc, html +from callbacks.system_c.dict_c import dict_data_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from utils.permission_util import PermissionManager -from views.components.ApiRadioGroup import ApiRadioGroup -from views.components.ApiSelect import ApiSelect def render(): diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index 29bbca4..9488afd 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -5,11 +5,11 @@ from dash import dcc, html from flask import session from api.system.notice import NoticeApi from callbacks.system_c import notice_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from config.global_config import ApiBaseUrlConfig from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from views.components.ApiRadioGroup import ApiRadioGroup -from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index 97bcb86..5eb1bc1 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -2,10 +2,10 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.post import PostApi from callbacks.system_c import post_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from views.components.ApiRadioGroup import ApiRadioGroup -from views.components.ApiSelect import ApiSelect def render(*args, **kwargs): diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index c750bfa..cd369b8 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -3,10 +3,10 @@ import feffery_utils_components as fuc from dash import dcc, html from flask import session from api.system.user import UserApi -from config.global_config import ApiBaseUrlConfig from callbacks.system_c.user_c import user_c # noqa: F401 +from components import ManuallyUpload +from config.global_config import ApiBaseUrlConfig from utils.permission_util import PermissionManager -from views.components import ManuallyUpload from . import allocate_role, profile # noqa: F401 -- Gitee From 239f341cbb5239e1792218c3e7d94d0c1fd16863 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 14 Sep 2024 09:20:45 +0800 Subject: [PATCH 079/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8Efac0.3.x?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=96=B0=E7=89=B9=E6=80=A7=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dept_c.py | 146 ++++++++---------- .../views/system/dept/__init__.py | 45 ++---- 2 files changed, 79 insertions(+), 112 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 6d58341..44087d7 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -164,27 +164,48 @@ app.clientside_callback( ) +@app.callback( + [ + Output('dept-form-store', 'data', allow_duplicate=True), + Output('dept-form', 'values'), + ], + [ + Input('dept-form-store', 'data'), + Input('dept-form', 'values'), + ], + State('dept-modal_type-store', 'data'), + prevent_initial_call=True, +) +def show_dept_form(row_data, form_value, modal_type): + """ + 部门表单数据双向绑定回调 + """ + trigger_id = ctx.triggered_id + if trigger_id == 'dept-form-store': + return no_update, row_data + if trigger_id == 'dept-form': + if modal_type == 'add': + row_data = form_value + else: + row_data.update(form_value) + return row_data, no_update + raise PreventUpdate + + @app.callback( output=dict( modal_visible=Output('dept-modal', 'visible', allow_duplicate=True), modal_title=Output('dept-modal', 'title'), parent_id_div_ishidden=Output('dept-parent_id-div', 'hidden'), - parent_id_tree=Output( - {'type': 'dept-form-value', 'index': 'parent_id'}, 'treeData' - ), - form_value=Output({'type': 'dept-form-value', 'index': ALL}, 'value'), + parent_id_tree=Output('dept-tree-select', 'treeData'), + form_value=Output('dept-form-store', 'data', allow_duplicate=True), form_label_validate_status=Output( - {'type': 'dept-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'dept-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'dept-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'dept-form', 'helps', allow_duplicate=True ), - edit_row_info=Output('dept-edit-id-store', 'data'), - modal_type=Output('dept-operations-store-bk', 'data'), + modal_type=Output('dept-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -210,10 +231,6 @@ def add_edit_dept_modal( if trigger_id == {'index': 'add', 'type': 'dept-operation-button'} or ( trigger_id == 'dept-list-table' and clicked_content != '删除' ): - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[4]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[5]] if trigger_id == 'dept-list-table' and clicked_content == '修改': tree_info = DeptApi.list_dept_exclude_child( dept_id=int(recently_button_clicked_row['key']) @@ -250,10 +267,9 @@ def add_edit_dept_modal( modal_title='新增部门', parent_id_div_ishidden=False, parent_id_tree=tree_data, - form_value=[dept_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=None, + form_value=dept_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'add'}, ) elif trigger_id == 'dept-list-table' and clicked_content == '修改': @@ -265,39 +281,22 @@ def add_edit_dept_modal( modal_title='编辑部门', parent_id_div_ishidden=dept_info.get('parent_id') == 0, parent_id_tree=tree_data, - form_value=[dept_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=dept_info, + form_value=dept_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'edit'}, ) - return dict( - modal_visible=no_update, - modal_title=no_update, - parent_id_div_ishidden=no_update, - parent_id_tree=no_update, - form_value=[no_update] * len(form_value_list), - form_label_validate_status=[no_update] * len(form_label_list), - form_label_validate_info=[no_update] * len(form_label_list), - edit_row_info=None, - modal_type=None, - ) - raise PreventUpdate @app.callback( output=dict( form_label_validate_status=Output( - {'type': 'dept-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'dept-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'dept-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'dept-form', 'helps', allow_duplicate=True ), modal_visible=Output('dept-modal', 'visible'), operations=Output( @@ -306,42 +305,31 @@ def add_edit_dept_modal( ), inputs=dict(confirm_trigger=Input('dept-modal', 'okCounts')), state=dict( - modal_type=State('dept-operations-store-bk', 'data'), - edit_row_info=State('dept-edit-id-store', 'data'), - form_value=State({'type': 'dept-form-value', 'index': ALL}, 'value'), + modal_type=State('dept-modal_type-store', 'data'), + form_value=State('dept-form-store', 'data'), form_label=State( {'type': 'dept-form-label', 'index': ALL, 'required': True}, 'label' ), ), prevent_initial_call=True, ) -def dept_confirm( - confirm_trigger, modal_type, edit_row_info, form_value, form_label -): +def dept_confirm(confirm_trigger, modal_type, form_value, form_label): """ 新增或编辑部门弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } + # 获取所有必填表单项对应label的index + form_label_list = [x['id']['index'] for x in ctx.states_list[-1]] + # 获取所有输入必填表单项对应的label form_label_state = { x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] + for item in [form_value.get(k) for k in form_label_list] ): - params_add = form_value_state + params_add = form_value params_edit = params_add.copy() - params_edit['dept_id'] = ( - edit_row_info.get('dept_id') if edit_row_info else None - ) modal_type = modal_type.get('type') if modal_type == 'add': DeptApi.add_dept(params_add) @@ -351,10 +339,8 @@ def dept_confirm( MessageManager.success(content='新增成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'add'}, ) @@ -362,34 +348,32 @@ def dept_confirm( MessageManager.success(content='编辑成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'edit'}, ) return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=no_update, operations=no_update, ) return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) + form_label_validate_status={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) + for k in form_label_list + }, + form_label_validate_info={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], + for k in form_label_list + }, modal_visible=no_update, operations=no_update, ) diff --git a/dash-fastapi-frontend/views/system/dept/__init__.py b/dash-fastapi-frontend/views/system/dept/__init__.py index ed67522..8f2fc9b 100644 --- a/dash-fastapi-frontend/views/system/dept/__init__.py +++ b/dash-fastapi-frontend/views/system/dept/__init__.py @@ -52,9 +52,10 @@ def render(*args, **kwargs): return [ # 部门管理模块操作类型存储容器 dcc.Store(id='dept-operations-store'), - dcc.Store(id='dept-operations-store-bk'), - # 部门管理模块修改操作行key存储容器 - dcc.Store(id='dept-edit-id-store'), + # 部门管理模块弹窗类型存储容器 + dcc.Store(id='dept-modal_type-store'), + # 部门管理模块表单数据存储容器 + dcc.Store(id='dept-form-store'), # 部门管理模块删除操作行key存储容器 dcc.Store(id='dept-delete-ids-store'), fac.AntdRow( @@ -311,10 +312,8 @@ def render(*args, **kwargs): [ fac.AntdFormItem( fac.AntdTreeSelect( - id={ - 'type': 'dept-form-value', - 'index': 'parent_id', - }, + id='dept-tree-select', + name='parent_id', placeholder='请选择上级部门', treeData=[], treeNodeFilterProp='title', @@ -343,10 +342,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dept-form-value', - 'index': 'dept_name', - }, + name='dept_name', placeholder='请输入部门名称', allowClear=True, style={'width': '100%'}, @@ -364,10 +360,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInputNumber( - id={ - 'type': 'dept-form-value', - 'index': 'order_num', - }, + name='order_num', min=0, style={'width': '100%'}, ), @@ -389,10 +382,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dept-form-value', - 'index': 'leader', - }, + name='leader', placeholder='请输入负责人', allowClear=True, style={'width': '100%'}, @@ -409,10 +399,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dept-form-value', - 'index': 'phone', - }, + name='phone', placeholder='请输入联系电话', allowClear=True, style={'width': '100%'}, @@ -434,10 +421,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'dept-form-value', - 'index': 'email', - }, + name='email', placeholder='请输入邮箱', allowClear=True, style={'width': '100%'}, @@ -454,10 +438,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'dept-form-value', - 'index': 'status', - }, + name='status', options=[ {'label': '正常', 'value': '0'}, {'label': '停用', 'value': '1'}, @@ -478,6 +459,8 @@ def render(*args, **kwargs): gutter=5, ), ], + id='dept-form', + enableBatchControl=True, labelCol={'span': 8}, wrapperCol={'span': 16}, style={'marginRight': '15px'}, -- Gitee From 93b6173aea42d502ab7bb815df921cdc96e28b01 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 14 Sep 2024 09:23:28 +0800 Subject: [PATCH 080/229] =?UTF-8?q?feat:=20=E9=83=A8=E9=97=A8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dept_c.py | 8 ++--- .../views/system/dept/__init__.py | 30 +++++++------------ 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 44087d7..2cd4672 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -5,6 +5,7 @@ from dash.exceptions import PreventUpdate from api.system.dept import DeptApi from server import app from utils.common import validate_data_not_empty +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree, list_to_tree_select @@ -92,10 +93,9 @@ def get_dept_table_data( if PermissionManager.check_perms('system:dept:remove') else {}, ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') if fold_click: diff --git a/dash-fastapi-frontend/views/system/dept/__init__.py b/dash-fastapi-frontend/views/system/dept/__init__.py index 8f2fc9b..f0109fd 100644 --- a/dash-fastapi-frontend/views/system/dept/__init__.py +++ b/dash-fastapi-frontend/views/system/dept/__init__.py @@ -2,6 +2,9 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.dept import DeptApi from callbacks.system_c import dept_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect +from utils.dict_util import DictManager from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree @@ -43,10 +46,9 @@ def render(*args, **kwargs): if PermissionManager.check_perms('system:dept:remove') else {}, ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') return [ @@ -84,19 +86,10 @@ def render(*args, **kwargs): label='部门名称', ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_normal_disable', id='dept-status-select', placeholder='部门状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '停用', - 'value': '1', - }, - ], style={ 'width': 240 }, @@ -437,12 +430,9 @@ def render(*args, **kwargs): ), fac.AntdCol( fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', name='status', - options=[ - {'label': '正常', 'value': '0'}, - {'label': '停用', 'value': '1'}, - ], defaultValue='0', style={'width': '100%'}, ), -- Gitee From 81147e012a7f6863c752643558c8d2ae7372ddc0 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 18 Sep 2024 16:24:10 +0800 Subject: [PATCH 081/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8Efac0.3.x?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=96=B0=E7=89=B9=E6=80=A7=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/user_c/user_c.py | 465 ++++++++---------- .../views/system/user/__init__.py | 365 +++----------- 2 files changed, 265 insertions(+), 565 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 047276b..9459f25 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -230,187 +230,49 @@ def change_user_delete_button_status(table_rows_selected): @app.callback( - output=dict( - modal_visible=Output('user-add-modal', 'visible', allow_duplicate=True), - dept_tree=Output( - {'type': 'user_add-form-value', 'index': 'dept_id'}, 'treeData' - ), - form_value=Output( - {'type': 'user_add-form-value', 'index': ALL}, 'value' - ), - form_label_validate_status=Output( - {'type': 'user_add-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, - ), - form_label_validate_info=Output( - {'type': 'user_add-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, - ), - user_post=Output('user-add-post', 'value'), - user_role=Output('user-add-role', 'value'), - post_option=Output('user-add-post', 'options'), - role_option=Output('user-add-role', 'options'), - ), - inputs=dict(add_click=Input('user-add', 'nClicks')), + [ + Output('user-form-store', 'data', allow_duplicate=True), + Output('user-form', 'values'), + ], + [ + Input('user-form-store', 'data'), + Input('user-form', 'values'), + ], prevent_initial_call=True, ) -def add_user_modal(add_click): +def show_user_form(row_data, form_value): """ - 显示新增用户弹窗回调 + 用户表单数据双向绑定回调 """ - if add_click: - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] - tree_info = UserApi.dept_tree_select() - detail_info = UserApi.get_user(user_id='') - tree_data = tree_info['data'] - post_option = detail_info['posts'] - role_option = detail_info['roles'] - user_info = dict( - nick_name=None, - dept_id=None, - phonenumber=None, - email=None, - user_name=None, - password=None, - sex=None, - status='0', - remark=None, - ) - - return dict( - modal_visible=True, - dept_tree=tree_data, - form_value=[user_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - user_post=None, - user_role=None, - post_option=[ - dict(label=item['post_name'], value=item['post_id']) - for item in post_option - ], - role_option=[ - dict(label=item['role_name'], value=item['role_id']) - for item in role_option - ], - ) - - raise PreventUpdate - - -@app.callback( - output=dict( - form_label_validate_status=Output( - {'type': 'user_add-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, - ), - form_label_validate_info=Output( - {'type': 'user_add-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, - ), - modal_visible=Output('user-add-modal', 'visible', allow_duplicate=True), - operations=Output( - 'user-operations-store', 'data', allow_duplicate=True - ), - ), - inputs=dict(add_confirm=Input('user-add-modal', 'okCounts')), - state=dict( - post=State('user-add-post', 'value'), - role=State('user-add-role', 'value'), - form_value=State( - {'type': 'user_add-form-value', 'index': ALL}, 'value' - ), - form_label=State( - {'type': 'user_add-form-label', 'index': ALL, 'required': True}, - 'label', - ), - ), - prevent_initial_call=True, -) -def usr_add_confirm(add_confirm, post, role, form_value, form_label): - if add_confirm: - # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } - form_label_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-1] - } - - if all( - validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] - ): - params = form_value_state - params['post_ids'] = [int(item) for item in post] if post else [] - params['role_ids'] = [int(item) for item in role] if role else [] - UserApi.add_user(params) - MessageManager.success(content='新增成功') - - return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=False, - operations={'type': 'add'}, - ) - - return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) - else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) - else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], - modal_visible=no_update, - operations=no_update, - ) - + trigger_id = ctx.triggered_id + if trigger_id == 'user-form-store': + return no_update, row_data + if trigger_id == 'user-form': + row_data.update(form_value) + return row_data, no_update raise PreventUpdate @app.callback( output=dict( - modal_visible=Output( - 'user-edit-modal', 'visible', allow_duplicate=True - ), - dept_tree=Output( - {'type': 'user_edit-form-value', 'index': 'dept_id'}, 'treeData' - ), - form_value=Output( - {'type': 'user_edit-form-value', 'index': ALL}, 'value' + modal_visible=Output('user-modal', 'visible', allow_duplicate=True), + modal_title=Output('user-modal', 'title'), + dept_tree=Output('user-dpet-tree', 'treeData'), + post_option=Output('user-post', 'options'), + role_option=Output('user-role', 'options'), + user_name_disabled=Output('user-form-user_name', 'disabled'), + password_disabled=Output('user-form-password', 'disabled'), + user_name_password_container=Output( + 'user-user_name-password-container', 'hidden' ), + form_value=Output('user-form-store', 'data', allow_duplicate=True), form_label_validate_status=Output( - {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'user-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'user-form', 'helps', allow_duplicate=True ), - user_post=Output('user-edit-post', 'value'), - user_role=Output('user-edit-role', 'value'), - post_option=Output('user-edit-post', 'options'), - role_option=Output('user-edit-role', 'options'), - edit_row_info=Output('user-edit-id-store', 'data'), + modal_type=Output('user-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -429,7 +291,7 @@ def usr_add_confirm(add_confirm, post, role, form_value, form_label): ), prevent_initial_call=True, ) -def user_edit_modal( +def add_edit_user_modal( operation_click, dropdown_click, selected_row_keys, @@ -437,61 +299,107 @@ def user_edit_modal( recently_dropdown_item_clicked_row, ): """ - 显示编辑用户弹窗回调 + 显示新增或编辑用户弹窗回调 """ trigger_id = ctx.triggered_id - if trigger_id == {'index': 'edit', 'type': 'user-operation-button'} or ( - trigger_id == 'user-list-table' - and recently_clicked_dropdown_item_title == '修改' + if ( + trigger_id == {'index': 'add', 'type': 'user-operation-button'} + or trigger_id == {'index': 'edit', 'type': 'user-operation-button'} + or ( + trigger_id == 'user-list-table' + and recently_clicked_dropdown_item_title == '修改' + ) ): - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] - - tree_data = UserApi.dept_tree_select()['data'] - - if trigger_id == {'index': 'edit', 'type': 'user-operation-button'}: - user_id = int(selected_row_keys[0]) - else: - if recently_clicked_dropdown_item_title == '修改': - user_id = int(recently_dropdown_item_clicked_row['key']) + tree_info = UserApi.dept_tree_select() + tree_data = tree_info['data'] + if trigger_id == {'index': 'add', 'type': 'user-operation-button'}: + detail_info = UserApi.get_user(user_id='') + post_option = detail_info['posts'] + role_option = detail_info['roles'] + user_info = dict( + nick_name=None, + dept_id=None, + phonenumber=None, + email=None, + user_name=None, + password=None, + post_ids=None, + user_ids=None, + sex=None, + status='0', + remark=None, + ) + return dict( + modal_visible=True, + modal_title='新增用户', + dept_tree=tree_data, + post_option=[ + dict(label=item['post_name'], value=item['post_id']) + for item in post_option + if item + ] + or [], + role_option=[ + dict(label=item['role_name'], value=item['role_id']) + for item in role_option + if item + ] + or [], + user_name_disabled=False, + password_disabled=False, + user_name_password_container=False, + form_value=user_info, + form_label_validate_status=None, + form_label_validate_info=None, + modal_type={'type': 'add'}, + ) + elif trigger_id == { + 'index': 'edit', + 'type': 'user-operation-button', + } or ( + trigger_id == 'user-list-table' + and recently_clicked_dropdown_item_title == '修改' + ): + if trigger_id == {'index': 'edit', 'type': 'user-operation-button'}: + user_id = int(','.join(selected_row_keys)) else: - raise PreventUpdate - - edit_button_info = UserApi.get_user(user_id) - edit_button_result = edit_button_info['data'] - post_option = edit_button_info['posts'] - role_option = edit_button_info['roles'] - role_ids = edit_button_result['role_ids'] - post_ids = edit_button_result['post_ids'] - - return dict( - modal_visible=True, - dept_tree=tree_data, - form_value=[edit_button_result.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - user_post=[int(item) for item in post_ids.split(',')] - if post_ids - else [], - user_role=[int(item) for item in role_ids.split(',')] - if role_ids - else [], - post_option=[ - dict(label=item['post_name'], value=item['post_id']) - for item in post_option - if item - ] - or [], - role_option=[ - dict(label=item['role_name'], value=item['role_id']) - for item in role_option - if item - ] - or [], - edit_row_info={'user_id': user_id}, - ) + user_id = int(recently_dropdown_item_clicked_row['key']) + user_info_res = UserApi.get_user(user_id=user_id) + user_info = user_info_res['data'] + post_option = user_info_res['posts'] + role_option = user_info_res['roles'] + post_ids = user_info['post_ids'] + role_ids = user_info['role_ids'] + user_info['post_ids'] = ( + [int(item) for item in post_ids.split(',')] if post_ids else [] + ) + user_info['role_ids'] = ( + [int(item) for item in role_ids.split(',')] if role_ids else [] + ) + return dict( + modal_visible=True, + modal_title='编辑用户', + dept_tree=tree_data, + post_option=[ + dict(label=item['post_name'], value=item['post_id']) + for item in post_option + if item + ] + or [], + role_option=[ + dict(label=item['role_name'], value=item['role_id']) + for item in role_option + if item + ] + or [], + user_name_disabled=True, + password_disabled=True, + user_name_password_container=True, + form_value=user_info, + form_label_validate_status=None, + form_label_validate_info=None, + modal_type={'type': 'edit'}, + ) raise PreventUpdate @@ -499,87 +407,98 @@ def user_edit_modal( @app.callback( output=dict( form_label_validate_status=Output( - {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'user-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, - ), - modal_visible=Output( - 'user-edit-modal', 'visible', allow_duplicate=True + 'user-form', 'helps', allow_duplicate=True ), + modal_visible=Output('user-modal', 'visible'), operations=Output( 'user-operations-store', 'data', allow_duplicate=True ), ), - inputs=dict(edit_confirm=Input('user-edit-modal', 'okCounts')), + inputs=dict(confirm_trigger=Input('user-modal', 'okCounts')), state=dict( - post=State('user-edit-post', 'value'), - role=State('user-edit-role', 'value'), - edit_row_info=State('user-edit-id-store', 'data'), - form_value=State( - {'type': 'user_edit-form-value', 'index': ALL}, 'value' - ), + modal_type=State('user-modal_type-store', 'data'), + form_value=State('user-form-store', 'data'), form_label=State( - {'type': 'user_edit-form-label', 'index': ALL, 'required': True}, - 'label', + {'type': 'user-form-label', 'index': ALL, 'required': True}, 'label' ), ), prevent_initial_call=True, ) -def usr_edit_confirm( - edit_confirm, edit_row_info, post, role, form_value, form_label -): - if edit_confirm: - # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } +def user_confirm(confirm_trigger, modal_type, form_value, form_label): + """ + 新增或编辑用户弹窗确认回调,实现新增或编辑操作 + """ + if confirm_trigger: + # 获取所有必填表单项对应label的index + form_label_list = [x['id']['index'] for x in ctx.states_list[-1]] + # 获取所有输入必填表单项对应的label form_label_state = { x['id']['index']: x.get('value') for x in ctx.states_list[-1] } - if all( validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] + for item in [form_value.get(k) for k in form_label_list] ): - params = form_value_state - params['user_id'] = ( - edit_row_info.get('user_id') if edit_row_info else None + params_add = form_value + params_add['post_ids'] = ( + [int(item) for item in params_add['post_ids']] + if params_add['post_ids'] + else [] + ) + params_add['role_ids'] = ( + [int(item) for item in params_add['role_ids']] + if params_add['role_ids'] + else [] ) - params['post_ids'] = [int(item) for item in post] if post else [] - params['role_ids'] = [int(item) for item in role] if role else [] - params['role'] = [] - UserApi.update_user(params) - MessageManager.success(content='编辑成功') + params_edit = params_add.copy() + params_edit['role'] = [] + modal_type = modal_type.get('type') + if modal_type == 'add': + UserApi.add_user(params_add) + if modal_type == 'edit': + UserApi.update_user(params_edit) + if modal_type == 'add': + MessageManager.success(content='新增成功') + + return dict( + form_label_validate_status=None, + form_label_validate_info=None, + modal_visible=False, + operations={'type': 'add'}, + ) + if modal_type == 'edit': + MessageManager.success(content='编辑成功') + + return dict( + form_label_validate_status=None, + form_label_validate_info=None, + modal_visible=False, + operations={'type': 'edit'}, + ) return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), - modal_visible=False, - operations={'type': 'edit'}, + form_label_validate_status=None, + form_label_validate_info=None, + modal_visible=no_update, + operations=no_update, ) return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) + form_label_validate_status={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) + for k in form_label_list + }, + form_label_validate_info={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], + for k in form_label_list + }, modal_visible=no_update, operations=no_update, ) diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index cd369b8..f35b741 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -1,11 +1,8 @@ import feffery_antd_components as fac -import feffery_utils_components as fuc from dash import dcc, html -from flask import session from api.system.user import UserApi from callbacks.system_c.user_c import user_c # noqa: F401 from components import ManuallyUpload -from config.global_config import ApiBaseUrlConfig from utils.permission_util import PermissionManager from . import allocate_role, profile # noqa: F401 @@ -50,8 +47,10 @@ def render(*args, **kwargs): dcc.Download(id='user-export-container'), # 用户管理模块操作类型存储容器 dcc.Store(id='user-operations-store'), - # 用户管理模块修改操作行key存储容器 - dcc.Store(id='user-edit-id-store'), + # 用户管理模块弹窗类型存储容器 + dcc.Store(id='user-modal_type-store'), + # 用户管理模块表单数据存储容器 + dcc.Store(id='user-form-store'), # 用户管理模块删除操作行key存储容器 dcc.Store(id='user-delete-ids-store'), fac.AntdRow( @@ -193,7 +192,10 @@ def render(*args, **kwargs): ), '新增', ], - id='user-add', + id={ + 'type': 'user-operation-button', + 'index': 'add', + }, style={ 'color': '#1890ff', 'background': '#e8f4ff', @@ -441,7 +443,7 @@ def render(*args, **kwargs): ], gutter=5, ), - # 新增用户表单modal + # 新增和编辑用户表单modal fac.AntdModal( [ fac.AntdForm( @@ -450,10 +452,7 @@ def render(*args, **kwargs): [ fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'user_add-form-value', - 'index': 'nick_name', - }, + name='nick_name', placeholder='请输入用户昵称', allowClear=True, style={'width': 200}, @@ -461,17 +460,15 @@ def render(*args, **kwargs): label='用户昵称', required=True, id={ - 'type': 'user_add-form-label', + 'type': 'user-form-label', 'index': 'nick_name', 'required': True, }, ), fac.AntdFormItem( fac.AntdTreeSelect( - id={ - 'type': 'user_add-form-value', - 'index': 'dept_id', - }, + id='user-dpet-tree', + name='dept_id', placeholder='请选择归属部门', treeData=[], treeNodeFilterProp='title', @@ -479,7 +476,7 @@ def render(*args, **kwargs): ), label='归属部门', id={ - 'type': 'user_add-form-label', + 'type': 'user-form-label', 'index': 'dept_id', 'required': False, }, @@ -492,17 +489,14 @@ def render(*args, **kwargs): [ fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'user_add-form-value', - 'index': 'phonenumber', - }, + name='phonenumber', placeholder='请输入手机号码', allowClear=True, style={'width': 200}, ), label='手机号码', id={ - 'type': 'user_add-form-label', + 'type': 'user-form-label', 'index': 'phonenumber', 'required': False, }, @@ -510,17 +504,14 @@ def render(*args, **kwargs): ), fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'user_add-form-value', - 'index': 'email', - }, + name='email', placeholder='请输入邮箱', allowClear=True, style={'width': 200}, ), label='邮箱', id={ - 'type': 'user_add-form-label', + 'type': 'user-form-label', 'index': 'email', 'required': False, }, @@ -529,56 +520,52 @@ def render(*args, **kwargs): ], size='middle', ), - fac.AntdSpace( - [ - fac.AntdFormItem( - fac.AntdInput( + html.Div( + fac.AntdSpace( + [ + fac.AntdFormItem( + fac.AntdInput( + id='user-form-user_name', + name='user_name', + placeholder='请输入用户名称', + allowClear=True, + style={'width': 200}, + ), + label='用户名称', + required=True, id={ - 'type': 'user_add-form-value', + 'type': 'user-form-label', 'index': 'user_name', + 'required': True, }, - placeholder='请输入用户名称', - allowClear=True, - style={'width': 200}, ), - label='用户名称', - required=True, - id={ - 'type': 'user_add-form-label', - 'index': 'user_name', - 'required': True, - }, - ), - fac.AntdFormItem( - fac.AntdInput( + fac.AntdFormItem( + fac.AntdInput( + id='user-form-password', + name='password', + placeholder='请输入密码', + mode='password', + passwordUseMd5=True, + style={'width': 200}, + ), + label='用户密码', + required=True, id={ - 'type': 'user_add-form-value', + 'type': 'user-form-label', 'index': 'password', + 'required': True, }, - placeholder='请输入密码', - mode='password', - passwordUseMd5=True, - style={'width': 200}, ), - label='用户密码', - required=True, - id={ - 'type': 'user_add-form-label', - 'index': 'password', - 'required': True, - }, - ), - ], - size='middle', + ], + size='middle', + ), + id='user-user_name-password-container', ), fac.AntdSpace( [ fac.AntdFormItem( fac.AntdSelect( - id={ - 'type': 'user_add-form-value', - 'index': 'sex', - }, + name='sex', placeholder='请选择性别', options=[ {'label': '男', 'value': '0'}, @@ -589,7 +576,7 @@ def render(*args, **kwargs): ), label='用户性别', id={ - 'type': 'user_add-form-label', + 'type': 'user-form-label', 'index': 'sex', 'required': False, }, @@ -597,10 +584,7 @@ def render(*args, **kwargs): ), fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'user_add-form-value', - 'index': 'status', - }, + name='status', options=[ {'label': '正常', 'value': '0'}, {'label': '停用', 'value': '1'}, @@ -610,7 +594,7 @@ def render(*args, **kwargs): ), label='用户状态', id={ - 'type': 'user_add-form-label', + 'type': 'user-form-label', 'index': 'status', 'required': False, }, @@ -623,7 +607,8 @@ def render(*args, **kwargs): [ fac.AntdFormItem( fac.AntdSelect( - id='user-add-post', + id='user-post', + name='post_ids', placeholder='请选择岗位', options=[], mode='multiple', @@ -631,210 +616,17 @@ def render(*args, **kwargs): style={'width': 200}, ), label='岗位', - id='user-add-post-form-item', - labelCol={'offset': 4}, - ), - fac.AntdFormItem( - fac.AntdSelect( - id='user-add-role', - placeholder='请选择角色', - options=[], - mode='multiple', - optionFilterProp='label', - style={'width': 200}, - ), - label='角色', - id='user-add-role-form-item', - labelCol={'offset': 8}, - ), - ], - size='middle', - ), - fac.AntdSpace( - [ - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'user_add-form-value', - 'index': 'remark', - }, - placeholder='请输入内容', - allowClear=True, - mode='text-area', - style={'width': 490}, - ), - label='备注', id={ - 'type': 'user_add-form-label', - 'index': 'remark', + 'type': 'user-form-label', + 'index': 'post_ids', 'required': False, }, - labelCol={'offset': 2}, - ), - ] - ), - ] - ) - ], - id='user-add-modal', - title='新增用户', - mask=False, - width=650, - renderFooter=True, - okClickClose=False, - ), - # 编辑用户表单modal - fac.AntdModal( - [ - fac.AntdForm( - [ - fac.AntdSpace( - [ - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'user_edit-form-value', - 'index': 'nick_name', - }, - placeholder='请输入用户昵称', - allowClear=True, - style={'width': 200}, - ), - label='用户昵称', - required=True, - id={ - 'type': 'user_edit-form-label', - 'index': 'nick_name', - 'required': True, - }, - ), - fac.AntdFormItem( - fac.AntdTreeSelect( - id={ - 'type': 'user_edit-form-value', - 'index': 'dept_id', - }, - placeholder='请选择归属部门', - treeData=[], - treeNodeFilterProp='title', - style={'width': 200}, - ), - label='归属部门', - id={ - 'type': 'user_edit-form-label', - 'index': 'dept_id', - 'required': False, - }, - ), - ], - size='middle', - ), - fac.AntdSpace( - [ - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'user_edit-form-value', - 'index': 'phonenumber', - }, - placeholder='请输入手机号码', - allowClear=True, - style={'width': 200}, - ), - label='手机号码', - id={ - 'type': 'user_edit-form-label', - 'index': 'phonenumber', - 'required': False, - }, - labelCol={'offset': 1}, - ), - fac.AntdFormItem( - fac.AntdInput( - id={ - 'type': 'user_edit-form-value', - 'index': 'email', - }, - placeholder='请输入邮箱', - allowClear=True, - style={'width': 200}, - ), - label='邮箱', - id={ - 'type': 'user_edit-form-label', - 'index': 'email', - 'required': False, - }, - labelCol={'offset': 4}, - ), - ], - size='middle', - ), - fac.AntdSpace( - [ - fac.AntdFormItem( - fac.AntdSelect( - id={ - 'type': 'user_edit-form-value', - 'index': 'sex', - }, - placeholder='请选择性别', - options=[ - {'label': '男', 'value': '0'}, - {'label': '女', 'value': '1'}, - {'label': '未知', 'value': '2'}, - ], - style={'width': 200}, - ), - label='用户性别', - id={ - 'type': 'user_edit-form-label', - 'index': 'sex', - 'required': False, - }, - labelCol={'offset': 1}, - ), - fac.AntdFormItem( - fac.AntdRadioGroup( - id={ - 'type': 'user_edit-form-value', - 'index': 'status', - }, - options=[ - {'label': '正常', 'value': '0'}, - {'label': '停用', 'value': '1'}, - ], - style={'width': 200}, - ), - label='用户状态', - id={ - 'type': 'user_edit-form-label', - 'index': 'status', - 'required': False, - }, - labelCol={'offset': 1}, - ), - ], - size='middle', - ), - fac.AntdSpace( - [ - fac.AntdFormItem( - fac.AntdSelect( - id='user-edit-post', - placeholder='请选择岗位', - options=[], - mode='multiple', - optionFilterProp='label', - style={'width': 200}, - ), - label='岗位', - id='user-edit-post-form-item', labelCol={'offset': 4}, ), fac.AntdFormItem( fac.AntdSelect( - id='user-edit-role', + id='user-role', + name='role_ids', placeholder='请选择角色', options=[], mode='multiple', @@ -842,8 +634,12 @@ def render(*args, **kwargs): style={'width': 200}, ), label='角色', - id='user-edit-role-form-item', - labelCol={'offset': 7}, + id={ + 'type': 'user-form-label', + 'index': 'role_ids', + 'required': False, + }, + labelCol={'offset': 8}, ), ], size='middle', @@ -852,18 +648,15 @@ def render(*args, **kwargs): [ fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'user_edit-form-value', - 'index': 'remark', - }, + name='remark', placeholder='请输入内容', allowClear=True, mode='text-area', - style={'width': 485}, + style={'width': 490}, ), label='备注', id={ - 'type': 'user_edit-form-label', + 'type': 'user-form-label', 'index': 'remark', 'required': False, }, @@ -871,11 +664,12 @@ def render(*args, **kwargs): ), ] ), - ] + ], + id='user-form', + enableBatchControl=True, ) ], - id='user-edit-modal', - title='编辑用户', + id='user-modal', mask=False, width=650, renderFooter=True, @@ -896,19 +690,6 @@ def render(*args, **kwargs): html.Div( [ ManuallyUpload().render(), - # fac.AntdDraggerUpload( - # id='user-upload-choose', - # apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', - # downloadUrlFromBackend=True, - # headers={ - # 'Authorization': 'Bearer ' - # + session.get('Authorization') - # }, - # fileTypes=['xls', 'xlsx'], - # fileListMaxLength=1, - # text='用户导入', - # hint='点击或拖拽文件至此处进行上传', - # ), ], style={'marginTop': '10px'}, ), -- Gitee From a3c6903fc65e3dcbbdf3c47ca23d61658df275ce Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 18 Sep 2024 16:31:47 +0800 Subject: [PATCH 082/229] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=92=8C=E6=80=A7?= =?UTF-8?q?=E5=88=AB=E5=AD=97=E6=AE=B5=E5=BC=95=E5=85=A5=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/system/user/__init__.py | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index f35b741..ba90e15 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -3,6 +3,8 @@ from dash import dcc, html from api.system.user import UserApi from callbacks.system_c.user_c import user_c # noqa: F401 from components import ManuallyUpload +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from utils.permission_util import PermissionManager from . import allocate_role, profile # noqa: F401 @@ -111,19 +113,10 @@ def render(*args, **kwargs): label='手机号码', ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_normal_disable', id='user-status-select', placeholder='用户状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '停用', - 'value': '1', - }, - ], style={ 'width': 240 }, @@ -564,14 +557,10 @@ def render(*args, **kwargs): fac.AntdSpace( [ fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_user_sex', name='sex', placeholder='请选择性别', - options=[ - {'label': '男', 'value': '0'}, - {'label': '女', 'value': '1'}, - {'label': '未知', 'value': '2'}, - ], style={'width': 200}, ), label='用户性别', @@ -583,12 +572,9 @@ def render(*args, **kwargs): labelCol={'offset': 1}, ), fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', name='status', - options=[ - {'label': '正常', 'value': '0'}, - {'label': '停用', 'value': '1'}, - ], defaultValue='0', style={'width': 200}, ), -- Gitee From 33b0b0847e805161a0e4eb8abc343437b51d0242 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 18 Sep 2024 22:28:19 +0800 Subject: [PATCH 083/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=8F=8C=E5=90=91=E7=BB=91=E5=AE=9A=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/post_c.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 4490112..8408e80 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -189,10 +189,9 @@ def change_post_delete_button_status(table_rows_selected): Input('post-form-store', 'data'), Input('post-form', 'values'), ], - State('post-modal_type-store', 'data'), prevent_initial_call=True, ) -def show_post_form(row_data, form_value, modal_type): +def show_post_form(row_data, form_value): """ 岗位表单数据双向绑定回调 """ @@ -200,10 +199,7 @@ def show_post_form(row_data, form_value, modal_type): if trigger_id == 'post-form-store': return no_update, row_data if trigger_id == 'post-form': - if modal_type == 'add': - row_data = form_value - else: - row_data.update(form_value) + row_data.update(form_value) return row_data, no_update raise PreventUpdate -- Gitee From 135392c6e92e3d73a8a07f65dc331bcabad02173 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 18 Sep 2024 22:28:25 +0800 Subject: [PATCH 084/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=8F=8C=E5=90=91=E7=BB=91=E5=AE=9A=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/dept_c.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 2cd4672..14e33fc 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -173,10 +173,9 @@ app.clientside_callback( Input('dept-form-store', 'data'), Input('dept-form', 'values'), ], - State('dept-modal_type-store', 'data'), prevent_initial_call=True, ) -def show_dept_form(row_data, form_value, modal_type): +def show_dept_form(row_data, form_value): """ 部门表单数据双向绑定回调 """ @@ -184,10 +183,7 @@ def show_dept_form(row_data, form_value, modal_type): if trigger_id == 'dept-form-store': return no_update, row_data if trigger_id == 'dept-form': - if modal_type == 'add': - row_data = form_value - else: - row_data.update(form_value) + row_data.update(form_value) return row_data, no_update raise PreventUpdate -- Gitee From 6b2e3bb99ee47396113dbc87b8b31c8b200877f9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 18 Sep 2024 22:28:32 +0800 Subject: [PATCH 085/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=8F=8C=E5=90=91=E7=BB=91=E5=AE=9A=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/config_c.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 55770c3..ff63212 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -204,10 +204,9 @@ def change_config_delete_button_status(table_rows_selected): Input('config-form-store', 'data'), Input('config-form', 'values'), ], - State('config-modal_type-store', 'data'), prevent_initial_call=True, ) -def show_config_form(row_data, form_value, modal_type): +def show_config_form(row_data, form_value): """ 参数配置表单数据双向绑定回调 """ @@ -215,10 +214,7 @@ def show_config_form(row_data, form_value, modal_type): if trigger_id == 'config-form-store': return no_update, row_data if trigger_id == 'config-form': - if modal_type == 'add': - row_data = form_value - else: - row_data.update(form_value) + row_data.update(form_value) return row_data, no_update raise PreventUpdate -- Gitee From 78980d08b134e4b638c9163f9f19aa0a39276319 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 18 Sep 2024 22:28:46 +0800 Subject: [PATCH 086/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=8F=8C=E5=90=91=E7=BB=91=E5=AE=9A=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py | 8 ++------ .../callbacks/system_c/dict_c/dict_data_c.py | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 5e5c84f..7d1eba2 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -210,10 +210,9 @@ def change_dict_type_delete_button_status(table_rows_selected): Input('dict_type-form-store', 'data'), Input('dict_type-form', 'values'), ], - State('dict_type-modal_type-store', 'data'), prevent_initial_call=True, ) -def show_dict_type_form(row_data, form_value, modal_type): +def show_dict_type_form(row_data, form_value): """ 字典类型表单数据双向绑定回调 """ @@ -221,10 +220,7 @@ def show_dict_type_form(row_data, form_value, modal_type): if trigger_id == 'dict_type-form-store': return no_update, row_data if trigger_id == 'dict_type-form': - if modal_type == 'add': - row_data = form_value - else: - row_data.update(form_value) + row_data.update(form_value) return row_data, no_update raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index c0d9d37..6e4747b 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -195,10 +195,9 @@ def change_dict_data_delete_button_status(table_rows_selected): Input('dict_data-form-store', 'data'), Input('dict_data-form', 'values'), ], - State('dict_data-modal_type-store', 'data'), prevent_initial_call=True, ) -def show_dict_data_form(row_data, form_value, modal_type): +def show_dict_data_form(row_data, form_value): """ 字典数据表单数据双向绑定回调 """ @@ -206,10 +205,7 @@ def show_dict_data_form(row_data, form_value, modal_type): if trigger_id == 'dict_data-form-store': return no_update, row_data if trigger_id == 'dict_data-form': - if modal_type == 'add': - row_data = form_value - else: - row_data.update(form_value) + row_data.update(form_value) return row_data, no_update raise PreventUpdate -- Gitee From 2d539538a6ab66247fc5e55d97981ca090d74864 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 18 Sep 2024 23:23:04 +0800 Subject: [PATCH 087/229] =?UTF-8?q?feat:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/system/role/__init__.py | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index 771db6e..32c5995 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -2,6 +2,8 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.role import RoleApi from callbacks.system_c.role_c import role_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup +from components.ApiSelect import ApiSelect from utils.permission_util import PermissionManager from . import data_scope, allocate_user @@ -153,19 +155,10 @@ def render(*args, **kwargs): }, ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_normal_disable', id='role-status-select', placeholder='角色状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '停用', - 'value': '1', - }, - ], style={ 'width': 220 }, @@ -532,16 +525,13 @@ def render(*args, **kwargs): wrapperCol={'span': 18}, ), fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', id={ 'type': 'role-form-value', 'index': 'status', 'required': False, }, - options=[ - {'label': '正常', 'value': '0'}, - {'label': '停用', 'value': '1'}, - ], style={'width': 350}, ), label='状态', -- Gitee From 95d13dd3cef1ab81de26cce833c4287dd592e270 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 12:54:00 +0800 Subject: [PATCH 088/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8Efac0.3.x?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=96=B0=E7=89=B9=E6=80=A7=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=A8=A1=E5=9D=97=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 145 ++++++++---------- .../callbacks/monitor_c/job_c/job_log_c.py | 18 ++- .../views/monitor/job/__init__.py | 54 ++----- .../views/monitor/job/job_log.py | 4 +- 4 files changed, 96 insertions(+), 125 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 2303310..b5acf60 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -193,23 +193,42 @@ def change_job_delete_button_status(table_rows_selected): raise PreventUpdate +@app.callback( + [ + Output('job-form-store', 'data', allow_duplicate=True), + Output('job-form', 'values'), + ], + [ + Input('job-form-store', 'data'), + Input('job-form', 'values'), + ], + prevent_initial_call=True, +) +def show_job_form(row_data, form_value): + """ + 定时任务表单数据双向绑定回调 + """ + trigger_id = ctx.triggered_id + if trigger_id == 'job-form-store': + return no_update, row_data + if trigger_id == 'job-form': + row_data.update(form_value) + return row_data, no_update + raise PreventUpdate + + @app.callback( output=dict( modal_visible=Output('job-modal', 'visible', allow_duplicate=True), modal_title=Output('job-modal', 'title'), - form_value=Output({'type': 'job-form-value', 'index': ALL}, 'value'), + form_value=Output('job-form-store', 'data', allow_duplicate=True), form_label_validate_status=Output( - {'type': 'job-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'job-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'job-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'job-form', 'helps', allow_duplicate=True ), - edit_row_info=Output('job-edit-id-store', 'data'), - modal_type=Output('job-operations-store-bk', 'data'), + modal_type=Output('job-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -247,10 +266,6 @@ def add_edit_job_modal( and recently_clicked_dropdown_item_title == '修改' ) ): - # 获取所有输出表单项对应value的index - form_value_list = [x['id']['index'] for x in ctx.outputs_list[2]] - # 获取所有输出表单项对应label的index - form_label_list = [x['id']['index'] for x in ctx.outputs_list[3]] if trigger_id == {'index': 'add', 'type': 'job-operation-button'}: job_info = dict( job_name=None, @@ -266,10 +281,9 @@ def add_edit_job_modal( return dict( modal_visible=True, modal_title='新增任务', - form_value=[job_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=None, + form_value=job_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'add'}, ) elif trigger_id == { @@ -288,79 +302,53 @@ def add_edit_job_modal( return dict( modal_visible=True, modal_title='编辑任务', - form_value=[job_info.get(k) for k in form_value_list], - form_label_validate_status=[None] * len(form_label_list), - form_label_validate_info=[None] * len(form_label_list), - edit_row_info=job_info if job_info else None, + form_value=job_info, + form_label_validate_status=None, + form_label_validate_info=None, modal_type={'type': 'edit'}, ) - return dict( - modal_visible=no_update, - modal_title=no_update, - form_value=[no_update] * len(form_value_list), - form_label_validate_status=[no_update] * len(form_label_list), - form_label_validate_info=[no_update] * len(form_label_list), - edit_row_info=None, - modal_type=None, - ) - raise PreventUpdate @app.callback( output=dict( form_label_validate_status=Output( - {'type': 'job-form-label', 'index': ALL, 'required': True}, - 'validateStatus', - allow_duplicate=True, + 'job-form', 'validateStatuses', allow_duplicate=True ), form_label_validate_info=Output( - {'type': 'job-form-label', 'index': ALL, 'required': True}, - 'help', - allow_duplicate=True, + 'job-form', 'helps', allow_duplicate=True ), modal_visible=Output('job-modal', 'visible'), operations=Output('job-operations-store', 'data', allow_duplicate=True), ), inputs=dict(confirm_trigger=Input('job-modal', 'okCounts')), state=dict( - modal_type=State('job-operations-store-bk', 'data'), - edit_row_info=State('job-edit-id-store', 'data'), - form_value=State({'type': 'job-form-value', 'index': ALL}, 'value'), + modal_type=State('job-modal_type-store', 'data'), + form_value=State('job-form-store', 'data'), form_label=State( {'type': 'job-form-label', 'index': ALL, 'required': True}, 'label' ), ), prevent_initial_call=True, ) -def job_confirm( - confirm_trigger, modal_type, edit_row_info, form_value, form_label -): +def job_confirm(confirm_trigger, modal_type, form_value, form_label): """ 新增或编定时任务弹窗确认回调,实现新增或编辑操作 """ if confirm_trigger: - # 获取所有输出表单项对应label的index - form_label_output_list = [x['id']['index'] for x in ctx.outputs_list[0]] - # 获取所有输入表单项对应的value及label - form_value_state = { - x['id']['index']: x.get('value') for x in ctx.states_list[-2] - } + # 获取所有必填表单项对应label的index + form_label_list = [x['id']['index'] for x in ctx.states_list[-1]] + # 获取所有输入必填表单项对应的label form_label_state = { x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( validate_data_not_empty(item) - for item in [ - form_value_state.get(k) for k in form_label_output_list - ] + for item in [form_value.get(k) for k in form_label_list] ): - params_add = form_value_state + params_add = form_value params_edit = params_add.copy() - params_edit['job_id'] = ( - edit_row_info.get('job_id') if edit_row_info else None - ) modal_type = modal_type.get('type') if modal_type == 'add': JobApi.add_job(params_add) @@ -370,10 +358,8 @@ def job_confirm( MessageManager.success(content='新增成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'add'}, ) @@ -381,34 +367,32 @@ def job_confirm( MessageManager.success(content='编辑成功') return dict( - form_label_validate_status=[None] - * len(form_label_output_list), - form_label_validate_info=[None] - * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=False, operations={'type': 'edit'}, ) return dict( - form_label_validate_status=[None] * len(form_label_output_list), - form_label_validate_info=[None] * len(form_label_output_list), + form_label_validate_status=None, + form_label_validate_info=None, modal_visible=no_update, operations=no_update, ) return dict( - form_label_validate_status=[ - None - if validate_data_not_empty(form_value_state.get(k)) + form_label_validate_status={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else 'error' - for k in form_label_output_list - ], - form_label_validate_info=[ - None - if validate_data_not_empty(form_value_state.get(k)) + for k in form_label_list + }, + form_label_validate_info={ + form_label_state.get(k): None + if validate_data_not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' - for k in form_label_output_list - ], + for k in form_label_list + }, modal_visible=no_update, operations=no_update, ) @@ -488,7 +472,14 @@ def get_job_detail_modal( job_info['concurrent'] = ( '是' if job_info.get('concurrent') == '0' else '否' ) - job_info['status'] = '正常' if job_info.get('status') == '0' else '停用' + job_info['job_group'] = DictManager.get_dict_label( + dict_type='sys_job_group', + dict_value=job_info.get('job_group'), + ) + job_info['status'] = DictManager.get_dict_label( + dict_type='sys_job_status', + dict_value=job_info.get('status'), + ) return dict( modal_visible=True, modal_title='任务详情', diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index d57519b..0783199 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -85,11 +85,10 @@ def get_job_log_table_data( total=table_info['total'], ) for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') - item['job_group'] = DictManager.get_dict_tag( + item['status_tag'] = DictManager.get_dict_tag( + dict_type='sys_job_status', dict_value=item.get('status') + ) + item['job_group_tag'] = DictManager.get_dict_tag( dict_type='sys_job_group', dict_value=item.get('job_group') ) item['key'] = str(item['job_log_id']) @@ -178,8 +177,13 @@ def add_edit_job_log_modal( # 获取所有输出表单项对应value的index form_value_list = [x['id']['index'] for x in ctx.outputs_list[-1]] job_log_info = recently_button_clicked_row - job_log_info['status'] = ( - '成功' if job_log_info.get('status') == '0' else '失败' + job_log_info['job_group'] = DictManager.get_dict_label( + dict_type='sys_job_group', + dict_value=job_log_info.get('job_group'), + ) + job_log_info['status'] = DictManager.get_dict_label( + dict_type='sys_job_status', + dict_value=job_log_info.get('status'), ) return dict( modal_visible=True, diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index 8c5deb3..2ba4884 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -50,9 +50,10 @@ def render(*args, **kwargs): dcc.Download(id='job-export-container'), # 定时任务模块操作类型存储容器 dcc.Store(id='job-operations-store'), - dcc.Store(id='job-operations-store-bk'), - # 定时任务模块修改操作行key存储容器 - dcc.Store(id='job-edit-id-store'), + # 定时任务模块弹窗类型存储容器 + dcc.Store(id='job-modal_type-store'), + # 定时任务模块表单数据存储容器 + dcc.Store(id='job-form-store'), # 定时任务模块删除操作行key存储容器 dcc.Store(id='job-delete-ids-store'), # 定时任务日志管理模块操作类型存储容器 @@ -402,10 +403,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'job-form-value', - 'index': 'job_name', - }, + name='job_name', placeholder='请输入任务名称', style={'width': '100%'}, ), @@ -425,10 +423,7 @@ def render(*args, **kwargs): fac.AntdFormItem( ApiSelect( dict_type='sys_job_group', - id={ - 'type': 'job-form-value', - 'index': 'job_group', - }, + name='job_group', placeholder='请选择任务分组', style={'width': '100%'}, ), @@ -451,10 +446,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'job-form-value', - 'index': 'invoke_target', - }, + name='invoke_target', placeholder='请输入调用目标字符串', style={'width': '100%'}, ), @@ -478,10 +470,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'job-form-value', - 'index': 'job_args', - }, + name='job_args', placeholder='请输入位置参数', style={'width': '100%'}, ), @@ -499,10 +488,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'job-form-value', - 'index': 'job_kwargs', - }, + name='job_kwargs', placeholder='请输入关键字参数', style={'width': '100%'}, ), @@ -525,10 +511,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id={ - 'type': 'job-form-value', - 'index': 'cron_expression', - }, + name='cron_expression', placeholder='请输入cron执行表达式', addonAfter=html.Div( [ @@ -567,10 +550,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'job-form-value', - 'index': 'misfire_policy', - }, + name='misfire_policy', options=[ { 'label': '立即执行', @@ -608,10 +588,7 @@ def render(*args, **kwargs): fac.AntdCol( fac.AntdFormItem( fac.AntdRadioGroup( - id={ - 'type': 'job-form-value', - 'index': 'concurrent', - }, + name='concurrent', options=[ {'label': '允许', 'value': '0'}, {'label': '禁止', 'value': '1'}, @@ -635,10 +612,7 @@ def render(*args, **kwargs): fac.AntdFormItem( ApiRadioGroup( dict_type='sys_job_status', - id={ - 'type': 'job-form-value', - 'index': 'status', - }, + name='status', defaultValue='0', ), id={ @@ -656,6 +630,8 @@ def render(*args, **kwargs): gutter=5, ), ], + id='job-form', + enableBatchControl=True, style={'marginRight': '30px'}, ) ], diff --git a/dash-fastapi-frontend/views/monitor/job/job_log.py b/dash-fastapi-frontend/views/monitor/job/job_log.py index e1da734..98d55f7 100644 --- a/dash-fastapi-frontend/views/monitor/job/job_log.py +++ b/dash-fastapi-frontend/views/monitor/job/job_log.py @@ -259,7 +259,7 @@ def render(): }, }, { - 'dataIndex': 'job_group', + 'dataIndex': 'job_group_tag', 'title': '任务组名', 'renderOptions': { 'renderType': 'tags' @@ -280,7 +280,7 @@ def render(): }, }, { - 'dataIndex': 'status', + 'dataIndex': 'status_tag', 'title': '执行状态', 'renderOptions': { 'renderType': 'tags' -- Gitee From 8f6e1a4837cb161cde6e2a2ff8a459fd27676a81 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 12:54:23 +0800 Subject: [PATCH 089/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/dict_util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/utils/dict_util.py b/dash-fastapi-frontend/utils/dict_util.py index 184e522..a4b67ae 100644 --- a/dash-fastapi-frontend/utils/dict_util.py +++ b/dash-fastapi-frontend/utils/dict_util.py @@ -42,8 +42,8 @@ class DictManager: return '' for option in options: - if option.get('value') == dict_value: - return option.get('label', '') + if option.get('value') == str(dict_value): + return option.get('label') return str(dict_value) @classmethod -- Gitee From 1b9dafcf0ae38b7cf4b86b59a43f6c3eb99723db Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 12:54:54 +0800 Subject: [PATCH 090/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B1=BB?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=BC=BA=E5=A4=B1cls=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/api/system/config.py b/dash-fastapi-frontend/api/system/config.py index a6dbf53..1789c79 100644 --- a/dash-fastapi-frontend/api/system/config.py +++ b/dash-fastapi-frontend/api/system/config.py @@ -34,7 +34,7 @@ class ConfigApi: ) @classmethod - def get_config_key(config_key: str): + def get_config_key(cls, config_key: str): """ 根据参数配置键名查询参数配置值接口 -- Gitee From e9aed19067d6bfd78535e9bf4fdf5dbf5700adf2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 12:55:58 +0800 Subject: [PATCH 091/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97=E8=A1=A8=E6=A0=BCtag=E7=B1=BB?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py | 8 ++++---- .../views/monitor/logininfor/__init__.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index 8f8d23b..30a0563 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -5,6 +5,7 @@ from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate from api.monitor.logininfor import LogininforApi from server import app +from utils.dict_util import DictManager from utils.feedback_util import MessageManager @@ -87,10 +88,9 @@ def get_login_log_table_data( total=table_info['total'], ) for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='成功', color='blue') - else: - item['status'] = dict(tag='失败', color='volcano') + item['status_tag'] = DictManager.get_dict_tag( + dict_type='sys_common_status', dict_value=item.get('status') + ) item['key'] = str(item['info_id']) return dict( diff --git a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py index f574284..529b7ac 100644 --- a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py @@ -15,7 +15,7 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - item['status'] = DictManager.get_dict_tag( + item['status_tag'] = DictManager.get_dict_tag( dict_type='sys_common_status', dict_value=item.get('status') ) item['key'] = str(item['info_id']) @@ -316,7 +316,7 @@ def render(*args, **kwargs): }, }, { - 'dataIndex': 'status', + 'dataIndex': 'status_tag', 'title': '登录状态', 'renderOptions': { 'renderType': 'tags' -- Gitee From dea1dcfa74d56977ae43940f109f575e54541ef6 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 12:56:10 +0800 Subject: [PATCH 092/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E8=A1=A8=E6=A0=BCtag=E7=B1=BB?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/operlog_c.py | 12 +++++------- .../views/monitor/operlog/__init__.py | 8 ++++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index 9e099e1..e02b6bb 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -93,10 +93,10 @@ def get_operation_log_table_data( total=table_info['total'], ) for item in table_data: - item['status'] = DictManager.get_dict_tag( + item['status_tag'] = DictManager.get_dict_tag( dict_type='sys_common_status', dict_value=item.get('status') ) - item['business_type'] = DictManager.get_dict_tag( + item['business_type_tag'] = DictManager.get_dict_tag( dict_type='sys_oper_type', dict_value=item.get('business_type'), ) @@ -213,11 +213,9 @@ def add_edit_operation_log_modal( operation_log_info['login_info'] = ( f'{oper_name} / {oper_ip} / {oper_location}' ) - operation_log_info['status'] = ( - '正常' if operation_log_info.get('status') == 0 else '失败' - ) - operation_log_info['cost_time'] = ( - f"{operation_log_info.get('cost_time')}毫秒" + operation_log_info['status'] = DictManager.get_dict_label( + dict_type='sys_common_status', + dict_value=operation_log_info.get('status'), ) return dict( modal_visible=True, diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index 6bbabc4..aaed882 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -15,10 +15,10 @@ def render(*args, **kwargs): page_size = table_info['page_size'] total = table_info['total'] for item in table_data: - item['status'] = DictManager.get_dict_tag( + item['status_tag'] = DictManager.get_dict_tag( dict_type='sys_common_status', dict_value=item.get('status') ) - item['business_type'] = DictManager.get_dict_tag( + item['business_type_tag'] = DictManager.get_dict_tag( dict_type='sys_oper_type', dict_value=item.get('business_type') ) item['key'] = str(item['oper_id']) @@ -292,7 +292,7 @@ def render(*args, **kwargs): }, }, { - 'dataIndex': 'business_type', + 'dataIndex': 'business_type_tag', 'title': '操作类型', 'renderOptions': { 'renderType': 'tags' @@ -320,7 +320,7 @@ def render(*args, **kwargs): }, }, { - 'dataIndex': 'status', + 'dataIndex': 'status_tag', 'title': '操作状态', 'renderOptions': { 'renderType': 'tags' -- Gitee From 3716287c458d1fd83cfce8562dabf65337767112 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 14:57:40 +0800 Subject: [PATCH 093/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/post_c.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 8408e80..3902b08 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -180,7 +180,21 @@ def change_post_delete_button_status(table_rows_selected): raise PreventUpdate -@app.callback( +# 岗位表单数据双向绑定回调 +app.clientside_callback( + """ + (row_data, form_value) => { + trigger_id = window.dash_clientside.callback_context.triggered_id; + if (trigger_id === 'post-form-store') { + return [window.dash_clientside.no_update, row_data]; + } + if (trigger_id === 'post-form') { + Object.assign(row_data, form_value); + return [row_data, window.dash_clientside.no_update]; + } + throw window.dash_clientside.PreventUpdate; + } + """, [ Output('post-form-store', 'data', allow_duplicate=True), Output('post-form', 'values'), @@ -191,17 +205,6 @@ def change_post_delete_button_status(table_rows_selected): ], prevent_initial_call=True, ) -def show_post_form(row_data, form_value): - """ - 岗位表单数据双向绑定回调 - """ - trigger_id = ctx.triggered_id - if trigger_id == 'post-form-store': - return no_update, row_data - if trigger_id == 'post-form': - row_data.update(form_value) - return row_data, no_update - raise PreventUpdate @app.callback( -- Gitee From 58eafaa717a8a8e8ccc09b5983743066e3030815 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 14:57:50 +0800 Subject: [PATCH 094/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dept_c.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 14e33fc..c73cecf 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -164,7 +164,21 @@ app.clientside_callback( ) -@app.callback( +# 部门表单数据双向绑定回调 +app.clientside_callback( + """ + (row_data, form_value) => { + trigger_id = window.dash_clientside.callback_context.triggered_id; + if (trigger_id === 'dept-form-store') { + return [window.dash_clientside.no_update, row_data]; + } + if (trigger_id === 'dept-form') { + Object.assign(row_data, form_value); + return [row_data, window.dash_clientside.no_update]; + } + throw window.dash_clientside.PreventUpdate; + } + """, [ Output('dept-form-store', 'data', allow_duplicate=True), Output('dept-form', 'values'), @@ -175,17 +189,6 @@ app.clientside_callback( ], prevent_initial_call=True, ) -def show_dept_form(row_data, form_value): - """ - 部门表单数据双向绑定回调 - """ - trigger_id = ctx.triggered_id - if trigger_id == 'dept-form-store': - return no_update, row_data - if trigger_id == 'dept-form': - row_data.update(form_value) - return row_data, no_update - raise PreventUpdate @app.callback( -- Gitee From c7e1a8842d3e8b306f4238c8f139f846eb19a9e3 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 14:58:06 +0800 Subject: [PATCH 095/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/config_c.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index ff63212..c1b7986 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -195,7 +195,21 @@ def change_config_delete_button_status(table_rows_selected): raise PreventUpdate -@app.callback( +# 参数配置表单数据双向绑定回调 +app.clientside_callback( + """ + (row_data, form_value) => { + trigger_id = window.dash_clientside.callback_context.triggered_id; + if (trigger_id === 'config-form-store') { + return [window.dash_clientside.no_update, row_data]; + } + if (trigger_id === 'config-form') { + Object.assign(row_data, form_value); + return [row_data, window.dash_clientside.no_update]; + } + throw window.dash_clientside.PreventUpdate; + } + """, [ Output('config-form-store', 'data', allow_duplicate=True), Output('config-form', 'values'), @@ -206,17 +220,6 @@ def change_config_delete_button_status(table_rows_selected): ], prevent_initial_call=True, ) -def show_config_form(row_data, form_value): - """ - 参数配置表单数据双向绑定回调 - """ - trigger_id = ctx.triggered_id - if trigger_id == 'config-form-store': - return no_update, row_data - if trigger_id == 'config-form': - row_data.update(form_value) - return row_data, no_update - raise PreventUpdate @app.callback( -- Gitee From 623930e73a1373d35e6cec7d4612f24ed1031e21 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 14:58:17 +0800 Subject: [PATCH 096/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/user_c/user_c.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 9459f25..4f7863c 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -229,7 +229,21 @@ def change_user_delete_button_status(table_rows_selected): raise PreventUpdate -@app.callback( +# 用户表单数据双向绑定回调 +app.clientside_callback( + """ + (row_data, form_value) => { + trigger_id = window.dash_clientside.callback_context.triggered_id; + if (trigger_id === 'user-form-store') { + return [window.dash_clientside.no_update, row_data]; + } + if (trigger_id === 'user-form') { + Object.assign(row_data, form_value); + return [row_data, window.dash_clientside.no_update]; + } + throw window.dash_clientside.PreventUpdate; + } + """, [ Output('user-form-store', 'data', allow_duplicate=True), Output('user-form', 'values'), @@ -240,17 +254,6 @@ def change_user_delete_button_status(table_rows_selected): ], prevent_initial_call=True, ) -def show_user_form(row_data, form_value): - """ - 用户表单数据双向绑定回调 - """ - trigger_id = ctx.triggered_id - if trigger_id == 'user-form-store': - return no_update, row_data - if trigger_id == 'user-form': - row_data.update(form_value) - return row_data, no_update - raise PreventUpdate @app.callback( -- Gitee From 967c3cc9f5db44078afd4d9e4295a99813b7d6ed Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 14:58:29 +0800 Subject: [PATCH 097/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 27 ++++++++++--------- .../callbacks/system_c/dict_c/dict_data_c.py | 27 ++++++++++--------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 7d1eba2..1288500 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -201,7 +201,21 @@ def change_dict_type_delete_button_status(table_rows_selected): raise PreventUpdate -@app.callback( +# 字典类型表单数据双向绑定回调 +app.clientside_callback( + """ + (row_data, form_value) => { + trigger_id = window.dash_clientside.callback_context.triggered_id; + if (trigger_id === 'dict_type-form-store') { + return [window.dash_clientside.no_update, row_data]; + } + if (trigger_id === 'dict_type-form') { + Object.assign(row_data, form_value); + return [row_data, window.dash_clientside.no_update]; + } + throw window.dash_clientside.PreventUpdate; + } + """, [ Output('dict_type-form-store', 'data', allow_duplicate=True), Output('dict_type-form', 'values'), @@ -212,17 +226,6 @@ def change_dict_type_delete_button_status(table_rows_selected): ], prevent_initial_call=True, ) -def show_dict_type_form(row_data, form_value): - """ - 字典类型表单数据双向绑定回调 - """ - trigger_id = ctx.triggered_id - if trigger_id == 'dict_type-form-store': - return no_update, row_data - if trigger_id == 'dict_type-form': - row_data.update(form_value) - return row_data, no_update - raise PreventUpdate @app.callback( diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index 6e4747b..5e0ff6a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -186,7 +186,21 @@ def change_dict_data_delete_button_status(table_rows_selected): raise PreventUpdate -@app.callback( +# 字典数据表单数据双向绑定回调 +app.clientside_callback( + """ + (row_data, form_value) => { + trigger_id = window.dash_clientside.callback_context.triggered_id; + if (trigger_id === 'dict_data-form-store') { + return [window.dash_clientside.no_update, row_data]; + } + if (trigger_id === 'dict_data-form') { + Object.assign(row_data, form_value); + return [row_data, window.dash_clientside.no_update]; + } + throw window.dash_clientside.PreventUpdate; + } + """, [ Output('dict_data-form-store', 'data', allow_duplicate=True), Output('dict_data-form', 'values'), @@ -197,17 +211,6 @@ def change_dict_data_delete_button_status(table_rows_selected): ], prevent_initial_call=True, ) -def show_dict_data_form(row_data, form_value): - """ - 字典数据表单数据双向绑定回调 - """ - trigger_id = ctx.triggered_id - if trigger_id == 'dict_data-form-store': - return no_update, row_data - if trigger_id == 'dict_data-form': - row_data.update(form_value) - return row_data, no_update - raise PreventUpdate @app.callback( -- Gitee From b2f5176482c1f87bb4aa5fa192854b8380373cca Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 14:58:39 +0800 Subject: [PATCH 098/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=A8=A1=E5=9D=97=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index b5acf60..c7adacd 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -193,7 +193,21 @@ def change_job_delete_button_status(table_rows_selected): raise PreventUpdate -@app.callback( +# 定时任务表单数据双向绑定回调 +app.clientside_callback( + """ + (row_data, form_value) => { + trigger_id = window.dash_clientside.callback_context.triggered_id; + if (trigger_id === 'job-form-store') { + return [window.dash_clientside.no_update, row_data]; + } + if (trigger_id === 'job-form') { + Object.assign(row_data, form_value); + return [row_data, window.dash_clientside.no_update]; + } + throw window.dash_clientside.PreventUpdate; + } + """, [ Output('job-form-store', 'data', allow_duplicate=True), Output('job-form', 'values'), @@ -204,17 +218,6 @@ def change_job_delete_button_status(table_rows_selected): ], prevent_initial_call=True, ) -def show_job_form(row_data, form_value): - """ - 定时任务表单数据双向绑定回调 - """ - trigger_id = ctx.triggered_id - if trigger_id == 'job-form-store': - return no_update, row_data - if trigger_id == 'job-form': - row_data.update(form_value) - return row_data, no_update - raise PreventUpdate @app.callback( -- Gitee From 2af863783cef08fb5c0e55b77c373767bb569b24 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 17:12:05 +0800 Subject: [PATCH 099/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=92=8C=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/post_c.py | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 3902b08..5a51cfc 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -138,46 +138,44 @@ app.clientside_callback( prevent_initial_call=True, ) - -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'post-operation-button', 'index': 'edit'}, 'disabled'), Input('post-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_post_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1: - return True - - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'post-operation-button', 'index': 'delete'}, 'disabled'), Input('post-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_post_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate # 岗位表单数据双向绑定回调 -- Gitee From c2022176a6ef71a26a6ca029822cb7024ee350bc Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:00:30 +0800 Subject: [PATCH 100/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E4=BF=AE=E6=94=B9=E5=92=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 57 +++++++++---------- .../callbacks/system_c/dict_c/dict_data_c.py | 57 +++++++++---------- 2 files changed, 56 insertions(+), 58 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 1288500..e5e2c1f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -158,47 +158,46 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'dict_type-operation-button', 'index': 'edit'}, 'disabled'), Input('dict_type-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_dict_type_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1: - return True - - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output( {'type': 'dict_type-operation-button', 'index': 'delete'}, 'disabled' ), Input('dict_type-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_dict_type_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate # 字典类型表单数据双向绑定回调 diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index 5e0ff6a..0c920c2 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -143,47 +143,46 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'dict_data-operation-button', 'index': 'edit'}, 'disabled'), Input('dict_data-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_dict_data_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1: - return True - - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output( {'type': 'dict_data-operation-button', 'index': 'delete'}, 'disabled' ), Input('dict_data-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_dict_data_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate # 字典数据表单数据双向绑定回调 -- Gitee From 411a2695136d49d824a024b3ea7c60815f35b215 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:00:39 +0800 Subject: [PATCH 101/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E4=BF=AE=E6=94=B9=E5=92=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/role_c/role_c.py | 60 +++++++++---------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 94a2b66..0352b5a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -224,50 +224,46 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'role-operation-button', 'operation': 'edit'}, 'disabled'), Input('role-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_role_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1 or '1' in table_rows_selected: - return True - - return False - - return True - - return no_update -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output( {'type': 'role-operation-button', 'operation': 'delete'}, 'disabled' ), Input('role-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_role_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if '1' in table_rows_selected: - return True - - return False - - return True - - return no_update @app.callback( -- Gitee From faac4a399503a5769a1a96f7c15172a82119b536 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:00:45 +0800 Subject: [PATCH 102/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E4=BF=AE=E6=94=B9=E5=92=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/user_c/user_c.py | 60 +++++++++---------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 4f7863c..45f7b3a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -185,48 +185,44 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'user-operation-button', 'index': 'edit'}, 'disabled'), Input('user-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_user_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1 or '1' in table_rows_selected: - return True - - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'user-operation-button', 'index': 'delete'}, 'disabled'), Input('user-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_user_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if '1' in table_rows_selected: - return True - - return False - - return True - - raise PreventUpdate # 用户表单数据双向绑定回调 -- Gitee From 97a791f0a5127f541031e0633715e53e3b2b6424 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:01:00 +0800 Subject: [PATCH 103/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E4=BF=AE=E6=94=B9=E5=92=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/config_c.py | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index c1b7986..89c3b41 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -154,45 +154,44 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'config-operation-button', 'index': 'edit'}, 'disabled'), Input('config-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_config_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1: - return True - - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'config-operation-button', 'index': 'delete'}, 'disabled'), Input('config-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_config_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate # 参数配置表单数据双向绑定回调 -- Gitee From 8bc7b83f1237f95a2930f6872682967cff47b18a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:01:08 +0800 Subject: [PATCH 104/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E4=BF=AE=E6=94=B9=E5=92=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/notice_c.py | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 7826c26..19a6127 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -158,45 +158,44 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'notice-operation-button', 'index': 'edit'}, 'disabled'), Input('notice-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_notice_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1: - return True - - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'notice-operation-button', 'index': 'delete'}, 'disabled'), Input('notice-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_notice_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate @app.callback( -- Gitee From c831af3f3f4beeb7a667d05933c45866f3003f7f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:01:23 +0800 Subject: [PATCH 105/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E4=BF=AE=E6=94=B9=E5=92=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index c7adacd..743657d 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -152,45 +152,44 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制修改按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'job-operation-button', 'index': 'edit'}, 'disabled'), Input('job-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_job_edit_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制编辑按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1: - return True - - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'job-operation-button', 'index': 'delete'}, 'disabled'), Input('job-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_job_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate # 定时任务表单数据双向绑定回调 -- Gitee From e63d41709f31abd2e3afdcbb5b633cf603547947 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:01:41 +0800 Subject: [PATCH 106/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_log_c.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index 0783199..fc8531d 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -194,23 +194,24 @@ def add_edit_job_log_modal( raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'job_log-operation-button', 'index': 'delete'}, 'disabled'), Input('job_log-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_job_log_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate @app.callback( -- Gitee From 6d0b9c1f29f838ee76e87867fbb5f3afa2444f7a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:02:29 +0800 Subject: [PATCH 107/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E7=94=A8=E6=88=B7=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E6=89=B9=E9=87=8F=E5=BC=BA?= =?UTF-8?q?=E9=80=80=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/online_c.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py index de513c1..7852d9d 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py @@ -127,23 +127,24 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制批量强退按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output({'type': 'online-operation-button', 'index': 'delete'}, 'disabled'), Input('online-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_online_edit_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制批量强退按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate @app.callback( -- Gitee From 9e7d7136b5f887e5a87cdfb22d96ef3dcc33db6a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:02:50 +0800 Subject: [PATCH 108/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E5=88=A0=E9=99=A4=E9=92=AE?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=9B=9E=E8=B0=83=E4=B8=BA=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E5=99=A8=E7=AB=AF=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/operlog_c.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index e02b6bb..7a1ea0f 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -226,7 +226,20 @@ def add_edit_operation_log_modal( raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output( {'type': 'operation_log-operation-button', 'index': 'delete'}, 'disabled', @@ -234,18 +247,6 @@ def add_edit_operation_log_modal( Input('operation_log-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_operation_log_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate @app.callback( -- Gitee From 8b4c5631df470cd9cb20e41d6edbd2a0ab4f6eb2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 20:03:03 +0800 Subject: [PATCH 109/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E8=A1=A8=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8E=A7=E5=88=B6=E5=88=A0=E9=99=A4=E5=92=8C?= =?UTF-8?q?=E8=A7=A3=E9=94=81=E9=92=AE=E7=8A=B6=E6=80=81=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E4=B8=BA=E6=B5=8F=E8=A7=88=E5=99=A8=E7=AB=AF=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/logininfor_c.py | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index 30a0563..05967c1 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -148,47 +148,46 @@ app.clientside_callback( ) -@app.callback( +# 根据选择的表格数据行数控制删除按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length > 0) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output( {'type': 'login_log-operation-button', 'index': 'delete'}, 'disabled' ), Input('login_log-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_login_log_delete_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制删除按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - return False - - return True - - raise PreventUpdate -@app.callback( +# 根据选择的表格数据行数控制解锁按钮状态回调 +app.clientside_callback( + """ + (table_rows_selected) => { + outputs_list = window.dash_clientside.callback_context.outputs_list; + if (outputs_list) { + if (table_rows_selected?.length === 1) { + return false; + } + return true; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output('login_log-unlock', 'disabled'), Input('login_log-list-table', 'selectedRowKeys'), prevent_initial_call=True, ) -def change_login_log_unlock_button_status(table_rows_selected): - """ - 根据选择的表格数据行数控制解锁按钮状态回调 - """ - outputs_list = ctx.outputs_list - if outputs_list: - if table_rows_selected: - if len(table_rows_selected) > 1: - return True - - return False - - return True - - raise PreventUpdate @app.callback( -- Gitee From 544c300a721a845488e7ed7981f94c9520ea4105 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 22:58:06 +0800 Subject: [PATCH 110/229] =?UTF-8?q?feat:=20=E5=B2=97=E4=BD=8D=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/post_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 5a51cfc..9cd41a7 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -308,6 +308,7 @@ def add_edit_post_modal( {'type': 'post-form-label', 'index': ALL, 'required': True}, 'label' ), ), + running=[[Output('post-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def post_confirm(confirm_trigger, modal_type, form_value, form_label): -- Gitee From a4c41cf4a17ad25afc94b07d22156057e6289c75 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:06:11 +0800 Subject: [PATCH 111/229] =?UTF-8?q?feat:=20=E5=AD=97=E5=85=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py | 1 + dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py | 1 + 2 files changed, 2 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index e5e2c1f..877512e 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -337,6 +337,7 @@ def add_edit_dict_type_modal( 'label', ), ), + running=[[Output('dict_type-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def dict_type_confirm(confirm_trigger, modal_type, form_value, form_label): diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index 0c920c2..b36f901 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -328,6 +328,7 @@ def add_edit_dict_data_modal( 'label', ), ), + running=[[Output('dict_data-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): -- Gitee From b813807bf86c990049846e673fd4141f50e8cbe3 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:06:22 +0800 Subject: [PATCH 112/229] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/menu_c/components_c/button_type_c.py | 1 + .../callbacks/system_c/menu_c/components_c/content_type_c.py | 1 + .../callbacks/system_c/menu_c/components_c/menu_type_c.py | 1 + 3 files changed, 3 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py index e447934..9b2dcb7 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py @@ -47,6 +47,7 @@ from utils.feedback_util import MessageManager order_num=State('menu-order_num', 'value'), perms=State('button-menu-perms', 'value'), ), + running=[[Output('menu-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def menu_confirm_button( diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py index cbb03a0..887eebb 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py @@ -50,6 +50,7 @@ from utils.feedback_util import MessageManager visible=State('content-menu-visible', 'value'), status=State('content-menu-status', 'value'), ), + running=[[Output('menu-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def menu_confirm_content( diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py index 03ebd4c..2b67b21 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py @@ -58,6 +58,7 @@ from utils.feedback_util import MessageManager visible=State('menu-menu-visible', 'value'), status=State('menu-menu-status', 'value'), ), + running=[[Output('menu-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def menu_confirm_menu( -- Gitee From 9b5eca5d66bad74e07614f6c8c2c9231f249a0f3 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:06:28 +0800 Subject: [PATCH 113/229] =?UTF-8?q?feat:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/role_c/allocate_user_c.py | 1 + dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py | 1 + dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py | 1 + 3 files changed, 3 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py index 0de4c8a..3a749bd 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py @@ -248,6 +248,7 @@ def allocate_user_modal(add_click, unallocated_user): ), State('allocate_user-role_id-container', 'data'), ], + running=[[Output('allocate_user-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def allocate_user_add_confirm(add_confirm, selected_row_keys, role_id): diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py index e323d50..7ad9ad4 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py @@ -173,6 +173,7 @@ def edit_role_datascope_modal(button_click): 'role-dept-perms-radio-parent-children', 'checked' ), ), + running=[[Output('role-datascope-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def role_datascope_confirm( diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 0352b5a..c5386cc 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -477,6 +477,7 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): 'role-menu-perms-radio-parent-children', 'checked' ), ), + running=[[Output('role-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def role_confirm( -- Gitee From 268c871dbafea992848785e669c65cbe05ddba4b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:06:35 +0800 Subject: [PATCH 114/229] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 45f7b3a..1100d73 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -424,6 +424,7 @@ def add_edit_user_modal( {'type': 'user-form-label', 'index': ALL, 'required': True}, 'label' ), ), + running=[[Output('user-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def user_confirm(confirm_trigger, modal_type, form_value, form_label): -- Gitee From b5a2707dd8a8996194ab65879606a676a28ed60f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:06:42 +0800 Subject: [PATCH 115/229] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/config_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 89c3b41..babc775 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -328,6 +328,7 @@ def add_edit_config_modal( 'label', ), ), + running=[[Output('config-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def config_confirm(confirm_trigger, modal_type, form_value, form_label): -- Gitee From 2bdbd95b3d40daf237abd925acad9b5f5f324981 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:06:47 +0800 Subject: [PATCH 116/229] =?UTF-8?q?feat:=20=E9=83=A8=E9=97=A8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/dept_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index c73cecf..2c1aa16 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -310,6 +310,7 @@ def add_edit_dept_modal( {'type': 'dept-form-label', 'index': ALL, 'required': True}, 'label' ), ), + running=[[Output('dept-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def dept_confirm(confirm_trigger, modal_type, form_value, form_label): -- Gitee From 8e517a32f850a368e1039bad1b193ef79533201f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:06:54 +0800 Subject: [PATCH 117/229] =?UTF-8?q?feat:=20=E9=80=9A=E7=9F=A5=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/notice_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 19a6127..34b58a7 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -363,6 +363,7 @@ def add_edit_notice_modal( status=State('notice-status', 'value'), notice_content=State('notice-content', 'htmlValue'), ), + running=[[Output('notice-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def notice_confirm( -- Gitee From 69cf32cdd9b46d62626f587db9e0cc3468dfc62a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 19 Sep 2024 23:07:04 +0800 Subject: [PATCH 118/229] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91modal=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 743657d..18b8c55 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -332,6 +332,7 @@ def add_edit_job_modal( {'type': 'job-form-label', 'index': ALL, 'required': True}, 'label' ), ), + running=[[Output('job-modal', 'confirmLoading'), True, False]], prevent_initial_call=True, ) def job_confirm(confirm_trigger, modal_type, form_value, form_label): -- Gitee From 1e46c3577e533ed4a6c70d73a8bf9bff487591a9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 16:34:57 +0800 Subject: [PATCH 119/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF?= =?UTF-8?q?role=5Fids=E5=92=8Cpost=5Fids=E8=B5=8B=E5=80=BC=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/service/login_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-backend/module_admin/service/login_service.py b/dash-fastapi-backend/module_admin/service/login_service.py index f355afb..eaa5a33 100644 --- a/dash-fastapi-backend/module_admin/service/login_service.py +++ b/dash-fastapi-backend/module_admin/service/login_service.py @@ -248,8 +248,8 @@ class LoginService: roles=roles, user=UserInfoModel( **SqlalchemyUtil.serialize_result(query_user.get('user_basic_info')), - postIds=post_ids, - roleIds=role_ids, + post_ids=post_ids, + role_ids=role_ids, dept=SqlalchemyUtil.serialize_result(query_user.get('user_dept_info')), role=SqlalchemyUtil.serialize_result(query_user.get('user_role_info')), ), -- Gitee From 6afecab3ce3ab3d62f8093b4a395b58bff29ca98 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 16:36:12 +0800 Subject: [PATCH 120/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=A4=B1=E8=B4=A5=E6=97=B6=E7=99=BB=E5=BD=95=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=8A=A0=E8=BD=BD=E7=8A=B6=E6=80=81=E6=9C=AA=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/login_c.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index 6548153..3a11f8b 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -20,7 +20,6 @@ from utils.feedback_util import MessageManager password_form_help=Output('login-password-form-item', 'help'), captcha_form_help=Output('login-captcha-form-item', 'help'), image_click=Output('login-captcha-image-container', 'n_clicks'), - submit_loading=Output('login-submit', 'loading'), token=Output('token-container', 'data'), redirect_container=Output( 'redirect-container', 'children', allow_duplicate=True @@ -35,6 +34,7 @@ from utils.feedback_util import MessageManager image_click=State('login-captcha-image-container', 'n_clicks'), captcha_hidden=State('captcha-row-container', 'hidden'), ), + running=[[Output('login-submit', 'loading'), True, False]], prevent_initial_call=True, ) def login_auth( @@ -72,7 +72,6 @@ def login_auth( password_form_help=None, captcha_form_help=None, image_click=no_update, - submit_loading=False, token=token, redirect_container=dcc.Location( pathname='/', id='login-redirect' @@ -99,7 +98,6 @@ def login_auth( if validate_data_not_empty(input_captcha) else '请输入验证码!', image_click=no_update, - submit_loading=False, token=None, redirect_container=None, ) @@ -112,7 +110,6 @@ def login_auth( password_form_help=no_update, captcha_form_help=no_update, image_click=image_click + 1, - submit_loading=no_update, token=no_update, redirect_container=no_update, ) -- Gitee From e73c95bb4005f7c44ebd866f96a71007d75f6e18 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 16:40:09 +0800 Subject: [PATCH 121/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E8=A1=A8=E6=A0=BC=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py | 1 + dash-fastapi-frontend/views/system/user/__init__.py | 1 + 2 files changed, 2 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 4f7863c..2b91467 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -110,6 +110,7 @@ def get_user_table_data_by_dept_tree( item['status'] = dict( checked=False, disabled=item['user_id'] == 1 ) + item['dept_name'] = item.get('dept', {}).get('dept_name') item['key'] = str(item['user_id']) if item['user_id'] == 1: item['operation'] = [] diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index ba90e15..5789139 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -23,6 +23,7 @@ def render(*args, **kwargs): item['status'] = dict(checked=True, disabled=item['user_id'] == 1) else: item['status'] = dict(checked=False, disabled=item['user_id'] == 1) + item['dept_name'] = item.get('dept', {}).get('dept_name') item['key'] = str(item['user_id']) if item['user_id'] == 1: item['operation'] = [] -- Gitee From 226f8c17f1655bea6b2b2b957f72e5eb99101b71 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 16:40:51 +0800 Subject: [PATCH 122/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/permission_util.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/utils/permission_util.py b/dash-fastapi-frontend/utils/permission_util.py index 080161b..7a75f68 100644 --- a/dash-fastapi-frontend/utils/permission_util.py +++ b/dash-fastapi-frontend/utils/permission_util.py @@ -16,7 +16,11 @@ class PermissionManager: :param is_strict: 当传入的权限标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个权限标识,所有的校验结果都需要为True才会通过 :return: 校验结果 """ - user_perm_list = CacheManager.get('permissions').get('perms') + user_perm_list = ( + CacheManager.get('permissions').get('perms') + if CacheManager.get('permissions') + else [] + ) if '*:*:*' in user_perm_list: return True if isinstance(perm, str): @@ -40,7 +44,11 @@ class PermissionManager: :param is_strict: 当传入的角色标识是list类型时,是否开启严格模式,开启表示会校验列表中的每一个角色标识,所有的校验结果都需要为True才会通过 :return: 校验结果 """ - user_role_list = CacheManager.get('permissions').get('roles') + user_role_list = ( + CacheManager.get('permissions').get('roles') + if CacheManager.get('permissions') + else [] + ) user_role_key_list = [role.role_key for role in user_role_list] if isinstance(role_key, str): if role_key in user_role_key_list: -- Gitee From 29ddb08793b101b076efdf92a60f4890972d73c1 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 16:42:42 +0800 Subject: [PATCH 123/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=85=AC=E5=91=8A=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/notice_c.py | 67 +++++++++++-------- .../views/system/notice/__init__.py | 42 ++---------- 2 files changed, 43 insertions(+), 66 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 7826c26..e8ee02b 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -2,7 +2,7 @@ import uuid from dash import ctx, no_update from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate -from api.system.dict.data import DictDataApi +from typing import Dict from api.system.notice import NoticeApi from server import app from utils.common import validate_data_not_empty @@ -11,6 +11,43 @@ from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_notice_table(query_params: Dict): + """ + 根据查询参数获取通知公告表格数据及分页信息 + + :param query_params: 查询参数 + :return: 通知公告表格数据及分页信息 + """ + table_info = NoticeApi.list_notice(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['status'] = DictManager.get_dict_tag( + dict_type='sys_notice_status', dict_value=item.get('status') + ) + item['notice_type'] = DictManager.get_dict_tag( + dict_type='sys_notice_type', dict_value=item.get('notice_type') + ) + item['key'] = str(item['notice_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:notice:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:notice:remove') + else {}, + ] + + return [table_data, table_pagination] + + @app.callback( output=dict( notice_table_data=Output( @@ -75,33 +112,7 @@ def get_notice_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = NoticeApi.list_notice(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='关闭', color='volcano') - item['notice_type'] = DictManager.get_dict_tag( - dict_type='sys_notice_type', dict_value=item.get('notice_type') - ) - item['key'] = str(item['notice_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:notice:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:notice:remove') - else {}, - ] + table_data, table_pagination = generate_notice_table(query_params) return dict( notice_table_data=table_data, diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index 9488afd..ed67996 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -3,38 +3,16 @@ import feffery_utils_components as fuc import uuid from dash import dcc, html from flask import session -from api.system.notice import NoticeApi -from callbacks.system_c import notice_c # noqa: F401 +from callbacks.system_c import notice_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect from config.global_config import ApiBaseUrlConfig -from utils.dict_util import DictManager from utils.permission_util import PermissionManager def render(*args, **kwargs): - notice_params = dict(page_num=1, page_size=10) - table_info = NoticeApi.list_notice(notice_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - item['status'] = DictManager.get_dict_tag( - dict_type='sys_notice_status', dict_value=item.get('status') - ) - item['notice_type'] = DictManager.get_dict_tag( - dict_type='sys_notice_type', dict_value=item.get('notice_type') - ) - item['key'] = str(item['notice_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:notice:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:notice:remove') - else {}, - ] + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = notice_c.generate_notice_table(query_params) return [ # 通知公告管理模块操作类型存储容器 @@ -326,19 +304,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From 8764ed9e02f6e3352c5bc15b2fe485f2d816b4f1 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 16:42:54 +0800 Subject: [PATCH 124/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/post_c.py | 59 +++++++++++-------- .../views/system/post/__init__.py | 39 ++---------- 2 files changed, 40 insertions(+), 58 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 5a51cfc..518fc5f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -3,6 +3,7 @@ import uuid from dash import ctx, dcc, no_update from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate +from typing import Dict from api.system.post import PostApi from server import app from utils.common import validate_data_not_empty @@ -11,6 +12,40 @@ from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_post_table(query_params: Dict): + """ + 根据查询参数获取岗位表格数据及分页信息 + + :param query_params: 查询参数 + :return: 岗位表格数据及分页信息 + """ + table_info = PostApi.list_post(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) + item['key'] = str(item['post_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:post:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:post:remove') + else {}, + ] + + return [table_data, table_pagination] + + @app.callback( output=dict( post_table_data=Output('post-list-table', 'data', allow_duplicate=True), @@ -62,29 +97,7 @@ def get_post_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = PostApi.list_post(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - item['status'] = DictManager.get_dict_tag( - dict_type='sys_normal_disable', dict_value=item.get('status') - ) - item['key'] = str(item['post_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:post:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:post:remove') - else {}, - ] + table_data, table_pagination = generate_post_table(query_params) return dict( post_table_data=table_data, post_table_pagination=table_pagination, diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index 5eb1bc1..f917871 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -1,33 +1,14 @@ import feffery_antd_components as fac from dash import dcc, html -from api.system.post import PostApi -from callbacks.system_c import post_c # noqa: F401 +from callbacks.system_c import post_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect -from utils.dict_util import DictManager from utils.permission_util import PermissionManager def render(*args, **kwargs): - post_params = dict(page_num=1, page_size=10) - table_info = PostApi.list_post(post_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - item['status'] = DictManager.get_dict_tag( - dict_type='sys_normal_disable', dict_value=item.get('status') - ) - item['key'] = str(item['post_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:post:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:post:remove') - else {}, - ] + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = post_c.generate_post_table(query_params) return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -324,19 +305,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From 8148904b1313d57ca25fe17a5265e3d05d6bc0bf Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 17:19:26 +0800 Subject: [PATCH 125/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/config_c.py | 59 +++++++++++-------- .../views/system/config/__init__.py | 39 ++---------- 2 files changed, 40 insertions(+), 58 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index c1b7986..eb00549 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -3,6 +3,7 @@ import uuid from dash import ctx, dcc, no_update from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate +from typing import Dict from api.system.config import ConfigApi from server import app from utils.common import validate_data_not_empty @@ -11,6 +12,40 @@ from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_config_table(query_params: Dict): + """ + 根据查询参数获取参数设置表格数据及分页信息 + + :param query_params: 查询参数 + :return: 参数设置表格数据及分页信息 + """ + table_info = ConfigApi.list_config(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['config_type'] = DictManager.get_dict_tag( + dict_type='sys_yes_no', dict_value=item.get('config_type') + ) + item['key'] = str(item['config_id']) + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:config:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:config:remove') + else {}, + ] + + return [table_data, table_pagination] + + @app.callback( output=dict( config_table_data=Output( @@ -75,29 +110,7 @@ def get_config_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = ConfigApi.list_config(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - item['config_type'] = DictManager.get_dict_tag( - dict_type='sys_yes_no', dict_value=item.get('config_type') - ) - item['key'] = str(item['config_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:config:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:config:remove') - else {}, - ] + table_data, table_pagination = generate_config_table(query_params) return dict( config_table_data=table_data, diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index 028b7b0..03666d5 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -1,33 +1,14 @@ import feffery_antd_components as fac from dash import dcc, html -from api.system.config import ConfigApi -from callbacks.system_c import config_c # noqa: F401 +from callbacks.system_c import config_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect -from utils.dict_util import DictManager from utils.permission_util import PermissionManager def render(*args, **kwargs): - config_params = dict(page_num=1, page_size=10) - table_info = ConfigApi.list_config(config_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - item['config_type'] = DictManager.get_dict_tag( - dict_type='sys_yes_no', dict_value=item.get('config_type') - ) - item['key'] = str(item['config_id']) - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:config:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:config:remove') - else {}, - ] + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = config_c.generate_config_table(query_params) return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -368,19 +349,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From 7efb1ce5854b0f8ea6937d43ac8b809784037ef1 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 17:19:42 +0800 Subject: [PATCH 126/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/role_c/role_c.py | 198 +++++++++--------- .../views/system/role/__init__.py | 104 +-------- 2 files changed, 106 insertions(+), 196 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 94a2b66..0fe6b0a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -4,6 +4,7 @@ import uuid from dash import ctx, dcc, no_update from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate +from typing import Dict from api.system.menu import MenuApi from api.system.role import RoleApi from server import app @@ -13,6 +14,106 @@ from utils.permission_util import PermissionManager from utils.tree_tool import find_tree_all_keys +def generate_role_table(query_params: Dict): + """ + 根据查询参数获取角色表格数据及分页信息 + + :param query_params: 查询参数 + :return: 角色表格数据及分页信息 + """ + table_info = RoleApi.list_role(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(checked=True, disabled=item['role_id'] == 1) + else: + item['status'] = dict(checked=False, disabled=item['role_id'] == 1) + item['key'] = str(item['role_id']) + if item['role_id'] == 1: + item['operation'] = [] + else: + item['operation'] = fac.AntdSpace( + [ + fac.AntdButton( + '修改', + id={ + 'type': 'role-operation-table', + 'operation': 'edit', + 'index': str(item['role_id']), + }, + type='link', + icon=fac.AntdIcon(icon='antd-edit'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:edit') + else [], + fac.AntdButton( + '删除', + id={ + 'type': 'role-operation-table', + 'operation': 'delete', + 'index': str(item['role_id']), + }, + type='link', + icon=fac.AntdIcon(icon='antd-delete'), + style={'padding': 0}, + ) + if PermissionManager.check_perms('system:role:remove') + else [], + fac.AntdPopover( + fac.AntdButton( + '更多', + type='link', + icon=fac.AntdIcon(icon='antd-more'), + style={'padding': 0}, + ), + content=fac.AntdSpace( + [ + fac.AntdButton( + '数据权限', + id={ + 'type': 'role-operation-table', + 'operation': 'datascope', + 'index': str(item['role_id']), + }, + type='text', + block=True, + icon=fac.AntdIcon(icon='antd-check-circle'), + style={'padding': 0}, + ), + fac.AntdButton( + '分配用户', + id={ + 'type': 'role-operation-table', + 'operation': 'allocation', + 'index': str(item['role_id']), + }, + type='text', + block=True, + icon=fac.AntdIcon(icon='antd-user'), + style={'padding': 0}, + ), + ], + direction='vertical', + ), + placement='bottomRight', + ) + if PermissionManager.check_perms('system:role:edit') + else [], + ] + ) + + return [table_data, table_pagination] + + @app.callback( output=dict( role_table_data=Output('role-list-table', 'data', allow_duplicate=True), @@ -73,102 +174,7 @@ def get_role_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = RoleApi.list_role(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict( - checked=True, disabled=item['role_id'] == 1 - ) - else: - item['status'] = dict( - checked=False, disabled=item['role_id'] == 1 - ) - item['key'] = str(item['role_id']) - if item['role_id'] == 1: - item['operation'] = [] - else: - item['operation'] = fac.AntdSpace( - [ - fac.AntdButton( - '修改', - id={ - 'type': 'role-operation-table', - 'operation': 'edit', - 'index': str(item['role_id']), - }, - type='link', - icon=fac.AntdIcon(icon='antd-edit'), - style={'padding': 0}, - ) - if PermissionManager.check_perms('system:role:edit') - else [], - fac.AntdButton( - '删除', - id={ - 'type': 'role-operation-table', - 'operation': 'delete', - 'index': str(item['role_id']), - }, - type='link', - icon=fac.AntdIcon(icon='antd-delete'), - style={'padding': 0}, - ) - if PermissionManager.check_perms('system:role:remove') - else [], - fac.AntdPopover( - fac.AntdButton( - '更多', - type='link', - icon=fac.AntdIcon(icon='antd-more'), - style={'padding': 0}, - ), - content=fac.AntdSpace( - [ - fac.AntdButton( - '数据权限', - id={ - 'type': 'role-operation-table', - 'operation': 'datascope', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon( - icon='antd-check-circle' - ), - style={'padding': 0}, - ), - fac.AntdButton( - '分配用户', - id={ - 'type': 'role-operation-table', - 'operation': 'allocation', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon(icon='antd-user'), - style={'padding': 0}, - ), - ], - direction='vertical', - ), - placement='bottomRight', - ) - if PermissionManager.check_perms('system:role:edit') - else [], - ] - ) - + table_data, table_pagination = generate_role_table(query_params) return dict( role_table_data=table_data, role_table_pagination=table_pagination, diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index 32c5995..0d88377 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -1,7 +1,6 @@ import feffery_antd_components as fac from dash import dcc, html -from api.system.role import RoleApi -from callbacks.system_c.role_c import role_c # noqa: F401 +from callbacks.system_c.role_c import role_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect from utils.permission_util import PermissionManager @@ -9,91 +8,8 @@ from . import data_scope, allocate_user def render(*args, **kwargs): - role_params = dict(page_num=1, page_size=10) - table_info = RoleApi.list_role(role_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(checked=True, disabled=item['role_id'] == 1) - else: - item['status'] = dict(checked=False, disabled=item['role_id'] == 1) - item['key'] = str(item['role_id']) - if item['role_id'] == 1: - item['operation'] = [] - else: - item['operation'] = fac.AntdSpace( - [ - fac.AntdButton( - '修改', - id={ - 'type': 'role-operation-table', - 'operation': 'edit', - 'index': str(item['role_id']), - }, - type='link', - icon=fac.AntdIcon(icon='antd-edit'), - style={'padding': 0}, - ) - if PermissionManager.check_perms('system:role:edit') - else [], - fac.AntdButton( - '删除', - id={ - 'type': 'role-operation-table', - 'operation': 'delete', - 'index': str(item['role_id']), - }, - type='link', - icon=fac.AntdIcon(icon='antd-delete'), - style={'padding': 0}, - ) - if PermissionManager.check_perms('system:role:remove') - else [], - fac.AntdPopover( - fac.AntdButton( - '更多', - type='link', - icon=fac.AntdIcon(icon='antd-more'), - style={'padding': 0}, - ), - content=fac.AntdSpace( - [ - fac.AntdButton( - '数据权限', - id={ - 'type': 'role-operation-table', - 'operation': 'datascope', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon(icon='antd-check-circle'), - style={'padding': 0}, - ), - fac.AntdButton( - '分配用户', - id={ - 'type': 'role-operation-table', - 'operation': 'allocation', - 'index': str(item['role_id']), - }, - type='text', - block=True, - icon=fac.AntdIcon(icon='antd-user'), - style={'padding': 0}, - ), - ], - direction='vertical', - ), - placement='bottomRight', - ) - if PermissionManager.check_perms('system:role:edit') - else [], - ] - ) + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = role_c.generate_role_table(query_params) return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -415,19 +331,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From b5ef769595e9abb731f07bd3d144042d3dfadeb7 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 17:19:53 +0800 Subject: [PATCH 127/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/user_c/user_c.py | 85 ++++++++++--------- .../views/system/user/__init__.py | 48 +---------- 2 files changed, 51 insertions(+), 82 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 2b91467..8a46c45 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -5,6 +5,7 @@ from io import BytesIO from dash import ctx, dcc, no_update from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate +from typing import Dict from api.system.user import UserApi from server import app from utils.common import validate_data_not_empty @@ -12,6 +13,51 @@ from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_user_table(query_params: Dict): + """ + 根据查询参数获取用户表格数据及分页信息 + + :param query_params: 查询参数 + :return: 用户表格数据及分页信息 + """ + table_info = UserApi.list_user(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(checked=True, disabled=item['user_id'] == 1) + else: + item['status'] = dict(checked=False, disabled=item['user_id'] == 1) + item['dept_name'] = item.get('dept', {}).get('dept_name') + item['key'] = str(item['user_id']) + if item['user_id'] == 1: + item['operation'] = [] + else: + item['operation'] = [ + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:user:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:user:remove') + else None, + {'title': '重置密码', 'icon': 'antd-key'} + if PermissionManager.check_perms('system:user:resetPwd') + else None, + {'title': '分配角色', 'icon': 'antd-check-circle'} + if PermissionManager.check_perms('system:user:edit') + else None, + ] + + return [table_data, table_pagination] + + app.clientside_callback( """(dept_input) => dept_input""", Output('dept-tree', 'searchKeyword'), @@ -91,44 +137,7 @@ def get_user_table_data_by_dept_tree( or pagination or operations ): - table_info = UserApi.list_user(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict( - checked=True, disabled=item['user_id'] == 1 - ) - else: - item['status'] = dict( - checked=False, disabled=item['user_id'] == 1 - ) - item['dept_name'] = item.get('dept', {}).get('dept_name') - item['key'] = str(item['user_id']) - if item['user_id'] == 1: - item['operation'] = [] - else: - item['operation'] = [ - {'title': '修改', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:user:edit') - else None, - {'title': '删除', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:user:remove') - else None, - {'title': '重置密码', 'icon': 'antd-key'} - if PermissionManager.check_perms('system:user:resetPwd') - else None, - {'title': '分配角色', 'icon': 'antd-check-circle'} - if PermissionManager.check_perms('system:user:edit') - else None, - ] + table_data, table_pagination = generate_user_table(query_params) return dict( user_table_data=table_data, diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 5789139..2335a16 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -1,7 +1,7 @@ import feffery_antd_components as fac from dash import dcc, html from api.system.user import UserApi -from callbacks.system_c.user_c import user_c # noqa: F401 +from callbacks.system_c.user_c import user_c from components import ManuallyUpload from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect @@ -10,38 +10,10 @@ from . import allocate_role, profile # noqa: F401 def render(*args, **kwargs): - user_params = dict(page_num=1, page_size=10) + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = user_c.generate_user_table(query_params) tree_info = UserApi.dept_tree_select() - table_info = UserApi.list_user(user_params) tree_data = tree_info['data'] - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(checked=True, disabled=item['user_id'] == 1) - else: - item['status'] = dict(checked=False, disabled=item['user_id'] == 1) - item['dept_name'] = item.get('dept', {}).get('dept_name') - item['key'] = str(item['user_id']) - if item['user_id'] == 1: - item['operation'] = [] - else: - item['operation'] = [ - {'title': '修改', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:user:edit') - else None, - {'title': '删除', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:user:remove') - else None, - {'title': '重置密码', 'icon': 'antd-key'} - if PermissionManager.check_perms('system:user:resetPwd') - else None, - {'title': '分配角色', 'icon': 'antd-check-circle'} - if PermissionManager.check_perms('system:user:edit') - else None, - ] return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -407,19 +379,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From cf5eaf55426d9bb39054de52bbe65bb8df7c99db Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 17:37:50 +0800 Subject: [PATCH 128/229] =?UTF-8?q?perf:=20=E4=B8=AA=E4=BA=BA=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=A8=A1=E5=9D=97=E5=9F=BA=E6=9C=AC=E8=B5=84=E6=96=99?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E5=A2=9E=E5=8A=A0=E5=88=9D=E5=A7=8B=E5=9B=9E?= =?UTF-8?q?=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/system/user/profile/__init__.py | 15 +++++- .../views/system/user/profile/user_info.py | 54 ++++++++----------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/dash-fastapi-frontend/views/system/user/profile/__init__.py b/dash-fastapi-frontend/views/system/user/profile/__init__.py index cce91f9..c4ba461 100644 --- a/dash-fastapi-frontend/views/system/user/profile/__init__.py +++ b/dash-fastapi-frontend/views/system/user/profile/__init__.py @@ -180,7 +180,20 @@ def render(*args, **kwargs): { 'key': '基本资料', 'label': '基本资料', - 'children': user_info.render(), + 'children': user_info.render( + nick_name=user_profile.get( + 'data' + ).get('nick_name'), + phonenumber=user_profile.get( + 'data' + ).get('phonenumber'), + email=user_profile.get('data').get( + 'email' + ), + sex=user_profile.get('data').get( + 'sex' + ), + ), }, { 'key': '修改密码', diff --git a/dash-fastapi-frontend/views/system/user/profile/user_info.py b/dash-fastapi-frontend/views/system/user/profile/user_info.py index 25dcb61..f5defa8 100644 --- a/dash-fastapi-frontend/views/system/user/profile/user_info.py +++ b/dash-fastapi-frontend/views/system/user/profile/user_info.py @@ -2,82 +2,70 @@ import feffery_antd_components as fac from callbacks.system_c.user_c.profile_c import user_info_c # noqa: F401 -def render(): +def render(nick_name, phonenumber, email, sex): return fac.AntdForm( [ fac.AntdFormItem( fac.AntdInput( id='reset-user-nick_name', - placeholder='请输入用户昵称' + placeholder='请输入用户昵称', + value=nick_name, ), id='reset-user-nick_name-form-item', label='用户昵称', - required=True + required=True, ), fac.AntdFormItem( fac.AntdInput( id='reset-user-phonenumber', - placeholder='请输入手机号码' + placeholder='请输入手机号码', + value=phonenumber, ), id='reset-user-phonenumber-form-item', label='手机号码', - required=True + required=True, ), fac.AntdFormItem( fac.AntdInput( - id='reset-user-email', - placeholder='请输入邮箱' + id='reset-user-email', placeholder='请输入邮箱', value=email ), id='reset-user-email-form-item', label='邮箱', - required=True + required=True, ), fac.AntdFormItem( fac.AntdRadioGroup( id='reset-user-sex', options=[ - { - 'label': '男', - 'value': '0' - }, - { - 'label': '女', - 'value': '1' - } + {'label': '男', 'value': '0'}, + {'label': '女', 'value': '1'}, ], - defaultValue='1' + defaultValue='1', + value=sex, ), id='reset-user-sex-form-item', - label='性别' + label='性别', ), fac.AntdFormItem( fac.AntdSpace( [ fac.AntdButton( - '保存', - id='reset-submit', - type='primary' + '保存', id='reset-submit', type='primary' ), fac.AntdButton( '关闭', id='reset-close', type='primary', - danger=True + danger=True, ), ], ), - wrapperCol={ - 'offset': 4 - } - ) + wrapperCol={'offset': 4}, + ), ], - labelCol={ - 'span': 4 - }, - wrapperCol={ - 'span': 20 - }, + labelCol={'span': 4}, + wrapperCol={'span': 20}, style={ 'margin': '0 auto' # 以快捷实现居中布局效果 - } + }, ) -- Gitee From a89d897f1aedded66810b5569a5611813c9b6c5a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 20:21:27 +0800 Subject: [PATCH 129/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=B1=BB=E5=9E=8B=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 68 +++++++++++-------- .../views/system/dict/__init__.py | 43 ++---------- 2 files changed, 44 insertions(+), 67 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 877512e..255996f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -3,6 +3,7 @@ import uuid from dash import ctx, dcc, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate +from typing import Dict from api.system.dict.type import DictTypeApi from server import app from utils.common import validate_data_not_empty @@ -11,6 +12,44 @@ from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_dict_type_table(query_params: Dict): + """ + 根据查询参数获取字典类型表格数据及分页信息 + + :param query_params: 查询参数 + :return: 字典类型表格数据及分页信息 + """ + table_info = DictTypeApi.list_type(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) + item['key'] = str(item['dict_id']) + item['dict_type'] = { + 'content': item['dict_type'], + 'type': 'link', + } + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dict:edit') + else {}, + {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('system:dict:remove') + else {}, + ] + + return [table_data, table_pagination] + + @app.callback( output=dict( dict_type_table_data=Output( @@ -75,34 +114,7 @@ def get_dict_type_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = DictTypeApi.list_type(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - item['status'] = DictManager.get_dict_tag( - dict_type='sys_normal_disable', dict_value=item.get('status') - ) - item['key'] = str(item['dict_id']) - item['dict_type'] = { - 'content': item['dict_type'], - 'type': 'link', - } - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dict:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dict:remove') - else {}, - ] - + table_data, table_pagination = generate_dict_type_table(query_params) return dict( dict_type_table_data=table_data, dict_type_table_pagination=table_pagination, diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index e643368..f05591b 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -1,38 +1,15 @@ import feffery_antd_components as fac from dash import dcc, html -from api.system.dict.type import DictTypeApi -from callbacks.system_c.dict_c import dict_c # noqa: F401 +from callbacks.system_c.dict_c import dict_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect -from utils.dict_util import DictManager from utils.permission_util import PermissionManager from . import dict_data def render(*args, **kwargs): - dict_type_params = dict(page_num=1, page_size=10) - table_info = DictTypeApi.list_type(dict_type_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - item['status'] = DictManager.get_dict_tag( - dict_type='sys_normal_disable', dict_value=item.get('status') - ) - item['key'] = str(item['dict_id']) - item['dict_type'] = { - 'content': item['dict_type'], - 'type': 'link', - } - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dict:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dict:remove') - else {}, - ] + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = dict_c.generate_dict_type_table(query_params) return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -369,19 +346,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From b424121b281a9ca0932673804f7c657fec3ee157 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 20:21:46 +0800 Subject: [PATCH 130/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dept_c.py | 116 ++++++++++-------- .../views/system/dept/__init__.py | 51 +------- 2 files changed, 71 insertions(+), 96 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 2c1aa16..5923b44 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -2,6 +2,7 @@ import uuid from dash import ctx, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate +from typing import Dict from api.system.dept import DeptApi from server import app from utils.common import validate_data_not_empty @@ -11,6 +12,65 @@ from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree, list_to_tree_select +def generate_dept_table(query_params: Dict): + """ + 根据查询参数获取部门表格数据及展开信息 + + :param query_params: 查询参数 + :return: 部门表格数据及展开信息 + """ + table_info = DeptApi.list_dept(query_params) + default_expanded_row_keys = [] + table_data = table_info['data'] + for item in table_data: + default_expanded_row_keys.append(str(item['dept_id'])) + item['key'] = str(item['dept_id']) + if item['parent_id'] == 0: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, + ] + elif item['status'] == '1': + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + { + 'content': '删除', + 'type': 'link', + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:dept:remove') + else {}, + ] + else: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:dept:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:dept:add') + else {}, + { + 'content': '删除', + 'type': 'link', + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:dept:remove') + else {}, + ] + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) + table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') + + return [table_data_new, default_expanded_row_keys] + + @app.callback( output=dict( dept_table_data=Output('dept-list-table', 'data', allow_duplicate=True), @@ -49,66 +109,20 @@ def get_dept_table_data( """ query_params = dict(dept_name=dept_name, status=status_select) if search_click or refresh_click or operations or fold_click: - table_info = DeptApi.list_dept(query_params) - default_expanded_row_keys = [] - table_data = table_info['data'] - for item in table_data: - default_expanded_row_keys.append(str(item['dept_id'])) - item['key'] = str(item['dept_id']) - if item['parent_id'] == 0: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - ] - elif item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - item['status'] = DictManager.get_dict_tag( - dict_type='sys_normal_disable', dict_value=item.get('status') - ) - table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') - + table_data, default_expanded_row_keys = generate_dept_table( + query_params + ) if fold_click: if in_default_expanded_row_keys: return dict( - dept_table_data=table_data_new, + dept_table_data=table_data, dept_table_key=str(uuid.uuid4()), dept_table_defaultexpandedrowkeys=[], fold_click=None, ) return dict( - dept_table_data=table_data_new, + dept_table_data=table_data, dept_table_key=str(uuid.uuid4()), dept_table_defaultexpandedrowkeys=default_expanded_row_keys, fold_click=None, diff --git a/dash-fastapi-frontend/views/system/dept/__init__.py b/dash-fastapi-frontend/views/system/dept/__init__.py index f0109fd..5dc4fbe 100644 --- a/dash-fastapi-frontend/views/system/dept/__init__.py +++ b/dash-fastapi-frontend/views/system/dept/__init__.py @@ -1,55 +1,16 @@ import feffery_antd_components as fac from dash import dcc, html -from api.system.dept import DeptApi -from callbacks.system_c import dept_c # noqa: F401 +from callbacks.system_c import dept_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect -from utils.dict_util import DictManager from utils.permission_util import PermissionManager -from utils.tree_tool import list_to_tree def render(*args, **kwargs): - default_expanded_row_keys = [] - table_info = DeptApi.list_dept({}) - table_data = table_info['data'] - for item in table_data: - default_expanded_row_keys.append(str(item['dept_id'])) - item['key'] = str(item['dept_id']) - if item['parent_id'] == 0: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - ] - elif item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:dept:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:dept:add') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:dept:remove') - else {}, - ] - item['status'] = DictManager.get_dict_tag( - dict_type='sys_normal_disable', dict_value=item.get('status') - ) - table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') + query_params = {} + table_data, default_expanded_row_keys = dept_c.generate_dept_table( + query_params + ) return [ # 部门管理模块操作类型存储容器 @@ -225,7 +186,7 @@ def render(*args, **kwargs): fac.AntdSpin( fac.AntdTable( id='dept-list-table', - data=table_data_new, + data=table_data, columns=[ { 'dataIndex': 'dept_id', -- Gitee From 1f11e003ec9333230f2ac7cf04aa34855b063d2e Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 20:21:58 +0800 Subject: [PATCH 131/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/menu_c/menu_c.py | 116 ++++++++++-------- .../views/system/menu/__init__.py | 46 +------ 2 files changed, 69 insertions(+), 93 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index 28d2e89..34280dd 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -4,6 +4,7 @@ import uuid from dash import ctx, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate +from typing import Dict from api.system.menu import MenuApi from server import app from utils.feedback_util import MessageManager @@ -12,6 +13,65 @@ from utils.tree_tool import list_to_tree, list_to_tree_select from views.system.menu.components import button_type, content_type, menu_type +def generate_menu_table(query_params: Dict): + """ + 根据查询参数获取菜单表格数据及展开信息 + + :param query_params: 查询参数 + :return: 菜单表格数据及展开信息 + """ + table_info = MenuApi.list_menu(query_params) + default_expanded_row_keys = [] + table_data = table_info['data'] + for item in table_data: + default_expanded_row_keys.append(str(item['menu_id'])) + item['key'] = str(item['menu_id']) + item['icon'] = [ + { + 'type': 'link', + 'icon': item['icon'], + 'disabled': True, + 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, + }, + ] + if item['status'] == '1': + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + { + 'content': '删除', + 'type': 'link', + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:menu:remove') + else {}, + ] + else: + item['operation'] = [ + {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} + if PermissionManager.check_perms('system:menu:edit') + else {}, + {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} + if PermissionManager.check_perms('system:menu:add') + else {}, + { + 'content': '删除', + 'type': 'link', + 'icon': 'antd-delete', + } + if PermissionManager.check_perms('system:menu:remove') + else {}, + ] + if item['status'] == '0': + item['status'] = dict(tag='正常', color='blue') + else: + item['status'] = dict(tag='停用', color='volcano') + table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') + + return [table_data_new, default_expanded_row_keys] + + @app.callback( output=dict( menu_table_data=Output('menu-list-table', 'data', allow_duplicate=True), @@ -51,66 +111,20 @@ def get_menu_table_data( query_params = dict(menu_name=menu_name, status=status_select) if search_click or refresh_click or operations or fold_click: - table_info = MenuApi.list_menu(query_params) - default_expanded_row_keys = [] - table_data = table_info['data'] - for item in table_data: - default_expanded_row_keys.append(str(item['menu_id'])) - item['key'] = str(item['menu_id']) - item['icon'] = [ - { - 'type': 'link', - 'icon': item['icon'], - 'disabled': True, - 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, - }, - ] - if item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:menu:add') - else {}, - { - 'content': '删除', - 'type': 'link', - 'icon': 'antd-delete', - } - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') - + table_data, default_expanded_row_keys = generate_menu_table( + query_params + ) if fold_click: if not in_default_expanded_row_keys: return dict( - menu_table_data=table_data_new, + menu_table_data=table_data, menu_table_key=str(uuid.uuid4()), menu_table_defaultexpandedrowkeys=default_expanded_row_keys, fold_click=None, ) return dict( - menu_table_data=table_data_new, + menu_table_data=table_data, menu_table_key=str(uuid.uuid4()), menu_table_defaultexpandedrowkeys=[], fold_click=None, diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index e2a6941..0325f1d 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -1,51 +1,13 @@ import feffery_antd_components as fac from dash import dcc, html -from api.system.menu import MenuApi -from callbacks.system_c.menu_c import menu_c # noqa: F401 +from callbacks.system_c.menu_c import menu_c from utils.permission_util import PermissionManager -from utils.tree_tool import list_to_tree from views.system.menu.components.icon_category import render_icon def render(*args, **kwargs): - table_info = MenuApi.list_menu({}) - table_data = table_info['data'] - for item in table_data: - item['key'] = str(item['menu_id']) - item['icon'] = [ - { - 'type': 'link', - 'icon': item['icon'], - 'disabled': True, - 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, - }, - ] - if item['status'] == '1': - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - else: - item['operation'] = [ - {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} - if PermissionManager.check_perms('system:menu:edit') - else {}, - {'content': '新增', 'type': 'link', 'icon': 'antd-plus'} - if PermissionManager.check_perms('system:menu:add') - else {}, - {'content': '删除', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('system:menu:remove') - else {}, - ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') - table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') + query_params = {} + table_data = menu_c.generate_menu_table(query_params)[0] return [ # 菜单管理模块操作类型存储容器 @@ -235,7 +197,7 @@ def render(*args, **kwargs): fac.AntdSpin( fac.AntdTable( id='menu-list-table', - data=table_data_new, + data=table_data, columns=[ { 'dataIndex': 'menu_id', -- Gitee From d15ad92e99da87f94fd8bf0e248b7c92296164bd Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 20:22:14 +0800 Subject: [PATCH 132/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/operlog_c.py | 66 +++++++++++-------- .../views/monitor/operlog/__init__.py | 42 ++---------- 2 files changed, 45 insertions(+), 63 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index 7a1ea0f..ff00802 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -3,6 +3,7 @@ import uuid from dash import ctx, dcc from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate +from typing import Dict from api.monitor.operlog import OperlogApi from server import app from utils.dict_util import DictManager @@ -10,6 +11,43 @@ from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_operlog_table(query_params: Dict): + """ + 根据查询参数获取操作日志表格数据及分页信息 + + :param query_params: 查询参数 + :return: 操作日志表格数据及分页信息 + """ + table_info = OperlogApi.list_operlog(query_params) + if table_info['code'] == 200: + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['status_tag'] = DictManager.get_dict_tag( + dict_type='sys_common_status', dict_value=item.get('status') + ) + item['business_type_tag'] = DictManager.get_dict_tag( + dict_type='sys_oper_type', + dict_value=item.get('business_type'), + ) + item['key'] = str(item['oper_id']) + item['cost_time'] = f"{item['cost_time']}毫秒" + item['operation'] = [ + {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:operlog:query') + else {}, + ] + + return [table_data, table_pagination] + + @app.callback( output=dict( operation_log_table_data=Output( @@ -81,33 +119,7 @@ def get_operation_log_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = OperlogApi.list_operlog(query_params) - if table_info['code'] == 200: - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - item['status_tag'] = DictManager.get_dict_tag( - dict_type='sys_common_status', dict_value=item.get('status') - ) - item['business_type_tag'] = DictManager.get_dict_tag( - dict_type='sys_oper_type', - dict_value=item.get('business_type'), - ) - item['key'] = str(item['oper_id']) - item['cost_time'] = f"{item['cost_time']}毫秒" - item['operation'] = [ - {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} - if PermissionManager.check_perms('monitor:operlog:query') - else {}, - ] - + table_data, table_pagination = generate_operlog_table(query_params) return dict( operation_log_table_data=table_data, operation_log_table_pagination=table_pagination, diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index aaed882..8755708 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -1,33 +1,15 @@ import feffery_antd_components as fac from dash import dcc, html -from api.monitor.operlog import OperlogApi -from callbacks.monitor_c import operlog_c # noqa: F401 +from callbacks.monitor_c import operlog_c from components.ApiSelect import ApiSelect -from utils.dict_util import DictManager from utils.permission_util import PermissionManager def render(*args, **kwargs): - operation_log_params = dict(page_num=1, page_size=10) - table_info = OperlogApi.list_operlog(operation_log_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - item['status_tag'] = DictManager.get_dict_tag( - dict_type='sys_common_status', dict_value=item.get('status') - ) - item['business_type_tag'] = DictManager.get_dict_tag( - dict_type='sys_oper_type', dict_value=item.get('business_type') - ) - item['key'] = str(item['oper_id']) - item['cost_time'] = f"{item['cost_time']}毫秒" - item['operation'] = [ - {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} - if PermissionManager.check_perms('monitor:operlog:query') - else {}, - ] + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = operlog_c.generate_operlog_table( + query_params + ) return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -358,19 +340,7 @@ def render(*args, **kwargs): ], 'multiple': False, }, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From a9ec5b25c64f401af7cb783cfda0729e7628dd89 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 20:22:23 +0800 Subject: [PATCH 133/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/logininfor_c.py | 44 ++++++++++++------- .../views/monitor/logininfor/__init__.py | 33 +++----------- 2 files changed, 34 insertions(+), 43 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index 05967c1..cbc24e1 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -3,12 +3,39 @@ import uuid from dash import ctx, dcc from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate +from typing import Dict from api.monitor.logininfor import LogininforApi from server import app from utils.dict_util import DictManager from utils.feedback_util import MessageManager +def generate_logininfor_table(query_params: Dict): + """ + 根据查询参数获取登录日志表格数据及分页信息 + + :param query_params: 查询参数 + :return: 登录日志表格数据及分页信息 + """ + table_info = LogininforApi.list_logininfor(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['status_tag'] = DictManager.get_dict_tag( + dict_type='sys_common_status', dict_value=item.get('status') + ) + item['key'] = str(item['info_id']) + + return [table_data, table_pagination] + + @app.callback( output=dict( login_log_table_data=Output( @@ -77,22 +104,7 @@ def get_login_log_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = LogininforApi.list_logininfor(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - item['status_tag'] = DictManager.get_dict_tag( - dict_type='sys_common_status', dict_value=item.get('status') - ) - item['key'] = str(item['info_id']) - + table_data, table_pagination = generate_logininfor_table(query_params) return dict( login_log_table_data=table_data, login_log_table_pagination=table_pagination, diff --git a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py index 529b7ac..f475122 100644 --- a/dash-fastapi-frontend/views/monitor/logininfor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/logininfor/__init__.py @@ -1,24 +1,15 @@ import feffery_antd_components as fac from dash import dcc, html -from api.monitor.logininfor import LogininforApi -from callbacks.monitor_c import logininfor_c # noqa: F401 +from callbacks.monitor_c import logininfor_c from components.ApiSelect import ApiSelect -from utils.dict_util import DictManager from utils.permission_util import PermissionManager def render(*args, **kwargs): - login_log_params = dict(page_num=1, page_size=10) - table_info = LogininforApi.list_logininfor(login_log_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - item['status_tag'] = DictManager.get_dict_tag( - dict_type='sys_common_status', dict_value=item.get('status') - ) - item['key'] = str(item['info_id']) + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = logininfor_c.generate_logininfor_table( + query_params + ) return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -347,19 +338,7 @@ def render(*args, **kwargs): ], 'multiple': False, }, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From 92d3ad32c172135a02fe9ae869fcd1223397520a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 20:22:37 +0800 Subject: [PATCH 134/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E7=94=A8=E6=88=B7=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/online_c.py | 48 ++++++++++++------- .../views/monitor/online/__init__.py | 32 ++----------- 2 files changed, 34 insertions(+), 46 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py index 7852d9d..3c07af9 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/online_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/online_c.py @@ -2,12 +2,41 @@ import uuid from dash import ctx from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate +from typing import Dict from api.monitor.online import OnlineApi from server import app from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_online_table(query_params: Dict): + """ + 根据查询参数获取在线用户表格数据及分页信息 + + :param query_params: 查询参数 + :return: 在线用户表格数据及分页信息 + """ + table_info = OnlineApi.list_online(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + item['key'] = str(item['token_id']) + item['operation'] = [ + {'content': '强退', 'type': 'link', 'icon': 'antd-delete'} + if PermissionManager.check_perms('monitor:online:forceLogout') + else {}, + ] + + return [table_data, table_pagination] + + @app.callback( output=dict( online_table_data=Output( @@ -56,24 +85,7 @@ def get_online_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = OnlineApi.list_online(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - item['key'] = str(item['token_id']) - item['operation'] = [ - {'content': '强退', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('monitor:online:forceLogout') - else {}, - ] - + table_data, table_pagination = generate_online_table(query_params) return dict( online_table_data=table_data, online_table_pagination=table_pagination, diff --git a/dash-fastapi-frontend/views/monitor/online/__init__.py b/dash-fastapi-frontend/views/monitor/online/__init__.py index 169994d..75f6d2f 100644 --- a/dash-fastapi-frontend/views/monitor/online/__init__.py +++ b/dash-fastapi-frontend/views/monitor/online/__init__.py @@ -1,24 +1,12 @@ from dash import dcc, html import feffery_antd_components as fac -from api.monitor.online import OnlineApi -from callbacks.monitor_c import online_c # noqa: F401 +from callbacks.monitor_c import online_c from utils.permission_util import PermissionManager def render(*args, **kwargs): - online_params = dict(page_num=1, page_size=10) - table_info = OnlineApi.list_online(online_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - item['key'] = str(item['token_id']) - item['operation'] = [ - {'content': '强退', 'type': 'link', 'icon': 'antd-delete'} - if PermissionManager.check_perms('monitor:online:forceLogout') - else {}, - ] + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = online_c.generate_online_table(query_params) return [ # 在线用户模块操作类型存储容器 @@ -248,19 +236,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From ea9425139fc2e6feddcecb19bafb8d56e73459e7 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 20:22:50 +0800 Subject: [PATCH 135/229] =?UTF-8?q?perf:=20=E5=B0=81=E8=A3=85=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E8=A1=A8=E6=A0=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20#IASBFC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 86 +++++++++++-------- .../views/monitor/job/__init__.py | 52 +---------- 2 files changed, 53 insertions(+), 85 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 18b8c55..67187fe 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -3,6 +3,7 @@ import uuid from dash import ctx, dcc, no_update from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate +from typing import Dict from api.monitor.job import JobApi from server import app from utils.common import validate_data_not_empty @@ -11,6 +12,53 @@ from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +def generate_job_table(query_params: Dict): + """ + 根据查询参数获取定时任务表格数据及分页信息 + + :param query_params: 查询参数 + :return: 定时任务表格数据及分页信息 + """ + table_info = JobApi.list_job(query_params) + table_data = table_info['rows'] + table_pagination = dict( + pageSize=table_info['page_size'], + current=table_info['page_num'], + showSizeChanger=True, + pageSizeOptions=[10, 30, 50, 100], + showQuickJumper=True, + total=table_info['total'], + ) + for item in table_data: + if item['status'] == '0': + item['status'] = dict(checked=True) + else: + item['status'] = dict(checked=False) + item['job_group'] = DictManager.get_dict_tag( + dict_type='sys_job_group', dict_value=item.get('job_group') + ) + item['key'] = str(item['job_id']) + item['operation'] = [ + {'title': '修改', 'icon': 'antd-edit'} + if PermissionManager.check_perms('monitor:job:edit') + else None, + {'title': '删除', 'icon': 'antd-delete'} + if PermissionManager.check_perms('monitor:job:remove') + else None, + {'title': '执行一次', 'icon': 'antd-rocket'} + if PermissionManager.check_perms('monitor:job:changeStatus') + else None, + {'title': '任务详细', 'icon': 'antd-eye'} + if PermissionManager.check_perms('monitor:job:query') + else None, + {'title': '调度日志', 'icon': 'antd-history'} + if PermissionManager.check_perms('monitor:job:query') + else None, + ] + + return [table_data, table_pagination] + + @app.callback( output=dict( job_table_data=Output('job-list-table', 'data', allow_duplicate=True), @@ -61,43 +109,7 @@ def get_job_table_data( } ) if search_click or refresh_click or pagination or operations: - table_info = JobApi.list_job(query_params) - table_data = table_info['rows'] - table_pagination = dict( - pageSize=table_info['page_size'], - current=table_info['page_num'], - showSizeChanger=True, - pageSizeOptions=[10, 30, 50, 100], - showQuickJumper=True, - total=table_info['total'], - ) - for item in table_data: - if item['status'] == '0': - item['status'] = dict(checked=True) - else: - item['status'] = dict(checked=False) - item['job_group'] = DictManager.get_dict_tag( - dict_type='sys_job_group', dict_value=item.get('job_group') - ) - item['key'] = str(item['job_id']) - item['operation'] = [ - {'title': '修改', 'icon': 'antd-edit'} - if PermissionManager.check_perms('monitor:job:edit') - else None, - {'title': '删除', 'icon': 'antd-delete'} - if PermissionManager.check_perms('monitor:job:remove') - else None, - {'title': '执行一次', 'icon': 'antd-rocket'} - if PermissionManager.check_perms('monitor:job:changeStatus') - else None, - {'title': '任务详细', 'icon': 'antd-eye'} - if PermissionManager.check_perms('monitor:job:query') - else None, - {'title': '调度日志', 'icon': 'antd-history'} - if PermissionManager.check_perms('monitor:job:query') - else None, - ] - + table_data, table_pagination = generate_job_table(query_params) return dict( job_table_data=table_data, job_table_pagination=table_pagination, diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index 2ba4884..6f72809 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -1,47 +1,15 @@ import feffery_antd_components as fac from dash import dcc, html -from api.monitor.job import JobApi -from callbacks.monitor_c.job_c import job_c # noqa: F401 +from callbacks.monitor_c.job_c import job_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect -from utils.dict_util import DictManager from utils.permission_util import PermissionManager from . import job_log def render(*args, **kwargs): - job_params = dict(page_num=1, page_size=10) - table_info = JobApi.list_job(job_params) - table_data = table_info['rows'] - page_num = table_info['page_num'] - page_size = table_info['page_size'] - total = table_info['total'] - for item in table_data: - if item['status'] == '0': - item['status'] = dict(checked=True) - else: - item['status'] = dict(checked=False) - item['job_group'] = DictManager.get_dict_tag( - dict_type='sys_job_group', dict_value=item.get('job_group') - ) - item['key'] = str(item['job_id']) - item['operation'] = [ - {'title': '修改', 'icon': 'antd-edit'} - if PermissionManager.check_perms('monitor:job:edit') - else None, - {'title': '删除', 'icon': 'antd-delete'} - if PermissionManager.check_perms('monitor:job:remove') - else None, - {'title': '执行一次', 'icon': 'antd-rocket'} - if PermissionManager.check_perms('monitor:job:changeStatus') - else None, - {'title': '任务详细', 'icon': 'antd-eye'} - if PermissionManager.check_perms('monitor:job:query') - else None, - {'title': '调度日志', 'icon': 'antd-history'} - if PermissionManager.check_perms('monitor:job:query') - else None, - ] + query_params = dict(page_num=1, page_size=10) + table_data, table_pagination = job_c.generate_job_table(query_params) return [ # 用于导出成功后重置dcc.Download的状态,防止多次下载文件 @@ -363,19 +331,7 @@ def render(*args, **kwargs): rowSelectionType='checkbox', rowSelectionWidth=50, bordered=True, - pagination={ - 'pageSize': page_size, - 'current': page_num, - 'showSizeChanger': True, - 'pageSizeOptions': [ - 10, - 30, - 50, - 100, - ], - 'showQuickJumper': True, - 'total': total, - }, + pagination=table_pagination, mode='server-side', style={ 'width': '100%', -- Gitee From 85c5ea4f751b5f1273256ebdf37711bc67397af7 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 21:49:46 +0800 Subject: [PATCH 136/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E8=A1=A8=E6=A0=BCtag=E7=B1=BB?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py | 6 +++--- dash-fastapi-frontend/views/monitor/job/__init__.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 67187fe..440ee4b 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -31,10 +31,10 @@ def generate_job_table(query_params: Dict): ) for item in table_data: if item['status'] == '0': - item['status'] = dict(checked=True) + item['status_checked'] = dict(checked=True) else: - item['status'] = dict(checked=False) - item['job_group'] = DictManager.get_dict_tag( + item['status_checked'] = dict(checked=False) + item['job_group_tag'] = DictManager.get_dict_tag( dict_type='sys_job_group', dict_value=item.get('job_group') ) item['key'] = str(item['job_id']) diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index 6f72809..fddcd86 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -290,7 +290,7 @@ def render(*args, **kwargs): }, }, { - 'dataIndex': 'job_group', + 'dataIndex': 'job_group_tag', 'title': '任务组名', 'renderOptions': { 'renderType': 'tags' @@ -311,7 +311,7 @@ def render(*args, **kwargs): }, }, { - 'dataIndex': 'status', + 'dataIndex': 'status_checked', 'title': '状态', 'renderOptions': { 'renderType': 'switch' -- Gitee From 81291dc43a58586fe8da4acf1e8adef1faf808c2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 21:50:35 +0800 Subject: [PATCH 137/229] =?UTF-8?q?feat:=20=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=A1=A5=E5=85=85=E6=98=AF=E5=90=A6=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E5=BF=98=E8=AE=B0=E5=AF=86=E7=A0=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/controller/captcha_controller.py | 11 ++++++++++- .../module_admin/entity/vo/login_vo.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/controller/captcha_controller.py b/dash-fastapi-backend/module_admin/controller/captcha_controller.py index 35beeda..55b14f2 100644 --- a/dash-fastapi-backend/module_admin/controller/captcha_controller.py +++ b/dash-fastapi-backend/module_admin/controller/captcha_controller.py @@ -19,6 +19,11 @@ async def get_captcha_image(request: Request): == 'true' else False ) + forget_enabled = ( + True + if await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.forgetUser') == 'true' + else False + ) register_enabled = ( True if await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.registerUser') == 'true' @@ -35,6 +40,10 @@ async def get_captcha_image(request: Request): return ResponseUtil.success( model_content=CaptchaCode( - captcha_enabled=captcha_enabled, register_enabled=register_enabled, img=image, uuid=session_id + captcha_enabled=captcha_enabled, + forget_enabled=forget_enabled, + register_enabled=register_enabled, + img=image, + uuid=session_id, ) ) diff --git a/dash-fastapi-backend/module_admin/entity/vo/login_vo.py b/dash-fastapi-backend/module_admin/entity/vo/login_vo.py index 17cacc4..f948ce6 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/login_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/login_vo.py @@ -37,6 +37,7 @@ class Token(BaseModel): class CaptchaCode(BaseModel): captcha_enabled: bool = Field(description='是否启用验证码') + forget_enabled: bool = Field(description='是否启用忘记密码') register_enabled: bool = Field(description='是否启用注册') img: str = Field(description='验证码图片') uuid: str = Field(description='会话编号') -- Gitee From 6ea891e9ff3330c135e693510200afabb9d5bce3 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 21:50:53 +0800 Subject: [PATCH 138/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E7=9B=B8=E5=85=B3=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/app.py | 147 +----------------- .../callbacks/layout_c/aside_c.py | 12 +- dash-fastapi-frontend/callbacks/router_c.py | 136 ++++++++++++++++ 3 files changed, 143 insertions(+), 152 deletions(-) create mode 100644 dash-fastapi-frontend/callbacks/router_c.py diff --git a/dash-fastapi-frontend/app.py b/dash-fastapi-frontend/app.py index ae38e36..285c012 100644 --- a/dash-fastapi-frontend/app.py +++ b/dash-fastapi-frontend/app.py @@ -1,20 +1,10 @@ -import dash import feffery_antd_components as fac import feffery_utils_components as fuc from dash import dcc, html -from dash.dependencies import Input, Output, State -from flask import session -from api.login import LoginApi -from api.router import RouterApi -from callbacks import app_c # noqa: F401 +from callbacks import app_c, router_c # noqa: F401 from config.env import AppConfig -from config.global_config import RouterConfig from server import app from store.store import render_store_container -from utils.cache_util import CacheManager -from utils.router_util import RouterUtil -from utils.tree_tool import find_key_by_href, find_node_values -from views import forget, layout, login, page_404 app.layout = html.Div( @@ -68,141 +58,6 @@ app.layout = html.Div( ) -@app.callback( - output=dict( - app_mount=Output('app-mount', 'children'), - redirect_container=Output( - 'redirect-container', 'children', allow_duplicate=True - ), - menu_current_key=Output('current-key-container', 'data'), - search_panel_data=Output('search-panel', 'data'), - ), - inputs=dict(pathname=Input('url-container', 'pathname')), - state=dict( - url_trigger=State('url-container', 'trigger'), - session_token=State('token-container', 'data'), - ), - prevent_initial_call=True, -) -def router(pathname, url_trigger, session_token): - """ - 全局路由回调 - """ - # 检查当前会话是否已经登录 - token_result = session.get('Authorization') - # 若已登录 - if token_result and session_token and token_result == session_token: - if url_trigger == 'load': - current_user = LoginApi.get_info() - router_list_result = RouterApi.get_routers() - router_list = router_list_result['data'] - menu_info = RouterUtil.generate_menu_tree(router_list) - # search_panel_data = get_search_panel_data(user_menu_list) - search_panel_data = [] - permissions = { - 'perms': current_user['permissions'], - 'roles': current_user['roles'], - } - cache_obj = dict( - user_info=current_user['user'], - permissions=permissions, - menu_info=menu_info, - search_panel_data=search_panel_data, - ) - CacheManager.set(cache_obj) - menu_info = CacheManager.get('menu_info') - search_panel_data = CacheManager.get('search_panel_data') - dynamic_valid_pathname_list = find_node_values(menu_info, 'href') - valid_href_list = ( - dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME - ) - if pathname in valid_href_list: - current_key = find_key_by_href(menu_info, pathname) - if pathname == '/': - current_key = '首页' - if pathname == '/user/profile': - current_key = '个人资料' - if url_trigger == 'load': - # 根据pathname控制渲染行为 - if pathname == '/login' or pathname == '/forget': - # 重定向到主页面 - return dict( - app_mount=dash.no_update, - redirect_container=dcc.Location( - pathname='/', id='router-redirect' - ), - menu_current_key={'current_key': current_key}, - search_panel_data=search_panel_data, - ) - - user_menu_info = RouterUtil.generate_menu_tree( - RouterUtil.get_visible_routers(router_list) - ) - # 否则正常渲染主页面 - return dict( - app_mount=layout.render_content(user_menu_info), - redirect_container=None, - menu_current_key={'current_key': current_key}, - search_panel_data=search_panel_data, - ) - - else: - return dict( - app_mount=dash.no_update, - redirect_container=None, - menu_current_key={'current_key': current_key}, - search_panel_data=search_panel_data, - ) - - else: - # 渲染404状态页 - return dict( - app_mount=page_404.render_content(), - redirect_container=None, - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, - ) - - else: - # 若未登录 - # 根据pathname控制渲染行为 - # 检验pathname合法性 - if pathname not in RouterConfig.BASIC_VALID_PATHNAME: - # 渲染404状态页 - return dict( - app_mount=page_404.render_content(), - redirect_container=None, - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, - ) - - if pathname == '/login': - return dict( - app_mount=login.render_content(), - redirect_container=None, - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, - ) - - if pathname == '/forget': - return dict( - app_mount=forget.render_forget_content(), - redirect_container=None, - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, - ) - - # 否则重定向到登录页 - return dict( - app_mount=dash.no_update, - redirect_container=dcc.Location( - pathname='/login', id='router-redirect' - ), - menu_current_key=dash.no_update, - search_panel_data=dash.no_update, - ) - - if __name__ == '__main__': app.run( host=AppConfig.app_host, diff --git a/dash-fastapi-frontend/callbacks/layout_c/aside_c.py b/dash-fastapi-frontend/callbacks/layout_c/aside_c.py index 71dfe84..d5315ca 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/aside_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/aside_c.py @@ -5,15 +5,15 @@ from server import app # url-pathname控制currentKey回调 app.clientside_callback( - ''' - (data) => { - if (data) { - return data['current_key']; + """ + (current_key) => { + if (current_key) { + return current_key; } return window.dash_clientside.no_update; } - ''', + """, Output('index-side-menu', 'currentKey'), Input('current-key-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) diff --git a/dash-fastapi-frontend/callbacks/router_c.py b/dash-fastapi-frontend/callbacks/router_c.py new file mode 100644 index 0000000..140b42a --- /dev/null +++ b/dash-fastapi-frontend/callbacks/router_c.py @@ -0,0 +1,136 @@ +from dash import dcc, no_update +from dash.dependencies import Input, Output, State +from flask import session +from api.login import LoginApi +from api.router import RouterApi +from config.global_config import RouterConfig +from server import app +from utils.cache_util import CacheManager +from utils.router_util import RouterUtil +from utils.tree_tool import find_key_by_href, find_node_values +from views import forget, layout, login, page_404 + + +@app.callback( + output=dict( + app_mount=Output('app-mount', 'children'), + redirect_container=Output( + 'redirect-container', 'children', allow_duplicate=True + ), + menu_current_key=Output('current-key-container', 'data'), + search_panel_data=Output('search-panel', 'data'), + ), + inputs=dict(pathname=Input('url-container', 'pathname')), + state=dict( + url_trigger=State('url-container', 'trigger'), + session_token=State('token-container', 'data'), + ), + prevent_initial_call=True, +) +def router(pathname, url_trigger, session_token): + """ + 全局路由回调 + """ + # 检查当前会话是否已经登录 + token_result = session.get('Authorization') + # 若已登录 + if token_result and session_token and token_result == session_token: + if url_trigger == 'load': + current_user = LoginApi.get_info() + router_list_result = RouterApi.get_routers() + router_list = router_list_result['data'] + menu_info = RouterUtil.generate_menu_tree(router_list) + # search_panel_data = get_search_panel_data(user_menu_list) + search_panel_data = [] + permissions = { + 'perms': current_user['permissions'], + 'roles': current_user['roles'], + } + cache_obj = dict( + user_info=current_user['user'], + permissions=permissions, + menu_info=menu_info, + search_panel_data=search_panel_data, + ) + CacheManager.set(cache_obj) + menu_info = CacheManager.get('menu_info') + search_panel_data = CacheManager.get('search_panel_data') + dynamic_valid_pathname_list = find_node_values(menu_info, 'href') + valid_href_list = ( + dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME + ) + if pathname in valid_href_list: + current_key = find_key_by_href(menu_info, pathname) + if pathname == '/': + current_key = '首页' + if pathname == '/user/profile': + current_key = '个人资料' + if url_trigger == 'load': + # 根据pathname控制渲染行为 + if pathname == '/login' or pathname == '/forget': + # 重定向到主页面 + return dict( + app_mount=no_update, + redirect_container=dcc.Location( + pathname='/', id='router-redirect' + ), + menu_current_key=current_key, + search_panel_data=search_panel_data, + ) + + user_menu_info = RouterUtil.generate_menu_tree( + RouterUtil.get_visible_routers(router_list) + ) + # 否则正常渲染主页面 + return dict( + app_mount=layout.render_content(user_menu_info), + redirect_container=None, + menu_current_key=current_key, + search_panel_data=search_panel_data, + ) + + else: + return dict( + app_mount=no_update, + redirect_container=None, + menu_current_key=current_key, + search_panel_data=search_panel_data, + ) + + else: + # 渲染404状态页 + return dict( + app_mount=page_404.render_content(), + redirect_container=None, + menu_current_key=no_update, + search_panel_data=no_update, + ) + + else: + # 若未登录 + # 根据pathname控制渲染行为 + if pathname == '/login': + return dict( + app_mount=login.render_content(), + redirect_container=None, + menu_current_key=no_update, + search_panel_data=no_update, + ) + + if pathname == '/forget': + return dict( + app_mount=forget.render_forget_content(), + redirect_container=None, + menu_current_key=no_update, + search_panel_data=no_update, + ) + + # 否则重定向到登录页 + return dict( + app_mount=no_update, + redirect_container=dcc.Location( + pathname='/login', id='router-redirect' + ), + menu_current_key=no_update, + search_panel_data=no_update, + ) -- Gitee From e6a695893e6ab5ed1045d746e65d8cd7e4b19816 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 21:51:24 +0800 Subject: [PATCH 139/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=9B=9E=E8=B0=83=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/login_c.py | 55 ++++++++++++++++------ dash-fastapi-frontend/views/login.py | 50 +++++++------------- 2 files changed, 58 insertions(+), 47 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index 3a11f8b..558c9a1 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -1,5 +1,7 @@ +import feffery_antd_components as fac from dash import dcc, get_asset_url, no_update from dash.dependencies import Input, Output, State +from dash.exceptions import PreventUpdate from flask import session from api.login import LoginApi from server import app @@ -19,7 +21,6 @@ from utils.feedback_util import MessageManager username_form_help=Output('login-username-form-item', 'help'), password_form_help=Output('login-password-form-item', 'help'), captcha_form_help=Output('login-captcha-form-item', 'help'), - image_click=Output('login-captcha-image-container', 'n_clicks'), token=Output('token-container', 'data'), redirect_container=Output( 'redirect-container', 'children', allow_duplicate=True @@ -31,10 +32,12 @@ from utils.feedback_util import MessageManager password=State('login-password', 'value'), input_captcha=State('login-captcha', 'value'), session_id=State('captcha_image-session_id-container', 'data'), - image_click=State('login-captcha-image-container', 'n_clicks'), captcha_hidden=State('captcha-row-container', 'hidden'), ), - running=[[Output('login-submit', 'loading'), True, False]], + running=[ + [Output('login-submit', 'loading'), True, False], + [Output('login-captcha-image-container', 'n_clicks'), 0, 1], + ], prevent_initial_call=True, ) def login_auth( @@ -43,17 +46,14 @@ def login_auth( password, input_captcha, session_id, - image_click, captcha_hidden, ): if nClicks: + validate_list = [username, password, input_captcha] if captcha_hidden: - input_captcha = 'hidden' + validate_list = [username, password] # 校验全部输入值是否不为空 - if all( - validate_data_not_empty(item) - for item in [username, password, input_captcha] - ): + if all(validate_data_not_empty(item) for item in validate_list): user_params = dict( username=username, password=password, @@ -71,7 +71,6 @@ def login_auth( username_form_help=None, password_form_help=None, captcha_form_help=None, - image_click=no_update, token=token, redirect_container=dcc.Location( pathname='/', id='login-redirect' @@ -97,7 +96,6 @@ def login_auth( captcha_form_help=None if validate_data_not_empty(input_captcha) else '请输入验证码!', - image_click=no_update, token=None, redirect_container=None, ) @@ -109,7 +107,6 @@ def login_auth( username_form_help=no_update, password_form_help=no_update, captcha_form_help=no_update, - image_click=image_click + 1, token=no_update, redirect_container=no_update, ) @@ -117,24 +114,52 @@ def login_auth( @app.callback( [ + Output('captcha-row-container', 'hidden'), + Output('register-user-link-container', 'children'), + Output('forget-password-link-container', 'children'), Output('login-captcha-image', 'src'), Output('captcha_image-session_id-container', 'data'), ], Input('login-captcha-image-container', 'n_clicks'), + State('redirect-container', 'children'), prevent_initial_call=True, ) -def change_login_captcha_image(captcha_click): - if captcha_click: +def change_login_captcha_image(captcha_click, redirect): + if captcha_click and not redirect: captcha_image_info = LoginApi.get_code_img() + captcha_enabled = captcha_image_info.get('captcha_enabled') + forget_enabled = captcha_image_info.get('forget_enabled') + register_enabled = captcha_image_info.get('register_enabled') captcha_image = f"data:image/gif;base64,{captcha_image_info.get('img')}" session_id = captcha_image_info.get('uuid') return [ + not captcha_enabled, + fac.AntdButton( + '用户注册', + id='register-user-link', + type='link', + href='/register', + target='_self', + style={'padding': 0}, + ) + if register_enabled + else [], + fac.AntdButton( + '忘记密码', + id='forget-password-link', + type='link', + href='/forget', + target='_self', + style={'padding': 0}, + ) + if forget_enabled + else [], captcha_image, session_id, ] - return [no_update] * 2 + raise PreventUpdate @app.callback( diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index 4c623f4..69be756 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -1,21 +1,9 @@ -from dash import html, dcc import feffery_antd_components as fac - -import callbacks.login_c +from dash import dcc, html +from callbacks import login_c # noqa: F401 def render_content(): - # captcha_enabled_info = query_config_list_api( - # config_key="sys.account.captchaEnabled" - # ) - # forget_enabled_info = query_config_list_api(config_key="sys.account.forgetUser") - captcha_hidden = False - forget_show = True - # if captcha_enabled_info.get("code") == 200: - # captcha_hidden = False if captcha_enabled_info.get("data") == "true" else True - # if forget_enabled_info.get("code") == 200: - # forget_show = False if forget_enabled_info.get("data") == "false" else True - return html.Div( [ dcc.Store(id='captcha_image-session_id-container'), @@ -120,7 +108,6 @@ def render_content(): ) ], id='login-captcha-image-container', - n_clicks=1, style={ 'border': '1px solid #ccc' }, @@ -132,24 +119,7 @@ def render_content(): ), ], id='captcha-row-container', - hidden=captcha_hidden, ), - fac.AntdSpace( - [ - html.Div(id='test'), - fac.AntdButton( - '忘记密码', - id='forget-password-link', - type='link', - href='/forget', - target='_self', - ), - ], - align='center', - size=240, - ) - if forget_show - else [], fac.AntdFormItem( fac.AntdButton( '登录', @@ -162,6 +132,22 @@ def render_content(): ), style={'marginTop': '20px'}, ), + fac.AntdFormItem( + html.Div( + [ + html.Div( + id='register-user-link-container' + ), + html.Div( + id='forget-password-link-container' + ), + ], + style={ + 'display': 'flex', + 'justifyContent': 'space-between', + }, + ) + ), ], layout='vertical', style={'width': '100%'}, -- Gitee From 357ff866181e379c296fa10c4ac06fa593aa7edb Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 20 Sep 2024 21:58:18 +0800 Subject: [PATCH 140/229] =?UTF-8?q?feat:=20=E7=99=BB=E5=BD=95=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=96=B0=E5=A2=9E=E5=9B=9E=E8=BD=A6=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=20#IAPJ9V?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/login_c.py | 10 +++++++--- dash-fastapi-frontend/views/login.py | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index 558c9a1..4d913c8 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -26,7 +26,10 @@ from utils.feedback_util import MessageManager 'redirect-container', 'children', allow_duplicate=True ), ), - inputs=dict(nClicks=Input('login-submit', 'nClicks')), + inputs=dict( + button_click=Input('login-submit', 'nClicks'), + keyboard_enter_press=Input('keyboard-enter-submit', 'pressedCounts'), + ), state=dict( username=State('login-username', 'value'), password=State('login-password', 'value'), @@ -41,14 +44,15 @@ from utils.feedback_util import MessageManager prevent_initial_call=True, ) def login_auth( - nClicks, + button_click, + keyboard_enter_press, username, password, input_captcha, session_id, captcha_hidden, ): - if nClicks: + if button_click or keyboard_enter_press: validate_list = [username, password, input_captcha] if captcha_hidden: validate_list = [username, password] diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index 69be756..a1006e8 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -1,4 +1,5 @@ import feffery_antd_components as fac +import feffery_utils_components as fuc from dash import dcc, html from callbacks import login_c # noqa: F401 @@ -120,6 +121,9 @@ def render_content(): ], id='captcha-row-container', ), + fuc.FefferyKeyPress( + id='keyboard-enter-submit', keys='enter' + ), fac.AntdFormItem( fac.AntdButton( '登录', -- Gitee From 1bc88a5294cc2c644f6632b65a55e6b36c7e18aa Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:22:27 +0800 Subject: [PATCH 141/229] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py | 1 + dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py | 1 + 2 files changed, 2 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 440ee4b..f4c71e1 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -662,6 +662,7 @@ def job_to_job_log_modal( Output('job-export-complete-judge-container', 'data'), ], Input('job-export', 'nClicks'), + running=[[Output('job-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_job_list(export_click): diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index fc8531d..fc579d6 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -283,6 +283,7 @@ def job_log_delete_confirm(delete_confirm, job_log_ids_data): Output('job_log-export-complete-judge-container', 'data'), ], Input('job_log-export', 'nClicks'), + running=[[Output('job_log-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_job_log_list(export_click): -- Gitee From ffc3ee2e857674c1bfe624066d463f1865299c37 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:22:44 +0800 Subject: [PATCH 142/229] =?UTF-8?q?feat:=20=E7=99=BB=E5=BD=95=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index cbc24e1..d371633 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -270,6 +270,7 @@ def login_log_delete_confirm(delete_confirm, info_ids_data): Output('login_log-export-complete-judge-container', 'data'), ], Input('login_log-export', 'nClicks'), + running=[[Output('login_log-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_login_log_list(export_click): -- Gitee From 557bf784caceb6e0bc5432370c8b82548a597cd4 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:22:54 +0800 Subject: [PATCH 143/229] =?UTF-8?q?feat:=20=E6=93=8D=E4=BD=9C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index ff00802..3670e97 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -329,6 +329,7 @@ def operation_log_delete_confirm(delete_confirm, oper_ids_data): Output('operation_log-export-complete-judge-container', 'data'), ], Input('operation_log-export', 'nClicks'), + running=[[Output('operation_log-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_operation_log_list(export_click): -- Gitee From d95d25b68ccc444f1e7c62817745a3fa11243f7f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:23:08 +0800 Subject: [PATCH 144/229] =?UTF-8?q?feat:=20=E5=AD=97=E5=85=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py | 2 ++ dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py | 1 + 2 files changed, 3 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 255996f..137d4ca 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -557,6 +557,7 @@ def dict_type_to_dict_data_modal( Output('dict_type-export-complete-judge-container', 'data'), ], Input('dict_type-export', 'nClicks'), + running=[[Output('dict_type-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_dict_type_list(export_click): @@ -597,6 +598,7 @@ def reset_dict_type_export_status(data): @app.callback( Input('dict_type-refresh-cache', 'nClicks'), + running=[[Output('dict_type-refresh-cache', 'loading'), True, False]], prevent_initial_call=True, ) def refresh_dict_cache(refresh_click): diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index b36f901..faebc1f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -478,6 +478,7 @@ def dict_data_delete_confirm(delete_confirm, dict_codes_data): ], Input('dict_data-export', 'nClicks'), State('dict_data-dict_type-select', 'value'), + running=[[Output('dict_data-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_dict_data_list(export_click, dict_type): -- Gitee From 676eeabe607e1f3d47b19abb4166266c0b03b1b7 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:23:22 +0800 Subject: [PATCH 145/229] =?UTF-8?q?feat:=20=E5=B2=97=E4=BD=8D=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/post_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index cae43d4..54be0da 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -462,6 +462,7 @@ def post_delete_confirm(delete_confirm, post_ids_data): Output('post-export-complete-judge-container', 'data'), ], Input('post-export', 'nClicks'), + running=[[Output('post-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_post_list(export_click): -- Gitee From f29448ca63ac8b1f5fe8717da39dea55c71d6ebd Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:23:31 +0800 Subject: [PATCH 146/229] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/config_c.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 38750c3..24b5c16 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -486,6 +486,7 @@ def config_delete_confirm(delete_confirm, config_ids_data): Output('config-export-complete-judge-container', 'data'), ], Input('config-export', 'nClicks'), + running=[[Output('config-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_config_list(export_click): @@ -526,6 +527,7 @@ def reset_config_export_status(data): @app.callback( Input('config-refresh-cache', 'nClicks'), + running=[[Output('config-refresh-cache', 'loading'), True, False]], prevent_initial_call=True, ) def refresh_config_cache(refresh_click): -- Gitee From bbdd5971c9413e99fd10b3d85b1d57c1fb0e38de Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:23:50 +0800 Subject: [PATCH 147/229] =?UTF-8?q?feat:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index bffc607..8f8aa09 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -711,6 +711,7 @@ def role_to_allocated_user_modal(allocated_click, allocated_user_search_nclick): Output('role-export-complete-judge-container', 'data'), ], Input('role-export', 'nClicks'), + running=[[Output('role-export', 'loading'), True, False]], prevent_initial_call=True, ) def export_role_list(export_click): -- Gitee From 6f4701e07443ee088dfce2660144684b0cf918b1 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:24:39 +0800 Subject: [PATCH 148/229] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system_c/user_c/allocate_role_c.py | 29 +++-- .../callbacks/system_c/user_c/user_c.py | 109 +++++++++++------- .../views/system/user/__init__.py | 3 +- 3 files changed, 87 insertions(+), 54 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py index 1f9069a..9e99763 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/allocate_role_c.py @@ -1,4 +1,3 @@ -from dash import ctx from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate from api.system.user import UserApi @@ -8,24 +7,19 @@ from utils.feedback_util import MessageManager @app.callback( Output('user_to_allocated_role-modal', 'visible', allow_duplicate=True), - [ - Input('allocate_role-submit-button', 'nClicks'), - Input('allocate_role-back-button', 'nClicks'), - ], + Input('allocate_role-submit-button', 'nClicks'), [ State('allocate_role-list-table', 'selectedRowKeys'), State('allocate_role-user_id-container', 'data'), ], + running=[[Output('allocate_role-submit-button', 'loading'), True, False]], prevent_initial_call=True, ) -def allocate_user_add_confirm( - add_confirm, back_confirm, selected_row_keys, user_id -): +def allocate_user_add_confirm(add_confirm, selected_row_keys, user_id): """ 添加角色确认回调,实现给用户分配角色操作 """ - trigger_id = ctx.triggered_id - if trigger_id == 'allocate_role-submit-button': + if add_confirm: params = { 'user_id': int(user_id), 'role_ids': ','.join(selected_row_keys) @@ -36,7 +30,20 @@ def allocate_user_add_confirm( MessageManager.success(content='分配成功') return False - if trigger_id == 'allocate_role-back-button': + + raise PreventUpdate + + +@app.callback( + Output('user_to_allocated_role-modal', 'visible', allow_duplicate=True), + Input('allocate_role-back-button', 'nClicks'), + prevent_initial_call=True, +) +def allocate_user_back_confirm(back_confirm): + """ + 关闭分配角色弹框操作 + """ + if back_confirm: return False raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 076dd3a..6e4251f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -614,7 +614,9 @@ def user_delete_confirm(delete_confirm, user_ids_data): @app.callback( [ - Output('user-reset-password-confirm-modal', 'visible'), + Output( + 'user-reset-password-confirm-modal', 'visible', allow_duplicate=True + ), Output('reset-password-row-key-store', 'data'), Output('reset-password-input', 'value'), ], @@ -645,12 +647,24 @@ def user_reset_password_modal( @app.callback( - Output('user-operations-store', 'data', allow_duplicate=True), + [ + Output('user-operations-store', 'data', allow_duplicate=True), + Output( + 'user-reset-password-confirm-modal', 'visible', allow_duplicate=True + ), + ], Input('user-reset-password-confirm-modal', 'okCounts'), [ State('reset-password-row-key-store', 'data'), State('reset-password-input', 'value'), ], + running=[ + [ + Output('user-reset-password-confirm-modal', 'confirmLoading'), + True, + False, + ] + ], prevent_initial_call=True, ) def user_reset_password_confirm(reset_confirm, user_id_data, reset_password): @@ -663,7 +677,7 @@ def user_reset_password_confirm(reset_confirm, user_id_data, reset_password): ) MessageManager.success(content='重置成功') - return {'type': 'reset-password'} + return [{'type': 'reset-password'}, False] raise PreventUpdate @@ -734,23 +748,20 @@ app.clientside_callback( if (nClicks) { return [ true, - [], - [], + null, false ]; } return [ false, window.dash_clientside.no_update, - window.dash_clientside.no_update, window.dash_clientside.no_update ]; } """, [ Output('user-import-confirm-modal', 'visible'), - Output('user-upload-choose', 'listUploadTaskRecord'), - Output('user-upload-choose', 'defaultFileList'), + Output('user-upload-choose', 'contents'), Output('user-import-update-check', 'checked'), ], Input('user-import', 'nClicks'), @@ -760,7 +771,6 @@ app.clientside_callback( @app.callback( output=dict( - confirm_loading=Output('user-import-confirm-modal', 'confirmLoading'), modal_visible=Output('batch-result-modal', 'visible'), batch_result=Output('batch-result-content', 'children'), operations=Output( @@ -772,6 +782,10 @@ app.clientside_callback( contents=State('user-upload-choose', 'contents'), is_update=State('user-import-update-check', 'checked'), ), + running=[ + [Output('user-import-confirm-modal', 'confirmLoading'), True, False], + [Output('user-import-confirm-modal', 'okText'), '导入中', '导入'], + ], prevent_initial_call=True, ) def user_import_confirm(import_confirm, contents, is_update): @@ -789,7 +803,6 @@ def user_import_confirm(import_confirm, contents, is_update): MessageManager.success(content='导入成功') return dict( - confirm_loading=False, modal_visible=True if batch_import_result.get('msg') else False, batch_result=batch_import_result.get('msg'), operations={'type': 'batch-import'}, @@ -798,7 +811,6 @@ def user_import_confirm(import_confirm, contents, is_update): MessageManager.warning(content='请上传需要导入的文件') return dict( - confirm_loading=False, modal_visible=no_update, batch_result=no_update, operations=no_update, @@ -810,46 +822,61 @@ def user_import_confirm(import_confirm, contents, is_update): @app.callback( [ Output('user-export-container', 'data', allow_duplicate=True), - Output('user-export-complete-judge-container', 'data'), + Output( + 'user-export-complete-judge-container', 'data', allow_duplicate=True + ), ], + Input('download-user-import-template', 'nClicks'), + prevent_initial_call=True, +) +def download_user_template(download_click): + """ + 下载导入用户模板回调 + """ + if download_click: + download_template_res = UserApi.download_template() + download_template = download_template_res.content + MessageManager.success(content='下载成功') + + return [ + dcc.send_bytes( + download_template, + f'用户导入模板_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), + {'timestamp': time.time()}, + ] + + raise PreventUpdate + + +@app.callback( [ - Input('user-export', 'nClicks'), - Input('download-user-import-template', 'nClicks'), + Output('user-export-container', 'data', allow_duplicate=True), + Output( + 'user-export-complete-judge-container', 'data', allow_duplicate=True + ), ], + Input('user-export', 'nClicks'), + running=[[Output('user-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_user_list(export_click, download_click): +def export_user_list(export_click): """ 导出用户信息回调 """ - trigger_id = ctx.triggered_id - if export_click or download_click: - if trigger_id == 'user-export': - export_user_res = UserApi.export_user({}) - MessageManager.success(content='导出成功') + if export_click: + export_user_res = UserApi.export_user({}) + MessageManager.success(content='导出成功') - export_user = export_user_res.content + export_user = export_user_res.content - return [ - dcc.send_bytes( - export_user, - f'用户信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - ] - - if trigger_id == 'download-user-import-template': - download_template_res = UserApi.download_template() - download_template = download_template_res.content - MessageManager.success(content='下载成功') - - return [ - dcc.send_bytes( - download_template, - f'用户导入模板_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', - ), - {'timestamp': time.time()}, - ] + return [ + dcc.send_bytes( + export_user, + f'用户信息_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.xlsx', + ), + {'timestamp': time.time()}, + ] raise PreventUpdate diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 2335a16..58803e9 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -671,8 +671,6 @@ def render(*args, **kwargs): renderFooter=True, centered=True, okText='导入', - confirmAutoSpin=True, - loadingOkText='导入中', okClickClose=False, ), fac.AntdModal( @@ -707,6 +705,7 @@ def render(*args, **kwargs): title='重置密码', renderFooter=True, centered=True, + okClickClose=False, ), # 分配角色modal fac.AntdModal( -- Gitee From 5dace38c69e98091f543451f8ec3ea0ef048d3c2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 17:29:15 +0800 Subject: [PATCH 149/229] =?UTF-8?q?feat:=20=E4=B8=AA=E4=BA=BA=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=A8=A1=E5=9D=97=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/user_c/profile_c/avatar_c.py | 1 + .../callbacks/system_c/user_c/profile_c/reset_pwd_c.py | 1 + .../callbacks/system_c/user_c/profile_c/user_info_c.py | 1 + 3 files changed, 3 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py index 7cfd450..0d18a2d 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/avatar_c.py @@ -83,6 +83,7 @@ app.clientside_callback( ], Input('change-avatar-submit', 'nClicks'), State('avatar-cropper', 'croppedImageData'), + running=[[Output('change-avatar-submit', 'loading'), True, False]], prevent_initial_call=True, ) def change_user_avatar_callback(submit_click, avatar_data): diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py index ea21fb9..3a86dec 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py @@ -20,6 +20,7 @@ from utils.feedback_util import MessageManager State('reset-new-password', 'value'), State('reset-confirm-password', 'value'), ], + running=[[Output('reset-password-submit', 'loading'), True, False]], prevent_initial_call=True, ) def reset_submit_user_info( diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py index 1b93406..ceef290 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py @@ -21,6 +21,7 @@ from utils.feedback_util import MessageManager State('reset-user-email', 'value'), State('reset-user-sex', 'value'), ], + running=[[Output('reset-submit', 'loading'), True, False]], prevent_initial_call=True, ) def reset_submit_user_info(reset_click, nick_name, phonenumber, email, sex): -- Gitee From 287fe6fa7ab9f0949f883b9d8c467067b854ced7 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 19:03:49 +0800 Subject: [PATCH 150/229] =?UTF-8?q?feat:=20=E7=99=BB=E5=BD=95=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=96=B0=E5=A2=9E=E8=AE=B0=E4=BD=8F=E6=88=91=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/js/js.cookie.min.js | 2 + .../assets/js/jsencrypt.min.js | 2 + .../assets/js/jsencrypt_func.js | 28 ++++++++ dash-fastapi-frontend/callbacks/login_c.py | 64 ++++++++++++++++++- dash-fastapi-frontend/views/login.py | 13 +++- 5 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 dash-fastapi-frontend/assets/js/js.cookie.min.js create mode 100644 dash-fastapi-frontend/assets/js/jsencrypt.min.js create mode 100644 dash-fastapi-frontend/assets/js/jsencrypt_func.js diff --git a/dash-fastapi-frontend/assets/js/js.cookie.min.js b/dash-fastapi-frontend/assets/js/js.cookie.min.js new file mode 100644 index 0000000..962d48d --- /dev/null +++ b/dash-fastapi-frontend/assets/js/js.cookie.min.js @@ -0,0 +1,2 @@ +/*! js-cookie v3.0.5 | MIT */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.Cookies,o=e.Cookies=t();o.noConflict=function(){return e.Cookies=n,o}}())}(this,(function(){"use strict";function e(e){for(var t=1;t(()=>{var t={155:t=>{var e,i,r=t.exports={};function n(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(t){if(e===setTimeout)return setTimeout(t,0);if((e===n||!e)&&setTimeout)return e=setTimeout,setTimeout(t,0);try{return e(t,0)}catch(i){try{return e.call(null,t,0)}catch(i){return e.call(this,t,0)}}}!function(){try{e="function"==typeof setTimeout?setTimeout:n}catch(t){e=n}try{i="function"==typeof clearTimeout?clearTimeout:s}catch(t){i=s}}();var h,a=[],u=!1,c=-1;function f(){u&&h&&(u=!1,h.length?a=h.concat(a):c=-1,a.length&&l())}function l(){if(!u){var t=o(f);u=!0;for(var e=a.length;e;){for(h=a,a=[];++c1)for(var i=1;i{for(var r in e)i.o(e,r)&&!i.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var r={};return(()=>{"use strict";i.d(r,{default:()=>ct});var t="0123456789abcdefghijklmnopqrstuvwxyz";function e(e){return t.charAt(e)}function n(t,e){return t&e}function s(t,e){return t|e}function o(t,e){return t^e}function h(t,e){return t&~e}function a(t){if(0==t)return-1;var e=0;return 0==(65535&t)&&(t>>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function u(t){for(var e=0;0!=t;)t&=t-1,++e;return e}var c,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l="=";function p(t){var e,i,r="";for(e=0;e+3<=t.length;e+=3)i=parseInt(t.substring(e,e+3),16),r+=f.charAt(i>>6)+f.charAt(63&i);for(e+1==t.length?(i=parseInt(t.substring(e,e+1),16),r+=f.charAt(i<<2)):e+2==t.length&&(i=parseInt(t.substring(e,e+2),16),r+=f.charAt(i>>2)+f.charAt((3&i)<<4));(3&r.length)>0;)r+=l;return r}function g(t){var i,r="",n=0,s=0;for(i=0;i>2),s=3&o,n=1):1==n?(r+=e(s<<2|o>>4),s=15&o,n=2):2==n?(r+=e(s),r+=e(o>>2),s=3&o,n=3):(r+=e(s<<2|o>>4),r+=e(15&o),n=0))}return 1==n&&(r+=e(s<<2)),r}var d,v={decode:function(t){var e;if(void 0===d){var i="= \f\n\r\t \u2028\u2029";for(d=Object.create(null),e=0;e<64;++e)d["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e)]=e;for(d["-"]=62,d._=63,e=0;e=4?(r[r.length]=n>>16,r[r.length]=n>>8&255,r[r.length]=255&n,n=0,s=0):n<<=6}}switch(s){case 1:throw new Error("Base64 encoding incomplete: at least 2 bits missing");case 2:r[r.length]=n>>10;break;case 3:r[r.length]=n>>16,r[r.length]=n>>8&255}return r},re:/-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,unarmor:function(t){var e=v.re.exec(t);if(e)if(e[1])t=e[1];else{if(!e[2])throw new Error("RegExp out of sync");t=e[2]}return v.decode(t)}},m=1e13,y=function(){function t(t){this.buf=[+t||0]}return t.prototype.mulAdd=function(t,e){var i,r,n=this.buf,s=n.length;for(i=0;i0&&(n[i]=e)},t.prototype.sub=function(t){var e,i,r=this.buf,n=r.length;for(e=0;e=0;--r)i+=(m+e[r]).toString().substring(1);return i},t.prototype.valueOf=function(){for(var t=this.buf,e=0,i=t.length-1;i>=0;--i)e=e*m+t[i];return e},t.prototype.simplify=function(){var t=this.buf;return 1==t.length?t[0]:this},t}(),b="…",T=/^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/,S=/^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;function E(t,e){return t.length>e&&(t=t.substring(0,e)+b),t}var w,D=function(){function t(e,i){this.hexDigits="0123456789ABCDEF",e instanceof t?(this.enc=e.enc,this.pos=e.pos):(this.enc=e,this.pos=i)}return t.prototype.get=function(t){if(void 0===t&&(t=this.pos++),t>=this.enc.length)throw new Error("Requesting byte offset ".concat(t," on a stream of length ").concat(this.enc.length));return"string"==typeof this.enc?this.enc.charCodeAt(t):this.enc[t]},t.prototype.hexByte=function(t){return this.hexDigits.charAt(t>>4&15)+this.hexDigits.charAt(15&t)},t.prototype.hexDump=function(t,e,i){for(var r="",n=t;n176)return!1}return!0},t.prototype.parseStringISO=function(t,e){for(var i="",r=t;r191&&n<224?String.fromCharCode((31&n)<<6|63&this.get(r++)):String.fromCharCode((15&n)<<12|(63&this.get(r++))<<6|63&this.get(r++))}return i},t.prototype.parseStringBMP=function(t,e){for(var i,r,n="",s=t;s127,s=n?255:0,o="";r==s&&++t4){for(o=r,i<<=3;0==(128&(+o^s));)o=+o<<1,--i;o="("+i+" bit)\n"}n&&(r-=256);for(var h=new y(r),a=t+1;a=a;--u)s+=h>>u&1?"1":"0";if(s.length>i)return n+E(s,i)}return n+s},t.prototype.parseOctetString=function(t,e,i){if(this.isASCII(t,e))return E(this.parseStringISO(t,e),i);var r=e-t,n="("+r+" byte)\n";r>(i/=2)&&(e=t+i);for(var s=t;si&&(n+=b),n},t.prototype.parseOID=function(t,e,i){for(var r="",n=new y,s=0,o=t;oi)return E(r,i);n=new y,s=0}}return s>0&&(r+=".incomplete"),r},t}(),x=function(){function t(t,e,i,r,n){if(!(r instanceof R))throw new Error("Invalid tag value.");this.stream=t,this.header=e,this.length=i,this.tag=r,this.sub=n}return t.prototype.typeName=function(){switch(this.tag.tagClass){case 0:switch(this.tag.tagNumber){case 0:return"EOC";case 1:return"BOOLEAN";case 2:return"INTEGER";case 3:return"BIT_STRING";case 4:return"OCTET_STRING";case 5:return"NULL";case 6:return"OBJECT_IDENTIFIER";case 7:return"ObjectDescriptor";case 8:return"EXTERNAL";case 9:return"REAL";case 10:return"ENUMERATED";case 11:return"EMBEDDED_PDV";case 12:return"UTF8String";case 16:return"SEQUENCE";case 17:return"SET";case 18:return"NumericString";case 19:return"PrintableString";case 20:return"TeletexString";case 21:return"VideotexString";case 22:return"IA5String";case 23:return"UTCTime";case 24:return"GeneralizedTime";case 25:return"GraphicString";case 26:return"VisibleString";case 27:return"GeneralString";case 28:return"UniversalString";case 30:return"BMPString"}return"Universal_"+this.tag.tagNumber.toString();case 1:return"Application_"+this.tag.tagNumber.toString();case 2:return"["+this.tag.tagNumber.toString()+"]";case 3:return"Private_"+this.tag.tagNumber.toString()}},t.prototype.content=function(t){if(void 0===this.tag)return null;void 0===t&&(t=1/0);var e=this.posContent(),i=Math.abs(this.length);if(!this.tag.isUniversal())return null!==this.sub?"("+this.sub.length+" elem)":this.stream.parseOctetString(e,e+i,t);switch(this.tag.tagNumber){case 1:return 0===this.stream.get(e)?"false":"true";case 2:return this.stream.parseInteger(e,e+i);case 3:return this.sub?"("+this.sub.length+" elem)":this.stream.parseBitString(e,e+i,t);case 4:return this.sub?"("+this.sub.length+" elem)":this.stream.parseOctetString(e,e+i,t);case 6:return this.stream.parseOID(e,e+i,t);case 16:case 17:return null!==this.sub?"("+this.sub.length+" elem)":"(no elem)";case 12:return E(this.stream.parseStringUTF(e,e+i),t);case 18:case 19:case 20:case 21:case 22:case 26:return E(this.stream.parseStringISO(e,e+i),t);case 30:return E(this.stream.parseStringBMP(e,e+i),t);case 23:case 24:return this.stream.parseTime(e,e+i,23==this.tag.tagNumber)}return null},t.prototype.toString=function(){return this.typeName()+"@"+this.stream.pos+"[header:"+this.header+",length:"+this.length+",sub:"+(null===this.sub?"null":this.sub.length)+"]"},t.prototype.toPrettyString=function(t){void 0===t&&(t="");var e=t+this.typeName()+" @"+this.stream.pos;if(this.length>=0&&(e+="+"),e+=this.length,this.tag.tagConstructed?e+=" (constructed)":!this.tag.isUniversal()||3!=this.tag.tagNumber&&4!=this.tag.tagNumber||null===this.sub||(e+=" (encapsulates)"),e+="\n",null!==this.sub){t+=" ";for(var i=0,r=this.sub.length;i6)throw new Error("Length over 48 bits not supported at position "+(t.pos-1));if(0===i)return null;e=0;for(var r=0;r>6,this.tagConstructed=0!=(32&e),this.tagNumber=31&e,31==this.tagNumber){var i=new y;do{e=t.get(),i.mulAdd(128,127&e)}while(128&e);this.tagNumber=i.simplify()}}return t.prototype.isUniversal=function(){return 0===this.tagClass},t.prototype.isEOC=function(){return 0===this.tagClass&&0===this.tagNumber},t}(),B=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],O=(1<<26)/B[B.length-1],A=function(){function t(t,e,i){null!=t&&("number"==typeof t?this.fromNumber(t,e,i):null==e&&"string"!=typeof t?this.fromString(t,256):this.fromString(t,e))}return t.prototype.toString=function(t){if(this.s<0)return"-"+this.negate().toString(t);var i;if(16==t)i=4;else if(8==t)i=3;else if(2==t)i=1;else if(32==t)i=5;else{if(4!=t)return this.toRadix(t);i=2}var r,n=(1<0)for(a>a)>0&&(s=!0,o=e(r));h>=0;)a>(a+=this.DB-i)):(r=this[h]>>(a-=i)&n,a<=0&&(a+=this.DB,--h)),r>0&&(s=!0),s&&(o+=e(r));return s?o:"0"},t.prototype.negate=function(){var e=M();return t.ZERO.subTo(this,e),e},t.prototype.abs=function(){return this.s<0?this.negate():this},t.prototype.compareTo=function(t){var e=this.s-t.s;if(0!=e)return e;var i=this.t;if(0!=(e=i-t.t))return this.s<0?-e:e;for(;--i>=0;)if(0!=(e=this[i]-t[i]))return e;return 0},t.prototype.bitLength=function(){return this.t<=0?0:this.DB*(this.t-1)+K(this[this.t-1]^this.s&this.DM)},t.prototype.mod=function(e){var i=M();return this.abs().divRemTo(e,null,i),this.s<0&&i.compareTo(t.ZERO)>0&&e.subTo(i,i),i},t.prototype.modPowInt=function(t,e){var i;return i=t<256||e.isEven()?new I(e):new N(e),this.exp(t,i)},t.prototype.clone=function(){var t=M();return this.copyTo(t),t},t.prototype.intValue=function(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24},t.prototype.shortValue=function(){return 0==this.t?this.s:this[0]<<16>>16},t.prototype.signum=function(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1},t.prototype.toByteArray=function(){var t=this.t,e=[];e[0]=this.s;var i,r=this.DB-t*this.DB%8,n=0;if(t-- >0)for(r>r)!=(this.s&this.DM)>>r&&(e[n++]=i|this.s<=0;)r<8?(i=(this[t]&(1<>(r+=this.DB-8)):(i=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&i)&&(i|=-256),0==n&&(128&this.s)!=(128&i)&&++n,(n>0||i!=this.s)&&(e[n++]=i);return e},t.prototype.equals=function(t){return 0==this.compareTo(t)},t.prototype.min=function(t){return this.compareTo(t)<0?this:t},t.prototype.max=function(t){return this.compareTo(t)>0?this:t},t.prototype.and=function(t){var e=M();return this.bitwiseTo(t,n,e),e},t.prototype.or=function(t){var e=M();return this.bitwiseTo(t,s,e),e},t.prototype.xor=function(t){var e=M();return this.bitwiseTo(t,o,e),e},t.prototype.andNot=function(t){var e=M();return this.bitwiseTo(t,h,e),e},t.prototype.not=function(){for(var t=M(),e=0;e=this.t?0!=this.s:0!=(this[e]&1<1){var c=M();for(r.sqrTo(o[1],c);h<=u;)o[h]=M(),r.mulTo(c,o[h-2],o[h]),h+=2}var f,l,p=t.t-1,g=!0,d=M();for(n=K(t[p])-1;p>=0;){for(n>=a?f=t[p]>>n-a&u:(f=(t[p]&(1<0&&(f|=t[p-1]>>this.DB+n-a)),h=i;0==(1&f);)f>>=1,--h;if((n-=h)<0&&(n+=this.DB,--p),g)o[f].copyTo(s),g=!1;else{for(;h>1;)r.sqrTo(s,d),r.sqrTo(d,s),h-=2;h>0?r.sqrTo(s,d):(l=s,s=d,d=l),r.mulTo(d,o[f],s)}for(;p>=0&&0==(t[p]&1<=0?(r.subTo(n,r),i&&s.subTo(h,s),o.subTo(a,o)):(n.subTo(r,n),i&&h.subTo(s,h),a.subTo(o,a))}return 0!=n.compareTo(t.ONE)?t.ZERO:a.compareTo(e)>=0?a.subtract(e):a.signum()<0?(a.addTo(e,a),a.signum()<0?a.add(e):a):a},t.prototype.pow=function(t){return this.exp(t,new V)},t.prototype.gcd=function(t){var e=this.s<0?this.negate():this.clone(),i=t.s<0?t.negate():t.clone();if(e.compareTo(i)<0){var r=e;e=i,i=r}var n=e.getLowestSetBit(),s=i.getLowestSetBit();if(s<0)return e;for(n0&&(e.rShiftTo(s,e),i.rShiftTo(s,i));e.signum()>0;)(n=e.getLowestSetBit())>0&&e.rShiftTo(n,e),(n=i.getLowestSetBit())>0&&i.rShiftTo(n,i),e.compareTo(i)>=0?(e.subTo(i,e),e.rShiftTo(1,e)):(i.subTo(e,i),i.rShiftTo(1,i));return s>0&&i.lShiftTo(s,i),i},t.prototype.isProbablePrime=function(t){var e,i=this.abs();if(1==i.t&&i[0]<=B[B.length-1]){for(e=0;e=0;--e)t[e]=this[e];t.t=this.t,t.s=this.s},t.prototype.fromInt=function(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0},t.prototype.fromString=function(e,i){var r;if(16==i)r=4;else if(8==i)r=3;else if(256==i)r=8;else if(2==i)r=1;else if(32==i)r=5;else{if(4!=i)return void this.fromRadix(e,i);r=2}this.t=0,this.s=0;for(var n=e.length,s=!1,o=0;--n>=0;){var h=8==r?255&+e[n]:F(e,n);h<0?"-"==e.charAt(n)&&(s=!0):(s=!1,0==o?this[this.t++]=h:o+r>this.DB?(this[this.t-1]|=(h&(1<>this.DB-o):this[this.t-1]|=h<=this.DB&&(o-=this.DB))}8==r&&0!=(128&+e[0])&&(this.s=-1,o>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==t;)--this.t},t.prototype.dlShiftTo=function(t,e){var i;for(i=this.t-1;i>=0;--i)e[i+t]=this[i];for(i=t-1;i>=0;--i)e[i]=0;e.t=this.t+t,e.s=this.s},t.prototype.drShiftTo=function(t,e){for(var i=t;i=0;--h)e[h+s+1]=this[h]>>r|o,o=(this[h]&n)<=0;--h)e[h]=0;e[s]=o,e.t=this.t+s+1,e.s=this.s,e.clamp()},t.prototype.rShiftTo=function(t,e){e.s=this.s;var i=Math.floor(t/this.DB);if(i>=this.t)e.t=0;else{var r=t%this.DB,n=this.DB-r,s=(1<>r;for(var o=i+1;o>r;r>0&&(e[this.t-i-1]|=(this.s&s)<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;i>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[i++]=this.DV+r:r>0&&(e[i++]=r),e.t=i,e.clamp()},t.prototype.multiplyTo=function(e,i){var r=this.abs(),n=e.abs(),s=r.t;for(i.t=s+n.t;--s>=0;)i[s]=0;for(s=0;s=0;)t[i]=0;for(i=0;i=e.DV&&(t[i+e.t]-=e.DV,t[i+e.t+1]=1)}t.t>0&&(t[t.t-1]+=e.am(i,e[i],t,2*i,0,1)),t.s=0,t.clamp()},t.prototype.divRemTo=function(e,i,r){var n=e.abs();if(!(n.t<=0)){var s=this.abs();if(s.t0?(n.lShiftTo(u,o),s.lShiftTo(u,r)):(n.copyTo(o),s.copyTo(r));var c=o.t,f=o[c-1];if(0!=f){var l=f*(1<1?o[c-2]>>this.F2:0),p=this.FV/l,g=(1<=0&&(r[r.t++]=1,r.subTo(y,r)),t.ONE.dlShiftTo(c,y),y.subTo(o,o);o.t=0;){var b=r[--v]==f?this.DM:Math.floor(r[v]*p+(r[v-1]+d)*g);if((r[v]+=o.am(0,b,r,m,0,c))0&&r.rShiftTo(u,r),h<0&&t.ZERO.subTo(r,r)}}},t.prototype.invDigit=function(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var e=3&t;return(e=(e=(e=(e=e*(2-(15&t)*e)&15)*(2-(255&t)*e)&255)*(2-((65535&t)*e&65535))&65535)*(2-t*e%this.DV)%this.DV)>0?this.DV-e:-e},t.prototype.isEven=function(){return 0==(this.t>0?1&this[0]:this.s)},t.prototype.exp=function(e,i){if(e>4294967295||e<1)return t.ONE;var r=M(),n=M(),s=i.convert(this),o=K(e)-1;for(s.copyTo(r);--o>=0;)if(i.sqrTo(r,n),(e&1<0)i.mulTo(n,s,r);else{var h=r;r=n,n=h}return i.revert(r)},t.prototype.chunkSize=function(t){return Math.floor(Math.LN2*this.DB/Math.log(t))},t.prototype.toRadix=function(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var e=this.chunkSize(t),i=Math.pow(t,e),r=U(i),n=M(),s=M(),o="";for(this.divRemTo(r,n,s);n.signum()>0;)o=(i+s.intValue()).toString(t).substr(1)+o,n.divRemTo(r,n,s);return s.intValue().toString(t)+o},t.prototype.fromRadix=function(e,i){this.fromInt(0),null==i&&(i=10);for(var r=this.chunkSize(i),n=Math.pow(i,r),s=!1,o=0,h=0,a=0;a=r&&(this.dMultiply(n),this.dAddOffset(h,0),o=0,h=0))}o>0&&(this.dMultiply(Math.pow(i,o)),this.dAddOffset(h,0)),s&&t.ZERO.subTo(this,this)},t.prototype.fromNumber=function(e,i,r){if("number"==typeof i)if(e<2)this.fromInt(1);else for(this.fromNumber(e,r),this.testBit(e-1)||this.bitwiseTo(t.ONE.shiftLeft(e-1),s,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(i);)this.dAddOffset(2,0),this.bitLength()>e&&this.subTo(t.ONE.shiftLeft(e-1),this);else{var n=[],o=7&e;n.length=1+(e>>3),i.nextBytes(n),o>0?n[0]&=(1<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;i>=this.DB;r+=t.s}e.s=r<0?-1:0,r>0?e[i++]=r:r<-1&&(e[i++]=this.DV+r),e.t=i,e.clamp()},t.prototype.dMultiply=function(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()},t.prototype.dAddOffset=function(t,e){if(0!=t){for(;this.t<=e;)this[this.t++]=0;for(this[e]+=t;this[e]>=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}},t.prototype.multiplyLowerTo=function(t,e,i){var r=Math.min(this.t+t.t,e);for(i.s=0,i.t=r;r>0;)i[--r]=0;for(var n=i.t-this.t;r=0;)i[r]=0;for(r=Math.max(e-this.t,0);r0)if(0==e)i=this[0]%t;else for(var r=this.t-1;r>=0;--r)i=(e*i+this[r])%t;return i},t.prototype.millerRabin=function(e){var i=this.subtract(t.ONE),r=i.getLowestSetBit();if(r<=0)return!1;var n=i.shiftRight(r);(e=e+1>>1)>B.length&&(e=B.length);for(var s=M(),o=0;o0&&(i.rShiftTo(o,i),r.rShiftTo(o,r));var h=function(){(s=i.getLowestSetBit())>0&&i.rShiftTo(s,i),(s=r.getLowestSetBit())>0&&r.rShiftTo(s,r),i.compareTo(r)>=0?(i.subTo(r,i),i.rShiftTo(1,i)):(r.subTo(i,r),r.rShiftTo(1,r)),i.signum()>0?setTimeout(h,0):(o>0&&r.lShiftTo(o,r),setTimeout((function(){e(r)}),0))};setTimeout(h,10)}},t.prototype.fromNumberAsync=function(e,i,r,n){if("number"==typeof i)if(e<2)this.fromInt(1);else{this.fromNumber(e,r),this.testBit(e-1)||this.bitwiseTo(t.ONE.shiftLeft(e-1),s,this),this.isEven()&&this.dAddOffset(1,0);var o=this,h=function(){o.dAddOffset(2,0),o.bitLength()>e&&o.subTo(t.ONE.shiftLeft(e-1),o),o.isProbablePrime(i)?setTimeout((function(){n()}),0):setTimeout(h,0)};setTimeout(h,0)}else{var a=[],u=7&e;a.length=1+(e>>3),i.nextBytes(a),u>0?a[0]&=(1<=0?t.mod(this.m):t},t.prototype.revert=function(t){return t},t.prototype.reduce=function(t){t.divRemTo(this.m,null,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}(),N=function(){function t(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(e,e),e},t.prototype.revert=function(t){var e=M();return t.copyTo(e),this.reduce(e),e},t.prototype.reduce=function(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var e=0;e>15)*this.mpl&this.um)<<15)&t.DM;for(t[i=e+this.m.t]+=this.m.am(0,r,t,e,0,this.m.t);t[i]>=t.DV;)t[i]-=t.DV,t[++i]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}(),P=function(){function t(t){this.m=t,this.r2=M(),this.q3=M(),A.ONE.dlShiftTo(2*t.t,this.r2),this.mu=this.r2.divide(t)}return t.prototype.convert=function(t){if(t.s<0||t.t>2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=M();return t.copyTo(e),this.reduce(e),e},t.prototype.revert=function(t){return t},t.prototype.reduce=function(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}();function M(){return new A(null)}function L(t,e){return new A(t,e)}var j="undefined"!=typeof navigator;j&&"Microsoft Internet Explorer"==navigator.appName?(A.prototype.am=function(t,e,i,r,n,s){for(var o=32767&e,h=e>>15;--s>=0;){var a=32767&this[t],u=this[t++]>>15,c=h*a+u*o;n=((a=o*a+((32767&c)<<15)+i[r]+(1073741823&n))>>>30)+(c>>>15)+h*u+(n>>>30),i[r++]=1073741823&a}return n},w=30):j&&"Netscape"!=navigator.appName?(A.prototype.am=function(t,e,i,r,n,s){for(;--s>=0;){var o=e*this[t++]+i[r]+n;n=Math.floor(o/67108864),i[r++]=67108863&o}return n},w=26):(A.prototype.am=function(t,e,i,r,n,s){for(var o=16383&e,h=e>>14;--s>=0;){var a=16383&this[t],u=this[t++]>>14,c=h*a+u*o;n=((a=o*a+((16383&c)<<14)+i[r]+n)>>28)+(c>>14)+h*u,i[r++]=268435455&a}return n},w=28),A.prototype.DB=w,A.prototype.DM=(1<>>16)&&(t=e,i+=16),0!=(e=t>>8)&&(t=e,i+=8),0!=(e=t>>4)&&(t=e,i+=4),0!=(e=t>>2)&&(t=e,i+=2),0!=(e=t>>1)&&(t=e,i+=1),i}A.ZERO=U(0),A.ONE=U(1);var k,_,z=function(){function t(){this.i=0,this.j=0,this.S=[]}return t.prototype.init=function(t){var e,i,r;for(e=0;e<256;++e)this.S[e]=e;for(i=0,e=0;e<256;++e)i=i+this.S[e]+t[e%t.length]&255,r=this.S[e],this.S[e]=this.S[i],this.S[i]=r;this.i=0,this.j=0},t.prototype.next=function(){var t;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,t=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=t,this.S[t+this.S[this.i]&255]},t}(),Z=256,G=null;if(null==G){G=[],_=0;var $=void 0;if("undefined"!=typeof window&&window.crypto&&window.crypto.getRandomValues){var Y=new Uint32Array(256);for(window.crypto.getRandomValues(Y),$=0;$=256||_>=Z)window.removeEventListener?window.removeEventListener("mousemove",X,!1):window.detachEvent&&window.detachEvent("onmousemove",X);else try{var e=t.x+t.y;G[_++]=255&e,J+=1}catch(t){}};"undefined"!=typeof window&&(window.addEventListener?window.addEventListener("mousemove",X,!1):window.attachEvent&&window.attachEvent("onmousemove",X))}function Q(){if(null==k){for(k=new z;_0&&e.length>0?(this.n=L(t,16),this.e=parseInt(e,16)):console.error("Invalid RSA public key")},t.prototype.encrypt=function(t){var e=this.n.bitLength()+7>>3,i=function(t,e){if(e=0&&e>0;){var n=t.charCodeAt(r--);n<128?i[--e]=n:n>127&&n<2048?(i[--e]=63&n|128,i[--e]=n>>6|192):(i[--e]=63&n|128,i[--e]=n>>6&63|128,i[--e]=n>>12|224)}i[--e]=0;for(var s=new W,o=[];e>2;){for(o[0]=0;0==o[0];)s.nextBytes(o);i[--e]=o[0]}return i[--e]=2,i[--e]=0,new A(i)}(t,e);if(null==i)return null;var r=this.doPublic(i);if(null==r)return null;for(var n=r.toString(16),s=n.length,o=0;o<2*e-s;o++)n="0"+n;return n},t.prototype.setPrivate=function(t,e,i){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=L(t,16),this.e=parseInt(e,16),this.d=L(i,16)):console.error("Invalid RSA private key")},t.prototype.setPrivateEx=function(t,e,i,r,n,s,o,h){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=L(t,16),this.e=parseInt(e,16),this.d=L(i,16),this.p=L(r,16),this.q=L(n,16),this.dmp1=L(s,16),this.dmq1=L(o,16),this.coeff=L(h,16)):console.error("Invalid RSA private key")},t.prototype.generate=function(t,e){var i=new W,r=t>>1;this.e=parseInt(e,16);for(var n=new A(e,16);;){for(;this.p=new A(t-r,1,i),0!=this.p.subtract(A.ONE).gcd(n).compareTo(A.ONE)||!this.p.isProbablePrime(10););for(;this.q=new A(r,1,i),0!=this.q.subtract(A.ONE).gcd(n).compareTo(A.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var o=this.p.subtract(A.ONE),h=this.q.subtract(A.ONE),a=o.multiply(h);if(0==a.gcd(n).compareTo(A.ONE)){this.n=this.p.multiply(this.q),this.d=n.modInverse(a),this.dmp1=this.d.mod(o),this.dmq1=this.d.mod(h),this.coeff=this.q.modInverse(this.p);break}}},t.prototype.decrypt=function(t){var e=L(t,16),i=this.doPrivate(e);return null==i?null:function(t,e){for(var i=t.toByteArray(),r=0;r=i.length)return null;for(var n="";++r191&&s<224?(n+=String.fromCharCode((31&s)<<6|63&i[r+1]),++r):(n+=String.fromCharCode((15&s)<<12|(63&i[r+1])<<6|63&i[r+2]),r+=2)}return n}(i,this.n.bitLength()+7>>3)},t.prototype.generateAsync=function(t,e,i){var r=new W,n=t>>1;this.e=parseInt(e,16);var s=new A(e,16),o=this,h=function(){var e=function(){if(o.p.compareTo(o.q)<=0){var t=o.p;o.p=o.q,o.q=t}var e=o.p.subtract(A.ONE),r=o.q.subtract(A.ONE),n=e.multiply(r);0==n.gcd(s).compareTo(A.ONE)?(o.n=o.p.multiply(o.q),o.d=s.modInverse(n),o.dmp1=o.d.mod(e),o.dmq1=o.d.mod(r),o.coeff=o.q.modInverse(o.p),setTimeout((function(){i()}),0)):setTimeout(h,0)},a=function(){o.q=M(),o.q.fromNumberAsync(n,1,r,(function(){o.q.subtract(A.ONE).gcda(s,(function(t){0==t.compareTo(A.ONE)&&o.q.isProbablePrime(10)?setTimeout(e,0):setTimeout(a,0)}))}))},u=function(){o.p=M(),o.p.fromNumberAsync(t-n,1,r,(function(){o.p.subtract(A.ONE).gcda(s,(function(t){0==t.compareTo(A.ONE)&&o.p.isProbablePrime(10)?setTimeout(a,0):setTimeout(u,0)}))}))};setTimeout(u,0)};setTimeout(h,0)},t.prototype.sign=function(t,e,i){var r=function(t,e){if(e15)throw"ASN.1 length too long to represent by 8x: n = "+t.toString(16);return(128+i).toString(16)+e},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},rt.asn1.DERAbstractString=function(t){rt.asn1.DERAbstractString.superclass.constructor.call(this),this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(this.s)},this.setStringHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.getFreshValueHex=function(){return this.hV},void 0!==t&&("string"==typeof t?this.setString(t):void 0!==t.str?this.setString(t.str):void 0!==t.hex&&this.setStringHex(t.hex))},it.lang.extend(rt.asn1.DERAbstractString,rt.asn1.ASN1Object),rt.asn1.DERAbstractTime=function(t){rt.asn1.DERAbstractTime.superclass.constructor.call(this),this.localDateToUTC=function(t){return utc=t.getTime()+6e4*t.getTimezoneOffset(),new Date(utc)},this.formatDate=function(t,e,i){var r=this.zeroPadding,n=this.localDateToUTC(t),s=String(n.getFullYear());"utc"==e&&(s=s.substr(2,2));var o=s+r(String(n.getMonth()+1),2)+r(String(n.getDate()),2)+r(String(n.getHours()),2)+r(String(n.getMinutes()),2)+r(String(n.getSeconds()),2);if(!0===i){var h=n.getMilliseconds();if(0!=h){var a=r(String(h),3);o=o+"."+(a=a.replace(/[0]+$/,""))}}return o+"Z"},this.zeroPadding=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(t)},this.setByDateValue=function(t,e,i,r,n,s){var o=new Date(Date.UTC(t,e-1,i,r,n,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},it.lang.extend(rt.asn1.DERAbstractTime,rt.asn1.ASN1Object),rt.asn1.DERAbstractStructured=function(t){rt.asn1.DERAbstractString.superclass.constructor.call(this),this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,void 0!==t&&void 0!==t.array&&(this.asn1Array=t.array)},it.lang.extend(rt.asn1.DERAbstractStructured,rt.asn1.ASN1Object),rt.asn1.DERBoolean=function(){rt.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},it.lang.extend(rt.asn1.DERBoolean,rt.asn1.ASN1Object),rt.asn1.DERInteger=function(t){rt.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=rt.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new A(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},void 0!==t&&(void 0!==t.bigint?this.setByBigInteger(t.bigint):void 0!==t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):void 0!==t.hex&&this.setValueHex(t.hex))},it.lang.extend(rt.asn1.DERInteger,rt.asn1.ASN1Object),rt.asn1.DERBitString=function(t){if(void 0!==t&&void 0!==t.obj){var e=rt.asn1.ASN1Util.newObject(t.obj);t.hex="00"+e.getEncodedHex()}rt.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||7=2?(n[n.length]=s,s=0,o=0):s<<=4}}if(o)throw new Error("Hex encoding incomplete: 4 bits missing");return n}(t):v.unarmor(t),n=x.decode(r);if(3===n.sub.length&&(n=n.sub[2].sub[0]),9===n.sub.length){e=n.sub[1].getHexStringValue(),this.n=L(e,16),i=n.sub[2].getHexStringValue(),this.e=parseInt(i,16);var s=n.sub[3].getHexStringValue();this.d=L(s,16);var o=n.sub[4].getHexStringValue();this.p=L(o,16);var h=n.sub[5].getHexStringValue();this.q=L(h,16);var a=n.sub[6].getHexStringValue();this.dmp1=L(a,16);var u=n.sub[7].getHexStringValue();this.dmq1=L(u,16);var f=n.sub[8].getHexStringValue();this.coeff=L(f,16)}else{if(2!==n.sub.length)return!1;if(n.sub[0].sub){var l=n.sub[1].sub[0];e=l.sub[0].getHexStringValue(),this.n=L(e,16),i=l.sub[1].getHexStringValue(),this.e=parseInt(i,16)}else e=n.sub[0].getHexStringValue(),this.n=L(e,16),i=n.sub[1].getHexStringValue(),this.e=parseInt(i,16)}return!0}catch(t){return!1}},e.prototype.getPrivateBaseKey=function(){var t={array:[new rt.asn1.DERInteger({int:0}),new rt.asn1.DERInteger({bigint:this.n}),new rt.asn1.DERInteger({int:this.e}),new rt.asn1.DERInteger({bigint:this.d}),new rt.asn1.DERInteger({bigint:this.p}),new rt.asn1.DERInteger({bigint:this.q}),new rt.asn1.DERInteger({bigint:this.dmp1}),new rt.asn1.DERInteger({bigint:this.dmq1}),new rt.asn1.DERInteger({bigint:this.coeff})]};return new rt.asn1.DERSequence(t).getEncodedHex()},e.prototype.getPrivateBaseKeyB64=function(){return p(this.getPrivateBaseKey())},e.prototype.getPublicBaseKey=function(){var t=new rt.asn1.DERSequence({array:[new rt.asn1.DERObjectIdentifier({oid:"1.2.840.113549.1.1.1"}),new rt.asn1.DERNull]}),e=new rt.asn1.DERSequence({array:[new rt.asn1.DERInteger({bigint:this.n}),new rt.asn1.DERInteger({int:this.e})]}),i=new rt.asn1.DERBitString({hex:"00"+e.getEncodedHex()});return new rt.asn1.DERSequence({array:[t,i]}).getEncodedHex()},e.prototype.getPublicBaseKeyB64=function(){return p(this.getPublicBaseKey())},e.wordwrap=function(t,e){if(!t)return t;var i="(.{1,"+(e=e||64)+"})( +|$\n?)|(.{1,"+e+"})";return t.match(RegExp(i,"g")).join("\n")},e.prototype.getPrivateKey=function(){var t="-----BEGIN RSA PRIVATE KEY-----\n";return(t+=e.wordwrap(this.getPrivateBaseKeyB64())+"\n")+"-----END RSA PRIVATE KEY-----"},e.prototype.getPublicKey=function(){var t="-----BEGIN PUBLIC KEY-----\n";return(t+=e.wordwrap(this.getPublicBaseKeyB64())+"\n")+"-----END PUBLIC KEY-----"},e.hasPublicKeyProperty=function(t){return(t=t||{}).hasOwnProperty("n")&&t.hasOwnProperty("e")},e.hasPrivateKeyProperty=function(t){return(t=t||{}).hasOwnProperty("n")&&t.hasOwnProperty("e")&&t.hasOwnProperty("d")&&t.hasOwnProperty("p")&&t.hasOwnProperty("q")&&t.hasOwnProperty("dmp1")&&t.hasOwnProperty("dmq1")&&t.hasOwnProperty("coeff")},e.prototype.parsePropertiesFrom=function(t){this.n=t.n,this.e=t.e,t.hasOwnProperty("d")&&(this.d=t.d,this.p=t.p,this.q=t.q,this.dmp1=t.dmp1,this.dmq1=t.dmq1,this.coeff=t.coeff)},e}(tt),at=i(155),ut=void 0!==at?null===(st=at.env)||void 0===st?void 0:"3.3.2":void 0;const ct=function(){function t(t){void 0===t&&(t={}),t=t||{},this.default_key_size=t.default_key_size?parseInt(t.default_key_size,10):1024,this.default_public_exponent=t.default_public_exponent||"010001",this.log=t.log||!1,this.key=null}return t.prototype.setKey=function(t){this.log&&this.key&&console.warn("A key was already set, overriding existing."),this.key=new ht(t)},t.prototype.setPrivateKey=function(t){this.setKey(t)},t.prototype.setPublicKey=function(t){this.setKey(t)},t.prototype.decrypt=function(t){try{return this.getKey().decrypt(g(t))}catch(t){return!1}},t.prototype.encrypt=function(t){try{return p(this.getKey().encrypt(t))}catch(t){return!1}},t.prototype.sign=function(t,e,i){try{return p(this.getKey().sign(t,e,i))}catch(t){return!1}},t.prototype.verify=function(t,e,i){try{return this.getKey().verify(t,g(e),i)}catch(t){return!1}},t.prototype.getKey=function(t){if(!this.key){if(this.key=new ht,t&&"[object Function]"==={}.toString.call(t))return void this.key.generateAsync(this.default_key_size,this.default_public_exponent,t);this.key.generate(this.default_key_size,this.default_public_exponent)}return this.key},t.prototype.getPrivateKey=function(){return this.getKey().getPrivateKey()},t.prototype.getPrivateKeyB64=function(){return this.getKey().getPrivateBaseKeyB64()},t.prototype.getPublicKey=function(){return this.getKey().getPublicKey()},t.prototype.getPublicKeyB64=function(){return this.getKey().getPublicBaseKeyB64()},t.version=ut,t}()})(),r.default})())); \ No newline at end of file diff --git a/dash-fastapi-frontend/assets/js/jsencrypt_func.js b/dash-fastapi-frontend/assets/js/jsencrypt_func.js new file mode 100644 index 0000000..c39e47d --- /dev/null +++ b/dash-fastapi-frontend/assets/js/jsencrypt_func.js @@ -0,0 +1,28 @@ +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' + +const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + + 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + + 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + + 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + + 'UP8iWi1Qw0Y=' + +// 加密 +function encrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对数据进行加密 +} + +// 解密 +function decrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) // 设置私钥 + return encryptor.decrypt(txt) // 对数据进行解密 +} + diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index 4d913c8..4fb71c2 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -1,4 +1,5 @@ import feffery_antd_components as fac +import time from dash import dcc, get_asset_url, no_update from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate @@ -25,6 +26,7 @@ from utils.feedback_util import MessageManager redirect_container=Output( 'redirect-container', 'children', allow_duplicate=True ), + login_success=Output('login-success-container', 'data'), ), inputs=dict( button_click=Input('login-submit', 'nClicks'), @@ -79,6 +81,7 @@ def login_auth( redirect_container=dcc.Location( pathname='/', id='login-redirect' ), + login_success={'timestamp': time.time()}, ) return dict( @@ -102,6 +105,7 @@ def login_auth( else '请输入验证码!', token=None, redirect_container=None, + login_success=None, ) return dict( @@ -113,6 +117,7 @@ def login_auth( captcha_form_help=no_update, token=no_update, redirect_container=no_update, + login_success=None, ) @@ -125,11 +130,11 @@ def login_auth( Output('captcha_image-session_id-container', 'data'), ], Input('login-captcha-image-container', 'n_clicks'), - State('redirect-container', 'children'), + State('login-success-container', 'data'), prevent_initial_call=True, ) -def change_login_captcha_image(captcha_click, redirect): - if captcha_click and not redirect: +def change_login_captcha_image(captcha_click, login_success): + if captcha_click and not login_success: captcha_image_info = LoginApi.get_code_img() captcha_enabled = captcha_image_info.get('captcha_enabled') forget_enabled = captcha_image_info.get('forget_enabled') @@ -180,3 +185,56 @@ def random_bg(pathname, old_style): 'backgroundRepeat': 'no-repeat', 'backgroundSize': 'cover', } + + +app.clientside_callback( + """ + (_) => { + let username = Cookies.get("username"); + let password = Cookies.get("password"); + let remember = Cookies.get("remember"); + if (remember && username && password) { + return [ + remember === undefined ? false : Boolean(remember), + username === undefined ? '' : username, + password === undefined ? '' : decrypt(password) + ]; + } + throw window.dash_clientside.PreventUpdate; + } + """, + [ + Output('login-remember-me', 'checked'), + Output('login-username', 'value'), + Output('login-password', 'value'), + ], + Input('container', 'id'), +) + + +app.clientside_callback( + """ + (login_success, remember, username, password) => { + if (login_success) { + if (remember && username && password) { + Cookies.set("username", username, { expires: 30 }); + Cookies.set("password", encrypt(password), { expires: 30 }); + Cookies.set("remember", remember, { expires: 30 }); + } else { + Cookies.remove("username"); + Cookies.remove("password"); + Cookies.remove("remember"); + } + } else { + throw window.dash_clientside.PreventUpdate; + } + } + """, + Input('login-success-container', 'data'), + [ + State('login-remember-me', 'checked'), + State('login-username', 'value'), + State('login-password', 'value'), + ], + prevent_initial_call=True, +) diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index a1006e8..964ccff 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -7,6 +7,7 @@ from callbacks import login_c # noqa: F401 def render_content(): return html.Div( [ + dcc.Store(id='login-success-container'), dcc.Store(id='captcha_image-session_id-container'), html.Div( [ @@ -96,6 +97,7 @@ def render_content(): style={'width': '210px'}, ), id='login-captcha-form-item', + style={'marginBottom': '10px'}, ), fac.AntdFormItem( html.Div( @@ -112,7 +114,8 @@ def render_content(): style={ 'border': '1px solid #ccc' }, - ) + ), + style={'marginBottom': '10px'}, ), ], align='end', @@ -124,6 +127,12 @@ def render_content(): fuc.FefferyKeyPress( id='keyboard-enter-submit', keys='enter' ), + fac.AntdFormItem( + fac.AntdCheckbox( + id='login-remember-me', label='记住我' + ), + style={'marginBottom': '10px'}, + ), fac.AntdFormItem( fac.AntdButton( '登录', @@ -134,7 +143,7 @@ def render_content(): block=True, size='large', ), - style={'marginTop': '20px'}, + style={'marginBottom': '10px'}, ), fac.AntdFormItem( html.Div( -- Gitee From b56d25f7c3225b9b8c1c3d38e33dd1576ab2a9ba Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 19:41:57 +0800 Subject: [PATCH 151/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=AE=B0?= =?UTF-8?q?=E4=BD=8F=E6=88=91=E7=9B=B8=E5=85=B3=E5=9B=9E=E8=B0=83=E5=86=99?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/login_c.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index 4fb71c2..f3fd77f 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -193,14 +193,11 @@ app.clientside_callback( let username = Cookies.get("username"); let password = Cookies.get("password"); let remember = Cookies.get("remember"); - if (remember && username && password) { - return [ - remember === undefined ? false : Boolean(remember), - username === undefined ? '' : username, - password === undefined ? '' : decrypt(password) - ]; - } - throw window.dash_clientside.PreventUpdate; + return [ + remember === undefined ? false : Boolean(remember), + username === undefined ? '' : username, + password === undefined ? '' : decrypt(password) + ]; } """, [ @@ -216,7 +213,7 @@ app.clientside_callback( """ (login_success, remember, username, password) => { if (login_success) { - if (remember && username && password) { + if (remember) { Cookies.set("username", username, { expires: 30 }); Cookies.set("password", encrypt(password), { expires: 30 }); Cookies.set("remember", remember, { expires: 30 }); -- Gitee From 391165e7a256df05f4df240d3f3f1ac0be7bd373 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 20:06:26 +0800 Subject: [PATCH 152/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E5=BF=98?= =?UTF-8?q?=E8=AE=B0=E5=AF=86=E7=A0=81=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/login_controller.py | 46 ++---- .../module_admin/service/login_service.py | 16 +- dash-fastapi-frontend/api/forget.py | 37 +++++ dash-fastapi-frontend/callbacks/forget_c.py | 149 +++++------------- dash-fastapi-frontend/views/forget.py | 63 +++----- 5 files changed, 123 insertions(+), 188 deletions(-) create mode 100644 dash-fastapi-frontend/api/forget.py diff --git a/dash-fastapi-backend/module_admin/controller/login_controller.py b/dash-fastapi-backend/module_admin/controller/login_controller.py index 9753cbe..06a050d 100644 --- a/dash-fastapi-backend/module_admin/controller/login_controller.py +++ b/dash-fastapi-backend/module_admin/controller/login_controller.py @@ -9,8 +9,8 @@ from config.env import AppConfig, JwtConfig from config.get_db import get_db from module_admin.annotation.log_annotation import Log from module_admin.entity.vo.common_vo import CrudResponseModel -from module_admin.entity.vo.login_vo import UserLogin, UserRegister, Token -from module_admin.entity.vo.user_vo import CurrentUserModel, EditUserModel +from module_admin.entity.vo.login_vo import UserLogin, UserRegister, SmsCode, Token +from module_admin.entity.vo.user_vo import CurrentUserModel, EditUserModel, ResetUserModel from module_admin.service.login_service import CustomOAuth2PasswordRequestForm, LoginService, oauth2_scheme from module_admin.service.user_service import UserService from utils.log_util import logger @@ -106,34 +106,20 @@ async def register_user(request: Request, user_register: UserRegister, query_db: return ResponseUtil.success(data=user_register_result, msg=user_register_result.message) -# @loginController.post("/getSmsCode", response_model=SmsCode) -# async def get_sms_code(request: Request, user: ResetUserModel, query_db: AsyncSession = Depends(get_db)): -# try: -# sms_result = await LoginService.get_sms_code_services(request, query_db, user) -# if sms_result.is_success: -# logger.info('获取成功') -# return ResponseUtil.success(data=sms_result) -# else: -# logger.warning(sms_result.message) -# return ResponseUtil.failure(msg=sms_result.message) -# except Exception as e: -# logger.exception(e) -# return ResponseUtil.error(msg=str(e)) -# -# -# @loginController.post("/forgetPwd", response_model=CrudResponseModel) -# async def forget_user_pwd(request: Request, forget_user: ResetUserModel, query_db: AsyncSession = Depends(get_db)): -# try: -# forget_user_result = await LoginService.forget_user_services(request, query_db, forget_user) -# if forget_user_result.is_success: -# logger.info(forget_user_result.message) -# return ResponseUtil.success(data=forget_user_result, msg=forget_user_result.message) -# else: -# logger.warning(forget_user_result.message) -# return ResponseUtil.failure(msg=forget_user_result.message) -# except Exception as e: -# logger.exception(e) -# return ResponseUtil.error(msg=str(e)) +@loginController.post('/getSmsCode', response_model=SmsCode) +async def get_sms_code(request: Request, user: ResetUserModel, query_db: AsyncSession = Depends(get_db)): + sms_result = await LoginService.get_sms_code_services(request, query_db, user) + logger.info('获取成功') + + return ResponseUtil.success(data=sms_result) + + +@loginController.post('/forgetPwd', response_model=CrudResponseModel) +async def forget_user_pwd(request: Request, forget_user: ResetUserModel, query_db: AsyncSession = Depends(get_db)): + forget_user_result = await LoginService.forget_user_services(request, query_db, forget_user) + logger.info(forget_user_result.message) + + return ResponseUtil.success(data=forget_user_result, msg=forget_user_result.message) @loginController.post('/logout') diff --git a/dash-fastapi-backend/module_admin/service/login_service.py b/dash-fastapi-backend/module_admin/service/login_service.py index eaa5a33..9511681 100644 --- a/dash-fastapi-backend/module_admin/service/login_service.py +++ b/dash-fastapi-backend/module_admin/service/login_service.py @@ -15,7 +15,6 @@ from exceptions.exception import LoginException, AuthException, ServiceException from module_admin.dao.login_dao import login_by_account from module_admin.dao.user_dao import UserDao from module_admin.entity.do.menu_do import SysMenu -from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.login_vo import MenuTreeModel, MetaModel, RouterModel, SmsCode, UserLogin, UserRegister from module_admin.entity.vo.user_vo import AddUserModel, CurrentUserModel, ResetUserModel, TokenData, UserInfoModel from module_admin.service.user_service import UserService @@ -424,7 +423,7 @@ class LoginService: """ redis_sms_result = await request.app.state.redis.get(f'{RedisInitKeyConfig.SMS_CODE.key}:{user.session_id}') if redis_sms_result: - return SmsCode(**dict(is_success=False, sms_code='', session_id='', message='短信验证码仍在有效期内')) + raise ServiceException(message='短信验证码仍在有效期内') is_user = await UserDao.get_user_by_name(query_db, user.user_name) if is_user: sms_code = str(random.randint(100000, 999999)) @@ -435,9 +434,9 @@ class LoginService: # 此处模拟调用短信服务 message_service(sms_code) - return SmsCode(**dict(is_success=True, sms_code=sms_code, session_id=session_id, message='获取成功')) + return SmsCode(is_success=True, sms_code=sms_code, session_id=session_id, message='获取成功') - return SmsCode(**dict(is_success=False, sms_code='', session_id='', message='用户不存在')) + raise ServiceException(message='用户不存在') @classmethod async def forget_user_services(cls, request: Request, query_db: AsyncSession, forget_user: ResetUserModel): @@ -453,17 +452,14 @@ class LoginService: f'{RedisInitKeyConfig.SMS_CODE.key}:{forget_user.session_id}' ) if forget_user.sms_code == redis_sms_result: - forget_user.password = PwdUtil.get_password_hash(forget_user.password) forget_user.user_id = (await UserDao.get_user_by_name(query_db, forget_user.user_name)).user_id edit_result = await UserService.reset_user_services(query_db, forget_user) - result = edit_result.dict() + return edit_result elif not redis_sms_result: - result = dict(is_success=False, message='短信验证码已过期') + raise ServiceException(message='短信验证码已过期') else: await request.app.state.redis.delete(f'{RedisInitKeyConfig.SMS_CODE.key}:{forget_user.session_id}') - result = dict(is_success=False, message='短信验证码不正确') - - return CrudResponseModel(**result) + raise ServiceException(message='短信验证码不正确') @classmethod async def logout_services(cls, request: Request, session_id: str): diff --git a/dash-fastapi-frontend/api/forget.py b/dash-fastapi-frontend/api/forget.py new file mode 100644 index 0000000..22eb736 --- /dev/null +++ b/dash-fastapi-frontend/api/forget.py @@ -0,0 +1,37 @@ +from utils.request import api_request + + +class ForgetApi: + """ + 忘记密码模块相关接口 + """ + + @classmethod + def forget_password(cls, json: dict): + """ + 忘记密码接口 + + :param data: 忘记密码参数 + :return: + """ + return api_request( + url='/forgetPwd', + method='post', + headers={'is_token': False}, + json=json, + ) + + @classmethod + def send_message(cls, json: dict): + """ + 发送短信验证码接口 + + :param data: 发送短信验证码参数 + :return: + """ + return api_request( + url='/getSmsCode', + method='post', + headers={'is_token': False}, + json=json, + ) diff --git a/dash-fastapi-frontend/callbacks/forget_c.py b/dash-fastapi-frontend/callbacks/forget_c.py index c1b0e39..3b29f3d 100644 --- a/dash-fastapi-frontend/callbacks/forget_c.py +++ b/dash-fastapi-frontend/callbacks/forget_c.py @@ -1,12 +1,10 @@ -import dash -from dash import dcc -import feffery_utils_components as fuc +from dash import dcc, no_update from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate - +from api.forget import ForgetApi from server import app from utils.common import validate_data_not_empty -from api.message import send_message_api +from utils.feedback_util import MessageManager @app.callback( @@ -29,13 +27,9 @@ from api.message import send_message_api 'forget-password-again-form-item', 'help' ), captcha_form_help=Output('forget-captcha-form-item', 'help'), - submit_loading=Output('forget-submit', 'loading'), redirect_container=Output( 'redirect-container', 'children', allow_duplicate=True ), - global_message_container=Output( - 'global-message-container', 'children', allow_duplicate=True - ), ), inputs=dict(nClicks=Input('forget-submit', 'nClicks')), state=dict( @@ -45,6 +39,7 @@ from api.message import send_message_api input_captcha=State('forget-input-captcha', 'value'), session_id=State('sms_code-session_id-container', 'data'), ), + running=[[Output('forget-submit', 'loading'), True, False]], prevent_initial_call=True, ) def forget_auth( @@ -57,65 +52,27 @@ def forget_auth( for item in [username, password, password_again, input_captcha] ): if password == password_again: - try: - forget_params = dict( - user_name=username, - password=password, - sms_code=input_captcha, - session_id=session_id, - ) - change_result = forget_user_pwd_api(forget_params) - if change_result.get('code') == 200: - return dict( - username_form_status=None, - password_form_status=None, - password_again_form_status=None, - captcha_form_status=None, - username_form_help=None, - password_form_help=None, - password_again_form_help=None, - captcha_form_help=None, - submit_loading=False, - redirect_container=dcc.Location( - pathname='/login', id='forget-redirect' - ), - global_message_container=fuc.FefferyFancyMessage( - change_result.get('message'), type='success' - ), - ) - - else: - return dict( - username_form_status=None, - password_form_status=None, - password_again_form_status=None, - captcha_form_status=None, - username_form_help=None, - password_form_help=None, - password_again_form_help=None, - captcha_form_help=None, - submit_loading=False, - redirect_container=None, - global_message_container=fuc.FefferyFancyMessage( - change_result.get('message'), type='error' - ), - ) - except Exception as e: - return dict( - username_form_status=None, - password_form_status=None, - password_again_form_status=None, - captcha_form_status=None, - username_form_help=None, - password_form_help=None, - password_again_form_help=None, - captcha_form_help=None, - submit_loading=False, - redirect_container=None, - global_message_container=fuc.FefferyFancyMessage( - str(e), type='error' - ), - ) + forget_params = dict( + user_name=username, + password=password, + sms_code=input_captcha, + session_id=session_id, + ) + ForgetApi.forget_password(forget_params) + MessageManager.success(content='重置成功') + return dict( + username_form_status=None, + password_form_status=None, + password_again_form_status=None, + captcha_form_status=None, + username_form_help=None, + password_form_help=None, + password_again_form_help=None, + captcha_form_help=None, + redirect_container=dcc.Location( + pathname='/login', id='forget-redirect' + ), + ) else: return dict( @@ -127,9 +84,7 @@ def forget_auth( password_form_help='两次密码不一致', password_again_form_help='两次密码不一致', captcha_form_help=None, - submit_loading=False, redirect_container=None, - global_message_container=None, ) return dict( @@ -157,9 +112,7 @@ def forget_auth( captcha_form_help=None if validate_data_not_empty(input_captcha) else '请输入短信验证码!', - submit_loading=False, redirect_container=None, - global_message_container=None, ) raise PreventUpdate @@ -170,7 +123,6 @@ def forget_auth( Output('message-code-count-down', 'delay'), Output('get-message-code', 'disabled', allow_duplicate=True), Output('sms_code-session_id-container', 'data'), - Output('global-message-container', 'children', allow_duplicate=True), ], Input('get-message-code', 'nClicks'), [ @@ -181,47 +133,26 @@ def forget_auth( ) def message_countdown(nClicks, username, session_id): if nClicks: - try: - if username: - send_result = send_message_api( - dict(user_name=username, session_id=session_id) - ) - if send_result.get('code') == 200: - return [ - 120, - True, - send_result.get('data').get('session_id'), - fuc.FefferyFancyMessage( - send_result.get('message'), type='success' - ), - ] - else: - return [ - dash.no_update, - False, - dash.no_update, - fuc.FefferyFancyMessage( - send_result.get('message'), type='error' - ), - ] - - else: - return [ - dash.no_update, - False, - dash.no_update, - fuc.FefferyFancyMessage('请输入用户名', type='error'), - ] + if username: + send_result = ForgetApi.send_message( + dict(user_name=username, session_id=session_id) + ) + MessageManager.success(content='获取成功') + return [ + 120, + True, + send_result.get('data').get('session_id'), + ] - except Exception as e: + else: + MessageManager.error(content='请输入用户名') return [ - dash.no_update, + no_update, False, - dash.no_update, - fuc.FefferyFancyMessage(str(e), type='error'), + no_update, ] - return [dash.no_update] * 4 + raise PreventUpdate app.clientside_callback( diff --git a/dash-fastapi-frontend/views/forget.py b/dash-fastapi-frontend/views/forget.py index 3e480b4..73bfbfd 100644 --- a/dash-fastapi-frontend/views/forget.py +++ b/dash-fastapi-frontend/views/forget.py @@ -1,17 +1,18 @@ -from dash import html, dcc import feffery_antd_components as fac import feffery_utils_components as fuc - -import callbacks.forget_c +from dash import dcc, html +from callbacks import forget_c # noqa: F401 def render_forget_content(): return html.Div( [ - fac.AntdCard( [ - dcc.Store(id='sms_code-session_id-container', storage_type='session'), + dcc.Store( + id='sms_code-session_id-container', + storage_type='session', + ), fac.AntdForm( [ fac.AntdFormItem( @@ -19,11 +20,9 @@ def render_forget_content(): placeholder='请输入用户名', id='forget-username', size='large', - prefix=fac.AntdIcon( - icon='antd-user' - ), + prefix=fac.AntdIcon(icon='antd-user'), ), - id='forget-username-form-item' + id='forget-username-form-item', ), fac.AntdFormItem( fac.AntdInput( @@ -32,11 +31,9 @@ def render_forget_content(): mode='password', passwordUseMd5=True, size='large', - prefix=fac.AntdIcon( - icon='antd-lock' - ), + prefix=fac.AntdIcon(icon='antd-lock'), ), - id='forget-password-form-item' + id='forget-password-form-item', ), fac.AntdFormItem( fac.AntdInput( @@ -45,11 +42,9 @@ def render_forget_content(): mode='password', passwordUseMd5=True, size='large', - prefix=fac.AntdIcon( - icon='antd-lock' - ), + prefix=fac.AntdIcon(icon='antd-lock'), ), - id='forget-password-again-form-item' + id='forget-password-again-form-item', ), fac.AntdSpace( [ @@ -61,23 +56,21 @@ def render_forget_content(): prefix=fac.AntdIcon( icon='antd-check-circle' ), - style={ - 'width': '270px' - } + style={'width': '270px'}, ), - id='forget-captcha-form-item' + id='forget-captcha-form-item', ), fac.AntdFormItem( fac.AntdButton( '获取验证码', id='get-message-code', type='primary', - size='large' + size='large', ) ), ], align='end', - size=10 + size=10, ), fac.AntdFormItem( fac.AntdButton( @@ -89,18 +82,13 @@ def render_forget_content(): block=True, size='large', ), - style={ - 'marginTop': '20px' - } - ) + style={'marginTop': '20px'}, + ), ], layout='vertical', - style={ - 'width': '100%' - } + style={'width': '100%'}, ), - - fuc.FefferyCountDown(id='message-code-count-down') + fuc.FefferyCountDown(id='message-code-count-down'), ], id='forget-form-container', title='重置密码', @@ -109,14 +97,12 @@ def render_forget_content(): 'content': '返回登录', 'href': '/login', 'target': '_self', - 'style': { - 'font-size': '16px' - } + 'style': {'font-size': '16px'}, }, headStyle={ 'font-weight': 'bold', 'text-align': 'center', - 'font-size': '30px' + 'font-size': '30px', }, style={ 'position': 'fixed', @@ -124,9 +110,8 @@ def render_forget_content(): 'left': '50%', 'width': '500px', 'padding': '0px 30px', - 'transform': 'translateX(-50%)' - } + 'transform': 'translateX(-50%)', + }, ), ] ) - -- Gitee From 514c64cd8fa14e8831d9a4c451e9a61ec1daeeb0 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 21:02:12 +0800 Subject: [PATCH 153/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/utils/common_util.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dash-fastapi-backend/utils/common_util.py b/dash-fastapi-backend/utils/common_util.py index ba21db2..bcbe751 100644 --- a/dash-fastapi-backend/utils/common_util.py +++ b/dash-fastapi-backend/utils/common_util.py @@ -72,6 +72,8 @@ class SqlalchemyUtil: elif isinstance(result, Row): if all([isinstance(row, Base) for row in result]): return [cls.base_to_dict(row) for row in result] + elif any([isinstance(row, Base) for row in result]): + return [cls.serialize_result(row) for row in result] else: return result._asdict() return result -- Gitee From 51eeafb8e0ace8f0c1b46899fe85d61b7f071f17 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 21:03:12 +0800 Subject: [PATCH 154/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dget=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=9C=A8=E7=89=B9=E6=AE=8A=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py | 5 ++++- dash-fastapi-frontend/views/system/user/profile/__init__.py | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 6e4251f..d146274 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -31,11 +31,14 @@ def generate_user_table(query_params: Dict): total=table_info['total'], ) for item in table_data: + print(item) if item['status'] == '0': item['status'] = dict(checked=True, disabled=item['user_id'] == 1) else: item['status'] = dict(checked=False, disabled=item['user_id'] == 1) - item['dept_name'] = item.get('dept', {}).get('dept_name') + item['dept_name'] = ( + item.get('dept').get('dept_name') if item.get('dept') else None + ) item['key'] = str(item['user_id']) if item['user_id'] == 1: item['operation'] = [] diff --git a/dash-fastapi-frontend/views/system/user/profile/__init__.py b/dash-fastapi-frontend/views/system/user/profile/__init__.py index c4ba461..025a443 100644 --- a/dash-fastapi-frontend/views/system/user/profile/__init__.py +++ b/dash-fastapi-frontend/views/system/user/profile/__init__.py @@ -87,6 +87,10 @@ def render(*args, **kwargs): user_profile.get('data') .get('dept') .get('dept_name') + if user_profile.get( + 'data' + ).get('dept') + else '' + ' / ' + user_profile.get( 'post_group' -- Gitee From 1755c4412f758fde38782f9fcedacd1a81e6ebda Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 21:03:39 +0800 Subject: [PATCH 155/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=B3=A8=E5=86=8C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/message.py | 6 - dash-fastapi-frontend/api/register.py | 22 +++ dash-fastapi-frontend/callbacks/register_c.py | 178 ++++++++++++++++++ dash-fastapi-frontend/callbacks/router_c.py | 10 +- dash-fastapi-frontend/config/global_config.py | 28 +-- dash-fastapi-frontend/views/__init__.py | 17 +- dash-fastapi-frontend/views/register.py | 132 +++++++++++++ 7 files changed, 366 insertions(+), 27 deletions(-) delete mode 100644 dash-fastapi-frontend/api/message.py create mode 100644 dash-fastapi-frontend/api/register.py create mode 100644 dash-fastapi-frontend/callbacks/register_c.py create mode 100644 dash-fastapi-frontend/views/register.py diff --git a/dash-fastapi-frontend/api/message.py b/dash-fastapi-frontend/api/message.py deleted file mode 100644 index 8257f76..0000000 --- a/dash-fastapi-frontend/api/message.py +++ /dev/null @@ -1,6 +0,0 @@ -from utils.request import api_request - - -def send_message_api(page_obj: dict): - - return api_request(method='post', url='/login/getSmsCode', is_headers=False, json=page_obj) \ No newline at end of file diff --git a/dash-fastapi-frontend/api/register.py b/dash-fastapi-frontend/api/register.py new file mode 100644 index 0000000..8300755 --- /dev/null +++ b/dash-fastapi-frontend/api/register.py @@ -0,0 +1,22 @@ +from utils.request import api_request + + +class RegisterApi: + """ + 注册模块相关接口 + """ + + @classmethod + def register(cls, json: dict): + """ + 注册接口 + + :param data: 注册参数 + :return: + """ + return api_request( + url='/register', + method='post', + headers={'is_token': False}, + json=json, + ) diff --git a/dash-fastapi-frontend/callbacks/register_c.py b/dash-fastapi-frontend/callbacks/register_c.py new file mode 100644 index 0000000..30050ad --- /dev/null +++ b/dash-fastapi-frontend/callbacks/register_c.py @@ -0,0 +1,178 @@ +import time +from dash import dcc, no_update +from dash.dependencies import Input, Output, State +from dash.exceptions import PreventUpdate +from api.login import LoginApi +from api.register import RegisterApi +from server import app +from utils.common import validate_data_not_empty +from utils.feedback_util import MessageManager + + +@app.callback( + output=dict( + username_form_status=Output( + 'register-username-form-item', 'validateStatus' + ), + password_form_status=Output( + 'register-password-form-item', 'validateStatus' + ), + confirm_password_form_status=Output( + 'register-confirm_password-form-item', 'validateStatus' + ), + captcha_form_status=Output( + 'register-captcha-form-item', 'validateStatus' + ), + username_form_help=Output('register-username-form-item', 'help'), + password_form_help=Output('register-password-form-item', 'help'), + confirm_password_form_help=Output( + 'register-confirm_password-form-item', 'help' + ), + captcha_form_help=Output('register-captcha-form-item', 'help'), + redirect_container=Output( + 'redirect-container', 'children', allow_duplicate=True + ), + register_success=Output('register-success-container', 'data'), + ), + inputs=dict( + button_click=Input('register-submit', 'nClicks'), + keyboard_enter_press=Input( + 'register-keyboard-enter-submit', 'pressedCounts' + ), + ), + state=dict( + username=State('register-username', 'value'), + password=State('register-password', 'value'), + confirm_password=State('register-confirm_password', 'value'), + input_captcha=State('register-captcha', 'value'), + session_id=State('register-captcha_image-session_id-container', 'data'), + captcha_hidden=State('register-captcha-row-container', 'hidden'), + ), + running=[ + [Output('register-submit', 'loading'), True, False], + [Output('register-captcha-image-container', 'n_clicks'), 0, 1], + ], + prevent_initial_call=True, +) +def register( + button_click, + keyboard_enter_press, + username, + password, + confirm_password, + input_captcha, + session_id, + captcha_hidden, +): + if button_click or keyboard_enter_press: + validate_list = [username, password, confirm_password, input_captcha] + if captcha_hidden: + validate_list = [username, password, confirm_password] + # 校验全部输入值是否不为空 + if all(validate_data_not_empty(item) for item in validate_list): + if password == confirm_password: + register_params = dict( + username=username, + password=password, + confirm_password=confirm_password, + code=input_captcha, + uuid=session_id, + ) + RegisterApi.register(register_params) + MessageManager.success(content='注册成功') + return dict( + username_form_status=None, + password_form_status=None, + confirm_password_form_status=None, + captcha_form_status=None, + username_form_help=None, + password_form_help=None, + confirm_password_form_help=None, + captcha_form_help=None, + redirect_container=dcc.Location( + pathname='/', id='register-redirect' + ), + register_success={'timestamp': time.time()}, + ) + else: + MessageManager.warning(content='两次输入的密码不一致!') + return dict( + username_form_status=None, + password_form_status='error', + confirm_password_form_status='error', + captcha_form_status=None, + username_form_help=None, + password_form_help='两次输入的密码不一致!', + confirm_password_form_help='两次输入的密码不一致!', + captcha_form_help=None, + redirect_container=None, + register_success=None, + ) + + return dict( + username_form_status=None + if validate_data_not_empty(username) + else 'error', + password_form_status=None + if validate_data_not_empty(password) + else 'error', + confirm_password_form_status=None + if validate_data_not_empty(confirm_password) + else 'error', + captcha_form_status=None + if validate_data_not_empty(input_captcha) + else 'error', + username_form_help=None + if validate_data_not_empty(username) + else '请输入用户名!', + password_form_help=None + if validate_data_not_empty(password) + else '请输入密码!', + confirm_password_form_help=None + if validate_data_not_empty(confirm_password) + else '请再次输入密码!', + captcha_form_help=None + if validate_data_not_empty(input_captcha) + else '请输入验证码!', + redirect_container=None, + register_success=None, + ) + + return dict( + username_form_status=no_update, + password_form_status=no_update, + confirm_password_form_status=no_update, + captcha_form_status=no_update, + username_form_help=no_update, + password_form_help=no_update, + confirm_password_form_help=no_update, + captcha_form_help=no_update, + redirect_container=no_update, + register_success=None, + ) + + +@app.callback( + [ + Output('register-captcha-row-container', 'hidden'), + Output('register-captcha-image', 'src'), + Output('register-captcha_image-session_id-container', 'data'), + ], + Input('register-captcha-image-container', 'n_clicks'), + State('register-success-container', 'data'), + prevent_initial_call=True, +) +def change_register_captcha_image(captcha_click, login_success): + if captcha_click and not login_success: + captcha_image_info = LoginApi.get_code_img() + captcha_enabled = captcha_image_info.get('captcha_enabled') + captcha_image = f"data:image/gif;base64,{captcha_image_info.get('img')}" + session_id = captcha_image_info.get('uuid') + + return [ + not captcha_enabled, + captcha_image, + session_id, + ] + + raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/router_c.py b/dash-fastapi-frontend/callbacks/router_c.py index 140b42a..15804b1 100644 --- a/dash-fastapi-frontend/callbacks/router_c.py +++ b/dash-fastapi-frontend/callbacks/router_c.py @@ -8,7 +8,7 @@ from server import app from utils.cache_util import CacheManager from utils.router_util import RouterUtil from utils.tree_tool import find_key_by_href, find_node_values -from views import forget, layout, login, page_404 +from views import forget, layout, login, page_404, register @app.callback( @@ -125,6 +125,14 @@ def router(pathname, url_trigger, session_token): search_panel_data=no_update, ) + if pathname == '/register': + return dict( + app_mount=register.render_register_content(), + redirect_container=None, + menu_current_key=no_update, + search_panel_data=no_update, + ) + # 否则重定向到登录页 return dict( app_mount=no_update, diff --git a/dash-fastapi-frontend/config/global_config.py b/dash-fastapi-frontend/config/global_config.py index 2485a4f..f6c3f11 100644 --- a/dash-fastapi-frontend/config/global_config.py +++ b/dash-fastapi-frontend/config/global_config.py @@ -3,30 +3,34 @@ from config.env import AppConfig class PathConfig: - # 项目绝对根目录 ABS_ROOT_PATH = os.path.abspath(os.getcwd()) class RouterConfig: - # 合法pathname列表 - BASIC_VALID_PATHNAME = [ - '/', '/login', '/forget' - ] + BASIC_VALID_PATHNAME = ['/', '/login', '/forget', '/register'] # 静态路由列表 - STATIC_VALID_PATHNAME = ['/', '/login', '/forget', '/user/profile'] + STATIC_VALID_PATHNAME = [ + '/', + '/login', + '/forget', + '/register', + '/user/profile', + ] class ApiBaseUrlConfig: - # api基本url - BaseUrl = AppConfig.app_base_url + AppConfig.app_proxy_path if AppConfig.app_is_proxy else AppConfig.app_base_url - - + BaseUrl = ( + AppConfig.app_base_url + AppConfig.app_proxy_path + if AppConfig.app_is_proxy + else AppConfig.app_base_url + ) + + class IconConfig: - ICON_LIST = [ 'antd-carry-out', 'antd-car', @@ -489,5 +493,5 @@ class IconConfig: 'bs-alarm', 'gi-mesh-network', 'im-earth', - 'im-sphere' + 'im-sphere', ] diff --git a/dash-fastapi-frontend/views/__init__.py b/dash-fastapi-frontend/views/__init__.py index bc38240..4f47d35 100644 --- a/dash-fastapi-frontend/views/__init__.py +++ b/dash-fastapi-frontend/views/__init__.py @@ -1,10 +1,11 @@ from . import ( - layout, - dashboard, - system, - monitor, - tool, - login, - page_404, - forget + dashboard, # noqa: F401 + forget, # noqa: F401 + layout, # noqa: F401 + login, # noqa: F401 + monitor, # noqa: F401 + page_404, # noqa: F401 + register, # noqa: F401 + system, # noqa: F401 + tool, # noqa: F401 ) diff --git a/dash-fastapi-frontend/views/register.py b/dash-fastapi-frontend/views/register.py new file mode 100644 index 0000000..bc71a54 --- /dev/null +++ b/dash-fastapi-frontend/views/register.py @@ -0,0 +1,132 @@ +import feffery_antd_components as fac +import feffery_utils_components as fuc +from dash import dcc, html +from callbacks import register_c # noqa: F401 + + +def render_register_content(): + return html.Div( + [ + fac.AntdCard( + [ + dcc.Store(id='register-success-container'), + dcc.Store(id='register-captcha_image-session_id-container'), + fac.AntdForm( + [ + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入用户名', + id='register-username', + size='large', + prefix=fac.AntdIcon(icon='antd-user'), + ), + id='register-username-form-item', + ), + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入密码', + id='register-password', + mode='password', + passwordUseMd5=True, + size='large', + prefix=fac.AntdIcon(icon='antd-lock'), + ), + id='register-password-form-item', + ), + fac.AntdFormItem( + fac.AntdInput( + placeholder='请再次输入密码', + id='register-confirm_password', + mode='password', + passwordUseMd5=True, + size='large', + prefix=fac.AntdIcon(icon='antd-lock'), + ), + id='register-confirm_password-form-item', + ), + html.Div( + [ + fac.AntdSpace( + [ + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入验证码', + id='register-captcha', + size='large', + prefix=fac.AntdIcon( + icon='antd-check-circle' + ), + style={'width': '280px'}, + ), + id='register-captcha-form-item', + ), + fac.AntdFormItem( + html.Div( + [ + fac.AntdImage( + id='register-captcha-image', + src='', + height=37, + width=100, + preview=False, + ) + ], + id='register-captcha-image-container', + style={ + 'border': '1px solid #ccc' + }, + ), + ), + ], + align='end', + size=10, + ), + ], + id='register-captcha-row-container', + ), + fuc.FefferyKeyPress( + id='register-keyboard-enter-submit', + keys='enter', + ), + fac.AntdFormItem( + fac.AntdButton( + '注册', + id='register-submit', + type='primary', + loadingChildren='注册中', + autoSpin=True, + block=True, + size='large', + ), + style={'marginBottom': '10px'}, + ), + ], + layout='vertical', + style={'width': '100%'}, + ), + ], + id='register-form-container', + title='用户注册', + hoverable=True, + extraLink={ + 'content': '返回登录', + 'href': '/login', + 'target': '_self', + 'style': {'font-size': '16px'}, + }, + headStyle={ + 'font-weight': 'bold', + 'text-align': 'center', + 'font-size': '30px', + }, + style={ + 'position': 'fixed', + 'top': '16%', + 'left': '50%', + 'width': '500px', + 'padding': '0px 30px', + 'transform': 'translateX(-50%)', + }, + ), + ] + ) -- Gitee From 46bd3465a3b8492efead621c551d75e0a3fc5c24 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 21:05:11 +0800 Subject: [PATCH 156/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/register.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/views/register.py b/dash-fastapi-frontend/views/register.py index bc71a54..5a2634f 100644 --- a/dash-fastapi-frontend/views/register.py +++ b/dash-fastapi-frontend/views/register.py @@ -98,7 +98,7 @@ def render_register_content(): block=True, size='large', ), - style={'marginBottom': '10px'}, + style={'marginTop': '20px'}, ), ], layout='vertical', -- Gitee From 856e17be14c0985fa169d97799294ced889610f9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 22:38:23 +0800 Subject: [PATCH 157/229] =?UTF-8?q?style:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8print?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index d146274..3c2ef15 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -31,7 +31,6 @@ def generate_user_table(query_params: Dict): total=table_info['total'], ) for item in table_data: - print(item) if item['status'] == '0': item['status'] = dict(checked=True, disabled=item['user_id'] == 1) else: -- Gitee From 96db634457ed357268f0a97e4f83de713c59a591 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 21 Sep 2024 22:39:47 +0800 Subject: [PATCH 158/229] =?UTF-8?q?feat:=20=E5=A4=96=E9=83=A8=E7=BD=91?= =?UTF-8?q?=E7=AB=99=E6=94=AF=E6=8C=81=E4=BD=BF=E7=94=A8tab=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/innnerlink_c.py | 20 +++++++++++ .../callbacks/layout_c/index_c.py | 30 ++++++++--------- dash-fastapi-frontend/utils/router_util.py | 16 ++++----- dash-fastapi-frontend/views/__init__.py | 1 + .../views/innerlink/__init__.py | 33 +++++++++++++++++++ 5 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 dash-fastapi-frontend/callbacks/innnerlink_c.py create mode 100644 dash-fastapi-frontend/views/innerlink/__init__.py diff --git a/dash-fastapi-frontend/callbacks/innnerlink_c.py b/dash-fastapi-frontend/callbacks/innnerlink_c.py new file mode 100644 index 0000000..786edd9 --- /dev/null +++ b/dash-fastapi-frontend/callbacks/innnerlink_c.py @@ -0,0 +1,20 @@ +from dash.dependencies import Input, Output, State +from server import app + + +app.clientside_callback( + """ + (_, current_item) => { + if (current_item?.props?.modules === 'innerlink') { + return [current_item?.props?.link, true]; + } + throw window.dash_clientside.PreventUpdate; + } + """, + [ + Output('innerlink-iframe', 'src'), + Output('init-iframe-interval', 'disabled'), + ], + Input('init-iframe-interval', 'n_intervals'), + State('index-side-menu', 'currentItem'), +) diff --git a/dash-fastapi-frontend/callbacks/layout_c/index_c.py b/dash-fastapi-frontend/callbacks/layout_c/index_c.py index 1dbd3ba..fb5a71c 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/index_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/index_c.py @@ -6,6 +6,7 @@ from dash.exceptions import PreventUpdate from jsonpath_ng import parse from server import app from utils.cache_util import CacheManager +from utils.router_util import RouterUtil from utils.tree_tool import find_href_by_key import views # noqa: F401 @@ -130,22 +131,21 @@ def handle_tab_switch_and_create( 'icon': 'antd-arrow-left', }, ) + if RouterUtil.is_http(currentItem.get('path')): + raise PreventUpdate if menu_modules: - if menu_modules == 'link': - raise PreventUpdate - else: - # 否则追加子项返回 - # 其中若各标签页内元素类似,则推荐配合模式匹配构建交互逻辑 - new_items.append( - { - 'label': menu_title, - 'key': currentKey, - 'children': importlib.import_module( - 'views.' + menu_modules - ).render(), - 'contextMenu': context_menu, - } - ) + # 否则追加子项返回 + # 其中若各标签页内元素类似,则推荐配合模式匹配构建交互逻辑 + new_items.append( + { + 'label': menu_title, + 'key': currentKey, + 'children': importlib.import_module( + 'views.' + menu_modules + ).render(), + 'contextMenu': context_menu, + } + ) else: new_items.append( { diff --git a/dash-fastapi-frontend/utils/router_util.py b/dash-fastapi-frontend/utils/router_util.py index 1db70b0..e1e8890 100644 --- a/dash-fastapi-frontend/utils/router_util.py +++ b/dash-fastapi-frontend/utils/router_util.py @@ -40,30 +40,30 @@ class RouterUtil: and ( copy_router.get('path').startswith('/') or cls.is_http(copy_router.get('path')) + or copy_router.get('component') == 'InnerLink' ) else '/' + copy_router.get('path') ) + meta = copy_router.get('meta') if copy_router.get('meta') else {} copy_router['props'] = { - **copy_router.get('meta'), - 'key': copy_router.get('name'), + **meta, + 'key': copy_router.get('name') + copy_router.get('path'), 'href': path + copy_router.get('path'), } if copy_router.get('component') in ['Layout', 'ParentView']: copy_router['component'] = 'SubMenu' + if cls.is_http(copy_router.get('path')): + copy_router['props']['target'] = '_blank' elif copy_router.get('component') == 'InnerLink': if copy_router.get('path') == '/': copy_router = copy_router['children'] copy_router['props']['href'] = '/' + copy_router.get('path') - cls.__genrate_item_menu( - copy_router, 'components.inner_link' - ) + cls.__genrate_item_menu(copy_router, 'innerlink') else: if copy_router.get('children'): copy_router['component'] = 'SubMenu' else: - cls.__genrate_item_menu( - copy_router, 'components.inner_link' - ) + cls.__genrate_item_menu(copy_router, 'innerlink') else: cls.__genrate_item_menu( copy_router, copy_router.get('component') diff --git a/dash-fastapi-frontend/views/__init__.py b/dash-fastapi-frontend/views/__init__.py index 4f47d35..277167d 100644 --- a/dash-fastapi-frontend/views/__init__.py +++ b/dash-fastapi-frontend/views/__init__.py @@ -1,6 +1,7 @@ from . import ( dashboard, # noqa: F401 forget, # noqa: F401 + innerlink, # noqa: F401 layout, # noqa: F401 login, # noqa: F401 monitor, # noqa: F401 diff --git a/dash-fastapi-frontend/views/innerlink/__init__.py b/dash-fastapi-frontend/views/innerlink/__init__.py new file mode 100644 index 0000000..a866be5 --- /dev/null +++ b/dash-fastapi-frontend/views/innerlink/__init__.py @@ -0,0 +1,33 @@ +from dash import dcc, html +import feffery_utils_components as fuc +from callbacks import innnerlink_c # noqa: F401 + + +def render(*args, **kwargs): + return [ + html.Div( + [ + dcc.Interval( + id='init-iframe-interval', + n_intervals=0, + interval=500, + disabled=False, + ), + fuc.FefferyStyle( + rawStyle=""" + iframe { + border: none; + width: 100%; + height: 100%; + display: block + } + """ + ), + html.Iframe( + id='innerlink-iframe', + ), + ], + id='innerlink-container', + style={'position': 'relative', 'height': 'calc(100vh - 120px)'}, + ) + ] -- Gitee From f913a04f4a13ec3337bb351e933a77738673d809 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 22 Sep 2024 19:54:26 +0800 Subject: [PATCH 159/229] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=92=8C=E6=98=BE?= =?UTF-8?q?=E9=9A=90=E5=AD=97=E6=AE=B5=E5=BC=95=E5=85=A5=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/menu_c/menu_c.py | 8 +- .../views/system/menu/__init__.py | 14 +- .../views/system/menu/components/__init__.py | 6 +- .../system/menu/components/button_type.py | 5 +- .../system/menu/components/content_type.py | 112 +++-------- .../views/system/menu/components/menu_type.py | 190 ++++++------------ 6 files changed, 100 insertions(+), 235 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index 34280dd..dd8fb8a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -7,6 +7,7 @@ from dash.exceptions import PreventUpdate from typing import Dict from api.system.menu import MenuApi from server import app +from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.tree_tool import list_to_tree, list_to_tree_select @@ -63,10 +64,9 @@ def generate_menu_table(query_params: Dict): if PermissionManager.check_perms('system:menu:remove') else {}, ] - if item['status'] == '0': - item['status'] = dict(tag='正常', color='blue') - else: - item['status'] = dict(tag='停用', color='volcano') + item['status'] = DictManager.get_dict_tag( + dict_type='sys_normal_disable', dict_value=item.get('status') + ) table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') return [table_data_new, default_expanded_row_keys] diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index 0325f1d..65a7896 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -1,6 +1,7 @@ import feffery_antd_components as fac from dash import dcc, html from callbacks.system_c.menu_c import menu_c +from components.ApiSelect import ApiSelect from utils.permission_util import PermissionManager from views.system.menu.components.icon_category import render_icon @@ -49,19 +50,10 @@ def render(*args, **kwargs): label='菜单名称', ), fac.AntdFormItem( - fac.AntdSelect( + ApiSelect( + dict_type='sys_normal_disable', id='menu-status-select', placeholder='菜单状态', - options=[ - { - 'label': '正常', - 'value': '0', - }, - { - 'label': '停用', - 'value': '1', - }, - ], style={ 'width': 240 }, diff --git a/dash-fastapi-frontend/views/system/menu/components/__init__.py b/dash-fastapi-frontend/views/system/menu/components/__init__.py index 6593c9d..14c5787 100644 --- a/dash-fastapi-frontend/views/system/menu/components/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/components/__init__.py @@ -1,5 +1,5 @@ from . import ( - content_type, - menu_type, - button_type + button_type, # noqa: F401 + content_type, # noqa: F401 + menu_type, # noqa: F401 ) diff --git a/dash-fastapi-frontend/views/system/menu/components/button_type.py b/dash-fastapi-frontend/views/system/menu/components/button_type.py index e84ece6..0f47932 100644 --- a/dash-fastapi-frontend/views/system/menu/components/button_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/button_type.py @@ -1,7 +1,6 @@ -from dash import html import feffery_antd_components as fac - -import callbacks.system_c.menu_c.components_c.button_type_c +from dash import html +from callbacks.system_c.menu_c.components_c import button_type_c # noqa: F401 def render(): diff --git a/dash-fastapi-frontend/views/system/menu/components/content_type.py b/dash-fastapi-frontend/views/system/menu/components/content_type.py index 5d663af..e216f43 100644 --- a/dash-fastapi-frontend/views/system/menu/components/content_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/content_type.py @@ -1,7 +1,7 @@ -from dash import html import feffery_antd_components as fac - -import callbacks.system_c.menu_c.components_c.content_type_c +from dash import html +from callbacks.system_c.menu_c.components_c import content_type_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup def render(): @@ -12,57 +12,41 @@ def render(): fac.AntdRadioGroup( id='content-menu-is_frame', options=[ - { - 'label': '是', - 'value': 0 - }, - { - 'label': '否', - 'value': 1 - }, + {'label': '是', 'value': 0}, + {'label': '否', 'value': 1}, ], defaultValue=1, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='选择是外链则路由地址需要以`http(s)://`开头' + fac.AntdIcon(icon='antd-question-circle'), + title='选择是外链则路由地址需要以`http(s)://`开头', ), - fac.AntdText('是否外链') + fac.AntdText('是否外链'), ] ), id='content-menu-is_frame-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), fac.AntdFormItem( fac.AntdInput( id='content-menu-path', placeholder='请输入路由地址', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头' + fac.AntdIcon(icon='antd-question-circle'), + title='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头', ), - fac.AntdText('路由地址') + fac.AntdText('路由地址'), ] ), required=True, @@ -70,90 +54,58 @@ def render(): labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_show_hide', id='content-menu-visible', - options=[ - { - 'label': '显示', - 'value': '0' - }, - { - 'label': '隐藏', - 'value': '1' - }, - ], defaultValue='0', - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问' + fac.AntdIcon(icon='antd-question-circle'), + title='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问', ), - fac.AntdText('显示状态') + fac.AntdText('显示状态'), ] ), id='content-menu-visible-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', id='content-menu-status', - options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, - ], defaultValue='0', - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='选择停用则路由将不会出现在侧边栏,也不能被访问' + fac.AntdIcon(icon='antd-question-circle'), + title='选择停用则路由将不会出现在侧边栏,也不能被访问', ), - fac.AntdText('菜单状态') + fac.AntdText('菜单状态'), ] ), id='content-menu-status-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), ], - size="middle" - ) + size='middle', + ), ] diff --git a/dash-fastapi-frontend/views/system/menu/components/menu_type.py b/dash-fastapi-frontend/views/system/menu/components/menu_type.py index 6d97592..73b1948 100644 --- a/dash-fastapi-frontend/views/system/menu/components/menu_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/menu_type.py @@ -1,7 +1,7 @@ -from dash import html import feffery_antd_components as fac - -import callbacks.system_c.menu_c.components_c.menu_type_c +from dash import html +from callbacks.system_c.menu_c.components_c import menu_type_c # noqa: F401 +from components.ApiRadioGroup import ApiRadioGroup def render(): @@ -12,57 +12,41 @@ def render(): fac.AntdRadioGroup( id='menu-menu-is_frame', options=[ - { - 'label': '是', - 'value': 0 - }, - { - 'label': '否', - 'value': 1 - }, + {'label': '是', 'value': 0}, + {'label': '否', 'value': 1}, ], defaultValue=1, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='选择是外链则路由地址需要以`http(s)://`开头' + fac.AntdIcon(icon='antd-question-circle'), + title='选择是外链则路由地址需要以`http(s)://`开头', ), - fac.AntdText('是否外链') + fac.AntdText('是否外链'), ] ), id='menu-menu-is_frame-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), fac.AntdFormItem( fac.AntdInput( id='menu-menu-path', placeholder='请输入路由地址', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头' + fac.AntdIcon(icon='antd-question-circle'), + title='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头', ), - fac.AntdText('路由地址') + fac.AntdText('路由地址'), ] ), required=True, @@ -70,12 +54,10 @@ def render(): labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -84,59 +66,47 @@ def render(): id='menu-menu-component', placeholder='请输入组件路径', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='访问的组件路径,如:`system.user.index`,默认在`views`目录下' + fac.AntdIcon(icon='antd-question-circle'), + title='访问的组件路径,如:`system.user.index`,默认在`views`目录下', ), - fac.AntdText('组件路径') + fac.AntdText('组件路径'), ] ), id='menu-menu-component-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), fac.AntdFormItem( fac.AntdInput( id='menu-menu-perms', placeholder='请输入权限字符', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='控制器中定义的权限字符,如:system:user:list' + fac.AntdIcon(icon='antd-question-circle'), + title='控制器中定义的权限字符,如:system:user:list', ), - fac.AntdText('权限字符') + fac.AntdText('权限字符'), ] ), id='menu-menu-perms-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ @@ -145,146 +115,98 @@ def render(): id='menu-menu-query', placeholder='请输入路由参数', allowClear=True, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`' + fac.AntdIcon(icon='antd-question-circle'), + title='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`', ), - fac.AntdText('路由参数') + fac.AntdText('路由参数'), ] ), id='menu-menu-query-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), fac.AntdFormItem( fac.AntdRadioGroup( id='menu-menu-is_cache', options=[ - { - 'label': '缓存', - 'value': 0 - }, - { - 'label': '不缓存', - 'value': 1 - }, + {'label': '缓存', 'value': 0}, + {'label': '不缓存', 'value': 1}, ], defaultValue=0, - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致' + fac.AntdIcon(icon='antd-question-circle'), + title='选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致', ), - fac.AntdText('是否缓存') + fac.AntdText('是否缓存'), ] ), id='menu-menu-is_cache-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), ], - size="middle" + size='middle', ), fac.AntdSpace( [ fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_show_hide', id='menu-menu-visible', - options=[ - { - 'label': '显示', - 'value': '0' - }, - { - 'label': '隐藏', - 'value': '1' - }, - ], defaultValue='0', - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问' + fac.AntdIcon(icon='antd-question-circle'), + title='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问', ), - fac.AntdText('显示状态') + fac.AntdText('显示状态'), ] ), id='menu-menu-visible-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), fac.AntdFormItem( - fac.AntdRadioGroup( + ApiRadioGroup( + dict_type='sys_normal_disable', id='menu-menu-status', - options=[ - { - 'label': '正常', - 'value': '0' - }, - { - 'label': '停用', - 'value': '1' - }, - ], defaultValue='0', - style={ - 'width': 200 - } + style={'width': 200}, ), label=html.Div( [ fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='选择停用则路由将不会出现在侧边栏,也不能被访问' + fac.AntdIcon(icon='antd-question-circle'), + title='选择停用则路由将不会出现在侧边栏,也不能被访问', ), - fac.AntdText('菜单状态') + fac.AntdText('菜单状态'), ] ), id='menu-menu-status-form-item', labelCol={ 'span': 8, }, - wrapperCol={ - 'span': 16 - } + wrapperCol={'span': 16}, ), ], - size="middle" - ) + size='middle', + ), ] -- Gitee From 5b7ac12ebf53a5c35ae4b1012b67953ff884a409 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 22 Sep 2024 20:10:38 +0800 Subject: [PATCH 160/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 5 +- .../callbacks/system_c/config_c.py | 3 +- .../callbacks/system_c/dept_c.py | 3 +- .../callbacks/system_c/dict_c/dict_c.py | 3 +- .../callbacks/system_c/dict_c/dict_data_c.py | 3 +- .../callbacks/system_c/menu_c/menu_c.py | 37 ++-- .../callbacks/system_c/notice_c.py | 5 +- .../callbacks/system_c/post_c.py | 3 +- .../callbacks/system_c/role_c/role_c.py | 5 +- .../callbacks/system_c/user_c/user_c.py | 5 +- dash-fastapi-frontend/config/constant.py | 158 ++++++++++++++++++ dash-fastapi-frontend/utils/request.py | 11 +- dash-fastapi-frontend/utils/router_util.py | 30 ++-- .../views/system/menu/__init__.py | 16 +- .../system/menu/components/content_type.py | 15 +- .../views/system/menu/components/menu_type.py | 21 ++- 16 files changed, 257 insertions(+), 66 deletions(-) create mode 100644 dash-fastapi-frontend/config/constant.py diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index f4c71e1..1f6412b 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -5,6 +5,7 @@ from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate from typing import Dict from api.monitor.job import JobApi +from config.constant import SysJobStatusConstant from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -30,7 +31,7 @@ def generate_job_table(query_params: Dict): total=table_info['total'], ) for item in table_data: - if item['status'] == '0': + if item['status'] == SysJobStatusConstant.NORMAL: item['status_checked'] = dict(checked=True) else: item['status_checked'] = dict(checked=False) @@ -290,7 +291,7 @@ def add_edit_job_modal( job_kwargs=None, misfire_policy='1', concurrent='1', - status='0', + status=SysJobStatusConstant.NORMAL, ) return dict( modal_visible=True, diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 24b5c16..670835e 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -5,6 +5,7 @@ from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate from typing import Dict from api.system.config import ConfigApi +from config.constant import SysYesNoConstant from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -283,7 +284,7 @@ def add_edit_config_modal( config_name=None, config_key=None, config_value=None, - config_type='Y', + config_type=SysYesNoConstant.YES, remark=None, ) return dict( diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 5923b44..9ffb333 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -4,6 +4,7 @@ from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate from typing import Dict from api.system.dept import DeptApi +from config.constant import SysNormalDisableConstant from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -273,7 +274,7 @@ def add_edit_dept_modal( leader=None, phone=None, email=None, - status='0', + status=SysNormalDisableConstant.NORMAL, ) return dict( modal_visible=True, diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 137d4ca..f709f66 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -5,6 +5,7 @@ from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate from typing import Dict from api.system.dict.type import DictTypeApi +from config.constant import SysNormalDisableConstant from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -289,7 +290,7 @@ def add_edit_dict_type_modal( dict_type_info = dict( dict_name=None, dict_type=None, - status='0', + status=SysNormalDisableConstant.NORMAL, remark=None, ) return dict( diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index faebc1f..aea420b 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -4,6 +4,7 @@ from dash import ctx, dcc, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate from api.system.dict.data import DictDataApi +from config.constant import SysNormalDisableConstant from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -268,7 +269,7 @@ def add_edit_dict_data_modal( css_class=None, dict_sort=0, list_class='default', - status='0', + status=SysNormalDisableConstant.NORMAL, remark=None, ) return dict( diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index dd8fb8a..59fdf4c 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -6,6 +6,7 @@ from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate from typing import Dict from api.system.menu import MenuApi +from config.constant import MenuConstant, SysNormalDisableConstant from server import app from utils.dict_util import DictManager from utils.feedback_util import MessageManager @@ -35,7 +36,7 @@ def generate_menu_table(query_params: Dict): 'style': {'color': 'rgba(0, 0, 0, 0.8)'}, }, ] - if item['status'] == '1': + if item['status'] == SysNormalDisableConstant.DISABLE: item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} if PermissionManager.check_perms('system:menu:edit') @@ -278,7 +279,7 @@ def add_edit_menu_modal( form_value=dict( parent_tree=tree_data, parent_id='0', - menu_type='M', + menu_type=MenuConstant.TYPE_DIR, icon=None, icon_prefix=None, icon_category=None, @@ -297,7 +298,7 @@ def add_edit_menu_modal( form_value=dict( parent_tree=tree_data, parent_id=str(recently_button_clicked_row['key']), - menu_type='M', + menu_type=MenuConstant.TYPE_DIR, icon=None, icon_prefix=None, icon_category=None, @@ -369,14 +370,26 @@ def get_bottom_content(menu_value): """ 根据不同菜单类型渲染不同的子区域 """ - if menu_value == 'M': - return [content_type.render(), str(uuid.uuid4()), {'type': 'M'}] + if menu_value == MenuConstant.TYPE_DIR: + return [ + content_type.render(), + str(uuid.uuid4()), + {'type': MenuConstant.TYPE_DIR}, + ] - elif menu_value == 'C': - return [menu_type.render(), str(uuid.uuid4()), {'type': 'C'}] + elif menu_value == MenuConstant.TYPE_MENU: + return [ + menu_type.render(), + str(uuid.uuid4()), + {'type': MenuConstant.TYPE_MENU}, + ] - elif menu_value == 'F': - return [button_type.render(), str(uuid.uuid4()), {'type': 'F'}] + elif menu_value == MenuConstant.TYPE_BUTTON: + return [ + button_type.render(), + str(uuid.uuid4()), + {'type': MenuConstant.TYPE_BUTTON}, + ] raise PreventUpdate @@ -395,12 +408,12 @@ def modal_confirm_trigger(confirm, menu_type): 增加触发器,根据不同菜单类型触发不同的回调,解决组件不存在回调异常的问题 """ if confirm: - if menu_type.get('type') == 'M': + if menu_type.get('type') == MenuConstant.TYPE_DIR: return [{'timestamp': time.time()}, no_update, no_update] - if menu_type.get('type') == 'C': + if menu_type.get('type') == MenuConstant.TYPE_MENU: return [no_update, {'timestamp': time.time()}, no_update] - if menu_type.get('type') == 'F': + if menu_type.get('type') == MenuConstant.TYPE_BUTTON: return [no_update, no_update, {'timestamp': time.time()}] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index ab408d0..e17071e 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -4,6 +4,7 @@ from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate from typing import Dict from api.system.notice import NoticeApi +from config.constant import SysNoticeStatusConstant, SysNoticeTypeConstant from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -281,8 +282,8 @@ def add_edit_notice_modal( modal=dict(visible=True, title='新增通知公告'), form_value=dict( notice_title=None, - notice_type=None, - status='0', + notice_type=SysNoticeTypeConstant.NOTICE, + status=SysNoticeStatusConstant.NORMAL, notice_content=None, editor_key=str(uuid.uuid4()), ), diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 54be0da..3a93cd9 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -5,6 +5,7 @@ from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate from typing import Dict from api.system.post import PostApi +from config.constant import SysNormalDisableConstant from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager @@ -267,7 +268,7 @@ def add_edit_post_modal( post_name=None, post_code=None, post_sort=0, - status='0', + status=SysNormalDisableConstant.NORMAL, remark=None, ) return dict( diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 8f8aa09..458a9dd 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -7,6 +7,7 @@ from dash.exceptions import PreventUpdate from typing import Dict from api.system.menu import MenuApi from api.system.role import RoleApi +from config.constant import SysNormalDisableConstant from server import app from utils.common import validate_data_not_empty from utils.feedback_util import MessageManager @@ -32,7 +33,7 @@ def generate_role_table(query_params: Dict): total=table_info['total'], ) for item in table_data: - if item['status'] == '0': + if item['status'] == SysNormalDisableConstant.NORMAL: item['status'] = dict(checked=True, disabled=item['role_id'] == 1) else: item['status'] = dict(checked=False, disabled=item['role_id'] == 1) @@ -388,7 +389,7 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): role_name=None, role_key=None, role_sort=None, - status='0', + status=SysNormalDisableConstant.NORMAL, remark=None, ) return dict( diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 3c2ef15..5d2b1b4 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -7,6 +7,7 @@ from dash.dependencies import ALL, Input, Output, State from dash.exceptions import PreventUpdate from typing import Dict from api.system.user import UserApi +from config.constant import SysNormalDisableConstant from server import app from utils.common import validate_data_not_empty from utils.feedback_util import MessageManager @@ -31,7 +32,7 @@ def generate_user_table(query_params: Dict): total=table_info['total'], ) for item in table_data: - if item['status'] == '0': + if item['status'] == SysNormalDisableConstant.NORMAL: item['status'] = dict(checked=True, disabled=item['user_id'] == 1) else: item['status'] = dict(checked=False, disabled=item['user_id'] == 1) @@ -337,7 +338,7 @@ def add_edit_user_modal( post_ids=None, user_ids=None, sex=None, - status='0', + status=SysNormalDisableConstant.NORMAL, remark=None, ) return dict( diff --git a/dash-fastapi-frontend/config/constant.py b/dash-fastapi-frontend/config/constant.py new file mode 100644 index 0000000..0c1613b --- /dev/null +++ b/dash-fastapi-frontend/config/constant.py @@ -0,0 +1,158 @@ +class CommonConstant: + """ + 常用常量 + + WWW: www主域 + HTTP: http请求 + HTTPS: https请求 + """ + + WWW = 'www.' + HTTP = 'http://' + HTTPS = 'https://' + + +class HttpStatusConstant: + """ + 返回状态码 + + SUCCESS: 操作成功 + CREATED: 对象创建成功 + ACCEPTED: 请求已经被接受 + NO_CONTENT: 操作已经执行成功,但是没有返回数据 + MOVED_PERM: 资源已被移除 + SEE_OTHER: 重定向 + NOT_MODIFIED: 资源没有被修改 + BAD_REQUEST: 参数列表错误(缺少,格式不匹配) + UNAUTHORIZED: 未授权 + FORBIDDEN: 访问受限,授权过期 + NOT_FOUND: 资源,服务未找到 + BAD_METHOD: 不允许的http方法 + CONFLICT: 资源冲突,或者资源被锁 + UNSUPPORTED_TYPE: 不支持的数据,媒体类型 + ERROR: 系统内部错误 + NOT_IMPLEMENTED: 接口未实现 + WARN: 系统警告消息 + """ + + SUCCESS = 200 + CREATED = 201 + ACCEPTED = 202 + NO_CONTENT = 204 + MOVED_PERM = 301 + SEE_OTHER = 303 + NOT_MODIFIED = 304 + BAD_REQUEST = 400 + UNAUTHORIZED = 401 + FORBIDDEN = 403 + NOT_FOUND = 404 + BAD_METHOD = 405 + CONFLICT = 409 + UNSUPPORTED_TYPE = 415 + ERROR = 500 + NOT_IMPLEMENTED = 501 + WARN = 601 + + +class MenuConstant: + """ + 菜单常量 + + TYPE_DIR: 菜单类型(目录) + TYPE_MENU: 菜单类型(菜单) + TYPE_BUTTON: 菜单类型(按钮) + YES_FRAME: 是否菜单外链(是) + NO_FRAME: 是否菜单外链(否) + YES_CACHE: 是否缓存菜单(是) + NO_CACHE: 是否缓存菜单(否) + LAYOUT: Layout组件标识 + PARENT_VIEW: ParentView组件标识 + INNER_LINK: InnerLink组件标识 + SUB_MENU: 菜单类型(目录)标识 + ITEM: 菜单类型(菜单)标识 + """ + + TYPE_DIR = 'M' + TYPE_MENU = 'C' + TYPE_BUTTON = 'F' + YES_FRAME = 0 + NO_FRAME = 1 + YES_CACHE = 0 + NO_CACHE = 1 + LAYOUT = 'Layout' + PARENT_VIEW = 'ParentView' + INNER_LINK = 'InnerLink' + SUB_MENU = 'SubMenu' + ITEM = 'Item' + + +class SysJobStatusConstant: + """ + 任务状态常量 + + NORMAL: 正常 + DISABLE: 暂停 + """ + + NORMAL = '0' + DISABLE = '1' + + +class SysNormalDisableConstant: + """ + 系统开关常量 + + NORMAL: 正常 + DISABLE: 停用 + """ + + NORMAL = '0' + DISABLE = '1' + + +class SysNoticeStatusConstant: + """ + 通知状态常量 + + NORMAL: 正常 + DISABLE: 关闭 + """ + + NORMAL = '0' + DISABLE = '1' + + +class SysNoticeTypeConstant: + """ + 通知类型常量 + + NORMAL: 正常 + DISABLE: 关闭 + """ + + NOTICE = '1' + BULLETIN = '2' + + +class SysShowHideConstant: + """ + 菜单显隐常量 + + SHOW: 正常 + HIDE: 暂停 + """ + + SHOW = '0' + HIDE = '1' + + +class SysYesNoConstant: + """ + 系统是否常量 + + YES: 是 + NO: 否 + """ + + YES = 'Y' + NO = 'N' diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index ffb294c..f5fc59e 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -8,6 +8,7 @@ from config.exception import ( ServiceException, ServiceWarning, ) +from config.constant import HttpStatusConstant from config.global_config import ApiBaseUrlConfig from utils.cache_util import CacheManager from utils.log_util import logger @@ -134,7 +135,7 @@ def api_request( url, request_params, ) - if status_code == 200: + if status_code == HttpStatusConstant.SUCCESS: if stream: logger.info(log_message.generate('获取成功')) return response @@ -142,16 +143,16 @@ def api_request( response_code = response.json().get('code') response_message = response.json().get('msg') response_log = log_message.generate(response_message) - if response_code == 200: + if response_code == HttpStatusConstant.SUCCESS: logger.info(response_log) return response.json() - elif response_code == 401: + elif response_code == HttpStatusConstant.UNAUTHORIZED: logger.warning(response_log) raise AuthException(message=response_message) - elif response_code == 500: + elif response_code == HttpStatusConstant.ERROR: logger.error(response_log) raise ServiceException(message=response_message) - elif response_code == 601: + elif response_code == HttpStatusConstant.WARN: logger.warning(response_log) raise ServiceWarning(message=response_message) else: diff --git a/dash-fastapi-frontend/utils/router_util.py b/dash-fastapi-frontend/utils/router_util.py index e1e8890..8e4f7ba 100644 --- a/dash-fastapi-frontend/utils/router_util.py +++ b/dash-fastapi-frontend/utils/router_util.py @@ -1,20 +1,7 @@ import json from copy import deepcopy from typing import Dict, List - - -class CommonConstant: - """ - 常用常量 - - WWW: www主域 - HTTP: http请求 - HTTPS: https请求 - """ - - WWW = 'www.' - HTTP = 'http://' - HTTPS = 'https://' +from config.constant import CommonConstant, MenuConstant class RouterUtil: @@ -40,7 +27,7 @@ class RouterUtil: and ( copy_router.get('path').startswith('/') or cls.is_http(copy_router.get('path')) - or copy_router.get('component') == 'InnerLink' + or copy_router.get('component') == MenuConstant.INNER_LINK ) else '/' + copy_router.get('path') ) @@ -50,18 +37,21 @@ class RouterUtil: 'key': copy_router.get('name') + copy_router.get('path'), 'href': path + copy_router.get('path'), } - if copy_router.get('component') in ['Layout', 'ParentView']: - copy_router['component'] = 'SubMenu' + if copy_router.get('component') in [ + MenuConstant.LAYOUT, + MenuConstant.PARENT_VIEW, + ]: + copy_router['component'] = MenuConstant.SUB_MENU if cls.is_http(copy_router.get('path')): copy_router['props']['target'] = '_blank' - elif copy_router.get('component') == 'InnerLink': + elif copy_router.get('component') == MenuConstant.INNER_LINK: if copy_router.get('path') == '/': copy_router = copy_router['children'] copy_router['props']['href'] = '/' + copy_router.get('path') cls.__genrate_item_menu(copy_router, 'innerlink') else: if copy_router.get('children'): - copy_router['component'] = 'SubMenu' + copy_router['component'] = MenuConstant.SUB_MENU else: cls.__genrate_item_menu(copy_router, 'innerlink') else: @@ -129,7 +119,7 @@ class RouterUtil: :return: Item类型菜单 """ router['props']['modules'] = modules - router['component'] = 'Item' + router['component'] = MenuConstant.ITEM return router diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index 65a7896..b114d33 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -2,6 +2,7 @@ import feffery_antd_components as fac from dash import dcc, html from callbacks.system_c.menu_c import menu_c from components.ApiSelect import ApiSelect +from config.constant import MenuConstant from utils.permission_util import PermissionManager from views.system.menu.components.icon_category import render_icon @@ -314,9 +315,18 @@ def render(*args, **kwargs): fac.AntdRadioGroup( id='menu-menu_type', options=[ - {'label': '目录', 'value': 'M'}, - {'label': '菜单', 'value': 'C'}, - {'label': '按钮', 'value': 'F'}, + { + 'label': '目录', + 'value': MenuConstant.TYPE_DIR, + }, + { + 'label': '菜单', + 'value': MenuConstant.TYPE_MENU, + }, + { + 'label': '按钮', + 'value': MenuConstant.TYPE_BUTTON, + }, ], defaultValue='M', style={'width': 495}, diff --git a/dash-fastapi-frontend/views/system/menu/components/content_type.py b/dash-fastapi-frontend/views/system/menu/components/content_type.py index e216f43..5b1528d 100644 --- a/dash-fastapi-frontend/views/system/menu/components/content_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/content_type.py @@ -1,6 +1,11 @@ import feffery_antd_components as fac from dash import html from callbacks.system_c.menu_c.components_c import content_type_c # noqa: F401 +from config.constant import ( + MenuConstant, + SysNormalDisableConstant, + SysShowHideConstant, +) from components.ApiRadioGroup import ApiRadioGroup @@ -12,10 +17,10 @@ def render(): fac.AntdRadioGroup( id='content-menu-is_frame', options=[ - {'label': '是', 'value': 0}, - {'label': '否', 'value': 1}, + {'label': '是', 'value': MenuConstant.YES_FRAME}, + {'label': '否', 'value': MenuConstant.NO_FRAME}, ], - defaultValue=1, + defaultValue=MenuConstant.NO_FRAME, style={'width': 200}, ), label=html.Div( @@ -65,7 +70,7 @@ def render(): ApiRadioGroup( dict_type='sys_show_hide', id='content-menu-visible', - defaultValue='0', + defaultValue=SysShowHideConstant.SHOW, style={'width': 200}, ), label=html.Div( @@ -87,7 +92,7 @@ def render(): ApiRadioGroup( dict_type='sys_normal_disable', id='content-menu-status', - defaultValue='0', + defaultValue=SysNormalDisableConstant.NORMAL, style={'width': 200}, ), label=html.Div( diff --git a/dash-fastapi-frontend/views/system/menu/components/menu_type.py b/dash-fastapi-frontend/views/system/menu/components/menu_type.py index 73b1948..da98e4f 100644 --- a/dash-fastapi-frontend/views/system/menu/components/menu_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/menu_type.py @@ -1,6 +1,11 @@ import feffery_antd_components as fac from dash import html from callbacks.system_c.menu_c.components_c import menu_type_c # noqa: F401 +from config.constant import ( + MenuConstant, + SysNormalDisableConstant, + SysShowHideConstant, +) from components.ApiRadioGroup import ApiRadioGroup @@ -12,10 +17,10 @@ def render(): fac.AntdRadioGroup( id='menu-menu-is_frame', options=[ - {'label': '是', 'value': 0}, - {'label': '否', 'value': 1}, + {'label': '是', 'value': MenuConstant.YES_FRAME}, + {'label': '否', 'value': MenuConstant.NO_FRAME}, ], - defaultValue=1, + defaultValue=MenuConstant.NO_FRAME, style={'width': 200}, ), label=html.Div( @@ -136,10 +141,10 @@ def render(): fac.AntdRadioGroup( id='menu-menu-is_cache', options=[ - {'label': '缓存', 'value': 0}, - {'label': '不缓存', 'value': 1}, + {'label': '缓存', 'value': MenuConstant.YES_CACHE}, + {'label': '不缓存', 'value': MenuConstant.NO_CACHE}, ], - defaultValue=0, + defaultValue=MenuConstant.YES_CACHE, style={'width': 200}, ), label=html.Div( @@ -166,7 +171,7 @@ def render(): ApiRadioGroup( dict_type='sys_show_hide', id='menu-menu-visible', - defaultValue='0', + defaultValue=SysShowHideConstant.SHOW, style={'width': 200}, ), label=html.Div( @@ -188,7 +193,7 @@ def render(): ApiRadioGroup( dict_type='sys_normal_disable', id='menu-menu-status', - defaultValue='0', + defaultValue=SysNormalDisableConstant.NORMAL, style={'width': 200}, ), label=html.Div( -- Gitee From e358eeeb76d982e069d344240a635fa4c1240143 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 22 Sep 2024 20:36:05 +0800 Subject: [PATCH 161/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/forget.py | 5 +-- dash-fastapi-frontend/api/login.py | 11 +++--- dash-fastapi-frontend/api/monitor/cache.py | 15 ++++---- dash-fastapi-frontend/api/monitor/job.py | 17 ++++----- dash-fastapi-frontend/api/monitor/job_log.py | 11 +++--- .../api/monitor/logininfor.py | 11 +++--- dash-fastapi-frontend/api/monitor/online.py | 5 +-- dash-fastapi-frontend/api/monitor/operlog.py | 9 ++--- dash-fastapi-frontend/api/monitor/server.py | 3 +- dash-fastapi-frontend/api/register.py | 3 +- dash-fastapi-frontend/api/router.py | 3 +- dash-fastapi-frontend/api/system/config.py | 17 ++++----- dash-fastapi-frontend/api/system/dept.py | 13 +++---- dash-fastapi-frontend/api/system/dict/data.py | 17 ++++----- dash-fastapi-frontend/api/system/dict/type.py | 17 ++++----- dash-fastapi-frontend/api/system/menu.py | 15 ++++---- dash-fastapi-frontend/api/system/notice.py | 11 +++--- dash-fastapi-frontend/api/system/post.py | 13 +++---- dash-fastapi-frontend/api/system/role.py | 29 +++++++-------- dash-fastapi-frontend/api/system/user.py | 35 ++++++++++--------- dash-fastapi-frontend/config/enums.py | 19 ++++++++++ dash-fastapi-frontend/utils/request.py | 7 ++-- 22 files changed, 163 insertions(+), 123 deletions(-) create mode 100644 dash-fastapi-frontend/config/enums.py diff --git a/dash-fastapi-frontend/api/forget.py b/dash-fastapi-frontend/api/forget.py index 22eb736..dc37adc 100644 --- a/dash-fastapi-frontend/api/forget.py +++ b/dash-fastapi-frontend/api/forget.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class ForgetApi: """ return api_request( url='/forgetPwd', - method='post', + method=ApiMethod.POST, headers={'is_token': False}, json=json, ) @@ -31,7 +32,7 @@ class ForgetApi: """ return api_request( url='/getSmsCode', - method='post', + method=ApiMethod.POST, headers={'is_token': False}, json=json, ) diff --git a/dash-fastapi-frontend/api/login.py b/dash-fastapi-frontend/api/login.py index 1a51d33..d6894c4 100644 --- a/dash-fastapi-frontend/api/login.py +++ b/dash-fastapi-frontend/api/login.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class LoginApi: """ return api_request( url='/login', - method='post', + method=ApiMethod.POST, headers={'is_token': False}, data=data, ) @@ -31,7 +32,7 @@ class LoginApi: """ return api_request( url='/register', - method='post', + method=ApiMethod.POST, headers={'is_token': False}, json=json, ) @@ -45,7 +46,7 @@ class LoginApi: """ return api_request( url='/getInfo', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -57,7 +58,7 @@ class LoginApi: """ return api_request( url='/logout', - method='post', + method=ApiMethod.POST, ) @classmethod @@ -69,6 +70,6 @@ class LoginApi: """ return api_request( url='/captchaImage', - method='get', + method=ApiMethod.GET, headers={'is_token': False}, ) diff --git a/dash-fastapi-frontend/api/monitor/cache.py b/dash-fastapi-frontend/api/monitor/cache.py index 07aa625..d9cc3ea 100644 --- a/dash-fastapi-frontend/api/monitor/cache.py +++ b/dash-fastapi-frontend/api/monitor/cache.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -15,7 +16,7 @@ class CacheApi: """ return api_request( url='/monitor/cache', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -27,7 +28,7 @@ class CacheApi: """ return api_request( url='/monitor/cache/getNames', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -40,7 +41,7 @@ class CacheApi: """ return api_request( url=f'/monitor/cache/getKeys/{cache_name}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -54,7 +55,7 @@ class CacheApi: """ return api_request( url=f'/monitor/cache/getValue/{cache_name}/{cache_key}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -67,7 +68,7 @@ class CacheApi: """ return api_request( url=f'/monitor/cache/clearCacheName/{cache_name}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -80,7 +81,7 @@ class CacheApi: """ return api_request( url=f'/monitor/cache/clearCacheKey/{cache_key}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -92,5 +93,5 @@ class CacheApi: """ return api_request( url='/monitor/cache/clearCacheAll', - method='delete', + method=ApiMethod.DELETE, ) diff --git a/dash-fastapi-frontend/api/monitor/job.py b/dash-fastapi-frontend/api/monitor/job.py index 99dbac5..7ca44e3 100644 --- a/dash-fastapi-frontend/api/monitor/job.py +++ b/dash-fastapi-frontend/api/monitor/job.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class JobApi: """ return api_request( url='/monitor/job/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class JobApi: """ return api_request( url=f'/monitor/job/{job_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class JobApi: """ return api_request( url='/monitor/job', - method='post', + method=ApiMethod.POST, json=json, ) @@ -57,7 +58,7 @@ class JobApi: """ return api_request( url='/monitor/job', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -71,7 +72,7 @@ class JobApi: """ return api_request( url=f'/monitor/job/{job_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -84,7 +85,7 @@ class JobApi: """ return api_request( url='/monitor/job/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) @@ -100,7 +101,7 @@ class JobApi: """ return api_request( url='/monitor/job/changeStatus', - method='put', + method=ApiMethod.PUT, json=dict(job_id=job_id, status=status), ) @@ -115,6 +116,6 @@ class JobApi: """ return api_request( url='/monitor/job/run', - method='put', + method=ApiMethod.PUT, json=dict(job_id=job_id, job_group=job_group), ) diff --git a/dash-fastapi-frontend/api/monitor/job_log.py b/dash-fastapi-frontend/api/monitor/job_log.py index 048b3d8..286f417 100644 --- a/dash-fastapi-frontend/api/monitor/job_log.py +++ b/dash-fastapi-frontend/api/monitor/job_log.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class JobLogApi: """ return api_request( url='/monitor/jobLog/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class JobLogApi: """ return api_request( url=f'/monitor/jobLog/{job_log_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -42,9 +43,9 @@ class JobLogApi: """ return api_request( url='/monitor/jobLog/clean', - method='delete', + method=ApiMethod.DELETE, ) - + @classmethod def export_job_log(cls, data: dict): """ @@ -55,7 +56,7 @@ class JobLogApi: """ return api_request( url='/monitor/jobLog/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) diff --git a/dash-fastapi-frontend/api/monitor/logininfor.py b/dash-fastapi-frontend/api/monitor/logininfor.py index 7e0ab77..a04a893 100644 --- a/dash-fastapi-frontend/api/monitor/logininfor.py +++ b/dash-fastapi-frontend/api/monitor/logininfor.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class LogininforApi: """ return api_request( url='/monitor/logininfor/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class LogininforApi: """ return api_request( url=f'/monitor/logininfor/{info_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -43,7 +44,7 @@ class LogininforApi: """ return api_request( url=f'/monitor/logininfor/unlock/{user_name}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -55,7 +56,7 @@ class LogininforApi: """ return api_request( url='/monitor/logininfor/clean', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -68,7 +69,7 @@ class LogininforApi: """ return api_request( url='/monitor/logininfor/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) diff --git a/dash-fastapi-frontend/api/monitor/online.py b/dash-fastapi-frontend/api/monitor/online.py index d22734d..e54b364 100644 --- a/dash-fastapi-frontend/api/monitor/online.py +++ b/dash-fastapi-frontend/api/monitor/online.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class OnlineApi: """ return api_request( url='/monitor/online/list/page', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,5 +31,5 @@ class OnlineApi: """ return api_request( url=f'/monitor/online/{token_id}', - method='delete', + method=ApiMethod.DELETE, ) diff --git a/dash-fastapi-frontend/api/monitor/operlog.py b/dash-fastapi-frontend/api/monitor/operlog.py index 62b9c9e..b448b4e 100644 --- a/dash-fastapi-frontend/api/monitor/operlog.py +++ b/dash-fastapi-frontend/api/monitor/operlog.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class OperlogApi: """ return api_request( url='/monitor/operlog/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class OperlogApi: """ return api_request( url=f'/monitor/operlog/{oper_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -42,7 +43,7 @@ class OperlogApi: """ return api_request( url='/monitor/operlog/clean', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -55,7 +56,7 @@ class OperlogApi: """ return api_request( url='/monitor/operlog/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) diff --git a/dash-fastapi-frontend/api/monitor/server.py b/dash-fastapi-frontend/api/monitor/server.py index 9f1c39d..315b04d 100644 --- a/dash-fastapi-frontend/api/monitor/server.py +++ b/dash-fastapi-frontend/api/monitor/server.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -15,5 +16,5 @@ class ServerApi: """ return api_request( url='/monitor/server', - method='get', + method=ApiMethod.GET, ) diff --git a/dash-fastapi-frontend/api/register.py b/dash-fastapi-frontend/api/register.py index 8300755..512509a 100644 --- a/dash-fastapi-frontend/api/register.py +++ b/dash-fastapi-frontend/api/register.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class RegisterApi: """ return api_request( url='/register', - method='post', + method=ApiMethod.POST, headers={'is_token': False}, json=json, ) diff --git a/dash-fastapi-frontend/api/router.py b/dash-fastapi-frontend/api/router.py index 90f91b4..92000d8 100644 --- a/dash-fastapi-frontend/api/router.py +++ b/dash-fastapi-frontend/api/router.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -15,5 +16,5 @@ class RouterApi: """ return api_request( url='/getRouters', - method='get', + method=ApiMethod.GET, ) diff --git a/dash-fastapi-frontend/api/system/config.py b/dash-fastapi-frontend/api/system/config.py index 1789c79..916a987 100644 --- a/dash-fastapi-frontend/api/system/config.py +++ b/dash-fastapi-frontend/api/system/config.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class ConfigApi: """ return api_request( url='/system/config/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class ConfigApi: """ return api_request( url=f'/system/config/{config_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class ConfigApi: """ return api_request( url=f'/system/config/configKey/{config_key}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -56,7 +57,7 @@ class ConfigApi: """ return api_request( url='/system/config', - method='post', + method=ApiMethod.POST, json=json, ) @@ -70,7 +71,7 @@ class ConfigApi: """ return api_request( url='/system/config', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -84,7 +85,7 @@ class ConfigApi: """ return api_request( url=f'/system/config/{config_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -96,7 +97,7 @@ class ConfigApi: """ return api_request( url='/system/config/refreshCache', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -109,7 +110,7 @@ class ConfigApi: """ return api_request( url='/system/config/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) diff --git a/dash-fastapi-frontend/api/system/dept.py b/dash-fastapi-frontend/api/system/dept.py index 9ba19f9..1b9ceb9 100644 --- a/dash-fastapi-frontend/api/system/dept.py +++ b/dash-fastapi-frontend/api/system/dept.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class DeptApi: """ return api_request( url='/system/dept/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class DeptApi: """ return api_request( url=f'/system/dept/list/exclude/{dept_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class DeptApi: """ return api_request( url=f'/system/dept/{dept_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -56,7 +57,7 @@ class DeptApi: """ return api_request( url='/system/dept', - method='post', + method=ApiMethod.POST, json=json, ) @@ -70,7 +71,7 @@ class DeptApi: """ return api_request( url='/system/dept', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -84,5 +85,5 @@ class DeptApi: """ return api_request( url=f'/system/dept/{dept_id}', - method='delete', + method=ApiMethod.DELETE, ) diff --git a/dash-fastapi-frontend/api/system/dict/data.py b/dash-fastapi-frontend/api/system/dict/data.py index c3da8aa..bdf08d6 100644 --- a/dash-fastapi-frontend/api/system/dict/data.py +++ b/dash-fastapi-frontend/api/system/dict/data.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class DictDataApi: """ return api_request( url='/system/dict/data/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class DictDataApi: """ return api_request( url=f'/system/dict/data/{dict_code}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class DictDataApi: """ return api_request( url=f'/system/dict/data/type/{dict_type}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -56,7 +57,7 @@ class DictDataApi: """ return api_request( url='/system/dict/data', - method='post', + method=ApiMethod.POST, json=json, ) @@ -70,7 +71,7 @@ class DictDataApi: """ return api_request( url='/system/dict/data', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -84,9 +85,9 @@ class DictDataApi: """ return api_request( url=f'/system/dict/data/{dict_code}', - method='delete', + method=ApiMethod.DELETE, ) - + @classmethod def export_data(cls, data: dict): """ @@ -97,7 +98,7 @@ class DictDataApi: """ return api_request( url='/system/dict/data/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) diff --git a/dash-fastapi-frontend/api/system/dict/type.py b/dash-fastapi-frontend/api/system/dict/type.py index 82019ba..58a189d 100644 --- a/dash-fastapi-frontend/api/system/dict/type.py +++ b/dash-fastapi-frontend/api/system/dict/type.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class DictTypeApi: """ return api_request( url='/system/dict/type/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class DictTypeApi: """ return api_request( url=f'/system/dict/type/{dict_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class DictTypeApi: """ return api_request( url='/system/dict/type', - method='post', + method=ApiMethod.POST, json=json, ) @@ -57,7 +58,7 @@ class DictTypeApi: """ return api_request( url='/system/dict/type', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -71,7 +72,7 @@ class DictTypeApi: """ return api_request( url=f'/system/dict/type/{dict_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -84,7 +85,7 @@ class DictTypeApi: """ return api_request( url='/system/dict/type/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) @@ -98,7 +99,7 @@ class DictTypeApi: """ return api_request( url='/system/dict/type/refreshCache', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -110,5 +111,5 @@ class DictTypeApi: """ return api_request( url='/system/dict/type/optionselect', - method='get', + method=ApiMethod.GET, ) diff --git a/dash-fastapi-frontend/api/system/menu.py b/dash-fastapi-frontend/api/system/menu.py index 887331b..4b7c54d 100644 --- a/dash-fastapi-frontend/api/system/menu.py +++ b/dash-fastapi-frontend/api/system/menu.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class MenuApi: """ return api_request( url='/system/menu/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class MenuApi: """ return api_request( url=f'/system/menu/{menu_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -42,7 +43,7 @@ class MenuApi: """ return api_request( url='/system/menu/treeselect', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -55,7 +56,7 @@ class MenuApi: """ return api_request( url=f'/system/menu/roleMenuTreeselect/{role_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -68,7 +69,7 @@ class MenuApi: """ return api_request( url='/system/menu', - method='post', + method=ApiMethod.POST, json=json, ) @@ -82,7 +83,7 @@ class MenuApi: """ return api_request( url='/system/menu', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -96,5 +97,5 @@ class MenuApi: """ return api_request( url=f'/system/menu/{menu_id}', - method='delete', + method=ApiMethod.DELETE, ) diff --git a/dash-fastapi-frontend/api/system/notice.py b/dash-fastapi-frontend/api/system/notice.py index 5b900a2..d6b4f45 100644 --- a/dash-fastapi-frontend/api/system/notice.py +++ b/dash-fastapi-frontend/api/system/notice.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class NoticeApi: """ return api_request( url='/system/notice/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class NoticeApi: """ return api_request( url=f'/system/notice/{notice_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class NoticeApi: """ return api_request( url='/system/notice', - method='post', + method=ApiMethod.POST, json=json, ) @@ -57,7 +58,7 @@ class NoticeApi: """ return api_request( url='/system/notice', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -71,5 +72,5 @@ class NoticeApi: """ return api_request( url=f'/system/notice/{notice_id}', - method='delete', + method=ApiMethod.DELETE, ) diff --git a/dash-fastapi-frontend/api/system/post.py b/dash-fastapi-frontend/api/system/post.py index 03ece01..ebc15e2 100644 --- a/dash-fastapi-frontend/api/system/post.py +++ b/dash-fastapi-frontend/api/system/post.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class PostApi: """ return api_request( url='/system/post/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class PostApi: """ return api_request( url=f'/system/post/{post_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class PostApi: """ return api_request( url='/system/post', - method='post', + method=ApiMethod.POST, json=json, ) @@ -57,7 +58,7 @@ class PostApi: """ return api_request( url='/system/post', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -71,7 +72,7 @@ class PostApi: """ return api_request( url=f'/system/post/{post_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -84,7 +85,7 @@ class PostApi: """ return api_request( url='/system/post/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) diff --git a/dash-fastapi-frontend/api/system/role.py b/dash-fastapi-frontend/api/system/role.py index 884815c..a476d10 100644 --- a/dash-fastapi-frontend/api/system/role.py +++ b/dash-fastapi-frontend/api/system/role.py @@ -1,3 +1,4 @@ +from config.enums import ApiMethod from utils.request import api_request @@ -16,7 +17,7 @@ class RoleApi: """ return api_request( url='/system/role/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -30,7 +31,7 @@ class RoleApi: """ return api_request( url=f'/system/role/{role_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -43,7 +44,7 @@ class RoleApi: """ return api_request( url='/system/role', - method='post', + method=ApiMethod.POST, json=json, ) @@ -57,7 +58,7 @@ class RoleApi: """ return api_request( url='/system/role', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -71,7 +72,7 @@ class RoleApi: """ return api_request( url='/system/role/dataScope', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -86,7 +87,7 @@ class RoleApi: """ return api_request( url='/system/role/changeStatus', - method='put', + method=ApiMethod.PUT, json=dict(role_id=role_id, status=status), ) @@ -100,7 +101,7 @@ class RoleApi: """ return api_request( url=f'/system/role/{role_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -113,7 +114,7 @@ class RoleApi: """ return api_request( url='/system/role/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) @@ -128,7 +129,7 @@ class RoleApi: """ return api_request( url='/system/role/authUser/allocatedList', - method='get', + method=ApiMethod.GET, params=query, ) @@ -142,7 +143,7 @@ class RoleApi: """ return api_request( url='/system/role/authUser/unallocatedList', - method='get', + method=ApiMethod.GET, params=query, ) @@ -156,7 +157,7 @@ class RoleApi: """ return api_request( url='/system/role/authUser/cancel', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -170,7 +171,7 @@ class RoleApi: """ return api_request( url='/system/role/authUser/cancelAll', - method='put', + method=ApiMethod.PUT, params=params, ) @@ -184,7 +185,7 @@ class RoleApi: """ return api_request( url='/system/role/authUser/selectAll', - method='put', + method=ApiMethod.PUT, params=params, ) @@ -198,5 +199,5 @@ class RoleApi: """ return api_request( url=f'/system/role/deptTree/{role_id}', - method='get', + method=ApiMethod.GET, ) diff --git a/dash-fastapi-frontend/api/system/user.py b/dash-fastapi-frontend/api/system/user.py index 6bf9136..e005bf5 100644 --- a/dash-fastapi-frontend/api/system/user.py +++ b/dash-fastapi-frontend/api/system/user.py @@ -1,4 +1,5 @@ from typing import Union +from config.enums import ApiMethod from utils.request import api_request @@ -17,7 +18,7 @@ class UserApi: """ return api_request( url='/system/user/list', - method='get', + method=ApiMethod.GET, params=query, ) @@ -31,7 +32,7 @@ class UserApi: """ return api_request( url=f'/system/user/{user_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -44,7 +45,7 @@ class UserApi: """ return api_request( url='/system/user', - method='post', + method=ApiMethod.POST, json=json, ) @@ -58,7 +59,7 @@ class UserApi: """ return api_request( url='/system/user', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -72,7 +73,7 @@ class UserApi: """ return api_request( url=f'/system/user/{user_id}', - method='delete', + method=ApiMethod.DELETE, ) @classmethod @@ -84,7 +85,7 @@ class UserApi: """ return api_request( url='/system/user/importTemplate', - method='post', + method=ApiMethod.POST, stream=True, ) @@ -99,7 +100,7 @@ class UserApi: """ return api_request( url='/system/user/importData', - method='post', + method=ApiMethod.POST, files={'file': file}, params={'update_support': update_support}, ) @@ -114,7 +115,7 @@ class UserApi: """ return api_request( url='/system/user/export', - method='post', + method=ApiMethod.POST, data=data, stream=True, ) @@ -130,7 +131,7 @@ class UserApi: """ return api_request( url='/system/user/resetPwd', - method='put', + method=ApiMethod.PUT, json=dict(user_id=user_id, password=password), ) @@ -145,7 +146,7 @@ class UserApi: """ return api_request( url='/system/user/changeStatus', - method='put', + method=ApiMethod.PUT, json=dict(user_id=user_id, status=status), ) @@ -158,7 +159,7 @@ class UserApi: """ return api_request( url='/system/user/profile', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -171,7 +172,7 @@ class UserApi: """ return api_request( url='/system/user/profile', - method='put', + method=ApiMethod.PUT, json=json, ) @@ -186,7 +187,7 @@ class UserApi: """ return api_request( url='/system/user/profile/updatePwd', - method='put', + method=ApiMethod.PUT, json=dict(old_password=old_password, new_password=new_password), ) @@ -200,7 +201,7 @@ class UserApi: """ return api_request( url='/system/user/profile/avatar', - method='post', + method=ApiMethod.POST, files=files, ) @@ -211,7 +212,7 @@ class UserApi: """ return api_request( url=f'/system/user/authRole/{user_id}', - method='get', + method=ApiMethod.GET, ) @classmethod @@ -224,7 +225,7 @@ class UserApi: """ return api_request( url='/system/user/authRole', - method='put', + method=ApiMethod.PUT, params=params, ) @@ -237,5 +238,5 @@ class UserApi: """ return api_request( url='/system/user/deptTree', - method='get', + method=ApiMethod.GET, ) diff --git a/dash-fastapi-frontend/config/enums.py b/dash-fastapi-frontend/config/enums.py new file mode 100644 index 0000000..283fbb9 --- /dev/null +++ b/dash-fastapi-frontend/config/enums.py @@ -0,0 +1,19 @@ +from enum import Enum + + +class ApiMethod(Enum): + """ + Api请求方法 + + GET: get方法 + POST: post方法 + DELETE: delete方法 + PUT: put方法 + PATCH: patch方法 + """ + + GET = 'get' + POST = 'post' + DELETE = 'delete' + PUT = 'put' + PATCH = 'patch' diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index f5fc59e..1aba457 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -1,5 +1,5 @@ import requests -from typing import Dict, Literal, Optional +from typing import Dict, Optional from flask import session, request from config.env import AppConfig from config.exception import ( @@ -9,6 +9,7 @@ from config.exception import ( ServiceWarning, ) from config.constant import HttpStatusConstant +from config.enums import ApiMethod from config.global_config import ApiBaseUrlConfig from utils.cache_util import CacheManager from utils.log_util import logger @@ -16,7 +17,7 @@ from utils.log_util import logger def api_request( url: str, - method: Literal['get', 'post', 'delete', 'put', 'patch'], + method: ApiMethod, headers: Optional[Dict] = {}, params: Optional[Dict] = None, data: Optional[Dict] = None, @@ -40,7 +41,7 @@ def api_request( :return: 请求结果 """ api_url = ApiBaseUrlConfig.BaseUrl + url - api_method = method.lower().strip() + api_method = method.value user_agent = request.headers.get('User-Agent') authorization = ( session.get('Authorization') if session.get('Authorization') else '' -- Gitee From cc66e205f40225271d9fb49ccaf20126d29b00d9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 23 Sep 2024 17:33:58 +0800 Subject: [PATCH 162/229] =?UTF-8?q?style:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/login.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/dash-fastapi-frontend/api/login.py b/dash-fastapi-frontend/api/login.py index d6894c4..2b0bf6a 100644 --- a/dash-fastapi-frontend/api/login.py +++ b/dash-fastapi-frontend/api/login.py @@ -22,21 +22,6 @@ class LoginApi: data=data, ) - @classmethod - def register(json: dict): - """ - 注册接口 - - :param data: 注册参数 - :return: - """ - return api_request( - url='/register', - method=ApiMethod.POST, - headers={'is_token': False}, - json=json, - ) - @classmethod def get_info(cls): """ -- Gitee From 7284393a4b0d524bd7198d132002e09eb3dc3f8d Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 23 Sep 2024 17:34:34 +0800 Subject: [PATCH 163/229] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=8A=A8=E7=94=BB=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/assets/css/global.css | 2 +- .../assets/imgs/loading.webp | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename "dash-fastapi-frontend/assets/imgs/\345\212\240\350\275\275\345\212\250\347\224\273.webp" => dash-fastapi-frontend/assets/imgs/loading.webp (100%) diff --git a/dash-fastapi-frontend/assets/css/global.css b/dash-fastapi-frontend/assets/css/global.css index 1dc1aa3..2de4d12 100644 --- a/dash-fastapi-frontend/assets/css/global.css +++ b/dash-fastapi-frontend/assets/css/global.css @@ -6,7 +6,7 @@ top: 50vh; left: 50vw; transform: translate(-50%, -50%); - background-image: url("/assets/imgs/加载动画.webp"); + background-image: url("/assets/imgs/loading.webp"); background-repeat: no-repeat; background-size: 100% 100%; } diff --git "a/dash-fastapi-frontend/assets/imgs/\345\212\240\350\275\275\345\212\250\347\224\273.webp" b/dash-fastapi-frontend/assets/imgs/loading.webp similarity index 100% rename from "dash-fastapi-frontend/assets/imgs/\345\212\240\350\275\275\345\212\250\347\224\273.webp" rename to dash-fastapi-frontend/assets/imgs/loading.webp -- Gitee From 8968a2d50860b66f1195140eb45dbfc0b5b2ba1c Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 24 Sep 2024 17:53:16 +0800 Subject: [PATCH 164/229] =?UTF-8?q?style:=20=E4=BF=AE=E5=A4=8D=E4=B9=A6?= =?UTF-8?q?=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/service/role_service.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dash-fastapi-backend/module_admin/service/role_service.py b/dash-fastapi-backend/module_admin/service/role_service.py index 7191f5d..995b53d 100644 --- a/dash-fastapi-backend/module_admin/service/role_service.py +++ b/dash-fastapi-backend/module_admin/service/role_service.py @@ -144,9 +144,9 @@ class RoleService: """ add_role = RoleModel(**page_object.model_dump()) if not await cls.check_role_name_unique_services(query_db, page_object): - raise ServiceException(message=f'新增角色{page_object.post_name}失败,角色名称已存在') + raise ServiceException(message=f'新增角色{page_object.role_name}失败,角色名称已存在') elif not await cls.check_role_key_unique_services(query_db, page_object): - raise ServiceException(message=f'新增角色{page_object.post_name}失败,角色权限已存在') + raise ServiceException(message=f'新增角色{page_object.role_name}失败,角色权限已存在') else: try: add_result = await RoleDao.add_role_dao(query_db, add_role) @@ -178,9 +178,9 @@ class RoleService: if role_info: if page_object.type != 'status': if not await cls.check_role_name_unique_services(query_db, page_object): - raise ServiceException(message=f'修改角色{page_object.post_name}失败,角色名称已存在') + raise ServiceException(message=f'修改角色{page_object.role_name}失败,角色名称已存在') elif not await cls.check_role_key_unique_services(query_db, page_object): - raise ServiceException(message=f'修改角色{page_object.post_name}失败,角色权限已存在') + raise ServiceException(message=f'修改角色{page_object.role_name}失败,角色权限已存在') try: await RoleDao.edit_role_dao(query_db, edit_role) if page_object.type != 'status': -- Gitee From 95eeee3cc208b259e198bf745676d77b3678e16b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 24 Sep 2024 17:53:54 +0800 Subject: [PATCH 165/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E3=80=81=E5=BF=98=E8=AE=B0=E5=AF=86=E7=A0=81=E3=80=81?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/imgs/background.png | Bin 0 -> 486020 bytes .../assets/imgs/login-background.jpg | Bin 521275 -> 0 bytes dash-fastapi-frontend/callbacks/forget_c.py | 25 +- dash-fastapi-frontend/callbacks/login_c.py | 21 +- dash-fastapi-frontend/callbacks/register_c.py | 19 +- dash-fastapi-frontend/views/forget.py | 126 ++--- dash-fastapi-frontend/views/login.py | 431 ++++++++++-------- dash-fastapi-frontend/views/register.py | 142 +++--- 8 files changed, 439 insertions(+), 325 deletions(-) create mode 100644 dash-fastapi-frontend/assets/imgs/background.png delete mode 100644 dash-fastapi-frontend/assets/imgs/login-background.jpg diff --git a/dash-fastapi-frontend/assets/imgs/background.png b/dash-fastapi-frontend/assets/imgs/background.png new file mode 100644 index 0000000000000000000000000000000000000000..d9fbe2e68acc78f9cdd3bf9e4942df2586e6590c GIT binary patch literal 486020 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%0DdhElxS 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%0Ajay1ZNsEG9!blgXKn(LL&wC`ij68&A9!b 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 z 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
ZODE8O$g_WOeMvyfgfC92* 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

sx3#7L?l1=PtC)V;R;yje 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�c9}Yh5V!k%MCV#kLXM|L0$`V|dW;I5 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]*mMZ#L18vBVE4?jo3qHQm!;hKjEtARy& zaO@us5Fb%nO+3>QL04n7!R36C^!%u7>hoot=3ku3-j}hZ|BS8tLgMccOPeQiFc3GI zPBesFYC#H%be~JrVVO+IaC>1X6cXS}m=U8t+rDBcl0hSfLMjb6YCNeW8kQ>)g*zXY(x{g*9TSCn6#eqS1_s*C)=~x^LB2`cb=b z_?GLWS53cF?#%--2!5hXbx$YSZt-&_4wcz}HFB1B)Hxg8 z9h_DeL}}|jA17vSo1Qga0O{)Wa>)38wK?0#_KXr73goQjX3z)R^HhZ%PLdluL;Z|c zMplVLP~9(-YX50|@$V^6y=G9cCt0R06<1u&pecD$M3ND9s3ZN{R}{zm7W@+PqpH@4 z-bZ&+?;8oEU_x}e+Q-02K;8LtPX!dnc!e}D6YAc!qVEu`c`deF%R8K=V*uLjzPEE1 zlIu^Mh5xO*oPEU3X0${9QS4sAN6pW#$&gF2ZG*CE-d=ENdlM{TFOedK!*6a$Q}6+i zzhZwA26Z?W+rwm)7(eJn9IL zkl$YNZL-6Oqb<_I{+OBBsh~I39~6_q?$8nOamaXuZ%9Jxb4v9HGx!$amO&zKEqdKt zDw&~m?%P6XaqI}JnR0!RKYHMJSw^n#wwCFF$8CQQA1SW%FMi9e3K;ele=OXp{w=Up zKfA+F)3Twl+ZDRkdW%+L^crAY`(KZWDRPh1HdB+0BMa6=RJNI|sQBhog4Xo&z1PH! z-(5vL0P*OvstI9VOeJ~y0UYOGGpT_7!p5wi??uAItNNzH)l?s`!vqbsI)TvS5c449 z&b{t9^a^Szx&FG8e|v0DcX`io7}`?U!YtJbu?+(#LFu5>=5G&_9a?@oVHq+w!&46I z(8YRN3E4l3!}!RjUdnny8@88qU?L8%le6XElbqXp#!q01@N_l`=r3*D9o(Bcue7ET zX(dg}Z>XWzk%iuGRjO2OsR^9kviZPaZRkIC3}#WPi_IkA|A+E>=zA4*6pkGet+4&P zpT<#@Dgd0!se8YtVmiY8b8up(Wr)Z)1EysC~!c7 z@{p6S*6vweU%0hVDx-1d1-W<2NK=+8v>iDu!DYcxx1DrYjMk;(Kn&Ed^1hW1bRqu4%_EhCV~QGbLVH+8(-oBL$%<5^gfFC7V9VCI9K5 znNWIq(QPnD0^{Ua-BSKnwvw6O#}B7_%;wfP)9NaHNoebLK5uj$yZ>iRKx^vIO78R_ zB92Prq!AakYtgnCiBGJptu4%N=E;W87O=IzaVXxV@Y?uWm)44_26yd7fb?|IrdE}a zV1rXTArH67_`0b?dO4!|t)O7yXF)Pi)%P*AL$_p6$8)zKfc2vn@ znrwpyvv}YSv|c7i`H2SI3N+xa@vgTf+{-cebJ|wj!ALO1;!6Xx`>sdI1_j~is4nuQ z=(v3B7Cn({rwt|9W*xalN_|@O^U`m6Q)K+Wcu(RaZCN^!XZz-Ey@?IaB*wN}j1*#_ ziy@LaFwDR}3~SRDZta+V@`IK<Wfjy2RI&uTb;57uHgBu2&P=W}|4Fd?Dg?zn*9e>Xinkf?2$0 zkE^b}6Lw8Puxw6eq(e9M0#b4Rp}f`hE2cGM^>gP@s_Zrxnkp{Mnp@+<9GIj_b&+lmlnX#m=mWHk;bXgUs;)x z#?3D441tSQw&Se34G&^hax$;@k<;~Xd633j|Ai)bdJ!k!rpa7{a%0D~^ohjc4b_NW%Gbm8)IWk=Tnf+R=6xE5ae#~H&V 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 literal 0 HcmV?d00001 diff --git a/dash-fastapi-frontend/assets/imgs/login-background.jpg b/dash-fastapi-frontend/assets/imgs/login-background.jpg deleted file mode 100644 index 8a89eb8291d5cb7d9f37ec4f275deab911c9e28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 521275 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¥}>uauIoY!`8n(7niSl_m2d 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

LZs5vs<4*dn)6_orH;Y;`bzi*q=#N#x6 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

8A%Us3k< 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𝔫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

&!CIz1Ns z$Jz4lV*$Q&+xxNOX`eZnF8wRc(7YUCDK+`-_{7{pZhOU_{X_OCkwqIGeNS;SU}C7T z*HT0-ZjvkXU@$UHC%=7CWGa6w=UC55t{zEQj#etT zjmyEUD=W)CtZI#V!m_yd6K;7X8@_7d5mDG%3*&)aMk0w#ht3;YJE~mD=VN9lLFwsxxd#s@r(HDt z1bj$~B9(l8y^U`kum-U4_>qh2Wr|isl@^=Ug2sLkjEtq89Lz^S^Cqo7;!$p8-qguX zA)IVG0=T<0Q>Mvk5GCPgoY?M_JlG zA^ktWp8^4pr+iG!oN@T57@LFF8RjU7;mCy@a>V*=x%6jZLl6 z;L}|oX(r-uGZ&{uz-$M-(Ukh2D|+tP$$bNPZ0q>*$-)C<`DXy`X#Wrg6!so(M0`Y@ zKlZII&mE&w*3XVz{Clm)MA8Tuo_k3UI%r&iu@jG<={k^Vte=aCd3DEiQ4y!4g;3TT zc$ghm%!^g-S2qlnZDUck1v6R?*+zN@K$PRBL|JhgVRo-ySxVd#ul-r}e-xc(IGcSN z#$)e2t40ue)Gi()c4Effqjo4oY0)AmwKqkJ*b#fxC`HX0H4?OFYgQB0$8KXiZ{Dvt zj(o^{+_~@nbzbLr{sP3W1DccxlENaeWD4__q#I1l@88eXWQ-wDXk~T*O>MstDiHCi zhFeO!(P7oc?Z8PBkUaU;lRr4$kTg?9yFSEw@t?!fCead0#f|?!IBdC%7YQ7xj@*FA zUhRs>ccwF_97Pv;+BB;dOyh2myI z`J#LHDjnlDignjgNsPXdf_2Wkwcw~TFH}0-Z;Ruq;9G(9F zQCf@tkm-#`3|E}Ty{@lb3Gfcy(z_lQo~(uIYCkgOdSAt5*Up#X236tD$DOlsot|Cf zA}X;)0_SlrYvT)x6S$crvV>=&`~>bD3sD~V0WqL2^L+KmoIa1_6(rn~_l!Qz-FgKTlD%73ZQ z3wEh5Ig&u(QE!0{40yDBd;IqT@l+x21M#ogc;o)aB%DUQgiJ}APkDv`eQHD`!lwF+E=QGR9ecRvaEXiuI~DcX+1hTF zS@u=PnQwo3w^OguT#Qz%-Vg0kH7|!{Vf#!WU@7ZF6I_=BMJD=Umlwep4Y3oF`Yhk! z_`*#Aro0Zh*EE10AL{m)g|?BcHOY~nB0{vf?hrG;myGQ5kTUY8v`$vSjCG|XJQGzk z%8gR?pGs53rm_+T27<@S1%#>sB>VNjLUeg@zv# z@7`rFB_;O!e{5VCzNe8BBYg0?oz%|W$`Ju1(?$% z26P&Om?*-gNT?J5Sb35CbhY^K*O~?Texg7)Hr_m8+{=~`|3OXI`88><%p;$74K3dv zi_heQmf8c3&Q5M4gsZ={+|P36_V%Rq00R5}MZ;#moxmn5(rKy*7Pv zIP)yIj^e`+%1HvoM9Z_9Bn5k{lanNQ9ya~rw(SAAHqbh@1f;=(WCM-?JUann!oj(o# z6t_hu-Zl}uejRw@u*ZYuRI@yG6@DzR=-5f`7Ycv9svT=&NHI1kHLR4*o&K=d7j2sr z^=JF*_fTz=#w@te+k4lVnk3A48Gv{st$>AvOK7vEI%~2I+dWyM**pR1P^^K~i#8hr z8_L&b!Y@*Cz?XDvhf#${{&U69YIX&D>nfUcfr;h4`>>@6| zX4U$`BD}Lej?Qi;QO{NRx6;TaEztxBKv^00uTFPYt&%VT8y-t}eh_CJ>F z@?$^QO?7}j3fSqKJnP;7cC0fRPj5sc`1!jn3|i6&MwUQ zA^KF79wS8+uj5{4sk8hlntsJ0JMI4S!h_kcxuOBjrDdj6oou(KnaUBF;L@mKakF5 zJ`owvagZ*DEJDI6Z46%s#e2jS-S7Le^NkdpFc6x?bBifG%LCu>&dkXhCVgC!bVmxT zyWsVULu@rENSc0bClksFlx|07uP`;-g*|aoqg>Uv+OUP`Nz@lY&-i1U@XO@=KwHk; z#KLPg{fvYV30<(zi+HR>dv*B`kN3iCwpFSim^yYPrq- z0BB;5+kke*LI^~){?!*_ER(xzx(}on)b5O)7+Wq#=0H}0^4M9$wVqQIgBK+A>{TDI z-C@<``6q?M>yq!4@fXvf!rRpzEV_v#If8aI3$Qi0K)__GJ94MizLL+g$-y2fbHgG% z+Ldb+BAL}4KbmWOD=UyJZWa!_0m^Y@C@+DVxLKj^TcZsrc7c2#X6jRc&FevR0}V5w zzoE>+9O@~a6 zbxDZdX9O5gW%pEjkmbc(mdL@O5={v!Sr}C3mIkv$VG_{ZT3>E1a0d-U*#0lFg9EKXh96&5f;d>azkDu;t%7j6Nx$89Mn*@#qPv{;sy8Sgp^)5uW~y9+=8B5HCFq+tGIiH3 z3``P9YD2ra)q0f0aeBaD)r3^YBe&B-QCj;f(dIM*olgVT_AlMP#YcELQa#NXxwA8Q z;Z-lfv1Sad~pFuw7Tv3J8!|vX-D5;86ON)I9dV$z>2fy z+Jf+(p2dqcuF%$Isheih*|*h{J9Z@`>In)7aaqSU(lLOY%QfG^y5w6B!xh@rY5NP_ zrP*#`t>CuNkj`mnQBAwsvd_-en|xyo=@2zJAqQUsA(m|&wZr=V1I)W}T0Zq5H3B>9 zP$dKhoed7Y<7syU6?SG=_ZQZov#l?VPIs0;jhsmyIXF>tOE|t6LX!651tzTs<3tJg z7)4g?#ym1Q$BQBkdF*{m6Msf}Q^0R-ahKHkt3w7RfstH4z?OwFU0yyWHEqJe|O;D?r(|I62tU&^L zqvf?@ugtv06|Gy23&nUGmKbVYc)M(@XgDr0(WQz!A=8Sg=hqDL+ZFFY|B58y!ChA`=qFWPjJdqdio{FnlGIUA!3^foDC!$W~suZMYZ4 znZJ%P5xC$#JaE&r)m=$SuDlgk-^c861VzY5C)`<5Wbf)`9_Q6EGgLxl{=kyBS~fm@ z_C0s9ztpbaRJgtx&ZBwpKV+%Ah-W{-Z+ERB z=Kh*gx2ufx470zJb!uAsgThg=%`AVer5^hsuFETIqI0dB5&iydr0-ByNUKRuf{~(h z%RlL)y7{`CUCn{u$QB*aKEAmB7FW4izk)XE>?7PcSLWLVi+-{KgR7ymwk{_!bz|SN z;X-DTiv=i|TMLcLv!{J`qrTm{3lU;-!+Y~2NQ`F68+#MNnRHi{q}956xwg7v0Q^;P z+B=7KrK@69yC9E@a`u~{62kSRSAOCJ<*Uw=m z*5?s-12THr68~0k!6f^Wj?g^016Vj`lj!r+l9VV(7EcT@7 zn6SP)@Ls&q$)~^zCby35wmBjnZWh%hvTQOXtZPQ_jKkhoU~aN8>*f$8r|dFK?a#Q+ zL0=Gs3z1?RGGHw~jMB~|Ap+-UZ)!P}2Yk{=YWi>#VFTwcAj{JH31I9@v@joRK6_zE zU#O(4r0r2Bkrpv$amY^>yZt$T9+*A9_nw%N{%UDln$tC>jC!^;B#Q3XwfvA8Mzv+nd$-*;I9*DoZX-fW-16RP%`r9ov~oT|b%7A;zJUR%As`c}%bs(l={iEp~A^T5gXP3SFsImbC(#7OFZQ*`rj=p;Fr2bBD( zSN)t{Q)Sw!a!xYt(f%X{o}y2?oS`M|^W&Si(Qi0o`?`5n_?3m5<;R}J#4`mr@33P*Z<$H4#kxDTZ3}VD=ymgH&m1JK2^j~R-W;8ui}RT z`Y!S=>Xx>XUlR2xD#N?p<@{Uzb7oq=me7OS)(ZRV&Y|Sd4*5{bD4VhY>6~4Y23+gq zLbVR5Hq0HeM8_64IS{k~EO`p`$^BFq{e0Yr=NQNu$?MfLzWy8d>@N2qi|K^iEDutd zL6T$~QY)znTTQ|3_<4IazP=a6QJoyb1eE^Z=xj6AAf0mfgujLA@7lNZZx7d$IsrKm zWc$N@hgvR_G0{V^-$z2Ve&+UVf(3>z@sZngbv3y<2&P<)f3MfdMl_{cet%R}Vo@hW zw@(WC*!2x~XIm_=1#X0CPCXMzPp5W4$0PHo8U*k=*O!?+U%yd&txJo79_<3;ngLeu zQK12i?2<`?yD_$bscefoU~)mnmPa!QF3G-@UeBD5=LWN%I9sxI`q|IVV~CK%)>FLf zzUw@`)?uQ8A(qEJ{>m%_@KHc`6!}&KYxdi$w>vB6-m|=*;5hy<=}4aK0d zL}e?Y;LF1wW6nQg?(ZzwAFXN~jAgY%Slt&Rk0M-JpC0f|!ZMP0?=>!au4+5SP;v5K zQ1P4_iFDz2%=^=HsX=#LB=++dS|>4ht)ZRY*YE@L*Y2W7C841$;+R!$<+>PSf&-r7 z$>A_*_PbY&TdPvRT+=nyP^qJ6+Nr$-SYZM6Jz`U zAZbmAIdUIM3|B?%tRrlmda2FN5W~Ipd)cg2Z>W3*8M3Apvy2Qx*J5`YO*&l_x(!xw; zpW<}C%9U>$0$$Ne)~Ed_Xsy*~h&O+8iB{C)N3E39*Ozyo1#Q)bYgzA$?smj`R?SBC z?&E%q=)R8P80F34xY8u@2CNC;MJpD^HPuE<5stc;U_amFRRnk%!-(vgzU*G%lAk@72-h>0AVwf6*bg&eYZgTIeBFkZbI?Aj1Wce!jZWS9JYsk&~@3-QwC50}_UjB8-|9g=&B|zPvx`NeECG5}C-p_QD z-e9ILIxYopb^|aFj#j3MS$pIFL`|@G3grkMs#|G0=co3JQ@MRV%gj@Fs!e=w!RG1D zoQ_3pvqLs145juhv)4@-+um^wE~mR=doC%+`&8)Snty4N9sh3H%@|}1Eq_}};=X`l zr`ppw(7D*bporIZ2uT6zIIv@=?LuD$uYr614{rY8tMtHnZ)x0o7@e3}2|8-sH;#(< zP)Jj#*ZwZ2X_f5y;Q-5H!gc7OKA5$xn0TJ4rk)>9^zED==U*AHL4{lx)cFVCR@!A@G$Y7Ob$q4C z+qZ%Vv9B*3XWkZhv^R)N?3CY|yIFEIL&hVdb`3Q()$3DhYjPA6Vuzt4!`qV7L|+Z6 zsjkp@dXdvk*e0;innOi$Vx;K1n^rY0?jhp&RO?^Wxcu9D^|?z*BHI>n3=EQSAH-EL zlodrw6*JF~IIY%_vh=s2cGy`LA_T(60QQsG1ErN{@%M^tt>^Cm+|>W<_Eky4Eu@Z3gXcG~h z=O0Q)<4@ZU2334T8`|)**mI%2yQFn9UFydBf$yPL&aQlC#W4L`r1dL(V)IzL;^wgD zm&>26jtT?TBooFP?4*Vz)A$#poUFV2R2c&dG=rW@)B*?nDW-RU6?U=cIF?&Bx+-cAmWa1j@YYz(?3@u@1c}<3#Ne1w-!&nf(mNe z)Y57MxMVVvrX}vdB%c}BRriK|)LM6v>qUF+ktO*EgURxJ$&%C~dlq6ei{yQuAkjB< zy_>P$&;4p=?&<)r;0KnYzxWZQ)|lzUDz)pe=M_I=_NAG!)l!6YC<-~dIl6K_?A9;s z;0=b5;u~j?#*~WtA9`y;4^FAF>kT;44X|eeBU8g_%Br;?#|w&1`5Y`h z&O83PD8bV0JTf52b;zt2#HzDN_UnY*GFVBxmcpXw`R(`e$m2=K@6R=h2RXv6Bu=^O zc}AZD_40L}Uuu8$C6WUZASALj#DC!B;~?3fxTBucH8HzS)sru0>dB-yU~nfk}oJdZn|HVE5 z-&^$mt?B}^A$c|hB7dbK&C)V67awFl#Pj|Y|7??)!QCl)_AU2wrdN1!+ zzC7FmcX|a<8YOPtfPfJA1!IdoIMDg>^sqQ}EZRSkKxTY>YXb^z@8(mO1j1>2yngCvcHJRJ)K@k~ z8~W^+G|FX`n}JNCIDg%XbVZmX+>3EPCi_|~awi@{N>pu$X@>I&iHoyRJdLAeils#5 zNbnE91r|b$JJpQ?PVK0se2c{^mvq&<+8m^;!;=X>68CVN6wyqb z51hD+ZL{rCs_X}M&d76fZ4sUFZTHXFZrd+#G+fW)2lOnj0>^%Ii2-6iH3mMSO)oT{ zd;*a2Mgo#G>k|6Ni$2!n>q;#?{PvM5HW6_*|+52;B2q){Y&hRvBN)U0s3hcMg9~tWWUt3iu6_tuo@*J$!gk8>xe^O z`svSz=&xPcEMf};79HEI-S5XS+`ntlwT(Z&e$7C=8kg0ge|S7y1Np{tNjmk(F_@<4 z9=Dru9uwD}cWpl|zAOja3C{^E^&=0N2;5(MyGF8iIBFAsigzrpj?YK}St}!55^RoY zLrmcGUCaNJk_ksI3KovKsNei(6=wU$P$NK;wFDM^10;Y%$S@JIOFY2e1Ft-ROi!Ol zQ=%{J>a!2Y`0isBP3~)T!{d6`7{Hf6d-B(uoNYt9&-{}t!4RRY6a0*xFo$OMII(lh zKAYEThVP#(e3nAuNVZ2C{Gomes@%|r}!C4tF2>WkI|wPb@huHiYp%d}w2(!gkaIldY?b&tc1Z*8>RyUVsl-->62va;@&0qVDCC5f!25`M#%%eDnAFCL%{ z9uQe+w#(L7T^kKWBX*l#-HNZAyE?f)H}suL`~lb2dK$p3PfrDYT)%hK6qyZOAIK%b zn0V6KfVp52s-!@toJcIoXx+nZ&AUBo2{{9DEAOOTjCe-rC3D;1cWSy$K7Ysk-TAo@ zFun$kGcSK0c{EulVP0M$m?cP)mH#x)z!1RkHx-4Ak-}w_^`9W224$7e9ypMEl>(oY z5zHsoljU=!ndLOyG4bujKhuL11rXPsRM!GiQD={)Ux~|#af$1Dv*4%Az!(dazr+q| zS7JDI=nC>rPbdrnl~iVO+!aM9n+TrR{x&sbVjHi0q5feoUYbh4B7nf*leZt<`yiVh zU;rkx)nZ^bOcK}{2Y9h_mBy*o)!!8lqy$kRx}szJFPeG ziXXFDbXBQg&KiZW`}|)rB6|8ip(}#py~$k_!4^^ zEEsgZA+~O3eXxZLC$;YsI!VZ8Nj$;zmKAD9m1LE|-Tp-+=pL~v|3!sK(kLC2OWGIJ z&AkJMm-`_i|-T5+vxW1;o0m}X9QFu84|;=et`p!5`A z4rD89_!}(NntW*>I%Mu=7K0t8PA<5H1vO<)obCqyjS>E-IrIXM4-2)J*>gW4oULhC zrmT)2hsCC=x{#nvj|6sF4EHo?nN@knVy^JKr*4u~&pVBHY;8`61?S)(N(3?6*Z3i*8+NDxCz4{+TXF;47me@3ne4pt1=Hp5QBFN=c&?` z!7p4(%5U>M@eD5)m}R5>_==*bD^GVSB>kq2iRIF(FMNaxOKiJ;BqydekRLV6F)GJO z=3|X>$!&h6@)j-s$kLthm1mF~liYZrZL+Zu7O8dS0e6uopsLmK;1|xWulST$>n8A$ zDj88cPAwe*8A0(E1K3a)5x9Brn>Ciofg)1aZ1Un{#A@>^(@GOQ^rFm z11IVWrD;Fsu?M8Ia`yfQpnKdbGd{;*z!13^8yi8Uc^{O%PXCaDyTNOs8m795%poD( z=UWB0y7z$I9y+e3&3Dz9Y66yAfFQ&gwDGfRNC_iqN=RjF=)GY541H7 zw0S)Cwne#NNtvhABMp{g0sXT4O?5X*PW!8=d8KF{)Cw6OZ6eXWNphyK{+03l(abQZ zMYF06(Ic=+s%{40N}15N@rf18e1^@|;4=oJ{zit*yZBP7_~&wBf2LYCELQ=Hf((i& zeLc`)r#>3D(kDn?##yj7^&I3%qZ6h$xl|Lr+rSKEWhM{J#xf2!SfabAKzT$IEO$T} z<7+dG#}kY1;2;iIFo%or+F+Q_m+$Ht*b5B9Aw;dmj>azloWK#sIT9_O!eq)=V3>L;Y^?!3R*A?fYS@u1ozciK zyYic|QFo;Jn@Qyt(M&QZ=%V4_H&yo#l=h9ux#p;p;D%f}2cHbJ8VKNYZW%BQ}HPN|-!Nt(Ou- zbs-b$78}W}>00Vvz6Z_~W+;`R5z#rqUUOh{>$?XdXJurMb>H( zwM7le`e@2cVrE_{7*LwPZi@(5=#&D$7p&j84n;JJ73vA2JQwScUq=Hvq2kW*Pk7_Q z7zS5%CKzh}19bBHr8v>w>itr_VzOx~wB`Acaj&K@5%rrip)#HvwZi3~G(wtO2s679 zGIVjZc@d9(BFU}N0Oc_u)y4S&Z-O5_`g`H3R#1r)6_N{(Comn^uU4D5!h?iUnJbHs z_s5`jJ}KdWPZk!~_7?4Z`-(1p7;u4CxcbhH@qx$BZnSzXINljPAx})JIK`exbUpF* z1+g*}My}4RCQ(?duL^B`=94a!HIf>CdGQGmV{{#?RlYz0w6>hQ9C~G#b^s(v@xffg zX)tOH7`aIPd(9?t*%Sbetw6qbYU>$Ht+9TS-LvS>(H){aL#&z1aiv0cJ9+_k*v0N> zMF{NSPQ5;zgRHRFTpcKdfl+FW?SBAqalyoi8V8O(@{MTdMN{LG4%)ZcK=bG0vEYbj zPpw)+ipgo=)}`@jQM9}^N933qgHVMZyP(&D*8FB`zc#)$8T?Dows?Y+=Ae{Xic%Dz zQ5KsQ9SVMoje@<*+iWQw&4b>*?;N0!7N?!5M z$0?_Ms=P)<5K^p}Fpng+6uiHGv~kt!Z`5jzuoA-WLwOa9c#~@>{VRXjy zX%~a&Tg8ctaS%nfqm}0_-7VARvqdr3FLeAZ`n+uzM@?wu#rkPzS`@`DsFxMjIjI*5 zUiI!T8f{v6D^y8`nbD+4$l3@BB1kXeCJ%m3#iQYQB)7H#ctUvH170njR1O3?(f6oI zuva}%o7dG^E-G(Hyqgv$Ws9}dbXF9Mj-g3yNme##2s?>nG5Zey?d!c3?Uj9DmVk_# zAC61JtkymYO@_)GdJ8mK89s|;%cCA47Qz}x!v9-Z+4mIB*Hl$66k1cmnHX}=!Q)c| z-;mUHrRPyhV%Al1@xVe*3Du{HAN3W6cN;qSUj&1SB7O&=KP#E9JCx#B;pELEG?-Cn-=ZKp&)jySwfGc#zd@8}4 zzE(hhXP;W_V`6y>9#j&tN++-!H2zo2UijqR^+|Z#1Rer0u_~H%&04+`WNl@7!u{-L8L6A%uVS zR6Q>X5IBlbA;U&_4Qo^k|7j+h7jFEUVP>E#a70YR8Fg`Ova*MbUcy0iVNBY;Vy+ze+JU|<{Jv5v|f`ceYM~ez!33~A<-w(mt75_HB4Vd1@L^P zQ~E%btO#P=SMTn(VW$h{k zJNv29r0HtUOE<2|>?xt)7`6LD{O5#-p$fOl6QczOL=>?D{(R@#K*RpZ-_qQr&H$LQ zK}fT>sgluLBkn1-5+;DswvwjVSqm&8d9JOXy-eIX^*qu&O?6YSWU%-f8|xyj{#Gk> zgDULs8BJ~#vQA3zb!Sr+RrM5I&h&?Cls3Ys*Qi9MXzipw&T{t}!3*X0dRZQsy8=0} z{q;KQyKR^!Nw+46GK#&~1ZIciDW&zAGFwA?y_QVl&`}or4-gWNrNgoWb@eq+S)jTv z9d%p#PsYRTx%Jeo1f40=2{41_i2dfJ3hQm{Uw<3b=uSrJiE2x!d?#z@#~sT>mcxFg z!HvSYphtWXQ1=zf6{u)#xN8-xUnw?!$~msZC$l5>i!+XIR&}Wg;iVOEzU9709c=Y# z&C(eARYuZ)CtIipsJ8S==k{%I)DCWZFsJDj$z`30!8Cy$DXNXaCpBaQ2lvD3w0f>m~JWAN`|B7bzlv_DTeG9zl*HXqLsu0MajCN2cM{{2$_$Vo_!!G;jm zc;n{!*eQwJk>d7k97<((?e?&SnM7>W`HLPWUx5^&Vme0r~&; z!MEQA05hm|>tF592Oy7RFvY(jQ+@o6{{hUY zws$U{E#7%Rv_y8L=uJT^f=y%!PlOWlJrbl$Z6&mMv0T=?% z;VOb7T)(d0IE#CJ{nicjhnCaNVMf`^3?9D*rUJ5An=1=w6$}Pin=wk;d@8rA4(Q8M z!Pfb*mS}`39C;h`-3PMZhJep((lj_l<7t#ZQ3SGsi`Z}7LE*VjX3k4ui}VN}ewcGS zR`~DBoKrsO`!9;6Gs11cx$#NOOWv)lBSP3k3&92!YZKvwIT797!1UI-@8+7-J#If_ zL|gT8s5L?&nSgT9asx-8w`r=I`I9budK{1At*soobpn_rOzrC>Q(uvgFO8?yH@@cU z=%76Zj-0QkZxbycF@C zt6a4&g-%Q6*v|ddxqtCycIShFF_Kkh$6bMBa^`x_9!J9J+-W?4X+#$wOmM7x>A(JZfrd2^-g@fq`jhgmd9{PX)dyJPb_ z{LU>s#oF-aXR>L8icsgrW>og`@$8`6jgX&Etq&f1ZwHQ;(rxDf?8!UjS`kW0^TzHu zkp%yDth#C}hc`&}fF72^hsL3m-EhI6kl2dXSGGM*M+GCc53h;SrB=e~$rPx|b1iL@ zgZhL7TpNg5so<&$v|donxnx#)2)b8Gg|m{4)P{XOh>0zqQ_AZ|_#?36f4(9>!)A*@z6X}5K#OiPg z=y3yuusgTlpiW8pJ?ys$d9QOKmAtDzAcFRoXeYRAUrg?TjUkXEI4cW*bEfsty55pI zO;vv=C+#Y#5PCB2hyJBn`;0drsrIU2V*vgnZviV;o^4&ljbggOAoKw#_Ao1e6nB^d zr{qDL?eJydE&r_W8^E#{c^Zk1h4pRaB4|;)9n)a_sem{}-&6?W6)dbk4LnW5oG=j9 zMZor49f3qq!G=~3es9D0Y~e&+#gJb;)B4J+dJeJTUrR4LhwO02l#tb)zuQ%+C!YB+ zFvoEtr#kNwQZD-a`?eu5gwS-_-c>LHjH>*Je z>lj&Mrnr`Fb(Vq52Y3~?#G4YZzcR%>1W5WE0sv8XO;X|Dski>5pz&# zAhF2hkOXi{=2SLEmZ$IOXDf4fN7wjJR*Br)w~^LUZ=?hB8yKVcs?!?+SS1R> ze(Sg~+MB^Ut1dyT(`x`hv&Y712%eYO!DbdruPkDigjDW5!=$|Fig<)qAdn-5@51cp zDhCqFKqpMy3=$8Rb4RL6VX(Bz;}$I!i6#GKVKz|cyQlV+LEei7OjX2;6WOF4_0RT; zL0yx01F?lZxX?0v`CHM3WvXwngje`dcMKsl7(p(fL{XPu0Nu>wcrhq4d)o zU3$YHY{Psgkk+oQppx|ELV2!3v0cph>RAu#2g&!lMl39bbwyc*IbFV+z%b)<(nq&_ zq8_>~|5$pjCOm6QBi?5BUfCMFbYUTVE)4FX;4p3tmD2S$gFDFsZQh(|1pLY{fpI_nQb68!-3T0qeacUZt~iQoyw>D40@&F4 zf~36IujC%bU%}nYQw2`xGlopOy|Jja-DB&2sL1oAged366He5Cw*ak=J@O91>Wth1 zuXy8Lgxn0ub|2gNus|v|LP1P9LhqA{MFPwKst4MWU-Xu?9Dd6FMO)r&BwY>g=gk4Q zDnzb*H-`>k@K54n-#lq^!{}0kND$Hzj11-*@!TocjW(g~hDHFEo6MGm-$+>%KO%3M z(k5Z$9Y$jXa3<#r+#m_lZtbd9e}}FJinjU2^K+TT3R0DeJKdCw^t&#TG$yMqlMM#@ zdaBX`7>NbDe~5B!&;GgrstaI!f*-l_6`<}^bKF84xvyw(^5O!#PXD)4HGKqL%jZ9ir%k>$1Lf%0@fYT2*#GM~4phLeUL z8Gc&Ps}b3iMNT36qCn>mBy--~W7OT(H<~3Mt+J?5s_ev;JdNy6ZzRmq4yztK4KWR^ zB6yQVux)^wmF?dSgo!II&c^erhX;9}Nz-2HDazJ>dOPBM#9p)A^3QPfE*!TCoX394 z^fJn7deISY3d@sZu&7hbbz&r~ulck?TXf=^)@2Jd0@TxwW z8fluej*-1bxO87<$=_N?M6MJnxUFk%Xq|loZ2P;G@c6A!ZgR)Xs-Wma;%{ zBa!O9k{3o3Wa+?M$N1hQi`C;vjVt@$7no5iO3u2P%Y{+`5AW(VpYQ-Cl$R-N$JQi= zhU0k>aH%E~rA%&}X#t5I;??q?eK(`=V8swib)Q7zsk3W0t5)J=cCh06-tRg`XSo^H z7r7PSXfr90JO`}q$*cZ)?q((2L!LMB9}=@6E`vJ-%pA&%>YW_0{_vFZ*Rq2;@9Q?Q zf)1w&7@{4s3^lc-7orHqgtG<5G#a636^JIXTcXz4j60*0m(>tLhU}DAdfarGC|Z=! zZ`_nS^qbLV`BPF6o;J6^V1(ZX7MfGC1zM8RQ||Mh^FfmD223=-E$9Xpm1eOkR69+~4|)AD;26?+Sp9xNcz zf@%T9VZWOmJps!Vv)h!OIk~7E%0vMf_IcJO3u%}UpRPvo+^q%A@i~RVdj6ro+JAsd zr~YOKm`bGmbw#l%&Tdia{Y<}e&52~CZdF--0%FF6H`^30iYPs^X`s#iqwPrtBgPk1dlwZn)Y73#cK;-n+;_4z_jW<+-F5u;YHXK=Zf^s zPgU~c(0|Rq{lla$54DfowF=fDwyPkfo{KDj8ICQtB4P&ppeol@D18prF%CmdPf2VY z_qW;D+Lt?r$vl2E-?cclcIVZUUEzcUzw$(k#Z2vl!G3|BD{<{&OpiUch#ui&uu+0l$ zOoIjXndb&nsQvX@H>#U#!Bd>wmPnO3zYK^XI^QX8%&w|{mm1)SEG2|j;in^gOOg8I zd3rgOelOrm(uQ!+ltw;NZ*pd&4B^6kurirJ=UqyDORU#abp9>>tCKGDAM^4%*p|CM z-$JPaVrjF0%Q-x5hKi4xz_hLa!(!(%{{tA_iX}I!&RN)M;gAk1LhPy5#%+V+h@Q?{ ztFVTUPw7n)UBUpeF_wc2kIOTG{m3Op?|Vw+cYG;Ko=ZD|CBOjy(Y|3&#Pa}4Qv;Ji zT8|83XVN*@6NV9z2&R$iSeaiB`%^@cG}h<$oMOMPFOcdzqBrI!M)d3ab)GHLn+n+i z$4RSxcI1(px)Z!MG+`&kJm3$Q(6&Z3?cZvB_8U;zQAL(Ue0*KWMRP!a^XL8jRhH6ps zppQ+E@sunEv{<8p{Ks7lOy1}6)|nfvK3;2{@lI^v@rGv4O>C*S@At)bHA1Yx=;(-- zVjfJHH?jQ|!*oDj53EdYVpE>YV5)|P*IJ(W*xlaVE62a`OGV)YNsN!LSq@G|s5MYz zhZWiH`DA@8aK_BH%=MaOtgIXft_6hBcalZ90R|Y|IcDtbWO*n3?pte#RKF%RzrGGu;!R|#Fw=r-tzC%6UP*{ZQ>xJqmDlIYa;&R|5Py9bF%#X@9!`aj3UeLlhyw8MR@{jy0zSw>qy`4&%8xivSbMKXAj zjhxvDb8uC15q%#X0oZ2^W~o+Zl$ z0=58ZZNJ@aw=Y_|`fa~|qi7cUts6{4X-H<~C3}AK=R2=-uy5PaA-oO|eHAAI;R&mByXmPx%x75J7shAq^EhDWb;! z`dIl2U!U3AqnVGz#@sz+0vH-}^)#}$+@iZ@*rNaXeF$r4lldMIGA{UvXABtDCW1Ng zNmUV|C(}1z8ICAGN!Lqa=n34?pPuno327SKlf|aE*A&Lf;BuhVH!Sm4F+cVhDGP;D zrF1|?_^azEH)*M0Pm!%V!E(lPmN*pkhIDOhn))8oeb$bXUWeF2VLt9$$aZ=oTabZq z1=aIi1~#{m(xzp0wT_wE2muG^Jw!a<&$hW%CC^w!i%X(|y1nSse{2GJQemp-Wv+{+^SY)7=1>d1uRX zS1Mr<&G}6Fj;!x-WIC2LJKO0Es#D)tZ-RQ2)a3kSwnyn&;Yb0`+)1$nMrQgnnBGm*?ysw9|iJXT$!X@h8=Q( zK`ao>6}0cad8!TR+dj{fu(Qgqp;N9-r_b{^oxkn>n_{=tgItV$YB`mPjPkU~sEJy= zxAE=_`<{C>Z={+kECJQ&|J?|3qia*4dhkNB%$)Jt+gl`oK=w$MY{*w#n_(%{{&zYF zV_lvaOHjOG%9`msd|#iLPBN_pLX3I-2O&37P1ZSX^RhkDx+4Y5OGzH-jt@3MES^_U0f=|->{|>`ah+#6OBlDTnS1huq{EnPx!}3R zt>vj*Wg;JETxOi3&Kg8vp;*ONht2%3Nn?HnX2H zg&UWUnOUxkfi9(uhvzox4td=-`r44gA_)^NohBg{VnC!$eN6wY)o00t zg3Agu%9*foC905<5siq?ga`EF;&q;pAivD?RlL#hBw=TKB*EC)eK0=Y09_$$z%TXn zZ4!o&)bSTJ5iiryIGsyN5SvRr62QerM4jd~IH?okVYJP$;7F>g9JdFJb~M+aF|#I7 zTUHHFyN)!-f-`_%(^GLGP}Xna!)B@I>WOG+>dV}7f>!R7k&!R{-a)ZS8EG`ks5aQ< zJZ`)Rna>69QZeba`I)n!463iBDA+%bsXLEL zF%+Q9^^m(qJRpDLzcYv^JZU8}AUsk*$tD`pj@alzHS>u9vQyO!du;=nahRolF(YF% z*9Hw0mMk_&C^k68SulG{Dh+68RW+O!wizHTB&*7dd-vGX5%*r;@OE* z6zKrOe*5#bs~$M&&|7|P)w9DjqVnS6v}2j!H%n>}u)qjbY*J@W@hX{sy|+Fyn38jv z%ze2hdRczojDGaT2A;d>fQuNrQsJEnWQ3+RXaBSFqHj+&RjUkQ~U zcPK9tN(2&BdaXATTzTvqQDaw3%{K#`a^Fn^vSuAx$CJv!uOjC6J0 zmniiGMuu%0Cg>H%yV8=MU-kt3D6^!G6LgvGkGIh53kku3bUvwB9gmgU`+poE;e~|c zny+aZRt2XA_+C(0bnvygPx{}qZbN;RY7>JzJWemK>HY(_>kNHOn{HU_P}yI)6g(q& zu`t@dojXjX_$~9(R>p`zE{CSQ(r4Y=BnjbW?3J{>-o(CppNT8)e*i7*cS~U?R0Y`@ zg?pgMAJP?{K>FFB8GyYA_tY9wxp794R^O%zp52505u>t%I0v}uK(^v6s0M%kfRPQI zkT}Zsw~t7$j>f6l!K0vx`1DwsmOUWe6TK^F5?%;(BAOL z@TsQ_C57Y}zqFZCO~!S3HDRd)ql1s*Ife?R86vZkVzF>tg>E5Gd5 zD2(a)x2kLTF0EJkzWDQmii;yY7QQ6QmD!PHeOeui3x=0$K zOq8;!GnC1|78`6*nqAWT2qfytn)*aJt01mb2%5e4F6japXBMVKxp`|Ij z<)fqfp2f?xu&o(+-4;NzuYZ|DWf?Baw2{AIZ%@KM&BsSc@vacbz$U~XcqA|)RS8DA zBnR(Oh>JgRS9pNXY(&j-(#%|4ZZ?713#rdF60hwZxa$C7B6hA~_6l7YfM=D<@HAk# zSrmq}+k9(@*OSVVo+>B42bfOr6z*|GkxwFjo^MMZ*=j`(+b9vu1Xs>6$A`yzf`7?P zzOUs)Zma_2O@BwNF&DgOYxX;j{nTrxC{TbeuM;F-Z2$g@*)0c!xA`BEA>tNX&U{*e z$olY?tE(&dm*#)Ecdj@8mC>8ep+j&6Z(c;5jp_mpk{^xZ}sfNLk1{rM6oRWSjDnV9Mb+Ex<1}&mZ5Iv>Fa7k-y<( zMX$Ay5A8>ayL4V#!1En|P?%EYH&bL~gs_67|_vgl&R%mgUA9_MTYd=tPHqZ=Gk zxC&!ZVCTUB7$4ar_ROQ^b=pp20!P))RtLFPHJ3K8EV9Wq-BTK=r@U z)-PaVl9~4@q4Q3fIA7?P_vl1?Iy6^lkEHyu34JB;W2pa7 z8m`sc#n}j4Un0X=5Mx9KAfoHlsd8w+wZ4EBbB&?S&_;9GT+45zjqZL6St7KCVTDq) z-fp~hKnbcARz*$0*8Z<6?4L4?`?bsE)mnk`1m>p)-M;Ozi26lGq)ns6JalP1lNvvv zrser*>+lQHKn|n`OIkleX1@AuT#Kr*{wEVk?cQxa>DX>Z4ak!_FobyIhsyzQnY-Q2Ucr23w9H7JUe(N-Uh*Q?Y#FbgkB%`L1yV)l27+QWBe&sD_`vVJon5HXj$oBGGU9g^;BFqI~BT- zi1M5vEcSzcE|=ULLuxTA^@6tRBex^kRnEfN3G-7FP*dw%OYzah2fHsjbFQm%97csE z4Edy#4M?36Qg;*DD&84U77-vgIxgGZD9WlQHbZW1q;~`K_)xu- zHq38SDv;IX2)1&mK8i6ci`j$fN*nx*V2pb@ReP|sM`*`0FSLYvx03?gm(6O~C8uaB zzcK5@=rWpGd*JgRBRe^U3BJT!pKP7{#1?D|8Tr;qE(_ar^JeXDw83MG!6h+vvKkpj zpLxCr+j{J8G^E!dIC)s?i32-`fuj1#a1D;8U{!rHA;qH&w-qMaM7r^~Hs)H|C#jy8T)2Z-r!hny^ z$2C+mAHrPxce$yI>|XFxQ$RwUdW@o-Z#w4P+|eT(Gva zI!~>Za#^uI1;3u%E+uEcaeD&Q>&iJi=jlZ}jfdZnc* zJu{pit1B@?42&adxpS>{eyGEQ*3zi=2F#F?wi}N39$VeA3YDcj1OI8`2I1lo{sW|6 zMO!uC_U^}}_KUf3*UEO%9E_D0J-89z-S2t`q6O;e%QKKSFm=2X!M{XFD{rN0n%lB2e< zS}s<%jBCSJaVyrO@?MTn04@{#*hD<%aVj?WpIpB|tg%KXebIb;nQC7?g(CMY7h1-! z;}4A8nl8^DT>S2ZJ!NkGtZ3QQtK;+KJna3SX7*J5)XuZo0)z>NO?_=_#4fupVa66R zQ4izP&4h3>z8AR+YHr>m1k!PLYfrwIY5%i8K>It!TH^%QNj7>hW&sn8(%?=(X1Y1Z z_?oupcWG!@#Z^Rpf%w}EridY#ECfOykooEur7av4h4`T3X8G z7I}8O9D89Cp8)`V!=k!yFzeu*@%fYov+f7og~H89uhf;2N+pr&Hiw_tMK%=X9f>1) zce_t7_a=<%MISAg)G)^yUM51JEk0O?f|DJqa#9~?o9^b4MiKwc)sIh(9 z)xh53WE8AB>!R5h<9G9Fpp;fkvo3edgVUiO} zudYUBduRKEh~*NsW;DYSMtM4ETBu*}34m!5c4q_lU3?zeFdxTaegHV5ik5pBCc5Xo z&VMZW(`dPJaTC{F!?sT%wDVAYIB@B(+ThW4^n3qo%y8@?Wj-THFciCtro&{JmxO{b^Rq&H>!25;ZX38U`Y|-^=!}~rO+Qe{`f5({ zyqS>dpfwrN`OsIuPFk+P(|4qA;0q0#wsthxXDYUOSks7J|M-L0I6lnpfq<99?YVy_nUM3<1JXHBzut9F{c2z# zbH1|q9b>!0DCe`rL?%By$D3(w07i61W*+@*r1MUJ6#-iGgk^zuzMl7~RlUf@*lxg$ z06`5hvw-gqv)b7nOXt5ESO5{ZBlZNHfM_=D=_dQtlX4NYN=MFcA%8R3DWo5Gxpy@t>+iD*Ge#mUTj5d z3FOtD6L_AJ-;W&7cw4sr7&@u)(mH55ty#04)OwQL22P=6zknvCx6Mgzh3S<>iiM3@ z7c-r%Rk37+-dG*SG?+M75^C}LH<#%SJTJ_8aQttq!Oqns(i<`Rr|ZK%sKn%QbL2;v z7qH+uQ^&Rw@Z5KB#+PC}@40a@!TjofZnNP21K1r!5SWa5` zVcr0P!IXUByL``+xEDeW@q+meg6&8d3;s)Io1T@P!IpwnjJ7>aFbHb?23(|8(*(@1 z#^-Fn9+s(`e3WvS?7tOrBqOVAT=`=zH6Nn?fic6DHOS&!Aft^<*f%F8&Ph_=;odUWpD$)|T^nyYsJG4|A?Q>XK_B z*!ZNS9k7~N_U_Vt4jM2Cj6xZ8E7+pq?2WtVTXt5 z;xuv|FFx7CM$E8jRY-$Zii|xO|5_^9anrw5HmfDNledAGTBqkfvnRO27Upj(Wr^9SW`r>e!HH5=poc2HrO;Ttt~jlGdmA|-odk|k;eP3%ThQgv%(i36brlbvAEBuQ zh|&~i3SB?|A7|hTJxob_uL;te!zUife@~duEvR=OQLXf3ZuuRTWC~NL^tpE_FSt=W z*=iq7S%@QmXpcoY*GuwmV)I*;(=av|xau5j-wI?vj6F7<=&?N;N! z^B>ty75!Xo4d|H+P5*q1c7S}@Z9Nww9w17aL#Nbc?KY^6UGw%GBmUZl50vmQ!c#*eZ* zelz;)pQqh>6trbb1;)v$jb`&d?N&80-uEt<-gQeXYW}^u)x{iW|FmNm$5I-Bd3u>< zxO$mC_?G?Q<@NtA>^~-SqOMIuFx247OTL< z7_bo#>WlO-4Y)*J-?hpi6dSHZi$K;iRo8Z zK2vIn!xQxKPS3>Sk~0Yx{3Xh!L6`#&?s5vlDDi*Rk}yqT*o9 zG66{)7nY&p(*W&Td;H@1%sy5N2R7K@Gv~Rxj_PxdqW-4|{T@CQooeUa~6` ziyGUHjg3EgPcp_chJ*b|FlTW(&IPFscGXV}C_NAje&2nKl?_S=g549ha;!Nb?zno1 z$3@47@4CQuEE|?=?sg8~fA{jw(1`MBnQKXpakj)nM4oS_Az&n;%cflm>K=`%Rk>QlkPRt`L)OK4?&# z%S9*sI9=O4r#BBTvkHRh`ddv z#5Z{!(>n7963IuUlzv+i;?M7i5RWRk86yFSG?zcoQO1>hIW(;PCks383;&v4Sc~Vx zR@&*e;Q{k0#$*(0)&~-GLNkoOHLQV{xpdwxI|R5j0+cGw&#v4(zr>s|n(##*!XWGT zC?Az|Vu9r|er3gcxy9{mmbF(Q4e=CKU{FLp$}!jAE-sspG>&*THUkM`r+qLcYdUc2d~d<&b-LVl zQZoHrZ7nin48q~~l0!@-g$I+~692xMBhlZH?B7y@`P!&dqs0af-O3{w?8jQ8EpiC? zM^||rQk>|p!lrPi{)}3TkjYG49$@)LM{#aqJGm)GGF1$+2QDda7V2Ifhmma%=wpO5 z{V|$XFZUh~2t|EfU?dL#72!bd ztL{+>!F=ddvZ?Uu5f1qD9_H*~0!aYQO|nzkL4r>t=ZXKa_`C<+zTm zgnlW9cKS!1sc7b^Mj>qP1Cu!|!FQMpHE#;$;_s#O!95j(VKNbbI0_jB*->?;q*v&| z>KS*}1NTL-J3IfLj?x}}g9wosyzihSR@4u+emFgGzLOxTWG(uH)nPrauqs%{x8gvq zY?*KCOeh7DW6zM%o2@1zSRxA4%5thU6bfdkcD}kT=^-MgkFCB~E3pz8NVWpkZ9Bin zRhtV}OdrldAUbhjb7G=@5=&LAMdEFqsF>TdrNH*X{c2>CE*OX%MY$tSNCuhAJnhuq znt$Kc^M?CY>xEdOfLG3ulo(Mcfox$eV+~(gT%zAn(@0E&CgAHSRsS*fPb5dbT-1oH zI-?WNE%@`~mba5Jm^}?BraOF8&D#BaFxrg~k)#Z320ehzTndPk*@M@Y-qxT<$)H&w z{j!l=9<5_);XKb0RjljMXv?tn0{LJ4IZn& z-;CXB$0G0g(tJ1a|1Jekr>L>DIj)`#GOCmfX+2W3ZUpEe__iH-G0P1J0JeX??@kZZ`2IFb@TDK6KFlZWkw_HQ*8w7|KGjXv1&Wc&M1I{g zW2mO$L%yT{`RkHQHoE*nIGqUOCE6g89qJB1l2L$0S3&j$_C9O{mf)^eTd)j)>-&9v^=6m*?&;WV8lc0y zz6t->?^$h3-v0q8f`|uHTlZhSX)3I!0Q0t(FbWnKDHCT)UmzmrPesI_d;mH;pXG>N z=J)FCQ1d$GuFJhiIC+UMtgnVh@`A)7mxJFmFbXKDwF>?tUWz=L8( zUsG3~ktmCoSy&QrWftq(A?9=KvZe)`!O6Ne8`IH@7aV_- zMwMJOXpF!{+9Iu7?^x@{88v|+@`2$=H{7D-(YgjBmT96SyLx%+Q;58mx4fo;j0Hv7 za>R{`;@o^oCFjLsX8ou~_^~FpI*jFk<~WEF-b=|5Ye~Lzc~kE1^g`G=Kx{2?ZeZ^( zO}T9%XQXhX%vzpI37G{ApXIZg#~O_72#yy`MKYI-4NfYn9FZ@YF_H;xzkJaiLV3Pw zA?tJY=$7}&C_XF9%HnN|3|jXq#3dIsdQ;nf(_nrf@pUyQ3p|FBgt+5azXfQqoJ?O_ z78uB~4#{GNJ$u+H6Q**EO5<-Pthpu2Zm$^TO-h@Q%IW16hU1y0$D9-g>Q_XJww8Bl zl)Xqs?8hpRmb-;RpXu|w4E%O{dA8dzBTO?MS#o*!QFoB| zX+StLzrMP5G~KYRx2y7A{DR7F?C6vyAYNzj%4NmPxru=tq+u;~SY&GlX~@5LM89@; zc6Bs(TD^QWg*loQHKJ6xunj9SSGt_FQ-RVK%^X^WvIvmofdb8bRIuu$O)tG<4;n0-A(PqB9B~f)Exc~ zLTO2NTun(tGs~qU?wAzsZC`}F3TGP?&4pj4DgdfD5T)TmsjS_gRN}6#*kYMUZt;8FFv!xs=S}oJO1a@-M zf%AY+rg5=?Yq^o0-+g70@%sU_nf{1aldFNLdb^qMr}R7xihz^rg6WyBO9TCUr2%XO?b^TkJr;AN5*3PnESJ!F-s-16> z%J+Z8BBz}xLqz#Q>D9XL?&QXeU0%oRo;6VDGFx8O&)0$qe(tYjH*(pst6PhuAeg=w z{kTI4``EP>ma{CCZ(7eSEe&z)Yvr#nS1xr>rdhkeYpkDY{|8?^?$da>9n)?SEC0Og zUz_xG2{JG1$0Et|31c>Qy4!>21AtHJ zJx>fQfmFU__BMW<_(JAZ4oypu)!TlX7~(BUbWUIDryQf6d4@q?2#sXMn3bpU7&YPO zmSHhD{UdIIX?13EeYF4Ji>Ppy{)v*meU~YzdP>57t;6I;I{wMpZ%_QNc=P@`Zmd|x zC%H*_1E>hDsQXd#IDs!JNgaEzEozpKr!3@ZVNt8T1`3V^MrAKmPK%ZcuV)?G)!))7 zrT)zglM8YOP$@;xDfi}O@2md@APo=O)Fn+3_qp@{tKW8qL*=GPp_&wU+PtUXyt`Jd zgcRXkgwJ)=Y>@hkx0jcCHSGlVr%4Kjx#E53`)o8i&c_bJglAXlxy0)BsNN*UX!TI( z0(NS{seU42ojkKU$Lh);5`)X%SIeyzzwQ5Rq%g2rn9T|Me>QwV9EPMfHvXog6l^Zq zOwn2HO!;*qcrah${lesOK)cZ2RS8{3$r_T&1FnOaC#X8vXgZI?)}6(rlkopv-)RRx z&#F)`IX^wp$JD1jWU`^+{@U&5!6wzW9S;re{E5|({F->ALZjuvCB*T5;K+xwZt7yG zNm=P_5krOk=jW`Zf(^g>G1>?FCD@2?eI%t2oOZLM;9}{=J{>Tp$@H|0Wi~dGg_7ah ze%znBes0le{`)yj)jooIS`Wx9+V2}Mptsuhde@lc$1vfP@%?sqZ^_~R0GZ$m@47VS z@LsXcj&TNf)cfyO`O`X^zdR21KY&aZlKz@pz99}@^?mw9R+A{TDPwh;P+V;lrxLV* zj;_DtNsnG$W&1Vw8+o|51rKXP?g%_qAj#NPNXW7tw}wFy7MKMulp7c{{W>aa#to`a zPeJ-qHuQ%HY;gpG$F5t9nj$EOH%Gr*N=?2jK1*yd_qA-DQW?`%-8-CcDC*CzieRH^ zZ7Q{Jx_2kv?CGto&wpcu4mh=*F}%3UJmfP$<&CjQ@uoL}jAT$HhplyGigWvcwpz^Z zR&?Iu(Z}}KFBgxIrvY%FRcE*z-qg&@^N|YvV>N(_Ozc>zAyX^3hs)hTBu#D9ghhFO zsQI4AaMy^x-fh(u@`~p$*MD*lwN>kYrSVhW#$bEQ&u!=ZNo@_M&YqW_FDF4^)hb7C zito!RWmGYUnpa}$Gdn!VKki#!MKitAdh--M+7LbpArY|YS_7E<_IKj_XLb*!#Gikg z4s9QVht&XV76FJ(@gx}_?6C_!Gnw4qM%k$jDSTDtt&^oC-B)@ft*U!s*WK!Tcg1)@ zC!}xO|8Ov|Tl<6Dra|}v1xa1X`?PGO)$34PK| zLua#bfphU;r#=d`OZ-qJYHA?%lFR~_Q(u*M_pqqPPeQq7jARK7)w-CXL*_#o^n~B+ z4@Z)!osABThVDgN070~v^Af9;%Mhdt;}dI{&;tBI;ac#VL~RNXtF>ZJZD`6 z^?m|)fgZ=>DZ|pxKssM(&`~Fc%7Z{g@ISSkSjd(2Ldaw`@T&n&NHx~sa)o$sQS*Q= ze~O2|c}U`h>go6#Xes&y0A6>Myx%iUs5aMS9kZyVEO4C3w=8@xyIacr9REn%kiJdJ zkQc4C;Ib!8T&@Hg1mEl5>RU;a4GIbwDfIfbZr{$Gvm23Tp*92Kk_1bpSvmg=UVKyj zcy9}B&*}@_=u0J|L{9@Vli*vr19^-&U!t=++{As4Bw%%j3|l6QF@-Kjvt^{Ge~Kee zjUV-XT%bumRV4X)@ySId1#v%@6eaH7NfuB4b3l*noP2pAgnVRE4bW>*V`WgiXBT?x zKnxvnX?B-*Cu@=|pfg+$H1-M#w@A^rbrDm2G$DDBn}mpP*ZuLmLj=b*qyq}!Q!AJY z^n_!WJmKdtD0DVm278+tW6p^k~n2|z(aGE8-J5#lL z>8lOLZwgt$=O#_tvjhT{O=cMWhBI&ny}Gt01s4$VnbbuF4@y{q%W>Qaw-bJC5EDG{Pn_FA*JQ=%L(Sf0M^uGcMLyM$>$gpR-!GDT%jXZ$P@MwftnLLEOdgIO8k zJyU6sUR?MOFcn%gee|ml$SdXr1tpWUu2X}$ZThEP+x-V{64{AY*B)^QlRJg((lBnS zoNem46vk)|Zok8ty5%_AP%8cstgCT;*3!fbu+8$Zi0Zg%lzO+|=Pr4~bysY^oh|G& zpr&X^G(K|Y$P_?Xq*lT6A3$Db8e{B=Pc<0_O(IA{Arw;jas zSER>&_RFBfB6(`;+fvbex9O!XAt_SB4atMJlh(;jJnx2vBD{eih*g2{t*fG%5VsVFEvS@%3VCW7N;o_X-qVXWsI1nWup~fHnZTO6JWea@4Kz z^9Q?6n+-epOBrjRQ|8^rpHjINSx9=mxq=uGMOU6O$ki%~_php9q)8BCtzNS-6n6A6 zf{{7Hun7~?{MhvK+f;@lSg=TKf?jRq19%CLBd1&FaKT7fbZ{Qs!-TKWOmmre-nhJj zrTNPe{fsbi>u~2_{f6Z!bRG4w4C#r5F1=1Qx2)lb3*A{Y#u@q`QhSE&iz3FFq zQzJ8sg#Ne%ch3^jgSft5EuR*&U}=vTO(X{|mQ~Y7{s$;HAljuz1b`OfeKxq(pvzF_c987{F|FRf(c7F29xT;L^Y3bCJw;LN0{7(t<;Ks0DE_n=4=;5HiaLV_ zuhPt+?vbk?sys4t;d%t86_|@xZ2kuh&+X7XuAsY1N8cb$3R~Ng!WIGCl%WxttAh8( z9rwK7fon7yVq|VwElN!S?is=2^GwQQR$Rt|-yM(LBmX(mRi=X%qt*-wB`+e8Fz3tf zyK)p*G*$D9^N{v11k1EyH2dV8ieV!%8!tv*rVpd*tdl77SlihGY&+j}lPrE(&sK(0 zRVu)8H$XnjNj6C{>-eUz*%3nlNXj#3DODb%r(f*cVA8k1=)tWOV6Y)uW%ax6xnhsl za%3yFAzKM!-7R6DS7d`Tak8XWGR*}Gq-!a=fvCZ$*lfW5)=kk2Hq%K~XFMyek3&Je z3Xj8sC)IAD{@1TyKdm@xwMtMa0xDdKu{ueH# z!REoTrE#yJq14PcUY5e{+sb4kaF{$v@f}$0OxyWwoR4!)iQ4j(iHuw?I-b4anGXdR z7|h9j+ZMpxPs5vGqgrS^>^3Q5h#$t%2g@g_gd&-BcTR$Wc0)zU(8WSasZ1>FF_s6d zPdn|N1NIlBvoJ+2<;pSFQWO~F5KbPILt{&+u_Y|Wsa zH#xr{fAhO4{hWztM%a_?%luFsK1W0Q1TR8W3X@EtxovuV{ngtT=jfh|h}s0Zyk7ch zS7Ly?o=`Gwqe4$CWX&LYuZ_R1ERu)1EI*^?a9>;Zpn~kw0d{#qb9QdkN6CFFg)_mj zxR!>)vg7fz$!)`5;E&nZPqq%+HIUW~6_l%>egs+OsXb5CXNKLiQl5y$X?_3KRH=@utQSX^G>?k=0TVfZUgD*VOE+_GNXlJkvqU*}3)(H&!2BZBfV+Wl zpQ9Br4S*Kh$pl2zTtCewufAiWRBPQzCPu^6_J^j1{pR=DRl9A!Ev|6Rvs9k?q9SmF z)MLE^!BkZrkB!cQ2mUdp=O)r6424g;HIV-S=(L?n8D!mG^|y%_v{=W8QZPU-$StTq zkB_iX`aVZN=@TV3gqLqZka}BGE<dPb&u_&3{rL70spCx|#<`x4B_@;&mDqw4pqS>Wp+-yJ2uQs8TUE_}-Y&CpQTU5)R3`P=Dy&Z+BPk;nv4UB;Q<2dqx%Bu7tM%tv>U|^$s81+|XT~Kp_OJ;Z-Q&%Y7D}Y!tPsuB z#aBoab4fOZPSmP7L-HEwII}+gDOop&cM?O2tO|}@-h4wM4%P?g+2DgqQwh{%Raa@X z`5&^_T;G!6t61r*oP^>-Y3Ob0Olk03R)$BsqJ_35d2PMkpcXmLIrHAO%cSc#?UgDS zk#^+EQvr`9!SWM+v?+X3;-A6*S#z4aQK?Ws>t_o+oMf$I0S^(V&?qwg^Ho%4eMWw< zezL5d`<>v3mzQN)KRR-gH2k0*-<4twNUu7y*S!#^qHw%B6|I=SGGC`uxW|E3$jYns z@y1X2T#y_9nEvc_Sj2}0r)Xn9 zCAxK}dP($8gRkC5IN1{8mA5(kP1DwJdz%JN#vS6kz!Ngf`+EIPpJSRc7xJMw^kntx z*(@4M={iAm5Kl%4;cD3tiw3+po>MPg8o`2nkzEp2j3Xd~IB)rh&D>Nk<_K9ejQ(Ex zj31bZ4f+|6_wrD{UH!3IO8A6UE|{x{+=#CZ_p`_261krdm}F2h`MNT?v>%~eCE6;7 zS^_onMcoB(S?0pmE6?o`N$=V7Dt=yOOJKRBrJ|*5)OW;=IhS z-LcOVqhBee5F|!a+zuOUuG)ZMs*bPa>9+?c6ochmW**FPay9H z^s*fy3rqHM&Ky~Q2sRznu$+L^t9)g-O~=LYllDytEr;Z22(fMvkB`+HT zt9o31{9hRCxt|H2-)E|e=x-t$KrWUJB18iu5B(#CCa?Qxht zsCZ*M$)8{oaK|g6GXeinF%@)ATIUzp@SJF%5TaNo!0%!sUZB7vVse@jVXTj6&{L@- z1T$^pTa5k6<=Z|Y8YNQghD~dYgYAk4_C`xq92Mr*F1iuDYf7Bzl5nxZH6+(|N zxp?TOlOB_P^Y%p^JUyF<*^YagrAaK*$Vi-F`yHt0cQp@Y9OHRKn$JM`4 z)(h;f=>1Lwbqcl6<{Fi^5@8c^AYA}84A30*Lh+!2PYq?OkLO>Zpb?zNOZ)83s$?HGM%3 zN{+bx>O6%|=ZC>dyj=Gnl+1g0u8+JAiq_CFR?xdN_8&TC%@DstlmIGt>j2rW@r|Ml zM9IH~mEI1cRWxD2}R)MUSggd_K#1@GU9=xkSe@aq?GpfaDAEy##B2 z1k>Zsp*lfTuwqY#%hDHU3VSb(3;qdD(K*r%klk~ZAVJRdB2G>&KK)C-x(k{=QK9y8 zCQXmX^>O5$=sb#tiFQZ8#Fhtx9Mxgi#wL4sEmK6|tI2l^eR;2+cL4JU(#fOX>1&JAN-~{T<%x zXZGR8-g188K*9UAG{@kf z;q;|QhR?bp&u-XIFeaqr-|c?3gorIhCj%xaGD3CY81q)Md$xU8B#L#EgFuyD{z(wh%NT%kuLN@@%%#WKR6a@&d8CM_dig#MIgv_E?Le6 zh90?68>x-8wqCxR>3dfVhvRJVW2Zai zzKXganVV^2^r$L)11v?--y}IkUY?Em#{s6=$Va=0?};p1j6jkoQagL7da z{wyDx4<7L|pQ>SLW-i{-CiomX>BDcPc>*7?v?h-u@;K)5K2GbVEDGhq~gJUb+Hjo^Abv zUx7FLEl=V`b}$xRdu!EW&p6|rD7|#pi|fg>hp9FOd+N)-dG7EvK`6fwbJ-Jz58Ft! z+X!<93%Y1#E&<~HN6~q>v(-OrJjAX|tlDD5sM(@MP{a;m&!T3{(%O5*o<+@Cv3HGD zQG1m}&{C~EqWah+#_!Gh4*SpCy~pQP2z<+@|5QUAQpH`(u&9X$Dk)EIHtiv1 zh<~#lsd}f;k7;M9=@|rO%;Eb)Ay74Lb5sTICpVfK!6Oc(Ew_6dvS$(R0vwB1?*y3} zi)P<->IT{>WGTi&*}|W_y87qhjL>8p&)PC5NwZUx0AI=d<)XOdQ??7J!P}CHOTS%` zRZ?A+o*sHtzonNd5#vg>sSx2G`c|vm)hOyS{y{9+p;X;A;ujZ|J>qNXlV|S9ZWkB` zww9d(A{7xJa|OK)06iNKYA33D zbB4(2Yk7XJ zs`8P#bZQ=Kah!}pz^Ky=JLGQvPZ-04LcSa_k}wH#qdI}K-8e~_W;lxX$0D)h*tQoK_#pn0ps zbkjfbi{IuOhyX&s$-~MzNwqCRaY7u;L3=bA)wtU0Q5^V^hFqI{kOjL)@}AFOdf&-s z-%!QgVYR@HoRt-J-b^JjU&CtrLKMHcuBeLlB2N#BQ&2`1IKR+`k%ohq@LCjWiw+@E zIjPF-!B{B|qZAWY`or|dCE{ql!^r*ceF>nQlJMdZKQ*E_`o2YFby*!`tuO>O5{+rv zhQ%m!c&64tu+*q4zYARKQN&vJ+TV^lrPPq>YWHETGJV_ljs)SqWOTjUZ0WLuab}fC zr&!TWQ(6wGF?c4+13Rowbu=y$cKJMXI`r#rlUHtP(N=h#;anB%-`7ugh+a`Vp@A$X zvR`CFv>e|L{!GCa?0zjj0pe^zX;||j#nXu!OwD>!yi^qN|3|PFR>#AF(=t`l(oBV_ z=$EXS16cHPX9nC+V~9JlF+6`#-hB~~rE?!C9{0eB(QMxeA(crnf6O|o<;x1b&N5&* zc+0K)w^_T;@#1kVk#E}r%^EBM=xum~$B%GERqK0}=1jzBtL8CVM+Dfh;LCK**XH=C zYQJER-x#7Cr56>17uYk{LjnYMYSPi0 zt_46kLkO~%4RO*WqC@NVt>bOvX5EP_Vg55sjm~U_0A&@O7-Q&6>gUQplgNtO8!9cw zQ@w;2{MszHhX*^+I>ih|JM;BkU#Gw)Ak??{4vOny$LgdS7(TItQJ@>)u*h{>U&+)APzd4fK ze`sx7j0*5B^5U*X?mU-4-H!BD&BRuYkM z?>YX0thE6WD@3(z$A*6ALgBI>g+@00=TJmTWBSKR(*E>fv>=MA^Nxn^&U0n!Ffsxh z5pE6>X93h4l+FD^pA zC9?LTA5m<2Jz*jcgyPGfxrl5?w0WByXCL#gKkaBj5F6aRdw+On*GTXh<%C@3nrrsr zZUb9ux8o2|jDR3q%4y{IuiW6UzK<$iu#MqF0@cF|yVeBKcbpLkw+xdXEmG`HBRP+1 z=eKI!UUmLIp4Rj_FtgOcy;TfF4eMoQ&(y|8Gq@sHRG8cs;^TuHySPrmVAp}$6dZEE ze{igq&ExlkXFl3J|2hUU!}{jYeX7-gW;LI}mA`T#_O<8GIyugZl^6Fjrxx)>4_mMV zF(FI3z^k6k`(Me43H4;Cap2B@>Ou6qK{Iw5+*jG)-hc;~yBD$HuMNm`0IyelSoIU@ zqo&y|e-pS1s=i(BWlR;{pzxVI#Y828DAw3S3dO7zko^fb*JY%`YgM8!B#?_S%yZYF zpx20W)wWync@EnW6jT?}Y0{PfFV6wlA#%$kM!ns?!Br{N`SL8R;2e`O#YYpxoK=SxNU?73 z*5H*Dx%@KvqC9}R0|9Ssk0b~XC7~d6Q*r3tYVC6sYm!i(=k$%;@48TO&?tu;MV!Ye z-7ryk5sRlUVb>7)vZ^FiMeDAzTYL6A*SOe6VF58eKcQ9%nKuXugcPNR4C!Ct7csx3 zd5DI|2GT3mnJCHR?gF0iN;EK@pG`DUFuyLgc~!r(x%p4@bgI5OOcZl6S9aYK*t7J| zEicY#^tmQg8n-i@(Fk^&;u>Aqn7QLu=ENbU!6(!DtrEx}vM>V?5&XvY^ig&x#HBEp zG#C6ZG@vR?A{=3&YIx?PNW>Eik5T^3w^kOdMeCtp#bz&uP zg(|eR&i8^{R|^b_D|liPwk0OP3GPP^0o_IXU(TF7O~~>nXBaF#SvQ=yz7F21{_yrg z+hAs=N1#@|y#UE45j#d%c7g>1nemU^VpJT&3{DU}-V9+*J5j`Ly_H@(ZADLXho|k0U*bLdY*|gp zCN^UEKQaXIyI3E&O9<#sYH<(4uc;L2jL~1-S5ETJoPDfVx}+RQ$*8!z+&tBNy)c3F z$ZZnN4nl@~>X!>hbbxWMR&>)V)a&SzJ3_1dU!n3_*paCYoN2q8pzm|(ibQ0~iSG>Sx@%9*srH0i zhaAbdf}-b{_>yHGpR8;_VW`R#A_M>L(>Y^1Mk4(kWqTo#=9i5IbDl=7XPOJMu{tx4NF&Ia+Dq0^h%GL{-Rm45Y^8zFL z`VAdHFPmi~vkDVRVQJoh4?&C1{fI{s=2LEJO%Ejkvs`SfyElTr@ z(&g_8%3BzAl@we;9Ge_!jd&0YuR^m9+8lK0?tic0i94io^+I6cZ@<5k?OxO|;;Z%8 zXNVj=5_=xcpHZUAR1whL$M>JoRfd0eAw9rmJ=cL7v_$Z>p$)8JQd5NKDb`v;KFxU4 zG+b{c%Y#MfG*wNGmCYDQb>BLtZ^vtIh=9+3F^C{~D$HP;< zY@^xZAnQ@Gveq@_Rluq`mF4J3<&jJJ#{8rj{5f-eDWO0GJ5HUnL-*wbR^A1Q_a)XI zGTJ4pliAQa!G1p-(xmX)Yp1X`sPGwn$mCfEWdZn{@7*f>)#AsZJWcFXEh} zD?-4~#^7${o&BV>Xel9g{q}t9o&hPP;Y=#E;B?i$XNLFpv)f5wPtx;t|79w zvh;DcazVwe@tAeAgvDZyQQ9lL@Z!js5Er3&TbN0o+Iy5@y7s6Bj1kCA%6^Ve);z5J zZ5_i(U8jO{5+Kb)1Z8=vXmlRlSNUBDu6eysm1l%hWsH!rm9jPkpmQ0U{1v=USKzBUAKWLND!se% zM#EM*YC4<3l~;-vNZ+R z^3C{qnDcY|@0zEX-wTT?Wl}G-K}k-pwoPAb(^PP6{HgRKXmUmo$7I0?xYkF*Lu~1< z)YivZ%yj%@8Rf@3?{i&A@_^-BTV6p=U0)KXined~`88KID%>?XF!uV^^VwHyGvMbt z8^44r>RGp$I|*0OS0!{vqnNi2=Q>zIpS@uI$Ti2=JJh70uDAnCu2Lp&^pzqe1r9Rt z<_&@l_|XBntP^va-~KVcM!jcV2 z8QVLFjdid9Om7X0w|sf3$S>8rk})hbz-=Bi5~a%gz!QbmCL(-v&Wxw(AIYJ~|2CN1 zDhC6rUzl0(YH66*tcTqh$g!`-8Y;gx$9foYmhorxn+xn|pA(7sHV#LJ`rRr0F&TMY zU;4hR?1x>0#`{4;E75UX-9?2W`6;{bH-~8$K6NolLDp|1VLbC*tFJ1(&oVu8_-t z=r60D4%tUJ$1$mz%XK^@dUa9A19mzlw~!#^OIlbRB3;C6;dmrw~Gv-_;wqT{| zZ_NBj0=aN~wfIGy*0UiZHspK&*OKPYv{XZax}>ILd0KR@#(eqD2{P_d!VJ_v_w6$e z;c##ivGjG(ElNZ2YOjXO8B#}1*Sc5^LcL!qiUxbgDdSB!)uZsIbM>0gM#`bsjyRVr z#$4s>K}}?MNVE3l5_153(lei*?wVGYL@ZAhGoj&T{%8bh8*SBMCnsO!$ zRmS>HlEiH>F*~Yr!%*txBmR1-fCQ>66T6fI-1%6HEGB+ebf^TMC828~gn>JHe`^s+Vu`|?kwY)Xd5QTl1q!pMfOl|-fO1M{Fz@sFgR1g9g?u0j! zFIEa`01_T1E)LuLKeP#K1XJm?6eaIeFrkmu<`Q2-w5N#~LTH0rm;an9dW6XSK=j{z zbeH-2+!g_vEO%O=(##pz5mEid{3Bl9Wo!3oWZ=key<7$We(Rz^_cg#Z)MlTma*S}V9RMq;BRVgn%N zRCyM9?0`-v)NWF?!9#>p_s+0O9ywnBR9QsE2r5WLMc~qzFd$AIL*@Q0puFm4^3_IR zw1$>YIRVd2K4s(}iYSUk8S@@Xe?ZvTQm|jLuREd6#x_sMWv57X%Qu%;t8)~OociVs zkz-Q<38*d-yW_R$?30P(`mcLB9g{=$b$~mq&W=hqhp7h?PG|Sw9Df?P3kjgDDoo=Q ze*{^IxO&=Kh4EIYuJo$l)G`b zl8DjS+*Qb%BJt6&_0~$@x_As8VmYM3;I}EFK2}+7`N*~X0r86`wq}o=232&q=DGw) z1-Y;-s-u($K%NTrK3rsCW3ZB0*#{Uj7bT{K~^Av(%>FB{*2)V6RAZqhvx}zmm6)G zt{m%S=?5|@9{=N}tNX5HRc4YJnYfcRu8e2qaC-)Am(mkM1@in*oXVzS+MpUKcP-=_ zwFZcAnlpgdf11ZyygJh+1@bQXE(o73#n~t{Csw1bebF^2rVf-j?IDSWUXX z9L6SrIsgDkYsw5Fa$;pvk+wmqTD@q~FwF)8i~&AUfu-9Ct0V`|c(&4~U(x<+%^rr= z{rJrwecke>Om!KI)e@?8XkzUfec{_FEk1%Y2uJ*eEj7zA)C>VvF|KdN*F};q*BQy` z2T=NQIU{DD@n2lu&x@q;xeCEK$|Fk_u)j_=jELG=D8!Cfkg7$4a_-H zvm8H6W%`>{@WYXnPL`q2<_ewIOP6BLBFK8V3qy|b}QTsZkN-bKvTr_jn$UsorgAK8i zR{=&YnA5sv=TvwZjkG^bs?7Tm7fh?Zkq>ote&O6|EC*PN|D$v`tT1Tv)P#}aOPK@T z&gs@-n0ZgqkgO2|BVweMrqiWbUIS(1|5&%*PyJcK(e(Tai>0YW#fN+<|3P;Z^;dr< z`Yc8~tuj^*4;GdwKJ&^D1w{kDnQFOj6lV%wWV^b+S2A^Hs)#vwQhLNhNIh zp{B-nVq2@1qO>H+4dPi5I_XM1Y1J{+K~6Ks<%~STqr)M-XZiAsRNwB1pRfbT|c&P4qvt+M)ib$$iCPpLk6xEHN+(S$jj)xb8ktG)G^vOLxKu2{JLP5#$WTUB z?1T*OHKldfO3<)x9EQ0y-7hY9p8Kkkkc`CRbu8HBd99k-&X9U4a^Y(y*Ymm4IX!iH zEeX8C;Ey8!VW>4MJs_~r$k=!qZwHnzLw=pHucNH2PMP$LqiPeDv{dvw++sbwj|V<9 zgTQ<0CBp=aAzvNr)ETLir5tAm}DrUO4+Wm*9<^io`Rbksf;ljP<-L6g;0Amghu3(i(ZzdB-lj` z&0#!Ry`3ds3nBjTlV-F)cn_C*>d8}IJ~9RHAoO^uA5I)8W+Sp)$JgmzUGh+mHqoJ~ zuWbnt6L!Jo7=vOli`#xwItot_@|8vYFi5vqi?P!Lya#uQrJ{$_kA3>WHE>qAbI0$+;Zs?g2R1h8D!{BivO&VU(NO%LJ%2m3na1-R z0~Kb}_10~bD+=8ey>}e{@>jQlYJcbVD8$cjnoh)|vQs7fln`J{xHv}#7wl5WX{z+* zQG@q(m815}3XkWhe8KnF(aHO_-Th69Zi@zPhWOzn4(7Fy2jfB>t;WJOsmCg<$0(A- zxmu+ThD9aDCuHVa@XbnCraHTtCA$Pwpqa1A_fn0-4%#6E(6OoF;i|&b_2cTZNB+c z`K6aXLRNkD#)RAnS;S^uN(x&wv0!e5+GM`0#Gf9#H4yVm*U0|?Pz%+sOIdQ0o$9+h z7Hi750nI?Jqy=Dnh!$911W`YQAi-2Tg!%0}IQSfg9{d?W(=8ED_Q);=1pnIgr&)Pw z;cM(|iB3S-SRLL7sY>cVrY$zPi~qu{a+HN4Je<>P;e+l*giHbh^VC1@HZfK^R(I8 zCe@|n56i{mG{9^?D5NA~>@;J_Wu7ivv8_y`&=DS6O1`!B>s_zsM74cR6daIeCqXR~M-jz0%b;Se-2W*{;4+sN{OQgkX z-@NAD+c{mA5XPuJ;A%lHD@Fz3RyLR0{s##D=YI}dt|zmeyOqJ8*(=Jb=BcJ8`Dhph zwK+ARRSJOLC}Hj%l7EV;D=9D1YNKt_4GHdPY%aE?)cC{IhaX^ts5GR9lYwWo(+w7f zp8_dchrw4@GxcrUQu2)3U5hWL*cAw)n`;j*9^;bCI6T=M?H7o4Yb{u2A^!fPnOkFt zm4~X%BZr7qLD?Z{aJ8A%+?;3cRpU#sMzLy~0d`Qsb4Ts(JgI)>cy?ozW`q){lp%Vc#V3Z@G79@RSK-oQ$Vo z1$u8fSF4?RJ|Wo`Ol)LY@VFw^qg=V%?@)paie!?a2 z8Y%Z`M(uo*sD6L@ms%x=8KeDH1$*T8jb$laTElgJ?K{Ev?#IBgz*@Gz4_?qGwPka6 zHVWHhZ6xcEQUcsN0NK`=PfI_Y72Q%?fv=$(QHDx;iT|l|ch$kb6BVe~_*O;>=J&62 z3dCMh;i{RZn#!ZMZ?AFbLs>|M^Ud|27Br}?j2oXfz`2^~`8@o9mD62%Z?eYHN)kqY zIMO*&n@df(6w7?eA;)h+K~H}1|FwQx!xA~z#RZ&cQDXjN{eOUri+{eI)e2tU7g74! z7l%DRGhZ5B2;6c)@#e`{WFVi4audT70A?K5fN8bfzda>WX#R9INQ#YI-n;V&tbxd# z9}iV7;l~H=?Og9H4vWQZGS|8|+?f7&Q+IAeRB;{rr+?gSr$)>=ccduiJElN;_N?>A zB|ZHp5H^~`&*#`Sw)Q#{B&*sz6Uxf)dyxUEy|Bz_j_yRwbO?=@)yFPi`hQkYLG!*?p#-)SGSAv~U+1(NAcJ8jU~62!($CM66J+6&Vh9$ z2~?E^m|iH2?;7FDjf=KhkpNA~HZ#gSiyq1QFS)J-<_l+xmQ9pa6g`>AR6uz+%sJL; zjB{s`T^6}pa>~*h=?25mxu`ltnzCyJOGjp#9I@PNcYNv(o}&}fU>H+%to$r?LG!SR zv7oBa=R>--m254{bj4DKeeO|^lN`*7v|00VE7s696?)yi1K6vU;)I)2HewsyS? zfmlIWc&Vg>1M~j}P`~P3zX5vXi+Rpw&HSdU8Jg(N?>0&d0ODnY`^)n#)ol z(HPD0t(Xy;3>X=Hn|E^WEO1)Q+^8I2!ZrN|b#~X!U20ENDm(q?YZv1wA0a*{lVdMs z!S84CG*ctVr@^vurOFIPYw+<-IriXupo;<|ZO?a4mveTPcaT&irL$u(pE2U5|LVGE zDRx2jutI0>aTApP!Xx{Sk7I?Xyr2b9rYPyvX-TzCJ%-DW=d3AmXuLXt7ER_#CtUZJ zYZ|b?x3^7dp)ZGVA||Bsx5%2dvDLj(JC^Il`2EHHfx0wDOgY`zh4aIorM9Js*a>vi zQnERl+$uepq!&(Ow$}9$)fKz&z&!H^f4%$rkI!FRX^W95>1~PqFr_ir^^r|+@QXU+ z^+Fx|Ympf5evWoWe(Rk&dP&*Ll$qqqc4S(UZ2*`z+jAIy)1#?9+gdCjP3zh%D5^}Bi9W^W%O*HBf|Ai+ak<}L&7EHgwt_m7 zjas$AA=~q11sgWTrTrv-*TRB!VFqz#Y+amd98K9|O*&hflczG+m3Hrx=z_8}!czS= zJ^I}8^Xk#Qx_88*c!lr=zUXgOMej?>)yc_+-`qY&U%B;d+tW+ixFqC_`+-P4DMyq5 z0|SbVQ#oCzg?}41z1-8$gql6a;j?n?xNxO>`Z=lAKPl#OyJ3kftEIU``{DvlyaJ`N z`rvpOqHY4KBA|{5NeM5`#jWDEbrHE}qnq#!e6TH?;d8ahgK%b zN{kAMI{3H6l^(wQsTekKa&#L)8<^+6_>vJ87w-e>pTqpdS^t=liDUK#5M-SHBrP}t zZQXMscY-KS-%lC)BBA{6Oj!Ur=(ylLd08NAAG@h8ri-gmW>pmt$o!VZy_Ut2?>Or- zxP`k@oQ{bXvT!VHl8imYe?~KBDvASJQ&VN+M#@N@}3?NzVy>{Gkm+g7)CVa0oFtU9MgJP2h>cocM5I#I?Ap$XmRmp+cEmng<-5=9BJ zCgB@50}UF=^NfJw)J&V!A&LhGid%Vd{)Ke z+$O41F7T7!&sQQ_jww@oXy{JbAjN08n}ad|Be%Db&o@#{{v0mJzH~#F$yXCYH-?wx7&jpV zb86SGgI@+@c`2Ce7kQyLsout3-`?m*#35o;bI|<=8CHb=bPuXp`!;$=epVqvN0|@7$sNqe7d>XaQygIS zM1ATBzYZ@UJM@EZrEv?lazp!p^E%GUKYSo?V_*NJh z$xX-;vb0y5qhh>)>)LheFu|n)z%~UU;N6s6q(%Ripb@L@PpS0kx4BkdtH~SyfRV?S z)y%pqvjHcI+lmv6pla#Un-Kl2i7A&C{M3Xoo=}*W*|1bPL@rkKO9}TOdP0@|Cye7E zbdkFRYAp?81!UlUHf1dQ+G1nr;SY85l~mJ4)#ytp`Jsb3oI*Z5e`nEz*Ri<)k`uQ8 zI=FjPQF>;fd4N@tVl~KKSG)iBVX0}~SwvY4zY7f;Nkz_#1GfqAW|L~Bu+f*!)5E1@iFl^?%qAh`6M#pTt1J<} zkSd^yaVZR!<5N!bu8*O6miGXIfTzm?*zn|p z(_5UvN@be(MkH%P%SL@WhG}un2KfPcRZlQVHujae<8NL{ikITifG-cEv(oBkokAz@ zxhKQ@@9#YE&tz4Sf+Oq8eALNzveyJGW@SlOJ%XJP)G|cTI&1+wtH$`UqFqgjWmE0y zxy6q^OqPX2!}@+-?)AF)oO+$K4oF!LkeRxh3x=p}mve?%WU)v_eLdnzHHgI@>m+c_u!Ww?$>cC(!XhQM$kY z_UvGuJWj48t{h!VtT^kLGe{8;rhxt6)AJ(FL|32Z)eSC1LSV#GA%2j{x);R$}O4RZMO!Kl#^*XTM7E5q; z6X~ksb}EUqFy&RZHE?r8R@!8XqFnQ;PM?Waf0z0msd4}LuzEVo)Wn`AJy&exxg^U8 zA*xBc*`QpDGDb*cddRisFf6SLA~Z08<%$d!$@OZ9J9EW7of6SNpYXPjo zX8Hm{ovFfu507!?&-!huc26|az@5c(C_8hj6{A>c3zQ)Kmd^Ea4id-j!}DY;ZsVr1 zgJu>NHLG3Rv04I}Qf2cih_egMBPaGIX}zu!$|C4ljih0#atR~e;EUYj z*A}%lwJK;bAgDds*Z7{Js-bM@I`2MqP*Gbr*KO4BT}J!Y=jqTi z-q`9uCs4DeO(`S3x-Gq<9R}*Lj#FjLb60auXKXU?9N)X~(pu+unf<2bEWe~OA;F+A z#vRd#ypX26V>F|vioqmRTjV$xE+76G&bry{!B5xn3#WrfdIz_5#xDcPep=G69eomX zTbJPu#&rA1jJu)gs>#p5fqt!+X$dfgTT??!%7pqp#yW*}W&7*`cau2+Yb$>-$#{0L zb#N2;9SaUEb(OGr9`ku+oefe>cYYjoiIO<-13xQO~-+1tI0?t14@veZ@{ zRUTvv>`Lpc&v(yZBc&$}`TiB3J|w&hORKrJUzG2qc2cW{vHNN*?-Qd*G%_0~4n)-P z!M;1YFuC*UN?r=qI{09exo6;8O71>KF8Q^S53><6jcMiEd*cC|r@6 zX1mPOn&(zvlCv~SmTBm zIm{YT2S zp6IRrWQNJ$Hc0@Y@1@$DY5G%Zs<>C4_exkg<56q2PoEK6mjP!#rL0B{vQ1`o8)5Rw z>QQX^8e~8|lxz;M5gEbX_NyP&cI=PyEw&%e!(Kxy-o<(=VLXVp7k>p6`Le6>%|$iI znatI9jHP%dG>%e9$<+boi;T;&skAGA91@n(d_W%eXZcUyDNQq3?QI_=E$}+JvG(?T z_%A89sTIxQW9~A(+e3US!14tZyB{jYrmB>%5?n{MD|5gu6;!l`Ivv4&Wzx%Gy;aLj0I@P7fQaKvFv!T z-PN|tBc`Zk(rG+=1-o>#;gQX%1Ig|peBaoBL=n+G?OCcR(a3jqq^qF*ES1`rHWR}N zugz;jvC@X?N3;8dhJJ(nh>OAx_g!LMKxeg;gJm}k7qTi>JNV=^43Kn#zd2xWC zITJ|~p`m`)qUe~TEli6Hw=Oj5_eDB|BuTpTvE=25kdvzY; z@Qc<#)!2fK!C0M2AUc|@RSHuBHCbJFj zt7EAF;0&s0e(E{Qr|7Oc;V^TQ0Bwd-ffH^Fv6RioBMlJ$*A8}QnN zY{*%NP=`*9NQ?P?uHi1(3+w!xZ63sOYcH*XDQ06hKxc|Mq^~@7H`j$1A&smOb)()# z!$iqz)Y&o(jdELy>*@EiKE|>V{QaOVAzqy~l}RITxs?<7I<3+f6ZOcK2p7AyGgi}i zR~lPCEs}4^YxSOw79JIF4EA6J)4_kpFoIqtxbO7Noh zqkF-FzoS(^t}l|;oY)htj-69%ix1lf8xw_5VSS6Hy-`gu0wa>1QvS z*nbLRn(FjkU*Pn&T`6U)205Y3m!(2AUX%{xCHeo0!>O(BiB?iwC7&wo!_ET|W)__D(N8@Q_rI zgo+GQ%jU{i656NDhi{_=tXEh`U>Ho`lrca*o_Y(RTA0myro64!7F$H0G&)H;0HcMN zc0M)pSp4P=(ambIOrcYtuRa$z+J@bP8;5i0mzrq`^keK+<@UF#l;x%fF9*HfCN5Xh zRwB-$m$4ri9^tU-bBHk$ZP&pm>H1EM?XExM4B9JuX~4<9^*y&75XNm>?l(DkDtGYA z=M{l2M<`+T6WnalKw%yO%xlQrB z-@}mRES+5;geQYWJd?PRsDh+VY8G`VFogtfp5SMY16S780&cYKxe z7w~PK6rr2nwjzEsWw=7WKwAj=r|b0W?B31^b=Je&15g+%$Cu%GH0Fp>nm*V3yN~@5 z(k3tOaf_3bWuynz0-PyBvh;%4PLxaheIq~iM%r_QLj$tC5!V@eDQ(PK`=rXh;j&sr zYk09OQ`e;Ns-$x2Q_ykqt8tcEx`ookeEWxFF2`5<)!Hd}6wg+o2$~L{DRaBqS?Aqd zGoUQcGH@=Dt0dBOu7=m$qEEE(Q`kYq+rnmFx$WH&-oT#8L|qT7x6UM&f)m?>`aQi{ z2S?@cN%qo<4?rLy6mSQxIOjAIOfaeaTq7G;$o6_3Zj*D>{gDlk-pq=R^$0dgPIU7+ zaF|Kes{*yxAEXf6kJz02_p5N+v|1|?fXBhk9bs);3hktb5+)!1+E!Y=_>t81Jc4E+ zBLWWxcGEJa>?sEy+@4(G90HZ!EBJua#})I$Q;1NCp7$^71!}WYbiZti5Ry4v|1)M0 zgR#j)Hf)EO!tlv6J|;L7S&a}ulN@|~Ib9(qc2V&_FH12CmbAlZN0fW~aY~Iz-)h7u zQzO3r2O=M6OC1#1aC8Wlpd?G1q9vu3B7L(B9j6Gn_}}s}vxC%d{@PL?UVJC@jb9#C z=#-90Mm=aVaTKS1_x;9^cyT?!I27xC%5opDzjRelRUkyHXG6YOl?iPkelnQ<8p_JFsC|jJt5R^?Np_ zPo$b+$3NfK6`ZfHQ)`w_SFjkRkinyhv&iad5O~Yol46B$z;|!5$v5Ec#>6zxr)wY7 zsmJ38boR{N*u< zV%>-wZ52n6KkfJ2it<~#A^tS-bk5RJSnwaj#rx5@c)+`|noK$uX{`gL%A?l zq8`EF!P#}-6xl_)Ne4Kel3C&`Ch_?xXhpqAlq=b%iy z7`awU<*}mEQi#WgQ>hV@%d&-gxP>9bO!*aq|DZ6XvJG_>-A5_~gOxu82J{sAXi_(oDMdRMrJZY+;OP>Sl__|joY=Co?%=R;xehpbSV zW6ph~Dc-a)zqL2bhW@dP;F?R^+gZ}lq^f7;XBx@CAS@WXSxPM|!sY)Bh_kj#w*VR` zx}c!zjGe>bJFP~)k7!e2<1b%p4(lvpyj8xJ)m~+U_`0cL+uF2<$pLi3|KAl|u3#IG z-h5wGP+>_Iq!}SwrWaS?D6Vdej$FPRk!;oaODspzy7&KGh>s}=&lz4=)w0&IBh3m) z6%16$U||XR^?#bZ0o?v_PaIXdxymlNmRCO)X{sz9E*R_aQ#AJw#;Qn#%Y_8r;#^F* z;N*bJpsl3tj`Y7Zj4snkK(R80#prU8}Xiv+DjNAlLYCr=)469(Ov*}r~p zqwrGVv`MjV%pj9={Z8vhS-@iYdEDaGAl~#@X zUK(ETrdh_}hkKXr{#$#PX!vXpXh(Wyc_{fj^g#%8YyX4dyRzvgTqpJ+vS--Q{ZIo9 z<)QmIV_uij(HBfo!~RelD`P|?$@oENXhls9D1NUlI-|^;CdN^gjyl!8`yQ#dVxjN*KLm0eobz-zR>6U0;JQT(X-#_J*zOA{0?AFdeMt*$YHkLLF&Opp4+uB>Dx z)ngN#C~v#=B2la`wbn=S<&WF&6CTfy!G?PeXownu4tdH4)kQ(9qb10bqeeg11RWQ1 zbK?1zI4WC|x0YhyR^eSksfyT>5O>Mv@vxFCXa8lFS;d=t5vX73g2Z>e;oNsL@5Ye{ z7y=@gdEUTA4c{K>Hr%7AV)NzGm2`- zJU}FA_lf@2SMIL%uC@Rs7UZSM#F_a-ZZpq?ibC`GnqHzovJ;S^@eK)(BqVij@4UK{ z)9An0A{3L&>p3Zl>_T$Ch%(R0%Jv&I-p0AIlZaMZLRZXJWjdmtVJcR85Luw$vU<=h zd!(sw-|4y=6xU6eM(sdhGAPzi4Xez4?Eb6mzJ#`!0Y}*H*0n5smr0Z0qS#mDPkwdb zt&i*D{0)SvbWca-!JwhXNHf!NPAC#xdI$zk94d>Cz^obT_^MaHA0r0?*ZXIP;|f+BXR);{{iV2Vwj>`;y5M|C#i+x6cMK6~}8w&jLD z8m-HcbXT){VbMk122Lr#s`(;d=G)K8Z}H9<2t_Z#W1 z)!RX$DZ?_lRg_zf!1fMoVsQ9;9YsGBu(v$8Lq_3>KdxPzfO1C1ST;;|j^SG#QU_)0 zm6wAFJu73bYcLt`LX@tD9)eIdz53zZ921m|DthODd)%O}s0=$19*#PD5j(guv}%`y zsxYz?smj2=NC}H#`qlKp{61gGb(j5Buq;!m7bZtX(ohMB!Z2vV2!wr7ms$_sH zAD^+{@FVz8j(AaN?a;j(Du8JrzJNyrJ6$2S2OSx4+9zZ`|I?RBVgA*oj*F}IlJ!J= zRO7XXn-Z}Xct#{7>SZe*Rq4?PKWm-ncRfuYXIi@>j3ijuQGw{BvVy%g12E_NoZK+y z6rK;op)x*JYLnU=0f716_C;5vsc0-E<#RNPSm&+GBl5qWS;u4fr$Taa5?2Wm48Y5t zqL1ErzO;PKkmTR64IW2V5Uo<2@5xo ziDK)DwAFtolgG zRw7Td_`basPe(=J%MOJL@{CZ)b5^vDyZvN*teNNFX{}fz`K>0clkDZ>?6Xy#K-03; zZMbKEz)Fh<`5y&3;*k=1CG2lsDWLS?-FzyLQCRM#{3e>uXkd;k>mPD^@$x>_PyRwp z*(v%oM7GIJF@;7nTi2iRb=Mj>*c5lP$#@1glsXRy*1+9JXvVYx3`$LD86!TizWeMI z{O$AnuTj~r*ff~hh>O1&^^)28MlaFV>E*}CU))7(e&HIzoPDKXawC2;`31JcR0ZYmLRPz@U?2SpicPmqZ$Tl$jjY#O~*%8uD z@=2qsE4ug$3^mR#s!`8@UoD%NF}esaWL$-LYU+QC|1z;ZXp9?+q6o48gp=-fE(NQd-$y=u47tT>Movy3G){o&z)w$13u)J<5{Z`suL+u|TYJvWDUJ{r9jI6t1EA*6Y$1pGD6u-sBE_{a+R+Y4y~(hG zl)=G7Bd7bL&--5QRyBy}pcoN3p!8+?g`P%!H(gK8zboo8gSPGq#b_@jrP4z?T6Fx8 z!1IZ8*FPVJMoNZ+6P%kfDf_g}V?CJi(0sRZ-H_JN(fW^BnBhH&{(B|WvvkluX&ll) z-DtT&46Y4#yV1`wR+)*Oi~_znVcAk(TB~YQsC-cT$)X`^$gD67n)oCceqYr~t)tez zLL?-?h@0J56$UQp?eivmRLo`p$1-lCCgRe`%Aw6yN=gUZ2o>4eJ>o{sIFYew>#HjDEG~?mjM#6@YnOjNG zDnTo*iz-};UM@t_OpH#&)?2>NOAm;)qZ<%&| zH3K>ReOLZrFZk05YkSB=nq~x+Pg$Q< zo_|n!S9q&Ve;#3<%u|I0G;wjQ{F-Ad2sgXDdL)nq7-2+Aun6v$?Ud+St%ZHyVKN^E zrg0uC>RI0FcbMoqdacn=rHOPY1l_xF+q?g2vuxW!LpyKz=SsFGF+@z)48oDyGU~N9COAmlx$xPdzggTDq~R&=UB$BO8&cm<$awDx zSC>KYaL?hEe_#0>t^Ft^@9Ht(Gp`C}2%}}YaEm$x`MaVu)#%hJhasc+4< z+}+G4t$3#+{zOGsQW4OH>bi4~PpY_|bL}f+C#4TdMS|Eg{y^$2KQP%kBP!`+Y1OFO zJ%^#KL+_)RF}#n>fj~4HN&Vp;{Ht=;Ia!CQdzp4xk6)WQOMsISYd+z&;sv+#rlud> zoAF8sJr= z>NtmF6!5$MXi1z#o3pH8$T#E-iU%}YJF>+?*jXE!E9KQOVq$1mbDAr85)jo`sW8*f z`Jr;uZK{H>573`(ez+tS5ou+k1OppH_nzePJ(S8LObF5$@FwPIHA-dC0t2gV-XzV$c`V{kAMJR;EnK zGAs@Jw_k5uT(umzCBHW+LYq#**D9pjHw4}`Cx_rk`BSqWom7?zRPyn-8tx5#nzQ?; z@zJKJe&m!&Wm{wZb8H?q&qUJ}#BPG8;uw%RPSIKORDss2L?qcyh1JJ&gXT1EnZh75 z3x5ldd?Y~JO%ofkUx4@Q+_x(;V#Ng?k4#2u;@>rzHUQFr2u;G`lOzM&x_~vkg~Bai zr{{82^H5$o`X={lNYB!{w#oWx;Z!meoSd5=w?3WomqF1@SeO_{Y1Ih*PC@MiE}|Hu zAiUD(5mDigR_&^*2J1o zi2xW=>`8n9S&U&W%14WKlckm+QvGa5j)%6IsqRN*QUgOT8ECIB-K^)5%}n?d;2Spk zKh%F@Cq8AcK&9W%;f- zca+>KHQ++bzmjv$#a{k4BccbPbg-_Wet=Tm{{S?q!z8h&=44Qf1BCIOJTDf1#>m!0IXPgLg%6zj4~ zeXAZ!!q1x`4F`716K+wGqH!e=K;OZy8)8+UHzGU2%C^|`4HvgS6or_(M`Y#N#NG_T zWe&zoo%0ZQR3xFJIuK|s+D7S~nqHeeoQLQ`Bg62;XcuuIhj?buCXZKJ&mEnPwkWs; zzY7nL3Il=G=-TszM76dQ2Ebky$F(o8${m$LB5h>(Mmarde#iE^1W8%Y`n6n30|*Ai z{VAXgV}5y;YFJ2In-lu8u)$ryYmL3IsIuhh>EKtKrD^}8C|7MWW4edOSD7SjU1VW4 zNC1H4O^_6Fo6hn9k$Rnr#(r*zy}Z#B`*7fY-LbU~C?3L|o42b?7=Rzgyw~5BbW+ zW~v$j6&Inu=PB17oO+wB+&dlR)aZwnoR^~Bmy*}fTBpxxzfxK{Zp7@m?J@dWU;6vpUx5#8h&G^EI$HwmlKJTr{aba7O>-si{TTaJH_pUh3$&?$TC z#t{iNCGiX5M1FVFPh?t38l3sID zx3%L2(yyh=p=Bs*C8P@}0U}b8Wd&41z7ZqMF%=Wd+p=3Gi?JXD5&#@%=*sR{v;xNH>B6( zaWyybdy>lP&T%D-^GKi_WocD)$u-fVg-t=0C0jKi(^A>w{kd>r*<9J9`EHr(qCH!9 z_Q@g8B5iC2zl#C0kWH}XphWh&xGXp3HGfvA%To?Wdf*dogG?kj1zyq!gn{NU>bTpm z>j%zQQj)>I%5U7~?-ZLe+>SghL*F0=an8=(Aa{>VRX0e!Q>IwwjX#p{f!@WElaY-> zevy2ei0^1(IX*mguu=i_yqzMg#LO!6d={f#lwq}4yNcI5MTo=Z@K3uaO}!GT zjh^tBgMROx>}Q$7UF!gblG6kpV$pDrusN669mWF78TicMc(X`VOSgFFAhgOh%SI~l z%(5*5$B6}e$$AkPxE}Sf8!jIZ2AZ9tkFO70+heRmtEmW1OpRgK+ryj)L0*AKQu z%!Lw-%pE1J=T^lyw1*zo4!a(cXvd#E?dqJE|Fvi?#EdLb3wc3q@%c5>8fa8wL4O*Q zidi?vy7&x1zD#`yQbC4dEy59VFfv*ZX0*!qp@I@tOZ7Wd*8S`%$9L5*sPlzoQtuQC zgXTaqDE!O`TzV1szlmuwWs{?of9-p@zTfVWW%5v2Y1u;-9&tfV<@ei>%QkzP0#737i1g&WB!zqExN7*|2I;RhQ%V@z z&?Ib6C_L%(+ukyKj*u;V$CL_pXP9!OtFhgZIvAt;&!kjGSMR*^y4tQ(DCtQ(9=+F3 z^M0Ew;-^(vHZOKbHwuhLp&e&bUUiz4c2=JL3qpd6Rh}vheGqH=k_0j7Bkotj7j!KH zqY7hkL6y33*t%LLYnsU8E7oH`u3wrB?#9NNdJwlq*9g9^(o_?-1ZPCdTv9e{ZM2p4 zPMXO(Ba-_tR3^Oj3g(tEoJpf1!=R}7S1#j_7)hv9XGRWf5WY5$IX+7h+*q3v}&8ki+~vMv^EoxGBXd+{b7~ z<77lW?CtZEa7G0CPm_!HNkst4h$DhO#^%&ai${r9Sttz%K&G-AX(nZI^5UTUY#nFA z{w~eHB-u}ifi0SJ$@$qDR*7}JgB}mguRT0peyxeqOVqD~3gyta>wmFC!bjR~gHc() z9PeYmCL?q?j+BSbg4Dt{@7}K(Ie%&v{6$u=H{Z3savR{C=6*__|n5Z|^+WjuD^t;qewU)>%Sn zw$$ObaZrb*wG;AFkEjbO4Pe?Z5Uf4AG1=#qkW>6AXw$o&r(;~$Rm+Dw~Xb@=?K)mg|zsqqJ!vI;zN&iVt#k^-64^-dj+ zQPrrJ3QyB+}bn9h1q+?OK{{)lFQtSnsCnimnBO zmUSft?Uw6@F0vjRRG+E@X;B*qZD9|q0OJ%Vg7%}uG>#E$8p3^vA=MXykpBc0E@0bz zDFMcWjn9_+Vjm(f7_un7~~F&e%M9VA0<-<2FiBdM7Ju7A~vkm$~>7K4JDHej6> zA%kBjSq1p->v?Dlo_}j2Wdz;rS{d9PznCFxpZ!~LQ{E^GC8vw}bu|mGobb*6{_y(v zU$txni=NFbOfZ^UB2RCGb~m>lmkG3;2g6Tu$*of&&D8~X+v)6BSmcP{bX2qE1L+}G z<4pqdp6b~aLZv2V>nF!Tl!HcbA219;6hr5zU!Pe?yAcGnM_S(c0QX$EDa(9ua`gA*>5|NQz%HRPKeX^p#Q*P8x3 zQTg<$Ze#z*or6KpPLKLxPI=p0IQ!`a$=&<9%X^TxXmv4zEUgMW?i2|fIzK$+3xOYB zU5r-d6nA|JgDHvj4hnp9KksE*T+F5k`4u$T9~gWOsVaTAdU9>+;}9H9I=)|*<9T$x zr+J;5>jz%Zvved1k>h>f$AKGXev(c%ROu6~lNRom&q@!MjHFY~7BoYqXI6j0t3O#{ zQPWwGEU=Ov9obUO&`;@~uX5%c(38*1a^ZSZF;B@*{ye^67$=$dl*iz+m+~d5 z_sQczFWS!a!>jCv43R|>e~XR4)a<>~9|zEvN^TB}0@3<$JO$bE9@L0IppqW}X=8W#TdkB)=!vDbN{p&54G0VrZUNzQqH(RFCE9~oboLv|1w*ue!LLu+$Va<_ygMB5ScH_Jg!IbV*JM5~j>@CG(^F1SwdBa~I z>niI_BvJGB=enlS_wL8)ACLdN7Ll3%7|A;Jo=mG(8ib`lLqAB>!h4`yo~ZCI&PfP& zg6c3e(69V<1Dr|g>Fv4^ad!NqRBF7n?@eh`*L>GC;G}Q}-?pWex@?p5shWMeH-G*7 zSyLL+VOfHfrQ$9<74TudlzcE*t{_cBKEoc$+_YFJo!J$`?GeoCG;ALeNE2xsUxkyf zs&1_(zbeHj@*4sPGvwNkd@Jfo--?qhsEQqPUo--M#iGJjlmLNVLPwaN4wZL7if}7K z+EP$a^)uJ}QX{^WqoE!LS^BzJ``kBrFI2K;%mNuh$_e?~E#L?a9_lZ9kPbLRf;<#ZSoO^5&D3pR*b9_IQf3=W>tRa5Ym61q@MPY^L)@3 zNFQ1)V-twfgitmw7&BEvGo}=F^DebYR04!fCM3*-<>=O{gJKI*ZwqCL)%{? zsEn;Fz6JjPkgt(#V*Ph-s*$=jH~CG=A{}5=-n@~YG9ZpOAd7dY?%$F0Enm-=OZ`Yi zw)(QqVF!3KF4Ia!%11%B34;*A?2n(HNum0t(WBRLC)YpnzE7q6r)n#0E9FJQ@YIej zEG$SeG3>svbI^^|1Tn|YG}k@pEadx%$K+&N{!3$ z3@l~)JHe24!BnO$%38D6b}&xKWxykgt@@x3e4&G-w3p3g-C zblI|B9HbIZMNDakks~36AJkzyee`4?Q)q@}2w}n7oeqjs^-=#ldU?9_>ATSMAg~MX zeW<*=MMe=is(~aa4c7uA#{#3$71+NpQ+V6%HjCt*>VM~VUaUp~H|RR>xPxTn#&Ni~aU6!#)L{>~BLeN2oU zeQZy3*5Dk!KLPm4e%iV*zad1whEWHFP2q45?%5*47`qo$L>#&)md7ktQ1O6qR`mpjMPCDH#gS z>s=i@2UTB>Pwa3|aPk^?VIBA;yerk;Q>)3&IL^ZKs)dh#ol zaK{CZ6938`ANOg0%(wc!2#o7IFlpnwi7ir#NI->1@g>6<{ z57%ntHH^s%t|oirjTXhp-mt2gPN3wsh;N~P=iAr;R6n9k9JGkpLe+d97bT4=7b@!} zrk+YneE`-0@p@Aqr-n_QI=<@p9{|4ncQ^sGPa_pF1wT;>v}9>E<⩛TtXwH2N8q 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

Wf@+FD?DGvA4he?g#aN51zy(O$Xy! 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

Acrih5KDW9ugPSk3y-@mXy^-HnY=Jp77llly?k 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 { @@ -174,7 +193,7 @@ app.clientside_callback( """ (countdown) => { if (countdown) { - return `获取中${countdown}s` + return `${countdown}秒后重新获取` } return '获取验证码' } diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index f3fd77f..94bed94 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -41,6 +41,7 @@ from utils.feedback_util import MessageManager ), running=[ [Output('login-submit', 'loading'), True, False], + [Output('login-submit', 'children'), '登录中', '登录'], [Output('login-captcha-image-container', 'n_clicks'), 0, 1], ], prevent_initial_call=True, @@ -145,17 +146,17 @@ def change_login_captcha_image(captcha_click, login_success): return [ not captcha_enabled, fac.AntdButton( - '用户注册', + '注册', id='register-user-link', - type='link', href='/register', target='_self', - style={'padding': 0}, + block=True, + size='large', ) if register_enabled else [], fac.AntdButton( - '忘记密码', + '忘记密码?', id='forget-password-link', type='link', href='/forget', @@ -172,18 +173,14 @@ def change_login_captcha_image(captcha_click, login_success): @app.callback( - Output('container', 'style'), + Output('login-page', 'style'), Input('url-container', 'pathname'), - State('container', 'style'), ) -def random_bg(pathname, old_style): +def random_login_bg(pathname): return { - **old_style, 'backgroundImage': 'url({})'.format( - get_asset_url('imgs/login-background.jpg') + get_asset_url('imgs/background.png') ), - 'backgroundRepeat': 'no-repeat', - 'backgroundSize': 'cover', } @@ -205,7 +202,7 @@ app.clientside_callback( Output('login-username', 'value'), Output('login-password', 'value'), ], - Input('container', 'id'), + Input('login-page', 'id'), ) diff --git a/dash-fastapi-frontend/callbacks/register_c.py b/dash-fastapi-frontend/callbacks/register_c.py index 30050ad..554be52 100644 --- a/dash-fastapi-frontend/callbacks/register_c.py +++ b/dash-fastapi-frontend/callbacks/register_c.py @@ -1,5 +1,5 @@ import time -from dash import dcc, no_update +from dash import dcc, get_asset_url, no_update from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate from api.login import LoginApi @@ -50,6 +50,7 @@ from utils.feedback_util import MessageManager ), running=[ [Output('register-submit', 'loading'), True, False], + [Output('register-submit', 'children'), '注册中', '注册'], [Output('register-captcha-image-container', 'n_clicks'), 0, 1], ], prevent_initial_call=True, @@ -176,3 +177,19 @@ def change_register_captcha_image(captcha_click, login_success): ] raise PreventUpdate + + +@app.callback( + Output('register-page', 'style'), + Input('url-container', 'pathname'), +) +def random_register_bg(pathname): + return { + 'height': '100vh', + 'overflow': 'auto', + 'WebkitBackgroundSize': '100% 100%', + 'backgroundSize': '100% 100', + 'backgroundImage': 'url({})'.format( + get_asset_url('imgs/background.png') + ), + } diff --git a/dash-fastapi-frontend/views/forget.py b/dash-fastapi-frontend/views/forget.py index 73bfbfd..9d4dc95 100644 --- a/dash-fastapi-frontend/views/forget.py +++ b/dash-fastapi-frontend/views/forget.py @@ -15,74 +15,79 @@ def render_forget_content(): ), fac.AntdForm( [ - fac.AntdFormItem( - fac.AntdInput( - placeholder='请输入用户名', - id='forget-username', - size='large', - prefix=fac.AntdIcon(icon='antd-user'), - ), - id='forget-username-form-item', - ), - fac.AntdFormItem( - fac.AntdInput( - placeholder='请输入新密码', - id='forget-password', - mode='password', - passwordUseMd5=True, - size='large', - prefix=fac.AntdIcon(icon='antd-lock'), - ), - id='forget-password-form-item', - ), - fac.AntdFormItem( - fac.AntdInput( - placeholder='请再次输入新密码', - id='forget-password-again', - mode='password', - passwordUseMd5=True, - size='large', - prefix=fac.AntdIcon(icon='antd-lock'), - ), - id='forget-password-again-form-item', - ), - fac.AntdSpace( + fac.AntdFlex( [ fac.AntdFormItem( fac.AntdInput( - placeholder='请输入短信验证码', - id='forget-input-captcha', + placeholder='请输入用户名', + id='forget-username', + size='large', + prefix=fac.AntdIcon( + icon='antd-user' + ), + ), + id='forget-username-form-item', + ), + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入新密码', + id='forget-password', + mode='password', + passwordUseMd5=True, + size='large', + prefix=fac.AntdIcon( + icon='antd-lock' + ), + ), + id='forget-password-form-item', + ), + fac.AntdFormItem( + fac.AntdInput( + placeholder='请再次输入新密码', + id='forget-password-again', + mode='password', + passwordUseMd5=True, size='large', prefix=fac.AntdIcon( - icon='antd-check-circle' + icon='antd-lock' ), - style={'width': '270px'}, + ), + id='forget-password-again-form-item', + ), + fac.AntdFormItem( + fac.AntdFlex( + [ + fac.AntdInput( + placeholder='请输入短信验证码', + id='forget-input-captcha', + size='large', + prefix=fac.AntdIcon( + icon='antd-check-circle' + ), + style={'flex': '1 1 0%'}, + ), + fac.AntdButton( + '获取验证码', + id='get-message-code', + size='large', + ), + ], + gap='small', ), id='forget-captcha-form-item', ), fac.AntdFormItem( fac.AntdButton( - '获取验证码', - id='get-message-code', + '保存', + id='forget-submit', type='primary', + block=True, size='large', - ) + ), + style={'marginTop': '20px'}, ), ], - align='end', - size=10, - ), - fac.AntdFormItem( - fac.AntdButton( - '保存', - id='forget-submit', - type='primary', - loadingChildren='保存中', - autoSpin=True, - block=True, - size='large', - ), - style={'marginTop': '20px'}, + vertical=True, ), ], layout='vertical', @@ -97,21 +102,24 @@ def render_forget_content(): 'content': '返回登录', 'href': '/login', 'target': '_self', - 'style': {'font-size': '16px'}, + 'style': {'fontSize': '16px'}, }, headStyle={ - 'font-weight': 'bold', - 'text-align': 'center', - 'font-size': '30px', + 'fontWeight': 'bold', + 'textAlign': 'center', + 'fontSize': '30px', }, style={ 'position': 'fixed', 'top': '16%', 'left': '50%', - 'width': '500px', + 'width': '480px', + 'minWidth': '420px', + 'maxWidth': '75vw', 'padding': '0px 30px', 'transform': 'translateX(-50%)', }, ), - ] + ], + id='forget-page', ) diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index 964ccff..267319b 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -1,5 +1,6 @@ import feffery_antd_components as fac import feffery_utils_components as fuc +import time from dash import dcc, html from callbacks import login_c # noqa: F401 @@ -9,202 +10,274 @@ def render_content(): [ dcc.Store(id='login-success-container'), dcc.Store(id='captcha_image-session_id-container'), + fuc.FefferyKeyPress( + id='keyboard-enter-submit', + keys='enter', + ), html.Div( [ html.Div( - [ - fac.AntdText( - 'HELLO', - style={ - 'color': 'rgba(255,255,255,0.8)', - 'fontSize': '60px', - 'fontWeight': '500', - }, - ) - ], - ), - html.Div( - [ - fac.AntdText( - 'WELCOME', - style={ - 'color': 'rgba(255,255,255,0.8)', - 'fontSize': '60px', - 'fontWeight': '500', - }, - ), - ], - ), - html.Div( - [ - fac.AntdText( - '欢迎使用通用后台管理系统', - style={ - 'color': 'rgba(255,255,255,0.8)', - 'fontSize': '20px', - 'fontWeight': '600', - 'marginTop': '25px', - }, - ), - ], - ), - ], - style={ - 'position': 'fixed', - 'top': '20%', - 'left': '26%', - 'width': '430px', - 'padding': '0px 30px', - 'transform': 'translateX(-50%)', - }, - ), - fac.AntdCard( - [ - fac.AntdForm( - [ - fac.AntdFormItem( - fac.AntdInput( - placeholder='请输入用户名', - id='login-username', - size='large', - prefix=fac.AntdIcon(icon='antd-user'), - ), - id='login-username-form-item', - ), - fac.AntdFormItem( - fac.AntdInput( - placeholder='请输入密码', - id='login-password', - mode='password', - passwordUseMd5=True, - size='large', - prefix=fac.AntdIcon(icon='antd-lock'), - ), - id='login-password-form-item', - ), - html.Div( - [ - fac.AntdSpace( - [ - fac.AntdFormItem( - fac.AntdInput( - placeholder='请输入验证码', - id='login-captcha', - size='large', - prefix=fac.AntdIcon( - icon='antd-check-circle' + html.Div( + [ + html.Div( + [ + html.Div( + [ + html.Span( + html.Img( + alt='logo', + src='/assets/imgs/logo.png', ), - style={'width': '210px'}, + className='ant-pro-form-login-logo', ), - id='login-captcha-form-item', - style={'marginBottom': '10px'}, - ), - fac.AntdFormItem( - html.Div( - [ - fac.AntdImage( - id='login-captcha-image', - src='', - height=37, - width=100, - preview=False, - ) - ], - id='login-captcha-image-container', - style={ - 'border': '1px solid #ccc' - }, + html.Span( + 'DF Admin', + className='ant-pro-form-login-title', ), - style={'marginBottom': '10px'}, - ), - ], - align='end', - size=10, - ), - ], - id='captcha-row-container', - ), - fuc.FefferyKeyPress( - id='keyboard-enter-submit', keys='enter' - ), - fac.AntdFormItem( - fac.AntdCheckbox( - id='login-remember-me', label='记住我' - ), - style={'marginBottom': '10px'}, - ), - fac.AntdFormItem( - fac.AntdButton( - '登录', - id='login-submit', - type='primary', - loadingChildren='登录中', - autoSpin=True, - block=True, - size='large', + ], + className='ant-pro-form-login-header', + ), + html.Div( + 'DF Admin 是 Dash 中最完备的中后台管理系统', + className='ant-pro-form-login-desc ', + ), + ], + className='ant-pro-form-login-top', ), - style={'marginBottom': '10px'}, - ), - fac.AntdFormItem( html.Div( [ - html.Div( - id='register-user-link-container' - ), - html.Div( - id='forget-password-link-container' + fac.AntdForm( + fac.AntdFlex( + [ + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入用户名', + id='login-username', + size='large', + prefix=fac.AntdIcon( + icon='antd-user' + ), + ), + id='login-username-form-item', + ), + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入密码', + id='login-password', + mode='password', + passwordUseMd5=True, + size='large', + prefix=fac.AntdIcon( + icon='antd-lock' + ), + ), + id='login-password-form-item', + ), + html.Div( + fac.AntdFormItem( + [ + fac.AntdFlex( + [ + fac.AntdInput( + placeholder='请输入验证码', + id='login-captcha', + size='large', + prefix=fac.AntdIcon( + icon='antd-check-circle' + ), + ), + html.Div( + [ + fac.AntdImage( + id='login-captcha-image', + src='', + height=39.6, + width=100, + preview=False, + style={ + 'border': '1px solid #d9d9d9', + 'borderRadius': '8px', + }, + ) + ], + id='login-captcha-image-container', + ), + ], + align='center', + gap='small', + ), + ], + id='login-captcha-form-item', + ), + id='captcha-row-container', + ), + fac.AntdFormItem( + fac.AntdFlex( + [ + fac.AntdCheckbox( + id='login-remember-me', + label='记住我', + ), + html.Div( + id='forget-password-link-container' + ), + ], + align='center', + justify='space-between', + ), + style={ + 'marginBottom': '10px' + }, + ), + fac.AntdFormItem( + fac.AntdButton( + '登录', + id='login-submit', + type='primary', + block=True, + size='large', + ), + style={ + 'marginBottom': '15px' + }, + ), + fac.AntdFormItem( + html.Div( + id='register-user-link-container', + ), + ), + ], + vertical=True, + ), + layout='vertical', + style={'width': '100%'}, ), ], + className='ant-pro-form-login-main', style={ - 'display': 'flex', - 'justifyContent': 'space-between', + 'width': '328px', + 'minWidth': '280px', + 'maxWidth': '75vw', }, - ) + ), + ], + className='ant-pro-form-login-container', + ), + style={'flex': '1', 'padding': '32px 0'}, + ), + fac.AntdFooter( + html.Div( + html.Div( + html.Span( + f'Copyright © 2023-{time.localtime().tm_year} insistence.tech All Rights Reserved.', + className='anticon anticon-copyright', + role='img', + **{'aria-label': 'copyright'}, + ), + className='ant-pro-global-footer-copyright', ), - ], - layout='vertical', - style={'width': '100%'}, + className='ant-pro-global-footer', + ), + style={ + 'padding': '0px', + 'background': 'none', + }, ), ], - id='login-form-container', - title='登录', - hoverable=True, - style={ - 'position': 'fixed', - 'top': '16%', - 'left': '70%', - 'width': '430px', - 'padding': '0px 30px', - 'transform': 'translateX(-50%)', - }, + id='login-page', + className='acss-trkbkn', ), - fac.AntdFooter( - html.Div( - fac.AntdText( - '版权所有©2023 Dash-FastAPI-Admin', - style={'margin': '0'}, - ), - style={ - 'display': 'flex', - 'height': '100%', - 'justifyContent': 'center', - 'alignItems': 'center', - }, - ), - style={ - 'backgroundColor': 'rgb(255 255 255 / 0%)', - 'height': '40px', - 'position': 'fixed', - 'bottom': 0, - 'left': '50%', - 'width': '500px', - 'padding': 0, - 'transform': 'translateX(-50%)', - }, + fuc.FefferyStyle( + rawStyle=""" + .acss-trkbkn { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + height: 100vh; + overflow: auto; + -webkit-background-size: 100% 100%; + background-size: 100% 100%; + } + .ant-pro-form-login-container { + display: flex; + flex: 1; + flex-direction: column; + height: 100%; + padding-inline: 32px; + padding-block: 24px; + overflow: auto; + background: inherit; + } + .ant-pro-form-login-top { + text-align: center; + } + .ant-pro-form-login-header { + display: flex; + align-items: center; + justify-content: center; + height: 44px; + line-height: 44px; + } + .ant-pro-form-login-logo { + width: 44px; + height: 44px; + margin-inline-end: 16px; + vertical-align: top; + } + .ant-pro-form-login-logo img { + width: 100%; + } + img { + vertical-align: middle; + border-style: none; + } + .ant-pro-form-login-title { + position: relative; + inset-block-start: 2px; + font-weight: 600; + font-size: 33px; + } + .ant-pro-form-login-desc { + margin-block-start: 12px; + margin-block-end: 40px; + color: rgba(0, 0, 0, 0.65); + font-size: 14px; + } + .ant-pro-form-login-main { + margin: 0 auto; + } + .ant-pro-global-footer { + margin-block: 0; + margin-block-start: 48px; + margin-block-end: 24px; + margin-inline: 0; + padding-block: 0; + padding-inline: 16px; + text-align: center; + } + .ant-pro-global-footer-copyright { + font-size: 14px; + color: rgba(0, 0, 0, 0.88); + } + .anticon { + display: inline-flex; + align-items: center; + color: inherit; + font-style: normal; + line-height: 0; + text-align: center; + text-transform: none; + vertical-align: -0.125em; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + } + """ ), ], - id='container', - style={ - 'height': '100vh', - }, ) diff --git a/dash-fastapi-frontend/views/register.py b/dash-fastapi-frontend/views/register.py index 5a2634f..edd595c 100644 --- a/dash-fastapi-frontend/views/register.py +++ b/dash-fastapi-frontend/views/register.py @@ -11,44 +11,48 @@ def render_register_content(): [ dcc.Store(id='register-success-container'), dcc.Store(id='register-captcha_image-session_id-container'), + fuc.FefferyKeyPress( + id='register-keyboard-enter-submit', + keys='enter', + ), fac.AntdForm( - [ - fac.AntdFormItem( - fac.AntdInput( - placeholder='请输入用户名', - id='register-username', - size='large', - prefix=fac.AntdIcon(icon='antd-user'), + fac.AntdFlex( + [ + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入用户名', + id='register-username', + size='large', + prefix=fac.AntdIcon(icon='antd-user'), + ), + id='register-username-form-item', ), - id='register-username-form-item', - ), - fac.AntdFormItem( - fac.AntdInput( - placeholder='请输入密码', - id='register-password', - mode='password', - passwordUseMd5=True, - size='large', - prefix=fac.AntdIcon(icon='antd-lock'), + fac.AntdFormItem( + fac.AntdInput( + placeholder='请输入密码', + id='register-password', + mode='password', + passwordUseMd5=True, + size='large', + prefix=fac.AntdIcon(icon='antd-lock'), + ), + id='register-password-form-item', ), - id='register-password-form-item', - ), - fac.AntdFormItem( - fac.AntdInput( - placeholder='请再次输入密码', - id='register-confirm_password', - mode='password', - passwordUseMd5=True, - size='large', - prefix=fac.AntdIcon(icon='antd-lock'), + fac.AntdFormItem( + fac.AntdInput( + placeholder='请再次输入密码', + id='register-confirm_password', + mode='password', + passwordUseMd5=True, + size='large', + prefix=fac.AntdIcon(icon='antd-lock'), + ), + id='register-confirm_password-form-item', ), - id='register-confirm_password-form-item', - ), - html.Div( - [ - fac.AntdSpace( - [ - fac.AntdFormItem( + html.Div( + fac.AntdFormItem( + fac.AntdFlex( + [ fac.AntdInput( placeholder='请输入验证码', id='register-captcha', @@ -56,51 +60,44 @@ def render_register_content(): prefix=fac.AntdIcon( icon='antd-check-circle' ), - style={'width': '280px'}, ), - id='register-captcha-form-item', - ), - fac.AntdFormItem( html.Div( [ fac.AntdImage( id='register-captcha-image', src='', - height=37, + height=39.6, width=100, preview=False, + style={ + 'border': '1px solid #d9d9d9', + 'borderRadius': '8px', + }, ) ], id='register-captcha-image-container', - style={ - 'border': '1px solid #ccc' - }, ), - ), - ], - align='end', - size=10, + ], + align='center', + gap='small', + ), + id='register-captcha-form-item', + ), + id='register-captcha-row-container', + ), + fac.AntdFormItem( + fac.AntdButton( + '注册', + id='register-submit', + type='primary', + block=True, + size='large', ), - ], - id='register-captcha-row-container', - ), - fuc.FefferyKeyPress( - id='register-keyboard-enter-submit', - keys='enter', - ), - fac.AntdFormItem( - fac.AntdButton( - '注册', - id='register-submit', - type='primary', - loadingChildren='注册中', - autoSpin=True, - block=True, - size='large', + style={'marginTop': '20px'}, ), - style={'marginTop': '20px'}, - ), - ], + ], + vertical=True, + ), layout='vertical', style={'width': '100%'}, ), @@ -112,21 +109,24 @@ def render_register_content(): 'content': '返回登录', 'href': '/login', 'target': '_self', - 'style': {'font-size': '16px'}, + 'style': {'fontSize': '16px'}, }, headStyle={ - 'font-weight': 'bold', - 'text-align': 'center', - 'font-size': '30px', + 'fontWeight': 'bold', + 'textAlign': 'center', + 'fontSize': '30px', }, style={ 'position': 'fixed', 'top': '16%', 'left': '50%', - 'width': '500px', + 'width': '480px', + 'minWidth': '420px', + 'maxWidth': '75vw', 'padding': '0px 30px', 'transform': 'translateX(-50%)', }, ), - ] + ], + id='register-page', ) -- Gitee From 4eed1ffc8a935152fadcea93643fa8aa018b880a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 24 Sep 2024 22:27:13 +0800 Subject: [PATCH 166/229] chore: fac -> 0.3.7 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f35711c..8219759 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ dash==2.18.1 DateTime==5.5 fastapi[all]==0.112.2 feffery-antd-charts==0.1.0rc5 -feffery-antd-components==0.3.4 +feffery-antd-components==0.3.7 feffery-markdown-components==0.2.10 feffery-utils-components==0.2.0rc24 Flask-Compress==1.15 -- Gitee From 5b91e105431dc7c56b46b3613d68c479618b628a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 24 Sep 2024 22:27:46 +0800 Subject: [PATCH 167/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E8=B5=84=E6=96=99tab=E5=8A=A0=E8=BD=BD=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/layout_c/index_c.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/callbacks/layout_c/index_c.py b/dash-fastapi-frontend/callbacks/layout_c/index_c.py index fb5a71c..e1a5251 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/index_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/index_c.py @@ -131,7 +131,9 @@ def handle_tab_switch_and_create( 'icon': 'antd-arrow-left', }, ) - if RouterUtil.is_http(currentItem.get('path')): + if currentKey not in ['首页', '个人资料'] and RouterUtil.is_http( + currentItem.get('path') + ): raise PreventUpdate if menu_modules: # 否则追加子项返回 -- Gitee From b11460701ecbf160621daaf810c51e115611ce3b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 24 Sep 2024 22:28:05 +0800 Subject: [PATCH 168/229] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/layout/components/head.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dash-fastapi-frontend/views/layout/components/head.py b/dash-fastapi-frontend/views/layout/components/head.py index 943c341..2fdb5c2 100644 --- a/dash-fastapi-frontend/views/layout/components/head.py +++ b/dash-fastapi-frontend/views/layout/components/head.py @@ -172,7 +172,6 @@ def render_head_content(): }, ], placement='bottomRight', - overlayStyle={'width': '100px'}, ), ], style={ -- Gitee From 5410bf60c3a392b2842941a3a2b983c8486b9dac Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 24 Sep 2024 22:28:40 +0800 Subject: [PATCH 169/229] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E4=BF=AE=E5=A4=8D=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/role_c/allocate_user_c.py | 8 ++------ .../callbacks/system_c/user_c/user_c.py | 16 +--------------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py index 3a749bd..e8af80a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py @@ -83,10 +83,6 @@ def get_allocate_user_table_data( if triggered_id.index == 'unallocated': table_info = RoleApi.unallocated_user_list(query_params) table_data = table_info['rows'] - new_table_data = [ - {k: v for k, v in item.items() if k != 'admin'} - for item in table_data - ] table_pagination = dict( pageSize=table_info['page_size'], current=table_info['page_num'], @@ -95,7 +91,7 @@ def get_allocate_user_table_data( showQuickJumper=True, total=table_info['total'], ) - for item in new_table_data: + for item in table_data: if item['status'] == '0': item['status'] = dict(tag='正常', color='blue') else: @@ -112,7 +108,7 @@ def get_allocate_user_table_data( else {}, ] - return [new_table_data, table_pagination, str(uuid.uuid4()), None] + return [table_data, table_pagination, str(uuid.uuid4()), None] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index 5d2b1b4..fe99610 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -718,27 +718,13 @@ def role_to_allocated_user_modal( item['key'] = str(item['role_id']) if item.get('flag'): selected_row_keys.append(str(item['role_id'])) - new_table_data = [ - { - k: v - for k, v in item.items() - if k - not in [ - 'admin', - 'dept_check_strictly', - 'flag', - 'menu_check_strictly', - ] - } - for item in table_data - ] return [ True, user_id, allocated_role_info.get('user').get('nick_name'), allocated_role_info.get('user').get('user_name'), selected_row_keys, - new_table_data, + table_data, ] raise PreventUpdate -- Gitee From 56ea24a8396691dfe53dd379ecbf2fd85a31587b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Tue, 24 Sep 2024 22:58:01 +0800 Subject: [PATCH 170/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E9=9D=A2=E6=9D=BF=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/router_c.py | 13 +++++---- dash-fastapi-frontend/utils/router_util.py | 30 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/router_c.py b/dash-fastapi-frontend/callbacks/router_c.py index 15804b1..d1215d9 100644 --- a/dash-fastapi-frontend/callbacks/router_c.py +++ b/dash-fastapi-frontend/callbacks/router_c.py @@ -40,8 +40,6 @@ def router(pathname, url_trigger, session_token): router_list_result = RouterApi.get_routers() router_list = router_list_result['data'] menu_info = RouterUtil.generate_menu_tree(router_list) - # search_panel_data = get_search_panel_data(user_menu_list) - search_panel_data = [] permissions = { 'perms': current_user['permissions'], 'roles': current_user['roles'], @@ -50,11 +48,9 @@ def router(pathname, url_trigger, session_token): user_info=current_user['user'], permissions=permissions, menu_info=menu_info, - search_panel_data=search_panel_data, ) CacheManager.set(cache_obj) menu_info = CacheManager.get('menu_info') - search_panel_data = CacheManager.get('search_panel_data') dynamic_valid_pathname_list = find_node_values(menu_info, 'href') valid_href_list = ( dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME @@ -74,13 +70,16 @@ def router(pathname, url_trigger, session_token): redirect_container=dcc.Location( pathname='/', id='router-redirect' ), - menu_current_key=current_key, - search_panel_data=search_panel_data, + menu_current_key=no_update, + search_panel_data=no_update, ) user_menu_info = RouterUtil.generate_menu_tree( RouterUtil.get_visible_routers(router_list) ) + search_panel_data = RouterUtil.generate_search_panel_data( + user_menu_info + ) # 否则正常渲染主页面 return dict( app_mount=layout.render_content(user_menu_info), @@ -94,7 +93,7 @@ def router(pathname, url_trigger, session_token): app_mount=no_update, redirect_container=None, menu_current_key=current_key, - search_panel_data=search_panel_data, + search_panel_data=no_update, ) else: diff --git a/dash-fastapi-frontend/utils/router_util.py b/dash-fastapi-frontend/utils/router_util.py index 8e4f7ba..6b53e72 100644 --- a/dash-fastapi-frontend/utils/router_util.py +++ b/dash-fastapi-frontend/utils/router_util.py @@ -108,6 +108,36 @@ class RouterUtil: return new_router_list + @classmethod + def generate_search_panel_data(cls, menu_list: List): + """ + 生成搜索面板数据 + + :param menu_list: 菜单列表 + :return: 搜索面板数据 + """ + search_panel_data = [] + for item in menu_list: + if item.get('children'): + search_panel_data.extend( + cls.generate_search_panel_data(item.get('children')) + ) + else: + href = item.get('props').get('href') + target = ( + '_blank' + if cls.is_http(item.get('props').get('href')) + else '_self' + ) + item_dict = dict( + id=item.get('props').get('key'), + title=item.get('props').get('title'), + handler=f'() => window.open("{href}", "{target}")', + ) + search_panel_data.append(item_dict) + + return search_panel_data + @classmethod def __genrate_item_menu(cls, router: Dict, modules: str): """ -- Gitee From 194d142a429573e993bf8899bab049350f351474 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 25 Sep 2024 16:55:52 +0800 Subject: [PATCH 171/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/config/env.py | 492 +++++++++++++++++ dash-fastapi-frontend/config/global_config.py | 497 ------------------ dash-fastapi-frontend/config/router.py | 73 +++ 3 files changed, 565 insertions(+), 497 deletions(-) delete mode 100644 dash-fastapi-frontend/config/global_config.py create mode 100644 dash-fastapi-frontend/config/router.py diff --git a/dash-fastapi-frontend/config/env.py b/dash-fastapi-frontend/config/env.py index 6b01bd7..b51b98d 100644 --- a/dash-fastapi-frontend/config/env.py +++ b/dash-fastapi-frontend/config/env.py @@ -9,6 +9,7 @@ class AppSettings(BaseSettings): """ 应用配置 """ + app_env: str = 'dev' app_name: str = '通用后台管理系统' app_base_url: str = 'http://127.0.0.1:9099' @@ -65,3 +66,494 @@ class GetConfig: get_config = GetConfig() # 应用配置 AppConfig = get_config.get_app_config() + + +class ApiConfig: + """ + Api配置 + + BaseUrl: Api请求地址 + """ + + BaseUrl = ( + AppConfig.app_base_url + AppConfig.app_proxy_path + if AppConfig.app_is_proxy + else AppConfig.app_base_url + ) + + +class PathConfig: + """ + 路径配置 + + ABS_ROOT_PATH: 项目绝对根目录 + """ + + ABS_ROOT_PATH = os.path.abspath(os.getcwd()) + + +class IconConfig: + ICON_LIST = [ + 'antd-carry-out', + 'antd-car', + 'antd-bulb', + 'antd-build', + 'antd-bug', + 'antd-bar-code', + 'antd-branches', + 'antd-aim', + 'antd-issues-close', + 'antd-ellipsis', + 'antd-user', + 'antd-unlock', + 'antd-repair', + 'antd-team', + 'antd-sync', + 'antd-setting', + 'antd-send', + 'antd-schedule', + 'antd-save', + 'antd-rocket', + 'antd-reload', + 'antd-read', + 'antd-qrcode', + 'antd-power-off', + 'antd-number', + 'antd-notification', + 'antd-menu', + 'antd-mail', + 'antd-lock', + 'antd-loading', + 'antd-key', + 'antd-hourglass', + 'antd-global', + 'antd-function', + 'antd-import', + 'antd-export', + 'antd-dashboard', + 'antd-control', + 'antd-console-sql', + 'antd-compass', + 'antd-comment', + 'antd-code', + 'antd-cluster', + 'antd-clear', + 'antd-camera', + 'antd-book', + 'antd-catalog', + 'antd-api', + 'antd-alert', + 'antd-account-book', + 'antd-alipay', + 'antd-alipay-circle', + 'antd-weibo', + 'antd-github', + 'antd-fall', + 'antd-rise', + 'antd-stock', + 'antd-home', + 'antd-fund', + 'antd-area-chart', + 'antd-radar-chart', + 'antd-bar-chart', + 'antd-pie-chart', + 'antd-box-plot', + 'antd-dot-chart', + 'antd-line-chart', + 'antd-field-binary', + 'antd-field-number', + 'antd-field-string', + 'antd-field-time', + 'antd-file-add', + 'antd-file-done', + 'antd-file', + 'antd-file-image', + 'antd-file-markdown', + 'antd-file-pdf', + 'antd-file-protect', + 'antd-file-sync', + 'antd-file-text', + 'antd-file-word', + 'antd-file-zip', + 'antd-filter', + 'antd-fire', + 'antd-woman', + 'antd-arrow-up', + 'antd-arrow-down', + 'antd-arrow-left', + 'antd-arrow-right', + 'antd-flag', + 'antd-user-add', + 'antd-folder-add', + 'antd-man', + 'antd-tag', + 'antd-folder', + 'antd-user-delete', + 'antd-trophy', + 'antd-shopping-cart', + 'antd-folder-open', + 'antd-fork', + 'antd-select', + 'antd-tags', + 'antd-thunderbolt', + 'antd-sound', + 'antd-fund-projection-screen', + 'antd-funnel-plot', + 'antd-gift', + 'antd-robot', + 'antd-pushpin', + 'antd-printer', + 'antd-phone', + 'antd-picture', + 'antd-idcard', + 'antd-partition', + 'antd-monitor', + 'antd-more', + 'antd-apartment', + 'antd-money-collect', + 'antd-experiment', + 'antd-link', + 'antd-mobile', + 'antd-coffee', + 'antd-layout', + 'antd-eye', + 'antd-eye-invisible', + 'antd-exception', + 'antd-dollar', + 'antd-euro', + 'antd-download', + 'antd-environment', + 'antd-deployment-unit', + 'antd-crown', + 'antd-desktop', + 'antd-like', + 'antd-dislike', + 'antd-disconnect', + 'antd-app-store', + 'antd-app-store-add', + 'antd-bell', + 'antd-calculator', + 'antd-calendar', + 'antd-database', + 'antd-history', + 'antd-search', + 'antd-file-search', + 'antd-cloud', + 'antd-cloud-upload', + 'antd-cloud-download', + 'antd-cloud-server', + 'antd-cloud-sync', + 'antd-swap', + 'antd-rollback', + 'antd-login', + 'antd-logout', + 'antd-menu-fold', + 'antd-menu-unfold', + 'antd-full-screen', + 'antd-full-screen-exit', + 'antd-question-circle', + 'antd-plus-circle', + 'antd-minus-circle', + 'antd-info-circle', + 'antd-exclamation-circle', + 'antd-close-circle', + 'antd-check-circle', + 'antd-clock-circle', + 'antd-stop', + 'antd-edit', + 'antd-delete', + 'antd-highlight', + 'antd-redo', + 'antd-undo', + 'antd-zoom-in', + 'antd-zoom-out', + 'antd-sort-ascending', + 'antd-sort-descending', + 'antd-table', + 'antd-question', + 'antd-plus', + 'antd-minus', + 'antd-close', + 'antd-check', + 'antd-sketch', + 'antd-bank', + 'antd-block', + 'antd-insurance', + 'antd-smile', + 'antd-skin', + 'antd-star', + 'antd-right-circle-two-tone', + 'antd-left-circle-two-tone', + 'antd-up-circle-two-tone', + 'antd-down-circle-two-tone', + 'antd-up-square-two-tone', + 'antd-down-square-two-tone', + 'antd-left-square-two-tone', + 'antd-right-square-two-tone', + 'antd-question-circle-two-tone', + 'antd-plus-circle-two-tone', + 'antd-minus-circle-two-tone', + 'antd-plus-square-two-tone', + 'antd-minus-square-two-tone', + 'antd-info-circle-two-tone', + 'antd-exclamation-circle-two-tone', + 'antd-close-circle-two-tone', + 'antd-close-square-two-tone', + 'antd-check-circle-two-tone', + 'antd-check-square-two-tone', + 'antd-edit-two-tone', + 'antd-delete-two-tone', + 'antd-highlight-two-tone', + 'antd-pie-chart-two-tone', + 'antd-box-chart-two-tone', + 'antd-fund-two-tone', + 'antd-sliders-two-tone', + 'antd-api-two-tone', + 'antd-cloud-two-tone', + 'antd-hourglass-two-tone', + 'antd-notification-two-tone', + 'antd-tool-two-tone', + 'antd-down', + 'antd-up', + 'antd-left', + 'antd-right', + 'md-star-half', + 'md-star-border', + 'md-star', + 'md-people', + 'md-plus-one', + 'md-notifications', + 'md-pin-drop', + 'md-layers-clear', + 'md-layers', + 'md-edit-location', + 'md-tune', + 'md-transform', + 'md-timer-off', + 'md-timer', + 'md-file-upload', + 'md-file-download', + 'md-create-new-folder', + 'md-cloud-upload', + 'md-cloud-queue', + 'md-cloud-download', + 'md-cloud-done', + 'md-insert-chart', + 'md-functions', + 'md-format-quote', + 'md-attach-file', + 'md-storage', + 'md-save', + 'md-remove-circle-outline', + 'md-remove-circle', + 'md-remove', + 'md-low-priority', + 'md-link', + 'md-gesture', + 'md-forward', + 'md-flag', + 'md-drafts', + 'md-create', + 'md-content-paste', + 'md-content-cut', + 'md-content-copy', + 'md-clear', + 'md-block', + 'md-backspace', + 'md-add-box', + 'md-add', + 'md-add-circle-outline', + 'md-add-circle', + 'md-location-on', + 'md-mail-outline', + 'md-email', + 'md-not-interested', + 'md-library-books', + 'md-library-add', + 'md-equalizer', + 'md-add-alert', + 'md-visibility-off', + 'md-visibility', + 'md-verified-user', + 'md-update', + 'md-trending-up', + 'md-trending-flat', + 'md-trending-down', + 'md-translate', + 'md-toc', + 'md-timeline', + 'md-thumb-up', + 'md-thumb-down', + 'md-swap-vert', + 'md-swap-horiz', + 'md-supervisor-account', + 'md-subject', + 'md-settings', + 'md-search', + 'md-schedule', + 'md-restore', + 'md-query-builder', + 'md-power-settings-new', + 'md-opacity', + 'md-note-add', + 'md-lock-outline', + 'md-lock-open', + 'md-list', + 'md-lightbulb-outline', + 'md-launch', + 'md-label-outline', + 'md-label', + 'md-input', + 'md-info-outline', + 'md-info', + 'md-hourglass', + 'md-home', + 'md-history', + 'md-highlight-off', + 'md-help-outline', + 'md-help', + 'md-get-app', + 'md-translate', + 'md-fingerprint', + 'md-findIn-page', + 'md-favorite-border', + 'md-favorite', + 'md-extension', + 'md-explore', + 'md-exit-to-app', + 'md-event', + 'md-description', + 'md-delete-forever', + 'md-delete', + 'md-dashboard', + 'md-code', + 'md-build', + 'md-bug-report', + 'md-assignment', + 'md-assessment', + 'md-alarm-on', + 'md-alarm-off', + 'md-alarm-add', + 'md-alarm', + 'md-account-circle', + 'fc-vlc', + 'fc-view-details', + 'fc-upload', + 'fc-tree-structure', + 'fc-timeline', + 'fc-template', + 'fc-survey', + 'fc-signature', + 'fc-share', + 'fc-services', + 'fc-rules', + 'fc-questions', + 'fc-process', + 'fc-plus', + 'fc-overtime', + 'fc-organization', + 'fc-numerical-sorting21', + 'fc-numerical-sorting12', + 'fc-multiple-inputs', + 'fc-mind-map', + 'fc-menu', + 'fc-list', + 'fc-like', + 'fc-like-placeholder', + 'fc-info', + 'fc-import', + 'fc-image-file', + 'fc-idea', + 'fc-home', + 'fc-high-priority', + 'fc-low-priority', + 'fc-genealogy', + 'fc-full-trash', + 'fc-document-search', + 'fc-file', + 'fc-faq', + 'fc-export', + 'fc-empty-trash', + 'fc-download', + 'fc-document', + 'fc-deployment', + 'fc-delete-database', + 'fc-conference-call', + 'fc-database', + 'fc-data-protection', + 'fc-data-encryption', + 'fc-data-configuration', + 'fc-data-backup', + 'fc-checkmark', + 'fc-cancel', + 'fc-briefcase', + 'fc-binoculars', + 'fc-automatic', + 'fc-alphabetical-sorting-za', + 'fc-alphabetical-sorting-az', + 'fc-add-database', + 'fc-accept-database', + 'fc-about', + 'fc-radar-chart', + 'fc-scatter-chart', + 'fc-pie-chart', + 'fc-line-chart', + 'fc-flow-chart', + 'fc-doughnut-chart', + 'fc-bar-chart', + 'fc-area-chart', + 'fc-line-bar-chart', + 'fc-workflow', + 'fc-todo-list', + 'fc-synchronize', + 'fc-repair', + 'fc-statistics', + 'fc-settings', + 'fc-search', + 'fc-serial-tasks', + 'fc-safe', + 'fc-negative-dynamic', + 'fc-positive-dynamic', + 'fc-planner', + 'fc-parallel-tasks', + 'fc-org-unit', + 'fc-opened-folder', + 'fc-ok', + 'fc-inspection', + 'fc-globe', + 'fc-folder', + 'fc-electronics', + 'fc-data-sheet', + 'fc-command-line', + 'fc-calendar', + 'fc-calculator', + 'fc-bullish', + 'fc-bearish', + 'fc-bookmark', + 'fc-approval', + 'fc-advertising', + 'di-linux', + 'di-python', + 'di-chrome', + 'di-database', + 'di-firefox', + 'di-markdown', + 'di-postgresql', + 'di-terminal', + 'di-windows', + 'bi-table', + 'bi-analyse', + 'bi-layer', + 'bi-layer-minus', + 'bi-layer-plus', + 'bs-list-task', + 'bs-list-check', + 'bs-link', + 'bs-link-45-deg', + 'bs-envelope-open', + 'bs-envelope', + 'bs-alarm', + 'gi-mesh-network', + 'im-earth', + 'im-sphere', + ] diff --git a/dash-fastapi-frontend/config/global_config.py b/dash-fastapi-frontend/config/global_config.py deleted file mode 100644 index f6c3f11..0000000 --- a/dash-fastapi-frontend/config/global_config.py +++ /dev/null @@ -1,497 +0,0 @@ -import os -from config.env import AppConfig - - -class PathConfig: - # 项目绝对根目录 - ABS_ROOT_PATH = os.path.abspath(os.getcwd()) - - -class RouterConfig: - # 合法pathname列表 - BASIC_VALID_PATHNAME = ['/', '/login', '/forget', '/register'] - - # 静态路由列表 - STATIC_VALID_PATHNAME = [ - '/', - '/login', - '/forget', - '/register', - '/user/profile', - ] - - -class ApiBaseUrlConfig: - # api基本url - BaseUrl = ( - AppConfig.app_base_url + AppConfig.app_proxy_path - if AppConfig.app_is_proxy - else AppConfig.app_base_url - ) - - -class IconConfig: - ICON_LIST = [ - 'antd-carry-out', - 'antd-car', - 'antd-bulb', - 'antd-build', - 'antd-bug', - 'antd-bar-code', - 'antd-branches', - 'antd-aim', - 'antd-issues-close', - 'antd-ellipsis', - 'antd-user', - 'antd-unlock', - 'antd-repair', - 'antd-team', - 'antd-sync', - 'antd-setting', - 'antd-send', - 'antd-schedule', - 'antd-save', - 'antd-rocket', - 'antd-reload', - 'antd-read', - 'antd-qrcode', - 'antd-power-off', - 'antd-number', - 'antd-notification', - 'antd-menu', - 'antd-mail', - 'antd-lock', - 'antd-loading', - 'antd-key', - 'antd-hourglass', - 'antd-global', - 'antd-function', - 'antd-import', - 'antd-export', - 'antd-dashboard', - 'antd-control', - 'antd-console-sql', - 'antd-compass', - 'antd-comment', - 'antd-code', - 'antd-cluster', - 'antd-clear', - 'antd-camera', - 'antd-book', - 'antd-catalog', - 'antd-api', - 'antd-alert', - 'antd-account-book', - 'antd-alipay', - 'antd-alipay-circle', - 'antd-weibo', - 'antd-github', - 'antd-fall', - 'antd-rise', - 'antd-stock', - 'antd-home', - 'antd-fund', - 'antd-area-chart', - 'antd-radar-chart', - 'antd-bar-chart', - 'antd-pie-chart', - 'antd-box-plot', - 'antd-dot-chart', - 'antd-line-chart', - 'antd-field-binary', - 'antd-field-number', - 'antd-field-string', - 'antd-field-time', - 'antd-file-add', - 'antd-file-done', - 'antd-file', - 'antd-file-image', - 'antd-file-markdown', - 'antd-file-pdf', - 'antd-file-protect', - 'antd-file-sync', - 'antd-file-text', - 'antd-file-word', - 'antd-file-zip', - 'antd-filter', - 'antd-fire', - 'antd-woman', - 'antd-arrow-up', - 'antd-arrow-down', - 'antd-arrow-left', - 'antd-arrow-right', - 'antd-flag', - 'antd-user-add', - 'antd-folder-add', - 'antd-man', - 'antd-tag', - 'antd-folder', - 'antd-user-delete', - 'antd-trophy', - 'antd-shopping-cart', - 'antd-folder-open', - 'antd-fork', - 'antd-select', - 'antd-tags', - 'antd-thunderbolt', - 'antd-sound', - 'antd-fund-projection-screen', - 'antd-funnel-plot', - 'antd-gift', - 'antd-robot', - 'antd-pushpin', - 'antd-printer', - 'antd-phone', - 'antd-picture', - 'antd-idcard', - 'antd-partition', - 'antd-monitor', - 'antd-more', - 'antd-apartment', - 'antd-money-collect', - 'antd-experiment', - 'antd-link', - 'antd-mobile', - 'antd-coffee', - 'antd-layout', - 'antd-eye', - 'antd-eye-invisible', - 'antd-exception', - 'antd-dollar', - 'antd-euro', - 'antd-download', - 'antd-environment', - 'antd-deployment-unit', - 'antd-crown', - 'antd-desktop', - 'antd-like', - 'antd-dislike', - 'antd-disconnect', - 'antd-app-store', - 'antd-app-store-add', - 'antd-bell', - 'antd-calculator', - 'antd-calendar', - 'antd-database', - 'antd-history', - 'antd-search', - 'antd-file-search', - 'antd-cloud', - 'antd-cloud-upload', - 'antd-cloud-download', - 'antd-cloud-server', - 'antd-cloud-sync', - 'antd-swap', - 'antd-rollback', - 'antd-login', - 'antd-logout', - 'antd-menu-fold', - 'antd-menu-unfold', - 'antd-full-screen', - 'antd-full-screen-exit', - 'antd-question-circle', - 'antd-plus-circle', - 'antd-minus-circle', - 'antd-info-circle', - 'antd-exclamation-circle', - 'antd-close-circle', - 'antd-check-circle', - 'antd-clock-circle', - 'antd-stop', - 'antd-edit', - 'antd-delete', - 'antd-highlight', - 'antd-redo', - 'antd-undo', - 'antd-zoom-in', - 'antd-zoom-out', - 'antd-sort-ascending', - 'antd-sort-descending', - 'antd-table', - 'antd-question', - 'antd-plus', - 'antd-minus', - 'antd-close', - 'antd-check', - 'antd-sketch', - 'antd-bank', - 'antd-block', - 'antd-insurance', - 'antd-smile', - 'antd-skin', - 'antd-star', - 'antd-right-circle-two-tone', - 'antd-left-circle-two-tone', - 'antd-up-circle-two-tone', - 'antd-down-circle-two-tone', - 'antd-up-square-two-tone', - 'antd-down-square-two-tone', - 'antd-left-square-two-tone', - 'antd-right-square-two-tone', - 'antd-question-circle-two-tone', - 'antd-plus-circle-two-tone', - 'antd-minus-circle-two-tone', - 'antd-plus-square-two-tone', - 'antd-minus-square-two-tone', - 'antd-info-circle-two-tone', - 'antd-exclamation-circle-two-tone', - 'antd-close-circle-two-tone', - 'antd-close-square-two-tone', - 'antd-check-circle-two-tone', - 'antd-check-square-two-tone', - 'antd-edit-two-tone', - 'antd-delete-two-tone', - 'antd-highlight-two-tone', - 'antd-pie-chart-two-tone', - 'antd-box-chart-two-tone', - 'antd-fund-two-tone', - 'antd-sliders-two-tone', - 'antd-api-two-tone', - 'antd-cloud-two-tone', - 'antd-hourglass-two-tone', - 'antd-notification-two-tone', - 'antd-tool-two-tone', - 'antd-down', - 'antd-up', - 'antd-left', - 'antd-right', - 'md-star-half', - 'md-star-border', - 'md-star', - 'md-people', - 'md-plus-one', - 'md-notifications', - 'md-pin-drop', - 'md-layers-clear', - 'md-layers', - 'md-edit-location', - 'md-tune', - 'md-transform', - 'md-timer-off', - 'md-timer', - 'md-file-upload', - 'md-file-download', - 'md-create-new-folder', - 'md-cloud-upload', - 'md-cloud-queue', - 'md-cloud-download', - 'md-cloud-done', - 'md-insert-chart', - 'md-functions', - 'md-format-quote', - 'md-attach-file', - 'md-storage', - 'md-save', - 'md-remove-circle-outline', - 'md-remove-circle', - 'md-remove', - 'md-low-priority', - 'md-link', - 'md-gesture', - 'md-forward', - 'md-flag', - 'md-drafts', - 'md-create', - 'md-content-paste', - 'md-content-cut', - 'md-content-copy', - 'md-clear', - 'md-block', - 'md-backspace', - 'md-add-box', - 'md-add', - 'md-add-circle-outline', - 'md-add-circle', - 'md-location-on', - 'md-mail-outline', - 'md-email', - 'md-not-interested', - 'md-library-books', - 'md-library-add', - 'md-equalizer', - 'md-add-alert', - 'md-visibility-off', - 'md-visibility', - 'md-verified-user', - 'md-update', - 'md-trending-up', - 'md-trending-flat', - 'md-trending-down', - 'md-translate', - 'md-toc', - 'md-timeline', - 'md-thumb-up', - 'md-thumb-down', - 'md-swap-vert', - 'md-swap-horiz', - 'md-supervisor-account', - 'md-subject', - 'md-settings', - 'md-search', - 'md-schedule', - 'md-restore', - 'md-query-builder', - 'md-power-settings-new', - 'md-opacity', - 'md-note-add', - 'md-lock-outline', - 'md-lock-open', - 'md-list', - 'md-lightbulb-outline', - 'md-launch', - 'md-label-outline', - 'md-label', - 'md-input', - 'md-info-outline', - 'md-info', - 'md-hourglass', - 'md-home', - 'md-history', - 'md-highlight-off', - 'md-help-outline', - 'md-help', - 'md-get-app', - 'md-translate', - 'md-fingerprint', - 'md-findIn-page', - 'md-favorite-border', - 'md-favorite', - 'md-extension', - 'md-explore', - 'md-exit-to-app', - 'md-event', - 'md-description', - 'md-delete-forever', - 'md-delete', - 'md-dashboard', - 'md-code', - 'md-build', - 'md-bug-report', - 'md-assignment', - 'md-assessment', - 'md-alarm-on', - 'md-alarm-off', - 'md-alarm-add', - 'md-alarm', - 'md-account-circle', - 'fc-vlc', - 'fc-view-details', - 'fc-upload', - 'fc-tree-structure', - 'fc-timeline', - 'fc-template', - 'fc-survey', - 'fc-signature', - 'fc-share', - 'fc-services', - 'fc-rules', - 'fc-questions', - 'fc-process', - 'fc-plus', - 'fc-overtime', - 'fc-organization', - 'fc-numerical-sorting21', - 'fc-numerical-sorting12', - 'fc-multiple-inputs', - 'fc-mind-map', - 'fc-menu', - 'fc-list', - 'fc-like', - 'fc-like-placeholder', - 'fc-info', - 'fc-import', - 'fc-image-file', - 'fc-idea', - 'fc-home', - 'fc-high-priority', - 'fc-low-priority', - 'fc-genealogy', - 'fc-full-trash', - 'fc-document-search', - 'fc-file', - 'fc-faq', - 'fc-export', - 'fc-empty-trash', - 'fc-download', - 'fc-document', - 'fc-deployment', - 'fc-delete-database', - 'fc-conference-call', - 'fc-database', - 'fc-data-protection', - 'fc-data-encryption', - 'fc-data-configuration', - 'fc-data-backup', - 'fc-checkmark', - 'fc-cancel', - 'fc-briefcase', - 'fc-binoculars', - 'fc-automatic', - 'fc-alphabetical-sorting-za', - 'fc-alphabetical-sorting-az', - 'fc-add-database', - 'fc-accept-database', - 'fc-about', - 'fc-radar-chart', - 'fc-scatter-chart', - 'fc-pie-chart', - 'fc-line-chart', - 'fc-flow-chart', - 'fc-doughnut-chart', - 'fc-bar-chart', - 'fc-area-chart', - 'fc-line-bar-chart', - 'fc-workflow', - 'fc-todo-list', - 'fc-synchronize', - 'fc-repair', - 'fc-statistics', - 'fc-settings', - 'fc-search', - 'fc-serial-tasks', - 'fc-safe', - 'fc-negative-dynamic', - 'fc-positive-dynamic', - 'fc-planner', - 'fc-parallel-tasks', - 'fc-org-unit', - 'fc-opened-folder', - 'fc-ok', - 'fc-inspection', - 'fc-globe', - 'fc-folder', - 'fc-electronics', - 'fc-data-sheet', - 'fc-command-line', - 'fc-calendar', - 'fc-calculator', - 'fc-bullish', - 'fc-bearish', - 'fc-bookmark', - 'fc-approval', - 'fc-advertising', - 'di-linux', - 'di-python', - 'di-chrome', - 'di-database', - 'di-firefox', - 'di-markdown', - 'di-postgresql', - 'di-terminal', - 'di-windows', - 'bi-table', - 'bi-analyse', - 'bi-layer', - 'bi-layer-minus', - 'bi-layer-plus', - 'bs-list-task', - 'bs-list-check', - 'bs-link', - 'bs-link-45-deg', - 'bs-envelope-open', - 'bs-envelope', - 'bs-alarm', - 'gi-mesh-network', - 'im-earth', - 'im-sphere', - ] diff --git a/dash-fastapi-frontend/config/router.py b/dash-fastapi-frontend/config/router.py new file mode 100644 index 0000000..f4df053 --- /dev/null +++ b/dash-fastapi-frontend/config/router.py @@ -0,0 +1,73 @@ +class RouterConfig: + """ + 路由配置 + """ + + WHITE_ROUTES_LIST = [ + { + 'path': '/login', + 'component': 'login', + }, + { + 'path': '/forget', + 'component': 'forget', + }, + { + 'path': '/register', + 'component': 'register', + }, + ] + + CONSTANT_ROUTES = [ + { + 'path': '/login', + 'component': 'login', + 'name': 'Login', + 'hidden': True, + }, + { + 'path': '/forget', + 'component': 'forget', + 'name': 'Forget', + 'hidden': True, + }, + { + 'path': '/register', + 'component': 'register', + 'name': 'Register', + 'hidden': True, + }, + { + 'path': '', + 'component': 'Layout', + 'name': '', + 'redirect': '/', + 'children': [ + { + 'path': '/', + 'component': 'dashboard', + 'name': 'Index', + 'meta': { + 'title': '首页', + 'icon': 'antd-dashboard', + 'affix': True, + }, + } + ], + }, + { + 'path': 'user', + 'component': 'Layout', + 'hidden': True, + 'name': 'UserProfile', + 'redirect': 'noredirect', + 'children': [ + { + 'path': 'profile', + 'component': 'system.user.profile', + 'name': 'Profile', + 'meta': {'title': '个人资料'}, + } + ], + }, + ] -- Gitee From 8a540fe5972707ee7079b0f566169d71cbd4b5fa Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 25 Sep 2024 16:56:37 +0800 Subject: [PATCH 172/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/assets/js/utils.js | 47 ++++++++++ .../callbacks/layout_c/aside_c.py | 24 +++-- .../callbacks/layout_c/index_c.py | 73 ++++++--------- dash-fastapi-frontend/callbacks/router_c.py | 78 ++++++++-------- .../system_c/user_c/profile_c/reset_pwd_c.py | 5 +- .../system_c/user_c/profile_c/user_info_c.py | 2 +- dash-fastapi-frontend/store/store.py | 16 ++-- dash-fastapi-frontend/utils/log_util.py | 2 +- dash-fastapi-frontend/utils/request.py | 4 +- dash-fastapi-frontend/utils/router_util.py | 28 +++++- .../views/dashboard/__init__.py | 2 +- .../views/dashboard/components/page_top.py | 4 +- dash-fastapi-frontend/views/forget.py | 2 +- .../views/layout/__init__.py | 88 +++++++------------ .../views/layout/components/aside.py | 17 ++-- .../views/layout/components/content.py | 24 ++--- .../views/layout/components/head.py | 4 +- dash-fastapi-frontend/views/login.py | 2 +- dash-fastapi-frontend/views/page_404.py | 25 ++---- dash-fastapi-frontend/views/register.py | 2 +- .../system/menu/components/icon_category.py | 15 +--- .../views/system/notice/__init__.py | 10 +-- .../views/system/user/profile/user_avatar.py | 4 +- .../views/tool/swagger/__init__.py | 12 +-- 24 files changed, 247 insertions(+), 243 deletions(-) create mode 100644 dash-fastapi-frontend/assets/js/utils.js diff --git a/dash-fastapi-frontend/assets/js/utils.js b/dash-fastapi-frontend/assets/js/utils.js new file mode 100644 index 0000000..9cbad22 --- /dev/null +++ b/dash-fastapi-frontend/assets/js/utils.js @@ -0,0 +1,47 @@ +function findKeyByPathname(array, href) { + for (let item of array) { + if (item?.props?.href === href) { + return item.props?.key; + } + if (item?.children && Array.isArray(item?.children)) { + const result = findKeyByPathname(item.children, href); + if (result) { + return result; + } + } + } + return null; +} + + +function findByKey(array, key) { + for (let item of array) { + if (item?.props?.key === key) { + return item; + } + if (item?.children && Array.isArray(item?.children)) { + const result = findByKey(item.children, key); + if (result) { + return result; + } + } + } + return null; +} + + +function findKeyPath(array, key, path = []) { + for (let item of array) { + let currentPath = [...path, item.props.key]; + if (item?.props?.key === key) { + return currentPath; + } + if (item?.children && Array.isArray(item?.children)) { + const result = findKeyPath(item.children, key, currentPath); + if (result) { + return result; + } + } + } + return null; +} \ No newline at end of file diff --git a/dash-fastapi-frontend/callbacks/layout_c/aside_c.py b/dash-fastapi-frontend/callbacks/layout_c/aside_c.py index d5315ca..a469d58 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/aside_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/aside_c.py @@ -1,4 +1,4 @@ -from dash.dependencies import Input, Output +from dash.dependencies import Input, Output, State from server import app @@ -6,14 +6,24 @@ from server import app # url-pathname控制currentKey回调 app.clientside_callback( """ - (current_key) => { - if (current_key) { - return current_key; + (currentPathname, routerList) => { + if (currentPathname) { + let currentKey = findKeyByPathname(routerList, currentPathname); + let currentItem = findByKey(routerList, currentKey); + let currentKeyPath = findKeyPath(routerList, currentKey); + let currentItemPath = currentKeyPath?.map(item => findByKey(routerList, item)); + return [currentKey, currentKeyPath, currentItem, currentItemPath]; } - return window.dash_clientside.no_update; + throw window.dash_clientside.PreventUpdate; } """, - Output('index-side-menu', 'currentKey'), - Input('current-key-container', 'data'), + [ + Output('index-side-menu', 'currentKey'), + Output('current-key_path-store', 'data'), + Output('current-item-store', 'data'), + Output('current-item_path-store', 'data'), + ], + Input('current-pathname-container', 'data'), + State('router-list-container', 'data'), prevent_initial_call=True, ) diff --git a/dash-fastapi-frontend/callbacks/layout_c/index_c.py b/dash-fastapi-frontend/callbacks/layout_c/index_c.py index e1a5251..4cfea31 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/index_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/index_c.py @@ -1,14 +1,12 @@ import dash import feffery_antd_components as fac -import importlib from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate +from importlib import import_module from jsonpath_ng import parse +import views # noqa: F401 from server import app -from utils.cache_util import CacheManager from utils.router_util import RouterUtil -from utils.tree_tool import find_href_by_key -import views # noqa: F401 @app.callback( @@ -23,9 +21,9 @@ import views # noqa: F401 Input('tabs-container', 'tabCloseCounts'), ], [ - State('index-side-menu', 'currentKeyPath'), - State('index-side-menu', 'currentItem'), - State('index-side-menu', 'currentItemPath'), + State('current-key_path-store', 'data'), + State('current-item-store', 'data'), + State('current-item_path-store', 'data'), State('tabs-container', 'latestDeletePane'), State('tabs-container', 'items'), State('tabs-container', 'activeKey'), @@ -63,10 +61,8 @@ def handle_tab_switch_and_create( breadcrumb_items = [ {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, ] - if currentKey == '首页': + if currentKey == 'Index/': pass - elif currentKey == '个人资料': - breadcrumb_items.append({'title': '个人资料'}) else: breadcrumb_items = breadcrumb_items + [ {'title': item.get('props').get('title')} @@ -81,17 +77,9 @@ def handle_tab_switch_and_create( currentKeyPath, ] - if currentKey == '个人资料': - menu_title = '个人资料' - menu_modules = 'system.user.profile' - breadcrumb_items = [ - {'title': '首页', 'icon': 'antd-dashboard', 'href': '/'}, - {'title': menu_title}, - ] - else: - menu_title = currentItem.get('props').get('title') - # 判断当前选中的菜单栏项是否存在module,如果有,则动态导入module,否则返回404页面 - menu_modules = currentItem.get('props').get('modules') + menu_title = currentItem.get('props').get('title') + # 判断当前选中的菜单栏项是否存在module,如果有,则动态导入module,否则返回404页面 + menu_modules = currentItem.get('props').get('modules') for index, item in enumerate(origin_items): if { @@ -131,9 +119,7 @@ def handle_tab_switch_and_create( 'icon': 'antd-arrow-left', }, ) - if currentKey not in ['首页', '个人资料'] and RouterUtil.is_http( - currentItem.get('path') - ): + if RouterUtil.is_http(currentItem.get('path')): raise PreventUpdate if menu_modules: # 否则追加子项返回 @@ -142,9 +128,10 @@ def handle_tab_switch_and_create( { 'label': menu_title, 'key': currentKey, - 'children': importlib.import_module( - 'views.' + menu_modules - ).render(), + 'closable': False + if currentItem.get('props').get('affix') + else True, + 'children': import_module('views.' + menu_modules).render(), 'contextMenu': context_menu, } ) @@ -363,7 +350,7 @@ def handle_via_context_menu(clickedContextMenu, origin_items, activeKey): 'icon': 'antd-close-circle', }, ] - if clickedContextMenu['tabKey'] == '首页': + if clickedContextMenu['tabKey'] == 'Index/': new_items[0]['contextMenu'] = context_menu else: context_menu.insert( @@ -432,30 +419,24 @@ def handle_via_context_menu(clickedContextMenu, origin_items, activeKey): }, ] # 否则则为全部关闭 - return [new_items, '首页', dash.no_update] + return [new_items, 'Index/', dash.no_update] raise PreventUpdate # 标签页点击回调 -@app.callback( +app.clientside_callback( + """ + (activeKey, routerList) => { + if (activeKey) { + let currentItem = findByKey(routerList, activeKey); + return currentItem?.props?.href; + } + throw window.dash_clientside.PreventUpdate; + } + """, Output('dcc-url', 'pathname', allow_duplicate=True), Input('tabs-container', 'activeKey'), + State('router-list-container', 'data'), prevent_initial_call=True, ) -def get_current_href(active_key): - if active_key: - if active_key == '首页': - return '/' - - elif active_key == '个人资料': - return '/user/profile' - - else: - current_href = find_href_by_key( - CacheManager.get('menu_info'), active_key - ) - - return current_href - - raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/router_c.py b/dash-fastapi-frontend/callbacks/router_c.py index d1215d9..ba3f14f 100644 --- a/dash-fastapi-frontend/callbacks/router_c.py +++ b/dash-fastapi-frontend/callbacks/router_c.py @@ -1,14 +1,14 @@ from dash import dcc, no_update from dash.dependencies import Input, Output, State from flask import session +from importlib import import_module +import views from api.login import LoginApi from api.router import RouterApi -from config.global_config import RouterConfig +from config.router import RouterConfig from server import app from utils.cache_util import CacheManager from utils.router_util import RouterUtil -from utils.tree_tool import find_key_by_href, find_node_values -from views import forget, layout, login, page_404, register @app.callback( @@ -17,7 +17,8 @@ from views import forget, layout, login, page_404, register redirect_container=Output( 'redirect-container', 'children', allow_duplicate=True ), - menu_current_key=Output('current-key-container', 'data'), + current_pathname=Output('current-pathname-container', 'data'), + router_list=Output('router-list-container', 'data'), search_panel_data=Output('search-panel', 'data'), ), inputs=dict(pathname=Input('url-container', 'pathname')), @@ -39,6 +40,7 @@ def router(pathname, url_trigger, session_token): current_user = LoginApi.get_info() router_list_result = RouterApi.get_routers() router_list = router_list_result['data'] + router_list = RouterConfig.CONSTANT_ROUTES + router_list menu_info = RouterUtil.generate_menu_tree(router_list) permissions = { 'perms': current_user['permissions'], @@ -51,26 +53,24 @@ def router(pathname, url_trigger, session_token): ) CacheManager.set(cache_obj) menu_info = CacheManager.get('menu_info') - dynamic_valid_pathname_list = find_node_values(menu_info, 'href') - valid_href_list = ( - dynamic_valid_pathname_list + RouterConfig.STATIC_VALID_PATHNAME + valid_pathname_list = RouterUtil.generate_validate_pathname_list( + menu_info ) - if pathname in valid_href_list: - current_key = find_key_by_href(menu_info, pathname) - if pathname == '/': - current_key = '首页' - if pathname == '/user/profile': - current_key = '个人资料' + if pathname in valid_pathname_list: if url_trigger == 'load': # 根据pathname控制渲染行为 - if pathname == '/login' or pathname == '/forget': + if pathname in [ + route.get('path') + for route in RouterConfig.WHITE_ROUTES_LIST + ]: # 重定向到主页面 return dict( app_mount=no_update, redirect_container=dcc.Location( pathname='/', id='router-redirect' ), - menu_current_key=no_update, + current_pathname=no_update, + router_list=no_update, search_panel_data=no_update, ) @@ -82,9 +82,10 @@ def router(pathname, url_trigger, session_token): ) # 否则正常渲染主页面 return dict( - app_mount=layout.render_content(user_menu_info), + app_mount=views.layout.render(user_menu_info), redirect_container=None, - menu_current_key=current_key, + current_pathname=pathname, + router_list=menu_info, search_panel_data=search_panel_data, ) @@ -92,45 +93,35 @@ def router(pathname, url_trigger, session_token): return dict( app_mount=no_update, redirect_container=None, - menu_current_key=current_key, + current_pathname=pathname, + router_list=no_update, search_panel_data=no_update, ) else: # 渲染404状态页 return dict( - app_mount=page_404.render_content(), + app_mount=views.page_404.render(), redirect_container=None, - menu_current_key=no_update, + current_pathname=no_update, + router_list=no_update, search_panel_data=no_update, ) else: # 若未登录 # 根据pathname控制渲染行为 - if pathname == '/login': - return dict( - app_mount=login.render_content(), - redirect_container=None, - menu_current_key=no_update, - search_panel_data=no_update, - ) - - if pathname == '/forget': - return dict( - app_mount=forget.render_forget_content(), - redirect_container=None, - menu_current_key=no_update, - search_panel_data=no_update, - ) + for route in RouterConfig.WHITE_ROUTES_LIST: + if pathname == route.get('path'): + component = route.get('component') or 'page_404' - if pathname == '/register': - return dict( - app_mount=register.render_register_content(), - redirect_container=None, - menu_current_key=no_update, - search_panel_data=no_update, - ) + return dict( + app_mount=import_module('views.' + component).render(), + redirect_container=None, + current_pathname=no_update, + router_list=no_update, + search_panel_data=no_update, + ) # 否则重定向到登录页 return dict( @@ -138,6 +129,7 @@ def router(pathname, url_trigger, session_token): redirect_container=dcc.Location( pathname='/login', id='router-redirect' ), - menu_current_key=no_update, + current_pathname=no_update, + router_list=no_update, search_panel_data=no_update, ) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py index 3a86dec..d75b94e 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/reset_pwd_c.py @@ -74,5 +74,8 @@ def close_personal_info_modal(close_click, tab_close_counts): 关闭当前个人资料标签页回调 """ if close_click: - return ['个人资料', tab_close_counts + 1 if tab_close_counts else 1] + return [ + 'Profile/user/profile', + tab_close_counts + 1 if tab_close_counts else 1, + ] raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py index ceef290..0b79b56 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/profile_c/user_info_c.py @@ -67,5 +67,5 @@ def close_personal_info_modal(close_click, tab_close_counts): 关闭当前个人资料标签页回调 """ if close_click: - return ['个人资料', tab_close_counts + 1 if tab_close_counts else 1] + return ['Profile/user/profile', tab_close_counts + 1 if tab_close_counts else 1] raise PreventUpdate diff --git a/dash-fastapi-frontend/store/store.py b/dash-fastapi-frontend/store/store.py index 95f8e4d..a8eba3c 100644 --- a/dash-fastapi-frontend/store/store.py +++ b/dash-fastapi-frontend/store/store.py @@ -2,22 +2,20 @@ from dash import html, dcc def render_store_container(): - return html.Div( [ # 应用主题颜色存储容器 dcc.Store(id='system-app-primary-color-container', data='#1890ff'), - dcc.Store(id='custom-app-primary-color-container', storage_type='session'), - # 接口校验返回存储容器 - dcc.Store(id='api-check-token'), + dcc.Store( + id='custom-app-primary-color-container', storage_type='session' + ), # 接口校验返回存储容器 dcc.Store(id='api-check-result-container'), # token存储容器 dcc.Store(id='token-container', storage_type='session'), - # 菜单信息存储容器 - dcc.Store(id='menu-info-store-container'), - dcc.Store(id='menu-list-store-container'), - # 菜单current_key存储容器 - dcc.Store(id='current-key-container'), + # 当前路由存储容器 + dcc.Store(id='current-pathname-container'), + # 路由列表存储容器 + dcc.Store(id='router-list-container'), ] ) diff --git a/dash-fastapi-frontend/utils/log_util.py b/dash-fastapi-frontend/utils/log_util.py index edf2cdb..66089dd 100644 --- a/dash-fastapi-frontend/utils/log_util.py +++ b/dash-fastapi-frontend/utils/log_util.py @@ -1,7 +1,7 @@ import os import time from loguru import logger -from config.global_config import PathConfig +from config.env import PathConfig log_time = time.strftime('%Y%m%d', time.localtime()) diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index 1aba457..f8c7940 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -10,7 +10,7 @@ from config.exception import ( ) from config.constant import HttpStatusConstant from config.enums import ApiMethod -from config.global_config import ApiBaseUrlConfig +from config.env import ApiConfig from utils.cache_util import CacheManager from utils.log_util import logger @@ -40,7 +40,7 @@ def api_request( :param stream: 是否为流式请求 :return: 请求结果 """ - api_url = ApiBaseUrlConfig.BaseUrl + url + api_url = ApiConfig.BaseUrl + url api_method = method.value user_agent = request.headers.get('User-Agent') authorization = ( diff --git a/dash-fastapi-frontend/utils/router_util.py b/dash-fastapi-frontend/utils/router_util.py index 6b53e72..1cdf703 100644 --- a/dash-fastapi-frontend/utils/router_util.py +++ b/dash-fastapi-frontend/utils/router_util.py @@ -21,20 +21,24 @@ class RouterUtil: menu_list = [] for router in router_list: copy_router = deepcopy(router) + if ( + copy_router.get('path') in ['', '/'] + and len(copy_router.get('children') or []) == 1 + ): + copy_router = copy_router['children'][0] copy_router['path'] = ( copy_router.get('path') if copy_router.get('path') and ( copy_router.get('path').startswith('/') or cls.is_http(copy_router.get('path')) - or copy_router.get('component') == MenuConstant.INNER_LINK ) else '/' + copy_router.get('path') ) meta = copy_router.get('meta') if copy_router.get('meta') else {} copy_router['props'] = { **meta, - 'key': copy_router.get('name') + copy_router.get('path'), + 'key': copy_router.get('name') + path + copy_router.get('path'), 'href': path + copy_router.get('path'), } if copy_router.get('component') in [ @@ -138,6 +142,26 @@ class RouterUtil: return search_panel_data + @classmethod + def generate_validate_pathname_list(cls, menu_list: List): + """ + 生成合法路由列表 + + :param menu_list: 菜单列表 + :return: 合法路由列表 + """ + validate_pathname_list = [] + for item in menu_list: + if item.get('children'): + validate_pathname_list.extend( + cls.generate_validate_pathname_list(item.get('children')) + ) + else: + href = item.get('props').get('href') + validate_pathname_list.append(href) + + return validate_pathname_list + @classmethod def __genrate_item_menu(cls, router: Dict, modules: str): """ diff --git a/dash-fastapi-frontend/views/dashboard/__init__.py b/dash-fastapi-frontend/views/dashboard/__init__.py index da12fc7..938daaa 100644 --- a/dash-fastapi-frontend/views/dashboard/__init__.py +++ b/dash-fastapi-frontend/views/dashboard/__init__.py @@ -1,7 +1,7 @@ from .components import page_top, page_bottom -def render_dashboard(): +def render(): return [ page_top.render_page_top(), page_bottom.render_page_bottom() diff --git a/dash-fastapi-frontend/views/dashboard/components/page_top.py b/dash-fastapi-frontend/views/dashboard/components/page_top.py index ed4f587..6adc3f8 100644 --- a/dash-fastapi-frontend/views/dashboard/components/page_top.py +++ b/dash-fastapi-frontend/views/dashboard/components/page_top.py @@ -1,7 +1,7 @@ import feffery_antd_components as fac import feffery_utils_components as fuc from dash import html -from config.global_config import ApiBaseUrlConfig +from config.env import ApiConfig from utils.cache_util import CacheManager @@ -12,7 +12,7 @@ def render_page_top(): fac.AntdAvatar( id='dashboard-avatar-info', mode='image', - src=f"{ApiBaseUrlConfig.BaseUrl}{CacheManager.get('user_info').get('avatar')}" + src=f"{ApiConfig.BaseUrl}{CacheManager.get('user_info').get('avatar')}" if CacheManager.get('user_info').get('avatar') else '/assets/imgs/profile.jpg', size='large', diff --git a/dash-fastapi-frontend/views/forget.py b/dash-fastapi-frontend/views/forget.py index 9d4dc95..c6656a4 100644 --- a/dash-fastapi-frontend/views/forget.py +++ b/dash-fastapi-frontend/views/forget.py @@ -4,7 +4,7 @@ from dash import dcc, html from callbacks import forget_c # noqa: F401 -def render_forget_content(): +def render(): return html.Div( [ fac.AntdCard( diff --git a/dash-fastapi-frontend/views/layout/__init__.py b/dash-fastapi-frontend/views/layout/__init__.py index 52b992b..b5e2b61 100644 --- a/dash-fastapi-frontend/views/layout/__init__.py +++ b/dash-fastapi-frontend/views/layout/__init__.py @@ -1,42 +1,32 @@ -from dash import html -import feffery_utils_components as fuc import feffery_antd_components as fac - -from views.layout.components.head import render_head_content -from views.layout.components.content import render_main_content +import feffery_utils_components as fuc +from dash import html +from callbacks.layout_c import fold_side_menu # noqa: F401 +from callbacks.layout_c import index_c # noqa: F401 from views.layout.components.aside import render_aside_content -import callbacks.layout_c.fold_side_menu -import callbacks.layout_c.index_c - +from views.layout.components.content import render_main_content +from views.layout.components.head import render_head_content -def render_content(menu_info): +def render(menu_info): return fuc.FefferyTopProgress( html.Div( [ # 全局重载 fuc.FefferyReload(id='trigger-reload-output'), - html.Div(id='idle-placeholder-container'), - # 布局设置抽屉 fac.AntdDrawer( [ fac.AntdText( '主题颜色', - style={ - 'fontSize': 16, - 'fontWeight': 500 - } + style={'fontSize': 16, 'fontWeight': 500}, ), fuc.FefferyHexColorPicker( id='hex-color-picker', color='#1890ff', showAlpha=True, - style={ - 'width': '100%', - 'marginTop': '10px' - } + style={'width': '100%', 'marginTop': '10px'}, ), fac.AntdInput( id='selected-color-input', @@ -44,57 +34,54 @@ def render_content(menu_info): readOnly=True, style={ 'marginTop': '15px', - 'background': '#1890ff' - } + 'background': '#1890ff', + }, ), fac.AntdSpace( [ fac.AntdButton( [ - fac.AntdIcon( - icon='antd-save' - ), + fac.AntdIcon(icon='antd-save'), '保存配置', ], id='save-setting', - type='primary' + type='primary', ), fac.AntdButton( [ - fac.AntdIcon( - icon='antd-sync' - ), + fac.AntdIcon(icon='antd-sync'), '重置配置', ], id='reset-setting', ), ], - style={ - 'marginTop': '15px' - } - ) + style={'marginTop': '15px'}, + ), ], id='layout-setting-drawer', visible=False, title='布局设置', - width=320 + width=320, ), - # 退出登录对话框提示 fac.AntdModal( html.Div( [ - fac.AntdIcon(icon='fc-info', style={'font-size': '28px'}), - fac.AntdText('确定注销并退出系统吗?', style={'margin-left': '5px'}), + fac.AntdIcon( + icon='fc-info', style={'font-size': '28px'} + ), + fac.AntdText( + '确定注销并退出系统吗?', + style={'margin-left': '5px'}, + ), ] ), id='logout-modal', visible=False, title='提示', renderFooter=True, - centered=True + centered=True, ), - # 平台主页面 fac.AntdRow( [ @@ -108,8 +95,8 @@ def render_content(menu_info): 'height': '100vh', 'overflowY': 'auto', 'transition': 'width 1s', - 'background': '#001529' - } + 'background': '#001529', + }, ), ), id='left-side-menu-container', @@ -117,7 +104,6 @@ def render_content(menu_info): # 'flex': '1' # } ), - # 右侧区域 fac.AntdCol( [ @@ -130,26 +116,18 @@ def render_content(menu_info): 'marginBottom': '10px', 'position': 'sticky', 'top': 0, - 'zIndex': 999 - } + 'zIndex': 999, + }, ), - fac.AntdRow( - render_main_content(), - wrap=False - ) + fac.AntdRow(render_main_content(), wrap=False), ], - style={ - 'flex': '6', - 'width': '300px' - } + style={'flex': '6', 'width': '300px'}, ), ], - ) + ), ], id='index-main-content-container', ), listenPropsMode='include', - includeProps=[ - 'tabs-container.items' - ] + includeProps=['tabs-container.items'], ) diff --git a/dash-fastapi-frontend/views/layout/components/aside.py b/dash-fastapi-frontend/views/layout/components/aside.py index 8cb5d25..afb6e2c 100644 --- a/dash-fastapi-frontend/views/layout/components/aside.py +++ b/dash-fastapi-frontend/views/layout/components/aside.py @@ -1,10 +1,14 @@ import dash +from dash import dcc import feffery_antd_components as fac from callbacks.layout_c import aside_c # noqa: F401 def render_aside_content(menu_info): return [ + dcc.Store(id='current-key_path-store'), + dcc.Store(id='current-item-store'), + dcc.Store(id='current-item_path-store'), fac.AntdSider( [ fac.AntdRow( @@ -52,18 +56,7 @@ def render_aside_content(menu_info): ), fac.AntdMenu( id='index-side-menu', - menuItems=[ - { - 'component': 'Item', - 'props': { - 'key': '首页', - 'title': '首页', - 'icon': 'antd-dashboard', - 'href': '/', - }, - } - ] - + menu_info, + menuItems=menu_info, mode='inline', theme='dark', defaultSelectedKey='首页', diff --git a/dash-fastapi-frontend/views/layout/components/content.py b/dash-fastapi-frontend/views/layout/components/content.py index c0f577d..01ecbdf 100644 --- a/dash-fastapi-frontend/views/layout/components/content.py +++ b/dash-fastapi-frontend/views/layout/components/content.py @@ -1,7 +1,7 @@ from dash import html import feffery_antd_components as fac -from views.dashboard import render_dashboard +from views.dashboard import render def render_main_content(): @@ -14,26 +14,26 @@ def render_main_content(): items=[ { 'label': '首页', - 'key': '首页', + 'key': 'Index/', 'closable': False, - 'children': render_dashboard(), + 'children': render(), 'contextMenu': [ { 'key': '刷新页面', 'label': '刷新页面', - 'icon': 'antd-reload' + 'icon': 'antd-reload', }, { 'key': '关闭其他', 'label': '关闭其他', - 'icon': 'antd-close-circle' + 'icon': 'antd-close-circle', }, { 'key': '全部关闭', 'label': '全部关闭', - 'icon': 'antd-close-circle' - } - ] + 'icon': 'antd-close-circle', + }, + ], } ], id='tabs-container', @@ -42,17 +42,17 @@ def render_main_content(): style={ 'width': '100%', 'paddingLeft': '15px', - 'paddingRight': '15px' - } + 'paddingRight': '15px', + }, ), # id='index-main-content-container', style={ 'width': '100%', 'height': '100%', 'backgroundColor': 'white', - } + }, ) ], - flex='auto' + flex='auto', ) ] diff --git a/dash-fastapi-frontend/views/layout/components/head.py b/dash-fastapi-frontend/views/layout/components/head.py index 2fdb5c2..71dd0b2 100644 --- a/dash-fastapi-frontend/views/layout/components/head.py +++ b/dash-fastapi-frontend/views/layout/components/head.py @@ -1,7 +1,7 @@ import feffery_antd_components as fac from dash import html from callbacks.layout_c import head_c # noqa: F401 -from config.global_config import ApiBaseUrlConfig +from config.env import ApiConfig from utils.cache_util import CacheManager @@ -80,7 +80,7 @@ def render_head_content(): fac.AntdAvatar( id='avatar-info', mode='image', - src=f"{ApiBaseUrlConfig.BaseUrl}{CacheManager.get('user_info').get('avatar')}" + src=f"{ApiConfig.BaseUrl}{CacheManager.get('user_info').get('avatar')}" if CacheManager.get('user_info').get('avatar') else '/assets/imgs/profile.jpg', size=36, diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index 267319b..784bbf8 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -5,7 +5,7 @@ from dash import dcc, html from callbacks import login_c # noqa: F401 -def render_content(): +def render(): return html.Div( [ dcc.Store(id='login-success-container'), diff --git a/dash-fastapi-frontend/views/page_404.py b/dash-fastapi-frontend/views/page_404.py index 654bf70..ef0a10d 100644 --- a/dash-fastapi-frontend/views/page_404.py +++ b/dash-fastapi-frontend/views/page_404.py @@ -1,9 +1,8 @@ -from dash import html import feffery_antd_components as fac +from dash import html -def render_content(): - +def render(): return html.Div( [ html.Div( @@ -12,27 +11,19 @@ def render_content(): status='404', title='页面不存在', subTitle='检查您的网址输入是否正确', - style={ - 'paddingBottom': 0, - 'paddingTop': 0 - } + style={'paddingBottom': 0, 'paddingTop': 0}, ), fac.AntdButton( - '回到首页', - type='link', - href='/', - target='_self' - ) + '回到首页', type='link', href='/', target='_self' + ), ], - style={ - 'textAlign': 'center' - } + style={'textAlign': 'center'}, ) ], style={ 'height': '100vh', 'display': 'flex', 'alignItems': 'center', - 'justifyContent': 'center' - } + 'justifyContent': 'center', + }, ) diff --git a/dash-fastapi-frontend/views/register.py b/dash-fastapi-frontend/views/register.py index edd595c..eac9fdc 100644 --- a/dash-fastapi-frontend/views/register.py +++ b/dash-fastapi-frontend/views/register.py @@ -4,7 +4,7 @@ from dash import dcc, html from callbacks import register_c # noqa: F401 -def render_register_content(): +def render(): return html.Div( [ fac.AntdCard( diff --git a/dash-fastapi-frontend/views/system/menu/components/icon_category.py b/dash-fastapi-frontend/views/system/menu/components/icon_category.py index f6a44e1..dc46288 100644 --- a/dash-fastapi-frontend/views/system/menu/components/icon_category.py +++ b/dash-fastapi-frontend/views/system/menu/components/icon_category.py @@ -1,10 +1,9 @@ from dash import html import feffery_antd_components as fac -from config.global_config import IconConfig +from config.env import IconConfig def render_icon(): - return html.Div( [ fac.AntdRadioGroup( @@ -14,18 +13,12 @@ def render_icon(): 'label': fac.AntdIcon( icon=icon, ), - 'value': icon + 'value': icon, } for icon in IconConfig.ICON_LIST ], - style={ - 'width': 450, - 'paddingLeft': '10px' - } + style={'width': 450, 'paddingLeft': '10px'}, ), ], - style={ - 'maxHeight': '135px', - 'overflow': 'auto' - } + style={'maxHeight': '135px', 'overflow': 'auto'}, ) diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index ed67996..b028eb5 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -6,7 +6,7 @@ from flask import session from callbacks.system_c import notice_c from components.ApiRadioGroup import ApiRadioGroup from components.ApiSelect import ApiSelect -from config.global_config import ApiBaseUrlConfig +from config.env import ApiConfig from utils.permission_util import PermissionManager @@ -390,12 +390,12 @@ def render(*args, **kwargs): 'placeholder': '请输入...' }, uploadImage={ - 'server': f'{ApiBaseUrlConfig.BaseUrl}/common/uploadForEditor', + 'server': f'{ApiConfig.BaseUrl}/common/uploadForEditor', 'fieldName': 'file', 'maxFileSize': 10 * 1024 * 1024, 'maxNumberOfFiles': 10, 'meta': { - 'baseUrl': ApiBaseUrlConfig.BaseUrl, + 'baseUrl': ApiConfig.BaseUrl, 'uploadId': str( uuid.uuid4() ), @@ -413,14 +413,14 @@ def render(*args, **kwargs): 'base64LimitSize': 500 * 1024, }, uploadVideo={ - 'server': f'{ApiBaseUrlConfig.BaseUrl}/common/uploadForEditor', + 'server': f'{ApiConfig.BaseUrl}/common/uploadForEditor', 'fieldName': 'file', 'maxFileSize': 100 * 1024 * 1024, 'maxNumberOfFiles': 3, 'meta': { - 'baseUrl': ApiBaseUrlConfig.BaseUrl, + 'baseUrl': ApiConfig.BaseUrl, 'uploadId': str( uuid.uuid4() ), diff --git a/dash-fastapi-frontend/views/system/user/profile/user_avatar.py b/dash-fastapi-frontend/views/system/user/profile/user_avatar.py index 58089af..b131078 100644 --- a/dash-fastapi-frontend/views/system/user/profile/user_avatar.py +++ b/dash-fastapi-frontend/views/system/user/profile/user_avatar.py @@ -2,7 +2,7 @@ import feffery_antd_components as fac import feffery_utils_components as fuc from dash import html, dcc from callbacks.system_c.user_c.profile_c import avatar_c # noqa: F401 -from config.global_config import ApiBaseUrlConfig +from config.env import ApiConfig def render(avatar_path): @@ -11,7 +11,7 @@ def render(avatar_path): [ fac.AntdImage( id='user-avatar-image-info', - src=f'{ApiBaseUrlConfig.BaseUrl}{avatar_path}' + src=f'{ApiConfig.BaseUrl}{avatar_path}' if avatar_path else '/assets/imgs/profile.jpg', preview=False, diff --git a/dash-fastapi-frontend/views/tool/swagger/__init__.py b/dash-fastapi-frontend/views/tool/swagger/__init__.py index aeafa30..2f3eaf4 100644 --- a/dash-fastapi-frontend/views/tool/swagger/__init__.py +++ b/dash-fastapi-frontend/views/tool/swagger/__init__.py @@ -1,10 +1,9 @@ from dash import html import feffery_utils_components as fuc -from config.global_config import ApiBaseUrlConfig +from config.env import ApiConfig def render(*args, **kwargs): - return [ html.Div( [ @@ -18,14 +17,9 @@ def render(*args, **kwargs): } """ ), - html.Iframe( - src=f'{ApiBaseUrlConfig.BaseUrl}/docs' - ) + html.Iframe(src=f'{ApiConfig.BaseUrl}/docs'), ], id='swagger-docs-container', - style={ - 'position': 'relative', - 'height': 'calc(100vh - 120px)' - } + style={'position': 'relative', 'height': 'calc(100vh - 120px)'}, ) ] -- Gitee From a325396fc88f60f8d52f89d63cc7585fd24b57fe Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 25 Sep 2024 17:17:45 +0800 Subject: [PATCH 173/229] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E8=A1=A8=E6=A0=BC=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/system/menu/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index b114d33..b7d762f 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -256,6 +256,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 240, 'renderOptions': { 'renderType': 'button' }, -- Gitee From bb72470223c6824a2fb5c9e763e954b6854b8205 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 25 Sep 2024 17:18:23 +0800 Subject: [PATCH 174/229] =?UTF-8?q?feat:=20=E9=9D=A2=E5=8C=85=E5=B1=91?= =?UTF-8?q?=E6=AF=8F=E4=B8=AA=E5=AD=90=E5=85=83=E7=B4=A0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=8F=9C=E5=8D=95icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/layout_c/index_c.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/callbacks/layout_c/index_c.py b/dash-fastapi-frontend/callbacks/layout_c/index_c.py index 4cfea31..91f7530 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/index_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/index_c.py @@ -65,7 +65,10 @@ def handle_tab_switch_and_create( pass else: breadcrumb_items = breadcrumb_items + [ - {'title': item.get('props').get('title')} + { + 'title': item.get('props').get('title'), + 'icon': item.get('props').get('icon'), + } for item in currentItemPath ] # 判断当前新选中的菜单栏项对应标签页是否已创建 -- Gitee From 0fc6a96bb2fbddee3b8511856f551d7e25a4c6be Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:07:03 +0800 Subject: [PATCH 175/229] =?UTF-8?q?feat:=20=E5=B2=97=E4=BD=8D=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/system_c/post_c.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 3a93cd9..a5949e8 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -463,15 +463,23 @@ def post_delete_confirm(delete_confirm, post_ids_data): Output('post-export-complete-judge-container', 'data'), ], Input('post-export', 'nClicks'), + [ + State('post-post_code-input', 'value'), + State('post-post_name-input', 'value'), + State('post-status-select', 'value'), + ], running=[[Output('post-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_post_list(export_click): +def export_post_list(export_click, post_code, post_name, status): """ 导出岗位信息回调 """ if export_click: - export_post_res = PostApi.export_post({}) + export_params = dict( + post_code=post_code, post_name=post_name, status=status + ) + export_post_res = PostApi.export_post(export_params) export_post = export_post_res.content MessageManager.success(content='导出成功') -- Gitee From acf443814c42eb7d9d4e44129e1d562b6bc3b183 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:07:16 +0800 Subject: [PATCH 176/229] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/config_c.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 670835e..af00169 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -487,15 +487,35 @@ def config_delete_confirm(delete_confirm, config_ids_data): Output('config-export-complete-judge-container', 'data'), ], Input('config-export', 'nClicks'), + [ + State('config-config_name-input', 'value'), + State('config-config_key-input', 'value'), + State('config-config_type-select', 'value'), + State('config-create_time-range', 'value'), + ], running=[[Output('config-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_config_list(export_click): +def export_config_list( + export_click, config_name, config_key, config_type, create_time_range +): """ 导出参数设置信息回调 """ if export_click: - export_config_res = ConfigApi.export_config({}) + begin_time = None + end_time = None + if create_time_range: + begin_time = create_time_range[0] + end_time = create_time_range[1] + export_params = dict( + config_name=config_name, + config_key=config_key, + config_type=config_type, + begin_time=begin_time, + end_time=end_time, + ) + export_config_res = ConfigApi.export_config(export_params) export_config = export_config_res.content MessageManager.success(content='导出成功') -- Gitee From 951def704b7c70707f5b4691d0bbc1df856a3d6d Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:07:25 +0800 Subject: [PATCH 177/229] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/user_c/user_c.py | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index fe99610..bd0daac 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -846,15 +846,45 @@ def download_user_template(download_click): ), ], Input('user-export', 'nClicks'), + [ + State('dept-tree', 'selectedKeys'), + State('user-user_name-input', 'value'), + State('user-phone_number-input', 'value'), + State('user-status-select', 'value'), + State('user-create_time-range', 'value'), + ], running=[[Output('user-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_user_list(export_click): +def export_user_list( + export_click, + selected_dept_tree, + user_name, + phone_number, + status_select, + create_time_range, +): """ 导出用户信息回调 """ if export_click: - export_user_res = UserApi.export_user({}) + dept_id = None + begin_time = None + end_time = None + if create_time_range: + begin_time = create_time_range[0] + end_time = create_time_range[1] + if selected_dept_tree: + dept_id = int(selected_dept_tree[0]) + export_params = dict( + dept_id=dept_id, + user_name=user_name, + phonenumber=phone_number, + status=status_select, + begin_time=begin_time, + end_time=end_time, + ) + export_user_res = UserApi.export_user(export_params) MessageManager.success(content='导出成功') export_user = export_user_res.content -- Gitee From 122e1b7f09a10a1f409e16edb58466a102650a36 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:07:33 +0800 Subject: [PATCH 178/229] =?UTF-8?q?feat:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/role_c/role_c.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 458a9dd..29986e3 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -712,15 +712,35 @@ def role_to_allocated_user_modal(allocated_click, allocated_user_search_nclick): Output('role-export-complete-judge-container', 'data'), ], Input('role-export', 'nClicks'), + [ + State('role-role_name-input', 'value'), + State('role-role_key-input', 'value'), + State('role-status-select', 'value'), + State('role-create_time-range', 'value'), + ], running=[[Output('role-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_role_list(export_click): +def export_role_list( + export_click, role_name, role_key, status_select, create_time_range +): """ 导出角色信息回调 """ if export_click: - export_role_res = RoleApi.export_role({}) + begin_time = None + end_time = None + if create_time_range: + begin_time = create_time_range[0] + end_time = create_time_range[1] + export_params = dict( + role_name=role_name, + role_key=role_key, + status=status_select, + begin_time=begin_time, + end_time=end_time, + ) + export_role_res = RoleApi.export_role(export_params) export_role = export_role_res.content MessageManager.success(content='导出成功') -- Gitee From f6bdc616bef198e4015473c0f16fb2353a7aa41f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:07:44 +0800 Subject: [PATCH 179/229] =?UTF-8?q?feat:=20=E5=AD=97=E5=85=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 25 +++++++++++++++++-- .../callbacks/system_c/dict_c/dict_data_c.py | 15 ++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index f709f66..b9bc508 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -558,15 +558,36 @@ def dict_type_to_dict_data_modal( Output('dict_type-export-complete-judge-container', 'data'), ], Input('dict_type-export', 'nClicks'), + [ + State('dict_type-dict_name-input', 'value'), + State('dict_type-dict_type-input', 'value'), + State('dict_type-status-select', 'value'), + State('dict_type-create_time-range', 'value'), + ], running=[[Output('dict_type-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_dict_type_list(export_click): +def export_dict_type_list( + export_click, dict_name, dict_type, status_select, create_time_range +): """ 导出字典类型信息回调 """ if export_click: - export_dict_type_res = DictTypeApi.export_type({}) + begin_time = None + end_time = None + if create_time_range: + begin_time = create_time_range[0] + end_time = create_time_range[1] + + export_params = dict( + dict_name=dict_name, + dict_type=dict_type, + status=status_select, + begin_time=begin_time, + end_time=end_time, + ) + export_dict_type_res = DictTypeApi.export_type(export_params) export_dict_type = export_dict_type_res.content MessageManager.success(content='导出成功') diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index aea420b..e89c949 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -478,18 +478,25 @@ def dict_data_delete_confirm(delete_confirm, dict_codes_data): Output('dict_data-export-complete-judge-container', 'data'), ], Input('dict_data-export', 'nClicks'), - State('dict_data-dict_type-select', 'value'), + [ + State('dict_data-dict_type-select', 'value'), + State('dict_data-dict_label-input', 'value'), + State('dict_data-status-select', 'value'), + ], running=[[Output('dict_data-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_dict_data_list(export_click, dict_type): +def export_dict_data_list(export_click, dict_type, dict_label, status_select): """ 导出字典数据信息回调 """ if export_click: - export_dict_data_res = DictDataApi.export_data( - dict(dict_type=dict_type) + export_params = dict( + dict_type=dict_type, + dict_label=dict_label, + status=status_select, ) + export_dict_data_res = DictDataApi.export_data(export_params) export_dict_data = export_dict_data_res.content MessageManager.success('导出成功') -- Gitee From a01823944cd678583a3b7224b71024b738cb4c6e Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:07:56 +0800 Subject: [PATCH 180/229] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 14 +++++++++-- .../callbacks/monitor_c/job_c/job_log_c.py | 24 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 1f6412b..75431ef 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -663,15 +663,25 @@ def job_to_job_log_modal( Output('job-export-complete-judge-container', 'data'), ], Input('job-export', 'nClicks'), + [ + State('job-job_name-input', 'value'), + State('job-job_group-select', 'value'), + State('job-status-select', 'value'), + ], running=[[Output('job-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_job_list(export_click): +def export_job_list(export_click, job_name, job_group, status_select): """ 导出定时任务信息回调 """ if export_click: - export_job_res = JobApi.export_job({}) + export_params = dict( + job_name=job_name, + job_group=job_group, + status=status_select, + ) + export_job_res = JobApi.export_job(export_params) export_job = export_job_res.content MessageManager.success(content='导出成功') diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index fc579d6..78da796 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -283,15 +283,35 @@ def job_log_delete_confirm(delete_confirm, job_log_ids_data): Output('job_log-export-complete-judge-container', 'data'), ], Input('job_log-export', 'nClicks'), + [ + State('job_log-job_name-input', 'value'), + State('job_log-job_group-select', 'value'), + State('job_log-status-select', 'value'), + State('job_log-create_time-range', 'value'), + ], running=[[Output('job_log-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_job_log_list(export_click): +def export_job_log_list( + export_click, job_name, job_group, status_select, create_time_range +): """ 导出定时任务调度日志信息回调 """ if export_click: - export_job_log_res = JobLogApi.export_job_log({}) + begin_time = None + end_time = None + if create_time_range: + begin_time = create_time_range[0] + end_time = create_time_range[1] + export_params = dict( + job_name=job_name, + job_group=job_group, + status=status_select, + begin_time=begin_time, + end_time=end_time, + ) + export_job_log_res = JobLogApi.export_job_log(export_params) export_job_log = export_job_log_res.content MessageManager.success(content='导出成功') -- Gitee From 2396658e1d83c2293ff33ecf19e8bb61307fc395 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:09:25 +0800 Subject: [PATCH 181/229] =?UTF-8?q?feat:=20=E7=99=BB=E5=BD=95=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/logininfor_c.py | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index d371633..440130c 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -270,15 +270,38 @@ def login_log_delete_confirm(delete_confirm, info_ids_data): Output('login_log-export-complete-judge-container', 'data'), ], Input('login_log-export', 'nClicks'), + [ + State('login_log-list-table', 'sorter'), + State('login_log-ipaddr-input', 'value'), + State('login_log-user_name-input', 'value'), + State('login_log-status-select', 'value'), + State('login_log-login_time-range', 'value'), + ], running=[[Output('login_log-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_login_log_list(export_click): +def export_login_log_list( + export_click, sorter, ipaddr, user_name, status_select, login_time_range +): """ 导出登录日志信息回调 """ if export_click: - export_login_log_res = LogininforApi.export_logininfor({}) + begin_time = None + end_time = None + if login_time_range: + begin_time = login_time_range[0] + end_time = login_time_range[1] + export_params = dict( + ipaddr=ipaddr, + user_name=user_name, + status=status_select, + begin_time=begin_time, + end_time=end_time, + order_by_column=sorter.get('columns')[0] if sorter else None, + is_asc=f"{sorter.get('orders')[0]}ing" if sorter else None, + ) + export_login_log_res = LogininforApi.export_logininfor(export_params) export_login_log = export_login_log_res.content MessageManager.success(content='导出成功') -- Gitee From d2bca41ba9d9258a00e01505d4296a2b4bcebe6a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:09:37 +0800 Subject: [PATCH 182/229] =?UTF-8?q?feat:=20=E6=93=8D=E4=BD=9C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/operlog_c.py | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index 3670e97..ede8d1f 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -329,15 +329,46 @@ def operation_log_delete_confirm(delete_confirm, oper_ids_data): Output('operation_log-export-complete-judge-container', 'data'), ], Input('operation_log-export', 'nClicks'), + [ + State('operation_log-list-table', 'sorter'), + State('operation_log-title-input', 'value'), + State('operation_log-oper_name-input', 'value'), + State('operation_log-business_type-select', 'value'), + State('operation_log-status-select', 'value'), + State('operation_log-oper_time-range', 'value'), + ], running=[[Output('operation_log-export', 'loading'), True, False]], prevent_initial_call=True, ) -def export_operation_log_list(export_click): +def export_operation_log_list( + export_click, + sorter, + title, + oper_name, + business_type, + status_select, + oper_time_range, +): """ 导出操作日志信息回调 """ if export_click: - export_operation_log_res = OperlogApi.export_operlog({}) + begin_time = None + end_time = None + if oper_time_range: + begin_time = oper_time_range[0] + end_time = oper_time_range[1] + export_params = dict( + title=title, + oper_name=oper_name, + business_type=business_type, + status=status_select, + begin_time=begin_time, + end_time=end_time, + order_by_column=sorter.get('columns')[0] if sorter else None, + is_asc=f"{sorter.get('orders')[0]}ing" if sorter else None, + ) + export_operation_log_res = OperlogApi.export_operlog(export_params) export_operation_log = export_operation_log_res.content MessageManager.success(content='导出成功') -- Gitee From a193f799b860062646822bfb7fcf2078cbdc3c59 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 15:09:59 +0800 Subject: [PATCH 183/229] =?UTF-8?q?style:=20=20=E7=A7=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/file.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dash-fastapi-frontend/utils/file.py diff --git a/dash-fastapi-frontend/utils/file.py b/dash-fastapi-frontend/utils/file.py deleted file mode 100644 index e69de29..0000000 -- Gitee From 80bbba442e569464110271733ff595a73ba63427 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 17:46:23 +0800 Subject: [PATCH 184/229] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/annotation/log_annotation.py | 4 ++-- dash-fastapi-backend/module_admin/service/online_service.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dash-fastapi-backend/module_admin/annotation/log_annotation.py b/dash-fastapi-backend/module_admin/annotation/log_annotation.py index 74bf12f..b93b940 100644 --- a/dash-fastapi-backend/module_admin/annotation/log_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/log_annotation.py @@ -108,10 +108,10 @@ class Log: system_os += f' {user_agent_info.os.version[0]}' login_log = dict( ipaddr=oper_ip, - loginLocation=oper_location, + login_location=oper_location, browser=browser, os=system_os, - loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'), + login_time=oper_time.strftime('%Y-%m-%d %H:%M:%S'), ) kwargs['form_data'].login_info = login_log try: diff --git a/dash-fastapi-backend/module_admin/service/online_service.py b/dash-fastapi-backend/module_admin/service/online_service.py index e172f42..fbcc68e 100644 --- a/dash-fastapi-backend/module_admin/service/online_service.py +++ b/dash-fastapi-backend/module_admin/service/online_service.py @@ -33,10 +33,10 @@ class OnlineService: user_name=payload.get('user_name'), dept_name=payload.get('dept_name'), ipaddr=payload.get('login_info').get('ipaddr'), - login_location=payload.get('login_info').get('loginLocation'), + login_location=payload.get('login_info').get('login_location'), browser=payload.get('login_info').get('browser'), os=payload.get('login_info').get('os'), - login_time=payload.get('login_info').get('loginTime'), + login_time=payload.get('login_info').get('login_time'), ) if query_object.user_name and not query_object.ipaddr: if query_object.user_name == payload.get('login_info').get('ipaddr'): -- Gitee From a1014ed51ac0a61a7efc76462b0b7c10054b1198 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 17:46:49 +0800 Subject: [PATCH 185/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=A0=BC=E5=BC=8F=E5=8C=96=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/time_format_util.py | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 dash-fastapi-frontend/utils/time_format_util.py diff --git a/dash-fastapi-frontend/utils/time_format_util.py b/dash-fastapi-frontend/utils/time_format_util.py new file mode 100644 index 0000000..b57c582 --- /dev/null +++ b/dash-fastapi-frontend/utils/time_format_util.py @@ -0,0 +1,82 @@ +from copy import deepcopy +from datetime import datetime +from dateutil.parser import parse +from typing import Dict, List, Union + + +class TimeFormatUtil: + """ + 时间格式化工具类 + """ + + @classmethod + def format_time( + cls, time_info: Union[str, datetime], format: str = '%Y-%m-%d %H:%M:%S' + ): + """ + 格式化时间字符串或datetime对象为指定格式 + + :param time_info: 时间字符串或datetime对象 + :param format: 格式化格式,默认为'%Y-%m-%d %H:%M:%S' + :return: 格式化后的时间字符串 + """ + if isinstance(time_info, datetime): + format_date = time_info.strftime(format) + else: + try: + date = parse(time_info) + format_date = date.strftime(format) + except Exception: + format_date = time_info + + return format_date + + @classmethod + def format_time_dict( + cls, time_dict: Dict, format: str = '%Y-%m-%d %H:%M:%S' + ): + """ + 格式化时间字典 + + :param time_dict: 时间字典 + :param format: 格式化格式,默认为'%Y-%m-%d %H:%M:%S' + :return: 格式化后的时间字典 + """ + copy_time_dict = deepcopy(time_dict) + for k, v in copy_time_dict.items(): + if isinstance(v, (str, datetime)): + copy_time_dict[k] = cls.format_time(v, format) + elif isinstance(v, dict): + copy_time_dict[k] = cls.format_time_dict(v, format) + elif isinstance(v, list): + copy_time_dict[k] = cls.format_time_list(v, format) + else: + copy_time_dict[k] = v + + return copy_time_dict + + @classmethod + def format_time_list( + cls, time_list: List, format: str = '%Y-%m-%d %H:%M:%S' + ): + """ + 格式化时间列表 + + :param time_list: 时间列表 + :param format: 格式化格式,默认为'%Y-%m-%d %H:%M:%S' + :return: 格式化后的时间列表 + """ + format_time_list = [] + for item in time_list: + if isinstance(item, (str, datetime)): + format_item = cls.format_time(item, format) + elif isinstance(item, dict): + format_item = cls.format_time_dict(item, format) + elif isinstance(item, list): + format_item = cls.format_time_list(item, format) + else: + format_item = item + + format_time_list.append(format_item) + + return format_time_list -- Gitee From aa5e7b5702d95e3b734cad4a4a28dbde0bec15e8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Thu, 26 Sep 2024 17:47:26 +0800 Subject: [PATCH 186/229] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=90=84?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=97=B6=E9=97=B4=E7=9B=B8=E5=85=B3=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py | 4 ++++ .../callbacks/monitor_c/job_c/job_log_c.py | 4 ++++ .../callbacks/monitor_c/logininfor_c.py | 2 ++ dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py | 4 ++++ dash-fastapi-frontend/callbacks/system_c/config_c.py | 4 ++++ dash-fastapi-frontend/callbacks/system_c/dept_c.py | 4 ++++ .../callbacks/system_c/dict_c/dict_c.py | 4 ++++ .../callbacks/system_c/dict_c/dict_data_c.py | 4 ++++ .../callbacks/system_c/menu_c/menu_c.py | 4 ++++ dash-fastapi-frontend/callbacks/system_c/notice_c.py | 4 ++++ dash-fastapi-frontend/callbacks/system_c/post_c.py | 4 ++++ .../callbacks/system_c/role_c/allocate_user_c.py | 4 ++++ .../callbacks/system_c/role_c/role_c.py | 4 ++++ .../callbacks/system_c/user_c/user_c.py | 7 +++++++ .../views/system/user/profile/__init__.py | 9 ++++++--- 15 files changed, 63 insertions(+), 3 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 75431ef..13f1c80 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -11,6 +11,7 @@ from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil def generate_job_table(query_params: Dict): @@ -496,6 +497,9 @@ def get_job_detail_modal( dict_type='sys_job_status', dict_value=job_info.get('status'), ) + job_info['create_time'] = TimeFormatUtil.format_time( + job_info.get('create_time') + ) return dict( modal_visible=True, modal_title='任务详情', diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py index 78da796..aa28fe1 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_log_c.py @@ -8,6 +8,7 @@ from server import app from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil @app.callback( @@ -91,6 +92,9 @@ def get_job_log_table_data( item['job_group_tag'] = DictManager.get_dict_tag( dict_type='sys_job_group', dict_value=item.get('job_group') ) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['job_log_id']) item['operation'] = [ {'content': '详情', 'type': 'link', 'icon': 'antd-eye'} diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index 440130c..e30d3fa 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -8,6 +8,7 @@ from api.monitor.logininfor import LogininforApi from server import app from utils.dict_util import DictManager from utils.feedback_util import MessageManager +from utils.time_format_util import TimeFormatUtil def generate_logininfor_table(query_params: Dict): @@ -31,6 +32,7 @@ def generate_logininfor_table(query_params: Dict): item['status_tag'] = DictManager.get_dict_tag( dict_type='sys_common_status', dict_value=item.get('status') ) + item['login_time'] = TimeFormatUtil.format_time(item.get('login_time')) item['key'] = str(item['info_id']) return [table_data, table_pagination] diff --git a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py index ede8d1f..9eee00f 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/operlog_c.py @@ -9,6 +9,7 @@ from server import app from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil def generate_operlog_table(query_params: Dict): @@ -37,6 +38,9 @@ def generate_operlog_table(query_params: Dict): dict_type='sys_oper_type', dict_value=item.get('business_type'), ) + item['oper_time'] = TimeFormatUtil.format_time( + item.get('oper_time') + ) item['key'] = str(item['oper_id']) item['cost_time'] = f"{item['cost_time']}毫秒" item['operation'] = [ diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index af00169..d4a5745 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -11,6 +11,7 @@ from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil def generate_config_table(query_params: Dict): @@ -34,6 +35,9 @@ def generate_config_table(query_params: Dict): item['config_type'] = DictManager.get_dict_tag( dict_type='sys_yes_no', dict_value=item.get('config_type') ) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['config_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 9ffb333..2e2c2b1 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -10,6 +10,7 @@ from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil from utils.tree_tool import list_to_tree, list_to_tree_select @@ -25,6 +26,9 @@ def generate_dept_table(query_params: Dict): table_data = table_info['data'] for item in table_data: default_expanded_row_keys.append(str(item['dept_id'])) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['dept_id']) if item['parent_id'] == 0: item['operation'] = [ diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index b9bc508..05f02e9 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -11,6 +11,7 @@ from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil def generate_dict_type_table(query_params: Dict): @@ -34,6 +35,9 @@ def generate_dict_type_table(query_params: Dict): item['status'] = DictManager.get_dict_tag( dict_type='sys_normal_disable', dict_value=item.get('status') ) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['dict_id']) item['dict_type'] = { 'content': item['dict_type'], diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index e89c949..6e79aed 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -10,6 +10,7 @@ from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil @app.callback( @@ -81,6 +82,9 @@ def get_dict_data_table_data( item['status'] = DictManager.get_dict_tag( dict_type='sys_normal_disable', dict_value=item.get('status') ) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['dict_code']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index 59fdf4c..666bca1 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -11,6 +11,7 @@ from server import app from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil from utils.tree_tool import list_to_tree, list_to_tree_select from views.system.menu.components import button_type, content_type, menu_type @@ -27,6 +28,9 @@ def generate_menu_table(query_params: Dict): table_data = table_info['data'] for item in table_data: default_expanded_row_keys.append(str(item['menu_id'])) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['menu_id']) item['icon'] = [ { diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index e17071e..4c936a1 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -10,6 +10,7 @@ from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil def generate_notice_table(query_params: Dict): @@ -36,6 +37,9 @@ def generate_notice_table(query_params: Dict): item['notice_type'] = DictManager.get_dict_tag( dict_type='sys_notice_type', dict_value=item.get('notice_type') ) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['notice_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index a5949e8..1ea680c 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -11,6 +11,7 @@ from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil def generate_post_table(query_params: Dict): @@ -34,6 +35,9 @@ def generate_post_table(query_params: Dict): item['status'] = DictManager.get_dict_tag( dict_type='sys_normal_disable', dict_value=item.get('status') ) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['post_id']) item['operation'] = [ {'content': '修改', 'type': 'link', 'icon': 'antd-edit'} diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py index e8af80a..0729cd1 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/allocate_user_c.py @@ -6,6 +6,7 @@ from api.system.role import RoleApi from server import app from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil @app.callback( @@ -96,6 +97,9 @@ def get_allocate_user_table_data( item['status'] = dict(tag='正常', color='blue') else: item['status'] = dict(tag='停用', color='volcano') + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['user_id']) if triggered_id.index == 'allocated': item['operation'] = [ diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 29986e3..cfbb30b 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -12,6 +12,7 @@ from server import app from utils.common import validate_data_not_empty from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil from utils.tree_tool import find_tree_all_keys @@ -37,6 +38,9 @@ def generate_role_table(query_params: Dict): item['status'] = dict(checked=True, disabled=item['role_id'] == 1) else: item['status'] = dict(checked=False, disabled=item['role_id'] == 1) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['role_id']) if item['role_id'] == 1: item['operation'] = [] diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index bd0daac..d76eb31 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -12,6 +12,7 @@ from server import app from utils.common import validate_data_not_empty from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.time_format_util import TimeFormatUtil def generate_user_table(query_params: Dict): @@ -39,6 +40,9 @@ def generate_user_table(query_params: Dict): item['dept_name'] = ( item.get('dept').get('dept_name') if item.get('dept') else None ) + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['user_id']) if item['user_id'] == 1: item['operation'] = [] @@ -715,6 +719,9 @@ def role_to_allocated_user_modal( table_data = allocated_role_info.get('roles') selected_row_keys = [] for item in table_data: + item['create_time'] = TimeFormatUtil.format_time( + item.get('create_time') + ) item['key'] = str(item['role_id']) if item.get('flag'): selected_row_keys.append(str(item['role_id'])) diff --git a/dash-fastapi-frontend/views/system/user/profile/__init__.py b/dash-fastapi-frontend/views/system/user/profile/__init__.py index 025a443..6e49077 100644 --- a/dash-fastapi-frontend/views/system/user/profile/__init__.py +++ b/dash-fastapi-frontend/views/system/user/profile/__init__.py @@ -2,6 +2,7 @@ import feffery_antd_components as fac import feffery_utils_components as fuc from dash import html from api.system.user import UserApi +from utils.time_format_util import TimeFormatUtil from . import reset_pwd, user_avatar, user_info @@ -124,9 +125,11 @@ def render(*args, **kwargs): ), fac.AntdText('创建日期'), html.Div( - user_profile.get( - 'data' - ).get('create_time'), + TimeFormatUtil.format_time( + user_profile.get( + 'data' + ).get('create_time') + ), id='profile_c-create_time', className='pull-right', ), -- Gitee From 9cc41543a00617874a099fad83313c392873cec9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 17:32:38 +0800 Subject: [PATCH 187/229] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=A3=85=E9=A5=B0=E5=99=A8=E6=97=A5=E5=BF=97=E6=89=93?= =?UTF-8?q?=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/annotation/log_annotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/annotation/log_annotation.py b/dash-fastapi-backend/module_admin/annotation/log_annotation.py index b93b940..c59b242 100644 --- a/dash-fastapi-backend/module_admin/annotation/log_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/log_annotation.py @@ -121,7 +121,7 @@ class Log: logger.warning(e.message) result = ResponseUtil.failure(data=e.data, msg=e.message) except ServiceException as e: - logger.exception(e) + logger.error(e.message) result = ResponseUtil.error(data=e.data, msg=e.message) except Exception as e: logger.exception(e) -- Gitee From 7a95acbe49d84df9b671c9714c7fc05d67b32f38 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 17:33:34 +0800 Subject: [PATCH 188/229] =?UTF-8?q?style:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8log=5Fdecorator=E8=A3=85=E9=A5=B0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/annotation/log_annotation.py | 181 ------------------ 1 file changed, 181 deletions(-) diff --git a/dash-fastapi-backend/module_admin/annotation/log_annotation.py b/dash-fastapi-backend/module_admin/annotation/log_annotation.py index c59b242..046c300 100644 --- a/dash-fastapi-backend/module_admin/annotation/log_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/log_annotation.py @@ -201,187 +201,6 @@ class Log: return wrapper -def log_decorator( - title: str, - business_type: Union[Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], BusinessType], - log_type: Optional[Literal['login', 'operation']] = 'operation', -): - """ - 日志装饰器 - - :param title: 当前日志装饰器装饰的模块标题 - :param business_type: 业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8生成代码 9清空数据) - :param log_type: 日志类型(login表示登录日志,operation表示为操作日志) - :return: - """ - warnings.simplefilter('always', category=DeprecationWarning) - if isinstance(business_type, BusinessType): - business_type = business_type.value - warnings.warn( - '未来版本将会移除@log_decorator装饰器,请使用@Log装饰器', - category=DeprecationWarning, - stacklevel=2, - ) - - def decorator(func): - @wraps(func) - async def wrapper(*args, **kwargs): - start_time = time.time() - # 获取被装饰函数的文件路径 - file_path = inspect.getfile(func) - # 获取项目根路径 - project_root = os.getcwd() - # 处理文件路径,去除项目根路径部分 - relative_path = os.path.relpath(file_path, start=project_root)[0:-2].replace('\\', '.') - # 获取当前被装饰函数所在路径 - func_path = f'{relative_path}{func.__name__}()' - # 获取上下文信息 - request: Request = kwargs.get('request') - token = request.headers.get('Authorization') - query_db = kwargs.get('query_db') - request_method = request.method - operator_type = 0 - user_agent = request.headers.get('User-Agent') - if 'Windows' in user_agent or 'Macintosh' in user_agent or 'Linux' in user_agent: - operator_type = 1 - if 'Mobile' in user_agent or 'Android' in user_agent or 'iPhone' in user_agent: - operator_type = 2 - # 获取请求的url - oper_url = request.url.path - # 获取请求的ip及ip归属区域 - oper_ip = request.headers.get('X-Forwarded-For') - oper_location = '内网IP' - if AppConfig.app_ip_location_query: - oper_location = get_ip_location(oper_ip) - # 根据不同的请求类型使用不同的方法获取请求参数 - content_type = request.headers.get('Content-Type') - if content_type and ( - 'multipart/form-data' in content_type or 'application/x-www-form-urlencoded' in content_type - ): - payload = await request.form() - oper_param = '\n'.join([f'{key}: {value}' for key, value in payload.items()]) - else: - payload = await request.body() - # 通过 request.path_params 直接访问路径参数 - path_params = request.path_params - oper_param = {} - if payload: - oper_param.update(json.loads(str(payload, 'utf-8'))) - if path_params: - oper_param.update(path_params) - oper_param = json.dumps(oper_param, ensure_ascii=False) - # 日志表请求参数字段长度最大为2000,因此在此处判断长度 - if len(oper_param) > 2000: - oper_param = '请求参数过长' - - # 获取操作时间 - oper_time = datetime.now() - # 此处在登录之前向原始函数传递一些登录信息,用于监测在线用户的相关信息 - login_log = {} - if log_type == 'login': - user_agent_info = parse(user_agent) - browser = f'{user_agent_info.browser.family}' - system_os = f'{user_agent_info.os.family}' - if user_agent_info.browser.version != (): - browser += f' {user_agent_info.browser.version[0]}' - if user_agent_info.os.version != (): - system_os += f' {user_agent_info.os.version[0]}' - login_log = dict( - ipaddr=oper_ip, - loginLocation=oper_location, - browser=browser, - os=system_os, - loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'), - ) - kwargs['form_data'].login_info = login_log - try: - # 调用原始函数 - result = await func(*args, **kwargs) - except LoginException as e: - result = ResponseUtil.failure(data=e.data, msg=e.message) - except ServiceException as e: - result = ResponseUtil.error(data=e.data, msg=e.message) - except ServiceWarning as e: - result = ResponseUtil.failure(data=e.data, msg=e.message) - except Exception as e: - result = ResponseUtil.error(msg=str(e)) - # 获取请求耗时 - cost_time = float(time.time() - start_time) * 100 - # 判断请求是否来自api文档 - request_from_swagger = ( - request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False - ) - request_from_redoc = ( - request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False - ) - # 根据响应结果的类型使用不同的方法获取响应结果参数 - if ( - isinstance(result, JSONResponse) - or isinstance(result, ORJSONResponse) - or isinstance(result, UJSONResponse) - ): - result_dict = json.loads(str(result.body, 'utf-8')) - else: - if request_from_swagger or request_from_redoc: - result_dict = {} - else: - if result.status_code == 200: - result_dict = {'code': result.status_code, 'message': '获取成功'} - else: - result_dict = {'code': result.status_code, 'message': '获取失败'} - json_result = json.dumps(result_dict, ensure_ascii=False) - # 根据响应结果获取响应状态及异常信息 - status = 1 - error_msg = '' - if result_dict.get('code') == 200: - status = 0 - else: - error_msg = result_dict.get('msg') - # 根据日志类型向对应的日志表插入数据 - if log_type == 'login': - # 登录请求来自于api文档时不记录登录日志,其余情况则记录 - if request_from_swagger or request_from_redoc: - pass - else: - user = kwargs.get('form_data') - user_name = user.username - login_log['loginTime'] = oper_time - login_log['userName'] = user_name - login_log['status'] = str(status) - login_log['msg'] = result_dict.get('msg') - - await LoginLogService.add_login_log_services(query_db, LogininforModel(**login_log)) - else: - current_user = await LoginService.get_current_user(request, token, query_db) - oper_name = current_user.user.user_name - dept_name = current_user.user.dept.dept_name if current_user.user.dept else None - operation_log = OperLogModel( - title=title, - businessType=business_type, - method=func_path, - requestMethod=request_method, - operatorType=operator_type, - operName=oper_name, - deptName=dept_name, - operUrl=oper_url, - operIp=oper_ip, - operLocation=oper_location, - operParam=oper_param, - jsonResult=json_result, - status=status, - errorMsg=error_msg, - operTime=oper_time, - costTime=int(cost_time), - ) - await OperationLogService.add_operation_log_services(query_db, operation_log) - - return result - - return wrapper - - return decorator - - @lru_cache() def get_ip_location(oper_ip: str): """ -- Gitee From 7433680d8d25b350478a205835a108d0225f7716 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 17:33:55 +0800 Subject: [PATCH 189/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AF=8C?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E7=BC=96=E8=BE=91=E5=99=A8=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common_controller.py | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/controller/common_controller.py b/dash-fastapi-backend/module_admin/controller/common_controller.py index d2fd621..33ff820 100644 --- a/dash-fastapi-backend/module_admin/controller/common_controller.py +++ b/dash-fastapi-backend/module_admin/controller/common_controller.py @@ -1,4 +1,6 @@ -from fastapi import APIRouter, BackgroundTasks, Depends, File, Query, Request, UploadFile +from fastapi import APIRouter, BackgroundTasks, Depends, File, Form, Query, Request, status, UploadFile +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse from module_admin.service.common_service import CommonService from module_admin.service.login_service import LoginService from utils.log_util import logger @@ -15,6 +17,33 @@ async def common_upload(request: Request, file: UploadFile = File(...)): return ResponseUtil.success(model_content=upload_result.result) +@commonController.post('/uploadForEditor', dependencies=[Depends(LoginService.get_current_user)]) +async def editor_upload(request: Request, base_url: str = Form(), file: UploadFile = File(...)): + try: + upload_result = await CommonService.upload_service(request, file) + logger.info('上传成功') + return JSONResponse( + status_code=status.HTTP_200_OK, + content=jsonable_encoder( + { + 'errno': 0, + 'data': {'url': f'{base_url}{upload_result.result.file_name}'}, + } + ), + ) + except Exception as e: + logger.exception(e) + return JSONResponse( + status_code=status.HTTP_200_OK, + content=jsonable_encoder( + { + 'errno': 1, + 'message': str(e), + } + ), + ) + + @commonController.get('/download') async def common_download( request: Request, -- Gitee From 45a0652b099497fcfab09448b088cf929e21f387 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 17:34:28 +0800 Subject: [PATCH 190/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/string_util.py | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 dash-fastapi-frontend/utils/string_util.py diff --git a/dash-fastapi-frontend/utils/string_util.py b/dash-fastapi-frontend/utils/string_util.py new file mode 100644 index 0000000..0fd7f9c --- /dev/null +++ b/dash-fastapi-frontend/utils/string_util.py @@ -0,0 +1,25 @@ +class StringUtil: + """ + 字符串工具类 + """ + + @classmethod + def insert_before_substring( + cls, original_str: str, start_substr: str, new_str: str + ): + """ + 在字符串中指定字符串位置插入新字符串 + + :param original_str: 原始字符串 + :param start_substr: 指定的字符串 + :param new_str: 插入的新字符串 + :return: 处理完成的新字符串 + """ + start_index = original_str.find(start_substr) + if start_index != -1: + before_start = original_str[:start_index] + after_start = original_str[start_index:] + new_str_with_insertion = before_start + new_str + after_start + return new_str_with_insertion + else: + return original_str -- Gitee From c9d87799b47e7a4e98bd020a512141ee64b4cfac Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 17:35:16 +0800 Subject: [PATCH 191/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E5=AF=8C?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E7=BC=96=E8=BE=91=E5=99=A8=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/notice_c.py | 10 +++++++--- .../views/system/notice/__init__.py | 13 ++----------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 4c936a1..0f30b02 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -5,11 +5,13 @@ from dash.exceptions import PreventUpdate from typing import Dict from api.system.notice import NoticeApi from config.constant import SysNoticeStatusConstant, SysNoticeTypeConstant +from config.env import ApiConfig from server import app from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager +from utils.string_util import StringUtil from utils.time_format_util import TimeFormatUtil @@ -318,7 +320,9 @@ def add_edit_notice_modal( notice_title=notice_info.get('notice_title'), notice_type=notice_info.get('notice_type'), status=notice_info.get('status'), - notice_content=notice_content, + notice_content=StringUtil.insert_before_substring( + notice_content, '/profile/upload/', ApiConfig.BaseUrl + ), editor_key=str(uuid.uuid4()), ), form_validate=[None] * 4, @@ -403,7 +407,7 @@ def notice_confirm( notice_title=notice_title, notice_type=notice_type, status=status, - notice_content=notice_content, + notice_content=notice_content.replace(ApiConfig.BaseUrl, ''), ) params_edit = dict( notice_id=edit_row_info.get('notice_id') @@ -412,7 +416,7 @@ def notice_confirm( notice_title=notice_title, notice_type=notice_type, status=status, - notice_content=notice_content, + notice_content=notice_content.replace(ApiConfig.BaseUrl, ''), ) modal_type = modal_type.get('type') if modal_type == 'add': diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index b028eb5..559d34a 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -1,6 +1,5 @@ import feffery_antd_components as fac import feffery_utils_components as fuc -import uuid from dash import dcc, html from flask import session from callbacks.system_c import notice_c @@ -395,11 +394,7 @@ def render(*args, **kwargs): 'maxFileSize': 10 * 1024 * 1024, 'maxNumberOfFiles': 10, 'meta': { - 'baseUrl': ApiConfig.BaseUrl, - 'uploadId': str( - uuid.uuid4() - ), - 'taskPath': 'notice', + 'base_url': ApiConfig.BaseUrl, }, 'metaWithUrl': True, 'headers': { @@ -420,11 +415,7 @@ def render(*args, **kwargs): * 1024, 'maxNumberOfFiles': 3, 'meta': { - 'baseUrl': ApiConfig.BaseUrl, - 'uploadId': str( - uuid.uuid4() - ), - 'taskPath': 'notice', + 'base_url': ApiConfig.BaseUrl, }, 'metaWithUrl': True, 'headers': { -- Gitee From e5b30b9b416e6e5a65b0820b26d3d869694b20c5 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 17:36:00 +0800 Subject: [PATCH 192/229] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=A3=85=E9=A5=B0=E5=99=A8=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/annotation/log_annotation.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dash-fastapi-backend/module_admin/annotation/log_annotation.py b/dash-fastapi-backend/module_admin/annotation/log_annotation.py index 046c300..c58bacc 100644 --- a/dash-fastapi-backend/module_admin/annotation/log_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/log_annotation.py @@ -3,12 +3,11 @@ import json import os import requests import time -import warnings from datetime import datetime from fastapi import Request from fastapi.responses import JSONResponse, ORJSONResponse, UJSONResponse from functools import lru_cache, wraps -from typing import Literal, Optional, Union +from typing import Literal, Optional from user_agents import parse from module_admin.entity.vo.log_vo import LogininforModel, OperLogModel from module_admin.service.log_service import LoginLogService, OperationLogService -- Gitee From 5d576c30dba39667ebddab9b6b86ee25b15ed8f4 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 23:15:31 +0800 Subject: [PATCH 193/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9C=A8?= =?UTF-8?q?=E6=97=A0Output=E5=9B=9E=E8=B0=83=E4=B8=AD=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py | 7 ++++++- dash-fastapi-frontend/callbacks/system_c/config_c.py | 5 +++++ dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index e30d3fa..63a1811 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -1,6 +1,6 @@ import time import uuid -from dash import ctx, dcc +from dash import ctx, dcc, no_update from dash.dependencies import Input, Output, State, ALL from dash.exceptions import PreventUpdate from typing import Dict @@ -335,6 +335,7 @@ def reset_login_log_export_status(data): @app.callback( + Output('login_log-unlock', 'nClicks'), Input('login_log-unlock', 'nClicks'), State('login_log-list-table', 'selectedRows'), prevent_initial_call=True, @@ -347,3 +348,7 @@ def unlock_user(unlock_click, selected_rows): user_name = selected_rows[0].get('user_name') LogininforApi.unlock_logininfor(user_name=user_name) MessageManager.success(content='解锁成功') + + return no_update + + raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index d4a5745..505cc1c 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -551,6 +551,7 @@ def reset_config_export_status(data): @app.callback( + Output('config-refresh-cache', 'nClicks'), Input('config-refresh-cache', 'nClicks'), running=[[Output('config-refresh-cache', 'loading'), True, False]], prevent_initial_call=True, @@ -562,3 +563,7 @@ def refresh_config_cache(refresh_click): if refresh_click: ConfigApi.refresh_cache() MessageManager.success(content='刷新成功') + + return no_update + + raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index 05f02e9..ac05e8a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -623,6 +623,7 @@ def reset_dict_type_export_status(data): @app.callback( + Output('dict_type-refresh-cache', 'nClicks'), Input('dict_type-refresh-cache', 'nClicks'), running=[[Output('dict_type-refresh-cache', 'loading'), True, False]], prevent_initial_call=True, @@ -634,3 +635,7 @@ def refresh_dict_cache(refresh_click): if refresh_click: DictTypeApi.refresh_cache() MessageManager.success(content='刷新成功') + + return no_update + + raise PreventUpdate -- Gitee From f0a80d4c45e4acdf8e064c046d97246f1725dd80 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 23:34:29 +0800 Subject: [PATCH 194/229] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=90=84=E6=96=87=E4=BB=B6=E6=A8=A1=E5=9D=97=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/app_c.py | 7 +- .../callbacks/layout_c/aside_c.py | 1 - .../callbacks/layout_c/fold_side_menu.py | 17 +- .../callbacks/layout_c/head_c.py | 110 +++-- .../callbacks/monitor_c/cache_c/list_c.py | 12 +- dash-fastapi-frontend/config/env.py | 6 +- dash-fastapi-frontend/server.py | 4 +- dash-fastapi-frontend/store/store.py | 2 +- dash-fastapi-frontend/utils/request.py | 9 +- .../views/dashboard/components/page_bottom.py | 398 +++++++++--------- .../views/layout/components/aside.py | 5 +- .../views/layout/components/content.py | 3 +- .../views/monitor/__init__.py | 14 +- .../views/monitor/cache/__init__.py | 4 +- .../views/monitor/druid/__init__.py | 2 - .../views/monitor/online/__init__.py | 2 +- .../views/monitor/server/__init__.py | 2 +- .../views/system/__init__.py | 16 +- .../system/menu/components/icon_category.py | 2 +- .../system/role/component/query_form_table.py | 2 +- .../views/system/role/data_scope.py | 118 ++---- dash-fastapi-frontend/views/tool/__init__.py | 6 +- .../views/tool/build/__init__.py | 3 - .../views/tool/gen/__init__.py | 3 - .../views/tool/swagger/__init__.py | 2 +- 25 files changed, 333 insertions(+), 417 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/app_c.py b/dash-fastapi-frontend/callbacks/app_c.py index 9eb14ce..b93db03 100644 --- a/dash-fastapi-frontend/callbacks/app_c.py +++ b/dash-fastapi-frontend/callbacks/app_c.py @@ -1,6 +1,5 @@ -import dash from dash import dcc -import feffery_utils_components as fuc +from dash.exceptions import PreventUpdate from dash.dependencies import Input, Output, State from flask import session from server import app @@ -21,7 +20,7 @@ def redirect_page(okCounts): return [dcc.Location(pathname='/login', id='index-redirect'), None] - return [dash.no_update] * 2 + raise PreventUpdate # 应用初始化主题颜色 @@ -38,7 +37,7 @@ def get_primary_color(_, custom_color): # return primary_color - return dash.no_update + raise PreventUpdate app.clientside_callback( diff --git a/dash-fastapi-frontend/callbacks/layout_c/aside_c.py b/dash-fastapi-frontend/callbacks/layout_c/aside_c.py index a469d58..1be2928 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/aside_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/aside_c.py @@ -1,5 +1,4 @@ from dash.dependencies import Input, Output, State - from server import app diff --git a/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py b/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py index 5096ca7..95929ac 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py +++ b/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py @@ -1,11 +1,10 @@ from dash.dependencies import Input, Output, State - from server import app # 侧边栏折叠回调 app.clientside_callback( - ''' + """ (nClicks, collapsed) => { if (nClicks) { return [ @@ -17,12 +16,14 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('left-side-menu-container', 'style'), - Output('menu-collapse-sider-custom', 'collapsed'), - Output('logo-text', 'style'), - Output('fold-side-menu-icon', 'icon')], + """, + [ + Output('left-side-menu-container', 'style'), + Output('menu-collapse-sider-custom', 'collapsed'), + Output('logo-text', 'style'), + Output('fold-side-menu-icon', 'icon'), + ], Input('fold-side-menu', 'nClicks'), State('menu-collapse-sider-custom', 'collapsed'), - prevent_initial_call=True + prevent_initial_call=True, ) diff --git a/dash-fastapi-frontend/callbacks/layout_c/head_c.py b/dash-fastapi-frontend/callbacks/layout_c/head_c.py index 18e347f..b68a5f2 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/head_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/head_c.py @@ -1,16 +1,15 @@ -import dash -from dash import dcc import feffery_utils_components as fuc -from flask import session +from dash import ctx, dcc, no_update from dash.dependencies import Input, Output, State - -from server import app +from dash.exceptions import PreventUpdate +from flask import session from api.login import LoginApi +from server import app # 页首右侧个人中心选项卡回调 app.clientside_callback( - ''' + """ (nClicks, clickedKey) => { if (clickedKey == '退出登录') { return [ @@ -33,22 +32,26 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', - [Output('dcc-url', 'pathname', allow_duplicate=True), - Output('logout-modal', 'visible'), - Output('layout-setting-drawer', 'visible')], + """, + [ + Output('dcc-url', 'pathname', allow_duplicate=True), + Output('logout-modal', 'visible'), + Output('layout-setting-drawer', 'visible'), + ], Input('index-header-dropdown', 'nClicks'), State('index-header-dropdown', 'clickedKey'), - prevent_initial_call=True + prevent_initial_call=True, ) # 退出登录回调 @app.callback( - [Output('redirect-container', 'children', allow_duplicate=True), - Output('token-container', 'data', allow_duplicate=True)], + [ + Output('redirect-container', 'children', allow_duplicate=True), + Output('token-container', 'data', allow_duplicate=True), + ], Input('logout-modal', 'okCounts'), - prevent_initial_call=True + prevent_initial_call=True, ) def logout_confirm(okCounts): if okCounts: @@ -56,33 +59,27 @@ def logout_confirm(okCounts): if result['code'] == 200: session.clear() - return [ - dcc.Location( - pathname='/login', - id='index-redirect' - ), - None - ] + return [dcc.Location(pathname='/login', id='index-redirect'), None] - return [dash.no_update] * 2 + raise PreventUpdate # 全局页面重载回调 app.clientside_callback( - ''' + """ (nClicks) => { return true; } - ''', + """, Output('trigger-reload-output', 'reload', allow_duplicate=True), Input('index-reload', 'nClicks'), - prevent_initial_call=True + prevent_initial_call=True, ) # 布局设置回调 app.clientside_callback( - ''' + """ (visible, custom_color) => { if (visible) { if (custom_color) { @@ -91,64 +88,57 @@ app.clientside_callback( } return window.dash_clientside.no_update; } - ''', + """, Output('hex-color-picker', 'color', allow_duplicate=True), Input('layout-setting-drawer', 'visible'), State('custom-app-primary-color-container', 'data'), - prevent_initial_call=True + prevent_initial_call=True, ) @app.callback( - [Output('selected-color-input', 'value'), - Output('selected-color-input', 'style')], + [ + Output('selected-color-input', 'value'), + Output('selected-color-input', 'style'), + ], Input('hex-color-picker', 'color'), State('selected-color-input', 'style'), - prevent_initial_call=True + prevent_initial_call=True, ) def show_selected_color(pick_color, old_style): - - return [ - pick_color, - { - **old_style, - 'background': pick_color - } - ] + return [pick_color, {**old_style, 'background': pick_color}] @app.callback( - [Output('custom-app-primary-color-container', 'data'), - Output('hex-color-picker', 'color', allow_duplicate=True), - Output('global-message-container', 'children', allow_duplicate=True)], - [Input('save-setting', 'nClicks'), - Input('reset-setting', 'nClicks')], - [State('selected-color-input', 'value'), - State('system-app-primary-color-container', 'data')], - prevent_initial_call=True + [ + Output('custom-app-primary-color-container', 'data'), + Output('hex-color-picker', 'color', allow_duplicate=True), + Output('global-message-container', 'children', allow_duplicate=True), + ], + [Input('save-setting', 'nClicks'), Input('reset-setting', 'nClicks')], + [ + State('selected-color-input', 'value'), + State('system-app-primary-color-container', 'data'), + ], + prevent_initial_call=True, ) -def save_rest_layout_setting(save_click, reset_click, picked_color, system_color): +def save_rest_layout_setting( + save_click, reset_click, picked_color, system_color +): if save_click or reset_click: - trigger_id = dash.ctx.triggered_id + trigger_id = ctx.triggered_id if trigger_id == 'save-setting': - return [ picked_color, - dash.no_update, - fuc.FefferyFancyMessage('保存成功', type='success') + no_update, + fuc.FefferyFancyMessage('保存成功', type='success'), ] elif trigger_id == 'reset-setting': - return [ None, system_color, - fuc.FefferyFancyMessage('重置成功', type='success') + fuc.FefferyFancyMessage('重置成功', type='success'), ] - return [ - dash.no_update, - dash.no_update, - dash.no_update - ] - + raise PreventUpdate diff --git a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py index 3605134..d7e1c90 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py @@ -1,9 +1,7 @@ -import dash -import time import uuid -from dash.dependencies import Input, Output, State, ALL +from dash import no_update +from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate -import feffery_utils_components as fuc from api.monitor.cache import CacheApi from server import app from utils.feedback_util import MessageManager @@ -196,9 +194,9 @@ def clear_cache_key(clear_click, recently_button_clicked_row, cache_key_store): ) else: return dict( - cache_name=dash.no_update, - cache_key=dash.no_update, - cache_value=dash.no_update, + cache_name=no_update, + cache_key=no_update, + cache_value=no_update, operations={'type': 'clear_cache_key'}, ) diff --git a/dash-fastapi-frontend/config/env.py b/dash-fastapi-frontend/config/env.py index b51b98d..f1e0300 100644 --- a/dash-fastapi-frontend/config/env.py +++ b/dash-fastapi-frontend/config/env.py @@ -1,8 +1,8 @@ -import os import argparse -from pydantic_settings import BaseSettings -from functools import lru_cache +import os from dotenv import load_dotenv +from functools import lru_cache +from pydantic_settings import BaseSettings class AppSettings(BaseSettings): diff --git a/dash-fastapi-frontend/server.py b/dash-fastapi-frontend/server.py index 7b1eb10..853fe10 100644 --- a/dash-fastapi-frontend/server.py +++ b/dash-fastapi-frontend/server.py @@ -1,4 +1,4 @@ -import dash +from dash import Dash from flask import request, session from user_agents import parse from config.env import AppConfig @@ -6,7 +6,7 @@ from config.exception import global_exception_handler from utils.log_util import logger -app = dash.Dash( +app = Dash( __name__, compress=True, suppress_callback_exceptions=True, diff --git a/dash-fastapi-frontend/store/store.py b/dash-fastapi-frontend/store/store.py index a8eba3c..bbcddc6 100644 --- a/dash-fastapi-frontend/store/store.py +++ b/dash-fastapi-frontend/store/store.py @@ -1,4 +1,4 @@ -from dash import html, dcc +from dash import dcc, html def render_store_container(): diff --git a/dash-fastapi-frontend/utils/request.py b/dash-fastapi-frontend/utils/request.py index f8c7940..4ad69d6 100644 --- a/dash-fastapi-frontend/utils/request.py +++ b/dash-fastapi-frontend/utils/request.py @@ -1,16 +1,15 @@ import requests -from typing import Dict, Optional from flask import session, request -from config.env import AppConfig +from typing import Dict, Optional +from config.constant import HttpStatusConstant +from config.enums import ApiMethod +from config.env import ApiConfig, AppConfig from config.exception import ( AuthException, RequestException, ServiceException, ServiceWarning, ) -from config.constant import HttpStatusConstant -from config.enums import ApiMethod -from config.env import ApiConfig from utils.cache_util import CacheManager from utils.log_util import logger diff --git a/dash-fastapi-frontend/views/dashboard/components/page_bottom.py b/dash-fastapi-frontend/views/dashboard/components/page_bottom.py index c5a94c4..b9c8a65 100644 --- a/dash-fastapi-frontend/views/dashboard/components/page_bottom.py +++ b/dash-fastapi-frontend/views/dashboard/components/page_bottom.py @@ -1,7 +1,7 @@ -from dash import html +import feffery_antd_charts as fact import feffery_antd_components as fac import feffery_utils_components as fuc -import feffery_antd_charts as fact +from dash import html def render_page_bottom(): @@ -13,7 +13,7 @@ def render_page_bottom(): 'koubei': 8, 'output': 4, 'contribute': 5, - 'hot': 7 + 'hot': 7, }, { 'name': '团队', @@ -21,7 +21,7 @@ def render_page_bottom(): 'koubei': 9, 'output': 6, 'contribute': 3, - 'hot': 1 + 'hot': 1, }, { 'name': '部门', @@ -29,8 +29,8 @@ def render_page_bottom(): 'koubei': 1, 'output': 6, 'contribute': 5, - 'hot': 7 - } + 'hot': 7, + }, ] radar_data = [] @@ -39,167 +39,139 @@ def render_page_bottom(): 'koubei': '口碑', 'output': '产量', 'contribute': '贡献', - 'hot': '热度' + 'hot': '热度', } for item in radar_origin_data: for key, value in item.items(): if key != 'name': - radar_data.append({ - 'name': item['name'], - 'label': radar_title_map[key], - 'value': value - }) + radar_data.append( + { + 'name': item['name'], + 'label': radar_title_map[key], + 'value': value, + } + ) project_list = [ { - "id": "xxx1", - "title": "Alipay", - "logo": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", - "description": "那是一种内在的东西,他们到达不了,也无法触及的", - "updatedAt": "2023-09-15T01:08:36.135Z", - "member": "科学搬砖组", - "href": "", - "memberLink": "" + 'id': 'xxx1', + 'title': 'Alipay', + 'logo': 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + 'description': '那是一种内在的东西,他们到达不了,也无法触及的', + 'updatedAt': '2023-09-15T01:08:36.135Z', + 'member': '科学搬砖组', + 'href': '', + 'memberLink': '', }, { - "id": "xxx2", - "title": "Angular", - "logo": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png", - "description": "希望是一个好东西,也许是最好的,好东西是不会消亡的", - "updatedAt": "2017-07-24T00:00:00.000Z", - "member": "全组都是吴彦祖", - "href": "", - "memberLink": "" + 'id': 'xxx2', + 'title': 'Angular', + 'logo': 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + 'description': '希望是一个好东西,也许是最好的,好东西是不会消亡的', + 'updatedAt': '2017-07-24T00:00:00.000Z', + 'member': '全组都是吴彦祖', + 'href': '', + 'memberLink': '', }, { - "id": "xxx3", - "title": "Ant Design", - "logo": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", - "description": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", - "updatedAt": "2023-09-15T01:08:36.135Z", - "member": "中二少女团", - "href": "", - "memberLink": "" + 'id': 'xxx3', + 'title': 'Ant Design', + 'logo': 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', + 'description': '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + 'updatedAt': '2023-09-15T01:08:36.135Z', + 'member': '中二少女团', + 'href': '', + 'memberLink': '', }, { - "id": "xxx4", - "title": "Ant Design Pro", - "logo": "https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png", - "description": "那时候我只会想自己想要什么,从不想自己拥有什么", - "updatedAt": "2017-07-23T00:00:00.000Z", - "member": "程序员日常", - "href": "", - "memberLink": "" + 'id': 'xxx4', + 'title': 'Ant Design Pro', + 'logo': 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', + 'description': '那时候我只会想自己想要什么,从不想自己拥有什么', + 'updatedAt': '2017-07-23T00:00:00.000Z', + 'member': '程序员日常', + 'href': '', + 'memberLink': '', }, { - "id": "xxx5", - "title": "Bootstrap", - "logo": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", - "description": "凛冬将至", - "updatedAt": "2017-07-23T00:00:00.000Z", - "member": "高逼格设计天团", - "href": "", - "memberLink": "" + 'id': 'xxx5', + 'title': 'Bootstrap', + 'logo': 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', + 'description': '凛冬将至', + 'updatedAt': '2017-07-23T00:00:00.000Z', + 'member': '高逼格设计天团', + 'href': '', + 'memberLink': '', }, { - "id": "xxx6", - "title": "React", - "logo": "https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png", - "description": "生命就像一盒巧克力,结果往往出人意料", - "updatedAt": "2017-07-23T00:00:00.000Z", - "member": "骗你来学计算机", - "href": "", - "memberLink": "" - } + 'id': 'xxx6', + 'title': 'React', + 'logo': 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', + 'description': '生命就像一盒巧克力,结果往往出人意料', + 'updatedAt': '2017-07-23T00:00:00.000Z', + 'member': '骗你来学计算机', + 'href': '', + 'memberLink': '', + }, ] activity_list = [ { - "id": "trend-1", - "updatedAt": "2023-09-15 01:08:36", - "user": { - "name": "曲丽丽", - "avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png" - }, - "group": { - "name": "高逼格设计天团", - "link": "http://github.com/" - }, - "project": { - "name": "六月迭代", - "link": "http://github.com/" + 'id': 'trend-1', + 'updatedAt': '2023-09-15 01:08:36', + 'user': { + 'name': '曲丽丽', + 'avatar': 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', }, - "template": "新建项目" + 'group': {'name': '高逼格设计天团', 'link': 'http://github.com/'}, + 'project': {'name': '六月迭代', 'link': 'http://github.com/'}, + 'template': '新建项目', }, { - "id": "trend-2", - "updatedAt": "2023-09-15 01:08:36", - "user": { - "name": "付小小", - "avatar": "https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png" + 'id': 'trend-2', + 'updatedAt': '2023-09-15 01:08:36', + 'user': { + 'name': '付小小', + 'avatar': 'https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png', }, - "group": { - "name": "高逼格设计天团", - "link": "http://github.com/" - }, - "project": { - "name": "六月迭代", - "link": "http://github.com/" - }, - "template": "新建项目" + 'group': {'name': '高逼格设计天团', 'link': 'http://github.com/'}, + 'project': {'name': '六月迭代', 'link': 'http://github.com/'}, + 'template': '新建项目', }, { - "id": "trend-3", - "updatedAt": "2023-09-15 01:08:36", - "user": { - "name": "林东东", - "avatar": "https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png" - }, - "group": { - "name": "中二少女团", - "link": "http://github.com/" - }, - "project": { - "name": "六月迭代", - "link": "http://github.com/" + 'id': 'trend-3', + 'updatedAt': '2023-09-15 01:08:36', + 'user': { + 'name': '林东东', + 'avatar': 'https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png', }, - "template": "新建项目" + 'group': {'name': '中二少女团', 'link': 'http://github.com/'}, + 'project': {'name': '六月迭代', 'link': 'http://github.com/'}, + 'template': '新建项目', }, { - "id": "trend-4", - "updatedAt": "2023-09-15 01:08:36", - "user": { - "name": "周星星", - "avatar": "https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png" + 'id': 'trend-4', + 'updatedAt': '2023-09-15 01:08:36', + 'user': { + 'name': '周星星', + 'avatar': 'https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png', }, - "group": { - "name": "白鹭酱油开发组", - "link": "http://github.com/" - }, - "project": { - "name": "5 月日常迭代", - "link": "http://github.com/" - }, - "template": "发布了" + 'group': {'name': '白鹭酱油开发组', 'link': 'http://github.com/'}, + 'project': {'name': '5 月日常迭代', 'link': 'http://github.com/'}, + 'template': '发布了', }, { - "id": "trend-5", - "updatedAt": "2023-09-15 01:08:36", - "user": { - "name": "乐哥", - "avatar": "https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png" - }, - "group": { - "name": "程序员日常", - "link": "http://github.com/" - }, - "project": { - "name": "品牌迭代", - "link": "http://github.com/" + 'id': 'trend-5', + 'updatedAt': '2023-09-15 01:08:36', + 'user': { + 'name': '乐哥', + 'avatar': 'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png', }, - "template": "新建项目" - } + 'group': {'name': '程序员日常', 'link': 'http://github.com/'}, + 'project': {'name': '品牌迭代', 'link': 'http://github.com/'}, + 'template': '新建项目', + }, ] return html.Div( @@ -217,28 +189,26 @@ def render_page_bottom(): fac.AntdAvatar( mode='image', src=item.get('logo'), - size='small' + size='small', ), - html.A( - item.get('title') - ) + html.A(item.get('title')), ], - className='card-title' + className='card-title', ), html.Div( item.get('description'), - className='card-description' + className='card-description', ), html.Div( [ html.A(item.get('member')), html.Span( '9小时前', - className='datetime' - ) + className='datetime', + ), ], - className='project-item' - ) + className='project-item', + ), ] ) for item in project_list @@ -246,16 +216,12 @@ def render_page_bottom(): className='project-list', title='进行中的项目', bordered=False, - extraLink={ - 'content': '全部项目' - }, - bodyStyle={ - 'padding': 0 - }, + extraLink={'content': '全部项目'}, + bodyStyle={'padding': 0}, style={ 'marginBottom': '24px', - 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px' - } + 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px', + }, ), fac.AntdCard( fac.AntdSpace( @@ -267,44 +233,74 @@ def render_page_bottom(): html.Div( fac.AntdAvatar( mode='image', - src=item.get('user').get('avatar'), + src=item.get( + 'user' + ).get('avatar'), size='small', ), style={ 'flex': '0 1', - 'marginRight': '16px' - } + 'marginRight': '16px', + }, ), html.Div( [ html.Div( [ - html.Span(f"{item.get('user').get('name')} 在 "), - html.A(item.get('group').get('name'), href=item.get('group').get('link')), - html.Span(f" {item.get('template')} "), - html.A(item.get('project').get('name'), href=item.get('project').get('link')) + html.Span( + f"{item.get('user').get('name')} 在 " + ), + html.A( + item.get( + 'group' + ).get( + 'name' + ), + href=item.get( + 'group' + ).get( + 'link' + ), + ), + html.Span( + f" {item.get('template')} " + ), + html.A( + item.get( + 'project' + ).get( + 'name' + ), + href=item.get( + 'project' + ).get( + 'link' + ), + ), ], - key=item.get('id') + key=item.get( + 'id' + ), ), html.Div( - item.get('updatedAt'), + item.get( + 'updatedAt' + ), style={ 'color': 'rgba(0,0,0,.45)', 'fontSize': '14px', - 'lineHeight': '22px' - } + 'lineHeight': '22px', + }, ), ], style={ 'flex': '1 1 auto' - } + }, ), ], - style={ - 'display': 'flex' - } + style={'display': 'flex'}, ), - fac.AntdDivider() + fac.AntdDivider(), ] ) for item in activity_list @@ -313,22 +309,22 @@ def render_page_bottom(): style={ 'width': '100%', 'maxHeight': '500px', - 'overflowY': 'auto' - } + 'overflowY': 'auto', + }, ), title='动态', bordered=False, style={ 'marginBottom': '24px', - 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px' - } + 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px', + }, ), ], xl=16, lg=24, md=24, sm=24, - xs=24 + xs=24, ), fac.AntdCol( [ @@ -342,22 +338,20 @@ def render_page_bottom(): html.A('操作五'), fac.AntdButton( '添加', - type="primary", + type='primary', size='small', icon=fac.AntdIcon(icon='antd-plus'), - style={ - 'marginLeft': '20px' - } - ) + style={'marginLeft': '20px'}, + ), ], - className='item-group' + className='item-group', ), title='快速开始 / 便捷导航', bordered=False, style={ 'marginBottom': '24px', - 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px' - } + 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px', + }, ), fac.AntdCard( html.Div( @@ -368,25 +362,21 @@ def render_page_bottom(): yField='value', seriesField='name', point={}, - legend={ - 'position': 'bottom' - }, + legend={'position': 'bottom'}, ), style={ 'minHeight': '400px', 'margin': '0 auto', - 'paddingTop': '30px' - } + 'paddingTop': '30px', + }, ), title='XX 指数', bordered=False, - bodyStyle={ - 'padding': 0 - }, + bodyStyle={'padding': 0}, style={ 'marginBottom': '24px', - 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px' - } + 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px', + }, ), fac.AntdCard( html.Div( @@ -397,28 +387,30 @@ def render_page_bottom(): [ fac.AntdAvatar( mode='image', - src=item.get('logo'), - size='small' + src=item.get( + 'logo' + ), + size='small', ), html.Span( item.get('member'), - className='member' - ) + className='member', + ), ] ), - span=12 + span=12, ) for item in project_list ] ), - className='members' + className='members', ), title='团队', bordered=False, style={ 'marginBottom': '24px', - 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px' - } + 'boxShadow': 'rgba(0, 0, 0, 0.1) 0px 4px 12px', + }, ), ], xl=8, @@ -426,15 +418,13 @@ def render_page_bottom(): md=24, sm=24, xs=24, - style={ - 'padding': '0 12px' - } + style={'padding': '0 12px'}, ), ], - gutter=24 + gutter=24, ), fuc.FefferyStyle( - rawStyle=''' + rawStyle=""" .project-list .card-title { font-size: 0; } @@ -527,7 +517,7 @@ def render_page_bottom(): .members a .member:hover span { color: #1890ff; } - ''' - ) + """ + ), ] ) diff --git a/dash-fastapi-frontend/views/layout/components/aside.py b/dash-fastapi-frontend/views/layout/components/aside.py index afb6e2c..c48c6a9 100644 --- a/dash-fastapi-frontend/views/layout/components/aside.py +++ b/dash-fastapi-frontend/views/layout/components/aside.py @@ -1,6 +1,5 @@ -import dash -from dash import dcc import feffery_antd_components as fac +from dash import dcc, get_asset_url from callbacks.layout_c import aside_c # noqa: F401 @@ -17,7 +16,7 @@ def render_aside_content(menu_info): fac.AntdImage( width=32, height=32, - src=dash.get_asset_url('imgs/logo.png'), + src=get_asset_url('imgs/logo.png'), preview=False, ), flex='1', diff --git a/dash-fastapi-frontend/views/layout/components/content.py b/dash-fastapi-frontend/views/layout/components/content.py index 01ecbdf..a78b8df 100644 --- a/dash-fastapi-frontend/views/layout/components/content.py +++ b/dash-fastapi-frontend/views/layout/components/content.py @@ -1,6 +1,5 @@ -from dash import html import feffery_antd_components as fac - +from dash import html from views.dashboard import render diff --git a/dash-fastapi-frontend/views/monitor/__init__.py b/dash-fastapi-frontend/views/monitor/__init__.py index 749a188..6e2cf3d 100644 --- a/dash-fastapi-frontend/views/monitor/__init__.py +++ b/dash-fastapi-frontend/views/monitor/__init__.py @@ -1,9 +1,9 @@ from . import ( - online, - job, - druid, - server, - cache, - operlog, - logininfor + server, # noqa: F401 + cache, # noqa: F401 + druid, # noqa: F401 + logininfor, # noqa: F401 + job, # noqa: F401 + online, # noqa: F401 + operlog, # noqa: F401 ) diff --git a/dash-fastapi-frontend/views/monitor/cache/__init__.py b/dash-fastapi-frontend/views/monitor/cache/__init__.py index 6db4a48..0bb9286 100644 --- a/dash-fastapi-frontend/views/monitor/cache/__init__.py +++ b/dash-fastapi-frontend/views/monitor/cache/__init__.py @@ -1,4 +1,4 @@ from . import ( - control, - list + control, # noqa: F401 + list, # noqa: F401 ) diff --git a/dash-fastapi-frontend/views/monitor/druid/__init__.py b/dash-fastapi-frontend/views/monitor/druid/__init__.py index a79fa8c..1cb1a1b 100644 --- a/dash-fastapi-frontend/views/monitor/druid/__init__.py +++ b/dash-fastapi-frontend/views/monitor/druid/__init__.py @@ -1,6 +1,4 @@ from dash import html -import feffery_utils_components as fuc -import feffery_antd_components as fac def render(*args, **kwargs): diff --git a/dash-fastapi-frontend/views/monitor/online/__init__.py b/dash-fastapi-frontend/views/monitor/online/__init__.py index 75f6d2f..ae416ef 100644 --- a/dash-fastapi-frontend/views/monitor/online/__init__.py +++ b/dash-fastapi-frontend/views/monitor/online/__init__.py @@ -1,5 +1,5 @@ -from dash import dcc, html import feffery_antd_components as fac +from dash import dcc, html from callbacks.monitor_c import online_c from utils.permission_util import PermissionManager diff --git a/dash-fastapi-frontend/views/monitor/server/__init__.py b/dash-fastapi-frontend/views/monitor/server/__init__.py index e0319a6..a5fc74e 100644 --- a/dash-fastapi-frontend/views/monitor/server/__init__.py +++ b/dash-fastapi-frontend/views/monitor/server/__init__.py @@ -1,5 +1,5 @@ import feffery_antd_components as fac -from dash import dcc, html +from dash import html from api.monitor.server import ServerApi diff --git a/dash-fastapi-frontend/views/system/__init__.py b/dash-fastapi-frontend/views/system/__init__.py index 750ffd1..40c107c 100644 --- a/dash-fastapi-frontend/views/system/__init__.py +++ b/dash-fastapi-frontend/views/system/__init__.py @@ -1,10 +1,10 @@ from . import ( - user, - role, - menu, - dept, - post, - dict, - config, - notice + config, # noqa: F401 + dept, # noqa: F401 + dict, # noqa: F401 + menu, # noqa: F401 + notice, # noqa: F401 + post, # noqa: F401 + role, # noqa: F401 + user, # noqa: F401 ) diff --git a/dash-fastapi-frontend/views/system/menu/components/icon_category.py b/dash-fastapi-frontend/views/system/menu/components/icon_category.py index dc46288..b83bd3c 100644 --- a/dash-fastapi-frontend/views/system/menu/components/icon_category.py +++ b/dash-fastapi-frontend/views/system/menu/components/icon_category.py @@ -1,5 +1,5 @@ -from dash import html import feffery_antd_components as fac +from dash import html from config.env import IconConfig diff --git a/dash-fastapi-frontend/views/system/role/component/query_form_table.py b/dash-fastapi-frontend/views/system/role/component/query_form_table.py index 7566397..468b4e6 100644 --- a/dash-fastapi-frontend/views/system/role/component/query_form_table.py +++ b/dash-fastapi-frontend/views/system/role/component/query_form_table.py @@ -1,5 +1,5 @@ -from dash import html import feffery_antd_components as fac +from dash import html from utils.permission_util import PermissionManager diff --git a/dash-fastapi-frontend/views/system/role/data_scope.py b/dash-fastapi-frontend/views/system/role/data_scope.py index 7322e79..6f1798a 100644 --- a/dash-fastapi-frontend/views/system/role/data_scope.py +++ b/dash-fastapi-frontend/views/system/role/data_scope.py @@ -1,7 +1,6 @@ -from dash import html import feffery_antd_components as fac - -import callbacks.system_c.role_c.data_scope_c +from dash import html +import callbacks.system_c.role_c.data_scope_c # noqa: F401 def render(): @@ -12,95 +11,54 @@ def render(): fac.AntdInput( id={ 'type': 'datascope-form-value', - 'index': 'role_name' + 'index': 'role_name', }, placeholder='请输入角色名称', allowClear=True, disabled=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='角色名称', - id={ - 'type': 'datascope-form-label', - 'index': 'role_name' - }, - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + id={'type': 'datascope-form-label', 'index': 'role_name'}, + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), fac.AntdFormItem( fac.AntdInput( id={ 'type': 'datascope-form-value', - 'index': 'role_key' + 'index': 'role_key', }, placeholder='请输入权限字符', allowClear=True, disabled=True, - style={ - 'width': 350 - } + style={'width': 350}, ), label='权限字符', - id={ - 'type': 'datascope-form-label', - 'index': 'role_key' - }, - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + id={'type': 'datascope-form-label', 'index': 'role_key'}, + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), fac.AntdFormItem( fac.AntdSelect( id={ 'type': 'datascope-form-value', - 'index': 'data_scope' + 'index': 'data_scope', }, options=[ - { - 'label': '全部数据权限', - 'value': '1' - }, - { - 'label': '自定义数据权限', - 'value': '2' - }, - { - 'label': '本部门数据权限', - 'value': '3' - },{ - 'label': '本部门及以下数据权限', - 'value': '4' - }, - { - 'label': '仅本人数据权限', - 'value': '5' - } + {'label': '全部数据权限', 'value': '1'}, + {'label': '自定义数据权限', 'value': '2'}, + {'label': '本部门数据权限', 'value': '3'}, + {'label': '本部门及以下数据权限', 'value': '4'}, + {'label': '仅本人数据权限', 'value': '5'}, ], placeholder='请选择权限范围', - style={ - 'width': 350 - } + style={'width': 350}, ), label='权限范围', - id={ - 'type': 'datascope-form-label', - 'index': 'data_scope' - }, - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + id={'type': 'datascope-form-label', 'index': 'data_scope'}, + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), html.Div( fac.AntdFormItem( @@ -110,14 +68,14 @@ def render(): fac.AntdCol( fac.AntdCheckbox( id='role-dept-perms-radio-fold-unfold', - label='展开/折叠' + label='展开/折叠', ), span=7, ), fac.AntdCol( fac.AntdCheckbox( id='role-dept-perms-radio-all-none', - label='全选/全不选' + label='全选/全不选', ), span=8, ), @@ -125,14 +83,12 @@ def render(): fac.AntdCheckbox( id='role-dept-perms-radio-parent-children', label='父子联动', - checked=True + checked=True, ), span=6, ), ], - style={ - 'paddingTop': '6px' - } + style={'paddingTop': '6px'}, ), fac.AntdRow( fac.AntdCol( @@ -144,32 +100,26 @@ def render(): multiple=True, checkable=True, showLine=False, - selectable=False + selectable=False, ) ], style={ 'border': 'solid 1px rgba(0, 0, 0, 0.2)', 'border-radius': '5px', - 'width': 350 - } + 'width': 350, + }, ) ), - style={ - 'paddingTop': '6px' - } + style={'paddingTop': '6px'}, ), ], label='数据权限', id='role-dept-perms-form-item', - labelCol={ - 'span': 6 - }, - wrapperCol={ - 'span': 18 - } + labelCol={'span': 6}, + wrapperCol={'span': 18}, ), - id='role-dept-perms-div' - ) + id='role-dept-perms-div', + ), ] ) ] diff --git a/dash-fastapi-frontend/views/tool/__init__.py b/dash-fastapi-frontend/views/tool/__init__.py index 1648b98..2d8837a 100644 --- a/dash-fastapi-frontend/views/tool/__init__.py +++ b/dash-fastapi-frontend/views/tool/__init__.py @@ -1,5 +1,5 @@ from . import ( - build, - gen, - swagger, + build, # noqa: F401 + gen, # noqa: F401 + swagger, # noqa: F401 ) diff --git a/dash-fastapi-frontend/views/tool/build/__init__.py b/dash-fastapi-frontend/views/tool/build/__init__.py index eed12cc..58b4fc6 100644 --- a/dash-fastapi-frontend/views/tool/build/__init__.py +++ b/dash-fastapi-frontend/views/tool/build/__init__.py @@ -1,8 +1,5 @@ from dash import html -import feffery_utils_components as fuc -import feffery_antd_components as fac def render(*args, **kwargs): - return html.Div('我是表单构建') diff --git a/dash-fastapi-frontend/views/tool/gen/__init__.py b/dash-fastapi-frontend/views/tool/gen/__init__.py index 3b7564a..3c396c6 100644 --- a/dash-fastapi-frontend/views/tool/gen/__init__.py +++ b/dash-fastapi-frontend/views/tool/gen/__init__.py @@ -1,8 +1,5 @@ from dash import html -import feffery_utils_components as fuc -import feffery_antd_components as fac def render(*args, **kwargs): - return html.Div('我是代码生成') diff --git a/dash-fastapi-frontend/views/tool/swagger/__init__.py b/dash-fastapi-frontend/views/tool/swagger/__init__.py index 2f3eaf4..41b0620 100644 --- a/dash-fastapi-frontend/views/tool/swagger/__init__.py +++ b/dash-fastapi-frontend/views/tool/swagger/__init__.py @@ -1,5 +1,5 @@ -from dash import html import feffery_utils_components as fuc +from dash import html from config.env import ApiConfig -- Gitee From 374d88dc42ddc8aef75cb4935961ea4061fa0e28 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 27 Sep 2024 23:56:04 +0800 Subject: [PATCH 195/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=88=97=E8=A1=A8=E7=9B=B8=E5=85=B3=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/cache_c/list_c.py | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py index d7e1c90..32cfefb 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/cache_c/list_c.py @@ -1,5 +1,4 @@ import uuid -from dash import no_update from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate from api.monitor.cache import CacheApi @@ -69,7 +68,9 @@ def get_cache_key_list( """ 获取键名列表回调 """ - if cache_name_table_row_click or cache_key_refresh_click or operations: + if cache_name_table_click_row_record and ( + cache_name_table_row_click or cache_key_refresh_click or operations + ): cache_key_res = CacheApi.list_cache_key( cache_name=cache_name_table_click_row_record.get('key') ) @@ -183,22 +184,14 @@ def clear_cache_key(clear_click, recently_button_clicked_row, cache_key_store): CacheApi.clear_cache_key( cache_key=recently_button_clicked_row.get('key'), ) - if cache_key_store == recently_button_clicked_row.get('key'): - MessageManager.success(content='清除成功') - - return dict( - cache_name=None, - cache_key=None, - cache_value=None, - operations={'type': 'clear_cache_key'}, - ) - else: - return dict( - cache_name=no_update, - cache_key=no_update, - cache_value=no_update, - operations={'type': 'clear_cache_key'}, - ) + MessageManager.success(content='清除成功') + + return dict( + cache_name=None, + cache_key=None, + cache_value=None, + operations={'type': 'clear_cache_key'}, + ) raise PreventUpdate -- Gitee From 9cbc4ddca179e26342e227c2ee0ae88113e4274a Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 28 Sep 2024 22:41:21 +0800 Subject: [PATCH 196/229] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=95=B0=E6=8D=AE=E6=93=8D=E4=BD=9C=E6=A0=8F=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/system/dict/dict_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/views/system/dict/dict_data.py b/dash-fastapi-frontend/views/system/dict/dict_data.py index 6e303c3..abf6a92 100644 --- a/dash-fastapi-frontend/views/system/dict/dict_data.py +++ b/dash-fastapi-frontend/views/system/dict/dict_data.py @@ -300,7 +300,7 @@ def render(): 'title': '操作', 'dataIndex': 'operation', 'fixed': 'right', - 'width': 150, + 'width': 170, 'renderOptions': { 'renderType': 'button' }, -- Gitee From 50644ea23d48ab126895205cba0cbe94bc09d8a8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 28 Sep 2024 22:41:59 +0800 Subject: [PATCH 197/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9ETTL=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/cache_util.py | 44 +++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/utils/cache_util.py b/dash-fastapi-frontend/utils/cache_util.py index fb59185..86768a3 100644 --- a/dash-fastapi-frontend/utils/cache_util.py +++ b/dash-fastapi-frontend/utils/cache_util.py @@ -1,9 +1,10 @@ -from cachebox import LRUCache +from cachebox import LRUCache, TTLCache from flask import session -from typing import Dict +from typing import Any, Dict cache_manager = LRUCache(maxsize=10000, iterable=None, capacity=10000) +ttl_manager = TTLCache(maxsize=0, ttl=600) class CacheManager: @@ -52,3 +53,42 @@ class CacheManager: cache = cache_manager.get(session.get('Authorization')) cache.pop(target_key, None) cache_manager.insert(session.get('Authorization'), cache) + + +class TTLCacheManager: + """ + TTL缓存管理器 + """ + + @classmethod + def get(cls, target_key: str): + """ + 获取缓存值 + + :param target_key: 缓存key + :return: 缓存值 + """ + return ttl_manager.get(target_key) + + @classmethod + def set(cls, target_key: str, target_value: Any): + """ + 设置缓存值 + + :param target_key: 缓存key + :param target_value: 缓存值 + :return: + """ + ttl_manager.insert(target_key, target_value) + + @classmethod + def delete(cls, target_keys: str): + """ + 删除缓存值 + + :param target_keys: 缓存keys + :return: + """ + target_key_list = target_keys.split(',') + for target_key in target_key_list: + del ttl_manager[target_key] -- Gitee From 3c0d1fb2dbf3e136dec05ef8a49e9c710583ea71 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sat, 28 Sep 2024 22:42:48 +0800 Subject: [PATCH 198/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=BC=93=E5=AD=98=E9=80=BB=E8=BE=91=EF=BC=8C=E5=87=8F?= =?UTF-8?q?=E5=B0=91=E5=86=85=E5=AD=98=E6=B6=88=E8=80=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/dict_c/dict_c.py | 22 ++++++-- .../callbacks/system_c/dict_c/dict_data_c.py | 21 ++++++-- dash-fastapi-frontend/utils/dict_util.py | 51 +++++++++---------- 3 files changed, 58 insertions(+), 36 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index ac05e8a..eba3fb6 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -7,6 +7,7 @@ from typing import Dict from api.system.dict.type import DictTypeApi from config.constant import SysNormalDisableConstant from server import app +from utils.cache_util import TTLCacheManager from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager @@ -389,6 +390,7 @@ def dict_type_confirm(confirm_trigger, modal_type, form_value, form_label): operations={'type': 'add'}, ) if modal_type == 'edit': + TTLCacheManager.delete(form_value.get('dict_type')) MessageManager.success(content='编辑成功') return dict( @@ -436,7 +438,7 @@ def dict_type_confirm(confirm_trigger, modal_type, form_value, form_label): Input('dict_type-list-table', 'nClicksButton'), ], [ - State('dict_type-list-table', 'selectedRowKeys'), + State('dict_type-list-table', 'selectedRows'), State('dict_type-list-table', 'clickedContent'), State('dict_type-list-table', 'recentlyButtonClickedRow'), ], @@ -445,7 +447,7 @@ def dict_type_confirm(confirm_trigger, modal_type, form_value, form_label): def dict_type_delete_modal( operation_click, button_click, - selected_row_keys, + selected_rows, clicked_content, recently_button_clicked_row, ): @@ -461,17 +463,25 @@ def dict_type_delete_modal( 'index': 'delete', 'type': 'dict_type-operation-button', }: - dict_ids = ','.join(selected_row_keys) + dict_ids = ','.join( + [str(item.get('dict_id')) for item in selected_rows] + ) + dict_types = ','.join( + [item.get('dict_type').get('content') for item in selected_rows] + ) else: if clicked_content == '删除': dict_ids = recently_button_clicked_row['key'] + dict_types = recently_button_clicked_row['dict_type'].get( + 'content' + ) else: return no_update return [ f'是否确认删除字典编号为{dict_ids}的字典类型?', True, - dict_ids, + {'dict_ids': dict_ids, 'dict_types': dict_types}, ] raise PreventUpdate @@ -488,8 +498,10 @@ def dict_type_delete_confirm(delete_confirm, dict_ids_data): 删除字典类型弹窗确认回调,实现删除操作 """ if delete_confirm: - params = dict_ids_data + params = dict_ids_data.get('dict_ids') + dict_types = dict_ids_data.get('dict_types') DictTypeApi.del_type(params) + TTLCacheManager.delete(dict_types) MessageManager.success(content='删除成功') return {'type': 'delete'} diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index 6e79aed..44aa01a 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -6,6 +6,7 @@ from dash.exceptions import PreventUpdate from api.system.dict.data import DictDataApi from config.constant import SysNormalDisableConstant from server import app +from utils.cache_util import TTLCacheManager from utils.common import validate_data_not_empty from utils.dict_util import DictManager from utils.feedback_util import MessageManager @@ -359,6 +360,7 @@ def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): if modal_type == 'edit': DictDataApi.update_data(params_edit) if modal_type == 'add': + TTLCacheManager.delete(form_value.get('dict_type')) MessageManager.success('新增成功') return dict( @@ -368,6 +370,7 @@ def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): operations={'type': 'add'}, ) if modal_type == 'edit': + TTLCacheManager.delete(form_value.get('dict_type')) MessageManager.success('编辑成功') return dict( @@ -415,7 +418,7 @@ def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): Input('dict_data-list-table', 'nClicksButton'), ], [ - State('dict_data-list-table', 'selectedRowKeys'), + State('dict_data-list-table', 'selectedRows'), State('dict_data-list-table', 'clickedContent'), State('dict_data-list-table', 'recentlyButtonClickedRow'), ], @@ -424,7 +427,7 @@ def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): def dict_data_delete_modal( operation_click, button_click, - selected_row_keys, + selected_rows, clicked_content, recently_button_clicked_row, ): @@ -440,17 +443,23 @@ def dict_data_delete_modal( 'index': 'delete', 'type': 'dict_data-operation-button', }: - dict_codes = ','.join(selected_row_keys) + dict_codes = ','.join( + [str(item.get('dict_code')) for item in selected_rows] + ) + dict_types = ','.join( + list(set([item.get('dict_type') for item in selected_rows])) + ) else: if clicked_content == '删除': dict_codes = recently_button_clicked_row['key'] + dict_types = recently_button_clicked_row['dict_type'] else: return no_update return [ f'是否确认删除字典编码为{dict_codes}的数据?', True, - dict_codes, + {'dict_codes': dict_codes, 'dict_types': dict_types}, ] raise PreventUpdate @@ -467,8 +476,10 @@ def dict_data_delete_confirm(delete_confirm, dict_codes_data): 删除字典数据弹窗确认回调,实现删除操作 """ if delete_confirm: - params = dict_codes_data + params = dict_codes_data.get('dict_codes') + dict_types = dict_codes_data.get('dict_types') DictDataApi.del_data(params) + TTLCacheManager.delete(dict_types) MessageManager.success('删除成功') return {'type': 'delete'} diff --git a/dash-fastapi-frontend/utils/dict_util.py b/dash-fastapi-frontend/utils/dict_util.py index a4b67ae..2b2df02 100644 --- a/dash-fastapi-frontend/utils/dict_util.py +++ b/dash-fastapi-frontend/utils/dict_util.py @@ -1,37 +1,36 @@ -from cachebox import cached, TTLCache -from flask import session from typing import Any, Literal from api.system.dict.data import DictDataApi - - -def _DictManager__custom_key_maker(*args, **kwargs): - key = args[1].get('dict_type') - if session.get('Authorization'): - key = f'{session.get("Authorization")}:{args[1].get("dict_type")}' - return key +from utils.cache_util import TTLCacheManager class DictManager: @classmethod - @cached(TTLCache(0, ttl=600), key_maker=_DictManager__custom_key_maker) def get_dict_options(cls, dict_type: str): - dict_data = DictDataApi.get_dicts(dict_type=dict_type).get('data') - select_options = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - ) - for item in dict_data - ] - dict_options = [ - dict( - label=item.get('dict_label'), - value=item.get('dict_value'), - css_class=item.get('css_class'), - list_class=item.get('list_class'), + cache_dict_value = TTLCacheManager.get(target_key=dict_type) + if cache_dict_value: + select_options, dict_options = cache_dict_value + else: + dict_data = DictDataApi.get_dicts(dict_type=dict_type).get('data') + select_options = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + ) + for item in dict_data + ] + dict_options = [ + dict( + label=item.get('dict_label'), + value=item.get('dict_value'), + css_class=item.get('css_class'), + list_class=item.get('list_class'), + ) + for item in dict_data + ] + TTLCacheManager.set( + target_key=dict_type, + target_value=[select_options, dict_options], ) - for item in dict_data - ] return [select_options, dict_options] -- Gitee From a3b4722852ca63345677123b08891c42995a6500 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 11:38:03 +0800 Subject: [PATCH 199/229] chore: fastapi -> 0.115.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8219759..6907fe5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ asyncmy==0.2.9 cachebox==4.1.2 dash==2.18.1 DateTime==5.5 -fastapi[all]==0.112.2 +fastapi[all]==0.115.0 feffery-antd-charts==0.1.0rc5 feffery-antd-components==0.3.7 feffery-markdown-components==0.2.10 -- Gitee From 22a2461b0a679b1b1b45583af387f5e8bc2b7138 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 11:38:42 +0800 Subject: [PATCH 200/229] =?UTF-8?q?refactor:=20=E5=9F=BA=E4=BA=8Efastapi0.?= =?UTF-8?q?115.0=E7=89=88=E6=9C=AC=E6=96=B0=E7=89=B9=E6=80=A7=EF=BC=8C?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8pydantic=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0=E5=92=8C?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=95=B0=E6=8D=AE=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?as=5Fquery=E5=92=8Cas=5Fform=E4=BD=BF=E7=94=A8=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/controller/config_controller.py | 6 +++--- .../module_admin/controller/dept_controller.py | 4 ++-- .../module_admin/controller/dict_controller.py | 10 +++++----- .../module_admin/controller/job_controller.py | 10 +++++----- .../module_admin/controller/log_controller.py | 10 +++++----- .../module_admin/controller/menu_controller.py | 4 ++-- .../module_admin/controller/notice_controller.py | 4 ++-- .../module_admin/controller/online_controller.py | 10 +++------- .../module_admin/controller/post_controler.py | 6 +++--- .../module_admin/controller/role_controller.py | 14 +++++++------- .../module_admin/controller/user_controller.py | 8 ++++---- .../module_admin/entity/vo/config_vo.py | 3 --- .../module_admin/entity/vo/dept_vo.py | 2 -- .../module_admin/entity/vo/dict_vo.py | 5 ----- .../module_admin/entity/vo/job_vo.py | 5 ----- .../module_admin/entity/vo/log_vo.py | 5 ----- .../module_admin/entity/vo/menu_vo.py | 2 -- .../module_admin/entity/vo/notice_vo.py | 3 --- .../module_admin/entity/vo/online_vo.py | 3 --- .../module_admin/entity/vo/post_vo.py | 3 --- .../module_admin/entity/vo/role_vo.py | 3 --- .../module_admin/entity/vo/user_vo.py | 6 ------ 22 files changed, 41 insertions(+), 85 deletions(-) diff --git a/dash-fastapi-backend/module_admin/controller/config_controller.py b/dash-fastapi-backend/module_admin/controller/config_controller.py index e75ec6d..2871a4a 100644 --- a/dash-fastapi-backend/module_admin/controller/config_controller.py +++ b/dash-fastapi-backend/module_admin/controller/config_controller.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Form, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType @@ -24,7 +24,7 @@ configController = APIRouter(prefix='/system/config', dependencies=[Depends(Logi ) async def get_system_config_list( request: Request, - config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_query), + config_page_query: ConfigPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -112,7 +112,7 @@ async def query_system_config(request: Request, config_key: str): @Log(title='参数管理', business_type=BusinessType.EXPORT) async def export_system_config_list( request: Request, - config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_form), + config_page_query: ConfigPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 diff --git a/dash-fastapi-backend/module_admin/controller/dept_controller.py b/dash-fastapi-backend/module_admin/controller/dept_controller.py index d84691b..4ff03da 100644 --- a/dash-fastapi-backend/module_admin/controller/dept_controller.py +++ b/dash-fastapi-backend/module_admin/controller/dept_controller.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from typing import List @@ -42,7 +42,7 @@ async def get_system_dept_tree_for_edit_option( ) async def get_system_dept_list( request: Request, - dept_query: DeptQueryModel = Depends(DeptQueryModel.as_query), + dept_query: DeptQueryModel = Query(), query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept')), ): diff --git a/dash-fastapi-backend/module_admin/controller/dict_controller.py b/dash-fastapi-backend/module_admin/controller/dict_controller.py index afd27b2..58c6a74 100644 --- a/dash-fastapi-backend/module_admin/controller/dict_controller.py +++ b/dash-fastapi-backend/module_admin/controller/dict_controller.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Form, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from typing import List @@ -32,7 +32,7 @@ dictController = APIRouter(prefix='/system/dict', dependencies=[Depends(LoginSer ) async def get_system_dict_type_list( request: Request, - dict_type_page_query: DictTypePageQueryModel = Depends(DictTypePageQueryModel.as_query), + dict_type_page_query: DictTypePageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -123,7 +123,7 @@ async def query_detail_system_dict_type(request: Request, dict_id: int, query_db @Log(title='字典类型', business_type=BusinessType.EXPORT) async def export_system_dict_type_list( request: Request, - dict_type_page_query: DictTypePageQueryModel = Depends(DictTypePageQueryModel.as_form), + dict_type_page_query: DictTypePageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 @@ -152,7 +152,7 @@ async def query_system_dict_type_data(request: Request, dict_type: str, query_db ) async def get_system_dict_data_list( request: Request, - dict_data_page_query: DictDataPageQueryModel = Depends(DictDataPageQueryModel.as_query), + dict_data_page_query: DictDataPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -226,7 +226,7 @@ async def query_detail_system_dict_data(request: Request, dict_code: int, query_ @Log(title='字典数据', business_type=BusinessType.EXPORT) async def export_system_dict_data_list( request: Request, - dict_data_page_query: DictDataPageQueryModel = Depends(DictDataPageQueryModel.as_form), + dict_data_page_query: DictDataPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 diff --git a/dash-fastapi-backend/module_admin/controller/job_controller.py b/dash-fastapi-backend/module_admin/controller/job_controller.py index 8c36db8..cbff19a 100644 --- a/dash-fastapi-backend/module_admin/controller/job_controller.py +++ b/dash-fastapi-backend/module_admin/controller/job_controller.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Form, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType @@ -32,7 +32,7 @@ jobController = APIRouter(prefix='/monitor', dependencies=[Depends(LoginService. ) async def get_system_job_list( request: Request, - job_page_query: JobPageQueryModel = Depends(JobPageQueryModel.as_query), + job_page_query: JobPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -132,7 +132,7 @@ async def query_detail_system_job(request: Request, job_id: int, query_db: Async @Log(title='定时任务', business_type=BusinessType.EXPORT) async def export_system_job_list( request: Request, - job_page_query: JobPageQueryModel = Depends(JobPageQueryModel.as_form), + job_page_query: JobPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 @@ -148,7 +148,7 @@ async def export_system_job_list( ) async def get_system_job_log_list( request: Request, - job_log_page_query: JobLogPageQueryModel = Depends(JobLogPageQueryModel.as_query), + job_log_page_query: JobLogPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -183,7 +183,7 @@ async def delete_system_job_log(request: Request, job_log_ids: str, query_db: As @Log(title='定时任务调度日志', business_type=BusinessType.EXPORT) async def export_system_job_log_list( request: Request, - job_log_page_query: JobLogPageQueryModel = Depends(JobLogPageQueryModel.as_form), + job_log_page_query: JobLogPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 diff --git a/dash-fastapi-backend/module_admin/controller/log_controller.py b/dash-fastapi-backend/module_admin/controller/log_controller.py index b95136f..0013c55 100644 --- a/dash-fastapi-backend/module_admin/controller/log_controller.py +++ b/dash-fastapi-backend/module_admin/controller/log_controller.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Form, Query, Request from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType from config.get_db import get_db @@ -29,7 +29,7 @@ logController = APIRouter(prefix='/monitor', dependencies=[Depends(LoginService. ) async def get_system_operation_log_list( request: Request, - operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_query), + operation_log_page_query: OperLogPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -66,7 +66,7 @@ async def delete_system_operation_log(request: Request, oper_ids: str, query_db: @Log(title='操作日志', business_type=BusinessType.EXPORT) async def export_system_operation_log_list( request: Request, - operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_form), + operation_log_page_query: OperLogPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 @@ -88,7 +88,7 @@ async def export_system_operation_log_list( ) async def get_system_login_log_list( request: Request, - login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_query), + login_log_page_query: LoginLogPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -137,7 +137,7 @@ async def unlock_system_user(request: Request, user_name: str, query_db: AsyncSe @Log(title='登录日志', business_type=BusinessType.EXPORT) async def export_system_login_log_list( request: Request, - login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_form), + login_log_page_query: LoginLogPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 diff --git a/dash-fastapi-backend/module_admin/controller/menu_controller.py b/dash-fastapi-backend/module_admin/controller/menu_controller.py index b3e8aca..ed3a5a7 100644 --- a/dash-fastapi-backend/module_admin/controller/menu_controller.py +++ b/dash-fastapi-backend/module_admin/controller/menu_controller.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from typing import List @@ -48,7 +48,7 @@ async def get_system_role_menu_tree( ) async def get_system_menu_list( request: Request, - menu_query: MenuQueryModel = Depends(MenuQueryModel.as_query), + menu_query: MenuQueryModel = Query(), query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user), ): diff --git a/dash-fastapi-backend/module_admin/controller/notice_controller.py b/dash-fastapi-backend/module_admin/controller/notice_controller.py index a7f46d0..7e634e9 100644 --- a/dash-fastapi-backend/module_admin/controller/notice_controller.py +++ b/dash-fastapi-backend/module_admin/controller/notice_controller.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType @@ -23,7 +23,7 @@ noticeController = APIRouter(prefix='/system/notice', dependencies=[Depends(Logi ) async def get_system_notice_list( request: Request, - notice_page_query: NoticePageQueryModel = Depends(NoticePageQueryModel.as_query), + notice_page_query: NoticePageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 diff --git a/dash-fastapi-backend/module_admin/controller/online_controller.py b/dash-fastapi-backend/module_admin/controller/online_controller.py index 56c6555..c6a781b 100644 --- a/dash-fastapi-backend/module_admin/controller/online_controller.py +++ b/dash-fastapi-backend/module_admin/controller/online_controller.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Query, Request from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType from config.get_db import get_db @@ -18,9 +18,7 @@ onlineController = APIRouter(prefix='/monitor/online', dependencies=[Depends(Log @onlineController.get( '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:list'))] ) -async def get_monitor_online_list( - request: Request, online_page_query: OnlineQueryModel = Depends(OnlineQueryModel.as_query) -): +async def get_monitor_online_list(request: Request, online_page_query: OnlineQueryModel = Query()): # 获取全量数据 online_query_result = await OnlineService.get_online_list_services(request, online_page_query) logger.info('获取成功') @@ -35,9 +33,7 @@ async def get_monitor_online_list( response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:list'))], ) -async def get_monitor_online_page_list( - request: Request, online_page_query: OnlinePageQueryModel = Depends(OnlinePageQueryModel.as_query) -): +async def get_monitor_online_page_list(request: Request, online_page_query: OnlinePageQueryModel = Query()): online_query = OnlineQueryModel(**online_page_query.model_dump(by_alias=True)) # 获取全量数据 online_query_result = await OnlineService.get_online_list_services(request, online_query) diff --git a/dash-fastapi-backend/module_admin/controller/post_controler.py b/dash-fastapi-backend/module_admin/controller/post_controler.py index 8b9d6c5..42d8654 100644 --- a/dash-fastapi-backend/module_admin/controller/post_controler.py +++ b/dash-fastapi-backend/module_admin/controller/post_controler.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Form, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType @@ -24,7 +24,7 @@ postController = APIRouter(prefix='/system/post', dependencies=[Depends(LoginSer ) async def get_system_post_list( request: Request, - post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_query), + post_page_query: PostPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), ): # 获取分页数据 @@ -94,7 +94,7 @@ async def query_detail_system_post(request: Request, post_id: int, query_db: Asy @Log(title='岗位管理', business_type=BusinessType.EXPORT) async def export_system_post_list( request: Request, - post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_form), + post_page_query: PostPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), ): # 获取全量数据 diff --git a/dash-fastapi-backend/module_admin/controller/role_controller.py b/dash-fastapi-backend/module_admin/controller/role_controller.py index 0b6fa45..2cf5bd2 100644 --- a/dash-fastapi-backend/module_admin/controller/role_controller.py +++ b/dash-fastapi-backend/module_admin/controller/role_controller.py @@ -1,5 +1,5 @@ from datetime import datetime -from fastapi import APIRouter, Depends, Request +from fastapi import APIRouter, Depends, Form, Query, Request from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType @@ -43,7 +43,7 @@ async def get_system_role_dept_tree( ) async def get_system_role_list( request: Request, - role_page_query: RolePageQueryModel = Depends(RolePageQueryModel.as_query), + role_page_query: RolePageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept')), ): @@ -165,7 +165,7 @@ async def query_detail_system_role( @Log(title='角色管理', business_type=BusinessType.EXPORT) async def export_system_role_list( request: Request, - role_page_query: RolePageQueryModel = Depends(RolePageQueryModel.as_form), + role_page_query: RolePageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysDept')), ): @@ -211,7 +211,7 @@ async def reset_system_role_status( ) async def get_system_allocated_user_list( request: Request, - user_role: UserRolePageQueryModel = Depends(UserRolePageQueryModel.as_query), + user_role: UserRolePageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysUser')), ): @@ -230,7 +230,7 @@ async def get_system_allocated_user_list( ) async def get_system_unallocated_user_list( request: Request, - user_role: UserRolePageQueryModel = Depends(UserRolePageQueryModel.as_query), + user_role: UserRolePageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysUser')), ): @@ -246,7 +246,7 @@ async def get_system_unallocated_user_list( @Log(title='角色管理', business_type=BusinessType.GRANT) async def add_system_role_user( request: Request, - add_role_user: CrudUserRoleModel = Depends(CrudUserRoleModel.as_query), + add_role_user: CrudUserRoleModel = Query(), query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user), data_scope_sql: str = Depends(GetDataScope('SysDept')), @@ -274,7 +274,7 @@ async def cancel_system_role_user( @Log(title='角色管理', business_type=BusinessType.GRANT) async def batch_cancel_system_role_user( request: Request, - batch_cancel_user_role: CrudUserRoleModel = Depends(CrudUserRoleModel.as_query), + batch_cancel_user_role: CrudUserRoleModel = Query(), query_db: AsyncSession = Depends(get_db), ): batch_cancel_user_role_result = await UserService.delete_user_role_services(query_db, batch_cancel_user_role) diff --git a/dash-fastapi-backend/module_admin/controller/user_controller.py b/dash-fastapi-backend/module_admin/controller/user_controller.py index 196de90..eda93a6 100644 --- a/dash-fastapi-backend/module_admin/controller/user_controller.py +++ b/dash-fastapi-backend/module_admin/controller/user_controller.py @@ -1,6 +1,6 @@ import os from datetime import datetime -from fastapi import APIRouter, Depends, File, Query, Request, UploadFile +from fastapi import APIRouter, Depends, File, Form, Query, Request, UploadFile from sqlalchemy.ext.asyncio import AsyncSession from typing import Optional, Union from pydantic_validation_decorator import ValidateFields @@ -57,7 +57,7 @@ async def get_system_dept_tree( ) async def get_system_user_list( request: Request, - user_page_query: UserPageQueryModel = Depends(UserPageQueryModel.as_query), + user_page_query: UserPageQueryModel = Query(), query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysUser')), ): @@ -296,7 +296,7 @@ async def change_system_user_profile_info( @Log(title='个人信息', business_type=BusinessType.UPDATE) async def reset_system_user_password( request: Request, - reset_password: ResetPasswordModel = Depends(ResetPasswordModel.as_query), + reset_password: ResetPasswordModel = Query(), query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user), ): @@ -344,7 +344,7 @@ async def export_system_user_template(request: Request, query_db: AsyncSession = @Log(title='用户管理', business_type=BusinessType.EXPORT) async def export_system_user_list( request: Request, - user_page_query: UserPageQueryModel = Depends(UserPageQueryModel.as_form), + user_page_query: UserPageQueryModel = Form(), query_db: AsyncSession = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysUser')), ): diff --git a/dash-fastapi-backend/module_admin/entity/vo/config_vo.py b/dash-fastapi-backend/module_admin/entity/vo/config_vo.py index 11f2355..4bfabb0 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/config_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/config_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_form, as_query class ConfigModel(BaseModel): @@ -53,8 +52,6 @@ class ConfigQueryModel(ConfigModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class ConfigPageQueryModel(ConfigQueryModel): """ 参数配置管理分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py b/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py index cd2824a..4d89ebd 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/dept_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic_validation_decorator import Network, NotBlank, Size from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_query class DeptModel(BaseModel): @@ -52,7 +51,6 @@ class DeptModel(BaseModel): self.get_email() -@as_query class DeptQueryModel(DeptModel): """ 部门管理不分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py b/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py index b37cfa0..8c9cef3 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/dict_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic_validation_decorator import NotBlank, Pattern, Size from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_form, as_query class DictTypeModel(BaseModel): @@ -99,8 +98,6 @@ class DictTypeQueryModel(DictTypeModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class DictTypePageQueryModel(DictTypeQueryModel): """ 字典类型管理分页查询模型 @@ -127,8 +124,6 @@ class DictDataQueryModel(DictDataModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class DictDataPageQueryModel(DictDataQueryModel): """ 字典数据管理分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/job_vo.py b/dash-fastapi-backend/module_admin/entity/vo/job_vo.py index ca0fc35..24e6dd1 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/job_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/job_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_form, as_query class JobModel(BaseModel): @@ -76,8 +75,6 @@ class JobQueryModel(JobModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class JobPageQueryModel(JobQueryModel): """ 定时任务管理分页查询模型 @@ -112,8 +109,6 @@ class JobLogQueryModel(JobLogModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class JobLogPageQueryModel(JobLogQueryModel): """ 定时任务日志管理分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/log_vo.py b/dash-fastapi-backend/module_admin/entity/vo/log_vo.py index c1970b0..1fa2b4a 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/log_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/log_vo.py @@ -1,7 +1,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_form, as_query class OperLogModel(BaseModel): @@ -67,8 +66,6 @@ class OperLogQueryModel(OperLogModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class OperLogPageQueryModel(OperLogQueryModel): """ 操作日志管理分页查询模型 @@ -99,8 +96,6 @@ class LoginLogQueryModel(LogininforModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class LoginLogPageQueryModel(LoginLogQueryModel): """ 登录日志管理分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py b/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py index a8fb783..db528e7 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/menu_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_query class MenuModel(BaseModel): @@ -67,7 +66,6 @@ class MenuModel(BaseModel): self.get_perms() -@as_query class MenuQueryModel(MenuModel): """ 菜单管理不分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py b/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py index ef1570c..ed1f05b 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/notice_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic_validation_decorator import NotBlank, Size, Xss from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_form, as_query class NoticeModel(BaseModel): @@ -42,8 +41,6 @@ class NoticeQueryModel(NoticeModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class NoticePageQueryModel(NoticeQueryModel): """ 通知公告管理分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py index a0a0eb7..fd5c140 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/online_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/online_vo.py @@ -1,7 +1,6 @@ from datetime import datetime from pydantic import BaseModel, Field from typing import Optional -from module_admin.annotation.pydantic_annotation import as_query class OnlineModel(BaseModel): @@ -19,7 +18,6 @@ class OnlineModel(BaseModel): login_time: Optional[datetime] = Field(default=None, description='登录时间') -@as_query class OnlineQueryModel(OnlineModel): """ 在线用户不分页查询模型 @@ -29,7 +27,6 @@ class OnlineQueryModel(OnlineModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query class OnlinePageQueryModel(OnlineQueryModel): """ 在线用户分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/post_vo.py b/dash-fastapi-backend/module_admin/entity/vo/post_vo.py index 337a6cc..5e4d9fa 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/post_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/post_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic_validation_decorator import NotBlank, Size from typing import Literal, Optional -from module_admin.annotation.pydantic_annotation import as_form, as_query class PostModel(BaseModel): @@ -52,8 +51,6 @@ class PostQueryModel(PostModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class PostPageQueryModel(PostQueryModel): """ 岗位管理分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/role_vo.py b/dash-fastapi-backend/module_admin/entity/vo/role_vo.py index 37a4c41..1c91517 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/role_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/role_vo.py @@ -2,7 +2,6 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from pydantic_validation_decorator import NotBlank, Size from typing import List, Literal, Optional, Union -from module_admin.annotation.pydantic_annotation import as_form, as_query class RoleModel(BaseModel): @@ -103,8 +102,6 @@ class RoleQueryModel(RoleModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class RolePageQueryModel(RoleQueryModel): """ 角色管理分页查询模型 diff --git a/dash-fastapi-backend/module_admin/entity/vo/user_vo.py b/dash-fastapi-backend/module_admin/entity/vo/user_vo.py index a7dddf4..b0284e9 100644 --- a/dash-fastapi-backend/module_admin/entity/vo/user_vo.py +++ b/dash-fastapi-backend/module_admin/entity/vo/user_vo.py @@ -4,7 +4,6 @@ from pydantic import BaseModel, ConfigDict, Field, model_validator from pydantic_validation_decorator import Network, NotBlank, Size, Xss from typing import List, Literal, Optional, Union from exceptions.exception import ModelValidatorException -from module_admin.annotation.pydantic_annotation import as_form, as_query from module_admin.entity.vo.dept_vo import DeptModel from module_admin.entity.vo.post_vo import PostModel from module_admin.entity.vo.role_vo import RoleModel @@ -155,8 +154,6 @@ class UserQueryModel(UserModel): end_time: Optional[str] = Field(default=None, description='结束时间') -@as_query -@as_form class UserPageQueryModel(UserQueryModel): """ 用户管理分页查询模型 @@ -184,7 +181,6 @@ class EditUserModel(AddUserModel): role: Optional[List] = Field(default=[], description='角色信息') -@as_query class ResetPasswordModel(BaseModel): """ 重置密码模型 @@ -230,7 +226,6 @@ class UserRoleQueryModel(UserModel): role_id: Optional[int] = Field(default=None, description='角色ID') -@as_query class UserRolePageQueryModel(UserRoleQueryModel): """ 用户角色关联管理分页查询模型 @@ -257,7 +252,6 @@ class UserRoleResponseModel(BaseModel): user: UserInfoModel = Field(description='用户信息') -@as_query class CrudUserRoleModel(BaseModel): """ 新增、删除用户关联角色及角色关联用户模型 -- Gitee From 8baf17a4ea8922f5e00cf34441a0d09cddf961e6 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 14:22:40 +0800 Subject: [PATCH 201/229] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/job_c/job_c.py | 4 ++ .../views/monitor/job/__init__.py | 57 ++++++++++++++----- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index 13f1c80..a7296ea 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -493,6 +493,10 @@ def get_job_detail_modal( dict_type='sys_job_group', dict_value=job_info.get('job_group'), ) + job_info['job_executor'] = DictManager.get_dict_label( + dict_type='sys_job_executor', + dict_value=job_info.get('job_executor'), + ) job_info['status'] = DictManager.get_dict_label( dict_type='sys_job_status', dict_value=job_info.get('status'), diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index fddcd86..2438237 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -370,11 +370,16 @@ def render(*args, **kwargs): }, required=True, label='任务名称', - labelCol={'span': 6}, - wrapperCol={'span': 18}, + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=12, + span=24, ), + ], + gutter=5, + ), + fac.AntdRow( + [ fac.AntdCol( fac.AntdFormItem( ApiSelect( @@ -394,6 +399,25 @@ def render(*args, **kwargs): ), span=12, ), + fac.AntdCol( + fac.AntdFormItem( + ApiSelect( + dict_type='sys_job_executor', + name='job_executor', + placeholder='请选择任务执行器', + style={'width': '100%'}, + ), + id={ + 'type': 'job-form-label', + 'index': 'job_executor', + 'required': False, + }, + label='任务执行器', + labelCol={'span': 6}, + wrapperCol={'span': 18}, + ), + span=12, + ), ], gutter=5, ), @@ -637,11 +661,16 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'job_name', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=12, + span=24, ), + ], + gutter=5, + ), + fac.AntdRow( + [ fac.AntdCol( fac.AntdFormItem( fac.AntdText( @@ -661,11 +690,6 @@ def render(*args, **kwargs): ), span=12, ), - ], - gutter=5, - ), - fac.AntdRow( - [ fac.AntdCol( fac.AntdFormItem( fac.AntdText( @@ -685,6 +709,11 @@ def render(*args, **kwargs): ), span=12, ), + ], + gutter=5, + ), + fac.AntdRow( + [ fac.AntdCol( fac.AntdFormItem( fac.AntdText( @@ -699,10 +728,10 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'invoke_target', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, + labelCol={'span': 3}, + wrapperCol={'span': 21}, ), - span=12, + span=24, ), ], gutter=5, -- Gitee From 104720619aa5689599e32650107f12af1e5c46d5 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 15:55:55 +0800 Subject: [PATCH 202/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86modal=E8=A1=A8=E5=8D=95=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/system/user/__init__.py | 359 ++++++++++-------- 1 file changed, 195 insertions(+), 164 deletions(-) diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 58803e9..864852f 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -402,218 +402,249 @@ def render(*args, **kwargs): [ fac.AntdForm( [ - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdInput( - name='nick_name', - placeholder='请输入用户昵称', - allowClear=True, - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + name='nick_name', + placeholder='请输入用户昵称', + allowClear=True, + style={'width': '100%'}, + ), + label='用户昵称', + required=True, + id={ + 'type': 'user-form-label', + 'index': 'nick_name', + 'required': True, + }, ), - label='用户昵称', - required=True, - id={ - 'type': 'user-form-label', - 'index': 'nick_name', - 'required': True, - }, + span=12, ), - fac.AntdFormItem( - fac.AntdTreeSelect( - id='user-dpet-tree', - name='dept_id', - placeholder='请选择归属部门', - treeData=[], - treeNodeFilterProp='title', - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdTreeSelect( + id='user-dpet-tree', + name='dept_id', + placeholder='请选择归属部门', + treeData=[], + treeNodeFilterProp='title', + style={'width': '100%'}, + ), + label='归属部门', + id={ + 'type': 'user-form-label', + 'index': 'dept_id', + 'required': False, + }, ), - label='归属部门', - id={ - 'type': 'user-form-label', - 'index': 'dept_id', - 'required': False, - }, - labelCol={'offset': 1}, + span=12, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdInput( - name='phonenumber', - placeholder='请输入手机号码', - allowClear=True, - style={'width': 200}, - ), - label='手机号码', - id={ - 'type': 'user-form-label', - 'index': 'phonenumber', - 'required': False, - }, - labelCol={'offset': 1}, - ), - fac.AntdFormItem( - fac.AntdInput( - name='email', - placeholder='请输入邮箱', - allowClear=True, - style={'width': 200}, - ), - label='邮箱', - id={ - 'type': 'user-form-label', - 'index': 'email', - 'required': False, - }, - labelCol={'offset': 5}, - ), - ], - size='middle', - ), - html.Div( - fac.AntdSpace( - [ + fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id='user-form-user_name', - name='user_name', - placeholder='请输入用户名称', + name='phonenumber', + placeholder='请输入手机号码', allowClear=True, - style={'width': 200}, + style={'width': '100%'}, ), - label='用户名称', - required=True, + label='手机号码', id={ 'type': 'user-form-label', - 'index': 'user_name', - 'required': True, + 'index': 'phonenumber', + 'required': False, }, ), + span=12, + ), + fac.AntdCol( fac.AntdFormItem( fac.AntdInput( - id='user-form-password', - name='password', - placeholder='请输入密码', - mode='password', - passwordUseMd5=True, - style={'width': 200}, + name='email', + placeholder='请输入邮箱', + allowClear=True, + style={'width': '100%'}, ), - label='用户密码', - required=True, + label='邮箱', id={ 'type': 'user-form-label', - 'index': 'password', - 'required': True, + 'index': 'email', + 'required': False, }, ), + span=12, + ), + ], + gutter=10, + ), + html.Div( + fac.AntdRow( + [ + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='user-form-user_name', + name='user_name', + placeholder='请输入用户名称', + allowClear=True, + style={'width': '100%'}, + ), + label='用户名称', + required=True, + id={ + 'type': 'user-form-label', + 'index': 'user_name', + 'required': True, + }, + ), + span=12, + ), + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='user-form-password', + name='password', + placeholder='请输入密码', + mode='password', + passwordUseMd5=True, + style={'width': '100%'}, + ), + label='用户密码', + required=True, + id={ + 'type': 'user-form-label', + 'index': 'password', + 'required': True, + }, + ), + span=12, + ), ], - size='middle', + gutter=10, ), id='user-user_name-password-container', ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - ApiSelect( - dict_type='sys_user_sex', - name='sex', - placeholder='请选择性别', - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + ApiSelect( + dict_type='sys_user_sex', + name='sex', + placeholder='请选择性别', + style={'width': '100%'}, + ), + label='用户性别', + id={ + 'type': 'user-form-label', + 'index': 'sex', + 'required': False, + }, ), - label='用户性别', - id={ - 'type': 'user-form-label', - 'index': 'sex', - 'required': False, - }, - labelCol={'offset': 1}, + span=12, ), - fac.AntdFormItem( - ApiRadioGroup( - dict_type='sys_normal_disable', - name='status', - defaultValue='0', - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + ApiRadioGroup( + dict_type='sys_normal_disable', + name='status', + defaultValue='0', + style={'width': '100%'}, + ), + label='用户状态', + id={ + 'type': 'user-form-label', + 'index': 'status', + 'required': False, + }, ), - label='用户状态', - id={ - 'type': 'user-form-label', - 'index': 'status', - 'required': False, - }, - labelCol={'offset': 2}, + span=12, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdSelect( - id='user-post', - name='post_ids', - placeholder='请选择岗位', - options=[], - mode='multiple', - optionFilterProp='label', - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdSelect( + id='user-post', + name='post_ids', + placeholder='请选择岗位', + options=[], + mode='multiple', + optionFilterProp='label', + style={'width': '100%'}, + ), + label='岗位', + id={ + 'type': 'user-form-label', + 'index': 'post_ids', + 'required': False, + }, ), - label='岗位', - id={ - 'type': 'user-form-label', - 'index': 'post_ids', - 'required': False, - }, - labelCol={'offset': 4}, + span=12, ), - fac.AntdFormItem( - fac.AntdSelect( - id='user-role', - name='role_ids', - placeholder='请选择角色', - options=[], - mode='multiple', - optionFilterProp='label', - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdSelect( + id='user-role', + name='role_ids', + placeholder='请选择角色', + options=[], + mode='multiple', + optionFilterProp='label', + style={'width': '100%'}, + ), + label='角色', + id={ + 'type': 'user-form-label', + 'index': 'role_ids', + 'required': False, + }, ), - label='角色', - id={ - 'type': 'user-form-label', - 'index': 'role_ids', - 'required': False, - }, - labelCol={'offset': 8}, + span=12, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdInput( - name='remark', - placeholder='请输入内容', - allowClear=True, - mode='text-area', - style={'width': 490}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + name='remark', + placeholder='请输入内容', + allowClear=True, + mode='text-area', + style={'width': '100%'}, + ), + label='备注', + id={ + 'type': 'user-form-label', + 'index': 'remark', + 'required': False, + }, + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - label='备注', - id={ - 'type': 'user-form-label', - 'index': 'remark', - 'required': False, - }, - labelCol={'offset': 2}, + span=24, ), - ] + ], + gutter=10, ), ], id='user-form', enableBatchControl=True, + labelCol={'span': 8}, + wrapperCol={'span': 16}, + style={'marginRight': '15px'}, ) ], id='user-modal', -- Gitee From e98e65e464246845ce5ececd02750c2bc51bf796 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 15:56:07 +0800 Subject: [PATCH 203/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=AE=A1=E7=90=86modal=E8=A1=A8=E5=8D=95=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/system_c/role_c/role_c.py | 6 +++--- dash-fastapi-frontend/views/system/role/__init__.py | 13 ++----------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index cfbb30b..f08bca5 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -479,8 +479,8 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): {'type': 'role-form-value', 'index': ALL, 'required': ALL}, 'value' ), form_label=State( - {'type': 'role-form-value', 'index': ALL, 'required': True}, - 'placeholder', + {'type': 'role-form-label', 'index': ALL, 'required': True}, + 'label', ), menu_checked_keys=State('role-menu-perms', 'checkedKeys'), menu_half_checked_keys=State('role-menu-perms', 'halfCheckedKeys'), @@ -582,7 +582,7 @@ def role_confirm( form_label_validate_info=[ None if validate_data_not_empty(form_value_state.get(k)) - else form_label_state.get(k) + else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], modal_visible=no_update, diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index 0d88377..1581d5b 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -386,17 +386,8 @@ def render(*args, **kwargs): allowClear=True, style={'width': 350}, ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='控制器中定义的权限字符,如:common', - ), - fac.AntdText('权限字符'), - ] - ), + label='权限字符', + tooltip='控制器中定义的权限字符,如:common', required=True, id={ 'type': 'role-form-label', -- Gitee From a5cecb76edd20a2a34077c674f700437244efb56 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 15:56:26 +0800 Subject: [PATCH 204/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86modal=E8=A1=A8=E5=8D=95=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu_c/components_c/menu_type_c.py | 6 + .../views/system/menu/__init__.py | 188 +++++----- .../system/menu/components/button_type.py | 48 +-- .../system/menu/components/content_type.py | 148 ++++---- .../views/system/menu/components/menu_type.py | 331 ++++++++---------- 5 files changed, 326 insertions(+), 395 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py index 2b67b21..309aa68 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py @@ -51,6 +51,7 @@ from utils.feedback_util import MessageManager order_num=State('menu-order_num', 'value'), is_frame=State('menu-menu-is_frame', 'value'), path=State('menu-menu-path', 'value'), + route_name=State('menu-menu-route_name', 'value'), component=State('menu-menu-component', 'value'), perms=State('menu-menu-perms', 'value'), query=State('menu-menu-query', 'value'), @@ -72,6 +73,7 @@ def menu_confirm_menu( order_num, is_frame, path, + route_name, component, perms, query, @@ -95,6 +97,7 @@ def menu_confirm_menu( order_num=order_num, is_frame=is_frame, path=path, + route_name=route_name, component=component, perms=perms, query=query, @@ -111,6 +114,7 @@ def menu_confirm_menu( order_num=order_num, is_frame=is_frame, path=path, + route_name=route_name, component=component, perms=perms, query=query, @@ -174,6 +178,7 @@ def menu_confirm_menu( [ Output('menu-menu-is_frame', 'value'), Output('menu-menu-path', 'value'), + Output('menu-menu-route_name', 'value'), Output('menu-menu-component', 'value'), Output('menu-menu-perms', 'value'), Output('menu-menu-query', 'value'), @@ -191,6 +196,7 @@ def set_edit_info(edit_info): return [ edit_info.get('is_frame'), edit_info.get('path'), + edit_info.get('route_name'), edit_info.get('component'), edit_info.get('perms'), edit_info.get('query'), diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index b7d762f..7ec4ef4 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -288,121 +288,125 @@ def render(*args, **kwargs): [ fac.AntdForm( [ - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdTreeSelect( - id='menu-parent_id', - placeholder='请选择上级菜单', - treeData=[], - defaultValue='0', - treeNodeFilterProp='title', - style={'width': 495}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdTreeSelect( + id='menu-parent_id', + placeholder='请选择上级菜单', + treeData=[], + defaultValue='0', + treeNodeFilterProp='title', + style={'width': '100%'}, + ), + label='上级菜单', + required=True, + id='menu-parent_id-form-item', + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - label='上级菜单', - required=True, - id='menu-parent_id-form-item', - labelCol={ - 'span': 4, - }, - wrapperCol={'span': 20}, + span=24, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdRadioGroup( - id='menu-menu_type', - options=[ - { - 'label': '目录', - 'value': MenuConstant.TYPE_DIR, - }, - { - 'label': '菜单', - 'value': MenuConstant.TYPE_MENU, - }, - { - 'label': '按钮', - 'value': MenuConstant.TYPE_BUTTON, - }, - ], - defaultValue='M', - style={'width': 495}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdRadioGroup( + id='menu-menu_type', + options=[ + { + 'label': '目录', + 'value': MenuConstant.TYPE_DIR, + }, + { + 'label': '菜单', + 'value': MenuConstant.TYPE_MENU, + }, + { + 'label': '按钮', + 'value': MenuConstant.TYPE_BUTTON, + }, + ], + defaultValue='M', + style={'width': '100%'}, + ), + label='菜单类型', + required=True, + id='menu-menu_type-form-item', + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - label='菜单类型', - required=True, - id='menu-menu_type-form-item', - labelCol={ - 'span': 4, - }, - wrapperCol={'span': 20}, - ) + span=24, + ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdPopover( - fac.AntdInput( - id='menu-icon', - placeholder='点击此处选择图标', - readOnly=True, - style={'width': 495}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdPopover( + fac.AntdInput( + id='menu-icon', + placeholder='点击此处选择图标', + readOnly=True, + style={'width': '100%'}, + ), + content=render_icon(), + trigger='click', + placement='bottom', ), - content=render_icon(), - trigger='click', - placement='bottom', + label='菜单图标', + id='menu-icon-form-item', + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - label='菜单图标', - id='menu-icon-form-item', - labelCol={ - 'span': 4, - }, - wrapperCol={'span': 20}, + span=24, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdInput( - id='menu-menu_name', - placeholder='请输入菜单名称', - allowClear=True, - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='menu-menu_name', + placeholder='请输入菜单名称', + allowClear=True, + style={'width': '100%'}, + ), + label='菜单名称', + required=True, + id='menu-menu_name-form-item', ), - label='菜单名称', - required=True, - id='menu-menu_name-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + span=12, ), - fac.AntdFormItem( - fac.AntdInputNumber( - id='menu-order_num', - min=0, - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInputNumber( + id='menu-order_num', + min=0, + style={'width': '100%'}, + ), + label='显示排序', + required=True, + id='menu-order_num-form-item', ), - label='显示排序', - required=True, - id='menu-order_num-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + span=12, ), ], - size='middle', + gutter=10, ), html.Div(id='content-by-menu-type'), - ] + ], + labelCol={'span': 8}, + wrapperCol={'span': 16}, + style={'marginRight': '15px'}, ) ], id='menu-modal', diff --git a/dash-fastapi-frontend/views/system/menu/components/button_type.py b/dash-fastapi-frontend/views/system/menu/components/button_type.py index 0f47932..56265ba 100644 --- a/dash-fastapi-frontend/views/system/menu/components/button_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/button_type.py @@ -5,37 +5,25 @@ from callbacks.system_c.menu_c.components_c import button_type_c # noqa: F401 def render(): return [ - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdInput( - id='button-menu-perms', - placeholder='请输入权限字符', - allowClear=True, - style={ - 'width': 200 - } + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='button-menu-perms', + placeholder='请输入权限字符', + allowClear=True, + style={'width': '100%'}, + ), + label='权限字符', + tooltip='控制器中定义的权限字符,如:system:user:list', + id='button-menu-perms-form-item', + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon( - icon='antd-question-circle' - ), - title='控制器中定义的权限字符,如:system:user:list' - ), - fac.AntdText('权限字符') - ] - ), - id='button-menu-perms-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={ - 'span': 16 - } - ), + span=24, + ) ], - size="middle" - ), + gutter=10, + ) ] diff --git a/dash-fastapi-frontend/views/system/menu/components/content_type.py b/dash-fastapi-frontend/views/system/menu/components/content_type.py index 5b1528d..59f071e 100644 --- a/dash-fastapi-frontend/views/system/menu/components/content_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/content_type.py @@ -1,5 +1,4 @@ import feffery_antd_components as fac -from dash import html from callbacks.system_c.menu_c.components_c import content_type_c # noqa: F401 from config.constant import ( MenuConstant, @@ -11,106 +10,77 @@ from components.ApiRadioGroup import ApiRadioGroup def render(): return [ - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdRadioGroup( - id='content-menu-is_frame', - options=[ - {'label': '是', 'value': MenuConstant.YES_FRAME}, - {'label': '否', 'value': MenuConstant.NO_FRAME}, - ], - defaultValue=MenuConstant.NO_FRAME, - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdRadioGroup( + id='content-menu-is_frame', + options=[ + { + 'label': '是', + 'value': MenuConstant.YES_FRAME, + }, + {'label': '否', 'value': MenuConstant.NO_FRAME}, + ], + defaultValue=MenuConstant.NO_FRAME, + style={'width': '100%'}, + ), + label='是否外链', + tooltip='选择是外链则路由地址需要以`http(s)://`开头', + id='content-menu-is_frame-form-item', ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='选择是外链则路由地址需要以`http(s)://`开头', - ), - fac.AntdText('是否外链'), - ] - ), - id='content-menu-is_frame-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + span=12, ), - fac.AntdFormItem( - fac.AntdInput( - id='content-menu-path', - placeholder='请输入路由地址', - allowClear=True, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头', - ), - fac.AntdText('路由地址'), - ] + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='content-menu-path', + placeholder='请输入路由地址', + allowClear=True, + style={'width': '100%'}, + ), + label='路由地址', + tooltip='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头', + required=True, + id='content-menu-path-form-item', ), - required=True, - id='content-menu-path-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + span=12, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - ApiRadioGroup( - dict_type='sys_show_hide', - id='content-menu-visible', - defaultValue=SysShowHideConstant.SHOW, - style={'width': 200}, + fac.AntdCol( + fac.AntdFormItem( + ApiRadioGroup( + dict_type='sys_show_hide', + id='content-menu-visible', + defaultValue=SysShowHideConstant.SHOW, + style={'width': '100%'}, + ), + label='显示状态', + tooltip='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问', + id='content-menu-visible-form-item', ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问', - ), - fac.AntdText('显示状态'), - ] - ), - id='content-menu-visible-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + span=12, ), - fac.AntdFormItem( - ApiRadioGroup( - dict_type='sys_normal_disable', - id='content-menu-status', - defaultValue=SysNormalDisableConstant.NORMAL, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='选择停用则路由将不会出现在侧边栏,也不能被访问', - ), - fac.AntdText('菜单状态'), - ] + fac.AntdCol( + fac.AntdFormItem( + ApiRadioGroup( + dict_type='sys_normal_disable', + id='content-menu-status', + defaultValue=SysNormalDisableConstant.NORMAL, + style={'width': '100%'}, + ), + label='菜单状态', + tooltip='选择停用则路由将不会出现在侧边栏,也不能被访问', + id='content-menu-status-form-item', ), - id='content-menu-status-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + span=12, ), ], - size='middle', + gutter=10, ), ] diff --git a/dash-fastapi-frontend/views/system/menu/components/menu_type.py b/dash-fastapi-frontend/views/system/menu/components/menu_type.py index da98e4f..d4ececd 100644 --- a/dash-fastapi-frontend/views/system/menu/components/menu_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/menu_type.py @@ -1,5 +1,4 @@ import feffery_antd_components as fac -from dash import html from callbacks.system_c.menu_c.components_c import menu_type_c # noqa: F401 from config.constant import ( MenuConstant, @@ -11,207 +10,171 @@ from components.ApiRadioGroup import ApiRadioGroup def render(): return [ - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdRadioGroup( - id='menu-menu-is_frame', - options=[ - {'label': '是', 'value': MenuConstant.YES_FRAME}, - {'label': '否', 'value': MenuConstant.NO_FRAME}, - ], - defaultValue=MenuConstant.NO_FRAME, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='选择是外链则路由地址需要以`http(s)://`开头', - ), - fac.AntdText('是否外链'), - ] - ), - id='menu-menu-is_frame-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdRadioGroup( + id='menu-menu-is_frame', + options=[ + { + 'label': '是', + 'value': MenuConstant.YES_FRAME, + }, + {'label': '否', 'value': MenuConstant.NO_FRAME}, + ], + defaultValue=MenuConstant.NO_FRAME, + style={'width': '100%'}, + ), + label='是否外链', + tooltip='选择是外链则路由地址需要以`http(s)://`开头', + id='menu-menu-is_frame-form-item', + ), + span=12, ), - fac.AntdFormItem( - fac.AntdInput( - id='menu-menu-path', - placeholder='请输入路由地址', - allowClear=True, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头', - ), - fac.AntdText('路由地址'), - ] - ), - required=True, - id='menu-menu-path-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='menu-menu-path', + placeholder='请输入路由地址', + allowClear=True, + style={'width': '100%'}, + ), + label='路由地址', + tooltip='访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头', + required=True, + id='menu-menu-path-form-item', + ), + span=12, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdInput( - id='menu-menu-component', - placeholder='请输入组件路径', - allowClear=True, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='访问的组件路径,如:`system.user.index`,默认在`views`目录下', - ), - fac.AntdText('组件路径'), - ] - ), - id='menu-menu-component-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='menu-menu-route_name', + placeholder='请输入路由名称', + allowClear=True, + style={'width': '100%'}, + ), + label='路由名称', + tooltip='默认不填则和路由地址相同:如地址为:`user`,则名称为`User`(注意:因为router会删除名称相同路由,为避免名字的冲突,特殊情况下请自定义,保证唯一性)', + required=True, + id='menu-menu-route_name-form-item', + ), + span=12, ), - fac.AntdFormItem( - fac.AntdInput( - id='menu-menu-perms', - placeholder='请输入权限字符', - allowClear=True, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='控制器中定义的权限字符,如:system:user:list', - ), - fac.AntdText('权限字符'), - ] - ), - id='menu-menu-perms-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='menu-menu-component', + placeholder='请输入组件路径', + allowClear=True, + style={'width': '100%'}, + ), + label='组件路径', + tooltip='访问的组件路径,如:`system.user.index`,默认在`views`目录下', + id='menu-menu-component-form-item', + ), + span=12, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - fac.AntdInput( - id='menu-menu-query', - placeholder='请输入路由参数', - allowClear=True, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`', - ), - fac.AntdText('路由参数'), - ] - ), - id='menu-menu-query-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='menu-menu-perms', + placeholder='请输入权限字符', + allowClear=True, + style={'width': '100%'}, + ), + label='权限字符', + tooltip='控制器中定义的权限字符,如:system:user:list', + id='menu-menu-perms-form-item', + ), + span=12, ), - fac.AntdFormItem( - fac.AntdRadioGroup( - id='menu-menu-is_cache', - options=[ - {'label': '缓存', 'value': MenuConstant.YES_CACHE}, - {'label': '不缓存', 'value': MenuConstant.NO_CACHE}, - ], - defaultValue=MenuConstant.YES_CACHE, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致', - ), - fac.AntdText('是否缓存'), - ] - ), - id='menu-menu-is_cache-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdInput( + id='menu-menu-query', + placeholder='请输入路由参数', + allowClear=True, + style={'width': '100%'}, + ), + label='路由参数', + tooltip='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`', + id='menu-menu-query-form-item', + ), + span=12, ), ], - size='middle', + gutter=10, ), - fac.AntdSpace( + fac.AntdRow( [ - fac.AntdFormItem( - ApiRadioGroup( - dict_type='sys_show_hide', - id='menu-menu-visible', - defaultValue=SysShowHideConstant.SHOW, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问', - ), - fac.AntdText('显示状态'), - ] - ), - id='menu-menu-visible-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + fac.AntdRadioGroup( + id='menu-menu-is_cache', + options=[ + { + 'label': '缓存', + 'value': MenuConstant.YES_CACHE, + }, + { + 'label': '不缓存', + 'value': MenuConstant.NO_CACHE, + }, + ], + defaultValue=MenuConstant.YES_CACHE, + style={'width': '100%'}, + ), + label='是否缓存', + id='menu-menu-is_cache-form-item', + ), + span=12, ), - fac.AntdFormItem( - ApiRadioGroup( - dict_type='sys_normal_disable', - id='menu-menu-status', - defaultValue=SysNormalDisableConstant.NORMAL, - style={'width': 200}, - ), - label=html.Div( - [ - fac.AntdTooltip( - fac.AntdIcon(icon='antd-question-circle'), - title='选择停用则路由将不会出现在侧边栏,也不能被访问', - ), - fac.AntdText('菜单状态'), - ] - ), - id='menu-menu-status-form-item', - labelCol={ - 'span': 8, - }, - wrapperCol={'span': 16}, + fac.AntdCol( + fac.AntdFormItem( + ApiRadioGroup( + dict_type='sys_show_hide', + id='menu-menu-visible', + defaultValue=SysShowHideConstant.SHOW, + style={'width': '100%'}, + ), + label='显示状态', + tooltip='选择隐藏则路由将不会出现在侧边栏,但仍然可以访问', + id='menu-menu-visible-form-item', + ), + span=12, + ), + ], + gutter=10, + ), + fac.AntdRow( + [ + fac.AntdCol( + fac.AntdFormItem( + ApiRadioGroup( + dict_type='sys_normal_disable', + id='menu-menu-status', + defaultValue=SysNormalDisableConstant.NORMAL, + style={'width': '100%'}, + ), + label='菜单状态', + tooltip='选择停用则路由将不会出现在侧边栏,也不能被访问', + id='menu-menu-status-form-item', + ), + span=12, ), ], - size='middle', + gutter=10, ), ] -- Gitee From 3e2ded4d5c903b3431a404e508659bacf02a3d77 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 15:57:27 +0800 Subject: [PATCH 205/229] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/system/menu/components/button_type.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dash-fastapi-frontend/views/system/menu/components/button_type.py b/dash-fastapi-frontend/views/system/menu/components/button_type.py index 56265ba..028064d 100644 --- a/dash-fastapi-frontend/views/system/menu/components/button_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/button_type.py @@ -1,5 +1,4 @@ import feffery_antd_components as fac -from dash import html from callbacks.system_c.menu_c.components_c import button_type_c # noqa: F401 -- Gitee From c0c8833e1c3f693c4a2c15b3be398e228e60f692 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 15:58:48 +0800 Subject: [PATCH 206/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=85=AC=E5=91=8Amodal=E8=A1=A8=E5=8D=95=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/system/notice/__init__.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index 559d34a..c3b039b 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -337,8 +337,6 @@ def render(*args, **kwargs): id='notice-notice_title-form-item', required=True, label='公告标题', - labelCol={'span': 6}, - wrapperCol={'span': 18}, ), span=12, ), @@ -352,8 +350,6 @@ def render(*args, **kwargs): id='notice-notice_type-form-item', required=True, label='公告类型', - labelCol={'span': 6}, - wrapperCol={'span': 18}, ), span=12, ), @@ -444,6 +440,8 @@ def render(*args, **kwargs): gutter=5, ), ], + labelCol={'span': 6}, + wrapperCol={'span': 18}, style={'marginRight': '30px'}, ) ], -- Gitee From fcd418d7b2c5bfb117e0d4a5b5cdfc376bad1b8b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 16:16:51 +0800 Subject: [PATCH 207/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ManuallyUpload/__init__.py | 100 ++++++++++-------- .../views/system/user/__init__.py | 4 +- 2 files changed, 58 insertions(+), 46 deletions(-) diff --git a/dash-fastapi-frontend/components/ManuallyUpload/__init__.py b/dash-fastapi-frontend/components/ManuallyUpload/__init__.py index 2337fbc..69b1eee 100644 --- a/dash-fastapi-frontend/components/ManuallyUpload/__init__.py +++ b/dash-fastapi-frontend/components/ManuallyUpload/__init__.py @@ -1,54 +1,64 @@ -from dash import dcc, html import feffery_antd_components as fac -import feffery_utils_components as fuc - +from dash import dcc, html +from feffery_utils_components import FefferyShadowDom, FefferyStyle +from typing import Dict, Optional, Union +from uuid import uuid4 -class ManuallyUpload: - def __init__(self): - pass - def render(self): - return fuc.FefferyShadowDom( - [ - dcc.Upload( - html.Div( - html.Span( - html.Div( - html.Span( - html.Div( - [ - html.P( - fac.AntdIcon( - icon='antd-cloud-upload', - ), - className='ant-upload-drag-icon', +class ManuallyUpload(FefferyShadowDom): + def __init__( + self, + id: Optional[Union[str, Dict]] = str(uuid4()), + accept: Optional[str] = None, + disabled: Optional[bool] = False, + max_size: Optional[Union[float, int]] = -1, + min_size: Optional[Union[float, int]] = 0, + multiple: Optional[bool] = False, + ): + children = [ + dcc.Upload( + html.Div( + html.Span( + html.Div( + html.Span( + html.Div( + [ + html.P( + fac.AntdIcon( + icon='antd-cloud-upload', ), - html.P( - '用户导入', - className='ant-upload-text', - ), - html.P( - '点击或拖拽文件至此处进行上传', - className='ant-upload-hint', - ), - ], - className='ant-upload-drag-container', - ), - tabIndex='0', - role='button', - className='ant-upload ant-upload-btn', + className='ant-upload-drag-icon', + ), + html.P( + '用户导入', + className='ant-upload-text', + ), + html.P( + '点击或拖拽文件至此处进行上传', + className='ant-upload-hint', + ), + ], + className='ant-upload-drag-container', ), - className='ant-upload ant-upload-drag', + tabIndex='0', + role='button', + className='ant-upload ant-upload-btn', ), - className='ant-upload-wrapper', + className='ant-upload ant-upload-drag', ), - className='ant-droag-upload-container', + className='ant-upload-wrapper', ), - id='user-upload-choose', - accept='.xls,.xlsx', + className='ant-droag-upload-container', ), - fuc.FefferyStyle( - rawStyle=""" + id=id, + accept=accept, + disabled=disabled, + max_size=max_size, + min_size=min_size, + multiple=multiple, + ), + FefferyStyle( + rawStyle=""" .ant-droag-upload-container { border: 1px solid transparent; transition: border 0.3s; @@ -111,6 +121,6 @@ class ManuallyUpload: box-sizing: border-box; } """ - ), - ] - ) + ), + ] + super().__init__(children=children) diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 864852f..2f92d1c 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -667,7 +667,9 @@ def render(*args, **kwargs): [ html.Div( [ - ManuallyUpload().render(), + ManuallyUpload( + id='user-upload-choose', accept='.xls,.xlsx' + ), ], style={'marginTop': '10px'}, ), -- Gitee From af4a070a9946da78653a071f29c9df40edebe468 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 16:17:38 +0800 Subject: [PATCH 208/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95=E8=AF=B7=E6=B1=82?= =?UTF-8?q?ip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/annotation/log_annotation.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/annotation/log_annotation.py b/dash-fastapi-backend/module_admin/annotation/log_annotation.py index c58bacc..1b36c86 100644 --- a/dash-fastapi-backend/module_admin/annotation/log_annotation.py +++ b/dash-fastapi-backend/module_admin/annotation/log_annotation.py @@ -68,7 +68,11 @@ class Log: # 获取请求的url oper_url = request.url.path # 获取请求的ip及ip归属区域 - oper_ip = request.headers.get('X-Forwarded-For') + oper_ip = ( + request.headers.get('remote_addr') + if request.headers.get('is_browser') == 'no' + else request.headers.get('X-Forwarded-For') + ) oper_location = '内网IP' if AppConfig.app_ip_location_query: oper_location = get_ip_location(oper_ip) -- Gitee From da3278190312649918f5cb514eb4863738497ce2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 17:03:20 +0800 Subject: [PATCH 209/229] =?UTF-8?q?perf:=20=E8=B7=AF=E7=94=B1=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E4=BF=AE=E6=94=B9=E4=B8=BA=E9=9D=9E=E5=BF=85=E5=A1=AB?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/system/menu/components/menu_type.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dash-fastapi-frontend/views/system/menu/components/menu_type.py b/dash-fastapi-frontend/views/system/menu/components/menu_type.py index d4ececd..52a04f8 100644 --- a/dash-fastapi-frontend/views/system/menu/components/menu_type.py +++ b/dash-fastapi-frontend/views/system/menu/components/menu_type.py @@ -62,7 +62,6 @@ def render(): ), label='路由名称', tooltip='默认不填则和路由地址相同:如地址为:`user`,则名称为`User`(注意:因为router会删除名称相同路由,为避免名字的冲突,特殊情况下请自定义,保证唯一性)', - required=True, id='menu-menu-route_name-form-item', ), span=12, -- Gitee From 4bef9407548ad4a7cfee5cf0543ad511f2fc20b8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 17:05:03 +0800 Subject: [PATCH 210/229] =?UTF-8?q?feat:=20=E5=BF=AB=E6=8D=B7=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E9=9D=A2=E6=9D=BF=E6=96=B0=E5=A2=9E=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/router_util.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dash-fastapi-frontend/utils/router_util.py b/dash-fastapi-frontend/utils/router_util.py index 1cdf703..08f2a9e 100644 --- a/dash-fastapi-frontend/utils/router_util.py +++ b/dash-fastapi-frontend/utils/router_util.py @@ -113,19 +113,26 @@ class RouterUtil: return new_router_list @classmethod - def generate_search_panel_data(cls, menu_list: List): + def generate_search_panel_data( + cls, menu_list: List, section_path: List = [] + ): """ 生成搜索面板数据 :param menu_list: 菜单列表 + :param section_path: 分组路径 :return: 搜索面板数据 """ search_panel_data = [] for item in menu_list: if item.get('children'): + section_path.append(item.get('props').get('title')) search_panel_data.extend( - cls.generate_search_panel_data(item.get('children')) + cls.generate_search_panel_data( + item.get('children'), section_path + ) ) + section_path.pop() else: href = item.get('props').get('href') target = ( @@ -136,6 +143,7 @@ class RouterUtil: item_dict = dict( id=item.get('props').get('key'), title=item.get('props').get('title'), + section='/'.join(section_path), handler=f'() => window.open("{href}", "{target}")', ) search_panel_data.append(item_dict) -- Gitee From 4107a6a8dfac4c3087678673725c41baabb7d9f8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 21:51:44 +0800 Subject: [PATCH 211/229] =?UTF-8?q?perf:=20=E4=BE=A7=E8=BE=B9=E6=A0=8F?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=8F=8A=E9=A1=B5=E9=A6=96=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/layout_c/fold_side_menu.py | 88 +++++++++++++++++-- .../views/layout/__init__.py | 10 +-- .../views/layout/components/aside.py | 4 +- .../views/layout/components/head.py | 16 +++- 4 files changed, 100 insertions(+), 18 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py b/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py index 95929ac..e35a3b7 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py +++ b/dash-fastapi-frontend/callbacks/layout_c/fold_side_menu.py @@ -5,25 +5,95 @@ from server import app # 侧边栏折叠回调 app.clientside_callback( """ - (nClicks, collapsed) => { + (nClicks, collapsed, responsive) => { if (nClicks) { return [ - collapsed ? {'width': 210} : {'width': 60}, + collapsed ? {width: 256} : (!responsive?.sm ? {display: 'none'} : {width: 64}), !collapsed, - collapsed ? {'fontSize': '22px', 'color': 'rgb(255, 255, 255)'} : {'display': 'none'}, + collapsed ? {fontSize: '22px', color: 'rgb(255, 255, 255)'} : {display: 'none'}, collapsed ? 'antd-menu-fold' : 'antd-menu-unfold', ]; } - return window.dash_clientside.no_update; + throw window.dash_clientside.PreventUpdate; } """, [ - Output('left-side-menu-container', 'style'), - Output('menu-collapse-sider-custom', 'collapsed'), - Output('logo-text', 'style'), - Output('fold-side-menu-icon', 'icon'), + Output('left-side-menu-container', 'style', allow_duplicate=True), + Output('menu-collapse-sider-custom', 'collapsed', allow_duplicate=True), + Output('logo-text', 'style', allow_duplicate=True), + Output('fold-side-menu-icon', 'icon', allow_duplicate=True), ], Input('fold-side-menu', 'nClicks'), - State('menu-collapse-sider-custom', 'collapsed'), + [ + State('menu-collapse-sider-custom', 'collapsed'), + State('responsive-layout-container', 'responsive'), + ], + prevent_initial_call=True, +) + + +# 页面响应式监听自动折叠侧边栏 +app.clientside_callback( + """ + (responsive) => { + if (!responsive?.sm) { + return [ + {display: 'none'}, + true, + {display: 'none'}, + 'antd-menu-unfold', + {display: 'none'}, + {display: 'none'}, + {display: 'none'}, + '6', + 'none', + 'none', + 'none', + ]; + } else if (!responsive?.lg) { + return [ + {width: 64}, + true, + {display: 'none'}, + 'antd-menu-unfold', + {display: 'none'}, + {display: 'none'}, + {display: 'none'}, + '12', + 'none', + 'none', + 'none', + ]; + } else { + return [ + {width: 256}, + false, + {fontSize: '22px', color: 'rgb(255, 255, 255)'}, + 'antd-menu-fold', + {}, + {}, + {}, + '1', + '21', + '6', + '3', + ]; + } + } + """, + [ + Output('left-side-menu-container', 'style', allow_duplicate=True), + Output('menu-collapse-sider-custom', 'collapsed', allow_duplicate=True), + Output('logo-text', 'style', allow_duplicate=True), + Output('fold-side-menu-icon', 'icon', allow_duplicate=True), + Output('header-breadcrumb-col', 'style'), + Output('header-search-col', 'style'), + Output('header-gitee-col', 'style'), + Output('fold-side-menu-col', 'flex'), + Output('header-breadcrumb-col', 'flex'), + Output('header-search-col', 'flex'), + Output('header-gitee-col', 'flex'), + ], + Input('responsive-layout-container', 'responsive'), prevent_initial_call=True, ) diff --git a/dash-fastapi-frontend/views/layout/__init__.py b/dash-fastapi-frontend/views/layout/__init__.py index b5e2b61..7975eeb 100644 --- a/dash-fastapi-frontend/views/layout/__init__.py +++ b/dash-fastapi-frontend/views/layout/__init__.py @@ -14,7 +14,8 @@ def render(menu_info): [ # 全局重载 fuc.FefferyReload(id='trigger-reload-output'), - html.Div(id='idle-placeholder-container'), + # 响应式监听组件 + fuc.FefferyResponsive(id='responsive-layout-container'), # 布局设置抽屉 fac.AntdDrawer( [ @@ -100,9 +101,7 @@ def render(menu_info): ), ), id='left-side-menu-container', - # style={ - # 'flex': '1' - # } + flex='none', ), # 右侧区域 fac.AntdCol( @@ -121,7 +120,8 @@ def render(menu_info): ), fac.AntdRow(render_main_content(), wrap=False), ], - style={'flex': '6', 'width': '300px'}, + flex='auto', + style={'width': 0}, ), ], ), diff --git a/dash-fastapi-frontend/views/layout/components/aside.py b/dash-fastapi-frontend/views/layout/components/aside.py index c48c6a9..1c4a0d1 100644 --- a/dash-fastapi-frontend/views/layout/components/aside.py +++ b/dash-fastapi-frontend/views/layout/components/aside.py @@ -64,8 +64,8 @@ def render_aside_content(menu_info): ], id='menu-collapse-sider-custom', collapsible=True, - collapsedWidth=60, + collapsedWidth=64, trigger=None, - width=210, + width=256, ), ] diff --git a/dash-fastapi-frontend/views/layout/components/head.py b/dash-fastapi-frontend/views/layout/components/head.py index 71dd0b2..29613a6 100644 --- a/dash-fastapi-frontend/views/layout/components/head.py +++ b/dash-fastapi-frontend/views/layout/components/head.py @@ -26,6 +26,7 @@ def render_head_content(): 'alignItems': 'center', }, ), + id='fold-side-menu-col', flex='1', ), # 页首面包屑区域 @@ -35,8 +36,13 @@ def render_head_content(): {'title': '首页', 'icon': 'antd-dashboard', 'href': '/#'} ], id='header-breadcrumb', + style={ + 'height': '100%', + 'display': 'flex', + 'alignItems': 'center', + }, ), - style={'height': '100%', 'display': 'flex', 'alignItems': 'center'}, + id='header-breadcrumb-col', flex='21', ), # 页首中部搜索区域 @@ -57,6 +63,7 @@ def render_head_content(): 'alignItems': 'center', }, ), + id='header-search-col', flex='6', ), # 页首开源项目地址 @@ -67,8 +74,13 @@ def render_head_content(): ), href='https://gitee.com/insistence2022/dash-fastapi-admin', target='_blank', + style={ + 'height': '100%', + 'display': 'flex', + 'alignItems': 'center', + }, ), - style={'height': '100%', 'display': 'flex', 'alignItems': 'center'}, + id='header-gitee-col', flex='3', ), # 页首右侧用户信息区域 -- Gitee From 873aa28944ab7a2db5553b694f31d0f473da06d8 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 22:53:11 +0800 Subject: [PATCH 212/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E8=AF=A6=E6=83=85=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/monitor/job/__init__.py | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index 2438237..ac8185b 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -661,13 +661,13 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'job_name', }, - labelCol={'span': 3}, - wrapperCol={'span': 21}, + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), span=24, ), ], - gutter=5, + gutter=10, ), fac.AntdRow( [ @@ -685,8 +685,6 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'job_group', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), @@ -704,13 +702,11 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'job_executor', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), ], - gutter=5, + gutter=10, ), fac.AntdRow( [ @@ -728,13 +724,13 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'invoke_target', }, - labelCol={'span': 3}, - wrapperCol={'span': 21}, + labelCol={'span': 4}, + wrapperCol={'span': 20}, ), span=24, ), ], - gutter=5, + gutter=10, ), fac.AntdRow( [ @@ -752,8 +748,6 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'job_args', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), @@ -771,13 +765,11 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'job_kwargs', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), ], - gutter=5, + gutter=10, ), fac.AntdRow( [ @@ -801,6 +793,7 @@ def render(*args, **kwargs): span=24, ), ], + gutter=10, ), fac.AntdRow( [ @@ -818,8 +811,6 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'misfire_policy', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), @@ -837,13 +828,11 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'concurrent', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), ], - gutter=5, + gutter=10, ), fac.AntdRow( [ @@ -861,8 +850,6 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'status', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), @@ -880,12 +867,11 @@ def render(*args, **kwargs): 'type': 'job_detail-form-label', 'index': 'create_time', }, - labelCol={'span': 8}, - wrapperCol={'span': 16}, ), span=12, ), ], + gutter=10, ), ], labelCol={'span': 8}, -- Gitee From 340415af57a9cd9615fbd019d18d68712c57b9d2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 22:53:26 +0800 Subject: [PATCH 213/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96TTL=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/cache_util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/utils/cache_util.py b/dash-fastapi-frontend/utils/cache_util.py index 86768a3..94bbb60 100644 --- a/dash-fastapi-frontend/utils/cache_util.py +++ b/dash-fastapi-frontend/utils/cache_util.py @@ -91,4 +91,5 @@ class TTLCacheManager: """ target_key_list = target_keys.split(',') for target_key in target_key_list: - del ttl_manager[target_key] + if ttl_manager.get(target_key) is not None: + del ttl_manager[target_key] -- Gitee From 0ea9fcc34f4c6924cacb2375cf755e7d1f069b9d Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 22:53:53 +0800 Subject: [PATCH 214/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/api/system/user.py | 2 +- .../callbacks/system_c/user_c/user_c.py | 25 +++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/dash-fastapi-frontend/api/system/user.py b/dash-fastapi-frontend/api/system/user.py index e005bf5..c355645 100644 --- a/dash-fastapi-frontend/api/system/user.py +++ b/dash-fastapi-frontend/api/system/user.py @@ -188,7 +188,7 @@ class UserApi: return api_request( url='/system/user/profile/updatePwd', method=ApiMethod.PUT, - json=dict(old_password=old_password, new_password=new_password), + params=dict(old_password=old_password, new_password=new_password), ) @classmethod diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index d76eb31..bd88c75 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -461,13 +461,13 @@ def user_confirm(confirm_trigger, modal_type, form_value, form_label): ): params_add = form_value params_add['post_ids'] = ( - [int(item) for item in params_add['post_ids']] - if params_add['post_ids'] + [int(item) for item in params_add.get('post_ids')] + if params_add.get('post_ids') else [] ) params_add['role_ids'] = ( - [int(item) for item in params_add['role_ids']] - if params_add['role_ids'] + [int(item) for item in params_add.get('role_ids')] + if params_add.get('role_ids') else [] ) params_edit = params_add.copy() @@ -756,7 +756,7 @@ app.clientside_callback( } """, [ - Output('user-import-confirm-modal', 'visible'), + Output('user-import-confirm-modal', 'visible', allow_duplicate=True), Output('user-upload-choose', 'contents'), Output('user-import-update-check', 'checked'), ], @@ -767,7 +767,10 @@ app.clientside_callback( @app.callback( output=dict( - modal_visible=Output('batch-result-modal', 'visible'), + result_modal_visible=Output('batch-result-modal', 'visible'), + import_modal_visible=Output( + 'user-import-confirm-modal', 'visible', allow_duplicate=True + ), batch_result=Output('batch-result-content', 'children'), operations=Output( 'user-operations-store', 'data', allow_duplicate=True @@ -799,7 +802,12 @@ def user_import_confirm(import_confirm, contents, is_update): MessageManager.success(content='导入成功') return dict( - modal_visible=True if batch_import_result.get('msg') else False, + result_modal_visible=True + if batch_import_result.get('msg') + else False, + import_modal_visible=True + if batch_import_result.get('msg') + else False, batch_result=batch_import_result.get('msg'), operations={'type': 'batch-import'}, ) @@ -807,7 +815,8 @@ def user_import_confirm(import_confirm, contents, is_update): MessageManager.warning(content='请上传需要导入的文件') return dict( - modal_visible=no_update, + result_modal_visible=no_update, + import_modal_visible=True, batch_result=no_update, operations=no_update, ) -- Gitee From e996afabe018c40b53fb0e89f930ddbfa07e12f9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 22:54:06 +0800 Subject: [PATCH 215/229] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/sql/dash-fastapi.sql | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/dash-fastapi-backend/sql/dash-fastapi.sql b/dash-fastapi-backend/sql/dash-fastapi.sql index 6fb0ee0..29ec097 100644 --- a/dash-fastapi-backend/sql/dash-fastapi.sql +++ b/dash-fastapi-backend/sql/dash-fastapi.sql @@ -505,11 +505,11 @@ insert into sys_dict_data values(6, 1, '正常', '0', 'sys_norma insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); -insert into sys_dict_data values(10, 1, '默认', 'default', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组'); -insert into sys_dict_data values(11, 2, '数据库', 'sqlalchemy', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '数据库分组'); -insert into sys_dict_data values(12, 3, 'redis', 'redis', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, 'reids分组'); -insert into sys_dict_data values(13, 1, '默认', 'default', 'sys_job_executor', '', '', 'N', '0', 'admin', sysdate(), '', null, '线程池'); -insert into sys_dict_data values(14, 2, '进程池', 'processpool', 'sys_job_executor', '', '', 'N', '0', 'admin', sysdate(), '', null, '进程池'); +insert into sys_dict_data values(10, 1, '默认', 'default', 'sys_job_group', '', 'default', 'Y', '0', 'admin', sysdate(), '', null, '默认分组'); +insert into sys_dict_data values(11, 2, '数据库', 'sqlalchemy', 'sys_job_group', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '数据库分组'); +insert into sys_dict_data values(12, 3, 'redis', 'redis', 'sys_job_group', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, 'reids分组'); +insert into sys_dict_data values(13, 1, '默认', 'default', 'sys_job_executor', '', 'default', 'N', '0', 'admin', sysdate(), '', null, '线程池'); +insert into sys_dict_data values(14, 2, '进程池', 'processpool', 'sys_job_executor', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '进程池'); insert into sys_dict_data values(15, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是'); insert into sys_dict_data values(16, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否'); insert into sys_dict_data values(17, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知'); @@ -553,7 +553,8 @@ insert into sys_config values(2, '用户管理-账号初始密码', 'sys insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)'); insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)'); -insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); +insert into sys_config values(6, '账号自助-是否开启忘记密码功能', 'sys.account.forgetUser', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启忘记密码功能(true开启,false关闭)'); +insert into sys_config values(7, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); -- ---------------------------- -- Gitee From 39356ddd72bd24f64f62c723afda95a50bd36e43 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 22:54:36 +0800 Subject: [PATCH 216/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97=E5=AF=BC=E5=87=BA=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callbacks/monitor_c/logininfor_c.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py index 63a1811..d68420b 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/logininfor_c.py @@ -290,10 +290,10 @@ def export_login_log_list( """ if export_click: begin_time = None - end_time = None - if login_time_range: - begin_time = login_time_range[0] - end_time = login_time_range[1] + end_time = None + if login_time_range: + begin_time = login_time_range[0] + end_time = login_time_range[1] export_params = dict( ipaddr=ipaddr, user_name=user_name, @@ -348,7 +348,7 @@ def unlock_user(unlock_click, selected_rows): user_name = selected_rows[0].get('user_name') LogininforApi.unlock_logininfor(user_name=user_name) MessageManager.success(content='解锁成功') - + return no_update - + raise PreventUpdate -- Gitee From 24c1fffcb4f5a6ec9837364b4d68dd99ad0ff100 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 23:06:46 +0800 Subject: [PATCH 217/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=90=84?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E8=A1=A8=E6=A0=BC=E6=93=8D=E4=BD=9C=E6=A0=8F?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/monitor/job/__init__.py | 1 + dash-fastapi-frontend/views/monitor/job/job_log.py | 1 + dash-fastapi-frontend/views/monitor/online/__init__.py | 1 + dash-fastapi-frontend/views/monitor/operlog/__init__.py | 1 + dash-fastapi-frontend/views/system/config/__init__.py | 1 + dash-fastapi-frontend/views/system/dept/__init__.py | 1 + dash-fastapi-frontend/views/system/dict/__init__.py | 1 + dash-fastapi-frontend/views/system/notice/__init__.py | 1 + dash-fastapi-frontend/views/system/post/__init__.py | 1 + dash-fastapi-frontend/views/system/role/__init__.py | 1 + dash-fastapi-frontend/views/system/user/__init__.py | 9 ++------- 11 files changed, 12 insertions(+), 7 deletions(-) diff --git a/dash-fastapi-frontend/views/monitor/job/__init__.py b/dash-fastapi-frontend/views/monitor/job/__init__.py index ac8185b..ff8ac38 100644 --- a/dash-fastapi-frontend/views/monitor/job/__init__.py +++ b/dash-fastapi-frontend/views/monitor/job/__init__.py @@ -320,6 +320,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 120, 'renderOptions': { 'renderType': 'dropdown', 'dropdownProps': { diff --git a/dash-fastapi-frontend/views/monitor/job/job_log.py b/dash-fastapi-frontend/views/monitor/job/job_log.py index 98d55f7..0d20408 100644 --- a/dash-fastapi-frontend/views/monitor/job/job_log.py +++ b/dash-fastapi-frontend/views/monitor/job/job_log.py @@ -296,6 +296,7 @@ def render(): { 'title': '操作', 'dataIndex': 'operation', + 'width': 120, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/monitor/online/__init__.py b/dash-fastapi-frontend/views/monitor/online/__init__.py index ae416ef..4c92487 100644 --- a/dash-fastapi-frontend/views/monitor/online/__init__.py +++ b/dash-fastapi-frontend/views/monitor/online/__init__.py @@ -228,6 +228,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 120, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/monitor/operlog/__init__.py b/dash-fastapi-frontend/views/monitor/operlog/__init__.py index 8755708..098fa08 100644 --- a/dash-fastapi-frontend/views/monitor/operlog/__init__.py +++ b/dash-fastapi-frontend/views/monitor/operlog/__init__.py @@ -325,6 +325,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 120, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/system/config/__init__.py b/dash-fastapi-frontend/views/system/config/__init__.py index 03666d5..484b9f3 100644 --- a/dash-fastapi-frontend/views/system/config/__init__.py +++ b/dash-fastapi-frontend/views/system/config/__init__.py @@ -341,6 +341,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 170, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/system/dept/__init__.py b/dash-fastapi-frontend/views/system/dept/__init__.py index 5dc4fbe..f499d2c 100644 --- a/dash-fastapi-frontend/views/system/dept/__init__.py +++ b/dash-fastapi-frontend/views/system/dept/__init__.py @@ -227,6 +227,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 240, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/system/dict/__init__.py b/dash-fastapi-frontend/views/system/dict/__init__.py index f05591b..6ba8f60 100644 --- a/dash-fastapi-frontend/views/system/dict/__init__.py +++ b/dash-fastapi-frontend/views/system/dict/__init__.py @@ -338,6 +338,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 170, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index c3b039b..fc3c6a2 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -295,6 +295,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 170, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/system/post/__init__.py b/dash-fastapi-frontend/views/system/post/__init__.py index f917871..bbd8deb 100644 --- a/dash-fastapi-frontend/views/system/post/__init__.py +++ b/dash-fastapi-frontend/views/system/post/__init__.py @@ -297,6 +297,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 170, 'renderOptions': { 'renderType': 'button' }, diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index 1581d5b..a928c58 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -311,6 +311,7 @@ def render(*args, **kwargs): { 'dataIndex': 'status', 'title': '状态', + 'width': 100, 'renderOptions': { 'renderType': 'switch' }, diff --git a/dash-fastapi-frontend/views/system/user/__init__.py b/dash-fastapi-frontend/views/system/user/__init__.py index 2f92d1c..9280262 100644 --- a/dash-fastapi-frontend/views/system/user/__init__.py +++ b/dash-fastapi-frontend/views/system/user/__init__.py @@ -312,7 +312,6 @@ def render(*args, **kwargs): { 'dataIndex': 'user_id', 'title': '用户编号', - 'width': 100, 'renderOptions': { 'renderType': 'ellipsis' }, @@ -320,7 +319,6 @@ def render(*args, **kwargs): { 'dataIndex': 'user_name', 'title': '用户名称', - 'width': 120, 'renderOptions': { 'renderType': 'ellipsis' }, @@ -328,7 +326,6 @@ def render(*args, **kwargs): { 'dataIndex': 'nick_name', 'title': '用户昵称', - 'width': 120, 'renderOptions': { 'renderType': 'ellipsis' }, @@ -336,7 +333,6 @@ def render(*args, **kwargs): { 'dataIndex': 'dept_name', 'title': '部门', - 'width': 130, 'renderOptions': { 'renderType': 'ellipsis' }, @@ -344,7 +340,6 @@ def render(*args, **kwargs): { 'dataIndex': 'phonenumber', 'title': '手机号码', - 'width': 130, 'renderOptions': { 'renderType': 'ellipsis' }, @@ -352,7 +347,7 @@ def render(*args, **kwargs): { 'dataIndex': 'status', 'title': '状态', - 'width': 110, + 'width': 100, 'renderOptions': { 'renderType': 'switch' }, @@ -360,7 +355,6 @@ def render(*args, **kwargs): { 'dataIndex': 'create_time', 'title': '创建时间', - 'width': 160, 'renderOptions': { 'renderType': 'ellipsis' }, @@ -368,6 +362,7 @@ def render(*args, **kwargs): { 'title': '操作', 'dataIndex': 'operation', + 'width': 120, 'renderOptions': { 'renderType': 'dropdown', 'dropdownProps': { -- Gitee From 6154a307bda49e949dae26115051e8700dc24321 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 23:13:41 +0800 Subject: [PATCH 218/229] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/config/router.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dash-fastapi-frontend/config/router.py b/dash-fastapi-frontend/config/router.py index f4df053..9a8b58b 100644 --- a/dash-fastapi-frontend/config/router.py +++ b/dash-fastapi-frontend/config/router.py @@ -1,6 +1,9 @@ class RouterConfig: """ 路由配置 + + WHITE_ROUTES_LIST: 白名单路由列表 + CONSTANT_ROUTES: 公共路由列表 """ WHITE_ROUTES_LIST = [ @@ -61,12 +64,19 @@ class RouterConfig: 'hidden': True, 'name': 'UserProfile', 'redirect': 'noredirect', + 'meta': { + 'title': '系统设置', + 'icon': 'antd-trophy', + }, 'children': [ { 'path': 'profile', 'component': 'system.user.profile', 'name': 'Profile', - 'meta': {'title': '个人资料'}, + 'meta': { + 'title': '个人资料', + 'icon': 'antd-idcard', + }, } ], }, -- Gitee From 6a484be4fcc8dc69026fb0438feb00e2d8d1177d Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 29 Sep 2024 23:21:52 +0800 Subject: [PATCH 219/229] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/.env.dev | 2 +- dash-fastapi-frontend/.env.prod | 2 +- dash-fastapi-frontend/config/env.py | 2 +- dash-fastapi-frontend/views/layout/components/aside.py | 7 ++++--- dash-fastapi-frontend/views/login.py | 5 +++-- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/dash-fastapi-frontend/.env.dev b/dash-fastapi-frontend/.env.dev index 6f36848..49e2ca1 100644 --- a/dash-fastapi-frontend/.env.dev +++ b/dash-fastapi-frontend/.env.dev @@ -2,7 +2,7 @@ # 应用运行环境 APP_ENV = 'dev' # 应用名称 -APP_NAME = '通用后台管理系统' +APP_NAME = 'DF Admin' # 应用请求后端url APP_BASE_URL = 'http://127.0.0.1:9099' # 后端是否使用代理模式 diff --git a/dash-fastapi-frontend/.env.prod b/dash-fastapi-frontend/.env.prod index 72685a3..cf335b6 100644 --- a/dash-fastapi-frontend/.env.prod +++ b/dash-fastapi-frontend/.env.prod @@ -2,7 +2,7 @@ # 应用运行环境 APP_ENV = 'prod' # 应用名称 -APP_NAME = '通用后台管理系统' +APP_NAME = 'DF Admin' # 应用请求后端url APP_BASE_URL = 'http://127.0.0.1:9099' # 后端是否使用代理模式 diff --git a/dash-fastapi-frontend/config/env.py b/dash-fastapi-frontend/config/env.py index f1e0300..35afb6e 100644 --- a/dash-fastapi-frontend/config/env.py +++ b/dash-fastapi-frontend/config/env.py @@ -11,7 +11,7 @@ class AppSettings(BaseSettings): """ app_env: str = 'dev' - app_name: str = '通用后台管理系统' + app_name: str = 'DF Admin' app_base_url: str = 'http://127.0.0.1:9099' app_proxy_path: str = '/dev-api' app_is_proxy: bool = False diff --git a/dash-fastapi-frontend/views/layout/components/aside.py b/dash-fastapi-frontend/views/layout/components/aside.py index 1c4a0d1..4b01c9f 100644 --- a/dash-fastapi-frontend/views/layout/components/aside.py +++ b/dash-fastapi-frontend/views/layout/components/aside.py @@ -1,6 +1,7 @@ import feffery_antd_components as fac from dash import dcc, get_asset_url from callbacks.layout_c import aside_c # noqa: F401 +from config.env import AppConfig def render_aside_content(menu_info): @@ -28,11 +29,10 @@ def render_aside_content(menu_info): ), fac.AntdCol( fac.AntdText( - '后台管理系统', + AppConfig.app_name, id='logo-text', style={ 'fontSize': '22px', - # 'paddingLeft': '20px', 'color': 'rgb(255, 255, 255)', }, ), @@ -41,6 +41,7 @@ def render_aside_content(menu_info): 'height': '100%', 'display': 'flex', 'alignItems': 'center', + 'marginLeft': '25px', }, ), ], @@ -50,7 +51,7 @@ def render_aside_content(menu_info): 'position': 'sticky', 'top': 0, 'zIndex': 999, - 'paddingLeft': '10px', + 'paddingLeft': '18px', }, ), fac.AntdMenu( diff --git a/dash-fastapi-frontend/views/login.py b/dash-fastapi-frontend/views/login.py index 784bbf8..d670c15 100644 --- a/dash-fastapi-frontend/views/login.py +++ b/dash-fastapi-frontend/views/login.py @@ -3,6 +3,7 @@ import feffery_utils_components as fuc import time from dash import dcc, html from callbacks import login_c # noqa: F401 +from config.env import AppConfig def render(): @@ -31,14 +32,14 @@ def render(): className='ant-pro-form-login-logo', ), html.Span( - 'DF Admin', + AppConfig.app_name, className='ant-pro-form-login-title', ), ], className='ant-pro-form-login-header', ), html.Div( - 'DF Admin 是 Dash 中最完备的中后台管理系统', + f'{AppConfig.app_name} 是 Dash 中最完备的中后台管理系统', className='ant-pro-form-login-desc ', ), ], -- Gitee From 5b13840177809cc8a843f53262b624ce8d52e390 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 10:49:30 +0800 Subject: [PATCH 220/229] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/.env.dev | 12 +++++++++++- dash-fastapi-frontend/.env.prod | 12 +++++++++++- dash-fastapi-frontend/config/env.py | 21 +++++++++++++++++++++ dash-fastapi-frontend/utils/cache_util.py | 11 +++++++++-- 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/dash-fastapi-frontend/.env.dev b/dash-fastapi-frontend/.env.dev index 49e2ca1..ee7e0e7 100644 --- a/dash-fastapi-frontend/.env.dev +++ b/dash-fastapi-frontend/.env.dev @@ -19,4 +19,14 @@ APP_PORT = 8088 APP_DEBUG = true # flask-compress压缩配置 APP_COMPRESS_ALGORITHM = 'br' -APP_COMPRESS_BR_LEVEL = 11 \ No newline at end of file +APP_COMPRESS_BR_LEVEL = 11 + +# -------- 缓存配置 -------- +# LRU缓存的限制数量,0表示无限制 +LRU_CACHE_MAXSIZE = 10000 +# LRU缓存不重新分配的容量 +LRU_CACHE_CAPACITY = 10000 +# TTL缓存的限制数量,0表示无限制 +TTL_CACHE_MAXSIZE = 0 +# TTL缓存过期时间(秒) +TTL_CACHE_EXPIRE = 600 \ No newline at end of file diff --git a/dash-fastapi-frontend/.env.prod b/dash-fastapi-frontend/.env.prod index cf335b6..cf86c04 100644 --- a/dash-fastapi-frontend/.env.prod +++ b/dash-fastapi-frontend/.env.prod @@ -19,4 +19,14 @@ APP_PORT = 8088 APP_DEBUG = false # flask-compress压缩配置 APP_COMPRESS_ALGORITHM = 'br' -APP_COMPRESS_BR_LEVEL = 11 \ No newline at end of file +APP_COMPRESS_BR_LEVEL = 11 + +# -------- 缓存配置 -------- +# LRU缓存的限制数量,0表示无限制 +LRU_CACHE_MAXSIZE = 10000 +# LRU缓存不重新分配的容量 +LRU_CACHE_CAPACITY = 10000 +# TTL缓存的限制数量,0表示无限制 +TTL_CACHE_MAXSIZE = 0 +# TTL缓存过期时间(秒) +TTL_CACHE_EXPIRE = 600 \ No newline at end of file diff --git a/dash-fastapi-frontend/config/env.py b/dash-fastapi-frontend/config/env.py index 35afb6e..e654b73 100644 --- a/dash-fastapi-frontend/config/env.py +++ b/dash-fastapi-frontend/config/env.py @@ -23,6 +23,17 @@ class AppSettings(BaseSettings): app_compress_br_level: int = 11 +class CacheSettings(BaseSettings): + """ + 缓存配置 + """ + + lru_cache_maxsize: int = 10000 + lru_cache_capacity: int = 10000 + ttl_cache_maxsize: int = 0 + ttl_cache_expire: int = 600 + + class GetConfig: """ 获取配置 @@ -39,6 +50,14 @@ class GetConfig: # 实例化应用配置模型 return AppSettings() + @lru_cache() + def get_cache_config(self): + """ + 获取缓存配置 + """ + # 实例化缓存配置模型 + return CacheSettings() + @staticmethod def parse_cli_args(): """ @@ -66,6 +85,8 @@ class GetConfig: get_config = GetConfig() # 应用配置 AppConfig = get_config.get_app_config() +# 缓存配置 +CacheConfig = get_config.get_cache_config() class ApiConfig: diff --git a/dash-fastapi-frontend/utils/cache_util.py b/dash-fastapi-frontend/utils/cache_util.py index 94bbb60..85668bf 100644 --- a/dash-fastapi-frontend/utils/cache_util.py +++ b/dash-fastapi-frontend/utils/cache_util.py @@ -1,10 +1,17 @@ from cachebox import LRUCache, TTLCache from flask import session from typing import Any, Dict +from config.env import CacheConfig -cache_manager = LRUCache(maxsize=10000, iterable=None, capacity=10000) -ttl_manager = TTLCache(maxsize=0, ttl=600) +cache_manager = LRUCache( + maxsize=CacheConfig.lru_cache_maxsize, + iterable=None, + capacity=CacheConfig.lru_cache_capacity, +) +ttl_manager = TTLCache( + maxsize=CacheConfig.ttl_cache_maxsize, ttl=CacheConfig.ttl_cache_expire +) class CacheManager: -- Gitee From d593afe5eeace794474000f5e9f2cdfae4341f75 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 10:49:58 +0800 Subject: [PATCH 221/229] =?UTF-8?q?style:=20=E5=AD=97=E5=85=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=99=A8=E6=96=B0=E5=A2=9E=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/utils/dict_util.py | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/dash-fastapi-frontend/utils/dict_util.py b/dash-fastapi-frontend/utils/dict_util.py index 2b2df02..efe79ee 100644 --- a/dash-fastapi-frontend/utils/dict_util.py +++ b/dash-fastapi-frontend/utils/dict_util.py @@ -4,8 +4,18 @@ from utils.cache_util import TTLCacheManager class DictManager: + """ + 字典管理器 + """ + @classmethod def get_dict_options(cls, dict_type: str): + """ + 获取字典数据 + + :param dict_type: 字典类型 + :return: 字典数据 + """ cache_dict_value = TTLCacheManager.get(target_key=dict_type) if cache_dict_value: select_options, dict_options = cache_dict_value @@ -36,6 +46,13 @@ class DictManager: @classmethod def get_dict_label(cls, dict_type: str, dict_value: Any): + """ + 根据字典类型和字典值获取字典标签 + + :param dict_type: 字典类型 + :param dict_value: 字典值 + :return: 字典标签 + """ options = cls.get_dict_options(dict_type=dict_type)[1] if dict_value is None: return '' @@ -52,6 +69,12 @@ class DictManager: 'default', 'primary', 'success', 'info', 'warning', 'danger' ] = 'default', ): + """ + 根据标签类型获取标签颜色 + + :param tag_type: 标签类型 + :return: 标签颜色 + """ if tag_type == 'primary': return 'blue' elif tag_type == 'success': @@ -66,6 +89,13 @@ class DictManager: @classmethod def get_dict_tag(cls, dict_type: dict, dict_value: Any): + """ + 根据字典类型和字典值获取字典标签tag + + :param dict_type: 字典类型 + :param dict_value: 字典值 + :return: 字典标签tag + """ options = cls.get_dict_options(dict_type=dict_type)[1] for option in options: if option.get('value') == str(dict_value): -- Gitee From ebafadaedbee64e82edf062da53ed9863167aa6d Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 10:51:34 +0800 Subject: [PATCH 222/229] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84utils/tre?= =?UTF-8?q?e=5Ftool.py=E5=92=8Cutils/common.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/forget_c.py | 20 +- dash-fastapi-frontend/callbacks/login_c.py | 16 +- .../callbacks/monitor_c/job_c/job_c.py | 8 +- dash-fastapi-frontend/callbacks/register_c.py | 20 +- .../callbacks/system_c/config_c.py | 8 +- .../callbacks/system_c/dept_c.py | 20 +- .../callbacks/system_c/dict_c/dict_c.py | 8 +- .../callbacks/system_c/dict_c/dict_data_c.py | 8 +- .../menu_c/components_c/button_type_c.py | 16 +- .../menu_c/components_c/content_type_c.py | 20 +- .../menu_c/components_c/menu_type_c.py | 20 +- .../callbacks/system_c/menu_c/menu_c.py | 12 +- .../callbacks/system_c/notice_c.py | 12 +- .../callbacks/system_c/post_c.py | 8 +- .../callbacks/system_c/role_c/data_scope_c.py | 4 +- .../callbacks/system_c/role_c/role_c.py | 12 +- .../callbacks/system_c/user_c/user_c.py | 8 +- dash-fastapi-frontend/utils/common.py | 7 - dash-fastapi-frontend/utils/common_util.py | 32 ++ dash-fastapi-frontend/utils/tree_tool.py | 324 ----------------- dash-fastapi-frontend/utils/tree_util.py | 344 ++++++++++++++++++ 21 files changed, 482 insertions(+), 445 deletions(-) delete mode 100644 dash-fastapi-frontend/utils/common.py create mode 100644 dash-fastapi-frontend/utils/common_util.py delete mode 100644 dash-fastapi-frontend/utils/tree_tool.py create mode 100644 dash-fastapi-frontend/utils/tree_util.py diff --git a/dash-fastapi-frontend/callbacks/forget_c.py b/dash-fastapi-frontend/callbacks/forget_c.py index fce61ee..ec400c9 100644 --- a/dash-fastapi-frontend/callbacks/forget_c.py +++ b/dash-fastapi-frontend/callbacks/forget_c.py @@ -3,7 +3,7 @@ from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate from api.forget import ForgetApi from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager @@ -51,7 +51,7 @@ def forget_auth( if nClicks: # 校验全部输入值是否不为空 if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [username, password, password_again, input_captcha] ): if password == password_again: @@ -92,28 +92,28 @@ def forget_auth( return dict( username_form_status=None - if validate_data_not_empty(username) + if ValidateUtil.not_empty(username) else 'error', password_form_status=None - if validate_data_not_empty(password) + if ValidateUtil.not_empty(password) else 'error', password_again_form_status=None - if validate_data_not_empty(password_again) + if ValidateUtil.not_empty(password_again) else 'error', captcha_form_status=None - if validate_data_not_empty(input_captcha) + if ValidateUtil.not_empty(input_captcha) else 'error', username_form_help=None - if validate_data_not_empty(username) + if ValidateUtil.not_empty(username) else '请输入用户名!', password_form_help=None - if validate_data_not_empty(password) + if ValidateUtil.not_empty(password) else '请输入新密码!', password_again_form_help=None - if validate_data_not_empty(password_again) + if ValidateUtil.not_empty(password_again) else '请再次输入新密码!', captcha_form_help=None - if validate_data_not_empty(input_captcha) + if ValidateUtil.not_empty(input_captcha) else '请输入短信验证码!', redirect_container=None, ) diff --git a/dash-fastapi-frontend/callbacks/login_c.py b/dash-fastapi-frontend/callbacks/login_c.py index 94bed94..2244454 100644 --- a/dash-fastapi-frontend/callbacks/login_c.py +++ b/dash-fastapi-frontend/callbacks/login_c.py @@ -6,7 +6,7 @@ from dash.exceptions import PreventUpdate from flask import session from api.login import LoginApi from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager @@ -60,7 +60,7 @@ def login_auth( if captcha_hidden: validate_list = [username, password] # 校验全部输入值是否不为空 - if all(validate_data_not_empty(item) for item in validate_list): + if all(ValidateUtil.not_empty(item) for item in validate_list): user_params = dict( username=username, password=password, @@ -87,22 +87,22 @@ def login_auth( return dict( username_form_status=None - if validate_data_not_empty(username) + if ValidateUtil.not_empty(username) else 'error', password_form_status=None - if validate_data_not_empty(password) + if ValidateUtil.not_empty(password) else 'error', captcha_form_status=None - if validate_data_not_empty(input_captcha) + if ValidateUtil.not_empty(input_captcha) else 'error', username_form_help=None - if validate_data_not_empty(username) + if ValidateUtil.not_empty(username) else '请输入用户名!', password_form_help=None - if validate_data_not_empty(password) + if ValidateUtil.not_empty(password) else '请输入密码!', captcha_form_help=None - if validate_data_not_empty(input_captcha) + if ValidateUtil.not_empty(input_captcha) else '请输入验证码!', token=None, redirect_container=None, diff --git a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py index a7296ea..33702a8 100644 --- a/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py +++ b/dash-fastapi-frontend/callbacks/monitor_c/job_c/job_c.py @@ -7,7 +7,7 @@ from typing import Dict from api.monitor.job import JobApi from config.constant import SysJobStatusConstant from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -361,7 +361,7 @@ def job_confirm(confirm_trigger, modal_type, form_value, form_label): x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [form_value.get(k) for k in form_label_list] ): params_add = form_value @@ -400,13 +400,13 @@ def job_confirm(confirm_trigger, modal_type, form_value, form_label): return dict( form_label_validate_status={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else 'error' for k in form_label_list }, form_label_validate_info={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_list }, diff --git a/dash-fastapi-frontend/callbacks/register_c.py b/dash-fastapi-frontend/callbacks/register_c.py index 554be52..e97c583 100644 --- a/dash-fastapi-frontend/callbacks/register_c.py +++ b/dash-fastapi-frontend/callbacks/register_c.py @@ -5,7 +5,7 @@ from dash.exceptions import PreventUpdate from api.login import LoginApi from api.register import RegisterApi from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager @@ -70,7 +70,7 @@ def register( if captcha_hidden: validate_list = [username, password, confirm_password] # 校验全部输入值是否不为空 - if all(validate_data_not_empty(item) for item in validate_list): + if all(ValidateUtil.not_empty(item) for item in validate_list): if password == confirm_password: register_params = dict( username=username, @@ -112,28 +112,28 @@ def register( return dict( username_form_status=None - if validate_data_not_empty(username) + if ValidateUtil.not_empty(username) else 'error', password_form_status=None - if validate_data_not_empty(password) + if ValidateUtil.not_empty(password) else 'error', confirm_password_form_status=None - if validate_data_not_empty(confirm_password) + if ValidateUtil.not_empty(confirm_password) else 'error', captcha_form_status=None - if validate_data_not_empty(input_captcha) + if ValidateUtil.not_empty(input_captcha) else 'error', username_form_help=None - if validate_data_not_empty(username) + if ValidateUtil.not_empty(username) else '请输入用户名!', password_form_help=None - if validate_data_not_empty(password) + if ValidateUtil.not_empty(password) else '请输入密码!', confirm_password_form_help=None - if validate_data_not_empty(confirm_password) + if ValidateUtil.not_empty(confirm_password) else '请再次输入密码!', captcha_form_help=None - if validate_data_not_empty(input_captcha) + if ValidateUtil.not_empty(input_captcha) else '请输入验证码!', redirect_container=None, register_success=None, diff --git a/dash-fastapi-frontend/callbacks/system_c/config_c.py b/dash-fastapi-frontend/callbacks/system_c/config_c.py index 505cc1c..e516c47 100644 --- a/dash-fastapi-frontend/callbacks/system_c/config_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/config_c.py @@ -7,7 +7,7 @@ from typing import Dict from api.system.config import ConfigApi from config.constant import SysYesNoConstant from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -361,7 +361,7 @@ def config_confirm(confirm_trigger, modal_type, form_value, form_label): x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [form_value.get(k) for k in form_label_list] ): params_add = form_value @@ -400,13 +400,13 @@ def config_confirm(confirm_trigger, modal_type, form_value, form_label): return dict( form_label_validate_status={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else 'error' for k in form_label_list }, form_label_validate_info={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_list }, diff --git a/dash-fastapi-frontend/callbacks/system_c/dept_c.py b/dash-fastapi-frontend/callbacks/system_c/dept_c.py index 2e2c2b1..8252663 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dept_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dept_c.py @@ -6,12 +6,12 @@ from typing import Dict from api.system.dept import DeptApi from config.constant import SysNormalDisableConstant from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.time_format_util import TimeFormatUtil -from utils.tree_tool import list_to_tree, list_to_tree_select +from utils.tree_util import TreeUtil def generate_dept_table(query_params: Dict): @@ -71,7 +71,7 @@ def generate_dept_table(query_params: Dict): item['status'] = DictManager.get_dict_tag( dict_type='sys_normal_disable', dict_value=item.get('status') ) - table_data_new = list_to_tree(table_data, 'dept_id', 'parent_id') + table_data_new = TreeUtil.list_to_tree(table_data, 'dept_id', 'parent_id') return [table_data_new, default_expanded_row_keys] @@ -256,12 +256,8 @@ def add_edit_dept_modal( else: dept_params = dict(dept_name='') tree_info = DeptApi.list_dept(dept_params) - tree_data = list_to_tree_select( - tree_info['data'], - 'dept_name', - 'dept_id', - 'dept_id', - 'parent_id', + tree_data = TreeUtil.list_to_tree_select( + tree_info['data'], 'dept_name', 'dept_id', 'dept_id', 'parent_id' ) if trigger_id == { @@ -344,7 +340,7 @@ def dept_confirm(confirm_trigger, modal_type, form_value, form_label): x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [form_value.get(k) for k in form_label_list] ): params_add = form_value @@ -383,13 +379,13 @@ def dept_confirm(confirm_trigger, modal_type, form_value, form_label): return dict( form_label_validate_status={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else 'error' for k in form_label_list }, form_label_validate_info={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_list }, diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py index eba3fb6..0db17a4 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_c.py @@ -8,7 +8,7 @@ from api.system.dict.type import DictTypeApi from config.constant import SysNormalDisableConstant from server import app from utils.cache_util import TTLCacheManager -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -370,7 +370,7 @@ def dict_type_confirm(confirm_trigger, modal_type, form_value, form_label): x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [form_value.get(k) for k in form_label_list] ): params_add = form_value @@ -410,13 +410,13 @@ def dict_type_confirm(confirm_trigger, modal_type, form_value, form_label): return dict( form_label_validate_status={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else 'error' for k in form_label_list }, form_label_validate_info={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_list }, diff --git a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py index 44aa01a..05d51ea 100644 --- a/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/dict_c/dict_data_c.py @@ -7,7 +7,7 @@ from api.system.dict.data import DictDataApi from config.constant import SysNormalDisableConstant from server import app from utils.cache_util import TTLCacheManager -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -349,7 +349,7 @@ def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [form_value.get(k) for k in form_label_list] ): params_add = form_value @@ -390,13 +390,13 @@ def dict_data_confirm(confirm_trigger, modal_type, form_value, form_label): return dict( form_label_validate_status={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else 'error' for k in form_label_list }, form_label_validate_info={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_list }, diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py index 9b2dcb7..2107558 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py @@ -3,7 +3,7 @@ from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate from api.system.menu import MenuApi from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager @@ -66,7 +66,7 @@ def menu_confirm_button( """ if confirm_trigger: if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [parent_id, menu_name, order_num] ): params_add = dict( @@ -116,17 +116,17 @@ def menu_confirm_button( return dict( form_validate=[ - None if validate_data_not_empty(parent_id) else 'error', - None if validate_data_not_empty(menu_name) else 'error', - None if validate_data_not_empty(order_num) else 'error', + None if ValidateUtil.not_empty(parent_id) else 'error', + None if ValidateUtil.not_empty(menu_name) else 'error', + None if ValidateUtil.not_empty(order_num) else 'error', None - if validate_data_not_empty(parent_id) + if ValidateUtil.not_empty(parent_id) else '请选择上级菜单!', None - if validate_data_not_empty(menu_name) + if ValidateUtil.not_empty(menu_name) else '请输入菜单名称!', None - if validate_data_not_empty(order_num) + if ValidateUtil.not_empty(order_num) else '请输入显示排序!', ], modal_visible=no_update, diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py index 887eebb..7de8997 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py @@ -3,7 +3,7 @@ from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate from api.system.menu import MenuApi from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager @@ -72,7 +72,7 @@ def menu_confirm_content( """ if confirm_trigger: if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [parent_id, menu_name, order_num, path] ): params_add = dict( @@ -128,20 +128,20 @@ def menu_confirm_content( return dict( form_validate=[ - None if validate_data_not_empty(parent_id) else 'error', - None if validate_data_not_empty(menu_name) else 'error', - None if validate_data_not_empty(order_num) else 'error', - None if validate_data_not_empty(path) else 'error', + None if ValidateUtil.not_empty(parent_id) else 'error', + None if ValidateUtil.not_empty(menu_name) else 'error', + None if ValidateUtil.not_empty(order_num) else 'error', + None if ValidateUtil.not_empty(path) else 'error', None - if validate_data_not_empty(parent_id) + if ValidateUtil.not_empty(parent_id) else '请选择上级菜单!', None - if validate_data_not_empty(menu_name) + if ValidateUtil.not_empty(menu_name) else '请输入菜单名称!', None - if validate_data_not_empty(order_num) + if ValidateUtil.not_empty(order_num) else '请输入显示排序!', - None if validate_data_not_empty(path) else '请输入路由地址!', + None if ValidateUtil.not_empty(path) else '请输入路由地址!', ], modal_visible=no_update, operations=no_update, diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py index 309aa68..43ce4b4 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py @@ -3,7 +3,7 @@ from dash.dependencies import Input, Output, State from dash.exceptions import PreventUpdate from api.system.menu import MenuApi from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager @@ -86,7 +86,7 @@ def menu_confirm_menu( """ if confirm_trigger: if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [parent_id, menu_name, order_num, path] ): params_add = dict( @@ -152,20 +152,20 @@ def menu_confirm_menu( return dict( form_validate=[ - None if validate_data_not_empty(parent_id) else 'error', - None if validate_data_not_empty(menu_name) else 'error', - None if validate_data_not_empty(order_num) else 'error', - None if validate_data_not_empty(path) else 'error', + None if ValidateUtil.not_empty(parent_id) else 'error', + None if ValidateUtil.not_empty(menu_name) else 'error', + None if ValidateUtil.not_empty(order_num) else 'error', + None if ValidateUtil.not_empty(path) else 'error', None - if validate_data_not_empty(parent_id) + if ValidateUtil.not_empty(parent_id) else '请选择上级菜单!', None - if validate_data_not_empty(menu_name) + if ValidateUtil.not_empty(menu_name) else '请输入菜单名称!', None - if validate_data_not_empty(order_num) + if ValidateUtil.not_empty(order_num) else '请输入显示排序!', - None if validate_data_not_empty(path) else '请输入路由地址!', + None if ValidateUtil.not_empty(path) else '请输入路由地址!', ], modal_visible=no_update, operations=no_update, diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index 666bca1..e3cf82f 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -12,7 +12,7 @@ from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.time_format_util import TimeFormatUtil -from utils.tree_tool import list_to_tree, list_to_tree_select +from utils.tree_util import TreeUtil from views.system.menu.components import button_type, content_type, menu_type @@ -72,7 +72,7 @@ def generate_menu_table(query_params: Dict): item['status'] = DictManager.get_dict_tag( dict_type='sys_normal_disable', dict_value=item.get('status') ) - table_data_new = list_to_tree(table_data, 'menu_id', 'parent_id') + table_data_new = TreeUtil.list_to_tree(table_data, 'menu_id', 'parent_id') return [table_data_new, default_expanded_row_keys] @@ -269,12 +269,8 @@ def add_edit_menu_modal( menu_params = dict(menu_name='') tree_info = MenuApi.list_menu(menu_params) tree_data = [dict(title='主类目', value='0', key='0', children=[])] - tree_data[0]['children'] = list_to_tree_select( - tree_info['data'], - 'menu_name', - 'menu_id', - 'menu_id', - 'parent_id', + tree_data[0]['children'] = TreeUtil.list_to_tree_select( + tree_info['data'], 'menu_name', 'menu_id', 'menu_id', 'parent_id' ) if trigger_id == {'index': 'add', 'type': 'menu-operation-button'}: diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 0f30b02..61daba4 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -7,7 +7,7 @@ from api.system.notice import NoticeApi from config.constant import SysNoticeStatusConstant, SysNoticeTypeConstant from config.env import ApiConfig from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -400,7 +400,7 @@ def notice_confirm( """ if confirm_trigger: if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [notice_title, notice_type] ): params_add = dict( @@ -457,16 +457,16 @@ def notice_confirm( return dict( notice_title_form_status=None - if validate_data_not_empty(notice_title) + if ValidateUtil.not_empty(notice_title) else 'error', notice_type_form_status=None - if validate_data_not_empty(notice_type) + if ValidateUtil.not_empty(notice_type) else 'error', notice_title_form_help=None - if validate_data_not_empty(notice_title) + if ValidateUtil.not_empty(notice_title) else '请输入公告标题!', notice_type_form_help=None - if validate_data_not_empty(notice_type) + if ValidateUtil.not_empty(notice_type) else '请输入公告类型!', modal_visible=no_update, operations=no_update, diff --git a/dash-fastapi-frontend/callbacks/system_c/post_c.py b/dash-fastapi-frontend/callbacks/system_c/post_c.py index 1ea680c..03b71c7 100644 --- a/dash-fastapi-frontend/callbacks/system_c/post_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/post_c.py @@ -7,7 +7,7 @@ from typing import Dict from api.system.post import PostApi from config.constant import SysNormalDisableConstant from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.dict_util import DictManager from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager @@ -341,7 +341,7 @@ def post_confirm(confirm_trigger, modal_type, form_value, form_label): x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [form_value.get(k) for k in form_label_list] ): params_add = form_value @@ -380,13 +380,13 @@ def post_confirm(confirm_trigger, modal_type, form_value, form_label): return dict( form_label_validate_status={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else 'error' for k in form_label_list }, form_label_validate_info={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_list }, diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py index 7ad9ad4..8604e5d 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/data_scope_c.py @@ -5,7 +5,7 @@ from dash.exceptions import PreventUpdate from api.system.role import RoleApi from server import app from utils.feedback_util import MessageManager -from utils.tree_tool import find_tree_all_keys +from utils.tree_util import TreeUtil @app.callback( @@ -43,7 +43,7 @@ def all_none_role_dept_mode(all_none, dept_tree): """ if dept_tree and all_none is not None: if all_none: - all_keys = find_tree_all_keys(dept_tree, []) + all_keys = TreeUtil.find_tree_all_keys(dept_tree, []) return all_keys else: return [] diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index f08bca5..5fcba39 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -9,11 +9,11 @@ from api.system.menu import MenuApi from api.system.role import RoleApi from config.constant import SysNormalDisableConstant from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.time_format_util import TimeFormatUtil -from utils.tree_tool import find_tree_all_keys +from utils.tree_util import TreeUtil def generate_role_table(query_params: Dict): @@ -309,7 +309,7 @@ def all_none_role_menu_mode(all_none, menu_tree): """ if menu_tree and all_none is not None: if all_none: - all_keys = find_tree_all_keys(menu_tree, []) + all_keys = TreeUtil.find_tree_all_keys(menu_tree, []) return all_keys else: return [] @@ -515,7 +515,7 @@ def role_confirm( x['id']['index']: x.get('value') for x in ctx.states_list[3] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [ form_value_state.get(k) for k in form_label_output_list ] @@ -575,13 +575,13 @@ def role_confirm( return dict( form_label_validate_status=[ None - if validate_data_not_empty(form_value_state.get(k)) + if ValidateUtil.not_empty(form_value_state.get(k)) else 'error' for k in form_label_output_list ], form_label_validate_info=[ None - if validate_data_not_empty(form_value_state.get(k)) + if ValidateUtil.not_empty(form_value_state.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_output_list ], diff --git a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py index bd88c75..cf493fc 100644 --- a/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/user_c/user_c.py @@ -9,7 +9,7 @@ from typing import Dict from api.system.user import UserApi from config.constant import SysNormalDisableConstant from server import app -from utils.common import validate_data_not_empty +from utils.common_util import ValidateUtil from utils.feedback_util import MessageManager from utils.permission_util import PermissionManager from utils.time_format_util import TimeFormatUtil @@ -456,7 +456,7 @@ def user_confirm(confirm_trigger, modal_type, form_value, form_label): x['id']['index']: x.get('value') for x in ctx.states_list[-1] } if all( - validate_data_not_empty(item) + ValidateUtil.not_empty(item) for item in [form_value.get(k) for k in form_label_list] ): params_add = form_value @@ -506,13 +506,13 @@ def user_confirm(confirm_trigger, modal_type, form_value, form_label): return dict( form_label_validate_status={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else 'error' for k in form_label_list }, form_label_validate_info={ form_label_state.get(k): None - if validate_data_not_empty(form_value.get(k)) + if ValidateUtil.not_empty(form_value.get(k)) else f'{form_label_state.get(k)}不能为空!' for k in form_label_list }, diff --git a/dash-fastapi-frontend/utils/common.py b/dash-fastapi-frontend/utils/common.py deleted file mode 100644 index dd4e84b..0000000 --- a/dash-fastapi-frontend/utils/common.py +++ /dev/null @@ -1,7 +0,0 @@ -def validate_data_not_empty(input_data): - """ - 工具方法:根据输入数据校验数据是否不为None和'' - :param input_data: 输入数据 - :return: 校验结果 - """ - return input_data is not None and input_data != '' diff --git a/dash-fastapi-frontend/utils/common_util.py b/dash-fastapi-frontend/utils/common_util.py new file mode 100644 index 0000000..c7c80db --- /dev/null +++ b/dash-fastapi-frontend/utils/common_util.py @@ -0,0 +1,32 @@ +from typing import Dict, List, Union + + +class ValidateUtil: + """ + 校验工具类 + """ + + @classmethod + def is_empty(cls, input_data: Union[Dict, List, str]): + """ + 工具方法:根据输入数据校验数据是否为空 + + :param input_data: 输入数据 + :return: 校验结果 + """ + return ( + input_data is None + or input_data == {} + or input_data == [] + or input_data == '' + ) + + @classmethod + def not_empty(cls, input_data: Union[Dict, List, str]): + """ + 工具方法:根据输入数据校验数据是否不为空 + + :param input_data: 输入数据 + :return: 校验结果 + """ + return not cls.is_empty(input_data) diff --git a/dash-fastapi-frontend/utils/tree_tool.py b/dash-fastapi-frontend/utils/tree_tool.py deleted file mode 100644 index e116261..0000000 --- a/dash-fastapi-frontend/utils/tree_tool.py +++ /dev/null @@ -1,324 +0,0 @@ -def find_node_values(data, key): - """ - 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 - :param data: 待查找的树形list - :param key: 目标键 - :return: 包含目标键的字典中目标键对应的值组成的列表 - """ - result = [] - for item in data: - if isinstance(item, dict): - if key in item: - result.append(item[key]) - # 递归查找子节点 - result.extend(find_node_values(item.values(), key)) - elif isinstance(item, list): - # 递归查找子节点 - result.extend(find_node_values(item, key)) - return result - - -def find_key_by_href(data, href): - """ - 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 - :param data: 待查找的树形list - :param href: 目标pathname - :return: 目标值对应的key - """ - for item in data: - if 'children' in item: - result = find_key_by_href(item['children'], href) - if result is not None: - return result - elif 'href' in item['props'] and item['props']['href'] == href: - return item['props']['key'] - return None - - -def find_title_by_key(data, key): - """ - 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 - :param data: 待查找的树形list - :param key: 目标key - :return: 目标值对应的title - """ - for item in data: - if 'children' in item: - result = find_title_by_key(item['children'], key) - if result is not None: - return result - elif 'key' in item['props'] and item['props']['key'] == key: - return item['props']['title'] - return None - - -def find_href_by_key(data, key): - """ - 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 - :param data: 待查找的树形list - :param key: 目标key - :return: 目标值对应的href - """ - for item in data: - if 'children' in item: - result = find_href_by_key(item['children'], key) - if result is not None: - return result - elif 'key' in item['props'] and item['props']['key'] == key: - return item['props'].get('href') - return None - - -def find_modules_by_key(data, key): - """ - 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 - :param data: 待查找的树形list - :param key: 目标key - :return: 目标值对应的module - """ - for item in data: - if 'children' in item: - result = find_modules_by_key(item['children'], key) - if result is not None: - return result - elif 'key' in item['props'] and item['props']['key'] == key: - return item['props'].get('modules') - return None - - -def find_parents(tree, target_key): - """ - 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表。 - :param tree: 待查找的树形list - :param target_key: 目标target_key - :return: 目标值对应的所有根节点的title - """ - result = [] - - def search_parents(node, key): - if 'children' in node: - for child in node['children']: - temp_result = search_parents(child, key) - if len(temp_result) > 0: - result.append({'title': node['props']['title']}) - result.extend(temp_result) - return result - - if 'key' in node['props'] and node['props']['key'] == key: - result.append({'title': node['props']['title']}) - return result - - return [] - - for node in tree: - result = search_parents(node, target_key) - if len(result) > 0: - break - - return result[::-1] - - -def deal_user_menu_info(pid: int, permission_list: list): - """ - 工具方法:根据菜单信息生成树形嵌套数据 - :param pid: 菜单id - :param permission_list: 菜单列表信息 - :return: 菜单树形嵌套数据 - """ - menu_list = [] - for permission in permission_list: - if permission['parent_id'] == pid: - children = deal_user_menu_info( - permission['menu_id'], permission_list - ) - antd_menu_list_data = {} - if children and permission['menu_type'] == 'M': - antd_menu_list_data['component'] = 'SubMenu' - antd_menu_list_data['props'] = { - 'key': str(permission['menu_id']), - 'title': permission['menu_name'], - 'icon': permission['icon'], - 'modules': permission['component'], - } - antd_menu_list_data['children'] = children - elif permission['menu_type'] == 'C': - antd_menu_list_data['component'] = 'Item' - antd_menu_list_data['props'] = { - 'key': str(permission['menu_id']), - 'title': permission['menu_name'], - 'icon': permission['icon'], - 'href': permission['path'], - 'modules': permission['component'], - } - antd_menu_list_data['button'] = children - elif permission['menu_type'] == 'F': - antd_menu_list_data['component'] = 'Button' - antd_menu_list_data['props'] = { - 'key': str(permission['menu_id']), - 'title': permission['menu_name'], - 'icon': permission['icon'], - } - elif permission['is_frame'] == 0: - antd_menu_list_data['component'] = 'Item' - antd_menu_list_data['props'] = { - 'key': str(permission['menu_id']), - 'title': permission['menu_name'], - 'icon': permission['icon'], - 'href': permission['path'], - 'target': '_blank', - 'modules': 'link', - } - else: - antd_menu_list_data['component'] = 'Item' - antd_menu_list_data['props'] = { - 'key': str(permission['menu_id']), - 'title': permission['menu_name'], - 'icon': permission['icon'], - 'href': permission['path'], - 'modules': permission['component'], - } - menu_list.append(antd_menu_list_data) - - return menu_list - - -def get_dept_tree(pid: int, permission_list: list): - """ - 工具方法:根据部门信息生成树形嵌套数据 - :param pid: 部门id - :param permission_list: 部门列表信息 - :return: 部门树形嵌套数据 - """ - dept_list = [] - for permission in permission_list: - if permission['parent_id'] == pid: - children = get_dept_tree(permission['dept_id'], permission_list) - dept_list_data = {} - if children: - dept_list_data['children'] = children - dept_list_data['key'] = str(permission['dept_id']) - dept_list_data['dept_id'] = permission['dept_id'] - dept_list_data['dept_name'] = permission['dept_name'] - dept_list_data['order_num'] = permission['order_num'] - dept_list_data['status'] = permission['status'] - dept_list_data['create_time'] = permission['create_time'] - dept_list_data['operation'] = permission['operation'] - dept_list.append(dept_list_data) - - return dept_list - - -def list_to_tree( - permission_list: list, sub_id_str: str, parent_id_str: str -) -> list: - """ - 工具方法:根据列表信息生成树形嵌套数据 - :param permission_list: 列表信息 - :param sub_id_str: 子id字符串 - :param parent_id_str: 父id字符串 - :return: 树形嵌套数据 - """ - # 转成id为key的字典 - mapping: dict = dict( - zip([i[sub_id_str] for i in permission_list], permission_list) - ) - - # 树容器 - container: list = [] - - for d in permission_list: - # 如果找不到父级项,则是根节点 - parent: dict = mapping.get(d[parent_id_str]) - if parent is None: - container.append(d) - else: - children: list = parent.get('children') - if not children: - children = [] - children.append(d) - parent.update({'children': children}) - - return container - - -def list_to_tree_select( - permission_list: list, - title_str: str, - key_str: str, - value_str: str, - parent_id_str: str, -) -> list: - """ - 工具方法:根据列表信息生成树选择器嵌套数据 - :param permission_list: 列表信息 - :param title_str: title字符串 - :param key_str: key字符串 - :param value_str: value字符串 - :param parent_id_str: parent_id字符串 - :return: 树形嵌套数据 - """ - permission_list = [ - dict( - title=item[title_str], - key=str(item[key_str]), - value=str(item[value_str]), - parent_id=str(item[parent_id_str]), - ) - for item in permission_list - ] - # 转成id为key的字典 - mapping: dict = dict( - zip([i['key'] for i in permission_list], permission_list) - ) - - # 树容器 - container: list = [] - - for d in permission_list: - # 如果找不到父级项,则是根节点 - parent: dict = mapping.get(d['parent_id']) - if parent is None: - container.append(d) - else: - children: list = parent.get('children') - if not children: - children = [] - children.append(d) - parent.update({'children': children}) - - return container - - -def get_search_panel_data(menu_list: list): - search_data = [] - for item in menu_list: - if item.get('menu_type') == 'C' or item.get('is_frame') == 0: - item_dict = dict( - id=str(item.get('menu_id')), - title=item.get('menu_name'), - handler='() => window.open("%s", "_self")' % item.get('path'), - ) - search_data.append(item_dict) - - return search_data - - -def find_tree_all_keys(tree, keys_list): - """ - 递归函数,用于查找树形数据结构中所有键名为'name'的值,并将它们添加到列表中。 - - :param tree: 树形数据结构,假设为嵌套字典或列表 - :param keys_list: 用于存储找到的'key'值的列表 - :return: 包含所有找到的'key'值的列表 - """ - if isinstance(tree, dict): - for key, value in tree.items(): - if key == 'key': - keys_list.append(value) - elif isinstance(value, (dict, list)): - find_tree_all_keys(value, keys_list) - elif isinstance(tree, list): - for item in tree: - find_tree_all_keys(item, keys_list) - - return keys_list diff --git a/dash-fastapi-frontend/utils/tree_util.py b/dash-fastapi-frontend/utils/tree_util.py new file mode 100644 index 0000000..72c840e --- /dev/null +++ b/dash-fastapi-frontend/utils/tree_util.py @@ -0,0 +1,344 @@ +class TreeUtil: + """ + 树形数据处理工具类 + """ + + @classmethod + def find_node_values(cls, data, key): + """ + 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表 + + :param data: 待查找的树形list + :param key: 目标键 + :return: 包含目标键的字典中目标键对应的值组成的列表 + """ + result = [] + for item in data: + if isinstance(item, dict): + if key in item: + result.append(item[key]) + # 递归查找子节点 + result.extend(cls.find_node_values(item.values(), key)) + elif isinstance(item, list): + # 递归查找子节点 + result.extend(cls.find_node_values(item, key)) + return result + + @classmethod + def find_key_by_href(cls, data, href): + """ + 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表 + + :param data: 待查找的树形list + :param href: 目标pathname + :return: 目标值对应的key + """ + for item in data: + if 'children' in item: + result = cls.find_key_by_href(item['children'], href) + if result is not None: + return result + elif 'href' in item['props'] and item['props']['href'] == href: + return item['props']['key'] + return None + + @classmethod + def find_title_by_key(cls, data, key): + """ + 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表 + + :param data: 待查找的树形list + :param key: 目标key + :return: 目标值对应的title + """ + for item in data: + if 'children' in item: + result = cls.find_title_by_key(item['children'], key) + if result is not None: + return result + elif 'key' in item['props'] and item['props']['key'] == key: + return item['props']['title'] + return None + + @classmethod + def find_href_by_key(cls, data, key): + """ + 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表 + + :param data: 待查找的树形list + :param key: 目标key + :return: 目标值对应的href + """ + for item in data: + if 'children' in item: + result = cls.find_href_by_key(item['children'], key) + if result is not None: + return result + elif 'key' in item['props'] and item['props']['key'] == key: + return item['props'].get('href') + return None + + @classmethod + def find_modules_by_key(cls, data, key): + """ + 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表 + + :param data: 待查找的树形list + :param key: 目标key + :return: 目标值对应的module + """ + for item in data: + if 'children' in item: + result = cls.find_modules_by_key(item['children'], key) + if result is not None: + return result + elif 'key' in item['props'] and item['props']['key'] == key: + return item['props'].get('modules') + return None + + @classmethod + def find_parents(cls, tree, target_key): + """ + 递归查找所有包含目标键的字典,并返回该键对应的值组成的列表 + + :param tree: 待查找的树形list + :param target_key: 目标target_key + :return: 目标值对应的所有根节点的title + """ + result = [] + + def search_parents(node, key): + if 'children' in node: + for child in node['children']: + temp_result = search_parents(child, key) + if len(temp_result) > 0: + result.append({'title': node['props']['title']}) + result.extend(temp_result) + return result + + if 'key' in node['props'] and node['props']['key'] == key: + result.append({'title': node['props']['title']}) + return result + + return [] + + for node in tree: + result = search_parents(node, target_key) + if len(result) > 0: + break + + return result[::-1] + + @classmethod + def deal_user_menu_info(cls, pid: int, permission_list: list): + """ + 工具方法:根据菜单信息生成树形嵌套数据 + + :param pid: 菜单id + :param permission_list: 菜单列表信息 + :return: 菜单树形嵌套数据 + """ + menu_list = [] + for permission in permission_list: + if permission['parent_id'] == pid: + children = cls.deal_user_menu_info( + permission['menu_id'], permission_list + ) + antd_menu_list_data = {} + if children and permission['menu_type'] == 'M': + antd_menu_list_data['component'] = 'SubMenu' + antd_menu_list_data['props'] = { + 'key': str(permission['menu_id']), + 'title': permission['menu_name'], + 'icon': permission['icon'], + 'modules': permission['component'], + } + antd_menu_list_data['children'] = children + elif permission['menu_type'] == 'C': + antd_menu_list_data['component'] = 'Item' + antd_menu_list_data['props'] = { + 'key': str(permission['menu_id']), + 'title': permission['menu_name'], + 'icon': permission['icon'], + 'href': permission['path'], + 'modules': permission['component'], + } + antd_menu_list_data['button'] = children + elif permission['menu_type'] == 'F': + antd_menu_list_data['component'] = 'Button' + antd_menu_list_data['props'] = { + 'key': str(permission['menu_id']), + 'title': permission['menu_name'], + 'icon': permission['icon'], + } + elif permission['is_frame'] == 0: + antd_menu_list_data['component'] = 'Item' + antd_menu_list_data['props'] = { + 'key': str(permission['menu_id']), + 'title': permission['menu_name'], + 'icon': permission['icon'], + 'href': permission['path'], + 'target': '_blank', + 'modules': 'link', + } + else: + antd_menu_list_data['component'] = 'Item' + antd_menu_list_data['props'] = { + 'key': str(permission['menu_id']), + 'title': permission['menu_name'], + 'icon': permission['icon'], + 'href': permission['path'], + 'modules': permission['component'], + } + menu_list.append(antd_menu_list_data) + + return menu_list + + @classmethod + def get_dept_tree(cls, pid: int, permission_list: list): + """ + 工具方法:根据部门信息生成树形嵌套数据 + + :param pid: 部门id + :param permission_list: 部门列表信息 + :return: 部门树形嵌套数据 + """ + dept_list = [] + for permission in permission_list: + if permission['parent_id'] == pid: + children = cls.get_dept_tree( + permission['dept_id'], permission_list + ) + dept_list_data = {} + if children: + dept_list_data['children'] = children + dept_list_data['key'] = str(permission['dept_id']) + dept_list_data['dept_id'] = permission['dept_id'] + dept_list_data['dept_name'] = permission['dept_name'] + dept_list_data['order_num'] = permission['order_num'] + dept_list_data['status'] = permission['status'] + dept_list_data['create_time'] = permission['create_time'] + dept_list_data['operation'] = permission['operation'] + dept_list.append(dept_list_data) + + return dept_list + + @classmethod + def list_to_tree( + cls, permission_list: list, sub_id_str: str, parent_id_str: str + ) -> list: + """ + 工具方法:根据列表信息生成树形嵌套数据 + + :param permission_list: 列表信息 + :param sub_id_str: 子id字符串 + :param parent_id_str: 父id字符串 + :return: 树形嵌套数据 + """ + # 转成id为key的字典 + mapping: dict = dict( + zip([i[sub_id_str] for i in permission_list], permission_list) + ) + + # 树容器 + container: list = [] + + for d in permission_list: + # 如果找不到父级项,则是根节点 + parent: dict = mapping.get(d[parent_id_str]) + if parent is None: + container.append(d) + else: + children: list = parent.get('children') + if not children: + children = [] + children.append(d) + parent.update({'children': children}) + + return container + + @classmethod + def list_to_tree_select( + cls, + permission_list: list, + title_str: str, + key_str: str, + value_str: str, + parent_id_str: str, + ) -> list: + """ + 工具方法:根据列表信息生成树选择器嵌套数据 + + :param permission_list: 列表信息 + :param title_str: title字符串 + :param key_str: key字符串 + :param value_str: value字符串 + :param parent_id_str: parent_id字符串 + :return: 树形嵌套数据 + """ + permission_list = [ + dict( + title=item[title_str], + key=str(item[key_str]), + value=str(item[value_str]), + parent_id=str(item[parent_id_str]), + ) + for item in permission_list + ] + # 转成id为key的字典 + mapping: dict = dict( + zip([i['key'] for i in permission_list], permission_list) + ) + + # 树容器 + container: list = [] + + for d in permission_list: + # 如果找不到父级项,则是根节点 + parent: dict = mapping.get(d['parent_id']) + if parent is None: + container.append(d) + else: + children: list = parent.get('children') + if not children: + children = [] + children.append(d) + parent.update({'children': children}) + + return container + + @classmethod + def get_search_panel_data(cls, menu_list: list): + search_data = [] + for item in menu_list: + if item.get('menu_type') == 'C' or item.get('is_frame') == 0: + item_dict = dict( + id=str(item.get('menu_id')), + title=item.get('menu_name'), + handler='() => window.open("%s", "_self")' + % item.get('path'), + ) + search_data.append(item_dict) + + return search_data + + @classmethod + def find_tree_all_keys(cls, tree, keys_list): + """ + 递归函数,用于查找树形数据结构中所有键名为'name'的值,并将它们添加到列表中。 + + :param tree: 树形数据结构,假设为嵌套字典或列表 + :param keys_list: 用于存储找到的'key'值的列表 + :return: 包含所有找到的'key'值的列表 + """ + if isinstance(tree, dict): + for key, value in tree.items(): + if key == 'key': + keys_list.append(value) + elif isinstance(value, (dict, list)): + cls.find_tree_all_keys(value, keys_list) + elif isinstance(tree, list): + for item in tree: + cls.find_tree_all_keys(item, keys_list) + + return keys_list -- Gitee From affd6e86d79feed357d62fd1a0d2b48e2a4f04b3 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 11:25:17 +0800 Subject: [PATCH 223/229] =?UTF-8?q?style:=20=E6=B8=85=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/app.py | 4 +--- .../menu_c/components_c/button_type_c.py | 2 +- .../menu_c/components_c/content_type_c.py | 2 +- .../menu_c/components_c/menu_type_c.py | 2 +- .../callbacks/system_c/menu_c/menu_c.py | 2 +- .../callbacks/system_c/notice_c.py | 4 ++-- .../callbacks/system_c/role_c/role_c.py | 6 +++--- dash-fastapi-frontend/store/store.py | 2 -- .../views/system/menu/__init__.py | 3 ++- .../views/system/notice/__init__.py | 3 ++- .../views/system/role/__init__.py | 3 ++- .../views/system/user/allocate_role.py | 2 -- .../views/system/user/profile/user_avatar.py | 18 ------------------ 13 files changed, 16 insertions(+), 37 deletions(-) diff --git a/dash-fastapi-frontend/app.py b/dash-fastapi-frontend/app.py index 285c012..35075f4 100644 --- a/dash-fastapi-frontend/app.py +++ b/dash-fastapi-frontend/app.py @@ -13,8 +13,6 @@ app.layout = html.Div( fuc.FefferyLocation(id='url-container'), # 用于回调pathname信息 dcc.Location(id='dcc-url', refresh=False), - # 注入js执行容器 - fuc.FefferyExecuteJs(id='execute-js-container'), # 注入页面内容挂载点 html.Div(id='app-mount'), # 注入全局配置容器 @@ -26,7 +24,7 @@ app.layout = html.Div( placeholder='输入你想要搜索的菜单...', panelStyles={'accentColor': '#1890ff', 'zIndex': 99999}, ), - # 辅助处理多输入 -> 存储接口返回token校验信息 + # 注入全局store容器 render_store_container(), # 重定向容器 html.Div(id='redirect-container'), diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py index 2107558..0c8e15c 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/button_type_c.py @@ -38,7 +38,7 @@ from utils.feedback_util import MessageManager confirm_trigger=Input('menu-modal-F-trigger', 'data'), ), state=dict( - modal_type=State('menu-operations-store-bk', 'data'), + modal_type=State('menu-modal_type-store', 'data'), edit_row_info=State('menu-edit-id-store', 'data'), parent_id=State('menu-parent_id', 'value'), menu_type=State('menu-menu_type', 'value'), diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py index 7de8997..971cc58 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/content_type_c.py @@ -38,7 +38,7 @@ from utils.feedback_util import MessageManager ), inputs=dict(confirm_trigger=Input('menu-modal-M-trigger', 'data')), state=dict( - modal_type=State('menu-operations-store-bk', 'data'), + modal_type=State('menu-modal_type-store', 'data'), edit_row_info=State('menu-edit-id-store', 'data'), parent_id=State('menu-parent_id', 'value'), menu_type=State('menu-menu_type', 'value'), diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py index 43ce4b4..450ee32 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/components_c/menu_type_c.py @@ -42,7 +42,7 @@ from utils.feedback_util import MessageManager ), inputs=dict(confirm_trigger=Input('menu-modal-C-trigger', 'data')), state=dict( - modal_type=State('menu-operations-store-bk', 'data'), + modal_type=State('menu-modal_type-store', 'data'), edit_row_info=State('menu-edit-id-store', 'data'), parent_id=State('menu-parent_id', 'value'), menu_type=State('menu-menu_type', 'value'), diff --git a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py index e3cf82f..250c223 100644 --- a/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/menu_c/menu_c.py @@ -239,7 +239,7 @@ def get_select_icon(icon): ], other=dict( edit_row_info=Output('menu-edit-id-store', 'data'), - modal_type=Output('menu-operations-store-bk', 'data'), + modal_type=Output('menu-modal_type-store', 'data'), ), ), inputs=dict( diff --git a/dash-fastapi-frontend/callbacks/system_c/notice_c.py b/dash-fastapi-frontend/callbacks/system_c/notice_c.py index 61daba4..9532313 100644 --- a/dash-fastapi-frontend/callbacks/system_c/notice_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/notice_c.py @@ -249,7 +249,7 @@ app.clientside_callback( ], other=dict( edit_row_info=Output('notice-edit-id-store', 'data'), - modal_type=Output('notice-operations-store-bk', 'data'), + modal_type=Output('notice-modal_type-store', 'data'), ), ), inputs=dict( @@ -376,7 +376,7 @@ def add_edit_notice_modal( ), inputs=dict(confirm_trigger=Input('notice-modal', 'okCounts')), state=dict( - modal_type=State('notice-operations-store-bk', 'data'), + modal_type=State('notice-modal_type-store', 'data'), edit_row_info=State('notice-edit-id-store', 'data'), notice_title=State('notice-notice_title', 'value'), notice_type=State('notice-notice_type', 'value'), diff --git a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py index 5fcba39..a0b7734 100644 --- a/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py +++ b/dash-fastapi-frontend/callbacks/system_c/role_c/role_c.py @@ -359,7 +359,7 @@ def change_role_menu_mode(parent_children): 'role-menu-perms-radio-parent-children', 'checked' ), edit_row_info=Output('role-edit-id-store', 'data'), - modal_type=Output('role-operations-store-bk', 'data'), + modal_type=Output('role-modal_type-store', 'data'), ), inputs=dict( operation_click=Input( @@ -392,7 +392,7 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): role_info = dict( role_name=None, role_key=None, - role_sort=None, + role_sort=0, status=SysNormalDisableConstant.NORMAL, remark=None, ) @@ -473,7 +473,7 @@ def add_edit_role_modal(operation_click, button_click, selected_row_keys): ), inputs=dict(confirm_trigger=Input('role-modal', 'okCounts')), state=dict( - modal_type=State('role-operations-store-bk', 'data'), + modal_type=State('role-modal_type-store', 'data'), edit_row_info=State('role-edit-id-store', 'data'), form_value=State( {'type': 'role-form-value', 'index': ALL, 'required': ALL}, 'value' diff --git a/dash-fastapi-frontend/store/store.py b/dash-fastapi-frontend/store/store.py index bbcddc6..65c8d14 100644 --- a/dash-fastapi-frontend/store/store.py +++ b/dash-fastapi-frontend/store/store.py @@ -9,8 +9,6 @@ def render_store_container(): dcc.Store( id='custom-app-primary-color-container', storage_type='session' ), - # 接口校验返回存储容器 - dcc.Store(id='api-check-result-container'), # token存储容器 dcc.Store(id='token-container', storage_type='session'), # 当前路由存储容器 diff --git a/dash-fastapi-frontend/views/system/menu/__init__.py b/dash-fastapi-frontend/views/system/menu/__init__.py index 7ec4ef4..ef6a7d6 100644 --- a/dash-fastapi-frontend/views/system/menu/__init__.py +++ b/dash-fastapi-frontend/views/system/menu/__init__.py @@ -14,7 +14,8 @@ def render(*args, **kwargs): return [ # 菜单管理模块操作类型存储容器 dcc.Store(id='menu-operations-store'), - dcc.Store(id='menu-operations-store-bk'), + # 菜单管理模块弹窗类型存储容器 + dcc.Store(id='menu-modal_type-store'), # modal菜单类型存储容器 dcc.Store(id='menu-modal-menu-type-store'), # 不同菜单类型的触发器 diff --git a/dash-fastapi-frontend/views/system/notice/__init__.py b/dash-fastapi-frontend/views/system/notice/__init__.py index fc3c6a2..e2a3a2f 100644 --- a/dash-fastapi-frontend/views/system/notice/__init__.py +++ b/dash-fastapi-frontend/views/system/notice/__init__.py @@ -16,7 +16,8 @@ def render(*args, **kwargs): return [ # 通知公告管理模块操作类型存储容器 dcc.Store(id='notice-operations-store'), - dcc.Store(id='notice-operations-store-bk'), + # 通知公告管理模块弹窗类型存储容器 + dcc.Store(id='notice-modal_type-store'), # 通知公告管理模块修改操作行key存储容器 dcc.Store(id='notice-edit-id-store'), # 通知公告管理模块删除操作行key存储容器 diff --git a/dash-fastapi-frontend/views/system/role/__init__.py b/dash-fastapi-frontend/views/system/role/__init__.py index a928c58..c944ad1 100644 --- a/dash-fastapi-frontend/views/system/role/__init__.py +++ b/dash-fastapi-frontend/views/system/role/__init__.py @@ -18,7 +18,8 @@ def render(*args, **kwargs): dcc.Download(id='role-export-container'), # 角色管理模块操作类型存储容器 dcc.Store(id='role-operations-store'), - dcc.Store(id='role-operations-store-bk'), + # 角色管理模块弹窗类型存储容器 + dcc.Store(id='role-modal_type-store'), # 角色管理模块修改操作行key存储容器 dcc.Store(id='role-edit-id-store'), # 角色管理模块删除操作行key存储容器 diff --git a/dash-fastapi-frontend/views/system/user/allocate_role.py b/dash-fastapi-frontend/views/system/user/allocate_role.py index 5b0bdba..91d17de 100644 --- a/dash-fastapi-frontend/views/system/user/allocate_role.py +++ b/dash-fastapi-frontend/views/system/user/allocate_role.py @@ -27,7 +27,6 @@ def render(): placeholder='请输入用户昵称', autoComplete='off', disabled=True, - # style={'width': 240}, ), label='用户昵称', style={'paddingBottom': '10px'}, @@ -42,7 +41,6 @@ def render(): placeholder='请输入登录账号', autoComplete='off', disabled=True, - # style={'width': 240}, ), label='登录账号', style={'paddingBottom': '10px'}, diff --git a/dash-fastapi-frontend/views/system/user/profile/user_avatar.py b/dash-fastapi-frontend/views/system/user/profile/user_avatar.py index b131078..6eaea27 100644 --- a/dash-fastapi-frontend/views/system/user/profile/user_avatar.py +++ b/dash-fastapi-frontend/views/system/user/profile/user_avatar.py @@ -115,24 +115,6 @@ def render(avatar_path): accept='.jpeg,.jpg,.png', max_size=10 * 1024 * 1024, ), - # fac.AntdUpload( - # id='avatar-upload-choose', - # apiUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/upload', - # apiUrlExtraParams={'taskPath': 'avatarUpload'}, - # downloadUrl=f'{ApiBaseUrlConfig.BaseUrl}/common/caches', - # downloadUrlExtraParams={ - # 'taskPath': 'avatarUpload', - # 'token': session.get('Authorization'), - # }, - # headers={ - # 'Authorization': 'Bearer ' - # + session.get('Authorization') - # }, - # fileMaxSize=10, - # showUploadList=False, - # fileTypes=['jpeg', 'jpg', 'png'], - # buttonContent='选择', - # ), span=4, ), fac.AntdCol( -- Gitee From bc6e90831fc2d814cd646e9bf62c795b38b3838e Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 11:26:02 +0800 Subject: [PATCH 224/229] =?UTF-8?q?perf:=20=E9=80=80=E5=87=BA=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=97=B6=E8=87=AA=E5=8A=A8=E6=B8=85=E9=99=A4=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E7=94=A8=E6=88=B7=E7=9A=84=E7=BC=93=E5=AD=98=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/callbacks/app_c.py | 2 ++ dash-fastapi-frontend/callbacks/layout_c/head_c.py | 2 ++ dash-fastapi-frontend/utils/cache_util.py | 11 +++++++++++ 3 files changed, 15 insertions(+) diff --git a/dash-fastapi-frontend/callbacks/app_c.py b/dash-fastapi-frontend/callbacks/app_c.py index b93db03..9c09674 100644 --- a/dash-fastapi-frontend/callbacks/app_c.py +++ b/dash-fastapi-frontend/callbacks/app_c.py @@ -3,6 +3,7 @@ from dash.exceptions import PreventUpdate from dash.dependencies import Input, Output, State from flask import session from server import app +from utils.cache_util import CacheManager # api拦截器——退出登录二次确认 @@ -17,6 +18,7 @@ from server import app def redirect_page(okCounts): if okCounts: session.clear() + CacheManager.clear() return [dcc.Location(pathname='/login', id='index-redirect'), None] diff --git a/dash-fastapi-frontend/callbacks/layout_c/head_c.py b/dash-fastapi-frontend/callbacks/layout_c/head_c.py index b68a5f2..08cd90d 100644 --- a/dash-fastapi-frontend/callbacks/layout_c/head_c.py +++ b/dash-fastapi-frontend/callbacks/layout_c/head_c.py @@ -5,6 +5,7 @@ from dash.exceptions import PreventUpdate from flask import session from api.login import LoginApi from server import app +from utils.cache_util import CacheManager # 页首右侧个人中心选项卡回调 @@ -58,6 +59,7 @@ def logout_confirm(okCounts): result = LoginApi.logout() if result['code'] == 200: session.clear() + CacheManager.clear() return [dcc.Location(pathname='/login', id='index-redirect'), None] diff --git a/dash-fastapi-frontend/utils/cache_util.py b/dash-fastapi-frontend/utils/cache_util.py index 85668bf..e64edbc 100644 --- a/dash-fastapi-frontend/utils/cache_util.py +++ b/dash-fastapi-frontend/utils/cache_util.py @@ -61,6 +61,17 @@ class CacheManager: cache.pop(target_key, None) cache_manager.insert(session.get('Authorization'), cache) + @classmethod + def clear(cls): + """ + 清空缓存值 + + :return: + """ + cache = cache_manager.get(session.get('Authorization')) + if cache: + del cache_manager[session.get('Authorization')] + class TTLCacheManager: """ -- Gitee From 81257adefcccfa2fec9d02c61981edcf175ecaa6 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 11:30:26 +0800 Subject: [PATCH 225/229] chore: fac -> 0.3.8 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6907fe5..790b650 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ dash==2.18.1 DateTime==5.5 fastapi[all]==0.115.0 feffery-antd-charts==0.1.0rc5 -feffery-antd-components==0.3.7 +feffery-antd-components==0.3.8 feffery-markdown-components==0.2.10 feffery-utils-components==0.2.0rc24 Flask-Compress==1.15 -- Gitee From 4e5c6906baa53e55387a54155d23d12b21e04657 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 13:51:09 +0800 Subject: [PATCH 226/229] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F=E8=8F=9C=E5=8D=95=E6=BB=9A=E5=8A=A8=E6=9D=A1?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-frontend/views/layout/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-fastapi-frontend/views/layout/__init__.py b/dash-fastapi-frontend/views/layout/__init__.py index 7975eeb..cfc811c 100644 --- a/dash-fastapi-frontend/views/layout/__init__.py +++ b/dash-fastapi-frontend/views/layout/__init__.py @@ -94,6 +94,7 @@ def render(menu_info): id='side-menu', style={ 'height': '100vh', + 'overflowX': 'hidden', 'overflowY': 'auto', 'transition': 'width 1s', 'background': '#001529', -- Gitee From 42ec8a166ea046fea6b62d8597c7986644712bc9 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 13:51:44 +0800 Subject: [PATCH 227/229] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dcpu=5Fnum?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dash-fastapi-backend/module_admin/service/server_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-fastapi-backend/module_admin/service/server_service.py b/dash-fastapi-backend/module_admin/service/server_service.py index 557c01c..6e9e71a 100644 --- a/dash-fastapi-backend/module_admin/service/server_service.py +++ b/dash-fastapi-backend/module_admin/service/server_service.py @@ -21,7 +21,7 @@ class ServerService: cpu_used = cpu_usage_percent.user cpu_sys = cpu_usage_percent.system cpu_free = cpu_usage_percent.idle - cpu = CpuInfo(cpuNum=cpu_num, used=cpu_used, sys=cpu_sys, free=cpu_free) + cpu = CpuInfo(cpu_num=cpu_num, used=cpu_used, sys=cpu_sys, free=cpu_free) # 内存信息 memory_info = psutil.virtual_memory() -- Gitee From 5c90f4e06f2dcafb868310110b52a37c10a24611 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Mon, 30 Sep 2024 14:21:43 +0800 Subject: [PATCH 228/229] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E6=BC=94?= =?UTF-8?q?=E7=A4=BA=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo-pictures/zanzhu.jpg | Bin 160260 -> 0 bytes demo-pictures/zanzhu_wx.jpg | Bin 0 -> 173975 bytes demo-pictures/zanzhu_zfb.jpg | Bin 0 -> 75492 bytes ...2\344\272\272\350\265\204\346\226\231.png" | Bin 112062 -> 123877 bytes ...2\346\225\260\350\256\276\347\275\256.png" | Bin 113967 -> 158284 bytes ...0\347\272\277\347\224\250\346\210\267.png" | Bin 88297 -> 95044 bytes ...7\345\205\270\347\256\241\347\220\206.png" | Bin 150154 -> 148308 bytes ...2\346\227\266\344\273\273\345\212\241.png" | Bin 112143 -> 117761 bytes ...7\344\275\215\347\256\241\347\220\206.png" | Bin 104913 -> 113209 bytes ...0\350\256\260\345\257\206\347\240\201.png" | Bin 31827 -> 241314 bytes ...5\344\275\234\346\227\245\345\277\227.png" | Bin 89709 -> 100754 bytes ...5\345\212\241\347\233\221\346\216\247.png" | Bin 110484 -> 105304 bytes ...0\346\210\267\347\256\241\347\220\206.png" | Bin 108161 -> 115375 bytes "demo-pictures/\347\231\273\345\275\225.png" | Bin 1500103 -> 300736 bytes ...3\345\275\225\346\227\245\345\277\227.png" | Bin 101671 -> 107965 bytes ...3\347\273\237\346\216\245\345\217\243.png" | Bin 108407 -> 103439 bytes ...3\345\255\230\345\210\227\350\241\250.png" | Bin 142524 -> 142764 bytes ...3\345\255\230\347\233\221\346\216\247.png" | Bin 166328 -> 140823 bytes ...4\345\215\225\347\256\241\347\220\206.png" | Bin 101798 -> 108145 bytes ...2\350\211\262\347\256\241\347\220\206.png" | Bin 100892 -> 103306 bytes ...2\347\237\245\345\205\254\345\221\212.png" | Bin 100033 -> 108396 bytes ...0\351\227\250\347\256\241\347\220\206.png" | Bin 130194 -> 130175 bytes "demo-pictures/\351\246\226\351\241\265.png" | Bin 167521 -> 164517 bytes 23 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 demo-pictures/zanzhu.jpg create mode 100644 demo-pictures/zanzhu_wx.jpg create mode 100644 demo-pictures/zanzhu_zfb.jpg diff --git a/demo-pictures/zanzhu.jpg b/demo-pictures/zanzhu.jpg deleted file mode 100644 index fb6e349cfad942ed3ab5b07b186bb06a7b38d4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160260 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 diff --git a/demo-pictures/zanzhu_wx.jpg b/demo-pictures/zanzhu_wx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa27920e851aa7b72706f0f905306cb911f43fa6 GIT binary patch literal 173975 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

m`nF518iC5`x+oV-@7jwwN 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 xI8j zhfJK}>y(!#pM@4R`^aH3WKO528Cm;TIdvF0F-At6@Vi_DXIZf#M;)2Fv4yuhyqN%U&VOZ*Sr}t)-q~bf71asytFfJbZ)?+AV^SklS1lw#IkW+`LJl8cTq3} z%MHEN@p~V#e$MmA0;c$dl;DK75!Bl-(buQZm(*&C&%~|)kGe7V@NXdO*YW>6u6)rI zoIhw6Ujtfz-O3E+e4I_+V@J2}OGBStHNTXFm*s3obs+`p>2@^&K|jl&4()#~Q&HWf z=(twTOfs9LV!LJ{y6k^OA9i`_fi=&3PA0YEqOO zJMTQ#+?inWz{>0EQ){U_le+fEmto*$?MmyBgN^?3CIXgxk8`_#kkpQOj_huwEYsHE z=H&Tl(MbFwb6S-Vi^Zae)_MFWayT}+x+gYtlOF^@{B-8UgX~aEq4q`njr1Y5b|If= z@6Q4{wU-r_rSJ@3^4f;TT~-A{lA@&Ap*_nCHgzP*IF(vD=T3TjY8o3}rC=#o8b{tY+k Bl~w=% literal 0 HcmV?d00001 diff --git "a/demo-pictures/\344\270\252\344\272\272\350\265\204\346\226\231.png" "b/demo-pictures/\344\270\252\344\272\272\350\265\204\346\226\231.png" index 505fec4b68b19abd3c1ca2fb9f61655262b0dfbd..832197a42f7aa0467dbbf4135b08dd7446c2b5a2 100644 GIT binary patch literal 123877 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

=AqPfKHmR>L(X=iU<`+v?`bT%jDa@+5vEoZ&i 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

KF13OrF+_4RGaR@+LH4TAN{^u*U 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 literal 112062 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 diff --git "a/demo-pictures/\345\217\202\346\225\260\350\256\276\347\275\256.png" "b/demo-pictures/\345\217\202\346\225\260\350\256\276\347\275\256.png" index 3ec1463e332cfb117475f08f46899e595e4079ef..e2f9cdc096c6ffac548b0427af60d4f013a398f7 100644 GIT binary patch literal 158284 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 T-76+?e^HX+a-b4Xy>I^wD~g6X literal 113967 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

O>n$FY{dm@{`}Emn(}r!SHVsu!*0C(5e`o~ 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 diff --git "a/demo-pictures/\345\255\227\345\205\270\347\256\241\347\220\206.png" "b/demo-pictures/\345\255\227\345\205\270\347\256\241\347\220\206.png" index a6fbe3a64c7635c70b460cf8de3dd3b289103d61..2b71edcb8b2f01c8a20858f4a89a7fcefc585997 100644 GIT binary patch literal 148308 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�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 literal 150154 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

yZ_ERw``(xICgdi^xHsmY8ogrN_d4Q}+<}y|&k9 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

klRIP0PLNDh@!nD6o58A#7PY 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 RuLlIkBUNpcGG*)F{{pP6&tw1q diff --git "a/demo-pictures/\345\256\232\346\227\266\344\273\273\345\212\241.png" "b/demo-pictures/\345\256\232\346\227\266\344\273\273\345\212\241.png" index 82673ad37889aa502faa52359895e80571ec4d1d..c997a6d9cb0622fd64e9a26e1365660f794334a9 100644 GIT binary patch literal 117761 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%0A!sqZZ}dfQGQS+QhW{ zlrMmX&m+2#0D%tuL_+=Z?sat;G?8H=oWhL+0#C1OUG%lLyM32-Z!4WASmh2r0--2d zU-M%~~A6Y;3S9lQJU}M{oG2fpv z?EAD#;f=ad_X?v6&qZiaC@x?VI@I;vF|NFxP(le@`vwZ<>Nvln;`+QQRaSDrtZ~U_ znr|6M?e%KbmEQJeYF9d6y5Vp1jD{1?+Myee?9!)7UB?PIs)Gx*_h=dgqeBm(Ennk{ zfD=4w{Us-YkOoB_)DT|vfR`uuIECj<4XvXMtI7K9N5jnMTrFTEbI6{`^=&;zN)Gy% zWS;!#Dsh(3;d{6RILd9I@dpg=+i+)h7sJPyT>ONYkN{Hj^Nv#WzgPfbjYj>|m>KQw zj^3o5I(sfH!Y_~jJYrF8RowxSl}uadrPtW^`%`I8yCnwV zwa2jIfy8j_?d{y$+(0%$9BSOXfBY-3gqpCAxgR2H_u=7zQYJ+Rl&i2eRVckR z5F>vhEc_+`3jmCv^5jewHov72D3TH(Ko?A?EubKo;cwEuFofOoNE022Jamc*|)692su`if%oe}FmxWIz(i zf8Rk!iGXqc&%3X$y!hYs&wv1yZc_*D?`Jt7K!YzIEB@=@9gtLDAR{XCw-bYe6d7ZZ z`yq@`2J1tv#FHL~024SOLV3GBAz}ld8VHa>DSjs`>sfqn{u3pT7<^2!_E88QH+mt^ zLLf*4mW{_nNL2Ly^`gv^GiZVbREBYLb8Cr#Lz@PEvwC?s{UjeeTp$(yReO@9W&jc* zL_t9z_C)mWJewW?c&+|5Crm%6jN|Wz5D<|t|9?HE|HkH#pH6zfo0?h0$m~oU*Y}7t=b?Q&qds)=sCBk4Br#34u z0av02Y2{uTb=jiF--qf)3w5+!-sM;TN#^_oY|F{}Mk@_FLR(}SQZ5VpLS*YgFigk3^RpO3%k zEH{w}_FHE%R_Zm1-T(_ifG<5xybnShPCsxTDf6?KJCfKrzSlIlY_<~qi29om2v9V8 zc|KHgo}U8g)gnOLpm~Tk=0_5EEM+$nvElvEhI1i^}t5-ny4yH_9H<4)t)Xw%>_>Qo+f4I@ZFDAu9iOc z@VB>vFc3rhP99Iy^>0>h>P^-4x$l1IuW309*qS2jw%@lfrt*g+GB4dE3l>$HRy)~l zt$cI%qaNSwb7>w!s9GgwKfGa(2wh&D_~$IT=pQ_3JgqzbBsJzH7XV^(pHS42mABKb zv${G8DoJ7PPZ`}wq)lqO9C{vSxB|7Y?Ka@nc3uW&GIj(~{ijZJ%#^T=8de3Y&wJmE z+pIf2g36n=fe3c%bvA7=Hg;C0gX8JvqGY|rm+hq8-sEr1G^ezt2=VWjrKNtLCNit> zHQOqpPTpOA%ky;k9!5nItSQH=cUFLth4r@gqO5`E966l29|S-kOP%5qOX@UK^R=U? zPrZ!l<)C+|(vRznAdUr-B08v=x}h!c;N3X`os0*F{)~NC-UW( zNRJ|~^`tIQhW7DrT?=hRv}r-iMA(Ex30@hj_Dz?en2AxN-DnJS#_S8AVXYJu0n}mQ zIkv37?Oidf%J@^f$gCFyV!QHcvI5ms4X|(U@W^NLJWa0ZGmw*z4^{O3KUDo?R9n&7 zHjL8JmJ03^EACElY0=^h?i6=-g0{GOaEcdqhd^}ffMP@bM?HN%ZqrrJ^#Tv3Dm(JG@d6sJzSjG^4RAbN&@@#Ntr&00860L-tasZ%bcBIIeh5i72x zmZ?~Wz6@VgEyLkPHS|9ot`9K-iVCIUZ$EJ3P(ahx?(XhJ(s&KIQfYuk1Dd`=qtW|@mv82xq19VBd0=&x`%ddA$K$-Z%@bDc zb6>Ur_xo{j8~B8w*Til+&XEd#L=v9AIGuA8_BJ?N5q?X{LS_1Qe?Q1X?o*@F8IW4D z6(k`3nDN-Bgf_G{uLm`UT)>ki6;O#NA<4nPoKg2-9*)4VqwNURPzpy9`<>3(WY#)# z$HIht4nwBvLa@pjj^-^TK0_Hjojf_Y_$7cY1z@^Oaaoha*=GNq5U%e9j}QC-h{Jt& z|K4tocOE!m{Gc)Fgy*AXH2&3JiDtg#L*~f)BF@o#r(RNUApDexjOSJ)G>XM?t5_6Kxt>aw4r>?HmIE$}>@js;TziLNk^A}<}F17L~sW<`3x9*j56 zTW?)}cI(O@QURZ=`>7c;GH6;dvv$J|u2g&Hm#pq*o1;Sa2OR+)Xs5Y6SXU9yB~q3D z`XWMFv5~1GY_o+V*q8Tz_i#&AGIR9QQ?71)D2#7HKOgTtx2;=lxKwNN-Y7K`102Bm zqXI4BYo86hVyHWiL|J(_&IAf2eQ!pZ3hGsbo3_V3Kb^4%-+;)$Zy|;m8?%eM!KY;% z;t>iump}!YI1CR51E>EuzB(2tC^OLJSK8-+?aFWdS#!8(I+h~`-?{N(iMU{6g@cnW`s5{i497H1aM3;AQ@LY z@0ae|PNzb!gw)jSy!vZ89--Xw>G0itrqRL`N5}pe1_#G^etEB>&_(VQp~SvzH9(AC z^)tnC0MmU~_ZkIOHMmxPH9c{K?*Rk3o^6)tox=@hh!7fvWTAw@Inx+R~ z{d@tmdG@IT0LaZl*IZ+LWS>iw7`Y2H08vnjqEf*8>3ihzh3{yIl6sRakW)mm>` z;xec6CXooB7Gr=~gq-hke)+f;uP=kU^dMf17uPJU``~lyN}isb@>Y*RufK}-FXKYU zvf+MyD^Gh^G0j%TZ*O7D}azUhP!AShB{zhB$yL?Ex8 zBYGb&?u8BEK;}Up59gxueSy^TbBsjxdjPL_&fS>4rwpn*G@6~xYjK5z(1#lxnX7fq z^XTFB*eBKN=C1=Rg1f={K8WF*+Io8$V{AkR90_&wyp0t;^h7AYm-!&yPb+Zn2^V_4t4>Hc&hGfd#r&5>+-Ld+UyI>HTKd zK=*XBPJDkwt<>koh*-7;8l&6&%vNf2*8h|v0we@T7K1&&nU0UD54WdHnPrbN16uhC z6y(6YCCTMG*DAPry9EZali{a^A}7Y-5v8(^ffvdHsn4w+! zm~h8mIQfznwX@u7NRG2>Ok7^v=bG#Li%H?}SS<;giR!&_;Viw8Y4-qd(ujb71Amij zZB32m{ldy~0ozO){IaQuFQ}8vuqS+AU;uzn%)S4I5YChiILp!A*7v$XUlLZ5NgoHu z%Kj|UJylg4`8GQgJ!l1;pYG#ZqLg*sx?TF+I%k~Z2ipB^3UY5>ts49 z>h`Pf@-bym?o`}V zcOgHsoZWPV#1hb0!o9b?JA)c!;Ko9(U#5onwF!$1OY)ARtMC4GG(APHloJe05=B^R zPkwUw-Lxo`aMa{4SsxQWS9k*~Su~wh8K?^H@hyw>XHUrg7kKZQ)zOQC-u? ziNl|ih)Pw5dF?Hir%vl%XmrGI)$Evg!w%NfuHyRY#=UVA(T4~@2s6f3n@emnqU2znZnsX-2^VFE-39CC8_nzkI4#HzvaIp6+g(fou)oZW*f<^MP z4ChfUhpPnh{jSbkHaItm!|-97yUiVdB?8P95|7<1Et^JTU@8u&_l>@zqob121b~<+ zpU!ugL;7eoo-4(~!~_5$zq4-a)PS-s6O{}|>`ne#Gr;Qs%P3yY<9vz(l25Gpz&7I= zvW^RdXlB#?e4#M#ug{?T;(yjN2Ao{OnOiMT84X&p6Y zW6dc|4Gd-mnT7?K%*&kB=$TUL$YtP8l{>WLTr1*jE&nFG>B}@{>EE-mx%=&Ck>UL+ zmwRVFw#8&vt>LS)7kQ6?6SQt?v}VC{|1i6{u`w>VNwcPxw9@8crmzfG!I1{TnG4M4 zJQFMQ;xZ^tD0q1UjgPK;Q`+CVCqB{(j5fRjH-vKimK75_hY46)i}S&V*1HC6)Z7nF z^G7Ds33RXj4ayfeSsojT>%@?*hYsY_Q?5*e@-~>;)F07!mPq%kE%mc-WSO_%zHoI=Nj+;O8q z_K}#lcpR8770m~;mTarR;7Hch?AKth0Ja%W7$l}VH#BFjL8*a%x^z{txQSz zt6zhYQ?zqdaZ6twijgFA(8u==<55H;BQnqF{$bW)%ZQ1>&hO$&-F@;VzN3hat$l8^ zaXBTkzY6_N_HJuxwt0G$PPxD8qB@l6*dk@c7CXhnp3V%(W3xxe%|oW~8G-ROlNUD| zQ7ho%R%d7D#>Vl--$1enSil9> z>`rlI%GuI0)z}>`olR|L?Poj0Dv;jIlpzp2BNBp4IN+XmKNsE~2 zuVH0l+w^!7p%k5bYdAW}w{{m&7hf(#BKHNXLB;4&=79+jipXZ(I$B!kPN6Eq#peWg z7`%gFX&_kC9kI^spt7Um5g-FN4sVNQJor;ng&O(TkryZC7!``+b1K$dF;AP7`deZJ z$OkfY&-&N$6SbFE7&dx$wno!rhS^qreR-n89p-(|>{u^MAnHJ&X z(``GV4LQHNfU-zj`s7q$T@PN@?L{{w#AeMD%|AvNI@h)b7N?x9)U1ezy8wLu-ye2B zg&A_ESR4IY5l6@BZi8etLy7$;rhG(}=08>TWEd)3bt?2>-Ov&lXjYyNh-{fUbJR=A zI}14A5@wS1GsFFkfu?|j6_-R7&ymZ+fTmL$g8GVYJMEZZW;BS1s8SH-M$uPkz~(|W zw-i)j5uG?t#XKO~4duo|F_d($BXaP&#|_7n8+MGxJ)QZ}H-fjHJ)W@UUD@YKeLkl- zwLGLcZKqz0!#a6qE4P4Fi)&y27_sZ(>BWQs47#=qK2GO#+y+oB>#XKt%{+OxYk0}| ze)D&P#TeV`ToR(1+c*}TlMuZl#`yB_SxN;G-<0noCPW-H7*Z>KDX5G{RX{2VI}rDF z=8^DJVZo#nH+2#j7nAmM4`u-c!Nd4-Fd>$K=d6#fIOFGPX9EXzEmi8*8eP$ zGR@oQ_nVW6^i*-THdmC-q~h=!rz46(ZG+SIiI&fh(t)q6!;i>)+EVyAgbM%y>Ypfq zzoGTA9lz%Se(X&I3tEiJ62pjB)Vvr#NsS!bc&A%~lVqlsWRix4pvB{z(1G-EqAOAD zu@3S!k9c&w2qLU`?I=g(on!?{q$DDxkT642;28qLS$gsRN=O3wFII*oguK8HD`wd( zuAszZlmhd3-9Lx#j$?MK@$JByt<5fXs$sbxK}bg&*O~OT#mwQ}!*7mqBb%Qb>)nUf zPF$qZk=*0KA9<;rYB^oEM{9P_LB|?&skaA6qQ{IDNfGekUeDh&pox4rOB)*@0Ks{f zdxhw6KLm>gKxQx*nH;2)OGTY=ECVz_!>{Uf0prtU_nG-J1c$J*{_4qF&UI4LvL)9P{FCJ)P&Y9D>5 zqlqi3c2QSZEFppf#&NYT8uJ=uYpNmJq2Q+W@VoOEhpJps{xj?3Hz8UV{i#v(N&W`L zQ!DEz;oBo|P$iYtao#??9S^Wo#*MIvRT!O9XgVv)C}TW&X4>toEphqzp~2CD#Li*P zZ&x;IgCQfuZ^9N_oNJswx{DkfV19)^iVrBu6#>14< z#Uz30fdN~S#M&6_tWwHieZD_^Ut=a%eOcRyynQ@PevHt(3G9U3?w+b|bIk1AX;;~? zWnS-iwX)1)_@VgyxZWn@7})mM`5c^gc3{<5ii*PVa}95Ldg3=9_fD!K^|@R{zbA*S z!weh$d4wWpj8s{1nm#_n-2ChAo8L8!cVzibHS3`sWHq_U*fU8G0(K$9>hwj~s{nt0 zS-=zmaPnhfV&1)bmv8%-^LY&c^GbahPlLaosp`IC*I^a}X`O`kOU7(23Qp180?3oP zCf@xyQyRRlMdp|Xdw2R_q{G9b{S35BG4ImV6IN?z8x8B>;O*)4Y;ElAK8K>fOHg8n zz0lexT6>4=Y!Og#IO+>u8`!sIaUE8E@h;?Zw0(w9h9+%BM=tMhXmXcQy>`&j%A7aM z;Dfwgk6a=eO-pHY=M?5=&DC8D`do`SlS-Wl1(#0 z!ozE3s3|CNT3TANv)BKTjTQyX(v?`HcU$R@j)xw8wC_}^iRe>8X2Xh5qq1#;&hR2+ zc?Xnk1n|xw_?DEmRfe+6;BIcFaW5yS&=i!g48umfa51CLWr~nUTiY+xj@Y@GBQPR@yg1;Y_^s( zYax*h=OM^%dKm0iX_Hz#7lT~gWj0%WP5a2a9k}XXi2F5f2dCj_nC*N!y4=XT=D2V@ z&!2AXSV%&qqOuNUOFBCfhi!VvKs1p~3e6y$ww|(%HA{(?xPWIL^Q|n z5WhJR;bOM_&#yjVYjYDy)n9L?8eZ)XiXw_~^0G03KiQ7kFqt@eb+>aCqrR6?rXTR% z?1L|EyU&$$ZY1B_+>DHj028mp#l>I0di53w3G;PUC^@QKURNbLtskD zqWXqIBjNKh4Uu`3wr07RO$?%lQBxb%#=%-{C}g~*q6U4AnRz?*-G>|t>eIz7F0t7s zbE(Ajdznt2kEw}k`yGCNIDH=^D_1-4Sq3}-fJ!J7dU4@Yz%(&F{wD6bZKHLq3U0NO z%9d>Py!~TRw`>ls=#bcklKFB|$KqvU!0V$-zVA}3j+XY$PgU3Bp2=hzvzu#0bHorv zUhX!&*HuKKx(a2#`XcmyU3yn(Ympg(LAESdN1Xl+9WK(x8V7-hg#v~SYJwu;KmQr? zM5lxF^v4HEIJ5M{8zPz^M*vA+POytu9HRDC9Be>q{KqsH#4c44TrBjzgKw3*kC~A1q;ytACG$C`G3> zL;tn@K|`46YA-3Jni79Z_1W%6zWqd)$tqYY3 z?p%K0T71ap7qzib%{s(9MnzE`=k%&m)=7$EihEI^SxV*ESIAT`?^jq?g#E>t>4z-| zCi{{@{Wb-Qmdh+_l(9`|*|KIVP23i;Qif)QB&l7`vOgj|4Z5>ez!rPR5i^x9^XDHd zW@hReR1i^+D*h^D^Ayvjq_Yzx5JGxD@QaEafk@b! z$d>^~n!gXo&dZ~spy>SdAwhFyx<01c%04uLZzNG;NECXD9)ri)CCf=Nh1&v3s;%7| zp(pFIGIXXXami@hKz-OC^+n$;tb-l`Aq*9*Xu}d4eM2hnl>6)){l7G_e!$^$nVp@j za911S%nCToa}SMf)uyzy=fx~i#{Q5x!I?_(dGQ}DPWR_PiD9-#c5VN~<^J*CtIUNR zF67k}fu0iIBJ7Y%&P^1|y{qvsamS~|jPVuf7Waz~_xPp7E7w$qdQf7UWZtP^W+F>X z=Qm0P4mVfDMKJk8hAs(G{ZnvciUZKA52^g!=kobek%zdGZ|iml4aX&|*Z4MMjUP63 zG@~I^y?-|tXe^3l^a~E65{wA9&RhDcX;^x8OXgCX7Pdh5?;K<1oLKDw`&r{d4U7%u zooq+AzjEyml1WVH=uJ>%l3jChPApBmM$(Fi0gI7?q@|_Z-QDHnhJorrU?5n$w6TXr z({OsTXTe43!}y}0kMtY>PG?>AmHBgI$@^&+MZdfxk{UL1?p0Iv? zko#*=m07-FufgNq!W?zw$cHn(U$;@~`k&w^3k4H~cYWyh=a;Oip=q1)W-j<~1d#eM^>HP)Y2_t@DnL1ZS`r@O^0N}*Sq)DV0T zK2?2X3Rv?V};n#`p@*X5y|SBmE;^?Ljt&Ya&KA!}1cP z|0o^zJT^DmRGOBNEQ76R4)H1TjR*6Vbabe>g^au3Qx25cI;ZItsAh4-Gs&l={rOW7 z(^q136lfqeQvjkg$2u9XdufyHA5@-H(xd;{u_Q4ZH`iAaVVgnbrkqwSpw@IP`kV;PGg zK~#A|8N;f0P>}CX$&lhFcQ4R8hYULAZb*Q-UOdAuwyyA@OD&EMXUnuVa@(xd*QO&Q zsw~|d6Gw2dRX?VJ$xED2Kev)e_jU~(Jtg7q8R{vFkVFj{c9|`6MFb1iAX~?;CF2q` zvp2__%g)kU<_?A9V{l=_JkSgM9FjuiBITEg?k*ogQxn*})8?J+jr-{%5pvI0YT2ep zRFaP-UM3$tm>X^E#hWMU0ZLWm_rDtg!TN7+k>*y8MjP1K9AO!y$y7m*`6wsA_A>I? zJ8JuDNi@n`=UmUpfWba@cde|W2bw10BdGmMW=?QcR<)fJ?l<-N%C#YOfMeYMHh*Dh z4bWI$XkX+icc@2d(2sr#`>F(>P=8MkM)j? z-S_q-hvR0X&y9j0cV+K)c+%{C+_WT8LsXMWg_O8vDA<_Tnu_ND0$~ud=14ho`a9pi zIc^&J6@2@lFFU3l*?rLNik@1WoDqE|73A?^&Y{I#n8a&lq71Ue`w6ZS=k)*>Eh2-e zj{)rR#I+?A4_DRdByT3k;I1Y+@1=%qq5i3|uCIx-a2eIniHTdS=Bn~!AS0Q=E4tO? zZScFvLM0%W(AN4U()~Lv;tyPo2n@j5je!lFy8;rfs+5AgHUL&tl%EWdc>Udg!g4NS z{AbJfe}o0|BPK%Z3?7aO-u5PiYtHS8j>b_A?A$Y<&x!_&2Y@f&gozMD0%?Uq1^qV& zuc$_%xfe?N4w%EzJ}!i5CWNl1pm(m1`K8i1x6U0xM3+R8JlW%=4OtZPvhfw&Yi_fZ z&11DSN5xFoV~n|0CZEr`agsfxp^25InO@w)Q^TPFJ+ZMT&#q=^<>z;hDM83+KmnZ6hHD9*w;t-1?nVc)I*BH~jg~f675-!217; zqO_UIOG@Iw73`+3s?~i}QdkE4rk1>=GOSDo+Sg4ta{XUc_vh5DMu=?U8k6z5o10t_ z2EaImg{d#q9zA4chv|6l$4Y(rV)|u&&P?^w!2tCjv;Z?FlIQ86CuM!|H*}k35&v!% zKG|c6tsm9qZcgUh@%d*C&0s3SP~EK(QUK-j2bl(ZV=fMAQ%t4QtF=~#p_JgpnYBKJ zn=D);1;q9s!b(13xpcRY>efrtH3@`06UlY7wJ-?6xtRkz$BpORN)pkYg3lXYN<;jn zk*cB|JQgya1BqlUO-)o{K5Tsa-A`Q)59gz%Mn)yNt@G6~ZtAqZG=?~-0V6{!qmb!A zRCn(#8xAl+lv)A;A<~#VFh}}zvR0U5To}^PoJANKg!~#*+TYiV)uR%M~lv&@{MefGJ$(VR#a z_CQw+C!Op|A;4Gtwl$XMXG9j$*eIUfhtHu=$m~ho#_6gMv-LAzzDRL(3=Yu{)h?QJ zU6i5cEa8nF*qM88?&RwH_2Wjf9)~`(-;RC7&iJ+u2OXUi7<;G}Wk8#-xrJ?H!&Dc3 zG@ViYQt@uVXsZBQWrtcTUlsyQ&`U{vDv-q|^~a0fPVp~7d9i!h&#JmDm1w+uR4CsM zX$7664qdXoqVPYA@xnGHvBip11m(Y#8k9$_(#E2WXGmp!jULa#3j*mwX9pT)8S#74 z_I`gdH_&tm&ThyTl1d4_3pE^OJ0JHil_W5(W4$uP{H^Y1@EUIAeS*gisz8lm6muo5 zBR-w4#U<{Z3g{CyLPlZf?3Chho@7+CYK_YL-Z0mZ>C@#1i*D<+G$aJsw46%RYPOn< zk%Lj{Y*%zuR4#i6ZC|~1XLW3>k&!fkmZHFtyJZbu0rYQ(F8I9VP^|NgbXDr0|dO;VQrFFe33 z?&xMT$;+0_lEt=h9ePCr@GgW{$=~gmOI-bXN>ZXVzZEeidoZEs=V)4m*q4YORELXw zl45!&e|EF?X#!lMqi^CJa`<>%RkEGx_nr`-qAJ z@P?{-QBC?;hg`bGCMBBO-rG2u^D;8?@7{GIo<|IabX!2#2viI-ukf{H)#TO=i_e9(MW%xrJLJe=BfYy720cI)@Y9!I% zHdo@}LWNilUU6TEf=lqpQ)v&D>&p|}_*-<6$ez^Ebv>Uhq(M7pvX4GBj4@<=KG+|a z)msxHm997LT~A>SgfY8phJdBUpjPGyKpT*_t-gRQJ$c`(1qnayDFC`9mD?5yzk>UX~jZSEUNj98pUt7C8bdb6}_##jVvXl z)|VCG;zxQ6UE*|KD&DqmPV&l}?XfVdv8GtHe5l;dS(fKQM~_cRoL12WVXOyu^`qFI zbk!ViYR#})aq$FycqO%k`}E#frds0?jbq%Xu?E^GgF<(n^v?G?5=A*SaCFvzV2cl~ zxCZlIEUL3A&hE%3v`w@!FC>uw?)xTM`avq7r$94Q(>Qxk6<%Il@}u~=wb5qD$Ukx? zb*~2!*f9Xy*1-WhSk@H+=@BssTia8%0XfH%ekvp5J7@?h@w8&%a^I#Ld{lz3l{mYL z=x>cb5S@>5sHjZ!#V22U*HH-=$_u>K83;U2v=>~PJ<5`OQQd7M(#mcatx@=gHJ6pp zNyFO{^ehw%-Gq}qaP$p5d7vFy2-wp&d9<7bxZXYdK(q0{2DBl!Uk|B$j`PQ=$}@+Y zfwT04cQ;T}!1kWH7n~Eft3fvy@VOn-%kY8U9xl`$&s9q@LkjZqbsHVF78@Pk2N>*6 z76t?ae8AJhsdtGel{>b^9;k@;uM~Z>Cvx28$JsohlbTCTQ2Pl)!KO?|HSVr2V7BJx z%gA5!BO}rsWlQQE7v;;Mhh427&9C1(tKq$|paa(*AHgqEM0z4rDnX8l?tv}YB_$1m z+rvqv!>b7<$zK)Sdp66eLOs-v{cY^4jPp<@0*z5!ySP@OynHvB<(VT$@vQRQHj@uG zAX>_4XA&;DbPi!f#bL4w8uF@*;@|`8JY&AkbF#?&F*xeE(ec}Jv-1DMrWMa;L~#-J zU2LIjLJ(;gWgxm1+Ptaj_Hyf^?I`!-xo(9sn~JDXUc@2%w}5I%MPE)$YLIz*p-CF6 z&7Qf-(80vF>FL-A6%E+?nA+Ohrg_FUKPvbBNO@GDP`Ot*2Tbpc_QS$Liz294WOx3Q ztXK^XRI%;M(tf4xBPx>ql4fV6*U$GjcM`8h>#pCll*uW@ENHUv3uK`AF*7+%@ad9m zzNr;g557*d_!i-2Q)kj>eT~r0B3&w;m$=|al8BLkMIrKwAqs-0U0-w~VEqJsIZrjL zC*trGepo|86FB+e?tc3W0|LK4R!HHbV_<;Qw>=)lQpt#jiVE(JpGD4wmjYuIl6kKa zalMQ@w;03b{(W+!RfA!oJV$n3^*MxThr}7pS#5emQ_Xyp`noe}A}1n~d`s1-lTy)~ zr(y2epFig%lRfNDkW+RS`aS?NdVu4ntU~;N>9+_v4i{CYl((4Dk1E)%8b~?TNA@&$8|#k0WmC^X!{TsOK@T%y1y}Pw(@I#DU?Yb6sz6xR zT-LxKT!0P#ZKA0u&5Rn4_e;t&_tq8|O#r5^ve44T%HOqQ+eHhDO|yvBrR*xst0ZCf zszH~N>C3YtDt8U43bj#5TKAZ0=I)k1BNfzi{O#|0e*$`~Mon}6`&owt6G2>jKSf42 z1Z8X!m57o1U=L|^64Z4)1ErM|s&GiR7ZqL=L0acKIU$u>@6!*gU*=SBfnSoMobJ9J zL>T3wB%<1MXw+ubt2T*%+?_i~`{*}A-hAOC4>sC!Rh`kjx?~OR!@BE{)g_gWu|*88L2f zFp<9?HA6v^=iwwlzBD?k))1Y!#^=smX#(nJ?Yz&wfWh}bDXpjA`;U0f_he5mBm~XN z3jmpX9G#z^2M`0-H#WQkquC-yYl7R6G&=*ZP$S$sS(6tbk&|6nFz+F0xh}6g(ODli zw+4xvwTJD*x;m~12`mzlBbeX6hW6)OR06gI@GK7x4=*n-f$4XQ2jUw+s>O%9yMM~d zZEbB8q@~xJF7?|@H91F4{if~K{Y4FDPh_e6Fdy`J8Q7a?1n_;-BipkWZy7K{3=9l- z+8X6=ynvCT7$IU%k`ECd$TjZLr)nWyg2?1&{?N+t8BzQXfTJZTDXE}1JG(b!+?Dx=oC(Ny2!3ZLlEK%8D+4) zW1nvh+8M}^a${AbSu?G+JGMf2dnq}KeoS95vFHD;G$&_czSa_G=1E&Ak)n+C_4Nf# z@h#OL6=sO~(91WRM9*G&H}FFKyv~}gbhTmUm!Bk}-of9JuHRIBDW2MQYFcX;Px^!# zmb@$1*)uwW_~}0%CMW;+wF7aLrl(fO41d(APaz!m4nf&$tQa}4%Y5nbjg;R|E(C57trABSf%i6%m~gjx{&|!TyP&SUj*y_K7@f06ZGFF`Ogobu>nrS{}##r zKeuk)qdUTtQdOTkLq?g~jN726yYMMo$xM3N#ivki7RPJ&M1tD;qdLB$%Mbti0Spw< zm7t`0f!e)50yag1OsMrSD{Yo_tl{vYI(CMvGB>xBqd96pTrK{f42bGzT`lbu9mGrIgj)2g5+vY`TzMb80_>fCTgfK^Y-v97ZWvV5Z8Ue9m8Yh8Jt z!fI&ZR1`{tF4e>k-<5vumA1zqd9=$9xYaN8tptcuXMhIwyG z3yUq=>xP6`n}Ko^V6d!k0XU`@lD;%$zLX$utI9;-q?60uy^}|JeGnIJu=qN9Oxq+2 z=K#xO-1)-7*qC1i$?nZzEjca)E4se^TeR!V3ro{6l>jL9u1Bk2)tCYi!jrmx?vD;+ zv=LSMg?VNA+9t{3tu&YnW(XxMEh{^@2z|uGrTQ~Tn7!KL+K0g=%s4$-NdPFVv-5L6 z0=|9!{ypmR+Wy0ctQV~D{o&9a=@_oHU8)E1M*9SYYmb&!-d!^A|p_`{85sCt3piLi9$@^_#3?aoZ1NkN%dz zB6qeYQ7)$fwM_+O@TzZ=s2@IrL`Ei_>`WKb@TF@mEfp!(*3idc(!75C`p)A&EVC&C zloQh@6angHbd-gMhX)8(va)_Bj|uKJi20T~Wl^hXt)LL4S!!cpF>b~Qgf4;gqHM(? zA`3Lf`P0T0?ls)nP5L;RSir?=yWgJp7&w4$64DOPj_N-5uvJ62lcCgmvVdD0(f5u| zx}FLN$LeWz4)tWv7T_$H1IN|E<5Q%`L1)sXy`hgUri>krYNykDBoe6o2d)b=)S zKCimT*-J$b1x_xNOG){CbM&T4&>)8P`z9&fyHh-=B9D*2|C!UL7s8tOzEQqK5&wd) zF<2MU{r2q_Gg?Z_$*HWFTBA)UE~i&`yHs#eSbIn~%L4WLFRNl=L*lEHz-1_|n!I8$ zm|0aX1syXMos^%<=;g+s5Di8cjlb--;HY$TOoz(5Sk0vk*nh-IjICMid{0jgpiEkI zGvnhqfdcvGlu1Pept3{6$T33@09^zKZr}=V9hhlMLq)ZBc?S$h)M@o_4o;+r90KvK z4)UjIaO6K4%#p9bB)J}{R-am;pUxt8beGp|81IjkeVP>8%&A$=-wlQi5pJ&z728)+ z1L$@%0Zjy2SHk)w9cfA@7Xu9(;2F|az^6Sr(|RZ@?>i@siRql1h*$P!^mK5~J0k;% zmqq3Of?Cg8?{(#)QWM}r4(}s{*cRLl3?{nd61KEXHb+e=rF-x{MIf`>4Klob+Ig*q z))iC5mn%kYo-5fQ8JcUCE0$d{lGjt)I-IrM{)5eNT^olH6&VL<`iiT0@@`+{)oZf8 zt@ty0`5RrG)_q08t(hb{!JlP>>ueD?UuX0?F28#pN-s3s4aQ(#tgY#b3eq~Lxw)wu ziHYev8tb9?KZ^p-FL{bOEp8x6Ou2Nv&s<#7-483kCIUMM;-bmp`{eP#%qHJ5FF8Fc5+{ESx2xMMv33C#j3C<`Y zI$=Ent%C;Mvz7Z&s|lm^rQ!VNMH+v%eibkC|C%EV=N;iHxf?bh@|cfK^{gz^zk0)e z{~~3f%IBE<0usvXVKdc5Y`Se#WW;=q|EUWCS*~35(__3}(aJo%w6o$b_gC+_sRGA# zkm0Vij7wFk$`zpg@SM~6yZ(jvU(ue^cv&m4hv3HG(YyCQb)&9aXokzuUsHy&G}G+z zefeo=N?flgJa8jS`TYo`UGly62;6L_`EIsG5z9jf+c_+#YOSFGd~` z5g{ilt6ZoI{Lc`qEPqSg#n=U57|jsA=pOU3eLNQ460E#T5Jn@1BCoC%DT^9u1Yd1q z6HNg;`_IkDda)z~h6X)rbicT2?Y)Dkt!~=Hr5O|>@5*t!pkxGlJXxg9bi*@;_si$C zFBXeJ>=k_e@tlYB->+OGT5K!gj6#Gq4ID=rai&3Zo8lNqaHU@{wBxn;SM2$Hw5Z zQS&ko*vUyioQ3ym+a%wlRam7$D;1w^;b(Fj*0$Hzi$%3Tt7idbT^Q?wPcR^DujPDt z{q)%ObS8Xnlk(YcP$>!+VB{D!ACV6Glgas(X=H%Sb?^Qm$ctvG@-L~kj)&N*@bGV=WYS6x>!tQmW8|AxVmamg_E@z|G_-w?RQ@=nuV4Q%_CDK6oZi3`nETsX zDoRSX;!c16SHi+=Uwa%SxBqBwrV?HjoaqVa=`eVDJ^hLTSHl4FXO6AFX@W7v{3k1_ z&~5dvo0hW>A6bf*w#H^7X!1(C-XE$~iFun60 zqLpBApnnNdb792w=KP2%$h677gH5#5T&QRZ*6ZXb@2SK+|6}w~Z^XyFcSTqr9vu&H zwf+fe0z5s!&1xJ4lw`wKi0S(JT+H{C*9iSK?1Jy;c!!|!TkZrbjdOgjp)Hf9%V0MR zKz(im{uF!hk9STER6OP2(}p2Wj*IpbN&8F#n^*wl0|teV&~o!qPj4?bP*=po)zjS_ zkql}a;U?RL-&Cog#2e}YMv-m#e$N5Q-Gr2-5~<9SXD88*$jUsnQnzhv)0LC7pE+Pi zHxF?H+3$yCL#!2!aHffyL=7vCLGMTE77Gx4iUc9-hTS)?$0X}vurHkbzt(F61AT&Y zsVYE(?zDUg-@g4RECdxQ11iGshcbuArG)r6gUtq_Ju)mxhR%*j(^(jzMY18%Z6)K^WY-1B8~K#f^k`S8mDP7>OM z`RkTzpMw6_7567YGAQG26#J-5TgV>hc|)ETG<(V-H6;ZT3oGadv$C=h@WrySvdWGp zx!EPR%GN%x?XD4AX=EeKS7#HC_s0Z+D$5P}+0m+tdVA}F zhJvBM9j2PBZ`zEF>UwW+hhcq;I`BbD1YlK-CC7EQKgM}I3Apn;Z4m=+^Xm=h#u*Ur z3BS&#lm7N+iT=F)G&b^*lN&_y@A2Xi5fNcv05IR{9{Qm%y!5Upmbi|m^}TX>x)9F2 zgq@5xCr?5xP-xa^so->sPW{^e_7TsM#3}yb(Uz*czGD8mJp~qB%UJ|;kwte@-?(OR z`(lJ2gK!!XZl8)hHbR_4Q!4k;Nv;T;=~LscqJ|tBga2<=fPEPUytn0LA?N+cEa-P- zb5G^YNvSA>r(&k!6Z!Zz-G|f zYoiW8eG6MxE%g|6s1|B*t=MhtrS2K_xI9~LjR5qh{}sVga4J=3Dph=AAK*l+aGnPd zZ##2@JLGp|SC%by{>6x)iS!Aa%j7jz(&PG<4@IuN{_B)EiRY@X7pDP+QEVs~5B4r- zGN+K3gGlD4Ptuzc!b|SSAT^1G$1iI5EM2nj!Pn~@cHw4=fBsfV@zgEMbmGVN^lT4s zn1;2%w|BW$(v{MVcXx@bqC(4Ehzrkp{%J-Lkmq!aOWT!ENewyIT(hN5IgUxB?%C=H_RDF%X{RlnF*nweEFws5kGs>CYVY zZ~&MoKj)sC2^)nnaHaL>qAr1_ifcr`=eBW)v}E~8%y0_}!8cG;a$LB4kzdQr_H-Fg z*MTmC7ZHR%9xtn`?|Q679#P`tk*+8?r+jb_xah^OBHTV7{!z)24C6P_g*n>rZIiTz z?VQ~2aV>k<<6XV@*3(br0`8ORK0|D%KyS-L<<#GJ@d>9#P?l4SRu5)jb-}0?H~V=mjJqmY=x<%b-jEEc6++lP@VGaM2wU1U;!} zhMx@}_-0>zuvTuWn7~J{vr{QjS+73aKw2vA_I&op88#3&eNOtnBDj=^b2iDL_KvP} zckb!FWg~q;CY0+S?2R&50U;!%hNgp(ye92DcYfWpKFVJmc7_r6lt&06w3{;uTl08D z>(8%U%k9jKk2oTr)}%MkoSBUB@0;-iB{g@xL9L-xh&T7MB(-fenP;Y@FgWe_F%+t+ zkLdxu0d<;#AJNf6n~z=$oEDxcz;lrog;4a~p;2ksuPRY4y$-8*u(o8w;ju?>UPDA` zqZb9BuCe@Djd{qbaWY6y;LfCF;FmLkYb|*)xIeC%-_~E-phOzG?TJu~UDJ5~xtWR5 z*UzdSZZ;mz4H@ryi!i`7wKb^b%~yQ$5LV8Jw z!~Vm|moL-mv|HRNMY7a^$$Kn5w=#K(?x*YBuFLK_KvDk^)TDhU5xzgD21LXA01@W;)RMLJ zKLQ(oCFN$o;w>juH>~qBJ#%f44zYjm(%21kHu*&wqIM+es9d+aVZ&axPP>R<(9WCn z$(&$xy$qaqp3k)KA6mD5Ty8|hHe*g5!p5qu-Fhk!92B@LV%_(G7T>6!B&|}|I4UpA zChCoYoBxiHrcdYWn;;+&3e}};3^kGC)n=DrNwIepmtSRjQ6EVm`8F%xTqu2;G3c{& z9P4vFaJwxeWtgx@bA~aQ&>aF>Z*J7(sUgWAlUZ%&!!!w(JUd@n0&%glQPBuMiK8BWR)d%|fzeU=5j%BwUL+{zy z*@28JypJMk(F0bBKxE3<%uYZ0oHC~vS)`kF!&b^u$NIpz);N(=^$!G|=-Sz8_B9gy zc@FhzVC~Hvk-*|2Y5#@V{4v@8#=*kwtSWd8K~t1phJVy+0fSF?=+_r%Sky;nf4x_q za_8zu4oklNun63~SkdgrjLdlXyJ~BJ-Fj&09cpLSQmtuCAgAfqu(Q4uPJ3i#@Soa` z=^=s2TUbcG$cr4qC#uSPHkQ4v;1?3fZGZcvpd`Q0w5_cKE)9+E4hSc9axY0AHYX^s zu-5%4;BfEi3B~57=0Sywvj%O6i$(AZf}JkKVt&!63*;{&cjM*keNYh%OSKkTCl#Fx zSMDs&0ndrtvl=!MFI5c+;MMSN2B-}vl4*N-JjP8uX40tI^g|+<1%OiH>6CDpoj&KI zV`Cd>j&*E+fMRihlXgU)=GSX0LCuP*0oYhzNC=7hW(+{j{G~~21AhcMpQFzL6P4%W zF6q4~>Md>v-)eOt8&?*oc-~Dy^lzy=tKNjPL%k3xOi%!+B1DJq8;3AzeFV&^#*6%f zV2imvX#O`2B9?pEHiVomBs`fT)*4xDtSNRe`nX?hygpfwr{w#V)2q4kwd=;kU+C}f z;03E`<0G{>m7JHFpAjX?_9xMUIG_hvVYNx|@88}IX6-U^l#d}J+}N* zSUL~57W}n6MPfJG={hS(Z7X_ghJEMh|B0m%?HwMXAR{|1=C`zXc8B5+5OD1uKVAVz zs{55EU0vNHk6>O_){64-QF}r)iG<8dQXHIG#~pbv3eb@Hyo1xKkXUhT0w9kKgp!ZZ z!&=6|%yGgrhj5GF8C;%~6OXSpKU*TKiX(t#Z$BaYP!326@I6b5rVHx?;5YSjS2a8d z{v23yfr*_KCIUG({{(zxGoFzr_1CbevQ7z&6+&nzGJowKY-(AJis6ls5n-`tDgOUa z_LgB$gG~?uU21|HXEuRZ}dQ{KQYd{*0fF(8;4TqbNLAzLQT88HQ z&k53H=WMSIu;vZ>UN21UF1-@Unc(28ZYk zmjwn>wE4mZ(z2yMDmu_b8p$2P_p!-iB_$eXOVv|rB~?x zlYS(Lh3M}-K9iYY1-!-MH?O|t=RA{ZCCo=NH`hYPM#-{<-|)wiz6i%i@5sGucp?rS z$+jI^&?AU3S!nZ<4FCR>+6wfU>1+>n^(W?ab<%52d2hJFfwxt44|;da&kT_Q7S0_~ zE56J?U=T?8Y;105n*sTXUF$5MLdSA2&(0@sOTL^ zB(fF}as!(Vwg-*|sBH|1I3Ya`;5VhPKLt;(S}AdM3tsI9EP_C|f{L7@;p&wvc=3!R zHWosk*B&2qoBUUMq6lOSxM~>dttf3TVHC_CWBYcIXb%)>p z`fb)n_nItVtZsQ{nmOx{fE|4K>-h{t@)k=aR(`w0XpMx`i_O=sWd}xtH9}B-CCJa< zIVHeaPMm|U3~cqvc6sa9dTYrsc|V}z?W5~rUg|^gbDdZgzL^CDk!89I9ai2%k*5N) z4qi+(e)m=|rF{*QhoAom=+VZtdJkZ(0He zHBev)u*zPzxBklXykh3@I?;aVhp!fuCULoi#1CHDv4`vRo=CsMJ~V)fJC>A>9Qp5O z10oP~8-FeK8_!;TSDczsTyQ(78{gN+VqXKOc6^~EtdW~>MonT(ztHn4e5-1l4?TWrIOV$s7@o%1sC-VwCVfv$2SAQ>NA(eqS~DWhF0 zPihVhETPmQegUT0jZ$_KY{00gI{Xp5)de^~UIzD@1n!%m9>*qcw1R)->@43DyE$v7 zBIJy4X8yT3$LBr0I^?82)Jipt9Hv?TZ3FRnx}sMt zv3&{!dN!Kz&FvR(*{mEnBD8xqyPQI|V&&-Q=-@y7N5xw=iw5x;CLlcD!&xVP4~8d# z5=aWw(Zwl1-~;Amwd(e7^2E5p!8JwItgy7T>0}$A^4>(4&y3-%D5kYVxc28cK~uZF zfa}4>_{x%}ZE@DO88hwZ7UAo_+md^&v5=g>aW*S?@jWc+5wDY`Lr;EKgzRXnP@Z@< zT4X?iQ-CXwr@$RiXd9U>y5LWbGKvb!Q0_AC?^_blkNxA?&G3C}q>Su4%y8(}Pf8z` z$k0LKZG_aBVuMCs2~x69WWRpJ^1Z(w!Xewq6>Q%8bF&S3+&r8nG&UY~GHA`Ue3 zzyQq4cN*uHms94ok)p%gtDb;wky>xFO8ox4XCIME|F%7-r>Do``lzs^WO#7U{_y2) zkIg$Tm4z3Tl`+u{EqnAKf7WO4utp z(#Z()%e|TGW8~OZYFFA;dlr|9p7Ujc2|@da^e3Dx7+oW*F4V){PvL>W___0C2q$|0 z+sMRZ+&)VFko)vIzsvL^^pD`rq;FZ4`?r44dw`u$|>g+8((UFVyG5M_53qi^0 zp5drZdrNy2-(1<`T#tR%0_byFDpTamA8ZtSQx@-Zwrq!39b6v0Z^{Jof2J+%w8>)( zjh9l;Ngkd;Vri%Het(vLxqY#(r~(X`(@xiWQsg|HVT4S7P3NX7bdzV3%DKr$CTx;; z-BMU<>#4Sg6lA5ParJ9&79H>eEVFzd$ortEXx+H}H+a?4N!2=>mRmxMDn7o&hdihd z=-vU?U16D-5FqWd$zKCwxzch62p8s;X>iPKG>Joi3oto9|H)`DE<8LOFv|K!d>(7( zv`Zi6rlvMePk~-MjOrDnJUs5eydEHZkuJD;BJuQp0l?2|693VXypG@^T%SkwBRFSc zkPHY!OC0|DV$9Yav8|*hB~VtjoVojA>W>>5sKu0_N>6Vq(ad@V+`N!~FXYCj{GQ|2 zxe=&3+Ximf`4O{gBwmN4y`1alc22M?M`kra@51M|W&(r4)#(FwMr{#8RE-PIV(MtN z-7AoCn((Af!YP=k89A?1DtV&(HAyYk9l))3$#@I{CW1k3?PiYk z_p2XUs*(MV#bQcn)>WqY2qjKR7|(2eW#Oy`!M}##Jyy}@58lp)(Z#jB5dMkSEbahU z1%8;@eu$V)^VSv^KLz9lO+Ai7p~sGLuu!BCH-5T z=_4$%3kyv-4etm4f4Bd5K?goyrC~#Drr5!WR`l4>DD)B~zw)9bIJ@ zXujH4YZB9CkN=Nd$Y^K^YHMfQctJwI=yp}rSzr#i3>x(5)MvH9Zd1#q6&nNN0%+{O zd;F`pnU`)*>PK`~PSbfW;f(oJwpiE^=N}-}0zeQ6ZCc&|j!b#PVa^3IfC%IG@mqh_ zp9}RFD%{e5WTY(fRt> z@XxRq5Q>T@8uLE-3LejVZJ8XjWG{RRDef<_+Z-4^@pL0quwI^Z@|tUR3t1Fcu4GNHg+hB~*)9pIvs^KI?-|Kry*(2iQ@ zAd(q?Bzs5IK?Tg+Z7iNY^qQXl@6hb<)|4UcT#!+s{90p1tHMC)R>q7BJl|FJFC?Ma z!P5{vOTu~Z5(2bPZ=k@kKpp(9uBYJXrusKjqX7sk)h`n0_ZsnBx@p5($8L0h9bseH zY&SSWV%Jq$p7a^Z+AT=s=Cdz)M{a(4F*E5pQnJBCx4(+OsJtQfjO1?SEKNNxmoh!{ zG4R)jNA|a|opi@-H?fJ~A5_qh{1a%oh z^}CPZa_zT*NUs1@eZ;1`#TBMH=RM`K#HAHwoV}C#A>)2$yo`i#RT6B=JeBazE@h38 z#3CR7sw?#kN^y9bH{;d7h-helF*Mhse{K-PZ(N@ICHE}~3U*8nb$kiX^7zUB5`)>TtREg1aLkL?yBxW}Yr8cs&x*9&`&#XLaa@Oy zCQ+5_L$m<3u~)ZtnnEaJ8$sjSGu-{!y@eWi#^iKDENn#NuNW@up~$c%dTrb4GfhPb&XF)5IksV#cbFT z)-tza8M@3`_aJpV&eT<6K}|H!YC*xROnQIK8fQxxy{X5xr$P`iny_X zKz5Sv1vdEK6=9@b`3C^4(9snY7MksqO-@f^VPkIt&a3-(w^xyaaQ_cxYyyvZS^)LU z8&gwLyih110Ra#Y?ds}U3f%%=6^&sp1&sZWZ{X5$1lG4#=If`HYM@HVlBvUBqmKp= zvgNp8X-_H`VOdisL$8P@TU%$isJS9q)2xq(pe}{X|4ZzSmVLkeGj*d0rIgRdDMJ~MUz+dqk0Fr}K#={>dMV6)f(x$!EFM`d!K4uN z`X+je4+%#%dj@MBS_%N7iWT?s8$Vk-6o`QL^NUQ~d&-_zWaI0`S8~_->pc;f`U)Pt zU`AA3Jpx{?^aK^z@uI-@C5+$uA5aMZ(tNnTZ%G2mZ^y^y=5R?!m@z_t{5M{5jy)2f zU^ZhIv|Spz=lt;knOuZ$PAIVz4saJr4+%5Q!&#S`1PUPqvEq7qdq#Ps5AGiCaCRC( zm`n+#YrEOgSjBXTky3UVq+He2CHiXD@loCKayB&^s#o9r10WCv=vsJs^7#Uz0)h8``6fPB)AFl|v_$psahC#M8VACvM*wpqA zF6o6RJclyY&6a2W~PKy%*T?k8EoEg0k>UA37t>qu#`NaQi5`Xbt?UuITDuP7*FJv<~* zzi_gWS>p*f|I>UgJQ6r=rLL~7sQ3e*E!%YwB_*YDi(+G-y#bKP1yV3SXUt=N{J5uR z^k;D91JbzUF_yE8Go0FZ(j0XAynGDfIdg}c1TtDtdk^#&mFgU{$djb6Y;!2+TQzBB z8kS(vWql4mTN(ab851mzXc&iI19lVMlQ(q>BOo{OORaiQ< z{>j|`;?}&qN4cvAgB^KHIrfeNB?E3ryLi7=)gO?cqV_n_}HW~F-` z6N|7;rQq_3Am;H0u}|qZ0jB`m>@+?|yiy$thYPT))VngZGA9ol&7E8%`Z&{N1zE|M zSXerG_S657IdUtw95ABX`F(-r2|%xh(NS3d%dob#_Vee@jt(IJSrsGs*S%FXAMhUe z`T5OjfqaNo&O|^^P*7mt-Q8VhlJ8L|S}Y)lWC0i{N2uF-eR$I0&mg9v-!sShMo|TF zhpjOY*iZ~fxT`AL<+wLQOFs8=Mf=L;Jk5W-cv@rMj&8=PQ=-1RlYSCOpX;kAYz2VK zd;5Not6+M4R#-TIXKDn33ZZ7gOQq<=V__VO$bj zHb4?~e;*tCqZ~kj@hv-C{1*$*(cybmQStq|EwX_?n% zAerJh??hV3WBP#y2FOGf78V*Bn*Lw*20jPpu6Xe;vM@s5ACa}&yojev{dStRF$hzz?e!Gs`7SR!|E)4F0DuLHG(`$lqAi;A1B~tg#F_}^0uUw3=h(OO zfQ$8=WC_$hGJf1X|F?D5f1V@5UkNiSZ_}F@gqMqufYVM$CP#fY-CC<*alCE)@K2(w zi|+(q18>9N!v6~j{8I$~f55;m(Ea~iZr}eeP#M5PqXW|Lf7ce-3n=@)>;H>Be)QxA zkrTWFEKfkTIsy>r{LB9UQ(rFVx6-dvXTSlbCm_6fg}m#85B&a9;G-Vy?f@;ex3>fL zFRaJCb!E=Ks<^nAo|5u6fb(bTCXpuayETxaK=)xVGu)7)iV%9N{Ppg;U_#C}aQWQf z6;FCud3kw$J~a!A?H|~Ym*;7*yu1uZwa(7Yryc zzzcc}92UUmA;9MWv?nIjSM-q2;S4XbsaZhvsGvJSG5-J@N4a76cU$QP1|j zl@F%jfQAF2;Q3Qm*Vm|5wY?%);jimQ!lJ^Q4&w}-`4rTAdi*U)M?4%FORi%f?G`5tu$4hHxxGSxrvh>ZY>C{RlH-Wo!WVy8cd)$%vPcI0w#yvHZETcWaQ-JMXv{S?B3Sn8$YzBqx=Y0vi-TGbB3Z3XNHQc!o zyGOl1%MJ9I!Tn)`5LNIo^OOL!?Bz7WxppWQqlRPt;-{s;#A4V{hT@ah z=cmH2fCDZ%dI!*k?LTV*j|zZ*viv?$GFDi7xp9)l?_lc;tX9aA54Iv* z{Dy;}Ed(AU+!5Eke9(o|dU0U-Ua1_fYU|lGd2+;NHFxXN4%HN#f79CtPM-A9Inn>3 z_p`|WGlY|1BpUpU%vf#2=dUWh@~The>Q=vWYM##0d4o!o?T+ZBQPHW()0LL)arV6Y zY#C?R^=Mn|eOOvwD=+|wtFTUQYN3TY(c|2m<9^?fCr0u&!+$~k*_AR3H~^WEwZ0M^ zX40(X$ zmUk6RKYrqZjoBv*U0DJByg%zMJ3{#gR4VRn+i2~O);G>j|Igh5h*nzU(+*h=dNmRo ziDoMCgeug}qI2Wv`R?!u9U~#9t-b(qZe{S0=U7ZPAn(a^_zD(o#g2fs~`A({Q- z9VeEc-z%lo2?77h<>dCA>Tg)vp}X}zFsL<1fG@lNsJ7B=5Enw^l)GCSW}M@B}i^@>p9cW?DMew56u9!QDn~r;l$7Reb+;hs|F?0jY~mAH*cG zTPO71{$F7^fsT(vwqx+jAb34yf4C_EzJ$Ud@Sn^lJ*FN_XgIGt6*}Kd&Zn+qpv(*q zwR166#k?of!%lLpTV8!^uq|LxZRQks5#j$?%)pl!E3upOo9GC3|LrgGIKgSd`&u#& zcS+)9rqm?g)96epo_05$nMegkHN(zEa)0Sxz4*e^POLFPS~*S|)j)n%Hq4aw+24uP z^uJ$Ao~_3+D>7VNmZ_&1H~;r=Fmp8HQ!(B>S&94lu^8LWQcsuBa)gZ@i^~;lCb)pj zh_KKECOUVIUg~!5EFP~fl;-VTxE7bjNRS3Hhe$q=TpAa8I+-n*^z?Ko})hp_CX>Ez%t^;C@L7tM`#C zHDW=fWfpWlcua=2qr|xjysf5qXtk@>-ZLs`s-_HThZ$h?5is#8hM_2x2O$=^gur74 zag+f=T7Q$>J=y)>s&CC1CtMi|jtU-W9HQQeb+{Bby@aBRydevSme$PcJW0GJF3**B3YpIZdrAM^8fKk2I;c9Y7j56#^L{L z@v;x5c(`O!$9bVcO{(x4d{mnolWwib;$jN`oq~HY3xxQ;NJ`?FSKI=VQxA@gfF`Ls z6{|M@Yz6nvgu+O+)>xm4?3&74Uii}fRB zKv5sc_6-s|I4jtQ-@3WS?K+6E=Y0_W*)MkzoDr=eaPj-!gP4OxvyA+CjG7Mmy`dzu zzu1E(8OIvUNu=gDtG^bNt@l`V`WE7z?j`b1l&R+c?cvX;J^skb)x35??nYW5u%H9S zJXFQLD|qV?Z!%0QLP-6ia*=VYGGV#4Y`Udpe#zRJlMzs{t1UKD1^xQLA$m% zzNuSYZ7~!V%>gsR;OagxLSo^VsNRM{u=IP=pH6CQHzx*VtyMZXB-gW&ryKgodUdkF zVjmsC^%~Oeji0l*K(6DuVNh{{!9T~ziKsWFw2m@CmaC|PbB9=BRHCwfMfX0bS$PXD zPRbY+{}!FUyS`|Z_G!(XQq)?ZqMz>fcbO<_H@$S3_nSuXsP#WKp*Ek9b~LsX{1Ejt zBhzc~_5ug(B5q4D$NCegT7;&Cd9QwYA0b0U^)q4%46bPsLn8EQvZs?o`3e{;H$H)OCvPzi1OL5hTG6`F*dc?VomO6SsgY6 zo@{4mC>I#@T>Dikll3FaS=_!0izPLo*@vJIz(K)Ih0f~LHb3O8s#!1p;%HYev4Zt5 z5MO`oW6hR#m4rHrf5;PYMLl>3v~aLjXlFh))Lk*%x$q~STlv-o6P4fKylYACtAd%F-Jk!H0j zR%cJHMx%HnYJ{tTbZ-t-uWP}Nx{Xk9+u`?l94vF2n{?^4s-%=}ns&)cu5IDA9uriA zDazI^qDCpLwpO|P7ukh`*XBmS#e=KJh$oJVIv`)4*+eU@z>?Tof6o!C9qQB3atBdZ zv%M#?Su1|y*CG!Wx~}SI9u<@xUg^A@1Ji28kh1zGDz>P`BVnibFxIRrwn2W3-4LkD zm7&PTxorXC+UpY|(??ebqkm<|6b7VnA9ZK-8o!BR0>{$g`OTmf3@AOXYG$Fx znF+(BsGnU-LoCZe(XbEp3=dLP1L{JkP0_MSowOH4YfR4z?Yrl~AYhY4A2b#lM7~XM zs^g^ygd1pZk!tz?>M$s094B}W@>L3YjO)+$*Pa$n>QFycUH$bc%Q8WT#edhCo8t(^ zw`|Uleg#=WF0EN6ldE_&>Ps)$Sn5bbIw)XXP?hIq$UXg}9$dWKf3dZ>HIQ*>n@$QLd%zLr)m?wNB?Q6*^R7ch_(Do>$O? z{S)C~SlXbX(w(!xJ=F}}h#}QG*QL|s2piG(oFg0B43SoG4Tw2g{7%AfA$_l^)HLrm z_*zO&oLnwB)36#8X2Y9hw~rdB?TREVHWx`N1#rH(`$h8|!FjzopxZBnr22zM%zBbh z&a#GBfSd_W0is9%9&OqC;rLz747mITK+?7WqolVl{4)B}qDM8Zp9Ww-Ly3jAun(|g zkso2iX(CUncr}EQQX2o}eWaAca=1MYNAN9{g2<~It(QH$qB|~U`{mcyWV3ALQ&eE; z46FM~@f;b{;h_>=ULh%O=99JN$6GNtMI!sQ8FW1r zw{J#0YtiC0s7;Y>i>k>yv%CW4NA1E9e!>Eg&LG3;q_A8J2@_)DccUm3Q%-lKUo}Q- zLBpf7rJQuqR-R)TkXQ5V)a$@(X|#mHQ|!O-zHhR}PZ-B`tTpbKmDnMsi)+$CTsE3X zBF2U8CgvsEsHB_H=DRx)>JEmv1gX;0I!A`(ALZZSKp6q6H(<|@ zBh3?+Ewtaka%2Y4r?mER2q5)hsE63oNMmC)9et`->u3|ZPY-yt3Q7WNJE(pknU$6P zx&xA3>_w)%qJ3oPvu|dK+Fdr4Yg4nER@ORRg|b#7ouf)d0Gd#A;S{m* z0cv$H*vb@=#&kx~HqXBF%nv99*QSm`YbI@6#^jWTBq-VyKa=!Og|<`I1W{qitF-{p6e;y30BBpV32Fyf7|^; zbF=$iB%;!$(Pn;pp%co7J%jOqq=I8w6VzeVuk^V|Ntm1RUjBPBI-9w5+uct6iu>X1 z`6htDK+5z0AYDMwJWv+_z7L9cebjlci2y24%VqWTTqaxO0eMYm37doUIt(D!MEFG` zIG|zJz*~dr9;0c&ZgX#)JRS12&Q0(9wi4yl@ln`tOQS649KJp==mvTmk0aDZM$K@T>S*{TF)mkaFcbKJJS9vr?4dw?@ikwzIBy1su+}@(qdvT=eJ5 zKM=-Y$f_<}(rdQ`kJlhqL{DPhj#sd=>b2dlLg!)jGP)xikfWfGsByc2+rMD1Wnqx~ zmf;}Gl9qLIV(NMnyf<@>t=B3zg8%jxUHK@=nsFek@g)LI_fBY8Esst@S~Bt&Vl0$a zXXYI@2ufZG4dfGp1yvx>{SEd@Yn32PTpbJu*7F;>FGoi?^x{wHwy zijcf)hy}TOTfpT(k<6`C3H?JgEx1G-BUk(pQB60}F0q;UaNerEDJEcmk4n$>P7y7x z9z{NPR^>sx3HrwOIm!7zCcR@MWuwcoXSepsWNiuJV;E2NBw4mj0}8yhLs4q(LezSa zt*)wLscGB4*zju8Y=UNjZ?V|m?=r}DD@L8^F#y1S8yMF$HQ_wiUgP1N122-$g;1j~ z{pDW}AE|Jb#wsw+yfiu;e_EFqWSjoAli!g|Bf7P094aa%965a-PRU;*ucZU+>PY?g zRwshaoy{o#t*1^aW}LHuD~46K>T%Q~0DF<47J;EC0E%lA7j?=mV~{k^F|41;__NE; zhZ6qm&a-|IMe07`%jz*ETMVE}j+Y?Ti>%z4uN%-E&M-f%ANdrr!}^L;`l8)H2YCqE ztSe}Ke|>|`2~;)JFWC=GJ|QbvJwhdUi4;T0kG~x(jak-lbWTFKg`bMr3jn zaQ;TKnjumkw4s|7EZb^se3RaI@Xn}Jh$>*}Kp)1p{7m8o1d>3xhhrd>esu9#_x2x1 z9LKfKTVW0^v<@~qBMA$)NzBu#>ZSJi0ojEom0DHQa89LtW@`1QR8>o2lmqcy-#_Ow zE?OADP^oA&bIJk55O???O*bi*6|%GwcTk+dOJWt;QCkWR%E1K5WHRQcVl7=5WR}5Zrb(++ zMHu;LLmJA$n|rc7vsIswX!-N_%_H~JEO!o&@~!_AW23rxC7MYjpE?&mqaL2C4Gnr; zxh?hOlwjQvGm2PGUBtH+lnk2}j})`O6j9T$TRYaSJIk zV>qC>+)CtUV6lz>EaANsg^{)T_Xoh~14`hcNxS{&U;$$x#1a(C>XNe_hWow7_^=vQ|f_*E}$gYj%qp!~BEF+l-yN zG0>isq{AgZu>-OA98DE8Y#+bjJAv0IA2hb~d6gvOk|QM;!CLwB!VtFM^YV}Ug|p_C zs0>rcHE*jivBi@7>W=YzYg2f)_y~d7!zf)fA&A095>g2sINfE~G2uxsUP?>I|Nfd` zsh`-~ztnXw*ccG@ZgJFZ10Od(DYiL{$s@J1hjw{Atm$c}c{Inm6pO4(>%y$nX*|hY zAngvk+B3D_qFy1#{Q5eYM%P!i0c}o&2xv;`Ce?X?j~xZ$TisYjH@Rm85I(kr;AC5U z$>XPpn#J3#3@#VyMfnsxfr5ebIdEh55qvc19G{v3UM?86@$;yYR+Qbtub+0^8>i#= zC%zh)anElJ(c zyo>3AvVWTq95?q?&?tm2i~Vy=bB~{)rek%igW(wny~=H|0VaV?&p91ni{*Lw;OMe} z#O!hhMsPtLTTC|!>XAD*Z{ZHQZM!V?#f!?MgLd9q%-7d?CKi@14}5#~CDE#2rQo1U zg?Sc!_}O!C^ok<-!&8G${U{0Zrui+OX$5px<-$;G zlUMf5*3higvTHf061E2ero#drB;F!fn1&)m+AuSz3J4a=9b@E8QG+ z3HrsWu)iwl1S4Ew+h~o0b6d$4H7O6Vzm+vyMAlY|lw~)Gk-x+-E6~YK7vaKB+iRDw z$N#jII*U87oR!y@OWiywn6asbi7p>dWwokJtT^Aq`o|PUJE=BM0ExH)fEyNV+S5}n zfLa3vc)>8B7x6uBc8 z(+{41jEvnbbG^9{@S-2~Fv_e;$vkgtd<>yO0-PK6BZP3FY(qbC&A$R8xq6KmC`Nkq)wW6QWv#r=aE64M(fV4#@_N# zKbF)ql94?Oq~^i-uI@<$#hz4aTy(kSkIXm z9o8YS4>hlule-SOE>m*^2ls6}l z+k7~fdytNH5U?m-SS8dn+&Vl!yMroQl_b(;3^2O(>!67qQyQJ;17#Z|t z-8hErQewkYV|Yp2UE}LRV`@EjKI80v-rwZQK8)Ukoe z6ueXGL$e4DGlm(u3XoP*FvIYeb?M=&&j&5aCNnn3dI+8n0k*`J%okr>zwHN-;?4Sn z9)mBz)11KI)H4ifS)5*-IgNzY8)Nwve?4(3k zBY@7b`xgG}{8&=N974HC{9v1K#T#ez*xr6%Sl&z__#D|$2vxMKFSsB^?(sJ{jfe`OFY4EoO!n zGuA=tfUEeB%b!{Gm!JkX>B}55W^jI=kLInATPlulH{~l?J75MQzVkRvVXZl>fXybD zQ=mHAO7pY@h`1pXNIGd`p|g`2#`XOE{ZdwDTzwZSC(yVaL{UU0r>u%!rk9^UMxB2HRBPc~9m124-zz zAdas>*_08&v+3C7=fOQNjerL3Sc&ylqQfIEDd?`_( zZSYyn`%jMLLf_TQUq%<>$CbKO!->)Os{G^G8%83K?kr=>zG~6TF}x^sCK`wh>O#RC zWyLfwjn|OA5E@+dI(8j#R35eUIp#JqB~VJiqVn}|fk&YW*S1Pq60u?)oNsewXMG{s z!G)StTf+ zB%l&9qbxss-EWSluY0Ko>p3W7<`NF7cDpcEjaMw$1j|($2P0DdKH%gY&f(hovo^G& zQ!)MwOSBuC+ON_&VgTXUx0_6<6ob~h4DL`pu^P13;-aOA73!Ri+u+^&$Z>9$xJRt& z;VJ1}@jrk5=R$Z*<;x|0$pvboJq4bhZdQT+fmcY5#UnBr-x`VZoRb*K&MV;_PcnUb zeQbWqZKsjSU6X?bEkUf0=edVgU>RWQ&5@WBgv^7LiRsJ4~72>dmW%bx>xIEe2Bv6-v zcFKM7$*>CHL&`-v+yhwWWM!>ha=F4L9oF}u_KP)*$j9)ehv6%<1MahkSy^f-RxjZ+ zizHeJOKXl4f$8ry1owil_!byjp*<{+)WRjDIhKIhNhFI83#q?hgVtr>LI2|M@YC_9 z^si#^&pmTp+t|8sY0fLsb@lxm$`%w`3o*YIsV06nt0>9m=6j#iLK6M?7+^=2k)65l zs}VA(smI?^*Y_q4hyIK4P2QQ#6Y>HAjd<=Pqe9t7;!)KUEbrJ9+=Bn=-qL}Fsx0$Q znXN)0@Gf`j|Iq z%T%33PN9iBcV%vU?~aKi4we7)BL~Rt6o$6-!BX{I?hY7cEuJ~PuWp19C&lze@Pt3v z30*pS;7L0>Xp$$i?7`9}et+G+8o?0YM)+-WsFeqM{uz>TD$O@L`v;L>jCrp$M^Ga= zy;@|>l7)*zPc8Q@ZzVB(y`7(`T_pzws{%Uu`9vz!G*+A zF)lhyxxOmM?za5=Y1C z?JPIgnsj#MWXw&_vd+;M>2VB^b%^th_mD12QBbo$3foq~=T6k!`q=~?ORUofJ!((wk*WZQD`SAp^i-gO(I4SKb|+k31Y_z7=K3&cMfB>5`L6OP zzEZk>WV!6h6j@8(O2#qAG{dNt$d9fEZMJHj%V&MF=#7L2g{lxiXW2diz=S=J*KaJYW`a5^l`>7mS>PyhLJX? z)^Uh+l_yCHH-ptM2j9{4bn>@ZatTLvCQR|pX_G4uqH~Ro4LmK3#9#ZCx(aNTNfL4! zeJ-d;eWB)i;-dnL%Uu1G14W6 zx*CB=ya2C@OqWv91 z*f!qu7`J5kM&T&uE(s{C_!T*P=3Rop=${A#25ZWcC477n&xb7<^&t}bc%L^Jb*@iJ ztMk@xJQ;LVQ`*4bRERD_L7}CEo8jm|V_-JU!NWrhg`2-ZF}R&eQrBsDtn2c()bk%E z9A8paO-b(qEI~TF;ry5nEGizw4`A7NmhHUdd zILT-opFNR?%F2pM7TNBjU)x0JHz%IbciB!=#d&aiOiS>-@4f^+%H|_ROBwBS?`)PQ zs8lemSw8JBQJ=Xvh$Vm6vm^g_yfh>EtTvI%tj^7pkI+dSBt64uFlAp&w;1(itMV9S zL{=!*i@V!Gnjg(9zverCkvD%; zkyJ)Z1-cW}?0C;w$x-B>b7C+n`NXEbrIr_pKpMS-7e$5B8sZgww)u`s_PwuWZ%Y=K|@&O9ii!go5pm{@fYeKe>v6{jfp|-D2Afew$u$y5T>8l#*(kglC&k z`mwCfA6Ysr&_L}c`bbR%P@Xh9PWMyM${SrM+qTSJtACJ|%KqimY))@e`yciM)Er?Y zlhH^7jQB!6rRvk0^#z>*i>jYePD^a#Z;FNEc^+$p+Y%KTRsY5*k zSAt1BA)}F9;L6O*%2|+`o%}M5W1nPBwY3`-9a>UVMp;Djc?Ijf?SQ;M=Co!lzuc95=`jw|=VMR@)ADYNR0a7qO8JqAPH(xTVC>g(= zC3k5}Nj+z?na{z0Y~MOW6ID?qpbE`3)(o(0Rws zL(yhMk$&6Xzkj>7u4E-hpZLTVmo=HMcLm}u)eOxXzqYc$zJ)ZT4pkvtH#HL0?Ze1@ zOu3S}D+jHyR)Ughs_Le9@tE>^RC28UpoOUG3s}}2l~;j$tM!6kgHjHQ(0^aKC0c_2 zroupnHob$slO+bOJ4*M@9rONn>Nn1}0qwm>-FcmMf9}g9l<|DFR5bz*YWXx7nNC3M z`!JaZAC*hhphM5+zk1l$5B4YEgngYR3ogv2aPWYE1YA z%&`iIYjz8zpa46i2E?U!!-v8*LrnrZ8562%ZIF^JrlQ9vM_WHLkk|ZQvR^3|2L-iB zaQ4w|B9%PPU^lf@rPk{pK?0b5l`pJo2U;>EU)17=IJKZPV?W}PZ}g2^2i$H5wU8in z;%!d2^a@|~rZ6XKX_W7qf05?5v?=Ax8&^IGYq?5`8u^%c^&N62CO@8bqac2N$xvU* zJsi3Ib&~oF+k>|C(X#MK=QuRf((ZXz=|U_SF{lY{TZ>)Et2POMiCA32gqtf&3gzp2 zo|l4P5t0ISb-haAeC4af9!5s>7rh9Tea2?IK%iMci|O(K$7W>0n?lh#~P(3QJfW4wL%kJk!nx4iE2&ACU5AdSJg);(^#8rbAE;K`)@q zPwDhd;N2)S!C-m0jC%<)M8me+d$o0fa1*JD=66@j^G`!QeE0hI#69WshH4BWZCAR< zHnCQ-H*TOYM~l)Q$z zPKZO3L66F#l{)~#$FSJlv|{bxeWZVqrAdz&yiJ4&qNH(Zt~y3b0ZEGKmmvjcOTpXo zl!BsdXKXJ>#wsmq-okap_T1n~;@2@p-;A~`Jh1kDs}4kdmVx%l%uYieKl_@SxGBgmWk3W#Ub zJ2Cj)%_raFh4{2gvxm$%!+u1*L`>azkHpOW68r#z;%jCpE&R#Ls>8wlbs^m_^}dg$ZTvo z+MQ9SwR);6SBL+M2>MvE`Sv}Gyjtq7Fu(4K6SJDFFFmNum_p5cqPR4hVkIKyKY2Lo z)j2WC&^+?1@>VU24quUu$tD`GsV*^>|FL9E#8K@Zy4+#C9iMi^`agudWmufc(k?s% zmk`_~NYLQ!3GN!)-Q67$+#v*);O_3h-GaNj2G`*{to81_*85%GbT_NIMGxTzh$l`Ji+!dqQg(Pb+wcLTEIeDsdrQE{h0GI7; zgJq(zVEIS;JaA?nE?Pytwb8GK8;4H4(fNHX3_@T+7Yrh!r!TLmVPR)?IS(Dtsb~P+ z)7$uEZHPk=pE4{R$-NxZJ5o!P?}k+?wfl}V(IQUSycu)X8dWy#C}XX!0pS$o-*tTF zEqLh5H4rE-d*K1;8Vh7RPUQa%`&s(KT|#261>zis-afkDE~gf-pY7id5G7pOk#r66 z2JPv4&escR-C#x|Govr`9wg}FNvYI}9C~H^`rP<_yrea9+;dKs!M|YQl&NUV+!Y9G z<~vVACYYu)U--_wV|^gOim($fZC<{pe{mZLR}>#AFfa$;8ALy(2Zilj2azq;)Js|` zuy46keSd1(9Nt}gUY-%#jDT9-_BmN}xUBm1`7vPV-Huj2!to9Giws~v`k_{$0JYmg zNTrTi#gKUr!WgTiaq$Ch=Tsw0Cv#&tcOQWL4996j1SK=nTA!<$Z)b7ov9g5UqacF9 zcSSu4`&U+tPS*dpWu8WBiLQt6duQ=)rlIf#{aHH)fmE?`FYmSEj1e+m_juVoKM}F$ z7HJ{m829ZF(*Ghx<=@lyCPQu>JrgcQVL|z<(v)G$mtG31Cs1#fyri#i{cFU`mn7%c zCgT?r6C4~7eeZ9Z?klq$b;&nhlFbUvRXNWd5=00){1+Y7SqqjE7$Vp ztkc_9HqHQRB>itYI6{r6xwD^l|M_<6XmE;^&8MpRk0;{ly*#DP74(J`I*p&IoZN4; zSBu3mnC^W*#H{{4EKx(95FzXqTttvOB# z5mtzya}|O6sVRZA+*PePd^(fd!)oksWtNR%YNWLv5=0s)Pw;^|TWnB{>C!z8T=%F|g8df07>BEZD;+A+W z-nk_q)dNmakf80$+}N)uypQe6Um?9K0$D`!S)=tr>%An}`@Jj4C1!7}V$Y~id>-=a zuO>XZtThvh-umyHdGmCWRGz66*uo>pA?7KrA*cT3Z2}`6PZ#?jkkxS~rDvbCghp#S z0z&&BX`)sn=Zs`cu{y&WDbxZ zic8njM;JzFz}*cVszIW6GdGt@F!al>p07<@Vs+gH$3`-m(-a^-D|aO=jMeE0-+V1}z?CYG=8<%4+DQC7x*^@NE^?oLXMCNIp&JwL zP#*CuqT}%odzJwmgZtwikb4Sl_A00tUEchq(bR^Qevku!Op4g?kiPcUK9IqzpyH<> zEwG~OL;rleT2DelLu&`TmVw|iAXeGEZPh0sA~ba4j~kE<6GN9MzlVIZ`&k=hOlEt~ z@gm-r1)sY!v*Pt)MxAtBHp1u<zIA9Pb#QYf?qgrX{am>mp#qYQn(0xoZCY`$gYXcTKTW-=AMVgnLe(grvi zO?O;b3kofu*!fWWUC{T?53;3RYE$DGl=jHoy77r^9SUlm0McRE*IR(m^#;o~)+&i?k6qn-&KY3xtDMdao;nz>@9 zUL!r`?mKk+4;-`*=(ijK)`1pSNks=KKdc|xROzH5)tGxZ8mVp@tc)dAf3Lgsl3I5o zDp)XOmX7Kcow>rX5k)g3(jO8YMJwzY4K?9Pt2KH${LUussw}u=)8)EK&vF8j!pyGX ze|!4io($gWcdx-5>ePz7%p3aPq{zrFv4e<1UTDJVZzA`A}n-rcZP}!h6ZXpdh zvd^yRPJlbEcVt?h1bg2Su{)}I9ftRYCCg8z{ElYFxlNHi1JVp8L-5NUXJ?{y{*X=tN+Ot`YqHicSz$;SF4VknfzgRK6Xcv-1#{{0QkLG@^Ld>w z;c8uKiH+0~t#c<|%no=bpFl9iXU;UT@i*u7?-)RTjX5j6wM1C$Zj@`jugT7(d{o_F zl3rJ8IK7pg^@XTH>m~iX&CuF!%x`cB3T>c%ZV}LBKuAK<$}3(gpK2h70Vm(xw2_P= za!po~ahL9O>$L!e8O1-L6^1I)D2`e~eMJprP4O}$ z0Rc%E9O3F0OSJcEM>g&bwM+kv^*|96hl;giQt|=@X?SRDxv9t=3=HkOPN4n0SJ=w8(DC`Z+}nXe}8pp1b$L5hb1xkbahGouffTfg}5so z*Zu$gs&WHdp2Uhb`aS^Z%`@-6dxDMyIPd<`YZO74;Q#L&h5kPum|vK2_@OX!132R> zi!wO*f0i7W{S_L>4N;t>m|{RVjQ`yIeR4#{EB(ZnYdNMfq0bDY*($-n-? zN3RT373x9pAI{owo12+&R%j5=M>Jl3Z&~+sauTf5)!2uBRTvYlXAqP$gQ(!~4#aDZy{jFZma<`E#wEMP zRLd6C<{!4vri!KlA5D}Ue-9qP~rM;9=TU6x^p zg2~uXD&sql-Em|)%!_d3N$NQjsQAa{e^ww|6DNgU$i4qd*HGfb0~4tA!q;u*rSf)9 z%^p9a#V>nAK*6xZipqacy!+XEF|g&#@AOk{CjbML<}F{9_{k6Bi1nn zBgpRr-%fRYvn`OPlAz$Z%0ze4^nbAhJUU~K7t=DIh~?u6mwHCHc;ibdL>fbde?+!>Fl(U0LDOYnphYZz z2kZ;~aEcZTg*euwXJ*#5;jsV=sEpX~;OwVPNa<45nYNWL=x=R1&s8Q2#@nK>=s>M*Zd97OQ7v1QD zIX_EhAQ>~G2e8ihev@i>?;#dwhKoV_ASqOvGix@AS7S*8Gu6Dunw|O#R6ThI`CGu|bcJ6Z*ZpLh>~B zdQC>Uob$GxJwF+5+fx}Cj1;vdIDH6JTJfUAp!X|-kaw^z=m}>bU`YP8(*(q9B*T%I zj0Jxy6t!>0FK7v_lv&XjaooTY`jv}_Um@3ET?w6jw#eA{R%gEDAL>US>QrzTNlHtP z6xIfypc!liBrya@5tg)7-m(2POZw{dB_&743pE?6S&5&3azNf=Ah!!{P}9|!EHGwi zULdSQ;N?Dg=>&W+%+S)(^2pVrtJioRMq8f5Y&|p7;KZNl3nWF>8JLA@T7Gru ze_aUDC^ij`ugSd&WXoH7uw0i@X=8VAz5 zg0Cxl-GRg#bKyxpg?E8G@NTH+=-q@@P3qnJ5S+f?r(_mWV8ff5ocyy9OgxstcJy#m zvG>P~>_Qzb`TQ^YS^H;`Fa=5M*Z5UG;{~Ajt4AwFW-<_Ln#^v!2w;WFrE~XIe3^=3c>Fxbfz6o*ewRLcMdivzLXIdce zIPME}6dA#6^WR0~Lgxg)mVf|1a<=G*>4jwZ z==$dB%E`q=5$Ktrgk>z%aK7b2n+6W6GNpyqCY20snF=bi7vPio>idDnhHGeGkS~|H zIx`~zTtCB+7~!<)RE(N9a;NXL?E&;r``G^3Noat?2f=m-V-*981eW1gxeDDvZ&@J% z2nL-ZMl<9ExS+oicsd7ikO6r&u-n-LDe7rOTOa~r>_d$gfV7DkR2Vwm*E5hrtw3w# z?GF}N@^`@G)O_?b*ARz;NMo~5K+(2b8%gNHBWF-T5K^gHP{^UT=#AkjsS!TJGu_{w z&4xpNRQLH(hY>2=eSd5e!3iYG1Sl-lg2@jYSowfYf9q$sz5s^RRKDyZxa(}ZNnch# zH66eYa7}OaJ@}c5TW`_QCI~>w6``Okn-)34Ig-NCYxyIw! zX~OH31=0x8R*p-@Bqv2e+IMljDrTh5s8dJPA!}Ek)j@tz2$TKIVZ2>?D6Bp+n3uo8 zMfx*OJU8lQ9EH@hA%|7aQX@?GFoi%Ud;%h5y>v_?dX$8E6(U?A`&Nxrky?uEt5g== ziAs$8*kLI~I{AgHUZa!_Iq)Gq-P)^`^8u1LE8jx2fUpkpN2@^L6$c+EcQUCG?aJOMAld6_|FI)x=XZjexYl^)Q zRa;7AHUg~im`0ps$muTge#$DP_tZn}91e6X5rKh8 z03x4*n^pcBkUC(;X;Gcgw~N~5@*#($X?la|t=nkt*YDjldQj#I3e#~~57Nxpy;088 zq}snUlU&x|^{#D#>2ae{KIU1M<*?$8;W>xVx$$ir)^TNjM0I&I7|P!MZ7OL!RQge& z;{>-^C7r5-`@LEk+Qm3y{CV&hF+?6ku&@4JR{rd40!FN%tC<~d-n71-c=`w2t>Dbex9TD>ig?vuot-Is-@M>hCrB-6`pb@X*v=Q`)8+?=6Q1f9Ua{7{%wK}9AEO7nN?oDU`4TF5LiBFQiCfPJ$j_mFEfynk9{;awzuCG0}8(IACdi z(%m>5owO;cKNR-P!L9`aChF$mH+2d(4@-rCM$~V*FoSvCa)j`XJ{jMz@B@?j2`lCv zfs6=gPjf(q1kc`F+TCSFQ@5pL$L=)XxDM=?Z8#g*BLLLc6R;z(C~A^nAF`@g|6=QW zIe~HkGg)mOwEsZHw;NSizEWz%%YgF6D`EeM;^wI|&1;s5kNe|pW)-}6eFIi9Le*gmxEnx>L-df1uK1gydkd=4LHQ$l6b!hE*9B< z4*iyyY)z;5Si;C-F?*!ph}073SHn%q$)M)87q?C7JX!tIua3Nb-7kj%Q7zw*yj%Se zO|N3`5TB@$P2|h=qocE4D7=1@{%wf2Mt_#5?~iCiEH#rJ^&DAh!TFpzIuUgl{i>^Y zW3B-URxU@;+6UOCedHhF$f3@l6e)5_6pdJ0m-?(l`XVM%fie)(*WQI7io!&U*?hce z(?=}(3`RqCVCyV3GcWx-cIx-oI4I>Hzv4C!i|$5NU)Nmde0{pIj1fHAr~K=aOhPr2 zouRCfq2*BZs5dRbnN}Qg8Jhdt_KNB|&wd#P)g3eD7 z%{{C0BYH&3DDQ-#(Z|F6{d12tK#joGq9kzf4+rw)CeP{YIdB0RY%9)&J>Ienhq4io z(hx%BZc2M%Rv@#i;mmA%6Hn%)NK6Inxtx|GitP*9-0j!{$LteE#f_$sVdNX)G|_9+ zf%5KeYtgOJgAiKo&>4-0YlIHglYi(~!|#E6nuq$w?LyW-l;6>|Epi#&FLF662+XK( zs%I|p_RXPr4DAGp7jN2&u{&{l1SJsU(?4u7C#js#%Rp#^DLR#L1;tEn)o~RLB1o^F zXd|+z0~npdFPMABH+-_G1YeAVC`%O{Fa62*N)MfCkr}!}T0reetP=)ND!Jkh2Zv?N z6Qw%?2P20mvjBrkq!n!&mrNf1gev;8J7%C6HIF>MXJ#eG0Ij!IY+A~`UMV~HTy^xb z$@P9=0Y+2TD_IMzOoUWHLFyMn{E~ky#x!p`L2CHJqLL-&}v3x zRrh){ayIDw7#>?gi4~n<*sCb0V<}DV)PzgHY>L3VJ#Ci}dA{>Ms)u=Qfhxmcq$S5^ zJrqzKfcb`ZP&$TS?INWRa7Jo&e;x$wdwtb7vtG+S6F_tv5NA{iL#(TbUlLo>L;L}2 z=h#KK)a;mddK$rgVm814Uay9Ww9Qq@P)5=`yoj}_ndz{BEy;LdQ7v7|!h%|+$UNd< z7;l8xCo1K-dA<0(5ih_7fZjY@&d{cF=6-gM%VMH6Fl#cB)QLH?4g_X0#@+*14+KRr zu~N394EBq}O5iJvRu4LxTT^aFXBHTxo_kdR!3%DJ97El`w$Pr7R&r|Qn9xEK~~pz&nNiNky~Su)c#G^IY(Fw!&&V@r*<7hc+i!7 z6XJT^=e+z!7zzZ1=|pA1kNxXZGh77Czv!UeT40!~<-QkGU{0};C7*hmYTr|-VXzM7 zE@cJzEyfsD?)*~DQ2}ck7ms1x?Iwt;;Dhw4%5AeV?*q``l0`+;A~m4Cb!T0kOw5+x zYgU!^ZmbhEiNoXAPQ7ehN6r9qC8-c*)fR072+CW#CzkS9aMjA)H4hh5a-} z@`H*5>dxK8Cqg!L|L!W7XGbo}X=-YVJECJdpq}ubz&`sC9*Oen9&xF&Yqf0+wfa8( zyV)B>m96ndmoX#xuiv^*Bm|oqYdkaoP8eRNQTY)5^_``l1T$#@q4R935v_Or7pg83 z?b!zlQ-^?l511OHw3#KV=FvP-k__rmkLJE)G!k?`g}M7{V30^2(tVY{+2Zx+A#fIH znuNF@%iHbN1{`&~Msj1N^6npS&KlU$3huO$zFY ztKpyF7CT?e42xfu(J-UTt%2Gvzl6fiV+`Q%(-;M7k|5FmiJ;rja`~Gh5Cv^??(8%d z1Mq3lvxDT4MDjMg;_}~yGn}nEo#<4>62iy`YUP0)V7h}rwwO6F+j+Cl9AoyC@h6m+ z?tohiU0of>%$oHrB`W9k8%}j>?oV0WUs9GIQAy#EkOKQ`0L3PobnkGbMHQCPJ~)Rv zdP~N)F6rIUWBX`tZ~aSVTT67*X6q&NOGyG;+^;y4-QJ|2E{k)`*(!-#VQ4l~|70`d z1l!ob>dPg(IB#MyeE~zQN=Y$MFv)hL1xh7A8Tj8kOb*~Npw0Po;hPsbS(+gC_CG`BUe-gfLJGPckD;in>L|d5H`}(Vtx^9v8ul!#*lHd6j6asZ1&+hw+ zoA}~Uvh~v(?X|4$rs!eJnI}2v!TXbeS69T?yAu@Ytf(xg+Db0(jbW(Jx?dLEWfqtw z+dzJsrUSA!xE}n}0(F-}9pfTl1N|$#rIKGM_%e4X79Qe<&|3Rb1Q=a{-Ad&}pW0S~ z^6dyRosCK@@tU6a=Qw9l7@Hw!nl#)L^At|&We03Zd3w@~-sOeKtNsI-W~6HI>J zGqq5?z{qh)7~Yf0SHng492MYq;}NV}MsmLYlo#y4FK8 z4W5`m5i}}M>Kp3RQySI3EHZ35hEbpyP(@}VBAi&9eiYJ8^=Z|X3Il{D(4HEYtWFW; zEB_*DvH@Yw+m!Zb#F5C(jSG4GLE?iez8I?kcWGGZ`%5Ab*9B*Fy|P2nW;Xn|4a~c8 ztlom75|IRBCh}q^g0&O7cD#GzIw4Y0hlkp901NKCL}rZmcdBis?ipUyo4(2J_8)O) znzrqXhbeYqIL(sNaqd;@o0|kTIoBxEZ;oU~} zQ9buvt&aN7*$>7^U99QcBeza4;R=)c^!is)1CeeDU;*TtKS)opQY!{F{mf&ws=p#* z)6dSu8sbd35O0+4Q!V7kn|9b6H+%FtTuHs#Z(%)qtIBvv)SA8 zyhbx|t?AF8e!ws&=B={9ZIw#wZz>^|3;!93qC%SLN7ion79�LFu<;!HqLqzV#eV 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 literal 112143 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 oco`94QucNZYGYAy=Gy)L00CWL^8f$< literal 104913 zcmY&<1y~jBy7my#0@4jCCAsKMrBk}QySoGdK^p1q?(P=p?vn2A{^#3gpMCZ}*Mh~h ziZ$;%b;lbbFDv#Ii2w-zfVUFjUlafU-UR?)oDrbGM^OC3Z@@c5J8^YK0Kjni=Lc%l zgwzdu@ST&0nvi{2oc#c3>NA7d@a*12driX3`%sQ9K8mz7PMYn$Y6GS|;cB$?0D zXXdCV!5)Twut3N9C2~{wCI-El>h|TO5&biU%XEGEZHe!9$Fa8CWi@QlbT8EW84D-? zK=6m8j8MiFWf#{s*3!L-+B>J!7T0$fF+=%34eH~WJVWxHSe^0c{ETD7V0Whkn z2&mu1ncUp@58|HT);VQkawp7K@lZr_q6xC5_BkUI^VqrBBFPY92d3wjtBrTthcg_u z22lY$rX-Jm^>^hYLZYGGA^1I+E$v~OoI#tc1aEWJ!C$^6J68!Y8&I8@9F6Bq12v{j z7So&&0)y~^|M@21AHd&9in|kFdX9&mdl%o$k*RV4%~htu8!w0{Nt!Yi5fII(s;QaM zgFup`iwC9Q0e>kC?Bw}($zg!z{HH;{j{)V9RGldniZ{9f~vWNpu zKEwo4UNjG18FBva|IZERjQ&`Ey)9zfIq~Z9+^`p3-u2*dce$H6#rO1vpC5wa=q>d|IWjyn#TKO3G3Z8y z^d%0y`2#GFC`~DZe#LEG)1~J%{Zl9^IHVS}y;3Rqyqx~E)MDJtH49%%2>-uUk}OhO zo3D`DGwkk8umt6$`i-zK0MO9BQ|ZuQz4JLuF9?3ibH%29W=Xm~a7JJUkY-lhxy0 zI-}gG1*>M^B5;u-Jtz<^^sXm=NGmW6CFW(}pB@`%)%3NJ4rtp;V6S7%KgyyI-YXD`xWnD>0+W~>i6Ixzmc&`JaI&30ZLxnWR%D6}4+ z9xH#aI&!M4t)@(dhFe37YnWc5aR&-;l`eeRBqQ$c}w148!5JdwI zf|Z4towMT90_{CE+bxzwSu~_I@yTn@pW{wP*v>hy%J6T5aYF7(iza zF$&zC(sko=ZwT78IjJFQ`xv!IaPeyh!Ue69z}ub!5mmM(9@`|*9($q!=bX*jU%3V6 zCnGO*LNOz4KH;^I&m6hDn;CWu!#Mg~=mv)sX* z24!FMcmEA8WB0F5XNx6vH$+;EZod8*q^-}v!LQSiR7wV-K0{WL!+4@~0yI?_8Hbv-4APMG$G1$CpF73cEh z8=D;5M(N&vJ{{~HOZdYbE=UzFW9{%!&m?vh)~Wrcr*qn`0jF%k?-RK&5JS%ViG4gL zlbqQoPu>8kGjHR2=DR&ZGmC@fsXEKbGq(PpZriSBTd`=z(eHjie)5_WS}?i4I=dFI zm;}JakVE<9LbH*~c)a_s>f=K%n>wK0w2m35A!Z0|>-0)toW zzGDn5rbMy~Wmp7E5R~Yo`S|MWk!Z0+@hLV(Jt5REr7K6&E%VYnzG>gDn6nt-|jQiipku{p#g?D)8e0kVrfUqzhm`|_3d z+3@WfW3tFJ5)q@~X#7mt9DKkJwo@Ef#z=zFe*XW;;E&I)G=phZ1%$T|DMe1cU z@6^QHox_tLuGDc|<(=am&$lXhgMi;eI3)`rUO2gZO?uF})iTkZPzKIl-;#ETr9x&V zAzN55RwQCzZQ%UL@xMXO<#QiXr8H)u0#=-t&~=hU{PSmzQLjZ;y}!SvFLxNu*da8KBJOF+QJvG ziIfFFFu%(d#13FnhLOEpMEF)&*_z|%+1$$1y+FeRz_6=HB9kyvG>74Bbh_>^(ge4)E?} zqQsDWnS$Qn_w5?!zx=jp){Cg9Y9)csc6BLIGi#;Q;=Ng1`< zw~u*ue=zc6`uk9w%kzzWG*dPh5ejBS#um*4rZ8AwZ*dO|yg>iej;>6mZioXLq!2LF zq;Y~rH!9O0CNrVxXnVI4Kh9UE*Nf&&6kY?Y00enBOdgG;!r6ko83Rs zxkackL}A}}v^Z!j44(@LbHja)CL7Mh&z#b;F;irM=vCtZy>*tjFZGT~IX-4v?eM96 z(&*S?HXG6^!v&1o@DKd+p4S%BSKsFYrBtof?qoyF^i0203@%=c4r&XqooM3m|Kjmr zxHr&#&_tfn3Drxu;r?{6iM?-2FYU=USl~{5>vs2jGba|qAXWjVz*Z}zUHr&wu$w-Z zg>a~bWy+&ybWF{8b8_{nRyo*Z%rlCX7-6`Jw(^T%6do|EZAJ-|XY}9e!RgXaeL?#A zf*X}9Vas}W#c5)~gwINJdyXajmXL#sliE3`QK!7ij;P;!r0jTm=GvnzLa2a?1z$RO zVJZ&$X!rQzm9c%JaP;XBRXPNJnnAjr5EDf-Z8Q@sp0IGtX|uuoM1YVY?BJSoU8`DYj39J@|`mgrt<p=NaYdoMmbmrx1j*>%Imy*=T)T|Oa~)4wEhsj@+e9lobiv3k3HI6CKv+x44PV6czAej+4cV%9^DQi zTtpqe+-L$}U71sMaN(@uopcy?dorR;!sQ$mb^*n$Ma_~~Q;CRWDlp_SWo(V-iJbb~ zP#lEP9{K!&xDeXSCNAR_6AuCbflEaAn^hn4)C0c!x;?FC_fsw*<*{ zVNThbk1uteh7b8-&sPYYJ@Y4#WKKwL=Ti3BjIUPOdRmkQ^F4KY?<j|mk73+!pa|odHvf`$CR}hQa^RH>&(r;m-vx3 z$m+C@b~!JOrCI+-;mS&A0iRy#cG$4LhtY~dp1N>YZ@*llc+20=o2y#*79guAv6_To ztz8^Rth+X5A{4Y|VBza%DEV{ab!R;J>+L7#v0t~U1w?AzX5)u=_%7In7E=NjFInZq z%%U^NP}aA>{~N~_mYEY~$tfu-%geCPU5xq^U^b&#cJ-*6uBnPf1(!Crzx*juB$tTt z+k_p+|HdL~YaLb0!=t^xfW1w@k5ZkNS5&4b2gv4BDO=Qumf7zzd9O6S`}XaE9slj0 z@d=?umYz}$d?#+QN?eSMl7mBvygn+Bqp($RdNJ&FYEio#p(}3$P zOU2#&ej-QA(9p0zHqC;MAx=^*mGd1TAt3?5L+9M{P<&cio7eq?a*0aY^{nRXCPs+S z^}$SuN?9_W=S_|V;s2n83&Ppe)svl_8>zxJ1xqtqTi3?K_0pPC+E&omb(&m&_ zhi0{b06^5F@ZjO5GzmArZ>MDJL;YpKlHEovWvd?!*uSr%o%L}UEw^J#t~1ts7_{4d zahB3uF(s^{(`xdNp!RFGdkhwEjx^5C+qu0vlxn?eiF+5`gwKPzrFxyrI`frnIT)W) zjOWF9C#^NKCh^&W8>gx03%~%Wo2YUh7PA>=HTMuf>yQs?%{!woZQXb z{o4BtYOo@B$jj?#8`9Iz92^}PLGa?=74K<%{mOJ!7x?}Aa1u+uzU!GC78X{jfNy&P z4})g?@H(-jrKK@*k~c9ID=RBAb9HH{)zN$vJH_1^6=1uXLv!N#q~5^oP4%! zb98icXJ@Bj&1cC&+1lEAWMl-4>Tlk0_ZQnkUROQ-cO%C z(U$bB zl?V%KdP$_Xq$HArj{p~Ux6&>(B}G$he#R1qnD{NAP;|B2Y;CIUr zi&Xf?{&GL&yBG$+3)|Y-8XS}yGKLqY!=WN47d*wbdo+fJgJV#u)RT7=vQnCv;b7x{ z3VN5DwAsDGY;NcuP)tx2emiO~UT=Roy_*YwY zLK#VScXxF&vw3m8XazK6=B^Z&HGTnwgr_%+&zM-G-{M=y=%Kyg=|=rRK7I5Ieupp! zDdHYN)e3pYprUHaAip0vA06~K%+XQo2jKklVM9s?x8m*LA_-Xq*r{hL?Bu>laGl}o zzzeckK6agWg=tH97BRvAzfLp>&{{^VLa~vu8;%x`XO&INjdL&x9~`<-574^0Z*lYB zO>M>B{m}L1cd>kN51C|}<MZZQPnJP2`+YC`RM2{Qgb+gPML=l zM~TPwqkEQb?mRd@7cvu$R<4q;0Nyzw?)ETWn@8LhejejbqGLl(%*k@_FT+&+4YsQj zmTH%_3y{ZX_-!!Iz!hX*U|{Tcs_y6j^O(nlj*AN)I5;?{uC9K0KK1SI?Y&x&puq@% zhJh)wELA9~Ei9yFXPvYxe)nrr9$VzIW^J zNu?#)!wOdPw6w7UM$AdW&00&Y!58TA&PG&JR83ksT3U1%Av>dK$SZj|00I({$7$QG z)#yP>8#gue4-eQB#RvKyOPL3os3l84rxA0VhBaxNS+4FIj&f%gYP(MDrgAyy^!X2# z+4wv#VHVu7c;6CbsXw3$Bf*$cN=qsSuj+N$5d^&>M>oMZ&@{sQ9Y%=~6yZXVHehFb z!3LMpoYP~)%+u6J@D?sl>+9S!6f6{g7w~PueA1;(!S;6((cADdlH=3;?%RC(VTPyZVr8CGYk>pAo$w$?5!v$14i8 zYcek5ZLO$zMJppZBXA$qT(n4KO#F=Wt)r2E1&W6>iMJVVm6~nMLvLS7;|$uZ zXTr(MsYUV+P@lqm_0AIuQND9{4nGV; zlCZoxopWJ3`XqJh75xeSPfep(0qKu=d}Lqmx$|#dn7@xMz1%vR$2I|(jqL)*ZCB4X z`=qmPM=8~3aZBR8%r*Vx7S44-fy@)92eCi^U@X&Q51{?7ewnfSy70*&bT`JkL=hGs z%J}sByym`}X4~=1 z&d6vxnJdALEfE~v$-d2d*oz2Mj(rSTouUf5;Z!JMrK7WwPdK2bZOY6P1c&L+j#>I) zErz*^h_3};a4qeA1FNvwVE@a@3pi6>Twg1f%)~pm$jgs|)f=3yzv}3`*lm1KqEU8q zysR~!f>Y2v+1qp5j#IUQb98WEw_Ua3Gtee2P+;5{PEyp;;&t4Sezde%ZC!Bi0AoI~ zzvfqDflSKHdN8SMI&V{5oio^u0IZgbD3K#hfukFQaN z1Au3#>$V;!*7gAas?>-uF)w@21mtxGw=cT8yTLv-rO-3-=Z~4SHL+~9uBfP}jLh3> zkKNI<^z?KzmiXM(*3|w@cTZ2W13KsW{0u63O;Nb51l&m_l=fCQ)ew zls-Qq0w3X|WhB=>v6<4eE4Us2cK)4vtOP(5p1Qn;X_$QGlrx6t$B=i#)hczRG9@#3 z;i7rMSyL7%Gs(#~TtWJv^3fySw%VyTnWacOWu~pwRPM!ry5jC-hZVv^dcAZeWjx(g z&so?3B{Zc!8;s73sm5>{8Nc0`cM_S~Q45o<#ht1dE*+A@njHEPjoG%Nj$$gS#eaK1 zC6N3}66jQ?Q`N=AfB@sJ1mR`OfL`-uL8l?>*~}$BL&u3tCNnpI}n-x(EKv%%H>l3|N5zumT^aCW&S;bLR3pw&2Nz7OVHs z0YA5)mMY=OVon$Y#ko8xcWA+xNWvY`M$)c#*TFNEv7%M_eG$`+vzurk$8bJsw}~@4 zzPB8YgagMfPTa&PBXEA9p`kZ7H|My)gmP@bJ_!wESTaY^LEEF8mtynb#!zT6b#JK z>&x35nzV+3i$8q)IAg(f-Igp)u2F3y(Q#N>SXhbbU)hR-MEoo?$y0pkL1ro*bW@7`j!?=Sq(!Y`p4i2Rs+2|^) zABz6XuN(P|rt?X8e?bGlsZGy3i<*I9bZktwQV%L)?DX1*){8&mp>);v^>OW;7Kw5b zDk5SQj*6ycN?aTT7E-W$_pC*oSR@Jd&%XEv2OFDmB^nu7S(4EkkLeD-(pYK-M@M7k zh0!#gEFS95c?!>)q_3bN1^nILN904EVm}IC?kq-LO4eeqwYClq3E3~(pU>BK2eS_a z&JZj}pFI_f{EUu|VTGb#g$kwuM1*nSV#Q#?EO6PE+qS#IeDCm4UH@ApHm z>63{F1QDBfq8NJQ_6)HwaFekz-1~c9S}=0>CfSfryWS z7$j3UcHH3r5c6xT2nOgpuM9jNC9z_GYIt#88K*qmZAKe>I=xV3tew^wS-xX~-?9XN zc_IeSzo(&O9z*Gj*fpw0O&y3j&q*scgxhb`%&at)^1*U&#yht#2>}P859m` z;9W}Gj`t@SX}FC!X0NU_TIjnLMIDo-)qmnHi_|PUC4N{6Vr|(mmV5{bTnB*VJGsaq zfj0nUMt?P!PXCa_tWpS>w9Ahc8j+zfTd{9FO-|*Iucg&v+qae{`64(lp30g$Z%<~+ zG>h8*#!|`IEY+7q4h$tQl3Il{H8(%}4krXt$j8SA3JTN;!j(djLWcmqogEWhU0nfz zj)DvyZVnC(PR_=)jBR#SR=XxGG_*+m9ZqSZ`hC}+_jxD@zkVSEc0;K&l=Uzi8G3yd z7S{1RW|LZJDlGgn*`1n^ak{aAfsUT3P~`J+zYC6NQbpR-SUPPUb%ljL2&#S+6Ek$K z%Xkh|;6-Pm6wC9^Gn}?BSUtNwKV1KVmYi+PN0ojDHZ3Vk{J?yFSVSBR*+#(BK`*nfeF+V9CoQM#$SOkkfL^Qzh;BR|Z>%483~0`KnEUx7xTvUt z7jOIEl;iR@IGLH5r!Cm(a=}SAJ3ITGr&6!%eVeCfPM0*nJ}Z@+DjFldsi@|&J*kO8-`)B~28 zeyiWymWzuOI;4}yQVmEu9Rj&5Wo{~U6@hY7pKKj-rnXEqnK8mRlspeNUE~l$4W0TLIv48ks+%LY^9xh*PjFzq@-hm1}cj<6>G-PCehgX}Pkp@^W|V z^4{wJi4KRBjm?=%*|yk)_Xj*ltB|w%>1x{&C3+4An1En+13R6Cl@+i1MXoU~Ir$eb zQ#yQB@_V)ZbyzK+jnB+n|LqF!wxuysk8$p2{kJEAmkb*lo0ynbLP8>*f4iNdzSXL{ zv={{3&h(_ErHzboos|iiQ_{eL{v&1VCl;0|AN=Wde`-O)M2*G8rt)&6Jd}P2L3mf@ zrZk-Pj9M@cR|7TcwzEQ<3XgNlyxE66R&D?hFv-D(pum6*tGu@|q^FPTu^bAJn&i!$ zAel6!uXEJas#{npDs=>AC>l`-V;2d!ElzA58naFnWg$cMX^)eq`;^WTY1#3EEhcR$ zc?txG*=x=ubl+a<4m_U@>D>Ab9On)hJ5^V>+AAVX?KdpN0AMH3C2dr{vwfG$4}Q!W zjh+DT`=0qYGBm3`48Amv`%daZt4nW}G+{|W4+}h*2JB_&0ggai&x8YK+~R4^^~Qw_ z;D`GH?Z&vRJMqQM9KP|sXYTUv1xM6fLDnjwUL}Qz(9!f)MrmX2013JJ)fjf&#-d^~ zG8yd*A$ip~j<|i;oHU>yn9k#7HvbiJKT59W7wthjtD_apga;)TPAMKH`f&@Jo*lP; zkCigA|Ke{oU#cBtOIhRWylzk@hC0>6Im0&J&!$4 z32>in#``o}sdbkJlO&v@dtZ)lXx3X*ktDI0j{aE7Yieq0K;r|^HVUx3vO@onm!zVp zX<>bf-@`Vm#kA=(4&}X0&uSWvYvInuH|cs*#e5L8{6p4*WtWNRYsH+Yv2jSB!H|bA zn9k)|64?1Y-Q8b4e3g|&o%vy{D+ljaqFSNwJYCUtldMFuQe!G-+cpdcu1vR|Cl$Mj ziHcshwZ20f#8XP(xLRPg5~`z7tcWBPu(>CD57;#=gA_%`7vaEgwcj9%M!RjFC&M!f-YCd_od9ha%kCo2^3x}FdPbXCF{&u2)zF;;s>D4MhbbD|Gnc|iM1=xFUo>}k zEe#h=CV>%fz;0~s9Uy?Kx{n8h{TQ#5Pj%k#;0j7vpqst9opWz$9!5Y@ws6WgS#xd6 z-Y|HnJ2&h$?d|BiY;vhl>ps6AW6N*HEt>9;+m7nMgVurqW_A7QOuHhHS)QN(9UkaD zdTp^d549-7292&1$JeW63&8I;wzk-mEHrSG2*dKUZa_@O4F@LmL&4Drl3fWl_@;gz zc&PH{VJrtSK2&zyZ$;VVnj9tim)PQwFz@@jo}ijsp|k=a7NQlHl)PwoaNqIqtO^GS z53HL}%6pd`&XZd!S;@BdC(d6|@qL7ty6ZK(2L!5}Wat5a{OffOepm1qhRLumbj##i z@Tds@h;|>_RuF1v>@$oq_-MuS+66V;o1|UG@nuuJ84h>Cov^2TYu9?WhCwrO-(|ko zJa2snsrY*Ll09=2urEQO%iqF^Nj9}BX5lpxKCtnUa$8zg>++0s9ebZhu_-*4C0`5* zsuI@-hto8~*Dd)|<7~mWbvL~)#w(@>0Z@Q{?9DFU1mD(4VUmudQHOAMAlTKRMwH&uybm>nbLXO)&Vt-yCfrB>Xfv7%8p{QM zb4L0fr^O!jIXW8iYlPk5y7BE>d$wE*0irp4-&??z2vXkiYfNev2|q(ak&uu;jn#3C zPb^#>(~Vb0TU*;U!DFj1{N>As2|<^t8X@cmZ7r=*%%pJ9&2KR9R*Ole%T1fd$1*ei znEyJ;9FyqZ;Q)3QTLV03hI#QLwTX$=c zV+`Da1l>-GEe;lz8XTw#d2RHDfL}!_wpubTMw}cR?{3e}tJo!? zZ?I?CsA3PTWAg zp{%el5mXd`fUMw;%*>Mt&Ux}|YrVZ+4lPQ(k+P*JdA#l*Gb&c*Kk985>N{|;(aI*w zN|#DtU|_)FloTD^Wl;5i8Zv9fiW-n&ZDS8km87JkITL^MAhMvIiHQjV(BTX%ET~hq ztj(&Zs}JZw3cX{Z)-%_g+Jw-^C1Q+PTK8?t;paj&k175}8>vhEocK zM4^JMS`8&N2*$5VFB=>yLtumwM@-7Tkvo593C>a|5`zz4y_{GaMmCL1ZKAd=-}uWf z%lneHkunyZp(O7>wX5*5-K|M1*|)raST%(?%w5+!B{b{LMp7d7c$N}vcZWJ%0ssuN zLiWfIk+S!}09GTxX1Z<+(_O>g6dJzu7q(N%r$n!_o*@OqSL-h$>WvHG z!LY6VhX4TK=oEOr4RT*1At3WJ4OnJg@yHIgH+jAlHGC zVMQ3%jfNwK76gSPr{3Z{^5o`=1MF!a-Fnr(e-<>4><>Be${H!-rZ_*@Oh;2e zNJzrxF^#eJK2Flo!s1B4CFFYsbeVCf+@+y{CvAH2*Jc*nsNSka9dD!=_ z0zTcj9wG&jc^|~dBqsIPV{-9(>^}-cQDR0II#C8d2teyLKoGv)KS$Za1An#Xw-|`VwLJo-I&(?)q^n;mqubxww+J{ZAE#AV9y&nx_>i8y z`*RV3@#YJ1E`{7Lt0C%#!z{!S9HgG6R=tYmjEXn18J0?xh_U!NQvvBoe)_r166#fq z$dIt@QDog4f5u`cD?aAxSFA>5E9}W*l$q8qT@&2M#N*8w1Hga%d zo7uTf!!Jfpfl^iRG1GXhm5>aO<|506;j`o^+-BV z3VQ9<3$)AT(4l`gMXPFh23OjZhWC8|&Su7?QJCrVhw_!Lo?|C_?{-gxE|?N)rClpGprSWj|wevU8T z)9S498Qfc}#m;UU=Dt^Cc z#;Tw_$-X-~J^g3trJ8fqWF2grs&tF#0>C zli9c_V{ItAtk|daop4a0+Ou1XU9~tzc~Q%ng-epdrx`J^kAR zdC!MBn+5}b!yWF<8ACs&&?Y?@Vy7M1KzX{c=XZRKA^l%DPZ3>s1|dn=?W&52FSe`m zol&YL9}Pmc9T_<}dG`JHw34-$go zgKC5r7wT@Fz0e~f)3I>gu^9hSsXnPWNk7y>V*vJs+n&$9+$_A(4=W@{`m}t)$H@^5 ze*lZLY+E{r$k0EaKI|MHTc@QiaWrZ1+blOmYx{|O{tOe)rNK0$XlbLY zVKo^fGeBP!RA+npa&Tf|VnxSGb4^X`(DqGy3{=3v)ffqOvi_w&jWa_{-YdbsP52Mn zTU+E9Av82JSV(=J#WV2uX%M+-X%G8wb%}%v$~4MW8*DSc9a95F@#08_Ka7&3RdjXb zM6l72oc}>y#ztNKZ`eK0g)T6%l+A>nlL7Neqn0Vo(i{gm z!sJlTPY5RHfF)-NBZCmUg@AYnbjI$9!hF+b#btmWrgX&_8B_g}U*oU!v}IvfqLRSL z6*RKLTF>U?N)a45g>R*@JdGEyN>s$;iR3LZMfIukuAj}fxU`UgfhK~4a(?ZYA7X;s z8}#E6q5N2rup3UaUmH~*jv8mB6GXPE6Iju%TdkoPlA#U66o}bIWB630-&~h-JMXIA ztYOjGCOr1apd_=T55W2NipQ8STDQ5Lg;tvY-zujKG!HzTnv11wNu&NeaydFpYEF2+ zPG0RjfwUprGO5i|vi3Pl+tyzRsWEY>#|)DJ$@)gcV#Box(DI;(#ov}dlO$VI&FVOK zNRx6!hJpj%Qj;BjGI%K-DKTV)QSoPy^(W19Fyo?JdF7LdvT>Q3X;TE@&o{tDyyTvY zdr|J3VFz3M?BA%UsCONWf@Ja~GoYx#Zas7Z@@1f0X{$ZlgEA;zq-1PtEF&WWN{Z}n zmZ1oyMSbJ1>C`F(E9U-jb$$5Io&QDZxC!@PCPE9uA_QdQ9G(BM?(nm-yMR!Fg5n>? z=#3@l7hwGKsfyM0cBKzR#d=~EL_p_%qCXO$_IsELAJXl76F5b0ZnZvIZS%a`8ByXm z2g`P~#Z2*P^(QNNZS20jK7M|F?_8rR@cjTt?cL;AgF{Pv{Lc2ah_};dwbJ96*}r#A z;B!`~frcWXIL0EH%k7~AZ*T7+U#BxS-q-;pRn^;}Pl5uM!z{sQr2JlYXXwSlM5wzf zu4{E(N&h%-)XYe&vu18$^>_q9&)N3&Hps5TPePQp>SWt0*ZRlw=S9@i=8u;eN=izO z4?CVsnBd>MS;(M>9RTZh(eU>7@81L9(R?0{8z^JV5w@Ls-=E(hipd!zNyLcefTLNm z3@jvxJ1u_9v8(g@W@8c=#2?%$fB}f3^!Um4d=rh?s;2NYD=)GsYa20Prur^6oxrAL zQ+Dle`>xU5g+NJIHH%Ro%49q}Rx6G05=#a?ok&%qAT%K9zCC*wX3e{5o3Tz=StERQ z#nX;9o9NuM1$0+WEk{jg+;I8QmZC?k#Z6LLTsQCRU|q;Fz-M~0&6 ziW_b7DLx;!@8f4Sxm&t$>Kun`ZyD8h5NaO-;FaI@j;*0b*yeo;5ksW-JZ@C$)RZP2Ifsg zk~}pM$FB*K`gWk?Ju&L%66&XSR~Y@qka561@e8If&}%rIZ}fqMHu(UH#BJ~_isPZ?=)yEM7X{E_aDBMi z2c^L9urQG2&4nv!t`W}q5gxAH*f;4q&TifNug~?d@il!vo)m$H4 zwD{!IR9OZ!A75KzqZ?=eDE$0y{U6`ni~kigI`Dyk?fY^`YGKs<9Wg#X9z3@y!~S#- zb%XAk=`4^pys@tX2{Q{ycD|P4vIQy ziHT}pyGlry6PrJ`<9$4;5qLWLY-3{sIzmN7gZ`y`)~~h8F(i4IEz`$Tl6Zr!S$7TpsqIAAaS)8j2&9$g)dVeDmrf6`)B^se) zQ!e@At|K`BfV*@$A!OpIK`GKE7=C>wW2xu4pJ$v$A|yS5ld7{DY?}>SE{j+pg zIJ#@&lBXeUiW;2=8?OLcp+z~Xwc925jsr1Y?8S)m^PD>fGNd4dmW1(*FpB=xML z)E~SBz;Zh6`t@Vu`&BT5VEn)oDAj2Lb$Vw|oQ&@R6?~8}aslZgUGHn9d7CLWg~ zz>i;n8IFR7#}j-4jMf~6pZ}iX(S+CZ2f@#%{X~0t|Fp`#%c0*58*Gi!W8~NmMtq(W z{8wi5pMC7uMl_FZ%Z>J6JqH^HJQ~T>)s+`IPd_IY7X=j+DX$x-Cq;GXk%NXF4lKoi zAuu06`{yjSPMONkwgVf%2&m%+SN_x^9UL6|B}sA3s4Jz+4LX`ZkB_%4{STDoy-dBV zaWQpubIS8#6Op~W^Zqg2=KJf8tz+wBi@E_T=onZ~*y$8U`6v;#7pmvtV$jrlR!7+> zv24V8*2GXP%9XJT`ZT+9+m^_!9c?(?X4{2KbMt)x4ZS=T^`ib9Y z_#r)+Ij^+zSI_o!+n;MWArYQdCj>z7FAC3Y_iO4Ncdwz)Z!eJIo$!PLI8p8%t?mwI z;2+ZY=)4kDr2p3okl^AxlK_=jWtv-D4m0RL_Q(QC`iLd(&*geLmc+rb|GU0^F$dQ& zQpYKS5>*qzWfxSj3!9O`Glt{q$PaPXSUTRxPnDuH&PW=Hpid`30_2rnED@Fd{-#^Y zxZTN=wQqc%Rd%-LF0oGBEE^|m?)hV6y?P(;i0dwQVsw=szLj36J#7)mnI|27JW9Kr zO^@YjO@mwyeI^~lNX8*Qb~~LJyGQ{tyxymS_um{`Tq1t{9QyMo^M-YA#QzO)s%IoEfv`NB^7i@8%{V;wJdWDev(WSeIs?W~E5h4lnl*#`y&;tg1p z@o#T#bgGR)u8sR6h&5GIOx$Tp1*F)bGEojh%*?1~K3ID*rjVKJCG{OajCvksKdZ~`(p#)?L!rmjw$cZwchu($D58!vM|8juO$PyYntUXyV^AD!iD*uVv^ z`rE(5JCf=V4@v5#isEQ~WW;(RTjZajtFNEsjNg!-Z*n+W#*SNyYLoBg;c??~o5EqM z5X%R8g}u)EdV{>E_+j`^Lr&I-Xtft7{Uha)Q+%bqYJrcqY(CWia2VeMpZP+WH*YQ3A6+yX}w zfs1{I1ev3GbhX;<-wSlTDHKsK2-&;XqSt0L`7#!Yb>Ou+kdTH zr3+2(g#wh#g#_M==%U2imAXX{2cdG1*ZviKUN89F5r$C>4BpClFng4(gwZch(Dson z5L=t8ovakrdOy~KCM-W$bzSBE$J<*))wL{PqeKb8T?4^&;jT$=7Vhru?v@Z>;qLAh zLU4C?cS~@0m&HHX=VYJzaL0YP4}XslB#YTnT~)KX>Z|Ibx)ubOkDz+uv^cW0p0YWO zxXAjAG^hJPk2Lt~lbi2zv6MOb`68$A?4jy+=)SI26^V$Mjd867WtY56yFoj#8#{?| z=cLL4vDPLN?X$pZQ2eFtrNA)^~->;JgVS9zQoX_Zj56H&rw=nV?gXG}ikDKy9fi#Q>i_I~y?pqsJTg92C}n+;UH^^m}Az=rxRu&GFTh zGdPe+`s; zgBRB0?hlw1KySd;BOnO3{_77OZtR;;a-YY;TF!8MNuiQ2n@1fHIOxv13vAz5S#TuN zMtt>fKBI7k$B@C{Ai})+hJ%Uo5txJ`HI6Q8bYeR~Ef3!43eE9Uk(#7)igE;x(+=F4 zXTQ|!N9G<5MJc~^E0vs{0F~HPDupUZ#E=u)tnn%*&4?FqiA187DkqqJWlC?qX}`&a zgMrb`Vsu85^mvsjLbtg6A|5y`j_u-CoZ(fR1$dE-#R`On@x`Pg6#g(iuGRS>U}Xf9T>ZEx1-R>AGW(v) zp*%Y2yUliWyGtsg6qrBf8@Tw|WB9zGF7tAu-e)T%_eaY*8|X4!0@Ue*nEcdpA*1y= zQI<4sVG^OI4dhucnFBm$X?_TZJlvP-Y5AvvV>X8q+-`2NZxmAcj01&8qNHd~86w5V z+z+c~16cGp-=>>euu$S?j2;IU*DS44 zuem6b?f&Q9*Hu1Z;;%F!$c%j*P;GX~s~WVyut+_;4;U96OZB}KGLt)wl~E{eZY9-t zFddSS2ygv{jd3rG@uXjhpnad0bUf^3XJH>n8)dO@1v#;?;=!9RW*110G`Svj2g!u4 zxhwA~Z5A8L)Ku~e)(e(Jgs11n(vmwFJ@MLc+6@)L8T9hJao>OEU!1hdaBz7(4=J@f z*IjCYbv%UC&?jUX2P;ri!eml&OtKfm9O0#+q)d(8{(L+t*tQL6S~&^)#kZO{JUFxx zOY#eEtfY8=JRu@u#hdlqp2(}~5w)k3^J1E3a{0w49VgTCO7Qiy&Scz{Pkb_vC%(#} z0=Z3QTHSbn zm$yq-LL}t8&4!#a`Qg6;hw|EOs9cpUNwR1C6bGRvM=NODRFNjG*^AwgbN}ETNOC=S z99^p&*}`VpxxqNyC>)E_^;xZSONiqJeN8cA#S0TbGbRlasjOm|+`SM-rvUu!z4N>j@7P|0akE?%` z9BbKB;sSvfQX5Ch96Q>=OD0$1IYXu*U5*M@-=Ax!YNYlfO+G_IM?*&k6$JYYCyz}n z!$$`PLv-t*2QKMu-atl;3SLUHr{@E#`1@6}jeNXn&O>=s~vwO6I$Xh6}Na7VlZmDG@ISIc&nN zpmwb{nghvcyOe{~2-|hH?91m}1R9M2*8SG8_V&A#9 zeuJ254%~PILFhC1_4zVlY=uI1QN@W)({^wJZ~|~h!f^uXtx|w&(C4*eXew*jYh)(h*~6+TOx!D^0G%cfhe^;U*^ve&Eodl5)4T_A}G zxn-dz6xov*N9s9aqgi?Ns`>ic? zdEQTOC2Ol)Dgt0!lkKpYwX=|3TC=rWVj;)#jqoX*mYbrw4X0bp0nR^^zgb)%9H`^n z@b9~au?3`%1=Lc`?bO$rSNLCeyDaApDA^6sgw%i0SK-ZoS}u{blsO7^59rV>s}pA! z$@pJgGnGTXw$7;}P0cMF?2IL70GJH;Y8#vn)g3B3bL$Edr?p+Moo-g33nl z(EWXCNg69_YFBln95^yQ6uPIG)!$^q6xeXr_35n>zOOp?<+WFLrmJUC65&0)_S-(M zh38@Wg0#q^Kqa3ytwkkyLwQyw*N(K=-!=)d^W`*o6_bi#Q_)&psG8lQ=uW2Sn6|gw zo5dTgb9-S-E_jJ78gLrXudW}U>hc9#F%2)XdpXkT-kAcK))F%k% z8qQCZfO`NE1vKBqw%OTP(3*-8p zz|9>AsINn+uNKgFwtTsfpku5yGby;azsY4j7YQK>fM(V|o=F*eJ?h#yPuLQc9$#`8 z^}0rchsR}`bAdq}MB`~2TyHE<;e~bexvBL7t2F)Di-2basHf8xp@W%tlwp8tdM3Vq zxv-zcu-0@{vOa9c>oz46>L^cz;HV1 zc^P^EH^gY(8B>%lDj^{vA)**SZ3%9U_t+m=l_JsXqd zH|+jNQ?O$--1wDS*KaAR01g4X@z}lgr9k7bZhE|K9Tj)K6-B40yIcQ;z(V1KRG5E zXw-ngQXQ=3o!s9w961IKgj?Qba9}ftF>5y0+{*B%t83hPbStH&6A~7OUxn9PvBw3U z0v%tRC^MxKpq8gf2n!J`wwDw1G7;G2%8w(zb*J~XT)PM|;8is@T1?hhwCCsHb%4Ul zbdS1R7Q6-@$#x@*-N*Lak%pt|Fgx|>LU6vo0TA|o+NW*8H15*oob|F>A2-9ZSf;OE ztDUxklWig0J?~OW3vnZ@Y>#sl6GAy%XVF_m zgvABt$-zO5JQ9+h z2%=q#53j>NGXQ9)|FqsE0p|mYvL^fM5rO8k$Ee^x+zT2hHp{y6NM$cxB_h?-R||Gm zXu=Lw9ELvAe~nWnoYdT8vEG=3M5LP$p|hMO{30O~l+&Se+YSE{DyfT1V!Y#$8^xrP zK7@+Olqy>?gkp!llv;1~mKZ?r|EKLlZ;n3EIL{oo2#h=~3PAfAr&d-5m^3X!Jw#!_ z1O@U%is}3`aRq?|3BeEpt~gQHL8n3-%-$LY0@2*N+ZdT#-t&XH`(u|&(XY}U^#h>Y zOMYq#{z);c1CbY9zg5F|Ia?xc*{w(j%VSA)*) zcHsrP?51Yg-E1{IJYW|`mJr{jL`e zH)zIY4Rl%hiU@*22)z}l@0EuBI}Xe;DjGrRRR_EoLzC=f#uLG$`IDAbsepzD;N;!! z!9SGjg^3%mnUi(;)Rvg(K^f|yySD*>TkmajkIAw?VS0tqiz?c6irjUDL(pr#(Qf~v zV4!mv|J{GP|9#a#==$;CE39TS=GeXB&lNy9iZ&s3Ud(BBNTwz-I?$0;X&ZBf8$k59 z_`m%nHVh0Hn0srbW#ngqLHm5wBo<8e|EN}=TVG6}p)sOhpf*7t$q=UUDxU6 z5Ivx5|J!_d2!Jic{{GSk9Ew64Q}3H(q(-7Y994O;cewg5Bl+?W0e@8>S;R!i8}BrT z(!g|%u68l-w-XrI00{2g2VzZQ$-F@V(XKPnN4qbWEWH)_yA}42f5i|61_kIO!LT{b zKQ?JoHGY#b+=y$^QMxaQE8Iw{s_5U|Tv%mPY+%}~jLg63(dc4n&{q=l{-Wz;-YPZ< z_`@0g8S~#BeL=wDbz&|$eyhf-#v3Vpm{7qDFi?}uI|C|AY;%S~{)obmtwD$|BLSyl z3v)6msU=g)7UX;WNEcIw;Gf;Yo9B9%|7pr}_B7BU>b|vY#%@i7&cq73I7VMw(gz|t zgwAI!3=!}q^Lr?#8$1bPzF|!QI9DIS8BR{JhD@W+89=&*%*fn5>}gkZ5xKrf%o|BQ z)MXn@`L}bJ+8AN!Zpb8=QWTAdQL@4fQO`vyfJy#NW4yCS24eWWg#!$^W&kZ8d+$dY zzphBoTR}Hi5h~H0K;rP=j~7lFKpegfAB!9Q2R`$*E{PbEvQz_0MKs#nsALBh^&z(L04LrEH-I=m566x>2Q7jz+(2vw z#t$`uQrrOn_*ppg2jAO>C>45Ay?;3jyS%SRQU;ev(0Is;SG0`2K|9B*cvN(Di}xA zt0zV2eE8CX@Rv699ZWSxH5^hViU^$vGViP7L#f}BlBgjg0?gZ*=xzl0zykU1Jk(`J zH&~1lKyC-~DNdpr6;-gy{tKn?T1wh^Ey~Go;;l9=LhDBoKyIUUU0LJ!2R)cpe~!Zc z9Yj}{`xlWQ0%cNP;?XF!2qDX8j{sUA6*{&rKpVb*(FEMdNFTDRFbNar z;*nS`maUfIEz&Vwf=pMx7XdeaCCit`mo;xqfewv^ygTI@*N%?G+qwLhS^SPEM)mtM zwLgS>euCU|7=|0&4zkgdb0_`bj29E`3Jx<8f6y#>t=!$+?B=j-7xE#uhMjof6{$5=7LsXE10wJH?T-o)QbM zG(^ywB(JN7CDIL9fAxOw52pjE;|L8K)`A^me}f3DeKZ~MUpp2C<~O5AGSfL}JZc8j zd0x_*<->kOgM_qXPggh|0-n*QRs z)V!son}k1^hP0!H6Q27fJup$yB`}rw{~02+4Bi*~pG+^o8E!_W7Rg2vSxf#XX65k4 zETQgpml8Ko{nCZ-7@C{)CWFI)0IvIKA~p#Vi8$T}M}!a)Tww-1G_+3myr%0rfoDvd zSz|r%m!2@c(ava$r4N2u(i_Jk>`?Y-t?m;?n#Ey9Uy{E3H%Yh>7EqWCe8 z33oLl5lx4NIl9&>a+;d~gn4uG@_fdi5>QbAhzJ7){7nIn;Nf+De#JMz2U*^BwuNcn zA@H>xzJsweGuz$Su{~7&y3WhX3k2Y#JWv2?WeTt?r!Xu{j@ltak+H^@80ptgfbxZa z)ktqsSF$SBXn9#$ThX@!LCQ@}m!_t=7>6=H`{4xadW11^hFh4KnKd|BocwNoh|Sli z#fdW?``u2p;0%xDfzmkI{2Rv6g%f5u`SQiw(!?52+G;mQr*v6FLqo#>JlOX2l~yzH z^M=uPPz#`nkjA_*P0ihqchkG!!@1*e8;}$tpw%ux)mHXQsRz9!MaVKUS10W+TU=NG z;vHmMAEhjuW_s(>a7b(z%8px~Rvg{UY%K6uO(TUbkX-0Op4YGazx5mPaKHVi<4mjl z>MiSPgFl!X7AlR2p(K@jJegMhXPCTZ=G@QxL&P=cVzfgJ&=JoTMc3$E1q2hcSdbLaWbW5CWqb1-z*XCvnBop=?!2g1=8cWSi8(ZjzR)veu0=qNe| zBr3v;*{CUt+Q-L$n2lP}ez2m%KxzDe7sBxm+Hg$TNGZ|q3lw`YovmXUU9qcwWw=d= zE}O=Gymx~M`>EK7NA2`QapH>~Z`II{vAa94%*KAGz5w~?tR5%o6|}#rd$Vh5@N*e$ z=PiNn5fW^sMyK|(4)f&~NoGz70Fj=X8g`V-l;Z$hKrB7MvEfk4GR+#vjJ(P}0pPz2 zx3xepND2_w))z|;SZ<-&A_{MOO8<1(eEr(IC!Cl>YdC3gdvA0aAL@0sNC@Kab~}1x z3-Y0gltJ_{bLcn;u3Fu^Hk}_UqcZNz-`y&QVwimT^{@8#3W=o9xQ2;LFj&cl+|G{j zf4Cj<<7jC$t8=`)33@^qH@$?wAunxnxa!`j=scY+M>MwXoUdv{Btfsvv9;%l*nmWL z&!vdRk*9r6&L}he8*mD`_rYu&Iljz+>ScS>kqvGgdB~@EAttpNOzyuL9OeQspB>kb zl-0q#i-3T057|PSBzvhj0}~?-ZCr-X!*J}=>b1jJ5S6vF<609}6f)n<;>8n}hEEm` zE!ETSJ_B3_3K8-s_P`9ZdQP*o-z?quPX(IX8CO2aW~Hlqhqu+#=wTUrt)K#){Q&+! z=}b!#!oT$N<(Fi79`~Vfa}-r>Apo?Em~cbw_x3JX8$?AjoxydzH`sc&e75afZ{O@U zn0ocF5F6yTIVmzapTs13<|!sAVjX(Bd%5m5!E7RTvk}?us2t+?_rw9{8~jv!rrzFR zLSEC~w5_8HtznT&=_o0ye6#{^gu}IWJg3b_(L&{_;(kMIgBiMCAkHY^KADd4ULReV3k6B` zxoO(JS{i1Ino?wlxc#e2YvahZ4n4oDvS+5`ow?9W#7ogIR>TVxSw%b^S{gFWu~Udz zkyg+5*fd<~Gw~S^vnA^=N;gBTMCyw%w|WK|ab)mth-x_lEte2`GX>9We`w@TFz?xOR!SChTlC%_OE;^97A^3X*wuF~&+>9;dF2q4 z(i%EC)ne%e)4~L*c2;ZWfwzTO8J7^#5^fS(}aDmg`^-JTuCUUJ5mcjWkPQK*v-$$p22ZG03O%pq|)W-|Zf( zXr){c<|lo+8h2B|6z9i?&r{xh#9s@RO>BRVo4u(E>79=OAve{!*y~&jlzy~ zps|8Y0oraZS_$>UtqfYx&L})xL4v2S6ph4xSFW|uMYA==^jXJCt9om5JBSKkswpCa z;la^}Rsq)Yvu@|CW zG&{6j4|k#;m3HDwjWUXos&s@`Q}zi_1-Yd3;?++3CcDqn`|0XOF)8P}nfL0yO5uIV zBqkD$DYBb3_1xkasHfOwjkh;Y<+O{tm*C83&Cely_IK;$F;8+-PaZ%tE=)c_qf|0e zRtw(QUr2a7#v!JEZCe@OAh(r`?+`qaT^)dBq}fQlr#pjEI1a<3W6`i%nLwB5x0W)^ z+K(xwB*ln?adl^Lrx{%)<~rf?Pg^%}x9suvW5s+vnrIS2CV+z-UG8YWtiA$wO$8(n z0~U&(H0j}caBEMf5D(JOE{H4ZGhqo)O>eZ2vo*=69OV+u^1qO!^Rmxqu9tA0>=?Wl zXO4!xat+V>%{U+Hn5`R+WnG&Z11bEDR4yb0&teqgB|3HjmY6)w&eu32FQhW!JghTx zAXShz3u{LHM-aWj&`FI0^t>6nbQav^bMG|xG8oQp+?tx+I@V)<&Dbia%=wE2_+o+p zKigO%IQP9rKzjPdJ;<|N%F~Is36)_6uruGXhxp(zv8kZK8(c99}i`Vb-1d`Ygbvpt%r-@R5$8kGZY8%HWlq5%vcmrQ6KHD?_Gzd9liteT!8wk4Tl<6x&d z)%;LGoCQB)TJV}bA@N?%b0|BZq?&=2PP^4(*E4Hf?GztSJ-J<=`mc>3cca++z->xv zE;Kt!^*zdb-sD<47P-T~)^HwPrGqTFWa-$t&Aw#Zj-Hs4n`fm3>wZ;fJIXirirg`t zO4u8!$r3X2TEUd~(Z03`zlZvLDT(~J=(=fElZr^cwR&N81Yv;=mV68YZhEz*j3GtT zoM4V2$Du6TZ8hB`J+YHg1pjcBV4%5$h0j%GhT3sUgaDM2gk&vBlyG zrT(G;am3NUdmzGQItZ1G6N*2a%+`PP(PZglEobG^#Lx2L3Mjlm>~Fe1=kUSJxDBt8 zQfrEtq>ERc>qey46gyBOD^C2YsPbu-5pLc+3Jq;S!%_NTdBk9D7a zqF3IOSUA2epY%K@g8vy&0wiH%JUwhrEMK4Y63HYozPM$6-p;iCBvgmx+aPp8oKix& z72SJ&?q@^nj|*V>FfHbsaP?LNwF`!tj4o|ezvMJMi2hMbuB`BneB7AM9<9x0lx4nw z^SY}!m0t8p1SHAu6g4&XwgmaYe2x0wl~-14t#thvop{`o5=5V z2b8+F8})%Y0Ll9gu|PF3kK<++Acx~>bw}Nk-11BQW($?Kl$$Aki*yo2!C|Gf|Ear( zzrKa>?N2!Ik+tisXq5>h{v=cqXTA7iqZC88!VSBw9HgdsdX8m3iWz}V9s=?qAsXbn zdPQW5%WU)gGK7liNJwof7-*anE}JQ+`f7HEfgTP-gy>n6(U-(LDa||?>F!#oqUve~ zzGH71tG1HoB87c^0OkvMNy3N3RzAgp4ubO((rF|*$r*FOGtTT@>THdp_It78PcQg& zm@S=yTlCFt7_-$3cic%d(`kNiZ?YbmVl^`I)R1=#sGF-+&F%#C5_%kz0hk2==xIb< z9jEs|FOiQYP;v|)L*?wuKgzjz05H9F9WI4fdEEB^tILu5{9vajzt-`y48BpA;k$NSY{{nU&RKS{r7YXbIOEbsore1>PkB7OlK)3mYeiy9y!5v5zHZLbEgDnj-MMR-5ik53_Y2@yj;&FWsw+YG`8_8Fv5N3~bemT*c)FwoX*C zIb|#!wnr~l{W`~gdL0qWb%wXAag-CNcrmRagoWw=mqz}c&_p_z=+IL3^Erjqkte$e zQ05K*^51O>JOKcldWY?mKaD^wZkWsr2WwCpz;OupcYglo892C%LnD>|L6xERxuo4A z&6G#iJhz^18c3+66KHZ1HY{5QLy42(mWaR6(z=+Cav7J+%Kp&s5gwJXJn-EBLZ??F zK^-Laj>-QIdfsON9m+=C#g=jDCYcOuEG%aLMg|nE?CI_f!(%H}iQlEGoKaLloi@B~ zg4QZ{7Wj`ySl{MQ7)vQ(_8V`xCSd*Twp2=75swZ0 z2iMm$&9RC_s#ma?3I{$84-)5?_I8=ADm~|$J;)3iS`I6d)U>xeq$&Ny(iDOV9C`GsR{eQ@A^r?jd^NZ_GkO6qceKhQ5m}C&}sI^ zh=zFni^NY9)Nb(<-PG(c$&~6LA)yvSSLGjx@mTySQ4PU;3H*2mT_U(maOe~Ov@{2( zND7oM0akmonfH7&{ZwXucWA6u?=h(@86Hu2ExfhlCI}p-j_8{A!p7cmu;pCovm6K_7v*_D#4|zcQ$jb&QOpoL|MeKAUs-A6nMJnh2BS(#sHn zG`9f7y5P)D$3V*@GLcQD*WIG6jtgi^mi0~Z!$D_l25&#)w47N}hgTV3NyGxlawCW9 z`C_A)V{PtMNp9jT4$)#CgYoNn*8lWe1xs$|MVX7vASXdn$|S`t+}b46LTXx<8|gM9 zxS=6-oSLl`O|t1ikA5q$LRFzOmroJ6~X)9r>~)}0c1LcYP9 z=~281akIW_tjY-@466Hd)+xvEv|+Hx5eA#~!!P4HjV;`s zZ-c?$=k!USpe;~V>Ug#FDTp%NHe&hNaWuwIf0~Ia>TG@RBhA0++`j$zfMT#_^_?x{ zj#~}_Np_^iQYJWHl4>i!xzZ!SIFrL>h1d4?C!io9kUR+iYMjyY@T5G2du>O!#QrvA zFlO<8yVOfpK*d@%SIP*N%x8DbgEcspIi%j{&~xOx+nTR@%7dLkx|4M!smuE=q}_ohQ+5 zoO$HBr&(aG%3A?K-BkGlkHW~Q8upG_Sfb2cpx&XHy1M%)-}O)`R}3WGbu9?ULWquz z&Uid9ae*E^%hOKAi3Z-MCs~J+-{lahgs_GUPOnF%;$H(;hsf6|9zWwLL;=?-jc6}{ zf_y4rjiz=U^`e;D(1KB3ULH_nPT;m*Mp6L{9o^+%?(}v$159~^i-lNMI!E=z#c@m^ zkKCAibeYEH4IQZZ$gpZ?q<)#OYIafmPb3-Ib@H&eK6Tcl|K>|um@Dq`%kP;tVP?Tv zf?r8B9CXBKFZJSZ5KI%D6#xI4sPzXVR~kCiiQoQ-zO8inq$lYfhB9oLxQ#I1;E=%m=+$&!?6Vc)YkeTm(x< zonvA|kCifJPZIsm zfBk%-wHE2C0gUX)1n0c4gBAc5tkdW`oV_qII7rLH#KghjGM4!nzyt4xU2=w?;~CAF zYU`B+C+UR9ztxH+j8{*&;xJ<@mNj2S2Q1`U=V|%wGJjB+lvrldLgecOEqo&{y4c)6 zwL?|(5)oWpvl2wWc|M|z$$~oHmwDaF<-M7t_tdLQ51 z)RYd`1;ByD6_|Ad?*zE>^Yi_9pN;{S?{BPzB`QH>6;7XWxTu(3O*Acx z2dVk+Bt952s}V3%&WP!2!|jXU4ghX-$hBRHJjt2L|zwi`z>Ou`dtuAT4heVZh#^%W3K=(!5t@b%cY#2vxFu|#;4=V-7%yg zW(shOjBivG(pxEs3loxCIyjp-i@U3uYkx6Tnx>~L>l?--8qRsM*pPS~7>bk?eD0n- z@}(d;m^WAqe=_W_cvzd8!*AkBN$GOidn5d>d#;Rzt1I6DBzqLCz&c7poWno&a;xo zHlD_?9%Iz;ibspNp+US|S~~uj_1j7TOoA=EmQAc&OxlB?$QxA9oU#(R%)<@v(!Tgb z*~v@?FRfKf#<7k=Zs@$Le7$xt)da!3Z@5S0Zk5rwDOXpvP{004UJ@|wq6;~;T>e27 zAubl;T2UE~EhL0duAgxrx&Ww8s6f0II|d$8j1or#A*;KyN{1V1``(ZC5H$rQ!0D!{ zsw%_tAp}qYEt+Pc1}h5rqNE8;4u;~_@g7%S-h_!)?JO<*(@i_pzLIH|mp33BE-iKfY)+qG}ay9k(C9@m^jTFOWNYX}gVv$K$`akPE{P@p$ zO=F3}=i`2r7SjxlkeHMf6{{_JtB!GS&U9ke6zZ;F98Uk$fTT{T4RGHCoa6Q zQRTH^>UqGyK@cK# zub~vbtQv1Kulc-8^8!Cs=l8I>#}2l20=)ozPOtJeC->LTmwoOF#mS z^unB2WE*v^SFZ<$G3O3=oYel~L%1U|mb@8aal+PY#)WZ-WZ-vObk}!ubmYKt+8n_2 z@p($O9!o1NFSncfrT4H7J#o7yoFqIrJt_hCtCqjt*{-ChA{}y6c;@D^_3-K!yT|U5 zUqnMTm&ntY2kgf>-wPN^OUo`oN1lITFEGt-o{=46v|r*6DtLSiYr%2tadaMkJ>9CZ z_3r=13IJZx`X9ap2%lI3p~z>E`A=K^4*8$+9i{>9f8luGVhD5q9Q1G7p%4Pb{M*K) z0D=4a3ruDT01^53w@)1Ze+P^yDB*y~jIgk@biAbCOuJyY3LIU$PQ1c%&fw{Iv2z6I z6}Cxjd`{a;i`v%>dcWJgavnVon+pIF8?Qxx2}-kC&M~UkJgZ3L|OHXC{8XJsYRN>sWNOD)P;^@Z;rO8pbFe5NCeEpmFTgOOYmvH%)t%jTgL!gw%t zJU=^VjlrM1xi$GVDc}PWDLFcgODOW{N8S}?D*`r*?c;J+aAtB(DV2l<7f+|Vn?`yV zt~h0_dTSNEJzCmQLvH3Z`-eZ^8 zVK#?q5J@&d5i}3$pl@a)q1a?}XNju{AC7(e0h5KH&HS#u68jh~e$>Z)A4y%$!J>@n z2ZrWeh|Ee&It~zFU*yP*C@d+#=XE`aBo@>J;@I@hIVSiV*00~ZsdpE=qf51dk+kiw zV^6is6tKNY+9;2RVpu$HTfXR?98u?#*01?ZBoOU|0Il5S0tdsjFA6k9Pru9(h zVW~MYY9Xx8avgk259s3OI?e9ai8b3B%H9DVD2F3%yI)?I)mkri9Mi)Hu^RTF z#0GO>j>b4s`nYTe}KAyjJ$E4-->BJarYlkYB|{7iTM} z;Ax*Sg71rvKRK-P<|8@#pM(c6yf;@(_u#A(Spdywo5ZzCv2;&u^N{OOkT<`n&= zX0V8Mi(n|IIhE8=Z{!`a?9OjXqov@0JW={1lsn1` z+C`gDweocvA+9T9|Lz;SD+p$Hh)2a zFrQktfH0eun@|1pQZzuh0_lw9$Z~_d2ue`uQ`gYV1_P1`irm#vE5_66Jx}G+b(fDc za85|Q(6NJS)vUi~@JC|cr+?})_O5D{m^|@X8}r15zkP2Mw09T6YAr9pmeA2kZcaWP zpFIpr*&0zSE{^6{Z6J@1%`k%%lqGNG`svO7*{#1{<>~F&It!thnN{+YHXVI=E?JV`8Al| zx(@uf$~z0QIL*G8(*xu0;fj)tpQI~Z5~6+Eg>UTOkk!9x$3*YX_VMrUn^U?yhhMus zkz)K_gU^0SyNohw`Eh=zJf%Kh7?8B8UVCBF*l{ZXoV8m1!|q-aUi;?L9zcV!hhv9@)wPfkdC~oRsHcx9GE2hjpsA$p|phSaq)t~#rvdH0Iy6f z;i{vFi|OYI>tCAsLi_4b&(R|UM1)8KR;7e|o*ptIYOfbC833Fv{l>*s7V*o9RyOSyLnJp+G}QbU@X0$%4Kx3f;drw^RjdI zWe7E`NrZ_p4>KggfW2#wL#B#S=>rO8Yr*WyWUcu5<|QtVGcYrJX6KJa{{jPTi7D9! zRFhB6e+$Osu3>;@#LTJsjCdk>%3w5UstJiWq^?h4un z{8Pm4nQ0NE-zm2=T0fYM7GxQG&DyUn!P%F|M%5+o0+L8^ z(tL5%oJVaJ-;kq^9j2W>&$8_e&>->~Yu@hx$sgWAH?G&W-7p0gkV_7E95ASMooS5VVgYRk>|Z1W=_N$6|wdt)<(E#FhgHrI_o zq`R{lIEBXwj0|R*zPZ!dpJ6z=^4<7s$zj4s!};@6B||eNpo&BiCB<}6arn(!W>h&{ zQ=!}Z*@}zhg*hIPw3;eKjk1SiITdAhMU$%2pA+&{X_Yktg+Q)Bew}g2JYDTCZ3}~x zAV?^7S&e&1?^|{0tLw`gk>=8jSH9KRmw3Z>BcmL``)u*sc?xPFAGj2#TWaAi)Itar zIsmwc#eI|BePP*bJkXT64?QOfX=y=|Y~0K#n^-eS-1hnM-Zt1%7T^!_Uv?^ir&vQ) z_b+AL4T&TXb4dYJqfwqN-!+1r*`WTGSNUwPbaA{V-6bS;v}nyr*rn>o%>Y z6~>3h`?4T~5ocC5RMcvTe2C8+Qg~rlb@Gbcp?Ym^iak7#<^j~n&0sPRv9vs}@jg$9 zqg9d4;D0PCNWbeOg4#abIjPuufLXGZ{-IBiovV|ls(v7Z#Gt3O0|=G?78z3f0rZf8Vt{S}D5dA?L%dXk+kj(=6Y z%1s+a?qDmoLuts8tgm@%aGesPK*zEUsFgVgY}24=qxGZZy@S;hT~4i|1vy{drO72m zIk)(N(Oqo%7ZL~UDb*qBp(kx=>8`yF9J@R>tTLP6X-j54ae4KZs5)m&MVf#7a}OJ; zuLJ~b3MUDz@OXqLrx%CtQq=o71XE9*0M^^980&^IyCTj5K6LH)i$62=i?HM>SLoOfk1?fG6guHYr^>XT zuMh?|IWiy zIJ$@5xQ#Y^3OdrUQrCDP;w*A8rJ^99G@)2<>Erv~>`By}| zisB6&xCaVpC)wXP*^4R~D6ovT{bV5c?cCr))r=0#fmM(LS(RqCwX;4F-W{LDdMEM& z(G}Ct2J-e+dH4wUR!dS6cU@D#C0V`bEU8Dh@z5+pWJD$R+T#rN*H8WCdn1y2Tg_uG zO~7q6DnLDu`{P!hhtpnckUFc^og)c1;ME3dQvtUO0)=g6%5U{hKCD-?E@aaIphkvC0t+k@T(Rdn-g7BKnc& zL@!24XVuN{)8L##@)e#`Jeum|xnKVr`@S3Ex_^bXwV(ABR#(`7uZN|z1$ZJ^2ep@Q z%y928HVtDbn=ik*L0@asI|H+3UTeKHQvKc^RRYg{^C`iyp86OR&WAG>R_3XtygDVR zzo!oDMR{>OYj{(1*K@nQYOvT7+`s?S93EM9PHSfGa8@O|7)z3gvU@OvD_Pv3sS;*6x`EBPJ za#%Ws)n(9LRi3-NSZ}5ekJIl@!W$PVMxt(}l4lEvpC;%uYWOF%gqcrW9#gT|23pU~ zxtMn=vAV5`e^ZiM&F=D}XwR5<#R{U96f~~!d|DnhMpIDf-et92~T5wxUcaM;jL9(+4;iqloormPod}T=g%?U9-NHSJK>ha zG_dYbihMSn8OJT3J>oRxus5gbRqqN`CQCmT~0qPS`aH3n&3;yF|o3b{=9E!XaNw z$M0RnIepgRPr||P?=6wjQFrH>8nNN$u&!Bfhx;9Fr%U{SQi{QkX#(JSzL+zJ00I~O0m(9@*FbfIXmW7N!`UD*PyuAO zAVXS4hJlL8^;&DcxNY9Tsi7Kc62tuCkEDTgLnq9N!K8u;tlkehyOghee>zxq(Opi@ zDjjb_R{@hVzMMad7;nd8mWRlD!q3y~W(9-z!&ayMpS<`vk>s;YEe(<`<hWr{tojsg490tM zIl#NlZICsdt-ET7CNfHC24mZ@SZo1GYy_Hs)Q2jDUmS|t>_(4lZID^ccE5XS`H8ga zne!#%_R}>&lv7&ubnDUGo&9_9h7US}FWD4e71YQxTEB}9GOKN#5jilD<&%5~vTm-a z>e=C7S6`ReAR=_HSM*WbE>lI`IW9=TIMgunc$=gwn5T57|Dn$noPp!yB*Nh28mVt; zed=uEbc3;q_o|4}?BOQjhcazbx4bMT5rxK#nuZeR0>JD*Ak(8%=5xill-x-E+4n;t z*%|$?2`PjMmc)&K0Kk~g87g-Ie}7h}xK(#b{6}z7P}u~@j@|AboF)oy)Rqj0A-}LO zFM~f0EBeq(;#Dnt9sh$hYk=_{PTU>gKl^9`3#_-upr!7;NvR4aqzmcK4-bjUza4$OJ4y4Liu zQ2WC>8q@_#d7aSy55hBvy~Gxy^LbCO#oy4I)o`hc$Z^O(-D)@J21EvXtlk zgOWsl(wVl?6@(6CGa&QdeC%YLDYGZIzMR$ZaCetZWc+hwqfs`PC@yqyPrBuq1PKMP z(k8UH#bZGuC-`g6k6x%T!1liXkobtlelt#fhYs#q-m7!|+9%qLL{6d~c2IrHNfHiE z5g^%K^`?e2vM{XKx!v9Lqp|F-fkE@)lt#zh2_Wj*8-`!&ur1wXexhcY<6P+KlJSeE||QhCLi6YTrR+G@VmGEm3x}CSAhdu zT=&+ts6Caw6P5o6bgZ~=ZlUN$H^ao5y&^kS^&CrMtVk89E2J2jB1g z*0)v(my5|qpECyzNXP#>r!%@(T{)6yb(H~;3zR?o)9)`&9oFPuqa1Zw5 zdt)E}oKT~&MKe5n(X(Y08LqGtP&m`R8+{b^+;Qgg3yzMT9Y0>cPsQ#03ge zR_hgjmmY4CX1`#*llXF%;b)n9O{9Wo>Zxq#@Xd=4_bMY`*^!LxnUI?%_2;tvN(rKJ zuu_PgnvN8PUP@#u-y18H{o}_$Nvwn!*bJ3&M4nH$s+6A2fQB65nB$1UWyRZ<7;@DC zzvl%|_4C(4zcV^TP>)T#RDHf*^#+_uPoVxisvg50U7<-#z}*hzp?2}yZvKpntnpHu z2|c;UKQMyYNM2g@=t_DcsX-|ln@HtuyA8MELzMieg?MD4Kd#SS{zNzPW^GT%YUUZ$ z-7As)r$X(NRz7LcMyR_dSLLaO;^h~eu2T-vavo(>%K0)zH!O?j*jQLcKuve-YY~Z@ zo39j;rJZ)h>1P^HW_y2PmcycKbC2qx%MbjL>u+#jSV(JK0&7Rp+5Wv?;~#n+0@rJ(3yRM-@u`#nbG!-z6 zTlh+*`f8-rx)%(JElnv+G1KW8Prtr;JL)h`E%-?^ByCKhFvd?vbJ)7Wxhx)TL+sXs zOUAeGJa*&R2V@y@2fKAHji(gk>ya|Syk@fIHv&`ed*}aXb#7*DjV9s#>Mr zRRO)Ked{W1^neQkXi@wCJ6j#cgqeg{ur5;B)@sHfaInYGqWTtcX!FbIEMvw*Bzg+k z7H2w`Rim<{qj+KDqYS27`>cFHB~_O0Y5@#GEHQk8XRPishl>k5 z{{D=nn%6;#xTCrQYv^P%LV3U8m?KJ2oIir{oiO~+30;>1sIma@yHU#BRq-7%3JRAC zXd#NEir)BT!x*H9Q)aECynRSr+UVx%zl+NI2-0t(MrP>knTsNb7bl=|vY|r7!QWUD7qrD%1)t5R?tHQUWTys#EKCap(qZN%08iQ z-)4dqRnV{$`toL=Wc-Np+yjm%IoE;^ zpwKRv#z4;F%lr9Sy};IAS^Vrt|HNWTidSs|<@;D`# zal~AHnl-7S*IAih@ETK3EA1|r+PJz&)2k-*;aZ16 z#*%4}K6i6-$u?)%2k7fWZM9E zNET`xXlZD=Z_R)I9iS7Wdah=b%6f;!P)yk%2qlJ8feB%j9~56_(L>ew=~b<0=wrMd zkfq0UlB+6d);m_3lU#vL5J_gI@@L!OeRqv9Gh$Vjl|CPKV%NU^gr&vVh=>Qq6-6XSwsmId z@7f;WBPBn?xzXt+x4Cc@@r$Q$=+0{D9~qv}9_v1Ba=tBrVD`iSxNl-p{o!dRwq&AB zS!F@_kW%d)E|idHG>1#an8Fk%KeB!_GRxFobo@n2p4F2R{^Trr^15jLO<(gYcc~po z4~`E->jRHUNjC?lcKE1K)d^^mgh`cgH|;Cs@jX0h^s5V}x{$SST8sMRLgzm&Ja(6+ znMKqlyDHiJzD*3>cdHn?w)9HpByIdMStaM#82+3Wq!6CS`O$uR3r~hE@k^-!ZwpeWUk}5%FuY9ajWZ0w6B-+1{7+7^{mqjd13`%1 z8z8Bc991Go<~x)&;Qqr+IJH7FBlqJ4TAy&>5G{Nct(YojBtiQ1QIN3EbCy{dExVe~ zRVT8!>M3ze(_?3E&xF@Q(6`&6s+#GR=B5t3+0?kELVZ_23MFCbUhIpYRdjMSTRnW_y`8CO&(2`e+eDO=v7gDl#E?g2~u zwwZy;TD>WUiS*MRTWS-B1kcDCr!+YY9UGU>*M}r>1tKqQJu(a0iif5#BDX*Yaw=AP znx+z@i}6hMu-(8#|BC%nZ}sVEg+hwaA&kWfH;-&c(aNU4fFxX2IqSSpZBM3@QBL5Q z`6%JoJb5}$ZC0r`-RuC8)Qg;(hxj+9CyvPRQnVF~H%Y}@F&=K_qsec|U315HpB#_B z9>am6O{iwx&_3S|7kjCZT~vB8Hx=yc^mK)rnPivR9{JyK z>J+7|=c9bXr_yiptqRK!%K_mHj8$Qeif`emh3wzb1d?C-KyM@-&9wYR1YT>?Bo#2mr$q7v0CgGjOGTgbxDQRMdakHm#_xy@`3Oe3>~ z#-gz7__5K%^e*L2vqKV#2*pbM9TV+CO2i)F`^YkXU(Cd#?+osypnl5fyhIwiKx||f z$L#c-t9TLuHU_rsK3`G`P{|pp|^Kjt^?E62M6dQ3)sa7%~ok`4{=mjv&!wG z*MEm}QNhR-xZI-Yxg(L2sVhn$mS-=Su+gGWj$H7L#|zL0m}B5i&$Y3g zq5@KOh9F%#eDl?dLD`aADBXhVBx(xE#xWNJo)%J?Cs$4JyQZ3=Pqo=ZYI4Qbu3ftD zc37tjQ-6<(KSe7TvBDXNV1LP1e=M;prU z2&78KV~7e_V?>pcIrD~G9`%(>iqoVLhsup`i*t^nEY}K@wTdX8Sy&{J_m)riO;nfA zOF5Z`W!I*^;O8G!J^n(m^IJu6OI9jqO&7|~GO}J6rddYGZI!Zw9#i60x`}`J_?6Ag zf~ML*TjcVw6icQ5z6sLtg9M(wSN2Bxw;Wa#6|bA60tvnm6}&$RP5xBINx;>^CVjn( zf)n9Y`RF6ERl_UC`Iud9gQJMg#XKc5NFv4_8Fh1kY%Q0F5AD0;nh;9nNuJ!^DT(ByYRcqu0y(5*AygP3@J5tXaldG6b57klFk3P^+9=*9?fGNA-@b{F zlkGLWZ^wjp_&9SsNeo+>WxWvypyE}3a985IQhiehbDXoMpJh2Ed3nvauvdGjv7ynj zvn-7FlKFR^$O-Wq-nx>Naj9mf0hHkyWlqC2WvBVaZ}u0BoZY)d|A@t|G}aG{ndzVD zIs(#NOmBaGf8MzrWi=w))5WS+4DOWapa1yB8~^D2&KQ4aIhEIv*fPQW;NEw1Yg`6I)MrD!hHt>tCC|qL;oLz25Ly z+5G-{)5f5J(N2DN?&O*K#Iixu9(+e?$5@_9PXAJS`mC|-Dp zq5h`+JP+i1S=Elvv(c40G@W+vTSjndOR=*p{TPB#ALmJ*9=OYE$j)qIo_Kd% zw%^Z-G|5Uj#uRlUkgzz*qmT5O&}GKl!MNEGEIwwP`Vgw%PSTTB>lWrtSM~0WoLQh5YXg`}sjW8v) z+Oxs2=S6e{RvDfNtno?E6lqMagiwl@aKYtrQ1SO9x_#6v_oI^S)ICw9LQMJ_@XK^u zb9EfK8(JV4x&T_DKPwem1Bttsd=VfK3`Q-%P(Ww zNMT{IMfavW6saTc9LN}FA!Fml(W#Xi%gs>KTjQrscrubXb}IF~v&CnhB_?p^McHXOlchSSy?E9y9NnjQ!WLex6=(BOrXZKp$+qwHZ=4Xuq%nGFVkzLRAlegL z9US=>weNMs)tc9L#W2a=Efu?M7VC-Vcf(IcWEQO6IBY9$nZ3ZladC5-35|1`r$*4m zVIKP41~lKBe(IAF8?54hbxP}WH&;?eJgEojfiHi|fM=K-j$wuF2R9}<+wlI@n`OD^d0M#6smPv_{*zau zM~`BX-zloilwBfy(+sR~xO&%JFX5{a@KJs$Ky@HMZ|Gri+R8WSh3~aucUtYjc@86{ zXw@PgCtF|q=!lMGA!xIrqfM;haPNCzb|bv^j7WpMlAYDfFuiUQ_GS38_~6R$kgr9V zre$&&JZu$RsAfbG6Qk94!rr!k%RdbRfCW^$c9Iyt9;I`qZtMj z)Av5Ac%M=)e>=Idq!s5#l}OXE-I4M~yB8Y=tLDwmypx=)$}!bO^Ta{RolxlonW=OM z-;xUSZs`QeY%fpJ=Mj{AVZ(W)SM!-4qZm|8NZd82n*H8%k6NYdjuZWtNsp zE8#VIi>3&;y50d&fM7hbN?HpSvKO})p3E2+h$~cgUwSy)yvkeQiZKxM8deQ{h02u!+c?mQgwh3;FG$|%`dmM5)n2jkB@g&?1HFsE~2xF zD^y_;w}%-sW$0mevU6e($UXQuu9o|Q#ea$9kPuOnT*yngIM9S^;G%Seb z(V(VYrtzabuFc#Qmnkg@ zn7b2_>@P+kf=frWIc)d_ofD^<)O$I(?r!tnOT zIy`w`=7*=1ME?LBV0)RCwMQeDzYCnYHq)|7^C$;?bXuEOIC&d*=J#H#>+maPuFI^A zbduYz@GplFekyCH>#7(izpHaeIn2c$U@Zl6_8G^kC) zj<+#X2JGegv$)V`A8;mgNl49Eg~Z!aN9c4PTC29xWz{qOUz&2vvYDdL(!mi z&^jvl-PjwOes>+=k6FDf{(gQUTIbX+18-9=cde)&aL@f>B|_^{(yUl%2`kyf)nmWe zoc1G@u|2JxagaaHZi{@lzgQFYA-~NEku!l4)~vXhg6VnQE62W+S;Q5~wFF~x-1Q@_ z zc<|$F(c6U%p2L?LBiYv(BqG&`26URzv}!-xw+~sDE~S-ly9MTrHa6&W91eRe)yLRWGz^utBKFs(l>97M+|&$TcpDQ=MIU#Hp-kFV!Pu{S#o{Y{M_9fuqUUN zB$E584=d7LT8i6Fe|qpuZxU&_}B5^uOE5Cfx~&vTDCgZ zQ-7uT37=XlIkG>4a%}Vm$eVi$wlp`|9oTkQ;XW9DYs}?&yFmSkEBDvo(Q?bmnZBed z8_`__A#tEm&5XlwT|XkcNn`nTn)pzeeI$0jK7sResz1xyiJ_&3&$F%?)-H;PhsOc9 zeE4p*WEdMSmh+1nw*l>2r2s$|la}r`O7%Fqy@tu8a8FJ1o-8QPt5o*CNuET2;~mZ?Q{7s11lv4=Ls9d_(SPpgJrU>Jy-D-=vL@j837uvs@Nw| zUq@nW390QoO{+9%*B?*Fu&NkC-V$3(#zxPJqgcW~iLP}V(Koq(`#mU&AR?iUKyKrW z`5KfnJZ$qKtQa|3#BeEeDL}a|H}7M7i`Fl<$rk}(&lubu^{G^Uq!E(Pye08&NrYc% zbq`9moY~z-DML|l16c%+Y{I4{4uMk>L;sQYax!Kj8fD(jy;0>T;nsa+F&>F(E0H%5 z{V0f0;dtEY7tt1-m?j@%Q=L5G^7XO%NM33!^X3^6u$}FdSm5!*F5s8mQ=m{}uPICt z9$qCAl|n;kW)qeNR4n8}>i8fBieSD(n3A!0zF-T%?U%Wh%DdjLWhYXpQiv*y`?n;X z=O2L~%SMN~1TVaoB#wAvzol|KU0#MK3(ALA$+l~w6{lXGLj&~RhX zP978)r~0#}i|*aCwiPSVJs7+vcV|@cJGzkahMVoeK2OhfLtG6f2B*rGoQw;<=^o!+ z$^0lofv7`*9cn^2YkpcrK3ZUXTyHmJu=_OWgb~nBH3QBjKUVLC}5CTPd`rRb|yA2CE-;cdW@TZ~#N zV1GQWKW(2F&BeCG_YP%v#=gR$}0Oqk;T$2M#CoweqtA&5zZyE>9MC| zHS#XZvT^%svr@8=A*C`l*(unav=SalvEs7^%u%K1$&U}P3&j7VXi-Rq&_R7RB?mr? zKQYm(>Eq`-q(O6IgF*0?eZKT5QQ7_CJx73yB^>Op#c+HPzFgH)`*mxzZs8SU4tH)y zTl=!Z0OMV=w<{}$v>sx7x#d|eN-<-XPGVW zhd5?|t-StC@;;-&3k8Sn?qh;K`YA#!{al#`wj%yx+2^W7j zO5{>gIQtJF%9!?0BcjubF-omiWyU6Ch&A5Isp<5n7P!vqb&bl$H#2FoLkSV}dAKNd zDg&83VPbo5!E4$?l{-V8OKX;Lvn3i7_c)CAY7=My;90V}I9LLdM=xU$5fMAu+wZ$V zh=|z4H6@7~Dzq~L@gSZT&L>pF`6qntYamzh>(6@@2l8~w;JAP%(bW8vN`n(CNgs|s zgm-0Rv?tdiLOxa4+(d?b^Fx7Au+KD=7!P$SX{~!IDlV+*O9xAF63JHBqfx;dX{B#!{E+TF`mBP8lXfx$o@sBbzKQ zZ(=GbU;g>#yBzESdLGs3M>oV7UA|Z@)jxB0zY1?Cpdb&T-Y{lYK7X`RxwxRYC(3B}>;GHBIhHm%M5# zw?=V!89*{R&y|l`wA8R)CB6^uJUb>0Y&WOsgY|dEO2&cMZyTq`CT%6&* zC%Np%h=73LEJ;i)cxyAl4*2 zh*8mleX`{hRDk#HcqRtW0;s=RM8G5I?&$$X4##B1D=5~*#$fS9YHa88JJKthyW?T% zp<+MR!86b4!%o?{%BHj4$T&iHnBXW^kq-}q^uGgI1QKVM{|;G3;12)yy>w08R!O1% zj)qqMc#x_1&u|UEWd8TxFfmWD$N;+Zzhj#MoM@v>04mdJwwmew@!Z)hXAjQKh<0Uz z^|@!B;T?Vzy#HK;E<$=v7IyTrH~z-0$WNbwi$P%E?|y!U_SVV@26(%E6Sax9m!XAY z%DlUgs?J{9+2NW*AlVkV@hCH0|Jr}FL+4s%0$$wGBA*-`EsOQ$fty6&-Za`7wZAXL z`EMc!W{7o4N=jNi<>G7^yIuR&w|fbNnX|QGwvGBdu z2Y4i<6d(nF%IL<_*Vj`@C9vGjAm(2=okCzHm~(a3O+`(G#$ZCI8sH-RO_d!6Mi|Jy z7T=x82xUC8dWrRqaE830AokJ5&=K94xZ^D<>iuHA>_w114;;w8J#-1^@lWoY;Toc>ies_qwpkJBjcL+GSb(UeV`j{Wnp^_f=TP zruK#Flv;LXSz%t`lC;sxdotT{_9BiNBtEiLFY_?Ccjzh~JI~|Kl7$&3dLrgxIH2Uv!Jp1MTtAqdVGmNtD&o_XR z6%Z(aF9+XAffbOQot>DN2s9Ne5g?TY!_3SK05t$#&&{n45a)=J6P-!K3UB5VfE_d% zww)NyIP;wJ_vI7Bo!KpOy+-q~PwWHvPFC+e&$Vf}$&mOtFy7K+{^;4hG9Dq-nodr;|?(Xi8@`{Qr`&s}EAweD?7D)+E z(n2C+r+)v>P8B9hmR8o%VvH6COz+3>1%7^hO-)Uysakq^D{VozH#aw#a$Eky(H{S! z3dZ)i`S}2%76~1FUjqbE?Cjv8?%_%YV0EaftbFq5QShQH$13L=tG~PW?~}4T9~~V9 zOiuuVWR1wE>-g*}<*k9Zk&%&SCnqO#ARN-8>Dbo~FDwU&kh{ zha2G+_j^$qLcIqKx;1(vW3@On-jY1`zC1eX$KNk%OxI8#yn5af<2&t)pwYFDTa{vc zK>O_9rwVZf;KZk=r=Zq-bN=G?_Lh~E6%@gp?CkKzGq!Veh?zu$xyyAg-eW(+Ctav08Uv40QE0+eV$?de?Z|l2e##N9;+tJ^&-AI=TvE zSN?F3zCF0_8>fibm}Pa|+T#|hL?})xPrZ`0C4IN#Qr4G|vXHgh+rrypTt>qKgYS#K>9qSr77UOVv^)h^2E46kG8Dh;ra z9~YX3>+8{4P|XKVUBij#$YMghD1^nUC znyYF9AK38Tu3>0OmrZm}y&pAgSzV|lLQNK~->0wT<-Sj8lA+42kY;dn*MuabaZuRXT~d;G#G4t06pcvIrmd6 z@=8wu8nO<&!TY94?t^A9Phc3X+!Y$$?2;LB-SNHj_E{&I%yWJ6iWT+;wRsY)1(~h; zmB_<`5$&H|p(38hJuS=2puLD20-tt#!o%}~Z!X0D=3+;NiSXSK(y-b0V>0!x(S+zI z6;8#(!^!dN47>bRh`-e|B$E5--|HlxEEJ5@N{N*uFtVq*h$z3VZCGKWX!COP9=i#4 zra=7YDRBpj57V_II}%4NmJ+s2@{u}G!{ddEhpxQvwv8J2c0=ddS!?qU;=aLEce`~x zxN4oL(Aqe3BY#ResQJD%m87KM!-&_?iJ@=*KXxV$P$GT%`pyBT+-9Y{%xGYIbQJOw z9X*BBY<#^h(d|T2F1Nh4cDl=ds!P^{B>}XgH09)ozKm<`>Dl>=NOUo92Oj{9pVb&5 zV<;`Wy0=CyAB;OaVtNDx_sdl0b_+~w+@jYH{S1!WGS00a?_^I4{_chO8LpwHSS9!n z>0(>mvHP``oGE}iSKShGvgb2%GcH0eCHAcxVGrJ4iCp#Fyy{&SR&>*|C;WryTs+gbjVTb9vU`!|8V@$r zZs0J1Vmo88XJr302`Gt8tFwBnmhE(Yng9bDDGwfeXcVDDP!a^bh!p zbxJ`e2*tNJ6TriH#c)ToDb|Ymz7!ubY|6dj3db1c@bRB>g-p}VuB@)EuI0-Dzy>qu ziFxp;)_x0HhWo+$Ou4;^1^UE5XPDj59#AQ8_JJdB&*_t+tpcRdV&*=Z0cZt( z{v@waFZxIg$r&>R+`Fq^K;`$?TTU%Qfm&@LGHnY+s0!0|=wf|)=-)LBGm}Uvw zrflnWbtK!v_5#+h0OOH4-|!!N)FMsK40*pf0pDPcyhR=A4$pOq&K*p?Z4vt=`(*05 zH{b138L!Y-$-r2zI(*suUoV}DskW^9Y3QE3isDw@F^hjtUq!5S*3x`E#;4YJowz?L zIdDyMo@}@H1Ua$MV#hp{eSTc)IK&sdIDX}(pN#; zPGvV%VK&j;+6uZkQScbNfn+LFlOrR`9QUR{LlnndD4;&?7wYW~HU*XXI>)^$aE%YX zonM?#MEva8FXN$f;@bm1Kyf=+?{d#m9!9`nyV@D<_8-}O&1;=dJ|gD3sj68BqNXi| zfOE%OT=d{>_pS#?F`%XIdb~Wdjvy9atMrq0Mhu7HsoFr76zRu%YZ_8cwI<)dqg z3s0}m2EHVVBDjK+Va$0{=I|8cPlHdlY9rT#oF21oqe_0;Wc++H;Zny+>inr1Cwl5U z!^JF*XE^(y`+D+Bh}^)-Yo^1gN@0)qvXnDM$YlJ)hG3=$HX+B@rYnWJw-`sYDvGLvdO@8+~phj8Diy*unL-VOaK z97ct^)Dvd?=sTf^E1Ip+)LsgKH($|1$?R*cumyx_;_T1>tewC~;CU+#&|y=+4{+qf~~wL4;1bS&eVv1*)x6vvY-J(`v2wlUx~l=)ME<$gxk zzVOE=reU)uJiBau(1qM4PqzJW&I|27xN$BRVdMX}5h3b;cMn8DXA`oy3ZShNG)q2S zT3Q0HlyVjNMS8(oVEZk4A5 zoyds<#~WGkj&X zzQAfkU2$ILs%(JNOEA?S^?IX{fU!p7b&*u1v`4la;*XVa9KF_APYJ&gY>}~1FCIC~ zfWvbgIgTTsS3Pw*u@dNub=S2)u{|i^PVdYA7-Jtj5rDwa3Y$Nz_x!VW$1AF;>Hyo8 zRyH6|?@M5<)J*1d*am1yt8lK`ni}x#!b(n&R+Hy?Z~W+}!nMVZ1+TlCtgI}cjme;J zIxjND)xxDae_Ka)Cx%_sbhD6GED?gDs0FY@80dLC9QTSnOKzN0%(OapmozgTQbLA_ zq|b5R4&h2UG|&(@Iu7&E-a9y)$~3C_oSpcYzMfDP8lKCM{Z|*ARHA;38oof4sCmQu zkC!dnYp>}N#TV$WhU|x%avJf>?>KFbXRIu>lDMQBJ2xIcvSI3+vnLoe6RRB*;VDII zGCoG%j3?DsHcmSvIA5IxyZl~&nYa92(2zy<9okd?0{`dicmZnu1W%uH$jkLJ?h4 zfC{hoAbX32xHj>vFIn(Do8?@4MU7}BhtvZ|Z?MnY1mZ}t?dS~-!+u2kbd*oPMzzTxn+zFPkovcH^ba%8Nb19Q>@yEAsjI|=B z7)aJbr)7Piq46-5&uhEs_QX=gkzkv#;;9j#)HyEptIzw(nM8M3-q?gmg@%J&_)heR z)>jwUsLD6OO?rcMykZ5<@gN;&_=hin(&x+Axte16N4 z>ax-OTV|<><;_z{=8G{6#!d?i(Zf_iZ{c!5XS2o}h49{~C#atLk#uEaOAXV-K6BFRj%5;j60Wz7l!KWv-z_qGS-t+O z5lCtnF>8fRhNLS}Pw!sr=`U>EVFKlzf7YPzkN;T2$%ACc${vsR0C_euRYR_yEiaNc&S5v z+e^zFZIY$FYG`jaW6MkN3q7W1-Cp0mTru+Wa({=q7e{=8?jZ?X((XA^JAluVo*z?U z0uyof^}`>&#DV&Z{LvaIF+7+W;v?q)&vv!Vv^0A5DUs%{7q};PC-T*9(dFYQ-^|DR zj{mCtjKu=C(5J4@WESi$W?5T^)VbcFBte(Ys%)=?(7X$GEdlj!BTn*;wEAbt1(v)> z=Q6@wE>Sxl8)+sUO1lCO$(|3ycqH6ZZjM-kDD92rWS<8A7MsmhAQ+yV) z8tZ>!umFqs=S0h~wXxaS-7VL83tx?txxa}d!+W_3xa96s8h?&#DHU$>#|;k+Exj3V zc$b$61m6|Z=ME^8@7)6c;K~!4=j3bFN`U1~>>U)#IHM)?X{qtY`wg=7)#|5O3WPA( zjlfGgLs17@@oSEQSaHC=aLVfEG*^F%Wjh(vaQdQ>1BpkCNLJ&X?~xXepvPT^=G69kiiR=o8L{f9o%|e z?R>AazoPMW~~Pkt-}d4GQ&1ixow z>x+wv3-EPzklzaq2yofX&CZgHfB2)c^k~j$p#kLUyzkki-@YC0a@qxSJx)&F>o}Qd zGUYCt5$+=+gqVskL%{J4f$uck?);UYMXS5kGax_$mfYt`aadSzj8m6uv+ch7Fx@ih z#o5mZq0!?zq9wOnYqMe~Q%k%s-k&=T;0y>^>11Lu(?Nw71T&1FNDM?BVFOMRbi|jB z+C~nBZ{8C!JX}b9m*a!~Y+?omdFObXTE(SSQRpDMvWntCw0X0iFz|fIjq%Yo=ozq# zaczfBw!43R4@~q1)fI|Gfpi3~PTJ^H? zK`#+y8N5qN#0{IJ_|KemV-cVK@qqSGlb~gtTHAdXHG3O$wt2TygEwz z#>dB5f-V5~#w&=J5WfP*SI%DNRGLpc1TmG_c!3Jw5Na$OqoJWWgDvp6o$cPk;I8Dj z8dVGTBJy##A4ImGE7y4n#zvi)W1Qi?9a46>!f?#$O#G{u?x%bTgwra)mjk`ul?YvL zeTeFVK7~OI;;84ZxO?Keia6nC-0Axrx{FUC+K1=A?#SxdF~ii~mtbhxj-p;v)!7_+ z!k@nn2`L)n_26FR-PqdR-&-G=w3!*ONGj0~hPe#fvRnBZ!m*dv*O_7J9CyDw+xdJF zJG`9gWZC)$)iTsFZ04IVi?&`!T9s;+vALzwPuMp*Up$x)w>EeyG_}PFxhQznRVf`N zD0$&n?&(+R@Vy_=`*@(4{mIhIo(0yDkQZt`0Id8w^nU{vG&8fUqvJ5MS|AO0^UU7e z-QB=XkWArLd1`U*JKV=ej7@M`kTsN(i)gtiFE0nkG-qQuo`*qN1)2@h{mAk0@xZB7 zDKqSA2>ZL)XSHtOh7n`s6VG%|EZ0-zEja$>oJVMZJ~o`~`mzwsT4KK2 zC&mH_{(VH8OyAcI)}CdT`iv@bVgY8#_!VgdF`nn&2CV`o8mHjWcg#U zq)m^1601UN&Tek(EG#F+*lDu9x%Y+h0lqtUmQT%Dn#AOZHPi!%d&i zF)CDUAP)Ddq>BI?A*wgI-eCXmuAV{ zig8T6L-p0@ANsYY%6>m;s1DXxZupX@B>SAMc%MHgg+0?f8cs%O4(25!{hKWt>RjF1 zn*&kd`1txSWnT}qD$8h5a;t_@B?*b1vVm#yq(QLp=I8hK_OxG68VQ5&vS_Nz2n0V( zUK`0yfk8o$5fQ7lH3ERiT`8Xx+Be_e2C_nB1H5KUy;GO6r|4vc={oE780(B*mWgP&A)PT04&Y-4vK_OrnNv6XsJ%E+Ka(ZU;#O!{@IF=t|7;fIOLTz z10;&zeGLg~Wd!el(2*phTItI`H(Gu?d4J@(u8Y^r!yDb;;uVKo?7#$zgwMuQ3GWc@ zPcxVU-9IyH`3AhN?6a~7xha1v zlHRWHyU`}q*tr}vWZROBj@7Xnh9#R?g#;pBgtT65@(xY<|9ay_t8j;T>){!z`zV*s z|9kd-3l9B&nKq}m7^If#&IJsww?WczW(MKm!=$cKKac?bUBTxl{?BZ{PZl9ixB_># zL3x6eo&9{Fj)k3l$DWgqk55@STVNuMBTrNNe@cjC@nHUSb=P1s@9gYc!!*FB190n2 zFhza7!2i=Wzs{yQha#0C0lYZNT4Y5KgG&)%>K6fVKDqt z4CF$Ui#7LVlC>IKD;gR+z_0$)p`Od0KL2m|j1*J?zjp0|0xSr5XZ#dfz-QOEom*;a z|2U)2%dw%9REPr2>GAQ73Hr>?(9q;$&d3%enDWXBLUUhV;Y1%bC@Um&{BOMm zMK5J%WrZ2oy7qSALM0$6fT0blUIdoFQe=&6S>`(!ylEmoE< zVRcS%ZWW6ZZ`TG@Y)mR{b?)&b*GP!NY4yku=Xjr8voNdr?3OX%&h{ok`v^8Y{lO9R zJ0=<}cwuk-(IEuM+NAL*Yzu)oT_@{OcOuUF^F@Tf-=!Yq`^sHaRyNYt*SD~+Ffnls zA~O)afn@{M3jk_^)B%_@7@$g*oSY114|4GI^z`8G!CHVq1qK?LgOd}k{y&}l}^=VS_H^#S%bfhD>TP7|}u(#`YO#A!s>`P0y%`35HK3@Af;t?O4;N&8>J zt6iXa7!rc;HeILfzIr&Ll_?Kh$>Z9$-I@7}H*_$}O8G+`Isz-K|ECsk70EQPx4TQg zY#5w+KeRxF4h#_N%+)yorLL>3{mMG`cQn-3!{P9HNz)p2Fa?ck+oC$KxPG8!bxM|N zq&zzs3hK~r*4MU~T4;@bi7=VFIKN`C|Aok;?ocDM8Fz7^9roovUmE*yoA&u*goC4_ zBinrwZJicR8f>D3j8dQbC9-vJ!0CUiKL%NlBeNyCbKYAaX8d~=guE1>q*Z_7=-`0F z`UhQ^C^@6_+xK z-`U&*HhOD&8(5i_yCwhboS__04%}Z`TU%cr53?Hbs-sMgiFtvGiwlbCzllVxHtjic z6*xf|{-HC=@W($H;lAiZAuRR>#y``1M99!ybH6g7-rU|c1sN_A6FhcH^}7ZXa2xtG zBQ!KrCxP+b28SW*jpgOHhP`oTXJ?)sxZqH@`KRN+?3c)YoDw0SjHvv4+W#>Wq}yn? zxUsiI-unMz$%Ou2HbeaXBHfx|p2H)}wIcRZYs}IE=l&uS%W%;Js5Mkufa9>g(P!RnXxw`r$8jHStxn49E;ENzNAHdUW~ z9m&Wh$puAm(s0T6x0xbpbAWRrEscblIww{5L&L{|THR!}mBp0j@ms@zv*l|5K_Tk3 zjt?sXG^D({{42o}n}cD!u?>HWE@5Rpb06RDf3~jwF5Y~|+u^%o6-cqw<;`7{*}2!v z)?5XnzNd@asn6rElix)fe31mNAHT8KDryifyK6XwyVI(*7I>OXmFEeX3{VE#Ic;Kj z(^R-<9RIhVI>HW7r`erfO~u|2&qvS1(R}!W>jrVNQ4E+J_g6q=hp61m*> zLb+2=iPWnQyMr%8;KqT4bFvZ9@GjP z)?PfHyeVw%Vt@Scdz)Z5oyw)}7M%YvMAabS@=)y2=70lRF-Su8Cc&d%zty$TAk=Z_!rLaR3GrfKg!ro#3@ zmFsJ0{wNy_k?Mgyfa1V|1_fOeC_&j(;Rb1DEUyRC0I0p2RG(}mz5qzK%)5Lr5TvWg zFSsxJ#O9~ExG8>Rw9c@XAqoulWskP$%FhTb(|aO&NA0Xpf<7~f-d5Qp?#eg7~xqgecY@!VN`BXbGR)||pr<7Vsq3wYLx$0>8 z@UNeWSri08ti^U!pJ>@x(>B9>x>+JC7!>orSNGW?A$tocN((?+&5)7L4RNU~XUImH zOhTtfVw$AGt>7e_bJIkSB^c>K_t7S*(i(;rf)h)^{$7Z=qCz{r+m8Rsfy{uJv3Q&5 z*?RYa*>*jvN4EPm#Ab+vS+y?%X5@P@I+l08D!k*YhZ!^%sR!L|l3guT(CRoQAylN?qFgYKZYpH)C zB6*zW;V&JA!`o5u;R6jh<j%FKxTexxrEi#Ro-LmF-~ zaLu!@69_~*^3kEQ{_#J0u1Op`SebZ^4X1)(Ya5H_CDmV#SzI)Y0 z#HEaWijl)CJ&$Xa_a4I|NyhUd6>HX$qK2n*`dr`a`EJxXku^0dPAqaFoGq{ zX@BtM_pAjJv4BY-Gu;Qt8KO-_#XcxgnUt9}yX`x@jqAV<9=#z|Symo5=G7mj>*Ss? z%Ix097uYBj@n;nL8j%l|4O{!EVPD;vwbg(UWtC)En@FColo+#%Xx!^9hm|?*)har0 z8l5uX>vdd15wSH@WXY(nUGsRB;-UOK8|Ub04TX=F*VuUb>2Ww;r^){0=^{j6p&*v2 zPbR`7pn2lFKr!2=McbkTaqZW12Uv}+4b#@>FviB4Tvo-}UeASktQ~Xlv4Bc{wGH#$ zZ^Cc;NPViJN#Nf+yh)Wq$cJ9i_Y&l-)QZQ{rBrch{$4#y-0d)QM^;mq^-SW3Bl zQfz!%jFh#DE2hb4HIDlkEpc)E^B}SLnC)4yQIUaGWe^>}XzM+LZSN0|o*)*@FF8eH zV{z7943+K4&`N}u8D9;M|#j?OpyD6@9t#cpfnrTFW z-eljWZCpC}g!O5rBXJnX5O&BU{i=j}w12>Su!N0dT%~+PCpHPszAXV|K%=wa{4NJl zM#g1pD~L!EcSbM`7dVBUL|58W7GGXYWKWI!`*rt_lhY_rMyM9yy3ITljPp+)Jb!el zZ7pDyt-)TJPCau-weo$dYJdTce@WHR+p#b(+ljt==CKyQ*-pM4gX}|@EqHW=bPzw8 z6&2}Te0Gnt^>81vNiG@l#QY40RtFRs_Gh%S*rgp`ei*wnjg!xnnq%*n0jg$D3A5dI zG^sA*j$x+uu59R8eE8^`K-yQY1w6bjvZxErPxmfNOiX}S{77&JuC3T!l<N7 z$0|D;B-v*Y_GO%8^bRmqth;US{UYhM4AShZ?@<}TZ}~T)l!cRiWthIjjm@j^ zqFSg<1jaj?!W~7vnnfMy&;R)0AUP+;kL+sS3#c=1t7mAZ(4$iyb(PiB5VdMY-Q!2& z60&Vkn)`inkSO$b9(H`EiH_-QmTS=NirZ4ABV30J{2_$o zQ(aDB_=$lh6ZUDe!W*O6TmtWdK(zt zBKmYpUzVr}a)14GITJsyR{q(p0Cgd{eQaVIiluCAzwX20NA{j-)e%Gx>OIHH-B`Ym zXnm~`O9kIkNW391R8L=2RMg4oA`nGzcVok-wH?THb90Ser-v~Zxhk}u(FuXpRgsi~ zNo>4R-Y2KMx`kp5Vbj~eq-F;B;5n~p>OSqgq<0v5%Hm06tu;9eyoIcST-J4dc3+Z= zY<->Yg-vauu$A_@TE)%V(PMJGhoV?7`4-ak2s6*Z-3N+MfRBLx@eL~SVsWJ0_DG(pu8M@3udBYD3My;7>3^9w=dYX00-HH0H#`_uxv$1>mQe0a5Zfxz$ zQwL^n0-dQqPsNPYmLsI5V8-gZCY+^i;J~$0XcFSudXOSV-faj*jfQ&l2mQw<1;BBc zrl2U@mec=IDW3vHa6`LNjd4WO_2`f01=rwIU_{Pk_vU?pt(~9W&B)CS$4tHTr{PXT z`AAtf3`$kW%=Kf^GLpfq7q1>;|5VSKoYts<5aj&wdLs}LJ%l@Ty+N{sc4D`3Qk}Cz zdSC0REoJ23`Yl)6JxiJT(>V7}PQC}c{k-pNrJa;&Wur6sTDryvKKJMz6UOsSpNVXG zZ^N{z=bYoK0qEf{m&{fs<(9TyDG~Vi8_O63{DVM{9X@ z00o-Yu!muaMEopuKd_|)UYvNTF49Vyl$TbyP_IbobGzA2C@Z@ir*~tT-*SW}%gq+R zonuwMuxg=BIFbPF6Hn)3+Kq34G*rNs_;Nz^4Ofb;eI%Mb4kP3Y!c(h=oV4xW-29V4-X0C3EXyuq>xc za{Fpj5I#!i_`*?-f=dx0+qhLW6<0=$Jo)qUi3>nXv7iir4A5e=eL_bp%Il@SC{4CPH{xM)myIJ2-a<_qEZEI&GqFg;D z%>u6wzRe)DTsgkHsm5gHaPmzIRPB8ox=V~F_!&W;i`YJFB@vFp|MZR+i%75hjlb+n zY2s2sA;|`I2en6p+aIL4P!DCB(E@Pk6Uk$?!|;1`X{A4Zu||?#9aZlS6l6l)9NN7j zJ~f`Dh?aEc<5E2@%`j{&`kKjhqs2)*P9282Ihd;kfFlBuw=H0@v#+l&F)=Zax+gR0 z{TMb86ch{;s24W52L_+!Xb{$7ws$g;gyHQi9v%nBoI&Vnj!lHkGKRUlA@ohmu3xYX zpvBAyl?q9@j*v`_r2|+QawwHMgtOAql!Cy-38?rEtvP5S>A>M-s8%c0G*JXtr5;>< zxUn1QtmS$G-8gHM5Dr-0sb?&W{kWVLSdG{MCGj%0O{8Qb{Pk^MEj6OS)e3H<#U;vL zvcZSx%e>-(J4E=x_YW4B7?apk3Z^i33$!4f_uypGFQ&lH?4q#C~58-~#m=aJG z0UY-^*^(1hijcY`&r0^`p>h)IYzy|q9de;c5kxLMyYMrW?8Mi0GvFs7vm$@gVA6#0 z-!l1uOah(8IFq=;t|GVXL!QGMB!}uZAI%7VMKYkfaK*z(l1on0iKd`1&wg!C zI=ydwERGDMYzs$5hLVdo9hGCDIj+O^o07tQkOG|KH?pA=dED0T+TP|siXazIOe@1F zZsuB3%0R2~fd%sQ5!W**^-u;IJy*Qp=nV6(Ik^Bi%TW70_&&kzI}jbXM%&_>-CtQu zvmH!Y7(YwLg9?CT8k9TLG(fDA92*|!rNSOuS1IwCf{_>PZs87wrhO7u+Q=BgsrEHF z3=}r_m5e;`{ zC4hC0D2_x-y@MthyyNdDsWm$~fzhCZ{aD-cH%;W_Z>q<{Cy2A3>x5=)b;9V;3=qS# z)Qm5WndTwZ_A+Y<+Z1Zkl>L$)*?We?t;nvL{A=uNO2(*8F2F`1XIvn}jf4kS*vj%! zmM7(3$^WiJ%6s8(1genE2FsYPXibkpB=9)XH0R5VuvZ7PVKZOTw)aIZr;l|yQ4!?{ z+8A0~KKGYXMT(jl8bDVHASu7UyJXg~n^O9VoJ}_Giv3O3El*3_dyi3Da%nJ^%gSm(OFH}Pzrj_!sZ0uQ zP51=gLr+BX;r_ycopVK}#dZno-4^d3Q7Qf!5{OAkmVi9KS%Fexw6tOnAb3-Z>p^89 z7o-v36`~U2V#)eGN*+v4PobLmBVSJTbJ;Hg;5&|uGd5n2ihT}ugr=ty42{tb^Nz3e zJVQbOOs4NIsH?_D{Xyayf@zu!9lLFgx!%jfMiRrKxN;yN@Nn6<7E82vMg;C<^-J

8zRhE>8k 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

*}_1Z0g}>!psZQwg$5wS*h@Ku|V0z@s{^ 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

ABv0 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 z zxpCVeEY3eTa1>w5Al36Fi_3RSA*eC_AQ*~K!Y)$p=Te*IlDxvZrW!qRnjwsO9-AKA zhYlS@CAhBFokiR%cA=smK9Uh^3caU zp#mT%SMjA>y%pTom!c|>b5<9tVl!z^{mi_m^6bI3nQOGKf1&zxL8#0a_iInhdQ#59 zKYf-7HUMl`bsRf#oWy!l+dBH%J2z`{eG@L{u*-33$vqa^h@J!5;bJwz=j1%u0Kb7r zeA-7)c$jzDCb;!=T94!VTb|p_34ZT%b#l6#*Hjh0f&l&~!SL|#)c!OngeE)Jy3rY` zs;cqv@tgj4>riTmpy!29eSU@*Av(0Pnk`ngg*1P(d5D_Jc*w1J9%e7dWp^GEICQ0d z=%cp4^k|YCn#_+wNvCR~g14L3iUeSgBtoQ4j=$MCw=Pj9;QJ}swJ@9CW~!!sz6LC-%R ztj_sWBTGmMD0I>T>nZ*Q6f~l+kE%&qQSQ}tsWf`~>jz$dR*naqTL*}z#qrMiDQDr8 zeom*yns1FN# zQ|Q*m(g22{xQW(P`PclXbLnGjeBKU#gxXu($$u;MrJ}s&GY}me9oh4dEL8W%f8GDj zyveYtl-n*;WzfN=4wf zL=r!i;#z2%PX;5A_Nil*VkCI$09u6!k`Dpvx%qbFWj*X4?n*^2UE=f$IZCP(IK(Po zSKu(p-w)E#S;3ED>)_oBL}0qgyk3YdW$A;1jG9NEcg>H%y8z|QCewP4VLE5fghmY{i?%5H&ACbGa0oZQ^uaU`H5-0< zp-C$CRc@Ku@8<5gdZ7QyZ!rq_cni+^GYiGm{mcAvADWtH)~>cV_Wat3{$tDn)mQXAH^%7)tE{HiQc07^MrM_Oir`$?_qV(9AeTKY_xNS`+3V( zGbD6zB~c%z(^T_^WEv`sHYi|^gHqQBhUM(r3}DD{=S-4x(#D0P?Aq^WZaE`t_(IahQXtyQRWiU< zmjJ-o5(f63A?f~sd9FwU<=UFvw;d<4rT1^_eRXU~JjRHPW`UT~#c(;A3<~@qomW2B z84w4Tugvg9U1iyhYbuj=ek;eE%#gzo(UvKGN8zexD^CW(#ij8~Zk(bgxRclRHVXdd zHn*;}NMSFm_sH6se>;>qHPE;7aBpvKm+ZIKpgFX%nKq;>{G(6 zYLYS)3{ywUqn#6Qr(xp0d#z1pjc)ArAF@}2QwicPxIex$A7WYBkNFKhFCr()!6j<~ z@d9Vm;N@N#4xp|sAvgeJXm_Yqb)R7R@k{a}Jo!lLb!bG+F=X;!68pFMN$ws^;z)wR z>on#-s3CPPiXM#52?@vA<2HF8&2e?O|7H|y>k;;X#mb@{i2kVT!m^q=&%L> zBVxNstYF{+J^s5HtKSqmQ-1eWW<}{RB^rg(o2!fGh;z*OpB0dbd|rlaLnr?x@kUM5 z0Ipvy&|+qSiLxC^?(OUAgYtWUP(!ky6x0PZBWLpV9^20XLxKHj`OM39KFw<)4ZM;U zXPe8Yv-AA1rdXZ2NB+iknGTW2$=(H`0(6)OI9MS7PAWQ`Z>*yN8X57CGXy%=Fx&Zn z!yU~@yE8lka-Xvo0t;XRfkEMo+vX>LKPLq{c%P4fjP8t?GaB(L2mXt zOTR49{woP~q;LaeT>gogf9EG|Ab_dPyA5CH_j_rL3)SDDEF^ke5GR6fsUx&u_Ql<* z-g2S7wU)c%T~UyY5r}@ks7TVC#3%nO;aYn%jzH^oTwfmI&WFwUscjl8eS`ZL0NBOo zrdh~#%Q-f*5>a|Gv<-JT0KYz5T}>KAf$61rN?w={V)77PJbT(aHtCw};7tx?Hj)uSy5G`NH@>u4#1tLGn|{wf^&k3< zHg1uRW2O__!Xq*lnJSV&OZO>qI(Svl-e$(5H07SPll<;F>~|8`LktD-oK{kgk_&EY zQR7RVxROkUP>-VVp*E=Uf+y#oJ>R+hL2|N);cD)GNNfJ&?k+Aar;9bG7t+x4B3uu( zCtDmH9d*AmSIJ;onA%cp+tq814;6f*`G(34!;2I=-VD_Ro(>vm4&Gc71M9{6X93Z< zGD94S!@FKj%)@miDeiqy9gmYUY&V4CAd)zs1q9LpB15U@a*8KlG^4y!AQ|*Vby1!o zD40z7{P2W&Ophh#Bfe2GiNCMmO8oXcM3HFVf(#Crh0@SF^~XX-u>tI-Ffclbmg))+ zBh9_g)N$fB!)1BEM^vR_3V=R-@!WC@tpA(9_7E{D4~nUTW4gI{V%N;sYAj2#Fp0?&PkHxeDa+n9{f_KSG z`%vpmgOHkZDGG=Z&X$4+mG$70Oo9-e4UtwClH2W1QjS0Q>SmMONl5{p$408FFRm6e zJuEHvVu?jLD|cOceh8CaFMORv&Jn7oh_4H+4|;UrqJ!F+YE)=3HmMsK8(*9;bG`lZ z)duPO?99;Ec*B$JAejz%pn6Oq+rRrOSK8OKsNtq9`axS}H&!+`(zxtN9j99LEGl+k z^T7+(m``yBUnSG_9Fr^Y_!v!Lx-wVZRs)E$96Bg?E}@da?Dt7&4nWD0QiEMl+8qJ5>;r9+$?(EjVn{ZwGr+JR1YWTly2L zxOMpv4koc&gR&60*E%a^xGjf_hZHrLdFhh)T^~vfVC8^7M&gHs`;V()?~3A*eL ztOVas?Z*d%?^LilWlVUI4d+mMhtS^WoO=h~*l)to{M~~ORs}s;j4AqgA~j3PN6NP! zrY0_v(OY?p&l{EjdAEh&NnJr=tIR#LL4c? z;iav=I+AE#5C&wB66q74%u&ORrKk~<@OGLz+)?KC9qfa3czUjcKZzynV3Uj$<;L}x zx&L0IK$FMh5}IgfwYOCgv+|&FWzuhT(J2$Ujyrc!#0{iPYOxO1e>Hgj+NGJVC~bus z|K;mm!|tPpjL2(@pv0S%Hj!xXbE&Ok-5rx>4 z1mNVSjj zc=%U29lQ(V6d>&(v}jwd2kz4cF8Yu@rW_33#pc)+8;t-j;I=-#tKb82yoeSzTN+&O z>rcsW%~A)PB&*BIWI<98=vn@|sBa$pjP8q_kuZ6#W1^_gWi6^zIg;;)GktK z8!1*yV!}RKU_yGDpoFa3C|sK85cX6xNVX~z#Q`#hK$r*`y$1jDdb+?zEFM6_7Lz1JOX%umaeUhkdbEmP zI%BvpC#$298L%8W*z4ROR3fNfE(?ML-QS2YO}s*%Hg=P*`}tYc3)M_|2yNsHBu~=! zNm{|mCk_{Vqsb=WluY$U(HC07k5vwX>Jh-R_zHy=dKm-ccf6|eYj5AS7EZuz8~ z9r1@pFJU?c@^&cg^M((N=Jlpn-kXRbij^0HlJ~1g<)pVR`Mb*xX8-5vAa3pK9bI1j zI_vJJ7XuAPM99+Nqlx;uySRC^e*Kt7>UgXoUm^nV`LQ$fM-uJvVo2NC(%>DU)jZse z_H%p*s^J13kYYv)W|`?Ul)F7jxm91$@kJJefb^Io%Bb6t*2&5|0hghO)4`S&bb@E? zGSB$`xO&T|IJc#18+UitKnU*c9vp(ZySr4S8rAc7K;+G` z!i|0bX5c@@l^bKsp`5jBi~}Pd=HcQPcT$nWM1QJt$#czYXjo5Yku!zCu-{{T&2yGJeNqO=E=ey+C~jQt3z4xs zAi1x?8d2fCvK992#W$%uvbk+ZR5a;Q-}W8R;{MHbRpsTo7VTqRt>*x&O<-t<4{9o? zc9xI6`FC*-6QhxL{P4~Ft~8g46_}3+&otTpoXlw&oey4}YEm9RET;MUCmO&T=*sd+ z{ITn&z1UTD0|3N7L|;vGZ=7=S@bhw~(mJ|2bEY-BU0M4*0H4gK^W&q9Zor$)*4g9L z?J(eNeLEDJI4jG*?PGkg>hg}O`oY-ky1RdPdK&f~DeJt`*YWoC5&CPVcXeZ3eT15O zo0seBD~vqyJ=XLIg{RMDnb)915wY%Bz1{DJfs6N9vq>UQ>?(SH6C1s@o?V>`0z!GW z{`wZnhf_JZ0-|#M$E~2<-CbmX*Q-IGm+;4n-^b+P$A0H)a_4=06%bYF1>$??=6eXF z477CeZ*+=3#U&;SS1ZjA(N+=We$9*~9g8QBsmuYpScNMFf3RAKO1I42Z5lrd^E53Q zBcFHF{e8vb`v}h1bP&Orw6N=2br}#wVRRjVV1K_>!mhcRfWway~`tcKB=d z+1VHKf5I_Kue)gpVjtj;Tid1XSRpopt~bycu<5+<{k-$7@nehlHRvDX;f2Nyw&$Zy zr)|FnH@^qs_g=q8;5OOpti%mSY<;h=w1YLv1OYtIwOwccqp}|xhZW^JJQOMB~ zRU1zwb4jOHS6A{MxALIg=T>@NpBRhReFpHyPr~ab#iAEkAi-n!!*og>aAHOm~ZLMTLjp{Ih91hMjmLgy}vhS;8S)apQlxxUAvP;fGNphOR%`N0$f zkmvNF|DqQ=u9n~U*NrkE29$b%YgxJ=-}1nm>{o}5-l*&g@=q6}5ELwW4;P+bP-5XD z$?{l-eD-f-O2ypbsUz6Sn^JACiZ`Lmt=n$#w{-5x9!c{^WGUg|q4;j~-z5<6eClZi z@>y14Eix*rNG!L(0VK_e2>rBA6XaxVhCv%=OT6&#@+b^FUFUIc z_)6dcqY=C#p7Z&q-=eaJ33sSRUY|EsUy2r=GEMF#v-tU+K{t@f_;~nVxBl`#dsXf3 zytde6DQ&BLmAK6Ib8*<5_*^>|nyhos2>XvfQ2&S47Aaoz|Zz=`*ZHy8VezNF_a(`lFf3c3)o!+G~cn~>eiD$+W6BgpiCM(TBVe9<0AV=M|i(@)19U^{5R&2DDh_D%)H z?p7Ofv<+)ZG&Qqw0+~1Ed#$NGhjXv^E-b$plIF?>WyTd48vKS0LlA$~3H!OO?Th}- zNu^T^LNvR{b85QQL=q%B_)kQc{q6jM7^cv>?&ECPH{Gv2!Xs7S;qk3^cRQmd)7|ak z`2Fby>xaX=W68dHAna+?MYW$ptm@uoZqN8W<;;i8_v+*op;dlI zRma=iGh|S&UCU0X#A^}g-$|UEnfX@VdB6C6qW4zDe7N~}%Idw3`aNAIf9^}a&-ML4 z*d6^u1Ah`p1ibFgh`hWmPs+=QdAJtNE5;Ifgzy%2J}W#204otzcJXjlhN%za?xFZ0p$1&X*sysT${*%DvrW z*;$_fUuXzrR{ysF#Q=rA?h!N~@oT6acT;hx zgXj)+|MmOHdkxCrcD0mu1*Y;;>h4A}%hR;iQ$Z+`qA%ixJ{mGkhTPmqGf43DOs_>@E%iJjl?&kk)I}z}%4%%-+uK1nq9X0REGE9}- zIBikJ4n?~@Y;Fkny>}05wR&-KadS79?@A)0kK^v$WXqn7bpiMLy~nGg zTj0Iz0^7H=?)SWRdv$fI-#0=3K6$)+@xB^=fhbKRm+M4*r+<6BKl<^$`Qf!U`f;26 zK06pq?Dw*|33au8>5ENDy!%-t0~(FHxw#=DAzjo=KF~L#U#zuY@{{>ZtQ#^hiuMYl zk4()<>H1iO`*C^dALa?ONCBAD*GG82?Wm=s7CX%0bnB0D2#4YT$oHXHGbdQ~*vX)gjb2Zm>J@#A3d<^cF#+cJL@!+wD3ZEgPmTiE) z>C<_1UMfe<@l?;-waL#l1g2@PVgA2yWdL7w8pqpTDOm=2(_!U0X6-XMs~LwX|F^F} z`?Yt0hp)UGHhvtosM=Ueq5&e|8JN4vb`qyZCTUmt2 z#fUuvbaS!2LyIFE~2U>aVaZ!6;h`p;2=1(1=7Lvu;-dj3skP{q*ru~2N2}|BH>|F z@1x<0p(C`KS5_yIAf`Anq_tB#Q3MGSvj!nzwYabBzk;2V=^WMBh7ZH@-~4v@sFk^~ z=UFBQ;!|UE5hW>YnXlE8f|qS)=s+N=OdK1PaYGtcfOd2L0VX)-GuqGBe6-5w;a}bB4tMHQShwHRn_RV3?%ZcyBz1B!0B{4p z^tEdvUR+CFzPk0};MDwha2L;C1k6_!vJGCS)6Vbi?@j(JvfeqJ?paHwlY=8% zhU~6TISckz27&~RKI<(_9&cdYlk1Pkmd4j##lzTrFKAfR^ z5^&@Nq&Iv#>wTQseVlimJH4-WzPN2ZFEosx%n+<7RTE!5U|&dlWXQq9_oIV>!8K?Cs|$qN6rJqcWC5G|e6JHi}OL zfpO|mG3&0qwt=|9u%q)lXLK6C>Bz>~LqNejXSE6|gD|RrbtSfv8K*XZ_1&SFgj!A( zps<96yC$@w&83belIBikiW_=)LTybiL4*aUX?zLzbELln@g}+DNK7!^&gJJ5MUntU z^J6F{iW;C1>cVxrS}c|8T8=q@M~pye8w?>)cwk|*CiQIuHh;4?Qdrp;y#Fhb$e1I0 zR0R5j(YKBg1e#vzoAEl^!)MRh8VEnH@4Y;aYS=4DYTH@QFe!k4djTNmE<$5S8CTwM zji~ZsJ?>16R(jh|2ta@IDEO{T($t!|G^r6*twhFhX{Jbky!lf2RfMhB$uq#4+9ajU z|B{c=wW*UQXM6P==pIFwjH?w0>^Q!uJ@{8TYS8@H%YKdbyPtedmGJ{Q(&{xV-5gGK zzTZ`Sd@jw$w7|0jhxL>2HC~dH(3k$@zc;WNnLP`G>Nyed`N`49_ihhJS@o$^6O$kr z*?Rg9(-0TBv<@eDs=h9cx9=slCs#)!!hS1H$-jKv81CJ&H>qMhEJR(-das=789V0% zo6iAF0(zO*pz;#MtM0_-lvYvT)<7&k$}+F`kue_U-yW&y>X1&7U;X_f!WDCOUu$o_Dex)2s905(J7J34U@7FO@xIR+v_0;ljrWa6jHRr#xx%_>md>sP^BEi+T+G#tM@yquD+OK=^TkJh zWTFw=WWzXi*dM7`l^PO&V#{o+BT^xtPTfN-_91%0lQffArm(W_Brf)0I!(1`IN-c% z(v0P11ubIDSFlYp7{Xe_Gmh!zQ(#yOqk8f2ns-qCaFxf7u^l=eGQLwrJ1eKAQ~jMm z9%QPPQ+~BvNdAJ)5U$+egax=- zk6%~h?eBl$0?B~Y&vf2-r8RaVAj|^sdU4~>gO09CczfB}TLijugI+)Wt!3!2RV1Xd zH^O5l^HKD)-6k^h)BR&IaAJaq^P_}rp%DlH{O1}6A{2>VyZ?dhfL{T9^R0mI9r|}a znL)3^{qGKtju7RyFaN$L?|Z)Jd(L8OfF(xH2ulnFLVcv)xC~M152-f$!pcZWqE0(Jhl`e|92&J| zEluc9Rdo~whnjn@%^f#pf|4tl0qJ1!26KgjKwaCoYRZ-QpsWj)%Lt(odcK(EE2{6z z%_=zG!(<%6%L*=tj3ufAkBx%8s`y7T4W=)SejKBeMCw&+RDd0Ae5cm5af2BQtv^A? ztuL{km~Jo#w{M{Qd*p=f$P~f6ic$WzNJ|jS9R;n*hN1=Jw4kb+izl3jG?iNwVbSo* z84c|+mH}D!KZ4E$(yjsS85XKkTyUA{!@)L-#K-3+UPddaDX%-&;*?gAa$IgS@;fO)nwSbnrID4z$r^+sA}>#@#=VQxEolFWS0K-yw#8P-{~#z3 zZ})6lIG?s4T3)@dIEhXSyX1%(((8Z6mK8+(vX?B08*cU&5 zZ9+ty_ky0>Xt7nn)}6Rq21tCWGMWjcHExWWcgv%@fcCeyo890r-)81muDj}6Aok)d zvGZDO!|&rw;3;0bnrkme^E3TCEPNb{yQyv4S@1*@tW} z%v_O<1txL79n#A7zj3X6MKj>Vk2iUYwgMM7)we$=w++Zv91Ai)$a590g=X!o^u%ea z^;wUOGBc@DME|G(slGyt-ZJ-5_ptl&-#XCU)h)w&e<#S5+xx_(Msq>DMS#F!Pg?}f zFd20S%F|ispjqpS-Q{^Zw*Y^OqIIx2T7pBnA%Cr8ud?EeC5w0#uf`da;0UCF^ z+tt}}ciuwf+{HV&LXx;x}fgM_wh8PZe>A|m1(|7zGOnQ^y;~1qiVxhVFdfCW2}>C zs439)$H0oFJkEsq^|hW_d@2ol{dCmj+_t5%lG(#9FUHvE6vZv`00ZaIUVU2=(tNY! zGElTISi&u$E6GZcn=d@nnngDG86-ihBIJ3-4-DW|qGLf!Xp}}aN`D!|DHOiZxCpOp z1p)19XY@~68@SG9)H_wKc_j#5e{k zCI6f9oopX}DyxwmC^v|K%uty3wh8^#m3lVXbYq?T+LL9#@D1ac|M~81{Q-Msqc9#b zkeOc2*WR1G2J!NO_$-sahjHYh+Kzxvz~}l_zpDKMbOTHH?VrRQ>(E%cJHG0hSd;eX z45RBqw(ngMP~+9gcLVm<0TXldj@Qgf??e1eAR%S*@%QExq;7}z6YweVdyD9Nj96d) zq~L6}H%8euuAp~xH?nC^?a_)t(?V4l%G*xbss)d>&<3=a{=n=&V8yPq!trIiCnqmw z-@zc7h>l1c1~X35K$>N9)^ZZ~65m3ObhDnS?g|qn@%?efpLvvdY^**tu_Q=Yd5+t? z$EJQDlL$tLbd6@|j@zqv?6Xb*rfYI5+Bb(vuh?CTHSS#!j!TYgv4#vE%_791k#wAM zvCE_frRndeSXSpMpE0$C6-A1Q)=WTP)D`Z$`5G#HD7&aaO53id4 zb=&a74?Fj7Hl`V!np4onL15Kgw`@TND|ucGG*sjxZ~Yim2+VV&zK4d*^7q~nujyE! z(66)8pe}hf0{71UJ?x*$Pd*7y6fMr^we|)Ee-;yx(vv!SKM&~jx1xN;o!y7%$$KOu zR~JmX%WQsPp##trc5R=~oJcizP!^Jyrz@apvkQ!VygaHXlAYdq9o6 z_v1<6JHnKUlMst%>~^XHU&G9fH3EL5H?3 zg@Xwo=Y|all5l-6#+QFkYLM2=g3-|4WB&=uO{jiC`a^9c1@^t0u3tG&JCThhLqSf_ zi;^tvm%Xuiv%kawr}SL~Uzt}j#(H2%nB_hh)CnBpcQFC5VP8tR%|)c>>LT}_W#Up{ z$m&s%rmRMi#dXW!&OmbeGII7~RJ(p2XJ&g2u@y6vnyI0S%<0DcPOR(e(12j6p$S}O zht%IGdV>5EAqX*Rgc#70fdI2H6WbEntRY@#;SA;}Oi&GYpjw^~M92VAi3FXeIw!2{ zbyz6g<=O9TmW|`$n4q-7qIT4rjrok8-+X_G$STFRLc~^Ty&HTY(eNC9PP>0!QY<%< zbSEG3+p!-e0S)PtwwMpq=|4qa=#q2{5ba99ZvM?z`Rah2$Ouzaq?@QHIpFq#s(vwt zOKrE!GG^jfr=$|$ytCH{Dnz=M8*so~*$--$=n8iERBEq|Le0G73c!k9@Jn*|QGWzB5X&O}vFi6?cYS;aq-%dtus;*H`-g|l=lR={sxNTniDZlT znpuPXP@Za4ZtJFBDb2=-I26Z+*6@(5^sd<_80eM_V<3f0WhzO%$)D#eubACJ&XnvZBQ5S=&88T}sYoM|_ z7>%P%tp(GOBBF2Wf4}$93ngeyY4&FI!Nz2v^r{pCorfx{S2rwXIL51)3FS31;71x^ znV*U<_7MAVV!jzgxi-pcM+Ja(WvS`ZaRcq**?n~J%JvC;(WBslJ-0kpUv^^A7s7>b z;r1e(VQ(-xFu7hs;AuCBFm!~0#__rNE&Kl+z?AbJNhiRXDg-c)(iISBS5z3F_WTrM zfLpV%m-WJ0v$Rj}AZW^javq@&kc`0q`O;WX*%A^Juho(qaYn$jGf4Rl*t-KDsjFKP7Mas1C2@9*;?` zdpadI0_g~BMorM3ia`+NH8fOVPcVy*fD6*AuV z5K=pG*+6?C0c%&1Sl2`GO0*PhAWc`ObdIVEIq- zS=!m&@hz&xlSrrd9I!^hA(5&{zc#Y?>3NEicY5ck^fYEp*Flp;wO5VqDvzYF?4`=R zRd#5ft5fognVV#D0Zb}JtOnnZf-15~&qGWb>ea}ChoqL4^=UvPn+0%$D6MQ!pqWmR zCh5lqw7lpE1N@O7^h3K$bCTLuf_UtqQH~sC#u9tfK#saI(T>^M#h(tGF*Z-?67dKW z8POh0+($zWn$2*g7N4eWF>x!eSZu)2I%qK;$C5|>KxZ6YLxM}y?AJr+l?EMPs_l4V znJ4fb@U9h>flOiEvd@vu!T=qV_e87LGuy{brA@=+jl#Yx?@oxFW99APL~R#ds(2w$ z=Kry2$t*aX2}`$&=H2bFdY-rJl{bi~pfeTuVJw8J)G-PF7Eo_V5xA|>QMs#UaI@d) zwo3eO8-`82?=FY$uHO5opGR--#}*JGS{gkmC!ch)&eTER8C^AZ&Ct=&YUir&!q9nh zHsa~l`tn(G^7Q?k`qX2X=Jv2Tz*z4w$;^tSS&)1*4Xiio@pE~8JZ(2uvd=Bu2nToJib{{e9G-Wt@9IL?(?wogN9?J6s`%{Tz}%XG)q1f ziUqgRIk?HixmLLxQ(R6YQI3#ru$Xz5+Qr`TF!S=5+zXp}q51|Sm`K;p?x!)6hY$F+ zq%>=$+?fJ8belHo;CF~Spz&_tradve+P9trk$S$-HIy4>_&yHm$!cdrqCXLiId6=* zd~D2iaw4yrBd}=HP3lo~ZE*>Yy9$G2jnahaylHwpOO18at(aIDGA`t}i#l zE45!_>lSCvK|Rc>0LYE-*2dT&o4a1qd?j5}1wldmi?8aM>~l*#>im+>C0LR6JTq_= zsr{lz6nms~j{dwCFYoG##`;fTvA+HJC_nli2G}QrJ_4KJwdCrvP*ow4T}X2dEFL?* zui)pW=2y?vP;L#v&nk-5r`y~loT$~wHosj65f)2Od}nI-8f#Jj*#`$*@1H(l>vm@A zvj2UiALcHKJIY`aJMchODs#v!QLPa_z~ZDEONdSk!voqG_CoOOmrh439&JZ_8lT5h zv7)J-OoN*T+|6^pLMIz20qRU!8199JYdJxY1o657rU(Q(1M#gh`d4QR{xk}5!!#>i z3C>|nW{w?7@F3$v+^6!^BNrG5noJ@N^>whI`+KVU&~gZxbQ=wy+dtq1ww6SQ=OnMF z;X%n11Z*Mf9X^^V2v|JUaQY{WU8J9_^}3mu==va~D1jS+$T(ryIZwCH8q9#91m zL^~4*a-j$#gOw~qW$1Dy2vO?!LzWPyc<;3FsW%5{LBa4?t?ZaX#d!81Z-s?-{HfBh z4o_#8F8mP5kv*WYP;wD_*txPL-C0aH5bDL z6QB5to<4p5d45xr(55-2KTZ|6Eku^sj%sDEp1#TGNHt;o&V^&Xa~*h9CGLaB&mq+P zMQ%xmEGy%lr`p5jDjq6ubcWaaA$bc^<%o^1_+%=?K9HkF-)?_2xbF)G36T9o#bt(e z_M$aK>WKXJ9R8>CX2obauz#rsOr|#ZX10i3qShk`jDw2iP7ql$ehOY_m z3b2q$qZ3E>iG&R#n+|8!VUT^t#lM+iFt@MOMf%46*qSh_G31!M9cWuWPM2B=#0_SUc2Nd9V?9`P?^N^Z?9*;#6L;7zZ_fHA7L5HLH__slM(34m;B_)SwYit8>f(Z}R zVA?FS*`LQ`P*h)OOc{rfrIsfRd_=1hZHPG};wCQ@J~Df;+`y~AR&(JGDo7jnkR1J1 zXvXHZdo%i6eq)u|@>J^Cn$V~3s-nX`NzE51!g|XN)b;sq9QXWdY;&3tQ=3s@6W`O# z5~mWw>RlTUVXJ}^DZp5$8}a&w8KEF=tEo{qPJ zu&nA?dR^060ga;b!bv7m$|7_)N*%~qk=@;Y2&QhRB5-l)`~@@KiamIgPG___a{ra1 z{^>5WEW-pa@AlCdM`O~svP?;v(iTjB(VT6hb1T^JYL-w1MAY^OD-FvoJ0H6k&Q)=H z@JL1aLz;VY?_c$p`--^LwtAwlvhD_iLsx0GPSV{3C@66TA7G+JE7bZM)k;~QMF{l) z6Ez`-n}W)a;8McV#E1r1yUfz&WmnD&?I7QBi%PIE_XhPkt(jdqVbNW2 zz}3J&oTTz_DZ2)@x9a!YS@Yql-jV9TheO52Ire=`i`700(6$L@_s0UV>Co zqRH1tliOQ_OT~cZmP4fN{1HPLX`b5|O3?riYb;DK!a0>sXagN=;W4im1JN$YJ*9a;O$pbaqh zX&!Un)=c;Dbg>|~@j*zjH8>X7EW;4zUkbCY2(t8z%Ob6s8@QuY0Y3uP;3cpIyV(!$ zI0SV5+k4xf3A8u&ygQlqc_0I};_}yjehtL;0;SA{67_d!QH4U@6qakeMbigIsUe6n zsv^}jAu5&jF&UtLZwR%E(wFL_Ng~Otk?~rU(-#X>sIq(wjTk+`S>3QzNOyFht^M}9&PjO7(j5?DO z$5>PnsyeT&1c*bEG$pB&ion6N1f;SeY=NC}4eEeR4|@8KF@2PoY4HBD?PNhnx2@WK zZ(MjZnXvS8oo~&9MORDBZBb+ULNDNH2&Rs9*T$wiH{&8QDGZDcaBNyGUBN0Fc+R?n zgi?lrb&Qkhx5$FuPV`js@TQ2=Ozche=Z95J=}~VMhuwx~4-7BUSCf3+HN_Eka*%=! zOKaTkxNRr^*wWgHOiV$zZ`I6yYK_cS94mr^{rL5uB!9)45UF(E{g?)+Yg6qw{+{)J zkMi9BzTN8%b|PDFC(#c3kT7IPFJWg%t<`?642 zlO)~Tkb*RaRBPI=-MnjL^Z=V29v^H?-}MRtLr9RTq2sYgOFRu&%UtC2@zU{dPaG(M+fGlc z_l(~hRXYl8G!%`4wBk0&LQLE-pje^v)&JBAsFOMEI8kHr^e;CJ5V^^2dsTzAuJP|lZV3jjsL4K{r&TC=bX zDHfHd_lKkJq9_J~RGx#b$VG9f@$(pU?-z~iF9CO{O^vU!D zunS-yMrYvEXhAievo?4qt|HOVf^*ou{zlqDwM}}3B};{6BwNO`)xzMd~r1D=7CzQC?k zUXSZ9Z=>*Rq?$&rsM&>PpuvHn@JDC_c4=knBG?sogHeeEC2$G$;C5eH+I7&@d8VRF zovn41*2Z31QL5~Ppl=aC2&dA?<-odiD)NlorQaQWI0~1vDiSoIVLRl_D0`)aC$ZjcL$R zoN`CALTMAOL&^s)*L{U@ckS0i4Yl!U7(|U z;d~j*hOrIr#Yc!Q!{TsIXTRYZX66r@mZ>Xs7HaUh19;JUWyD%bUw(m!*nUg@6<>So zU;Iyd@tK(r*i`WYlQst62L!w|*iLq%1>T<~{d^r996UVa8|VHB4S<2d&Czr| zgZDOkwqesNunV~Tc@3{|;<8t(6ddotn2J(0O}iU&36uq{>pFuOy3vvFhiT~+q4d0c zhqgaA)D&-l^8N(`I~1fgA)a6ZrVFefYE`9xmaIxVS=+KYY;-A~ht0yofckQb)hZ9V zeBOM~im$~5^gx0}Uh3T)cc1qzFSM(jBd6@rlcUzeBVhhHf6Ih2yOXkBFAjJoWCk~M zTh(Ip{n=_dXys@cVxtKFkBc(gxLQWJfq|Ip36=mIDLeh8I}PJ7LE&Sw#Y8XVp9e-!skbSi!JT9``#;lYE|Z?Szd88( z?Z5mpnM50%C5n7Tg|Zjs4+@e9Y(r?ICG9q1GVwqI@v)fA8wG6;2UQDl2oRW=yY-~g z)1AnvLPR6nj^j3TDi6`Fu)@}&CjsFTJkdTN5={zG6!dwaw`QRb`044w3ZLC?A0K|! zd)yN1_x39>=%R~q;695-c-+OfLi^3%V&^f86rCL-(mg6>M z0=*?gp>$1GtxdC%*`UMt&`}U_WG$ExdSf+&%#eapoDKHx568pBkBs*ovmVcu2wBqn z)`1>UAttt=MOo{FSV)dJi76In735i5j1_f7B8j?kw7`UKs|%VNnDA zXa1*M)3P-qRt)P-@4G#t0h-_%2M@q^MgAG~3Tero`BEL)4bK-6ug&$Hb7+~7ZVbpA zsO9lPD3Qn@+6P+rNFuCZBr@tfUG^a^7V_9LAx!6Dbpc9w-YWM{rSAlmSsgb@*O=y@ zL?a;DgG?han&gn?%RkVfwkP<(d(>`B$S_9lT?hZV%SIZ!Uz5y13RW0%F%n?8;@1$H z7|aX%^dq+WDi6@|6&v6q=ufAWHi|V`EWNgJEcp`tp`A2>hVevNw5+pxu*J9l@`}y4b}65XbV+xQe^lBL>k3`;*H?Ila$hT!J4~+fq#|Z?~>twB^OgjViKEDD2}cG)*~-QlKizhq!YM z#RzJ=dBq$FMcoq=nvTp|-%WYmh8nPOI>2xaieOY%PJSpoC-PreRaDzUY{ti7@fwIC8f`Sa=S`{;t~fJD>Iix(%!t; zP}!7LM~~TW)jPlJn5ftuz4{R~SG|U?Tm38fKvdkGDf*!6;H8Z5=r~oI_IbFMH7WD_ z-}~yHVUha&TKpY)G@0UnIZ%^B`jy9ae3Sr4-)+vK5MH=cdJ=#7^u!c+d)QJc!X|$> z1x3#(6DvKD)VC17IEU$$8pg?MDG+bSP|F2&zev3EbHXngC^ARlPVn5jRRwv~@8AJe z#c=8_tIJ($R22`l$ajOTstH^#SP%M)#RgZDNsr*jU@9P#t4r<({my5v*g=2bUp#l6 zWqxX=4*h`P+@pmDIyJix98quX=D!7peW4QR;V<9FzPZGuSQ_nR`Xaam*SbHxPe@1Z zRL96a1831SCT{vvG9o^nx4g@22oPL->PYf%8**<)Nq@yt+rHi;?7_Svq980@8)87b zp%D+K$2f3Df*J!vD)7d@_)sBl4NvGIqo}=~|6AYvk7h)dw2t`TSam9YhUHvNsiBdB zCMEWDK_3bqc&E9E9Sp$8b7(i^I|D7_jzVh$ATaE!LQFPF4h3N143 z;|vCiwA@?)Q!=o_CAHK@6$#_*0Uc%hk-@To*$auI-xD;JG)%;nVYLh;K*DZj2<0%n6SIel zC+21B{I*9IM+jPws3kROJM%Dopm$~ zV!ru%=hC;YGV(JlCyrK!nQFgsdEBwSs}4jW(sRcTE~auVN`egM^i#?mH;Mgy+~6^B z75nJeGGc5|2%ZrFbb7WyAs)hrUW@_C$<1A%u#|WJXQ3_T$p7|8{4--YhZQl!#LZ51 z3^JWkJ9Z39qCCSILRM+EAQ3KR={EpDq-3>l_*h0sxhl$0qwl%{hQ4UPmZ8}NxmH4x zI5rC>;HqPlhW**ioTR0||v$c*A5#~xsY#}X?#_sdU1FO;vD_{+ghFIF?c_VA6PZc=p{lN!^s zN~&_jj6c?MMdErpUa&b*Y zl5seFbxq816~hE62-XK#KII=lfl7I`7JK>s{mfJ&;Ge;wP3`wIaq4r*LVR$6=bInu zR^Y@hY!|r<*ghNI1VB>?>RRxZpStA+I$E`%1%I(_e@Y!81fqZ^lR(|!;dX;unjb*5 zW;U1JU_&O>@8$R^gP|?qezBwPmH+W^FlTXeL*76sEEKdz2x9xHoG%Fz+?_e?odc-E z3cwRi?H?cCRT-RLSKye0yW;!t+fe>@flJfgQ7e0QkOI8EW7^RxSkmq;Ybv}T*m85= zp7j?fxS?z%HMH^T$$NxmzhzvYDUyo|EuuTTjA%hMZmJL~AI(ySS3Y4A(su|aTq5Bb zttulI3}BcZ8FIC|(<{GCO+Fy+mNwaHviQDXNAp`Fg{_~=G%nKjI3>0XdC-vroZ;u) z(oVWKkDr_&e`qP92)AAmAR(Z#j@mC+6RqPzD8dPcJCJIgmgj|KZbEPsvjbW@l_6(D8gN9@yec8SOY98*;)!fRIR_S~k|g4V+37SoPIAl2c<8E>@q0y+sty?-fGr-3 z=@BG1x`=AKILxzo{M*eyp(gzbjhVt42|k#XTQ8@XyNV|Vq}@R#;CMTPpFf^|Tr2F% zaa*GD*MQmbx8^!+XQSb2W-eKzP)VU8l4FI}Y7F=Y7{aWcv?V5-7CglR6K}I$kwq~M z+jxVU?b|GmKjD<}>qG-FQ1S!AyG0@6;=4t6v{XlPT)N&y`Qv*#8#L}mw!IVi0o^9w zmr1(7Sj73-zmg3cbcm;HZLfN;5lW;=5SdsNndG`^E^w1HuvGex4rvvX;J&RZGEo>U zA9M7c+#XsNJ>E9fviJW@r@KuA{;S_4W+o#BJh zxRgctvTOqRLnZC;z3zI3zaIJ3IukS%c!8B*w~xKyGNn>S`4rH=LN-!Up@%Y_iBs&n zz=H@<(uEMjr{2-E1@pS<(j~$c=`t@`CGC2#1hop{qz9n|v7QV}B`H3%OW(?e!~DxCT*oL6I;Z04c&QDUBRnB-@TfN`amuyE9+p%wGk1@M*g+&kfj}x z5nehY91{I6QDs@FnV9$)$pQo2U-IsIo1K27U}{CL5Zk=Vh6LNv1tvThJ>}9zSf|K4 zxIGmZ!Bbe!J-b!ZG5h$~Om<8qYK$36rj7T|5`VYyd?WSg%U9JAo9j`k|0f0b@3g&5 zaEef7h%w9*>cS66*?P=zc5NKdBiJt&bWkvaQ{eMN=ves7IASTx0XQ-z4yM9-X#$O9 zD|qn(h=632FD~*AkUBQJEz>p(FqG}_jhXaQ;F%EL;hjw}gge1c>g_I^ZFv_NS>~Z+ z)_)(pvR<@IzlLR*_^uACO3ATjpZ$R17CKbf;Zrb)I@4-6g0%?sFD=)|*s@Nnh4?)T z;UY*}44r?vf@N^Tc7OOh`o)7>E^Oy@y3jx!lkp-(^ZR;LOgGfEP+*C)@&9e)SF+=EKPvCueNdthqZDh+`5Znhmv#|fd;+&ryx$18G zu(1*rZ>o0=(v zpH7iq>#NklwLb9;-Ztu2K0E+l*^c6H6wR!QN#3&89=nD(z zUsyB?R}KE}E&rQ_%)D&-f195_brojT!fFgd&{DRGY%R@26oweK>oict*5s|W*NRw* ze+i75mX?IHNXAL?pVoi_Jdmzvhqp`Sl4(LM@wP!I{}qauU%{!P{Yq&Lfpao9u-@_G zC!R$V4cT$Y><^iaVCS##MutC35>8y+(i+ov6y`IRmysC6z)Q77zkx@2sz>IP?0!KxcBlf+Xc1}FZKX?SwnxZ~=L6NHoS+vdWoglt5ICIIiaK~>8&+ewW|lwiqABlrytc0nE;3?Z zv6y?B9$HZS7H6nXcFjQq4{OXN7eSF-hE-EuzG&m|b4a3@(W4gP_`lt!|B0-?m0%Bq zn*3Dt3)UW1Ah6rJRm%Vgbk{r<;w8TlGcl+e=<%x7)JsjcTU+alVtP%AwUz?x8(RG{T;hkm1Y>^Vfib6D9Qp|Kp*liGz9`vfGRPCo3oo9~6ls_p;!@oI*22 zm(?6Yg(MaJcZeM3s{A5Um){{urizKZ);V(Y*n0wGM`hc0uJ3Ca@P05(-`>+y6>ll! zeMV+CX-x$bdnwDq85&joz8=nVi~7>)i+F-mIx(rW&WtQt;r!ZVEC-{}&oRo*t^c30 zsHfzwt>40T0?awI#^|b+@-p?o^}u)Bf_Fk3#iqc`uQk|_`^Ex6&YZ$(uYoY#-Wr1V z#WfdUap*f?E8h}|N6cDe<1@0RyoE8hE|hqYt{fa&chWx89PD2M@CWZ^eK!EJ#kxR& z+QOJpS2dLdCbTmH;St6H_KePWoDJDv&w~mmD*acG_2z0Bca`1}ht*ZkDVLTf(eZQw zt@~)h1E{{NF^~Xm>M_2dfMyn*8b*BSMY4n>LuwOBQ2gTRr=#%>8NrG^8OMQp64Nl7 z`5U zSjHk6{RO*WJu=}|Ja~ts>H{>n%chh6{b*Bm?)5rP86ccpLuIHyq*cW@)Ird`D^8(; zI75ma(Qf1>pV%iYYD?cxK0p=(;O zc*TdW5ZRkkrBgoQbXRHq9&N?umfQM)dqBm1Mn^*GgUoFSbndK98^X-V}=alg`lx2_YR<9F4yx@ z_u{U>!2XDXo2n`*R$gv1o~0rF;;{1hb*1)cWi zC*;3=-j$X?q7MWk$|wT2(wbR^E|@fBf5;c#3^<+@e=G#$^JxnV4q-;}iFzM0r<~G*vPB2KtLTdwo(&xtQM%qD2N4} zfTy;sbrW>n8nXb*$UiNSbe9dGHZo2xAnsBV$z2PD{of2qK+i>XD>J+&{8Bu3U#;@* zU2xZLx*j!grUXJ_R{%V1dJrwm5V4*&I($0vfVmi_H?{I7> zqe;5*Q+Vr;fz*|4rXHG#cxBQd()!K2*H|^*BMy?4Z8mpcCk2cWj>%zqNfH$cD@^Wi z2N5g2O7=R3?l_eUVSkt0>jxZN3mY4V6AN>b3I;T?HOviu4Af}-bYkMh$1PGQP$qag zu%%~7Ceb3w468Kfw?X;OPzg9|pN43@fnCxAetn6r#?vNq2pP!?<-2Rj#Bo4~Y2#Q@YBVfIwl@z} zH6yb9U0{Q^Fl-1HBk4^O|~L&wbs?owQwrv|q|nurS*PLw4D z1`Tu&^~Q&QzXqeKOAFO)StJ0svp?#Io!YEc=ZpsM1AT}0oe@B+qLU;(bu51^3*)=C{ReN#ar%J~Ap$I7Jt-B2P= z=DNC)DIEeV-4Z@-4?z+}@%lebI)isD;#1VUE8NSGzckJnWbS=hbPY7+k+vf>5{%M_ z*JkyX3f}k$55MZ*_BkjU&4(jEql!I*??#1OaTYiVym^{4$_rMv5Mhgb_vyUD67UY2 z*~ORs6!PZ1qd9^@E^7KgA<7SW#N;X?CTA?a%lcL_{*_#1v!IZKd6=e%0=YKh!%>Yy zP_|_DkMU2LAZyR!O=Xjq3GmAEQ8@}$#mKI?3vb&8Qu6rcDpj4dW=u)+Hb1QJ!Po%Q z56IFu)LMS%=FDTNR1onrF&ulEk2Fua;Ul;B1~3wKBA-$Gr~ZdSa-g5z=ox|kMPIvH z&-Sf}QAYnX(b#zZK#iJ(`BzrY(!bht=d(xsMUY?$RAh6ERokz|Iip>cqahc+4>2(* zf!^&&lTP~IA0DvD0&c@?;YI^vM{}Ww&UAj59-*fc}Jp4 zC2%hG1`z{0Slh8B1Q2(~o3O+_pyvn`!OXBIqlcYSK$s8c3(-D13&oe~J=zvGT~Jwfzcr8Km6!S7`L!%)tqT$c?~%$`G-pij-yV+{4JG1O-?2?g5@5HWkE zd};q5XyvXCRUKpy1nIEdC(cG1^NxW5b6giDGIXCzt;cwa*c2Jp(5TV|EycB4;F3og9Y{{T)OpoWvn%N&eWIMb-Ue z5r}a0Zg3%F2u*)BQH!3+H`fTOI^ez<=8e$f9q$_B)V%jj0K(`es_=*qzNpZ{AU10c zoigV*x%Bq>+Hc(~AwT^_p8^(0bGX@eTF1sqv7s!@?+q#FCc)Q6kJr9y@nNoB;F*70 zZ~vBx8inF!bzH)-oXZ(MZVo#l@dy$yVgns_^o>ppEYCcfLrC;UJI*JPf{TA4OQZiy zjBo$FkWt2);&Hb@=w>YKSGn^oi)yB5#a`b#OaY&GztsS=L?MvHRz!bUp9W9L%~~Q` zewY;s+9GG@tF`)-q}s0%uZcyu^q2pmiiu*bK331(F@YOiTTbuaBJ?{cG6glp31s3?@qj|oX-Ey*X&33(tWCZfiZGoRR&#E_&H3Ql9+|G& zBdXTLvk><%KhkH>sHRQ)43Y^fp(&9IY?AA@SBD5NK~iN=cn+8 z4@)up16CyPS%}D$wfw5CJyi)D$qXbm?Usi$9rUszPoXK5J{ws>)ytsILk!0py@LJJ8+N3J`#L%B|_gD9>tt zqoBUTO6b&0CWs}J`C)>FCU-MWaI6Ymi8>!oita;_jmBFOh`wRT@1b#ud8 z*EwqW_p9Z%af3E3kze+sM0)CmsO=3eLDrQTHHbw8)HMFz`S65 z)KwDH_&uAJEj{+b^RZc!B$}mpkH6ilDeH))oy^@PvBI$!BxX*6TMQo^!u@jF=RQ&b z5~=J>lqxga7&sE%k694a&nNiU$K#G4RGVkmyR2*(?7Aw##?cgoi82m0X-sZg5&wWU zOd=oPx6Z68o<{5NOS@akq3S_Y3GMe}TtC2Ma-Ixcy`5y16cc-?xJ~>Sp9e!Yg7IJR z%YVzx>w#0ySLD<6(&qA36K`L1?%DoD-!Q{g-BZg1?p1-N6uG$dTINUBw-`i?5s7agSB(Axyk4wz*hc%y# z%&9XkY7!&{>raB5k#vuAQDb*k2tr79=f1y{BV*p%3t6EoaN$W;LJIQ91TWrmzgz_g z+?WM(=lxb@Q-QrKZ6tG@I?AWe8x4h8H%aL#ewjG7&>5y`A@U0y>U+Z{cFTHKxNh<$ zUMI@smQ$nGJWI9e7^5@yxM?lcxLj}wkIM$Q$@*m+lW%w+Ue&^1f(Fu@zETZyS=c?^ zddk+he*llK+7Q3Uq^3cLdcylBc5t0yfaZT7aT2dB9M^S7eHepPwa3FWO%-#Y{FPE|uB8gOu|7bLm0b7ZjP zMzS_QSXEgzqsI(9(4=Hmu#k|8!k~~9+h7%s0dQeum086E>RzBNZp+s=Au<6af1T80 zBN7eQD;=jV7BKm@AYS6c1yTj7iJ($MjS+4Rggjc*su7pE4kS^v=n^}D~_3+t`)WNf=9B|U=#jd=rZJ1?~nVl2p?eB*veORqLwXgYC?nv z=m%%XND9}hIZRh$?zHIw93T$J2W?MR!Rwq=RtHgzE>;o_?GrW)-&$bpE#UHvY*M|^ zEJ(}JQ{G_>15Lct#1d%OrInKou?1G_mT`=v_FLZ^$)pQf*@ra-9O>UKmKAamu+kz? z-g1ZZ_i2{Xeo)_LWuZjYb=<7n+|l<*@5%SL8^63~C%0%mr$tJjCNJA77!H=GIr;1R z=!C-u$=_DL=jYwu_+4t{C}GcC4h2F?NVn#^Vm$xC6x0F>PEAYsr8uqr-&~7NJ~Cjmz_1(zMi6Pw3daB3j4=PSc8mEXmVOEv*2Dm9@cVKexTO5ep^?jop=Dw>#G zX3b|u_2bkMa$B{c;he#V3YwWSB)KqY%l(U@B!64>*hfNR@ioMjY(G(Cg6o9mBKBwk zpo^$@Z$1LN%~y=h3YU%SpNt<5>9EhPb7ZW)k$3UOkk$;qef+*x!}0XRVE;EjSJ$U} z^G!NUq;Zxc3>^(?No@SOebX#qEaYt8ef<6xa>;d}cz#3JRd4)eT?0O$u0)a`arod- z@173rGXvqnk^||{K?b-~I@l&KpzdzQGVDdd{5~dAO+7qp`W`ZrY9P5RmhfNox(3px zEh?e%z(m*sGq^af9;UUU`BL2xM|{GB`Mx$zxxp)|>*|cayIk zww5PLzO$jx$28>)Jkjz^MLD>n>rQDxIjSl``D9O2Ig*`eAI-twu(==`=@rm$)_J(y z92xkNK-}SzVL-bJEKCYh9J8VrvS_G>w)s7dyq20eRba9}KH=O}Jhm8H)|nomb?7E( zN$>o_iCb$HLYlY>eUDl68mIewJVu~@0<5mMGvNp3rBH)F})j0FI2#SSw1^yMn*vJNVu&*=6Lh@19?rG z$pYg{srkwA+=$m3f4xxA;rgN9uxviKZ5t|5XJ25-J&QrraI?bE4LO8@3pIyvODd?> z6j`@#74QWry*ABbJ5m?*<4FR)60|RgQs5X$^n9jokGjVD6OCeG(rI6uPO2eWDa);X z4PwGmn*aEK^})EhnKy_=&FNcrI+coVM7HYAc3Lf*FeJ2uCQ6^!Wrl==I7+~rn8_;! zJwYQrPt5#q*6fgzhURh>P%b+M$|)W2rEwpKH)8QOt|BfKLl#Kre?IFc$B9`Kk^N6! z(tPsuRAXXfglgQBZcSbmOkD>AyuOE?aqf@jyL<%%KVU8*3-%29b zTRa_OcfVM>|H$wOmrljIdW{)+G5p2gJ3z_HB-`%^D{Z>l@p{S+*=I+gc9Y@wXb3YF zmO)N=LVxk^zSgP9m7@n)C{VE2#kUPzE*W&+C>0VDnb7;g=5#V z$Mejw9lQH_$Y*FqPoc~-_MP7}Ptm$h>eaM}eRh=zmX>pMj<>1uYK4!U%b-@VJ1MFR zghvpX56W(fV$D}gm;#GYikq@9!sLSTry~~Q-M%Z>@e>(w%hwU2Oa~UauIR9!Lz&x) zHmjlJjpy_Xy-#H`Lk8l=m?k@@X>nN$%klRMCDR@V%ze5lpNIzT`yaXUcm}eD`FH5l z$Ay?Ksc1$8*Z$uXgj|rT>-|=LR2P)6T@x7adXTxgx<>gz{F{6mrZFCi0$~^}2>`fL zuw^-jH&Om|ZjI<#{(uQp(PZMR;S_^}a~{{>8Z$wJ>i5UAqxx(utV=sw6bi7{)7@OZhI#EqhTe5n}h+4 z5RBpPZZ#GYcJ!uPeQXRzYuRz@L(U=4jp%z#esT^aFOBt{+i}E@p2{MFXayGQ(YzTu zUG3sZl8T*i%hue`{T8huJV6LEFS9~bQr-ns=L3e|Ub)D)qzXXvZ~rgCS$FlK2?bURbqRQKh@n{UAKE0d zFmXgeVa+7K1u0rI&Ef&8CQs-Y61CVx=#s!OjO~uI{ZuLOl{9Lhkq9pSvjQjHH1)bDDh00( z3@p|AI1b-ClWc6_Y}Zcr8XtF_(UYI^KM@HE`PAGbE!mU3iVA~hG%za6Fdm-5+QX^t{VJ5#a&zDwKf4vP8`g2{}!|o(W&~4Nle_(Ho`}Wozl5 z*CC$L(^4Y!44~Wrn=^P^`|5J#1g5POO%%sbH!*gY{~F*hs69M9n2sd#>?=Z@g35XA zcZQyypSL*A#dS>N>=DwmtHDWvkG`=Bhv;Ow-(lG&VAk-EsMv)g;Z0$;Cq5E;eW-)k zJ^+r;Ns@1c@WYmV>@N*`8~q0lKoH0|(j7}DuihH}yOIw*S^#=1>XaxW;)CFJz0-R|38GKdjOfqU? zc;k*~ug(RHMZOe8;F>6Y;gjNNJTh5r^Wo+N!c@WPr1p$y76ot_iaT0TKJik9y%+&J|1QyAARC*qiVC}b7icx~ zosA81ygV)l3_KAzfSBxP*#%?2@hFmG@>lRrXB5` z`T}yKU%I&nRTvW%oE4lP^=}q9nk=#q3Nz@v3OiVg3f2qwvHT;+=eM(rMm*kc>lN=U zfbcAr=w(O|$6G`($d`+_q)xDP#!@F{UcOf|Sms4G_3#4W=7TEZt=Gw&Ll{4h!av}? za2JTxhk3(9<0Jf3&xOHzPhP2H0$?|Ap?&PRpowoI=t-H%PSyaZix4Y%_d)wjd0sp} zx4shVf%u|Mql_g+;)hlS>EYF#$SipmV~Ih2EZ{o|q`{(i(%jz~B9`9vH1|}p3H9Gf zvVVW^?TYyu55Y%Y*j@jr2GR5Ee%vZvb^Hi<6GyE+bRyTloD_;eVq?#N{9 zzKi@v+6277h=MORw}#AwMd?N=m?_HLOBB=Bel2@WGcH!lGIB?@Yb((1`dPw`JR4m7 z*YouC5hILhK2h{^AgnuGW2TP4$(K5B!v*V-K9ogN zdJU!M`$QZdqz!67yD284^gW>b}sDbAOf<`KWNg?5~;l02H*A!&!R~x>6}tD zgbL$6=%kxIHFE;~kXvCEWUR#^$jdv;O^+3Fg<=?qdiT8x_6~^-e&8+?(w>pD6;k^X zFkw`h9pB@Rk31u1iCkI4RI?3FJ0d1msE|1%FfVN0Zwd*N)dD2z0z#5jQhCYuFBTi zO_YB}@7?Q*nX8LzNQUuUWHP%FT-dLS+Q1jb6bJ9*f_jy|G9@0+k-=N4;va7z73oR# z5)ULJ=lU#wFB};k+;i7j=P(i(pYg!(6ks1apcCY+(KMZfx$yBND9+L0wm-ShMAA;f zQ)i0qJ5wfhlC*EgEvl5jh>GZYjkdo<_(BSu^BdB!?kL`aoWX63tvPjr1!o2`SSIi9 z0#GXSfo|xe{ZGAFx)U%ik%xwA?C3wV1HKy#x+)yQozy`i%_4e#@o8$MZ`(H7S7QD! zTO=;SpD}FAm@!QnilluwT6|mwGYu|gxBNu%E93l{qUHkVj=(<8nh9OBu}_6BDOl>) zthE*Rbq_9N#JFq=lPKG8lgn>YjO{N62ZV=SSJyw|16^e1!~;aUHANPFMX7Q1r$Z3z zvpLI^Rcp~e4!z^SmNeB_s+d>>QHD{OXFtc|pA`Uu!1_OXreZzmn8OhO8>tmNFI8bc zz4>oeSnE2^ooVs(j$j_#0ea+6pYV<_LXJ&!GsN&9+jymQuVn3Pzi&*pQIu3FuyNa% z(Z-GRS_X_zjXaz1*eQ#zk6Q)_JPkEWslYq*3cB4ljRjgec8)xFP@&D{hosiZA(O4D zE5_T7hv;LITr$mzH8&d!ulex?m?q!*NWeg}MyM&Zd;{BTh=%=Njrvx_9_m9Gd&Zkx zq?%+hsi(nR496M0PY}6LsKeljakA;+m0E(aTG(N>^b0muvmd1lj{QV`eRj-!Uq$>f zL0w?OjD(U~efA&ay7>RIDKEA9B-rD*>MKdif1FSNvabuX2N4Sdysil&4~MBhc(Uw$ z0f^BusffnR()qrp3Zl#nDO~T~flLvGC4c!}TYHnF{QgasaNk6pXz>^1d-mq^)=OZ=w0TMuGfY@a?SC8=UcvQxkV|VRLst9Md*=`V$>P7tH_nKl{rNXl;G^ zkHGNRdgsdn_~rCfgbeof82X~B>v7fLi>&)}pgNi=@Zhj~dTJp!$Ln@J&~s3S)2Qjh zb;GICSmy}+Poh$WNiB~JEGMq1a;W%{gcd|i*PsuOrfGJx`w50NIC(r>`E#AF)Ys_D z3N(POE>Im*{6wRscM*vvS;9?`!|>7Q@y28Tb}VSSHL3(}xdEkhM5byVt>sqEI?IOf z860Rrzn(ppW;%lFy`}s6eE*!+; zZPz|LB>S|fVx2pESh@Yvx%}86aE#T9lZkUDX36-fWmYgG)nDmvNFzKS;0wo1>`=~% zj{`0-{9f?A{h~a_`5;fNX9{z;OhM|!hsJh!_nF-IxX_)fg#=%YLDb}Q1X^u3 z7Mj5{k~-rF4Fr|R3;eXMe*?nh{+RB|mF~+r>GS%lG!9hM{pRUr^=0W*U2N3j^0d#v#X2NS6Vf1!8Q=Y_-Y@Hxw;wjfo zIS@nh7gCZ_gR7-o4Y*Y#6(`PcsKDgN&T^w+*k=F8jv^W}mImc=YYX(p^XYjF$Td^C zs(I-pDqqlI??OPR?th+uIq}DW zUDEZ$tH3g{;icz(T5~yOwzNq1wEC#1$zgLPZF7`y6_27V z%3;5!na?^I>~Lsqs;O=*Pr7_>T??~z?RI0O)38K*mx0Y#WBUts}E>>_Ze-oQQPJAtQ+vA%!$J?cRw*~w> z;A$vi0NHHk_DF{}8&m0CB8h>T|T5&j$je=-_R9o`OGlcQ#O-GdCR;Uv(&*;gHfFpCNTsoij?Q1t^sT+1VKT>zd-*AB5=}y{ z2=R{uP4%H{9jI$^e*C$NWm^d4bY5{?e#Ul3BKWFMx3~!24DFvp&E+51AL>Iau&+2I zD|FW{57m8Ol3jg<>hrgAwcg1AUanf7XG@{t;XY6uI;dvvFxM*lSseH-PWNs=wa1CF z%nr2a^nm5;t|0!l-3&PV;rnKCN}eHmyw-U%1J$+7^+t?+IQr+w%#*c;^N$a&>!i%~ zd}(u-rT^1*2x{ssZ}y5`Csf{KX??H{(Fw!VocLZ);DFF2GK?U)+~eUO<`8#fzD1q- zENih;x8->t<(M#zWVylhuE&>ek&9`1=BBh%*JDn+Uo0g$wsy779!a(I*&+T6hx@tb z^;uV@jpxv-byR=Fi|T9c!;HmslqT+K6BqAq8n4Zhy-OLY>Kk$iq^(YmcK@4w-hIy0 z%$J3pbt=l?Uy_Wx%J-(m8!7o=#xd&018Y*M1BF`2PLABfH@q2Gm*f*`M<_dywq#>v z#@wVtJ}>Lw)&z|hDg9cB(cZzVeCKeZ}RMNp*z?uDZIQjoJ}6_ zs7)KUQg{Mtgf-*$E57^qFyUywI=ECH(!QfDn>l1U;|bh6*Y`9{H_`%VqMukzV-N>& zoxXH#Y8N#(1x-)WsdDD7pu9#%|M2zxk?>kaRW2P(O@XJo&|Y*-uF-3<(}e2a*5Ki^ zBVrbk2k3Xx0o&f6kj4Y%Ru?-D>PL}uJ<%NQOkSQmoUMAf;LW62YaO9FTVP z(;1n~dW@(C>Fd-Y=@R;cm#*|w^Kmh1cccIhRhd@n#{8S&tSnaB@7)e}Nns?)@N`@1 zn>{|@{o03fej4v|tGn)%?~W5=n~M0^h9y}2)&u93JB%soSR$1fF%&WOy%`QtmF3ri zz?tSZb`b%q+wJjw;e*P^c>3L4m~sGN&nJexfqF2ql~tOAqrXL}!KZYXYP!#1+k>dw ze3fj4PxZ}Y`-%?ae7Qmh0@Lb%ogCT$t`8v3z*R0N!%s){;(|L6Zg!Q-SS9O;4{;~2 zVJXV^4iC9+!}(s@!7i51b|}_zd3~fZ($^4crb(@*scb4*%r7IHbvL4TDb1dOs_~tc z?q5n{TwP`G{wDhQf4Km%AJH!1ZT@R~J@{8%@b1e6OAFLlLw@r4RoxvbmLFQX;(7=b zHF)tnm?~f?R^eiNm&@Ng{;MQv@CiFreZFLEdwP0$ImN23=U`#s02&{q5EmzbOr@5V zR!^~%kG4)z^4GjBWS9WE>+Q{kMlq@)iQ1B9{O6_Q?i=f( z)*EbVYEG)tJLop{yzPC?3FHN@W0KU|T%HM*c*t;pt2{_c-4ET>!TZ30z}IDPHItL% z)UD#azq6c#UaHmHumTZ;gDwHmr012Fc1x|6yKN9xLz*Bwqm~WO=CpaS&Vh}URj@cS zQ2uMvgyyPKI(}-Ufmx~_OF(-^pLpWP(eV&eJJ5yH_0dThn~{IHrkE3jl0ux4!gn}O z=Ci=YMPE=%B}uhfLo)^w;hrMEQY2HMxAyUGN^h63WOdsDNh0sW$HopX&oj0tojyk0 z8q-0xuQm=KrI=9Dz*z76MQ6KH+9d3_Cxy3bk&?{e=Qj_@mL=Uoho^UQd(R=i!Xx96 zcya42PE)>)Ob#vP3N+7sz4>F(WR!xeZ)PhbF1_uzp_3t`iKsQ+`rmRfR^?SB@&W1y zKci{=YNJLpyYo*x=K@2xN?%nypuf7IN(|8W?)q?C3ytQ>;5(+5ZF>KUFU~tr#f|7T z=L3i}Csrr2A)RyFt(AAe_G$jSON(%2mGvMi3#tb`(h~r5Eu@GO>Z2n%#V?g*BTcT; zjQFc%-#Bq{IjL~z*purlJ6jr_w(soB_pcm~q2JyvKXz^|Plv7^q{KQFbPGD52`Ia6 z!|JrUW8a)K**-&$+`?K$?T3Lfw%ZQ6xRTZu&&D`8_lK)1mFq4#fY%i=uFcCjxn6S- z&R@4TWz9}c7oiWcEAu5P8&^Q6<4@i5{q|w0Z1y7DPr?rlFU^{DGh7O~Eo-wV!n+Fj z#e!LXERbw>W~6`FNMQ)Vbk5~lOw`@_em^t2;y9EcfnZBsVik2EY3Y3`W@IXFIFR%Y zt*Ef-y^2__VbJ99_U_7|oB5{KeW`TiRH(-~* zm+L}kQIhu9pVpW7+I_ZeeY!>>bszgWL^4pzUOK@Y`1q z<)7>~2*I^(O{dYH3a%6l#_Fw92@)h9H8T&d`l_lnxRNQ&`;S)gSC}a{l>661*|Zj# zS3NjyIx&?TtA==VNrumq%`)m(Sl$^~%Zrbz+jGhejs6|cZE@KpE^763c|xR|>EZ+L zzXsFSQ2Vsf3{2h9IW%GcJ|M@PugH_GSLiKDpo8Bv8KB&ZL(N7fR7bM@Xr=!aTy34{ z?TWLuT5Yzu8o0kF?3VR-(wT?Eqil;^?#+N3J??gzuXRW)SCLv~wC(SJ`UcP6_xl{z zYE0EJf78*D-Q~oGVlK%Y<9UHZ`TEfC5lB6WQx<6Gu z7oUW^($OL>*}@7YgGNNxQAb#@K-`GBw*@7Iy0Chg<=~xckXcS4e8|F3qA;CaH7(@L zlo!+!7SM*&NB0qRcx}|nljFFbC)dyUhK&Jz8PV(+&-Cf{ib=lopA0l(#{R(#bFrU3ihEnLPqY)bm|z+9 z`wckFWMAi_ZREvLh=`)X;x{;Yc6PHK7z@7ol& zp*SozdDMidb=~}bbzV)BEIItEixcMn0g*}Lgp7A{FO?l`|$CH?RGaMEb2Ax z{qfHd`P+JfKZ(2vgaz`-(t^Yi_}JNf*gtoYa(ib-8z8C(x0>6Y-H9~pN)c-;AlVR; zK7H~?SAV*gKW4G7@A^C(d*Bg|{}!5Yd1<|anPTS+hxO`?O9bAx7d2EDPWD%Dr{4Qr z3VIULquf?i0J~5wGfj3%M<@mYm3O}ASrH~24|5v>&<1vzrb(!W zrBLk-TGxh?z(oaZRa3m}$DRFFdSYE9h!@wlgr7=Kq{_vZ%J(>zdi3ZFbb?N@sgS## zwk&CM`6?S~sg+heETC|+dA{(2)}lxChoUQ4q4~S>nGyj@pM&LM(&c4yr%%8zU>sUX z(TT2Zt1BVkq}AzWyc#oZ+{*6sz!f;m&P)*3VuxBw5<3=ZRdSx?f8$kJH*+|9VxbG? zMYy=g)pMyPeI=LYHjDZRuFfGVn`gDv_Nqo;xy9p3+R{ferLzi7C|8@;;TP{W{_<^& zOX=g7)1#--b2Hzs4u}9m;EJy=?QJ?rR&y~7HF@RSuz}p9F>vtu5QJ#g{ue}H_tDSG zcuA z&XN+*6evvhIj9OAXv9Eh)(wba{GA*1xUr&X%O^Q9fsG@cz|c|?^WM_>1IZh#62r~= z7HZ{>5PbW$@6&8!nr0>wcC7)+Z+*~oQ_1K~-CpFgO?CpIw=gV780UHXSEfhCWsetI zDp9Hg0dOq-|Mn7;a-tJ+%ky62^eg)Ds!M#g`|_Cf0_}z0LhUeaUJG*F=ZiQ#O%A!J zu(KEOUJ6>F`T56)^C4&j&M0OGIYBGqT+#H%cO*Rp0C!a~j9&zo?(zyf$SaWt=H@TA zpHq+cQ%$&lxLhjb5PfaiFNZZgZJOwu>ntZ$e8H|aV`c{#B))tOR#f=U*}sdePm9o8 ztVI`c`n=rw@cJkC32J3FFfb59r`mE=Y<*R`u(I;py!z0bfYt@bv!{Vhr^TJQYF-%* z93b_`z0PMk6yjT2lA5Mx#JDiaZ$Q9_GKf_C`h?61riJF^3))bB_{9a@reakJRw1A()TVZ+m(Z!kS_}5f> z4}MD55}jnNPHZR8w6m5BHgRA+N*2Iwoa{S;ukvk8Q5~JT(mpE?dMh02F2#w|fN?qY zhqp#WF>h%#aI>BlMJ9WHOi2mOlTWRa)zpOU^zPW}cAiqu?T9ZNxGqw&dd1�B>N@ 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 literal 31827 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 KR&de$-hTkVfaBr- diff --git "a/demo-pictures/\346\223\215\344\275\234\346\227\245\345\277\227.png" "b/demo-pictures/\346\223\215\344\275\234\346\227\245\345\277\227.png" index 9e3cbb6b28c2f07aa4a1b28d414902996d8ca738..6241ac0cb050f48c4ec7a23e671b5a68e285d9ab 100644 GIT binary patch literal 100754 zcmZ6y1ymeOw>8|j1qnfd69NQx3+@&ig1fuBYY6V{9^BpC-JL+N;O_AE^W1yC``*9S zV$G~sL-$m5opbitdsm2@j2JQ^E+PN`$P(hh3IG7-3;(v(`$lFm)I>=3Y>vx=E0D|EA5oat zzbfwt*JCtK({W#$9J&*^^dQ!N^%Wq6}q98?UkGpR{?oo2(HmqcmX13kc|wiX)Xk zgN6uf*o(E2#q|ZU%~A{fh(oN0Q()pb>CXu%qq{Y#G`Xdvqn2zsO`bQ0Dx0)4<@iU3dJLW3*2yte$}vOX+TyWu3z{{p z%R+Z$c^PIv7drEQFXg{4$vTX1C|wOF?DgE&#AWKs?dca#$M-gO_Tb&#=x&*!n5Ys$ z3(Zi1dkZN_I^^ca%ya&V>$v|)W`i)2-ll|@BG##4Ck+#9BSi8#9c za}HP31s&ZX9c`}f+d44mv}(@QrT`tAU_M?p^V(j(x3$$nObiZO{b57*hm0udlE1dR zu&~UJYZTXFYpO;xqtJk~kcfzphzN`T+V{oMl9Cd?5M#nxHG}`%7T{dM8B$W%%VpAF zk@k8|&(aS@e|{FrX*R;x3(_No7o@?`puwuiE!k6-2$He+cti=Vkr{kG{VaQPGDMdt zOFEYemeVKrCdb3vX;a}>V^2l+|J-+Dm5C1f*6JDD2rH{6P9|J*e=%79cKiu&}Vu z^5Ov&k{SPVhdxWnQ=Vvedg&@NVQ2=lDtGB*!d8FOcHQWRn$e>l8|vM)A8s3kS)p53 zorDhPW|)E&U|2qYmH^O51sqGqpqB|&r3`{_{_ngoPzEIojL44f=>h&-Cypc}MRFlW z$2Si>(T{XVqsk?$%G9h2%-y=)VN1~ZQ~c4;0>0A1u*hgQ|BMjxxA*J)Z$R|36cq3} z-v6Jw!r{oiyI?(TlIth=<3ZEypa!%@HTD{a`_x$XSp&j+uPjQb9*6qDD&|*Khbq6(dVT z_8qFm-BuwCQX&AfT{CI6I`06ph21)tkTLMUmM7u!%Sjr_+nSEv?Xf(!));bCUwC&o z+l%-ZO{@q>NHdpfibNlO4HE?a&D`V8m79Sh`u|x@2KIZ)r=+*#n+$PM0BJY-@KGO7P={x?@y@LjZ;O% z#OIUcr0iyx*IPsu_B)^Z`n#S-r_Vl#ANRMi-@V(zf(&B%0L}2o1jx&4D=RA(PMh

Q%2@ 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 z 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

5l_O$)f$9tn0P@}zWi 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 literal 110484 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 Y_sXo@pYyLkWMll*+VNbO<+b1c74tJ)R{#J2 literal 108161 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 IDi5Cj4_5C=Q2+n{ diff --git "a/demo-pictures/\347\231\273\345\275\225.png" "b/demo-pictures/\347\231\273\345\275\225.png" index ea954e4cb0d816a4b5ae7a14b056d880215b06a0..75231c597d2887773aa2e4508a6f6ff01c370051 100644 GIT binary patch literal 300736 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 UnI5T{r$4jhq?9D9#J_(3e*nfeGynhq literal 1500103 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

!Q8B? z6~D=AE4G_H@^E8t=yd$>d)?O6#abI~7Q>yfNy~SPfuz^E9cohUN9zD%ihS07irKk# z`M_X%M#yi7l6$RKKzhtmOzDl>RrcmQxWSJr95>EP8;1e1hdu<}I1r=%fA?b!X8F@;fA+~8 zGreEJLqGrG(m_05#`6_(_SpTSeHm={G6 zMU8j$#e9qBQuQm(r4@*ud-v<7U*p##H|WEeuG+V{oc-4q=hXv#^6fu4Z}a69cYNZe zXz@Sx=YIJ+7*&v6fQd^^HX{+^5RROVuOeYE5s5{drVo-4$Ydt-kPLOv8l4ST#EnNs zgjuT{F4+daPSyb(_OXQ)3c9EQgQGz^UNOdNnoMgCfk{GHPfSoSn$cZ#)(HR~I!gsj zMunteq)dY***cOm?D({Z0J<*)*rYmLYb>7K->>tJkMm!3{#j>~9zyrQt|J)1i2Mcu z{ZJp$rLJQj`xg?jDx4->?=iYN0 ze;?yVH-;2t-*Pk1x7RJBoA%7WO+w#LucimPDWt&AGq|(Mg8ejXH;8DpNId3^k2|%^ zntSjB;`F?A9Qs2B&VJN2^l;bGGkS_}lPn{NOUIVW=H17UB**<&k;RH4due`5t>=b} zHQe@{;vkvgFhG58!er})T&%rB{A$)28W>ttV)tw{5uVcK&4!~o5ohf0oDn;--+?KGFYPJ$t-8`fMw z00j{kB}mFM>*`Q|^qd_|6%Ndx8Sa!6;jvb@l-vP~^e83qfG(jt=?J=g5tt%%NYPQU zx`jnW*v3y2QTB_GQxWyzWY?Obe~1%Pu0G&N=|# z42byFd5Fapy4h+`nIxFr!)hz61W}IfdrF%COU0|*auNWjKH51g1p`81?#miZDWMuM z``RIbxTwSM1|eO5z#P1Q(QtiG5&@LhJ>9R`@HrzS5LujjuQ=S`Z-^8Qs;NSOO$6bp zI%oe5*qm|D0FA225Kc8+TyS_}C8&srBjQRucXxJxgcbC6SzHwp#0YgBzi5P^wn`A8U+YfFxuP$gsJI?Cl5g z_iI>zdgkK$lhq>GM!}y$M^29dt!J4rNxc|7a>VS|4xt?OYBKr4>_8kDIrHjqI|=UG7 zL7705x~d{W!uxfi@@fFMnreQ3zk>Sxh@+#4gYk&Nd5(|bpG}~lKC2~tv#%69Gb<=n z296^$BQhcaIlU_+cCkv2I3ACTBTM?9tBA;h5pk-!&c0lYA(Q@*%H$<}ocMU>^&ST+ zfdkAV$d!i?pgsD+d;kC-07*naRBS@brp*JWj_v@85YipjDe1hrd0iJTWQV9Cu0$UE z?|K+Kt1bYSy1E(quSdKEk6;H+%L1uMev2bBCDx@A*PhG=_@=VYmWFV$V zy4BDJuZtyAG{e;*0G_VY48$QJLo@dg#zx<0&z zx6cHLr=3$QWBqp`#yPMRVy&=vz=|DjIRAwex9kA2p8?GNmskawd@>ASkQoqavb@g| zIurK1M|=ER=g5)!@&cZSTWED&HVebII<^b{>BE9WzW^flvyxNYz{QH%*0S}5V^$Dd zb_%?_<=11U_VIf9aXxKHyR3@c+<2Z4@PR(1ywK6z2cy3sBk+hk0!Jv2k!~Q>Ej<|D2r;jNRqF08=v3ec z>Ooc3_w1`G7D7lAm4SFfGBb}jqCcW8ZkY1xDfjo+$_A#}kUjCTQeTS#Z|DE|c%if0 zdQbw`%?XE^d8>Q*+5Ep>Xad+98UTC|JInkH48umiIq2K-4gqU9ex|xvn$OQ>!Ozdb!-5BngJ~gRP)F?5ieFi%JpA z0}(P64TUC}JT5Lo7yxjzTw*pYoy9Euh$;e&m}Q6MR6 zkDMXEZTgUiTNo`76-txHi3+fLu|$lBE-gtNZlivAKgA`#S3dn-N#%Af%P6RM1|9}0 z5jo5|Ya|OgT%~(*RoDO%1b=dZ6h?%r>SSM<@I)kQN&yBdnEqUrl=tMJd*H>*hH?5R zUJGP+S|%gr(uK`FQMgpS*UBGEB?_fkQsMz^Hj@Cq^<6qfWWmC@Bh=zBF+($;zCW!MH4R8FE(*w zg=^Y3x~%-mmb`@Oov-)K@RC8jC9z{zfdc8CM=NI?Px=TX=u&s#YL@e3dOU~+A$8+q z^Uz_lQHd+r-N=_our7Czu@wF(fe5-Q$EJ zx6V5U>yqSz=4~}A#<|(_y7^yAYsI|gaD+Bbv0U#>5}9@7H0>;D5YrvO>|ab%JH)tj zvt;RwO8Zy)-bOA!H;SbeR^>HLw&w@db1g*Ji^XV^ykV?nkN$jvWWb^|VY+Be;J3iN z=RwQT2^S$}!41J}Pz-kP#$U+=j*JBZu9R5c)z|Ya^u7VQ#EjF8T`3^D(3nMComKkd zqk=^o-_+IO5l5uo!d3Y0pi+IRBpk9ZRhHV!t|RnD(~)z!KcghIa5bv*+gtvAyzzK^ zppoCZ&WHy?<#zEGPw5buQuakPbzb%T?2mWUhmOP}^({@xU?H4SZ?YK`=u%VJ0(3-^ z5aR?bY^Q3Js?=4Zz3cLVAR~TL08!zbMRoV7Ci(j#gCgPXy>1K|$Vj{$->RED?-h(x zzj?E9af>+=BZgl=9qfxz^u@ZMvT&J_M0B^iMA)Qh&G_5Y#Q>qRyw{ffWHRngTC>mY zBi2qBaKV8ihTdNOGX`tdmrW(yY{+Xm-V6y^tK03MKnf%Va+wfi$$Y{3Jw4jQlel^U z&DGX#7GFkxkx1GPA8>el)5gYdUbBN?NbvX7m;k&)YSBC9`ZT zENM{t-NL<*V#5! zf#**1tE;b{{y3kUKDtBypKf)d>OVU(7b>Kmed%`mVjSn*;^i&k={J75u<%@0x09^E z;4dyS865|l&m#A`om!*&IRN2!sjIFHz?dCMpUE-%t(9KPC|{@Ivx&vcNt^%dXATZ% zDm)!sV^=22jatA~^m1U5QkKG~@LBbK)%$f_=i8BFvU!@iMnG3z-T*~da*ym~JKBYe z`Vb*d-Kcg%w>sI+l&pX=_zQKaV3fN)pu-x9jt5-Cce}Kjm25ansHBd>gE}ChuhMz-`^U$h*GDzFQEoQTS%ve$nMlcER3SWwBCjq70xprW zV9155)Qyl%bt3d8R*K9>W+2=Fr$Yr+Wb2p$Asjls>_+E1z+nx>|h$*5rRZ+il)9iqrkU zD+i0czGk)btMtXW!(W z=WUrox)WeN>2k}TH6F5jL12eDyBg-%LFeiJtXN!DxTdMYy}pwmq_Dq3ODaCARUCcH zecnT=jva@upui<};mpT0_#s`79MNGeq(Qhq*ODsO_iShCK)F zyr20w(J|WGz#_%(gY;U91P?cjbg8t=9d1L4n8X;YBv4QSlnNFK0GdYC?mT)oWx^DL zqtT6atvbXeFEt2JIgwkF#74~)A!&MG*qgS-BC2T5!a|^fLmhyi?pE+vGNfGa$N5}k zjRX~}Eu%-fmTuzIjFF&LFH|UGwM<xZS#LPGk0=~5$+jwueQbgU|BQad(Fprl{y8%1{ zJy3Lnpb|on%5-?A1QcS8=ren_5m8Lgv%ShD7UC!ab5~b8?OEtH!EK|=-Hi;Vbg5ue zDr{-2lVLMtqthE9n~fthxwD>BR%!5Me^V&n@B(Bf)LqYrY5M&FF@mZdYGwqG`Dk3B zL7XVE($?3Lvw?P7HVxuFsxm{qM@Td)IU+z4zUoBpXr-mY+Ept(MYHQ1*RCLHK3@gp z8j3ui=MIEmHr=f0xv8v(Xa6VuFOHvt6aVBVOS|Ct*Ism{m!JFpRt)^JONdy0#q2Kr zQ>-{x03$jU{4|*45uE92*Ui1-nvIG^vjvqRE5aIIAvXG825^>G`p8aPM=+wLlYPXM z2wYhrTYOygtr`*TDX7S!BY?Dgw@C8p2$R;1T~Zh&mBLa?XX1E6Shu@A(7V|pD>piVb}1t9OJJAq7S zbl~8kf2!L(=Fm`%lVqhM?`aL_Knl8`9%Uy2F3 zlZ7hls)r`Cv1?ul`<8_rb_Kidj;q9z4#z&g$?${A9 z{D$mpXz=5%=zg*=_S)Elt!D^lmw?^_0kPyP))zaqMmT65ui-Y_w(rm_K7Rr7wC&+- z`DmC0T+r99YPh?P&-1MQ<8ph90p{uYK@84|TVd_X&GYq>4F}+d;olp1(&7sxS2ee25)+hPu)nD%8;hbQ>h4 z+*5q95nAX%Cdez?F|ejC+i-)Fpj9%bS0P%)s03z^JPvC|W%L1{N`LBPEP25|9_%Aj zysB$?H||8i=}&9-i$`QE7%z#pNB;iycs!DEbXRvtb{hMzawQ9lKuNk9Cl%1;2E6fj zKx|rbvlmS=8woPbEi&-}QIjR6_65ew*KU>!eNQIu! zM;HVwGhRteHxJ)lb8XW5R>z&#OWQI0PbzvBn64*Ku&XaQK@9L@$nyDgYg^yF2lrEq zoZ#A$ZkeQ)QMf-fhv*3R;+sU1yI;I~d1utVvNjvWn&+A%z#7sokNv{$e3$2q;bpT7 zXi^jlJ0HzovPZHM;P~(WyozGoxg}G{T-@J*XkzIt%tvc@g^|0NfF)=$jc()Ve7;|n zFZ1%e3!gM(0T;5d6)u&yqici=Bp$9L8n62$M*eM%Q_8IpDIH3@=F>8)`Y zX1!9%|>@SOr>zZ+69PSfQ?MPk>wCk z(kV#{q@e){q3#8l17&9DO7Dlwq9f#;m)mw;&*bU^mWCoe1$c{sum<}6S0uJ^d-93) zE5R4XEnFGal}Gv|&V2pFSErdjt-F2MAta|^w;jjpE;uPDgI17;P-s=G&=bdgf#v6B zs;%THxf+kz&$EFLU}za?wHWUB)L|SUDVg5ajBZw)WlKi`HC2T!9co5JcOwvGrIXB3 zAVn4dRbm<}$@Ov}cH$WGghq+3qj(s=$p%7+{oFR4i!J5?F8f|qrf-NiBF+(Tx7hdC zR?l_#+HKKUw8M9GGD8r$UD(I69&=9}%0ln}fT^&oM?)Nd8I36+l3bI=?&axPo2G5< zN!v`ri41w8n%rOxXO->Nf1F2cBY=lCC5#4lF+qa{%&`a8YfvE|t9smPBd*VR3wb_6w|h4coq+)T-ocVGN+dm?gP_D0a+) z4a9?KT(cZ2OU2mpnbwLULjdc#n1bhui;Xn^)s107F90i?{OkQqNh9;xcMCp7ljDV$ zcM&eKD}a#G6C0YvHp#6(lp*MazcnVG(Z-|w+-tobltao`nB4}c;C+jq>2l-W63aQ) zjLOicBH-jwFOuf$xUncxMzg-OenTc*EET;tvBb9I!lr`&uEGHwzfB3PT5JoQ$CLu( zO8i{VrM|$cYt}sgAW0%4^2kF>u)F*&1x)ANtMPGlrIc1`h*TarxYT)90FkkV>jhK$63){~uii$v*2V3y2~#nO`QEs8*qF$ttL!iC0TF(6 z+h3skLtLO~nxB5VuX{&iesSnVApP<-NDB1{H~7nOzMuBXPky|yU*GDWuFwB6kNY-s zKOh!AUi~j`_!rmz>OY@9>08d{-vYS59QiK?_mj8(c}^2-VF1Q8WN_i6~rutAx|-%Ue1ydPNf7u!^C zc+$`llXO~Aq>%M>JiPd`LZ%YK59h z;Mf6LsV@m}1Uhv9b*a=Ww~Z1QOrd~k0d8U6MZ8y?t>Oc~*&pv+|GK)s2ZCL!1mau5 zY9N=I>W_8{HK^0=3&Noy5`v(s`}-vw2dY0+b}ZoJ=^Sz+9XA*8{wHA9#A4cM+r8Iq zXB-dO4aRRt!}aDqrJ(k|PIJjSv`tbk4SR=crHGqZ{%R%O9&;J`v<|?0Rk$tDCJu1< z!~2&DUt5p7@9L?5Al&!O<=M}==8^)dHKZ$q_ZU3^_u0I9R{A{gtC7DOig*t9XQL;x z8R+4j2=D%d6&Yb&Yrs+t+J@#wxeegzSZhvLhx~aI7@TFP<(? z1k5Hiwy-ewk>^`|baZz!gjH23tW^Hn*zM6 z8kTHkOy?m#OPkKkW3jOJ;w9RO`Vhb((t4H4>*d;p09lZeoYF?6*xs{tmW!xqs={H@ z2u;g>B%nsLx>-T6JD|g;^=p>K-gTjK<`~z?6Wk4@@unb`4xO&uPPR1y9Q16b zBK8JfEY)}#l+uDJ zlS|hmU_LpZPvD$FP95%Z<9X(6Z^0G5IzH`xe|c=L>)&#SKVNa3YnP2|64RdcpAwi~ zUeN=z)CmTj&J|mG2i3am*B|C~pDosdM$WsR@otwxDS)d8HPP8XQAs{zZE&`enRQ)Y zz_4>crO+c4$pZ&~2hNBHcH%&jLfG+)*__P>19^2LmBgVaA`xz1lf$34=!{~_P51B+ zl1`ke8h|>*oK9!Y!L-JVb0D{^)4(gbC)a_HBFGQ})eHo9sS6+84;WI^r79}uCYcOQ z3U}`%QpGgAY)iX9M74XAty-`UVeO6-L0(`>7B=#u#j0zYb0fSv1OT+4H0n5Ok6Ojo ztSKD83hZb5Z<5Hs>MCc_YpfW^1n4odR|}lv1ikG<3|&fU8r_Os5>4uGLhAy#$kLveO}e}6yT-Vn3Y`yyKz@cenN z>;1g`JTFN{WF{lg-9#Krsj4bNM@Eo+URTxkYN<$(zdtgm=RtHOlfH?VZCy0`7!f!E>`)$;u2umI@MvVjA%Y!fJ3Y3_ z*%1}AhJ2v2l}AJrA*vecRGXI)a~LIN$eQLB!JM`vqhir6roHcL6K*XX7#hj8xp>+4 zz5AxCGgd;&PVElEc5L<~(`RqBW0Wv^=-{v#n?it0a`x5zTYqz22;pXATHDtIi&MC| zyD%?##1&R@W$Z9Eji$`#rqB3#(0h(ecyFlLoiS!GcC~W;%-i|54(}9CbnGjKXTJg; zeT(gER2EH!bPeWmNA!bo!sbTxGI)GizI97`A0PYnqh~mGzVH7ZJovuWuTkumZ@zx( zXP5q)@8uVu|NYGS-?eeZwx}Mty;|OW_*W)-DZ-2jeZ6fy=xM z@LTY~Acb*;v=IO~G&Mc>sBQ%`wgM<;gJiR>|(xb&5xeUFu60S%E`J&_F@34@9=Q@xA*hIb0eV z)@!7DYn^vnH9uKl%N?HalwH$pe`p}io8SPNz z=Y5g>2nu^etpDtZn`WG?pgOM3G8)azGnu1TY+aUyz$yVF_8-`vDS{pzvh<^`b zfLn*UT|_)A2cRkH;L~gS{0ep~Gi)3|Yzrg!HF8R8%hXS;a$?EVb!J+uw()aXzw3h` zq6-(@DetNM7~mtKpz5b{N{k?@&AD;oLs5XspG$gJc@TWGu)5H@4^tYj4kf4iD4kE; zuSOO`9(2;xy0M&G1675A>5pv+JOv0d_8x{tEldX%x*Dmps;&w_fwHju>KqT?`DlnU{Mz!Awtw;VBVe2NF*mo7NsivQRjPIC+gb! z;L2K?-?6JXg+6he$V(XbS886-kwmw7ovSUeE^pPo(897WBEyC&O6VC0=O9B&;7HBie0mC4iU?k!QC;1jys{rCb*B0wi z2TD_JA<4ZGBACJB;1Lm-S=~qEBk~*b5scu8zKW6#UkZ}gJ;n40b<36PckrZ*#4&z! zfA3+->*tYS_h~FkBM|GkR|xv$FP8_&dq`xI&2JA_8^%5i#B5Lf(=k@~{t2)j@JB~b z*eq$SH-puK^e4wn;%e7@to^1}a%rkE0Au-@#Y^(FP;Y7i;Frw^sTz@*ldMEjyL(ok z+2wRuP&~|{HFbY*1Q!VC;zd{FHKN#1dKn)eqM}1=sL8&_LkLbEveBq5H9M^!yzJ{F zNz6$dhH|h07O%$f9C42+0dz>cQln+UwVqVU^)Gg^QGzTVDudsRNXxzw;7|z5TtQf; z2}a;7RBAHFo(y5Mb4{YwP|@it9t;aM8BoR;9X|b<1wMv?vwCM^tVL1_l>{`m59B4c z=3|&STzcvDu!*rGtU2UrgYhFIV~n1YEtE=-MX_NY9SkzcOWRY^A?~c-P*g0Z#dyN_ zN4=*!Zr+$dYpkUDvYgJrj@jCeFdhB=U+%tUO_Cfp(hOik_DH*@egC(VX1dayuss+^ z_lV4@t{JU#SeL$@tjq}ip_3qBFc=mb+$omoP|69&K-rOTb`gyo$uG<(^Y$i9{772jN5u{q3d;*VHf*gdwFG=W4J z)b56degn?1Y`GJGoe^k;xCxxG6i#NRI!e=`8QMcVz`w=#7!S~bR~ZqH9GN)IA1sV9 zgb-quoi$!uP%6lgd_+)@O$Y<4skjG0PMi-h&CGS0xp%#_bKPbH0L6a36nUtoSk5;n{nm0JiJ~0z zrt3S<)gp5lUY8ZvO82ZawZ7Z9-%*&_Zdu>JE%aP7`Kr`%5f_|!vp&C2FkGw{Ib@+t>;oYZ}--5z%+v9<$%kitnAn$NL=w))wJ)ZNl-}O^V#ofg91Y zs|}MGCa(zjmOT5$`B~x7mp`?UyuEuDXc$E9{{lNXSGcZp#~BN-E-jbU4Hcb`x(Bg* z8H$&(i<`A?WuWhP$6uf7K5XxB;p>O@lF`?5*4%e$H?;%QpI#gQ-d`EMzy`qbI$i?K zpPleqAo%S!ues6a6dcHvUk0$>*Dvr&;N~R0pZ4~dpM3p>K7F~XKJAxtUGUAF6yFZd zw4_uKYNS$A?_K;Pcp8TlE4GWJw%+y~{W%hw;aa5@+lfM_!a@Kw*?b9CLhR>a zb5RJU02?2oB@U^Q8u2arrriso)m^2=k)wh_z5<1I$@YG>3}z5%zb_P7F_alY(&4P8 zRHfqTX;re_*dbUlo$~|HMMrMLb!$0f;sywEm)+? zj%rZ#_JNmq-dmNy&ljNpqA8Z1<;!Ju^vN|8TG-A-3h6EOTCDF2#4~&QNVq~U#0^MY z&g9;x^ko-v7<><#i_s)cEW*SdN-nqAJNSxlx*N>CM(;ShU=4LeLDP5OHD$-mQGf{3 z28G3!T7b^A%XG9;OAO>@0ZeQGt{ZMEx2+(%w8w83MngxKEnXpL*!a`RA`-4<^dS>b8d9@Gk4h3b~)t5eqo#H*2k1&wBHT z3X4Hc62-zSGX1KV1ZepTE#kaq9Z;A>ETP&KrgLH<;D#Qa^ZP;Cp#@^`%j~{c3n9ET zDOFfOdoTIElK~1k*-bBq91EcAjzlPmA30z#O$04&iX zOqu;PLDU3+L=IPZMlYnG5Y)5-zo0h)sE0Uur;*DpTg-WN~d83$A!KmFrGce9>^|75v8vAOi{T zpi7s7t+5kT1w^UFvdqbzF2mVw#0Ol~8^yDr0YxZdf)Nu?YD5I$4~TRH{S;>R4?+#_ zfsu%iP&%PSn1A0%IyCJ)+iRlyi2I{&Fv-8b-T3w^UYCD)s;_UL-w*(_uql^MZ7VZZ zd04zZ?mENDZSJI7th5p~iJO>GZVSGI@z=WT^8~7;OS&e4RTU{L8z&XYay%|3k!8A0dj*1u^29=;nf)T?xt+|CL)AsSvEh{t&kx=(j5U6qHasWQd8CKQ7aT~t##Q72ga-&A$P6% ziR={;&a&;8ilq6CZf1or*jelv3ueXIdfUg%RrqNN+xZ%xt7t{+nM$T>+!C;~kl~e+ zp1mMM&RQ0>tH{}XRD;UumlZ&e$6h>(9SO&W%U4@z1I)9%j{pZ->Z65Qqnr6kN)l=v z+9)uTBEqV9?x%;zYC&{IwtLP+kah# z%XP1@=#a1<(VOwwTdZQ%RdLIe>~xsG>>FU+UB#7bZcxtwXOMxIUS%&u^tIIingGr) zLrSemj8AnV1s2l@48IOm)rq&%uh#Hq9D1fPlr^I(Z*#(bs@htxz_FJ_j#D*{oG90eV-$~@sQ{_T&C zzyl|Vf6RG&o;+rq7$=76bc#P@g*6oB0Ebw_41f`e5quC?k%)h=K6#kH3@{=F1n~(z zg>folMnIFFier`~SfrTJ!TIB?&!di-2NXCfFhw$SYPxah8vJ4wJ>^JYh!63>h=>z9 zyWm$UX2pZ?aHCL^@miCTQ*aZFVySsH?vP2}nIp62?Pr&JUNg!`2oeg%=YjUuYANWU zk*0{{g!vHyM&{Mv3ju^tZ10Xc;9P<9OFY2knroLN7zOSySlA&Sd>`H~HUbNsF%v-vM&UU(BL`EqQR<7WWh?;l*0 ztNqV!KlU~KzhI@#a(&}^-Sb$hL-G3e`<;Jv-uRPb|L+`p1;l@Gm0uqQO@8}|zxq>C zDAsTI-H2V+eWOdD6E?r50saph-_EyROv1mMoZEu^Ke;ym+YRVn{)B-1%@^@cfARNk zOkbB+!4wC(3uXD^HeVYruu>R7u5EA~TIxr*JdO$d2%VsoHtGrf2p+^47?8t?bRw5k z&JW72a50WQjGql}Js_6Al#Irw?#ekLV`SY_&(dc8BIK}fL z@S#XDslb_QTr`;A2Zl<2)&WgfMHG=qvP&nQfoH^ERB}e+r;J(-UEr1~Bi>D#pYhrg z4G*dP%)1G>=i5SB!?fM{GV#6Xrbr%bPL)F1okQeii_uA9Qt-LIpBt znO-f}6rC{EN$b6DkyWBC44X_wz}K~R=k%Qv?ocJj1h@np6m@jvK!8Xs)iOfv@UhTp zt<~B!8(^YHo>;OAH>ZM%v^7>&1eQY5nH8=IQJ6{>U4tT<^%>Z~U7sp6xCJW;6g#`> z%G%m^!epu$XNI+5Q1t;$lr>LGw={rAGB7Ps0HTDX5*6Y@bkm(xcN^C9GyO85QgikrEh^XEhC=ONPJb)7{TFnHZUPNttZq<;a!1J7iI=!I6t%=kn(t%0FB#JF| z)%K~i03@iYz*>!|1XTgUvr7O66%c(JWY6t2$qGVYo{S%oW=$v}sxc2H`#KYH&Fn%L zW&tV-CvX;^k*pb1xBxdJ2Eafjk(sC(o8T$c3_Q%cw5<0s^Z^tm5XsdY0^tslT-iE^ zxYSRZ%xB+Zi*h!0MbHcVyLPen;~Q^}-+$#|9NfO5w_!!kpPvSD+&k~0ZStZ(?7g$U z-BX7)j{Vm=e^3|7{B}#umC$8T@t%#3o*-q{gk2| zJQWx$4e<$PAn6v6tT`o4Lp6zF0m+nHHl}nUcos&W5Ku)S+symM`x?=M&{QynlTA@v zXhaiWq2^PUEtl?3Dz^sc4D(5?5wmJR(Xwx^EOpZQM%FBM2FANozqkPnh|*kp-fY=` z==>=G1XYsLZg$u&0daI<+iyM5yy?a=T&ECC^T%?vqT68jmJxyIQRz9>8c!a$=*<=T z&bxzmV>{S_E!RXXIHxV_WJFO3n1o)8=C+}6YH?M7ve9G}g(grh;L@H$cbe;>oYW%9q{JOkRJICO{Muyt+4~Kx5NukH0qi z%>}41GrBn-TFR;c&baXtdg~R}?}CQjB1y5C>+V;|Xm)^giv#`A?K@)Mn_YcvOX6W9 zMFs;Xdw!M%H?Zz+hrhILtP|lK19bL)>`oWjq?2v^oV&D_$*#N;Yjz=R)PY+?%M=hWw%XRB55Xa_-r%2Q45&CMc;oW#Rd5hDgkxmzQ|01LYprO9qCjM8r6 zrw(h?2{cpV(1hL2soEC5mn$`9+684L>-sDkV5@+&SR6{+Zl+OYYm1ZFVM1p(+(FbQ z>e#tiGq3yVY{j8%ADhrmGL*eS2(%{MZAV&5pje4qx;<1g>q>u+fP=Y=2l za-r)V*9U%vGT)cd``2F|4f`f;tN8wEzkP(}EZ?5-UX>fF*pLWlh%gn_n@VZXEXcS)XtP z4f0g0+h-_fd_;WY_~ zzz5^Wd?KdmsG4=Ug_U_E5w2F`fV${0Lm8DkqIGYvY+Y};9lyPRq&*MyO6gqN$8C1s zVpz4LzLxWUP4m@6{XV-E=BPgHj_Up8+xEM!`AwwW;XpCAP3S^CW5F#62!d&7+A$y%Rb>( ziIaBAw@bkLFl#Nl6GfivpYh0u2ol|dj5ch3ra=| zW;L^o{!H927cT5A10k(_x}Gfb1w&hoyakt|Xx}D7SlyV6%6K~fD`diSyTn0-n3y5Ii-k4y(J2RoBV;%1nV5x) z<)=;Av8Rlumn)4zKf>gu;R7bOjB~p=QD>f@M zILxeD6V%LYhn{ZfCJFM}uum2N#H=_}pQzb+s|MN-tnQd*a~8NYYjud_Yb%Py;`|wH z;P=@CzaLWU6BB0bP|wC{U$PtfDaRRHL^cu;`AgX-uycNRc-0_q#gxryWhd=fq2?w-*;s>ujPmbI>n;ZZ$S)oD`hv^TqajB)N<|= zD@$ubC8#Cl1xb_cXllor6jKI*vxwQKjB)`#XtqIRbx9*vQr!kB3DGHnI>hK4K$xrv zU?>5Ua|Uz*m_SW3q(q6`3zgnrdY9{*Vh>@Y=}24-yXls#ckFNobTGNq30|#3Oh66v z+qZa0ezi-~DH)6J_KwrF|27NK9i<4^L_6E(XSuA}x(VfCVtAw+sNXGH%4p4$XoZPn zJVYWMM6e!AQWH9W9~Ga{$rWx2Kuy*`{lI)^PBC0vQJQmBRUObNoSzvnp3fY~9EdDt zH~|}HW*x;^n`|&m3-X@i&FBGv@iE39BgA-M%)=>Srot=BT;_vJ26BusGy(-Fi#ltX zJbTpqv(CTkJe}2u37((&ah!)fPgt5Q__VCAT{5c5#*0N{j!&F_&L4j-{aIzdDnT*> z8WA5cKDvI;zL6vx!U_FZ=YP&m7d+0YNxNvBH954C$!4qB9`?pjib;N;1=nYDhn4Mw z)e&>vfZYW-In3+LaK8%Q*SsDg+iD)SG6{XAz%WQylZ!}p#}ieTd-w{sx4XU zD02nyeG9k6#InTD&iYOw!YSH0-CQM{`NEfyz}_G$Hu9@g|K;<%5T2qFV5Yc_~+;UpFHS1 zwB9$A|N5P1wSW4ZQ{9L3EARMcfy3Q7-wf>F{8v;tUxKrS+Zns`*Rj?b}y{6 z0}k^}l#CHMRhqI(;}lSoY~SJ3zZ+5_BScMTg5hS$)ci5$XB{(@91|*PFbDJ)_5dN) z)CppU8RH2&G9JldX-+aygmmij%;$vWtP?mG6#nBxj(F5~KJ?7^^PK#9xOmJCe??SS zL$o@xZ;&^Fs>00G)2WhG4i-?vNmZDMdA%7RKSfm3XYLA^cOyNTfI$iRbXdgZz&sn3R2i(T!-T<_s_SQEpij{@Z2 zVAFI~1Ztmt3M7tBK%xco2<*P^?VM5F$f!JLq76|jG!0s^gt^}S4P}5}osqv0VV&`XvAyf{0TZ;s!m<_wmXN7KzE4P;=7jy3J_#m|P2a0zyoXMt>y~ zrvgF}Sd*c9gS#OXPQpwOJl4i|il5?XJjL`xqf}LrPRz!_&FplMvm{1Qg?JESO$0Ft zG06;eKb*y4rx5wbJV$0E6|>g@#i-hM>%6jIO6CbhA*%tQh#2Hi1b7&2 z6<9OYRV`ChaIYP6gcUV~$fctft3|BFCQ1i1;i3bRB^4pF6e&u9U<4%9Jf~Dub54?<^ZcQCfTv=rY1I{}IVWWC zl;Oz&v4M*n0GCUlutPSpx)xMaCOys70IH)(i}x=eE5V_~w~uCMYVC#Wayg&e&YiB! z>bpJnTbctedgc9-F9GCY`@KXaKUf#a7i>4?(lBcQDf<#yU#uH%AeQDS$O-4K0wS4> zW;*0p%&xW8{O%xJd`9~sXdb#b457)>{y#9JN@Bt zVE3-PKJQxyV##;m<**BtA;X?cYN3KJAN2AH(z0Iyiq(5{w5h+(MsZs<0_g;s^K8*O z{>s{zO`x`HtN5j<6Mp0h?9_ac=jFQ=oCY=vTi9K^ufv&N%q_*fct^L?@*-Z_&DuK` zZyoAmziuP@1X<|`^;)&gU9`S;L%=MQMlzE*nCXa;oB?N21y2&a47ddxtQnGz(N<`5Gfx+1d11oq+UVZ& z&dIQJG6_UIG9=Ckmgby?@aH+tn$tbttixU+>V(X(?!gVBVEGr>>jEO+wNC&5AOJ~3 zK~w-7H9zP1qt3&nNTz<+>xRUNL?(k^VHT=*h9n*H{Bs_EKR>hVaxK!X_fP`BSqR{i zq(yC`1@!lhWJujN-)RV9z7ptyOq1FdmQq-?9RS=mdQTDq3vC8BF0A+kM0iJDVl9Wc zOqkHgs@0KkyePUr&LC3!2x&YqIS~{M%zQuW$GJnybKV zz;So^)(_v^Pk#O7zi`|Em;3G3?FRaWzyJPP{OgDYb~h;W&GDD8`_~VDb(^n0-ErjY z1NQ{_>81D2^*U|dkJWE;|3Y`n=sMoNd6_9*yV*D1|1I&;7yNEQ_F&$|ZI?2AO^VzR zXWTyU0zfaxyN#yZ;=9YU-!PvGdaQ|-UefEi(%m7n{V0j%G}y$sda_o+TjqjIw|g)*)QH5B zcuo#RMhpgsEGklr;we>uqawR(KV5VPW<^vc6wuXvV;>VU8pgq%znAs6Z0(wvYsdU` z0*~8{=o_PPkEZW|ZSIO92RzZITI0r7PxZ@1_l9+=Ctk$ZrNnjne4;UxeFK;MfeDV$ zCf|GjL8@v#sVN9OCYO73yF$4$L@j@UjbG&wqU{S^&v>io>-0!hR&e_ zfN`D{M83;&by(pc;wk`QcS?8oSb(TvwAjz>a?@&eO~0ku^NfOAA8&{@MA8}n(Gk!M z6~Xr62mupHS)&oK-^^N@$;(J*ryLw$Z~|IQ`mocAT>c@9W_C~~#&mm{zK#A^vk@5O z(9qT4hG?7Nc1(hOew3({|0AMk&$U)K<_B-FM=y-rbIEUI z`J0l41Mm*yVnP)pDpyp#c0vQMVcohFwwv|b>te_aW>pQ*U_iFejKb_ze<4bf&3DPD zGO^?kKujQ4#8AC+fk;Wo-ad<#dWfCtzJV}ig$mvB#mmcf%z z5$@I+h+?oidjOoF${HrO>l6sinjxOmnHDHz!h+;BG$6a08I@ zeGoiDXx$5zWM$zEPZl6VfdfeQrqdecC;$ozS+5!;0Z0)wBd7-@nkW}rBf^10f?Mx@ zu7n$f;p8xYhV0jinT|N3nnX@_T67J9aV@X33Rbis9_UI0x|gHtiGy9sZ(5AnmHc-BWU14~86^5Ta45#%2+ zfcpEKKj!?LrHPdFsi0DkbJR&xCN;6|TgJZ@7 zr<~p|u)GSaXklS!5J5bFLFeNEgbFo%+`*pT14hu?a@|H|cX8^*>kUjO>bt6ysY`aY@f z|IHD`Sp$RcShuwALhz={5ptO0y1VKbRo0UI(UIDf?pCb?eIkt%Nl5i zH8DDXY`D#cGSqq2f*qdq6kTSwfZhQ-+!_I0=K;U~b-6$qq|(XMv*Oe=gCL*>!Kfdz zfSl5y$~j3!L{6TLL2X($7BB&*IQyXtWteV5AgHN%>cm+A2l6BNk>kNMww0kVlmcf6 zsf@vRw9BY-N|w5;8RB3(m>&rM4@Lwd8whxg@wb2b_}}&M_y4H>Jdqrc`NzlO<%b+y11yaQs)mco10p^(=RAHKf1dg10<1b+6*p(iDGfY7 zm=fk?qmuEA1oIS5O>4iU_^|Dvh;e{Wuwtw>y?2Y`iFe;Y_Rnjdy=@SyNdAqQs$f`C z3|HQY_ig4U6TA7gR!cK;h4lI7S{bRIo{AfU+so%oj)|R$POC80HvnyRvl6IdAJ+0w z;~K0Iqtp}7vV#IZ?&`hHjP9~0^HAL{WDO|5Tz%ZPa)_aT9ijJU`5xEzZm+)9^_z7B z>f40t?V;oL>We}Wvy08koZDO$zwd0`cy5R|$sEf+|CL^Zt{H9)uEN-@M?>CwPRn+ZQqheugGm_;5E zh^T;pwx(+<(B9zmorV?coxMWAu)A^YqD~mjTs1Gpw$pd!zbREf$K2T_E` z1q{~43n)!9m`>s}RfUKWN`X0gR#XZsQ{!=Xik(PtK$G~4Nk!IB)f5;?XJM#Ok)XOz zUII=>+=e+s04HZ*0(b`h{rULJ_(z0gP7S?HporY-gC_BDM2^glcs@|r`VxUjP739U zRVK~UUJY&6k*zU}6mmk7HJ_<-fQK}77DKFbdPK;oiXwPM)JpZ%Vx@RBEg<@$P%MK& zpp9g^k?KM#f0zqpo-ck^ojM;yj^|)x9F`Cz>C&joQ_^D=R-(Pm83ThPH8HDr7%Gdb z39*KZfj0CVrr zmX);~>zy&SIfzZp2wNYq8|4`qo9G_5O|3<=mqH>y`k%qGO|k`Lm`J!{rN`dRiY6)% z_Mhe~o&*wnKzJ}wQYcl!2q~tNEM~WHBUa~DTQpZf+tqY+7yx#Yx)$tSP$3%T>|c_A zYxbJ37HYX*L|~TrZw3HKo7eTuB3y2{fLX(;YAmj)eH-$y4Y#JLXTk1lyKSvcRqrkr|ih2swdDv_&&CLtgv^Nkk;g?O$1L z?2z68NQP!03DSDDdhya~jeG;9j?TLJL+tHhEkl=p0uVB&u2=yY{c}0wwh~1&UTN5D zPen4qeh$c%z?;Q(J}$`UvfvVS6_RuRu~xl(L~=R1Bs>0GNo_4(9~L{)a(knf60h5? ze%sp^EVJ^Jy>)kgSGFKx_vukM3Ir1{S7UC+m@pgSB6q{T!L-)!K^;^PR)0K8fi7Vg zP*MyP<{=d-NjIfDRVU6aK42Xbr9-W)l$o&*MnMHx3ehTF0CSZlxbKBixwLk3<}e{R zAm&-~vvdfva29g#5kZ>6ttmys81aaV2y0%q{F5}HQ#Do7l%rW5sQ`%_F&X2LNNS$Y zqOM2k;g=GO>{&u4QLA1In~)X#E_%CGpqwuej5lWC2|S1(BN-9wd|&F?J=0Ah<$fUq z+3MI~--(axQU*;CvKK2?HJ3QW>cPj_f^9Wz%;Gks_MQcxb^Xzs@9$7l&2{ot8R4=h zhrC#Pn7#X>ru8~WDU9~M?Zvj5iwk(GExLnEo&0~5jqA@CCkd+JH7*vf_0{Q5RGHFr z;|_OVgO|P^?;jSM|SUp-Yxsr-vqL^9OOm<*49?L+x+$Q`-8ll z^FGesUh8(B?Q`zBu256R-$5$+y2T|F!b#v_jPY${;Q+$M}KNH$9|myJ|XUa z#x*7j5c&00z8*L6&V^g?^@`t}@;(m#>=kjtde%LB`Ri|-HePo>F0^-@TKhly6aL@r z{@uZ#`xSdBeaVP?eYyKQYWj2AQ??^?JBf7J95!Cy98>!U2x%JW^m41E@+lbhO0P?4 z8G-IT>e}j;`wy2^3sH)iR4^D7E&ruZ)hx3%CRk18M!CSg3RP}oVanU8)LWPE#oA9p zq$r`n4NR*ilL$nC?nypp9IPK8A~KL*wAN>U*3JZS(OO*~J8J?n!WsfQEV8&z2&@?j z#Q59u`G5ZXe~khr9*kuC@fd#_<0FS()2TW&57eyQ4FL^+%p^w46QnR{Oho_~AZY?& zo%08OaGv{Zk`-bq6C4@OjPZzZjBp!rO~BG2E`Ha>0zA;Clc7Zvqm&g{VB20BDBi8} zf{4BK>TWmJ5d0QGCgK+<|>90*&9|{aM_Z9&)H1+j_es^gVB|v>!kc1u%O_ zSocHCF0Y1DNK+nG72V3^!M=3*iBa3ck`(4%abgFFopoE_gL!JE-n4HBX2;5F(x3na zG*=ksR`6>BR;*5vdws*q8kx`9Dn?fS4OJ1=ohXov+axhdVeHTK8cufYp=)RB+M$*N zNOw#r>)bDAo{_!7WUKsV$N7OKK_-lb z(Fs>m{;NxeI|XZyw&V;+xO3?PksSW$3)fZgvVFS>Ap=ZD{w^MmgiDlJ;k+xl+dc4V z-waU(7|1|oL~_DfiEBlMP|mpQ8!2J6U@y(;d|M%+$V4VUa5X8Qw3ZEkUB&LS_sydg zF2Z83SntG9tR|D~8*sw~E5?dR&h5h0#GDmY-6DfJ>!`EkX;Yv$#1{+diRz|8<$N-A zLIs^fLWk<#6hnDxMh)QDUZU6XSO|rPv%AG~+_f>Cz$GB^-*oKL*RqQE;yz06biK=h z{KlDOeEIjD<7>d##uV*JVnq~`iZ)luGO?EZa@eLX}}qBx1{rnG@O0gN7YVJmu@xK9k{U< z#jeHKPbcD}7;Z%z2~bIO-}dF^mK|#6mkZbQxVtby6{Og-r{aG0rPH>TJ}(1)jf}IA z)xg>OY5~>+XuRhw_WtIR>lv?CylBgp*LVej`{rJp)b+9LX|%()03LhQwH^INV4)-N z8BHOOG&LO$w=g#}Sx3|l&XA}G%eYIQHEoYZ6giKHvv7h4OItuw(TmKq9+oKzd@%7K zpHdbMLGGFy%FGcK`yO8OpQs-=erTSkftArvZ{XUmU+k}Z`OLSs^s`g_H~V_Oy4D*2z1-<{@cl2( z`Ijj3x5xh0*P^=L0jdB0J6;j<_aVLi{&!CG-!!j&{ia_2^yT^salVYz_bY|1lxiSH ztAa5F35S(R)!l}>o*YA(gjveYwE{(!)$+PR3hh85RjC@qQI)|8#Eei-2-OLloU=`3 zN#->cfH`Mn_mBwifjoP|n6H3)Uv4&nrxRzBSGsQAc|L`7&iS9xIaLq*k@*-TV#2*o zaFph(1ToqoS&iZZkElbCtSePjrC=6v&M{A76!FL7`4JEl(R>Qut>htrH%*=EEmBcgj2)V`IV~l4# z9uJx2DPnT|0DefPDCOxEQGo&`bwU%9sF;X}vAuTV%j+e+&BOlZcazbz&Kq*=(nkM` zuIJBhzxg^RFTk`}!|lUc{Xns;_px)!Ty<3y3vC+Z4Niy)(*RpA_ge9DG0L z{rI{D1-wP^>T*xF$?5xl>*8P}gs+~%8j2TuI2M10Ez0-mwA|m4NhJ#p`Na|H&!USO z7pT&n3nrSVN59H1{1RU!O&H$L!TOMiDvO-n`(W(R+m4>I;3zm7M_(GVO2KinWs4l3 zT3+0qd*1AFkvi9hn^nz~jsRel`C`*!I}#+o2!#RR6sKuoFl0^!t3YG`a-*bvFHBxq zlkH!|^&U!UWqC9E?H4tfr+}#Lk~X!APb_rrmu|^v_8hpq&{9RGjSwXcayYOjE8K7t zLzsfAekTEq#%jO3%WPz#=}i_vKm#U5iVXOP6G7BzoY6c(MKDmB)o?8%Sw;K(lo+aq z$i_1rcBX_A)wRYfNoFH*XGwIYCKzRIW}zjavnpDG)DbbQgj@;;r)sv?^$eemIswk| zcBu-L1wWxWCp9D77t{-4szpNvDCkGvqz+atd|zbYs*EfPm^dToY)`QwB3MBS2u6(V zw{$;BcUQj+9o?6eKTc#i`a?!Ycqp;vjPcS#RcJ1fq`aTaT>-ofcpN(C-cqG>;W(;N zTKjMrfT4Za1~6jPLD8bIv(C zlHsP(%6s>x9%N=D7~q`eG3x`5U_B(329{j_G;twRU(K|mtZbf#o3ODVhD&CM6O|-{ zb7k{x$cYiB`$IsZ5;t58qykujKv!hi*l#kEfn6BP0}sQmfC>~Ub}gdop1`%3NLgm^zv@!+W(1ez1@ITy&;B*e9uR(HfOKhr*j z88Jj%bHtp1YjBw`4rm^o%W5FYxcm2XYFIMZXo^{Pj>P5w(HYd017G75p=m(5Hw-44 zWzyT5sl@8Uk?wgHncHVMK&cy^sq>d)r(_higa+*d_Q_f4XHLYu%&3rfkdiS28u&vf|vlquUb5Zq$~wiq1M~(i>Ml z9SMsWnc^LCV~r+I2UxBnW4l(pgRFOU0(En*W6TxVeHxaU|lR>p?!1+9S< zoo+NUU{;k0zuo?tL`yG4G0@VDVFnXny{FEixl2IJnp3ALTt}2KmcQ=)?+cetQbSd4 zGXkA;e9nWVWMqVEKo8VZ6;O;Hn*W&I+`SRyr(lE} zcipH%*aZ{qg3qhwbg^@&?O@hgF$>BBa#5h~uu&`;>FO?NOL$}GtUSkBZfQLo#{w@= z>*C3^&$Ib5?pDWAC$X^2+K!)Jc4{mOerfc;t^-NY-HlSU^8AcIz17J&iT)BLgo}=} zMs#<-X=X&rJ1s!{B}iXH=Idl_juv77+)d1P{N-BX*)@`1@z7hA;(9^UnmD?Dvj2=P zC;(sY^DmFu`8@J|iEll<x&x^-uHR`!K;9cAYJ?*^5UxZlY-7On90f#0xKfBP4g*xe)cf4|(r{g=P{nsz{i+k5vV+J^t$neMWuU%-&- z=Dj*SL^}$?>j19D;r*ZOf%EO0wOUoU5(xM!WQW^>zW?&3S+^n!eLYp5-`=Y%TVz;a z<8Hd&Vp9QLhr^#sXrn@@hDVr3O}HUQfVAH6lZCcsx(zUczy_fAgWHx2N};C|NHp|i#R_q zPm-uvZkDAgP0TuL{+Q=ciWpDiBZK6uIuba`aZHC3(lj5GOeTWayl+G>GalqK^T`}^ zb1xD3$SiZDLur<^BZ)N!W-}|>u$@(^^Rx7ME{dNU4r+?54ib-JH!qXei*$d0MH#=YUd*3wu08}`Mhd<)^6U_ zv$tn+e;ByzjCPYDzPb~=rtBW9J?qjE0jgeBb#9M)(VOl^L0oNo?N{ww(f!yraL1JI z;fB%tmUs@`(Fv|~dN=hQPG0^7~&`Ds#8%Mv?ZI2*m7Kai@idi@_bzo>YIc(i3lL9CfozxOY)$SP{(wdEJ9gKt1d!8wbUdO!UN3GBf?CVDwW$H zu}X3|oVXv#U$RW_+F=m@hQigi<`pB7TbZI+h%Tq7!nEEC8SIk)03ZNKL_t(+lI#*> zN*vZePn{~quy&-o)w$OK-GU}c6jC~S_r&|*WJcrBi|u8*kvG$tWLQ9}+k}>ZB3K`8$Jh|-;lIBzLAC@0wtZ34?Zd%Vv=WZ);xH1aU8xt zwVwnDAVn4@Ik+N!%#bQ0G6Dz{5Aq;plsg+nu*GC0nNcegG+-g8UF_Lt{g+Yw-Qz7- z`q}Xkk^ZaPke_{xZz1LW<#NP*ys-!0B7rwTXrIJ8C2ns5fZr`U8k!ans$v%i0AMJB zkz@ulInoMmk;p%QaH~_)$vGIwGZ=!V=BMVIoQ#9>17xMWq*MG`MdmrcQOtGegxhf1 zQYo?`0xn7DK6z~rd-I2Bay27LDh!Dy3aG&fRo!G3&YGqII|7t3WSVCYk@U8gW>CVa z&mARHcmv62Rgrf90xsfF?qJpVy<&k1@FS_pQ`k98@7;ZBx}=3rTM~w=1yfCSHd9S9bGF*m(7K0#a z)r@DkKVGNHMRlTDNZ{*)W@-7SQ9zmzu0=O(#GqeXm&lp7D^E_`M!RqOetg9gv;zLc z>#z1nxL*YLD#f!Us%75QheGyF*3H0JQ|F(9 zu1sy(Z|{`hU~{*aSQUA(EWjkVcudB}>_si~LEaEUF}o-UAglCN=j+O^JsxYA{p@8k zML?}1cGX0Di%MW2&K=ycfD*fFMWH2nrp{9?_K!jx$v=w+aU(SJ%^a!^iL)Xy1B5voEY%E_c3^ZaujpdO6DA;c$msQ#P>a?HRF%|FkBilpzB zKj!@NJpMe+Q*7-@fel-Q}eT?>ii?}sX+j& zj0lA_*bAytH3|s3;Lpga`dq1#ff(dR#3S@b1auIck60yDtC3(N$1_?C!H&L!spOW+SrdRna%G0Uq)TfPtzK5l z5=q=^t<4cTb$Z|QCCv*P?KvCk{zW^c9&)R_tOicqYUr?@c+uR|9I z=Igy}+}ks|%$H!#c$b>qL9Tgy*X@6u0{#XIjqcb(-i*#d)xUoHFAm-i)h}q~KYgm- z`PjdFtN+@uA+TQ}uJ2#DkHZZY=&oNYKfEZ$fAuhzO!jBgx}>#lzG-MzH4C%E3TO(_L;0qa92pbmDvRNm zqRCCouFyTF^IQ+Laj2`Tm_!*{D~ExR$x2#*51(^J9Dh~37k>fqad&HXv=@3Hkj{ML%G~Ypv z_-nf{lp9{D92kQDvpA){aQv&*j{~1q7=x3`ya)7eY{=b$@#e|v{sA|uxn*j9bB6n4 zJ9Drb$gutGJ+XPa&vrRa;lyi4kq_kN*9Bq8r8Jr^hvz+gs=>8}t16_wSD>=V$yPPW&Lav+wIhflSl9(D}C4 z+Qk0q_2N5NTI`I%=vUJ>0bp}gFm>jN)Pu3d&{WshWL^M7E(i+HauWsXub(ODU9j(I zki@#eOgA2a5o1XerU+D;OcB?R0&vfEwsj3qLL3Gf&9vPSE!sdU=u-SZUgvdN6zv5LC*N4_NGG zGhwgT$GFuz6{Bt|BGmJk?R~o3B)BJ%-@a2_vX29~Gn3a}R1j4_uqY0I;vy$jQSN|f z+LS@?iAEPRpoX>n^gDcCW%-GNQx?P1r{f3 zt&}GQmmZ3+Zj{=sUH}mRJ{D*V<&Z=PN9Pve&P@oTFoM?gpbAQ;Uzl|*t7h*DC0az?V)lLo8&^6DOQQ>6 zls%|3WN^c|aLzmNaA*SvQU;Iw@vGji(+S$lNv@7&+|neWTJ zEo(cM*y>9--#we$kZqY!kd;_~b2J%iKu>|1y7XrRsm2e?Quc2#K1~0 zNPwf2galDCDY=|-2`abtD-c;FrX?Bn4y`3^6t7c?Wwn2jEgJ6A?ssZ5g81|W3Q)Kw zYBtSSn_>>_GHXdJSLt-FaVy{>n8Y;Y1c9n>)>$|S@sVIfSCs72pWK@bvo@iOM%(i> z+Elfx;mxsk$3D|e-37e?t8lbc+?6RF9QU4#6X5-l>ffFs(3*6V!Ud85%KdpIMx)Lfku@iX z0~^-IW+9xLlQy5hREB1OUi*`u`tH}BAw=}&3ySKb%ifke@4&ra{YNscc@y%YW}Q9xyd8BBh> zFsgrGeN=r^eU?Hq!CZRSg(QmgiK?1Wo}d|#RIXLhoK;6nFPwMgpP6qNL6#hV3mM3m zh`D+JEvW1ckqXqxs+z4S#kG_TzhbebGp)iP2l*Bp!NE}Rh&ZZ_Ei#tmNWOunRB%KL zi{Q#CH=UMnQNy6i+fbXF>#oxYWdzA&IJtQGr&J7CR!0FPs?Z%-bFQ7J{%tsEu{uY}#|)@ofXy_`vf$JzeFyu=*YfZwuL& z1$J0XGj4Vo%&eySiTA7d=~aH`h>bO1ds$BpyYq;h=|te!2!9>V-$Wt($rJ(36Ajt) z_4`Sj*g5CSSCZPx@dc4N2b*7h`Mo!KORikI^4C!0X`^}Bn7%ol-ue9x7aaDo%Ipm9 zReM9t&Moy9@BKA=xXy5U*Z0fyqutK^^4EO>SKR^nRcprCPMEoOGyv|* z*=cdkPCFN#vTw%0Cn#;KQBs1Z(*oEX!NQtrRaF@1K&R_Sx;w(B175b_C6=Hmgz;0s zz*~10LnPy!iC92>&JOoB{2_Z_yd;deuUd#(I!TCvB7zYJ>R~51;&hkhvX4N@9pkm2 z&o%zVL6R9m`6p^s0jgTXh#Zfw=UjlhK0H3PM%Ch+6H^k)>IWgH*5H8SR8p0-W>u|P z3q022vsQ*MfZ0o%U@+b|qPaVy5~zq+xmYSNfH#i!7;iC19jYO%)o2k=Vtt63n23l0 zek5TBpmV-d8W#zr1MKY~o?Am>W4+dDoAx%+cf+pM2{S$TxXzk&fu4mxOC~Pkc^HHdNuXFd}olLBc*GNeP;mm4B)OE$eh-aWJ8WH ziR9dLW3S@#cq$Asm1hUwchgWEkEz4@UjP*M-18Y|oa0k=wumO|P(akpVQ5Ds$kO@J zal4l#9 zPm})~qHbw;%l8{TD;1lx+p?muPvt9Gy>0tj7m6pqOx45De9soElL{y&umVe)E3Zyy z)SfdE?oKjB!Q(x81|5fZI$IrjFq(AgDs=?G*H+3|1i0W8;^s{1Wb z07gL8j(25{=iY?JCMY+tx3s>EU@Ty%JYCxJARj~&*CJRItBMt)>I{m>Ce}J9Uh z0GyX4cnX(vPs|;CAY6ah=tFGJ*V{*eZwNsPqxNdBbF$`KpGQO(?>JEvs_Rp!F5FMX zTgHP(6?G7EfZ`azV7MR9@Ce()q(fqHfvY#OPF#@by}=#ff}{C^Zl+EY6k0?Q>F|^~ zUwnf>b1rF3_&1201uoRIIZx13P zyVt36QmsF+i5cCi$QDafF~TZPlCvu?R#sT^WN^shFV#B>scLRJfe@2{-0cM2x!Aou z38*pIaOXb2%s*87SOlvay}Q7yyGLP9-2wz!CxV;baqiroVd*H{;&&5Bu6B++AKbXF ztII(~6{;5OQ=9R@jr0X~D(#vQB!^px0Vn^?6^J2Ayh>O&VMu!{>UG)^k{3!_jMi(g z-Wlkih9z&(-$jS|_k4i`>@`ZZFGwuvF=teE3Aux`|=(*tn6m>V<^Ry(yXzGBnf3s+Yt_o;mHdr#-a z%Fep(uE9C=w7JfHJP_j8=vx!`gM34>2%iCS$1?`W%$i5IlF<} z-ak9Yvt(Il>&(6k0qfTKAjlXMj}=)VWQc)$AV$OtVkxNsfLy=_V`>RYvYp5`K3YPp zlfNYS22y&Ek3c@+QJITL#u9>+EJ+hYV8yEAD4~pfQ^1Ovr4Qk=>R1|xK#jtmNY5s* zJ~4yH>VZu>pfL{s^OJLF&C)yYA0z+F{Er+Tqbg*wHe!hQKXcWxff|m4MKQR7MXZU# z9C%sJrL1Cfssb$hDr;ESq& zR&ZyVi3%iJZ6p6+1~{90q%4%+tn!Ff?Eu1Bp222i09R-i+c+3c3DnxOeZYK^tM0@G zErDNXCb0PjfM5lu^G|v2?COWSwTb%%bv?J{-GfuT3hcn4Ugz@lt=K@xdFB^<@O!xM zx!(3(LC@Qd;)#B4p7`?!^vBTR?6{wY#Lq|X|HAS6IO+e~sdf_Xzn_tM9$)Y6Zl3?I z9lzy!K!XWBo$jlXsHfA!t(=!g_Tcc}e_{Jz3rz0tq8LG}$g z%sA72XQBN`J=sqkGQhhr1GHIjQ1*=LWxDG!<`lJ*gM=8n9&as4Pz)Cyx}|$#VG8ms zNTi5~DXTzw1LD2{7VkB@XxpBx#w9v_ju?Rf4)Gv3B8lk|pIW(nq)7?*&pNW=J;o!) zBOY=Mwt1D(Kt^!cD~?r&59z&1p|#dWNyGssh)H1-f()jJqeAkjgf%DfSo5RiTe|ns z>GM0Z$cNlHBt&x(yu)xw19(IHiF{|Ss87@oX056URA2%6QE?PYgHZCw&?ESkqdJrT zP#HNw)7NLk-T+(*`gM_fT{tJ|d-LL-X4gNk9p6UZX9kG3{Iuufw^z8jRssM#N&I8( ziupUGhZn4zC`PgzM{-0R&KBS>3+_?+7q}U z5k3vn1?YdVQO+rDwsncoS(zSH-)7>=aW;YYcWqXKr_KPGb#&&{zaY)g|FVFLHb}mr zb70vitNqG4E+l|Z)y_%R4mqsxcMgjm*5~oi<@rXQ@mUd@&Pb3&ZRV51qT0m1evX~x z>OSNtu(XH;ymzxB78$yD+*{~%*T2Te%;IgvHdsY%@kJ{TAi^l%Zuo&>*M|dU#r1=T zlNYu@a-ql;5iU*u!#(m^$|z2qg_8`O0^u}O$SOlSc| zVNudt5y4n3w}WKHT0@gPR|CRGgEj(ydxJX zhzTv62DzeCI1s@SQ7%Ow7}W?~vC|=${NrtmBsGmuCo}2FS}m%e5xvS9KNPu4a@^6H zO!$_#G0hbP9>Ni|+;Ny{WhG}e3K-rPD6yv9tJnnlJ(m5@(L0SjuGj7DB?xTn5-*>* zCpouD=?#y24pz_YWUuF^Q&~smb<5_9S$?KVocNEge_i-V$~kWxw9cVm&&5= z0gMGCs<9?#J99s?q@|f;St3Z{s*xi_Sd}I)I6igEswJ(3%2iCNP*`SRS0ro9$Y4Yv zl9gF_lita<;CsenjAT9#R&gGoh)8$9W9O9Z1QSbayUo+j5iMA2OmIY~w9FAWr|go!^{ru zbHhyBGktw}ISYd73_#j0Y}}z=(K!X$L34(ip2to~*$Owc+KN*O1jSk#d5JFzVOL~h z8}m9nGylIgAM$(&Hd`BI#0{5W=bu}@2rX@c)7wy3WNXjwZ8;U2y3%h+&}PXOm=MJ} zkx=LDPf7!tu+?Rrax#H%PP^z%yJoMSzO+dbXQ+jKpmzP7bw1xt>lgO|wBc#p)j+rZ zilTSu$jkez#5SxQ*>M8cM1H4;wdwOsgplu_XVsNDVN3y=7kskQi$p>0M1W?bcAw8{ zI&CaWTRto=sxi(7c{xZ*VGrFRyn?nOjm=}7nj{@qy@m^>whv$eh^)+&0ZUt$aj;i} z$)Q?>=@qIVZ66{tl_8sn9Y_1EkqeAs&MJTld=q0urDw$!c~1r+5Scl~aJ{M6?Ei>h zVlYQM5S*N>t~KYJjC`+A7>9(VRFrCZ`jc3wsVYUS2~KH5 z2DzXq{e>mqkq@AzxU`lg&m|{k=q&YPdS%BH`*vHCm{kXMLHSRJ7JuY$)Dk_+>P^E zZF4ruavQ^|yim>2xnLb!EG^rlJqx!f;npsQw%*!Qk-SCF9ogD;8bWC(x5&OBqs-bF zu-v=k&a5~|bKYf9*DPmxKF&`u_y5v0xuz4#C}sw23mG*9<% z^E&Q}{2yR!zed(BPv(ZaZ)zF&V(=BPy-oG==@j3%vj{9H#>wxe5uJ9bs{Oanr z;ODC@^R?ukqNCpLeYMxG)b>@Lj~Ays&prLiaZf%yqrqqL_4?Echy8bsC!ypGSP762 zM3I8hO^^FZ1h3STrgNa>Ag3hLM@Vm8U!;IF;!wFk-(Jd90?X(&f`7OZVnL$5}C=& zszPxDGw@)h0l%PvCB4^TX`mkgfF(0mm8eh!H6j9OaZEd?1Ce7WxMI5OsR}>VA;m*n zQDV(Ck9DM!5eqzs|6J>%bgY8%jp>pXS)BtkD4a~%uD82wJFgA_(7|e;B>kuvMFr8# zo#vrbVHFPHkR$~n8H(5=WkA8xs7PiI8EfPtK`zEZn3hhvsCQG_q0|l-b5F~CUptU& z(97>gd#B?@PIWuqwV(d&S|E)dJ?S#sLXtWi;PdBmhU?}fcM$PhaKNqSts70_ys?XJ zMd&73e%b|XZ$syzR=|}aGK1uNg%Gcy|1SeTt4sQ>lnQ*+g+8iu^ph9 zE`W?m?Kic(5d(+X!?ue}8W(ZPPx2ZxgU(mRx-ZwR;MGIEAwm?jBst2y-v9LovES5k z_jLg%cbj*Fz~;JnM`v9s#tpGyJC8|ooM={)_MKfMcHpd)40GJV`pzO+WEEWZDJ@-r zx4w-l%4k2dt9ZcGGDiq93&Td_he}#6j6*&1rXXzAjN{r zrArEm0yY$^+^%@2dw082OK7oa8$l{mi>%h*^)GAdY9n_vtF59)tz=fCh)^P>v;ZhX zg}7YKT#UdF3WaH!tS3Op4O>xUHM~Qu34Bt;NbjlIlxiXw66n@8ovpQAMuh7FR3NKh zeY62lO=xkHYJ*v*b5>jA`qf9-LEJ2?swL+(nk2|oEMze%!upShmYe7fF}FAFnOD+0 zs{0hJXvojgyo{&s%Kq9FNi;fIp6?x9609Y;5Vdo4J3pmoDmN4{EgdX z#930e_v4EdCDENY0bmIbvB*8Lo^mBrAtoLWN)?qM#^O6Nl#?0}Nq)|`N}p>LR28DQ zR-(1*GeqIB7%s6JMDZd1A-)0c86z??ACbcnIEe^GDh=AI*{zVGmH{{qLnyQMcmno% z1dSpqi$%o<7o>QNwE)m6=l9a0H>YUGGmV{MUtC3dj zMJ_izNMm=n&1YXXJIM=iD=gcz*cqqm3#=95G^@R3!W|#OAW5PYfykyRYn(uCdrJ#a zMQpu`*v^`~e=ubMrtJZnW<#=A+FhHAP99?0zRm{#8-Vvt_v7IFlK?xCvwIxRU`bh)7wrjBi!dy~;VuZ8Jy=OZUSLR5= zzDsDKvP)JdEqJ%E_1+`xQXB^^>YjLQ2a;-M3b0u}t(%v9=SZJu)wUkDfi?Z6X9WEC z*z^2OZ0>YW^BB5?X3-)v34~N+Wy}#oU|70GDmJkgRg#u!s$6@OVt^5$0liV76JuVg zDoCq4Rw$OZutJGKV2wr1WYhRX{}W++c}WXmWdMVmsS)c9<2@c&M)%6Q;E0S+B}c^c z11*bGOz>E19mi+nnBy_Q!+eF(D*eDpK1i;$I7@R*=>QJIgAvGC^`ZHRa{Rn7P@1*M z4f~`J9@<+y!eu_o0$^O&!XFJ;L@sgyD?n&z9ngXL1NjF7in+V_*@aG5WSyJMCdOKn z83ATwMl6CgRVWq$LHqSfl9rfzddH3lamGcpJrd6-?x;pvpXZ8<{N3m9i(4L%J5zOr zokUfmIhbRSoCxk))a zLlg-U4{Tx5nZI@l&&LWw%#lf#0kG_Sdn{_VyV+GGz0OX>j$1MBM&a9R*R5ga(=fjL z$L}2{Der<0etw3!2KT#r=)vq0b|6mnCfJzCuWsgce%3EOyJ;!+FS2kin%)8U^YQX% z&v1F6qv$8^>-;7*Oz@LYGG4=%KmA*;`iSv99=I#bQ zf#rcP=<_@0>dr7qb03ZNKL_t&@L=8rqzgWNbnBNMdJmp>3 z5XiG9{(1xLOgIUYL*%>8D)Rg|MpLjdl0>B z!cFI0fWG;MBv00AK`eU?O>%10)8^JPtbcejW!gQ5pjgtl{Bul-oq=eNG;aQwwB6TdCNasU5B9BocT{BOgVAlgk)_)ecq%eu%A_=2tUa zt`Elw6Iv2Kx0(RTkfJtiSIBIYHeVlXIVU_zhPN>&%O!zhOUC5gl;tj>dIdp8P^6S0H?GnI=TmcgE~+}Mz{X- zJnmJ~*|yWqvwADk5-_IOf0rBl*`ZyY^NSDs_Q|djemMi5fBc7se)8qGZE0n`AHMN= zqtg~fmOI+-ZFish!kU2qQ_Ri?%+G}g%jgF=4&l?iGOE^EW=;=L#Mo-$5rGV5j>xwh zrmHW;M7}xB3{{{}O))NJt`o&Ix%`yJytw*HQ*g z&lJ9M#bKp00o*9%jvshpet4N_&D<^0r9tP8+Yj!RyB1M$`Woc*2!?LGYvMe=eIvGD zYuP&C+W567xd_QQPWv0xEQ!V+cLiuy194BiZ73V7B*C5HzSUxQFm+QnZk;c0yc;Ca zg%?NY#1Bri=z2{5dj@g)1p)1ai$t+sU+w{k&LIncx3bIH^bp=V?ht^-3Z^$=spqAYuv~HRkB1`6C70JxBsMH~7)yMIvh0II= zde~q|V%1}e%tuBHXsx4`R`*QMRDB-DM=eJh&6<}&7$Sp0dR^SMM zk<8LcR`*aPeyl2erVteebjTvkiDC+wBk5{dE=hA8TB>q6Z4qnLQIIOdp?DM~)?%}9 zm&A}lBQ=s_93@GIPALqR;c2ZI#0el*XY2tW++`PnnpfUQY!sP8%<2$gMaLV3nCPOm z?mDu=NL>l7pH9f1{^=I$-nO_~vg7A_v<-3q39fs5c#Dnu61zU&D^i0qT@Qfu!oDOo zQR%y@pBG}&#Oi+M_zv&W^N(lD>BSY@K>W7fxoc{FL(6_zvFkF@gENY$<3Sm zCll!xbKqx_^RiJt`PlB1&^%KxpO}69Wow^$Q?}@5|HZL-2`dDbNwp>;w*;r?T)w0d zO6lfZj6#u2Qq-YZS_@j>$Ewd-lbTh_bShd&Qw2@c0UVGpg;gv@xx*IsuDY6C-Gl(N z%6tH0n1V?GQ7d8$bWM`|)e!`87DH1%Gznz#G2%V*k1_rno|K~t#VlUydkn8C&e_|+J-peMy z#mmbQi$YUwo5<2F>Av14&_IDp{KY5}SqzNgOv3BbK+98(?D@7sPj1-x*9GOx%el*U zgmv6n0QHJO8fSfev)YvqX3XAqVFE+!T6sCXGzD4bd9UDCMz;gbOQ=_+fGI3#oNt8g zfy#7UV(1<``9ABUhtr^X+&`hq#08Kti2>J=JPA@DwbeWVNrh7*K5w`^lXmZS5H4E; zvt>DBQDAW)$T!6T520Y_*7es7M!UGS-xpC^H!rBM^EG~`#kI)pi6t%5pv0tx(_;-q zau`43GXR1eOud0>_HNA})IdXav zmojzn>j}TzV7A@AHf2Sf%+Q_?p7it-X1Z0JXo<{42MpIn zUmJgXnz^Uzuq9sNZn->@g^FEgf4Zz^Vb_N7+dI?7uieSeg-+O{0p9-grlTi7=7~JF z;R_?$MTQgPp%!Y<-Yw3wCn;ytn+~sPF8HlQm?RgWbg0)25Nk_P12F8n)YWkA-O-bG zy}<5l-ww|r)^gIfd&I}u1(L<;Mj2b0&kA?_(A?E$TP33|zt;Usu4+VV^|4mQz_wa> z(l$?u2w#mITO~>2Dpb`}ed_p7lms%Vq==#r2x^783FNBsd(F&>6k@85nty#BDE)~y zsVGfw5It-%@1?V0}rr-sU>lM0j@x^X;49q(kSPy;JosJ z7R87R#*Aghj$A<1`kZ=*@61`69qBDjJj5}^aGn_|xue5G)mt>db5fsGDJGD@1IcO| zHKnDJ>cOaFn7#piO0yJ+VWKz+(y|PeU!ybdPFj%Qa_(u#?uC}FLnC^F059#Lr~AhZhClmHD5#J6NY<= zx4!dpbnZj|_Dgh<=l(f<3CPduavLVP1(5f*7fj*i{>FXtqFXGU=fEZ4bRE|yHNR+w zg-`d>N_KgBR+C)xnrGN|^)ra!L{Gl`>u(;eY~^=D_p{@7!1vp72EKc)<}!aLuLN9^ zd}n|b&{|ASPV!IgO}M!dKR?ce`pxx!Ip+P}J6^Wb+*^7W2h_%1IGa)YR@ zd)Nl4;fEVl^g`r@MtkZkIE3qtg2OIoeGl4h)@zyDh%St%y&|VkBT+5)>_h|>v{+vWPwp6wID+} z(bTCpgjMrV@nBR@Gej$(B7mw@#EOcl$d-axuuveRT1c&WpLz%nv8Axj!XDin@G?T0Wk(D9ew!6jn@n&9C3`Bi;oJ`TZW!J_HV?N;^_h|^-(!LdJM`-*U6ReIcQ$T- z;5;ts#y3aPRN!z(7Z*3s-O+y;wzq!X-XJf58f@pG_MX03YTLY*D@gs7HbyvRN6v2Snuw5t^Qe@0$gaHGxFW)0iE zHUiuDlRM~%TY{jP>!yqJZI?1En&JDQl@?0G62=9F1WLgzFVL?{yz3G3LhH^!&SvPs z>U<LVD zK^Aa2H({@ZwCJJ$MXDG=REbO1(+RFvwFdnKQhQm~B7zE$)I^e|17e{9k)U9KQMu_- zlqe=qs)d>m7$H5nZCm9Dv+oi24JMGAv*;8ZS`DMb#lo^^3K7EKg5n@hF+D!0<&>A- z1`5D1iwQJH0!5)4wK~CLjPfBSYIMt*&E+;^53N1LOPt_g9gaYhvm)L>?CxPw%a~?` zVgUsziw_Y{hWp~Fz-cgx_)|!91>TvRIUAyJkuw#1N1Jt`Z@=LVZ)5k(@4qBVe{s(~s`tF7v+2v0 z>KL*`Goss?p^+@7!Tb$xA+e1CL8ZHYERhu%v(`kl)IB5J`?A(#AgUrBA)_W7URbL${0Q+9RLc7ZMFkH5%~q>{Opd`6{UX`XXjN92F_F;`l;^@lB0f_rWlz^r zuI1a@8ADyl7n>{XawNP!(%Re;0#=tlCmuE`bpQO-<4A5wMFLfE_Vwcvs)_!J{Nz4c z*pqp}UR{^M)5GYytQ-BAY)bXZ`Q6(@w**)-gX(l9igCi(oh)ukf8OMdXjg+UUUP9K zs$RU?7k~Hs{cm|HUyd`&b)M6N#cw^IZ!i7rK@zvq{=x_A&);qa-(C9Y%s)xb|K`2@ z>`uOZ{b%EV-@|q)Slps4GQCzgZY2+_%)9F`^WG5*#GszOY|qe`R!vp(yyQr zu=$vA=LF#Xv2S0^*J;ohh%e9W;BcFZr{mU~hS69u2e^Mf0A)X(OHwp>pS>;g<4+`& zQ4etx6i}4F!m6rO_?)$tQZ-mb)>$_Xa%20)^a3xMm`s@7T`6I1iYTtDXeEPPfE@Z$Pdi=_q5 zB~mf?KrO6dmQah7hG?Fl3CCp&efQCF-1krfc%Y(+GL?#eLX~77-ZGO;vWj@5YQX!v zL}nxcsT_zzJj4ef)*=x|#mAZ-vq~$fhLjN&5%9*83J78eYpM>_3hgchUuMy^3Aww* zeVvy6?{nsVD{GF;)BJkqJGa-nXy9_2`%E;nbnbw!^y;TG^OkGn^-BOU;}kSmOmlxM2|IcVFmjc>eu;G@i%5 zsQ7m1&Q0(M!C+gCoglX>1vuP0**mwlK~*C5;59k&%xsZcg3tBq=l}p4Vk7J$6*mHy zl4#Xt)2y}<%kyF61wepn2Y0QLxcw{#1F^z(>dRk!4G1SQG3Y|Y{ncQ)@Fx6^Ht0P{QmAk{P@ZE|b}c7kR3;q(Z(O^qm} zaXGLyzl^HII4lakx))zksZyD(9F~OuD#3>c3y~`XP21|*un$8AElqQZSu@BKQr33Q zJppQ4@0#7ioGT3aSF%jhtI}$K-F4egNe!zrfe;@hM6L9CZM}vrt_DlHjh13z8MI}Y z=H(|SYnz1ATPUMEq((NHQ^f}oh>(h!!4w`vA`Tb>Rf13iCm=`Mtb}02l84+vXb~6{ zrJ5jEk&3`T^FLT!v9i|=(gL->*{M@OB8eg5Llr?MZGv@ReyT!7;j6m6#`C=Lq$0?C z#6T?zZhNjvpgg(~vxs8Mo>y^;Dat#EcE&|TQ;Y=^)~5SjzSrGEcaCb?7NfyIAoyTB zT6ZAb$6>68yS0f@n)Dh~({(u{BjP>Bd&VPpWN0vDHHDLH%0Wkrj*fi#qM$=6(A^ZCkI{9wJp1!(Egj)*B@?vWkW|nn3G%LQ`{g+Qbe_l1Wci2d75*HU ze%VWWYs8kld-}qO4Zfb|#U=Hg_^l6pX3ye6N;moXem8au)Kap}PM+df$==E1dd#LX z+@3mMnu(j1iUqNx1!jb}Fpmm}1{ahyXQzNBxG2G$H_eL^nM_xZr&@IxbR~URBEu|E zR2e8K_x&TVz$z%Z6#kpL>K zdR{JL5lEFA{54o>EoV{7^got3tnyyGq$Ao7V)wZds^oo4BEtGUt&%Od6JI}Whl}>5 zB3NuHH%vS2h{2K#*k+>pe>4Gb?{5TTZT^NHv}mOzTAk|CGe9icR(YCoPpw@{wOI|> zO$j6EG?^qZXX9wkv3x#EWMrtvKz;Oy-t zOA1IQg0}y5?#>rasbGyH=Xjoc-`dQt(=T-J>J-uHaIW)1v@I3Zc1`NpqMSbEX-T-Z z!UCw(`j}2VsS`Zj1+WE{lh7UD?|Y3Cr1lM)w%}|8yxA#Og5v#M$**pv|!4M-u=u)J%ZNA`2*Ga#(x=Znq-TnQl=Sq7JU5 z-IXFFPKeY%0qKDGfl;Wr1#?u0>J)cIL|7QE(9l8w-$pyzvr%^wRj&xA7&_7LM2PP0 z@i&6hUh%m0z1z~bdG}pT-rFhw1hE@=R9rgn1(zeBBj;*2<3fIT!N!NrA5z$9cg!o7Gpp>J#stkT=&)8X%aK5t*#4A9#L?j!#Xb1cB#$`+pO4|>;mKJT*_ zE}ozI4pdz^;2RRuL_%EousWew0;+gMWcusp#k+xzZ!751QrK4{h#?izu)wD8xPzYU z(sdrk!9%$;3vd^@LJM9=8mO*7q7vpxz&=OV<3%hK;-R>n+kF4jlQ4-ZZg zvnsUS?0b$#Xodhr3^1y>auEemlS>m(_^A0&^?B5xAQHhfm+wCS6*Dub6+&QfO|S|? z7Y(m4QX|8-tBISK1pyDnu+G0CQGv`GvOpmj?>Va0k|-u3l)*ai*?PDLB2PlxfO!B4 zazxHKwbrVsI^0Ad83c3hphKLPKulFNj?sYT*J)ncDBXDs=Lb8YxFKt2M)vEW;PuI; zx!0ledRYx;Mivrw4(86KP_M5|-`Vr;x5P_dV>2mc4$1WNC3j)w+YqU2y3WUHJIL3*Vl=Z456j z=;e*v5Fa?hbM}2{=SL?!uaSCPpTDkn!xKDzzA4915G^te7ho}sD^#ieri=&xCG&-$_On!&vq*AuH@Ev?v}Cmt5^|^xGzZ?)=O9p_ zBDa#TaZvz9X+82RH4@BbEU>mO$7Nrx7a?Faly$Rrk0`Ic0HG>ZLlOxK=RrPQzplL^ z4GV;Z3dBNQleuftM|-VC4WKPd9L1O(NGeq69)=~?sC0a5weC=~?r5H&rO_WxIfq(r z;6a%5FOsz+Ie@N?tfR0Dn98t=KZ>TrqJcoDj5pFP^(NM5Ku{=M3vL?q0s}=w$@SSW zQRx2ItitDwVz7~tmjDcRm7hlnq zCOv&?ZXzXIUi9Z%!-QxCp-&A02Y>!OU@0AxlC4<{|SgIG?-E-1N3 zg&xJNYLf>_7$HPqi^FM_xcJ6+kN9KdTaZgNptb^haBC!ae3pr$1)wymBEo3~vgCe8 zizzLZs%lw5zbYb=EJXo}QB~6=F3SO>1RmCOKm`%RCu)_l7Tv(kl`-2#IAek}9C^IQ=d;peJKfW~AG63gPst1Oe_D2cSC7$1~IqS&2yL8FfF+ zW{4+HVNJITAh}L|w4^FCzkByr6pBlo@T@HYMl^z4dr5?c)O1(-?C1P6x+9c zaKaP_*8pm8hf`%dlgswB(_!briv?>^ZI&pvk9E$3o&D}6!b%YqgFu%Ysy8Mnw&Ue| zPpaYL?pevk{O!VsyMVPVLk~9jWYEBx5*65BTY8)g;IZ;1Y zAFOE^mSj~cgSp)hfK&;~KpSIKX{iW4GT$=aGsrCPJ>xCJQe@u@B&wOJ1LNQ&NDfu8DOO!27tQ8iT& z<3T<^k^}sqj}H`BK)O;ds#JALL1?iap`aebfCdy`D!5psk5x-s89S_y749&qUB}bt zh1jK24O|#kooI~A+o5BH{Ta`-C(vkT%XsZ;Xp?khkIs?7ZI^70gU*wb7;C$0+zZF& z2sKt%yeQI=`@43uf1-Bff~yy%iXwZ;>!k4AT`?DRS%~vW4SLC+F}wqnGl{N%BGqSk z!IF4`%xv~gchDPmlZ1F-k@v6bH~g8e*zO4gpXa%K@>wPGSH8?Q#~p6__Q>rl)$O|4 z>)2WCFn`4C#Sc0F;tub>rs_Z*pgBTC0ANcn;Jml&l0A8#BZlEuQ@aLIvnuu4V6AISfQZ1YhG6t-PN{9vVx)+TPL>zUsig1eA-P|*c0#iz&6zV)0d^pi-_zW z`iMM)VYD?!Z-PwiXZX{*7%?rln!c+SySLJ6CAL;yo`rJTMGZr{{AX zs-?-wHZ2ksG3d#rg}JRcMGH$Ro1i4ARxfRqC~8rXh`|zYz&sgIV&G6*)pTrxYqa_2 zoEF7KL5zOe5!tyrjI660C(sOu5Ags_NKg=O(;MPc^E}u(qSJXHz`GGR$2SI9A5u$2 z1Ljw|jGj5S9RZSuCVg;>UV7zPPZKzub2B&zL;VH>`XISz;VnQFY_?yNARStG60PeK$YuZcE^;h8h<8@O7{UkWCA}JU_GUG^^m$0Q_KI_?P`qyy3?N>FrW-~hc#p6Xu$(82S_ zJaU|kQ}wL+8E;3;-K0~iOy-&lL3`YzH(4_f&0Ib>CBuk23dDv6) zihfa zG~oD`!};V$OnexsD@ZTK0REe^yU-cFfXq{uFr*Wc!sBCP*CZq2m< z?UOaqmeY!*mxmo@@E#wNac?1#d5inGZs=97jE5UqvGjEYd6#UNH4*9sw=I-;QrAa! zX)TPsw2RjArQQ+>A%ya)#SnNXC&SV*#z`0uJP109R5~kw_v5@KjM!P$HCRj0BdS58Uh&VbJGz;>)V$;_WdB6}e=+p<`Y&_L>RFO2Dnp}Im z?F`S@moNqZtYLq1ao1dQ@X0iM$*EiG1il7*_J*ieh-9mUt_Ay=G7}%V(E->tMC~1Y zi(5$}q_k%9b;KfKW3OgzgQ%N(Grw2~3=UJ;nGL$&(^{?f_WfmhmYX{5xY08wQ7~5b zZr7+$fkP6I_z*PP@b)(V+;5P_FAOAJtIam3{B^Ulm&5rrI~B8TxDWFF;lB8?S)3K} z!Q~y4!ST#($bAA*fJLKQCoG!R`gt$P^BZ{a-UB;0fi?C%pZN;J?}mNkQ)}1I_;it_ z7kyoAFP@uqsO3wLT;&+%(X@D8Uz(A4eS^P$_SfSh#qGPHiH>?$)ZZCloYx$z7xIOGp|8Cy{5`A52fh>NI?*=eo0Ce?s-^hu+ogtEt zdIQe;mg>dz7#YOb#EIo$_vdH$AoeqyM@0Zsnd)xtaI;#l!9FhM^rZJ@-RDb`qU+Ip zx}uZp_6|^x!A)J^X-CR?09m)X_aTa2<%6iw73V??5!s>_Yp= zY)3FAmS*izDxZK<2Pgde#(YLUp@yE~+3lBN11-$4kXqd!iDdl8as0<|WF~P+O{uEh zTffxaA^*>K`x%eF)}ZX}6ZsT=sR+E0KM?;B$KUAx3^4+cu&RdognfjTs#MSOXfYxP zO%CTuHfxAXS2b=N;L&^vjEKzSGhNd=U7MG2vYg^+K*jx>;2W8aKVLcz1K;XJhT_8n zy#0Z*eB6A2`8+jl#SG~+@UYHbEL@y7g((8}DhqvgpJyhnB*V*Y7=|5|A->VoQE;7W z-S)h_wyzy|CdDm4yH0o!`rxG1ErE#rMSbie_wX+J?5Eg{_WgOUo?NXn%FLOb{bH!x z;O6_iG=S`MT4>}Mxh}p=i`}--elr5c+0(YOvnF|8?OzRkajeMUr%v}{vM{x1ysw&i zW!HU%KpR9BujCsn&(RCdO_RFKK$bKtwby8R4}GVtxR;w!__8(@x~l4|N+|Ns40=02 z(|fwCrn*+)^;gcz7VLy7!s7_bTU>)Nrhtkc|7Pt>2*qS}2$|lV2mI z2bE}7(ee)tkvc0zIy}D_Vi%^wjbXKtM)k!oA=}rs@66~-a zGWfq?y{*aYZT%46u+nVT^4LTf3CGJ3dt`dL#Xu>jZqvvnJvy6gyE)@R-(qMMWv zztToIinHFKF@~A73R0lBGmSjoZ5D9ZUV9F1%Wy!LoghL?0EJE*=Mm!+r+4TW)?Ifu zs!;4G;p`rT_nsvqz(fGuP^o{Rf3DS)9!F zB7zxWIKER*?|BUKKF7}U>XU*Z>gv{pT$Q3BCr#gi{NKa||2xM71imq*_wnJce{8aU zyvT39IAbWdBb>OI0{5HlWxfG8+Z(f%a)#nkI1BYc z1F=HxU?Aj-mD$^3Z&+|t;7WbvOy?N+Q{BFHYt3j0-TX93^@To;^MiU(24<&;wWoRy z&Sm^*aY_1vd-4%SQO;zce)cA>{!VVtoQYo^R=-=VoEHdovp)9I){Ibv$E zcH8=~OVea7+v+3GGh+s(A+ORme25Q`C(ib?Xgt-`FsK9}8ErhRS!aXb0UmfO7Wgclze11D z6KpDpcl5g|BgqWJp+KDk;&B8J><6Or@YX1>P)B40`q_Wi^K3N4=(Ocx`$}SjpY9<^ ztS0M>L_`Q|K|C21O!5#yfo8OHWd6l?Z@vSB-aDT4ET{vIj3eS;CgDA|O;`>?A)s_Z z@8||65Mu409F9qnVi%uh9!DlxIz0{Jf%Ft}{l!3#EI*&$pA?@t z)CNzU;VEeOdE6HR0AcKMidqf?_qn)i*%C(qsa+vCzU`LRmH_{*eX=j2+wt-GzcrKY zXMXn{H+Xly-S17K?~fazce~@pufK%9@Av)k^Y708!#4d1s{4=6yC30xynbP@#nrGc zAlLuj9e+3mw$c9Ov9vgUbIQl#{&II4J`B_^ztTIiYQFNtX@g}fj>G*eevX;MZOPRn z5PcCYl9cU4*M0sl(B`|i9^bY5T0~PsM|Y}|C-|%QVB}=hAp%cII&`8!h^%4!5Y}Tg zQI`ji$xzm5I`nGf38i8YJY%7h6+)7afOwqf(=lW!ndFGgO_z2T`@c{L9?D})0%R5C z(yLFcLfOf;4s(eUcm$L2Gvdc1;)rBYBp&sAf3N4W`)pO!sb(A!;)u5cJIPZMd{)fT+Vf1cAix0;bnX_hnp~cMYc=(?; z9QMN^w%5HcZ^WhLat}+|4&3lPaJZ)7SJ3cx$CeXpd|WZK zXf9to&Uz><&;4bRE*U+H12PxBN6WVD{dF92w{6+*n`GVi6I)=MrHyp^MaN!+NbF#{ z%_nOePVlA)7MAz}(sGfzU8cg6*?|l4n;ThvIGAELNfn|H z!26m)5ix*uTXLt*K?1!;%rD2PN&XOsXge~4>W%>fKu}PR?x*ndEi~_oxvAY04^7?C4}0z@+=`+iU9`toCl6K^b>$(WKLEjyCLAPO%Yn|5EYmlE0|L}XJV*ioM4x`qk$Eo9-C~y zrIDB!^eo`rhmCHVBrVh2V;1AZHU4C4`}l00erY%Ym^^^5mTBEU8Qg-j7*gi_$}f(D zKHcR@FM_0A+3Y@gkq~wpYS=x~)Q^1C;I0|ei$Aqo;<$x6=BTKL1!lWxIk{#-turD* z(Q&+^-*GxvO7PU#z##!BA{@cVIK>iAMe6Z5qj5fgGox|>Gs&mm0+MRyeTZ32SFB#- znrLKGUDf4bE#0!^gWUT=k{a;fD&~|Y&FpdjB*Ux z8_aAyxKFJKW#~%Gb}q~W%V=^J0jmW#?mFrEWcuryOkyI#CVjV!Hlqw9F*I{apc5X( zGm)%I1ECNBdbv!jNbYTL;%0WPOpsa1<+SiYqc&ctunN*1feR%ua;!y|c5WlRW_e^u zpv^MQ^%rr{RkiICj2aTUVYuF@OooDx1GfvoNplM6{N%n|!-lnIO!)H+lf3kwgezT)ZC18;LW$1>ms`Y}l zv9y*ihbysM(i>>i3}d?h$llzLG2eSWCyeI>ZyqTve2=l1v`p}=ug6>Tb-fG7qFi(L zFMJFQf23j6G`}7VYUiN8ndT!dJUMrHA~<^+Xw`i5o8iMF8!@Y zfJgqKq)kFV03!+$6Ab^bqsGm9^vv2Q^SAKL=;4hu>~rboyXMP|JNK&G=<*-4VcGB2&7u~$9LReOEnmXZJ0KllE#bsNLPw=|8 z-#wUHQ2lzkcr{+W1HwL-A9v_#fAKdU+MF|#;>#<;B7yFh)o@89(WNqhxWtS7uX z`9423BoDxyk@FxsP^i84VFP&^j96dWKQBDubzj{d{^sd!)~N5EFHdp1|NXef7j=J{ z>nr+<8s{1<|DEHX-}t8!)~0YxUf@HEea5|M7s>h)LYe?{mHl2kG<{(he>m#HrM_|m z_Dv`8XxUw#+PrW7C69T&^+BQe;=8P^d2@laNkh9KYxnfTxyIfdR=ahPuj5Rq-uwPW z2G)xiUIB*Sd}mFNe*fxDZvz7}6nC*Iy z?`+ouNp14bI$PrETapSzWM-lZL7nBYuzQmlSEZ`hPc+Flv57YWKn|F$oUS8+hLJJr}7?~P~UR6m78g)&{Rg<%{1!B|B~qPk0`z!2kzjK`11Q}v{(frb*TIIPrlww~(f zj%pRM$1tW>s8zM>Up;i27uQE?9Ih>KOvg{BEC_f=FtGPfuaoMN+q*ps&FV@!Tl{Ql zaw?+tp62fV9mgK#9RTgP^2c0&hC2+t{yXE|^{cxJ(H>weOT@@pAk2gYRFK$6{AO+hk~6f5v)Q;^ktX zlsO**f)*k1{lKWbwDlY2$z8xYuPZ= zzD1I?gjFWWfQw}Osc&odd?S*a8qaH0zKFwX*e%bDAu~$vPIq4`o2wtKzjDeXuHYPI zLFPpri`iS;)2`ekds4YOXD2}!xK9LKxb50*Oo1XG?_yk!Bbd_BETOoRa&*p*8m$J=mY~iK@*sh@>GmvIRnwNL~WbGDMW?`sGv*OReP10 zXhm~$je2Erg!Pm_L-W+qtcIh;+p!tMic2!PW^MF%(;{MfwCe7joYcV#(=WS9T3psC zus6I#I1h;j7>u`Qp=hOmCQht}oj^p}?d&-Gf)5ZtIi8Io$RL96d_GwIA2%TAMh&Y0X)|I770Ht<*&B9`g2|_?o)`!Ky>|7PZ1uqK@ zw=xGn6sYV_5Q?_6+AP^qgK>(8UZ@S4a3RFgiFM|M-?_o4WLL&Bxpp#bt)(ti$@i)zI~bcaJ)@9j)b3+l(d|nzSk0=Jkv9dDZtYQWiDQlO?+C zH@N&-4(8sVOX)?T3Ai}P;T>357~4G9>}!I<;RcDvFkkD4o#53xtDqDcr^Qj9Y?A&+g6OwXH`AXGOnE>%U;HWMUgnjOf%-uN03JZ9+gpbcKv;R3`|Dy z01n2FgBkG@s;!CUNgThN^9^PPbtH}-dC0myk!1E%|70RaMx=;yz+pUq6I7&HDP=>d z3jT`zrG7^z`7@4_=;V<}@+^=@o`~o^ha2WFQK*DNkvM?SdZ7?#;tY5#L#O?jF%CIX z%3IOc_PuP{9SnIL_MoPgDON;H@VtLfa@fDeGS+8!b5^tO9BGpGg!=Vbb}|TVANu-} zWbna({Cxc#>vam}7q`9zglM)60mOYpuy-Q9oP2M*x0uV3_O!$85(7PG2?v~j9)Ei+QXR)hz-0%3^@BiBz z|Mo-u+hf2}^@yn@#s0#0LjUVk0aL}Syx7$N~+RU)O34UrEZgCI|^ zI7V$%H5=JYNjeOK;~=UtI$I|IgbL_lmrIzUrL)ja)Pdxp#~J{_(90kvLNA(R0Zc_8 zLLlPE6i>UWlmZW9E%rVlAiDyrKoBRZz*Q2Dg%XirwdIuR*)BICLatRCq!7>UQg?U3 z27yWyO9@Kic>;|m^h^DB_h~eqBjP8EZ*&XAsBC1Ux`G7ySL^TUUkxIEMn0I2j5jic zmX63D8Ob9dk|&&LIj`oge7wcuCx3#i`ujwsC}lNI^@&m!sxmU(gzBn7TT(!9sA=gj z{^8N9ruPOhv20NfIqqQ0_ZN9t0Hr|~f7^=t=xqEBUBwzpU!AgouAj1)oks8(Rpd5S zKYhp3cHia#Nf)u{AL0A`_k3k0`M#eQ0b&N~YIBCYf z#u=|$x&&BuEIZd zGe4Bzn9plqxADMA4Z=&M!z(kH1ZeQJ1cEx*&H!%m1Pt^;3MJ4|oQ+a1GE!qSW97+M zu7A}yMx;IvIAINTYo_=JI_F>Lr>tC@vl{BD*&;G6YTC1 zwK%SU4j{PDfh*r}U{eAa@!;c7uCP{sZ8$iIqD&Q%bW1}C+-7A-PqqE&=ZYVY>=!K| z-!+6dL8>L48o}~_hzL@HZ*ZyIMVKvSq4F53l5)rybQQBUiDMMC&YoAJM60_hn;CIb zWJYLu1VJLl{R$oG79t@))#?*^rp_>a4!K-YGZe$3U*mZt7o?XMc00`nMPd{Jy!=TM zGFfZQ>X(JGDfb1f$>QhV#69h`{-zN$J`ZpI{Axd#phSOMd0*v*UXCxU!zCo`p9}07 z#Ag_q-23kD_9abh=i}Wk*J^hDr6Xw&%c$gSmE4h1Y0)!RdNDA3ihZVcpzdaqXx9p= z>D#58I^VE{)fU*lzp^av<71a2FcHVTK>XP^ew`I@VCJ#1ayZ zWFwywv$I&QC@YIcS_)(8Z@>7xhCA-tb2G?vpfEWo3wMXEvtp@Oc)@KBhDXPn9G#Yi zVmo>Zv(dW5_eylIt(4YLops?h5e6s(pbrX_(~@NFLFz&QSOG&1wY~3RvuB3!J4<~9 zdc^+j9E8h6BY;(~U^Up9I{IWB(vZ_`q;r2fA~!S-fJu{Q=`qQi)t{P z(^5E;@i{XE3|Q1ZdV8DH5*oWT54b~&y&?wp3w}hD6rRHP;^-t`y(g@Q(e1=gc#vXt z_sbF0YCH&`bDM!Zq}p~cK@oc^<3!hYL1jr`lG)~wTL=FDJwU?07K(pu&U`otce6q} z&m_gXTXHR#+OsU^Fm4}0sN=E~A*qCC>ydcyp|QnMkRvocG9obr(5zIT0X}s?3Lcr6 zp|g6b+*G4orMDq9&qAK&L5Cj5 z1Mqt12Z4zs#wlVX{%lDDojk}`?3i)}+?qAR0A;%C_ds`MgGbOB(hKyA?LO(d4KSSS zIerPLaeoL{UUs+|8%3Q(7dH z-K=%eAJ2AsXYjrr-db`jnTx)2O_1gL-RaZh%DX+Ls38sBtezB!~0fzn|l>gnc^L7A$ z6R6Ny00f62b#a8hyUTZ-JjVGt*5LVW;Fxmaj`((P4G{4&&KxEU_s2aBnZD9z~6!0WJ>zrhU|CQlT&@et=2i|P#-aI zVCOJnD112_v2eCi|~k`j@TL7Y$=$w+2~uux;T zq)>v1^kY6tzxqk*y=8=I?Y2bgUHzoqStn!(FITp%#{1O5t*UZu2a<{-3G^xA)cG#G zw~ok69!I=I{0K&{P>gm@VRbt{AFcW1jNff`ru{(x>|g@&$8PESo&Z)t>c8Q3BBDtVz7eo z3vLfBp-8?gNSqYO%M!MWvfhpc_um(3hJ|j2)8i116U7!>9xnF-Y$1Yj_Q0~wQGGr5 zei!p-?X|Hm87V#46D=8BH2bUo=WtwEqh2Umn}oE6qLw`5KGo(N_u9_o#{-MkPp}5j z3aFB1cSsoWjRY<1VKsohc)H()i#vU}bFB&`(qf(#m99CjmKR2Z9P>HGcMj8RJtns6 zPlJy-K7=(t@%IIq{RJSzSO)NtG!UQ&SL1gjyox>c5i*3@%rXVwN+ zxi4=D4JZbAgk5?Sagult2Y9+O-2%kn2~dW2CZE@fxt2Gpau&K;MA72ukvI-LPSm`u zMVu4_q$gE2BIs%oe&odPRgF=<4EaBEb$(;n|G#+X=JEd1X|o)@e12R0b$9sp2>_=4 zz|3-p0TmV9#Mw+KMK;6w#vukn>T^bpf(+2A5)Eh~8$z>N75ywd5(k(FjTq=b;Z%43 z;yDVW2fKj+pEj1FynmdmCJyDH^e37M(yc)El^}GWXDK60_jDNyqi!aERao+(2qyU; zj@hELpc_y7C}@DE<2W%zTG}}_IHd?>pn~eib5$B;4^0}F4dRFpx;#yhO~@rLvDO$A zg0WU~N+-^-{z!!r7lrUQVD2@Spa=#H@haG0hkDIlhb1M+0!Ch0C-g; zvoNcWGg^9`$MK)NgZsU6^>`r&Lio(w$0q4EaY^3D!vF(vN2BvoE znG{v^Uj28!pDYCq)!9|m&$Ft#*}dS}L_$0pHE-?&M25tp0s^I`N*#qG<3I%SE#nA1 z#g5@MoRrHCHY(O?ASuuXXi+(jx@HyXM4!X+(m`=yw`)*9azO;bLZ0^_w|;)eUY}?@ zgtjcsHG_a&yqf)$#`5{?8x8Qvb*V3%s7c82I=y`lHTODFH5r04{0Yy)%Q^Yn<_~u< zziA#**!JklX{*@8D?<4-e|a6T^Y3Q>tuiCnuIxO;%LQ-o?0+~m9C?qD{y9>7Kl#J5 zgI74>^JVX`MB6+c+WZal_VGG@@}zf+^?!lYrxn-#4nX{G9(dU+yhb^7wU`a!-$E2us?VZ=Q`)ISeldGHQ7qML<;tDCsECU zL}lPFFfxGt)pd4R+ES~KJ;~(QwXvAg8X&ec$57Np`g7Z!?BFX4tL}maupLIfU=t1Vs z#1q|JsSM%0&l6{@ykoGt`UzCkTh;$nr}Q+$TqTi_&h0cZ)!k>QBZ%YR8{&u{56Fyd zD#_@?P+0&;@2$VPA9Wsl3-FEk%c3Q?5)vnz0K~xM41UmHxdlo$?sgk6FESU)2YA_@ z1|}A;p8baT>I${$^Pty6SU$qgf9T=fkAB@s`lf-URmd^{Vj?rZ{?Ay(DEe&!;C}JN zQ+fGh|DrJ@UM&3IA4U&-;!?ev(BmcxbD83wXYZ^5QeEm<{VlC~6?gd%%f1^b?h@+S z8Wwu|h2dl)EmoU-xc|3M-nbh;#kT#?eg$+AuJQQ@zCz|}@QnA-=9Nqex?OcwD4vP$ za`XVeFqkfyGR5)T8Ak?qAPz=0`pOvl9LwY=;~9liaG8dMGEQwZx$P#;*S^42SGP=# z@9B=&gOfrqON*^%f8;i~V%ep8yC5J$OD9=~KquDn>=bUo^r3{YKJ=8U8IL~EPOg1A zU^F3|Xq5aA(=D5nqYf4q1nMcJo-{8B7R%e@TA&svI^!oBnd!(*Rm}=Rt4bctvl=yGtGpKN z6)9=!7ZDhz+*^6ZJj=i<0)!4B5WPgIj3v)(_w?^x${7B(6=(TWL)MlIOj1If;*@Z* zpvTHk7h6a3R1^~ojpbn8*zsxYwIum;6jq#k2MmXGi485!VII~phsIxWo7W8G4g=OK zO`i_MN7IYfOx_;>pCY#39QUo|Ypd?QmfmK-V&_ZRbG}PZfXzVOexZ-RjnRcXYB@L^aN? zD9ZIZo>gM7pL|dtv)Ck`0kJD^LSm=#!J`mOMjUY@Cj-df14R~sQgO6A8VDS4VJrZ% zr8Ou~4>H*gI(8%pO%{=C=Xd0&>ZD=GfNB8R(x@>AQag#Fhln_%5dilN-CG&}goqAB z_DrRbNLuEL*ALIG1T8M>;GtH=gt&mkWi$+Vd5cvo zQ;<6Z3BV;6#<&_(keK9dyn-o3zyaZh~Ry9WZ*CyzFgD0~dTl+`2+*&z2SfCT-(=(x2SyZ8I)b``!5V zuSSI^&X`<=3vQ9yH3&YyO`~TurovpXSL2PCBs3fUCQeG1xY9hPUQEV)!$E@MLd8n6 zbS7D!_-MNku^wcAeq0MH=PgWfAQ!JH(CN)bD7YR1(K?{idS!u*uE5!*nT#4k1rTE5 zIF7gD0Z$(%O@xg@J8sIrsSag!2nbk*Nls;YUxxA#2UR@ap!(y8Bj5gd#CZmpN(Awi z@z*2!+0ovPksS%5c~Yk&;ZZZv2&c-f!R9Hr-l$j0N4G5$4r433A+%Jj=Tpz}Taupr ztR6nKVbxPQyj;tYzG{pb9oc80+XBH+ItvAeiX)JW4CW4`U<#3#n9Q;2F7TGL2oZjS z!Y(;_?`{b)6b>kk0NHJ`BdOdUk~_li?UuLo_X2ll+Ot>j!DF7QX++x{7AN_-i*wbx zPusd|4x@9s#K6lwKGp(<$rV=p*jEECiWAoG|3JX>+#kvk_A2KD3*X}gh_7yW?Tg71 z#NvQlOZ2)|to9GDW62{BZgy;McG~ez$M!i_pL_r#_A`E4gKb#pd1*b!7+X<&L)j^TiW|7U5?{ z=4|uqRcKL}=DSN-;kw|5pC-p%^I00qP}fo2Pc&T9j1VdmhoG9q3XP(dg(yvb4!g}vr@$XbN#3XI+%`K$$B7x)tBc+H zAyC2S*vyV@l94D8PQ)Dt9|T9u;C0e}WqVV;@MShMRG#Hu0$0$bfy@pr z^@x~PUx7=v)(+p^up0=Z+p+!D#hN1E;5!env|og4y?O4Qh}I)V>6rz zp_4F|*Dp)dnZth>F>pl>3=yyj=)#4zvt(grBfGJ18pEt-YpP)3j)IbkKzQ`D3%O7@+PSxkkGv zBxzQ(*l1{~MGZ+!16WNpFUXSOT=ugL0BJHaP`+?NQg_Aq78}JZsGSE+PC|ObGthYbwE-2LDXP(LbK?&GBLP{iCnEZYTepgI|*yKA!Wz zguS~KoN}BKZrT_p2&rmphM5EI$rB|-6QLmT$*NWHRq{GwUS5QF2$J5PMUs3R$vj#e zc$T6wfhTy903x33h#(F#RYfUS)I00J_!&NPQQfJb z4OdL!&08cH2l(*v57O+(WFv~v>U5eKA?aBYU`(~;a8x*LP=Kg)y#U#WWUT`UfW;ZH~@VrqZ z+q$uK{tHC$8@B?Umdky4#8FG)W2ssLKuSOqP((4n&L){hi$n=2fAns)K-B7)7kgIR-A}Py;D$Eu#*FcV7#+8zfu7(?Fk7yw~sUl|d&7 zE5m6eW`dK6IO$Fg5Xy<P!RAhc3=NQYFudvpii6DCTPmgH_IlRuCAk#QVHcO&aOs?PH*;BxZ; zWj3hyc94l=21CNxcmjf+)yeq5IFb)UiNAPu;OE=p?eXL1+s|LsGgnfX`6G|_=XsQ} zc$^s^sy)rC%rNb=etGL%@6{{6O3i~Aqv2NSv+Fs(P=da0HK*-urn{r|L)Whl`g+0397Irr zKH6L8|Dc+6s*^ex&8`4|2jTz^=rH|w+#iRO{sDEm@0g!)=WRq{a8HNr>~Pv1O9`}y z%2zN!?@&59(s}Cuc zYWY33xLf$|Sv$WuzO#Sg*7qB$eZd+&z4t%A;~&{|pH5py`XAos>tlyuKHu^8?fLRs zfBw`j4fqCA`0W_D&&q!Y75snv;EhpuKko1QHyz6rMf;ab|Cd#3F~R<%ssE;f@p|lN z@erD>*?(=a__PXmz$ZvVqnz04^fEW><8TR9;2qsiN+(VLDZX{W#V_bAv$J@n_2mX{ z>K0EU2M&O9M`tMMR9|f-!QLTG0E5SnaWh()P@Jle`tf*V#1ES8CTVD8t!|w~Br`LQ z;FE=Fb+>f3t3dRDdIZf%jKC48JUfI8gc(?(`Um6jIJyEAN8k}hRsD^6_ETc%?CuoQ zd>)3_bp(Dy{7Agz`CjL#^Ii2zL`Qf3px*3ib!11XQ=sr8kN{BHYs*}lJV+kZ2aC_GjjbsNmNcDn65d@RX(e}Y+4zktFA zzvk7j&rUo)Mz?P>^wSMLeBH*jZK|DIxB^SdMQ~F1zq?tix3gyBvQoGM-g2@jir=nj z{IphRW&Ov(!yAia0XLa}$(9Y_d< z<%KGSHT3Ky#r9EWd2dsw!w=4AN?>*XOq{&}0D~Z^8ODXRcXlUlSks|HXt67t1+q9^ z6)eKUSB^p_9E^LemJ>MC&0~?fFt|4OD<&wBNb7qvI?3Wm!^G}rd!1n^3I>~u6Kd+D z7!%9%%WpG|&T3etIzl1U$vU0d4gR26j2(ysLTNC-qc_!%KRll((rAWC3oOP7qN5MQ z59I^-7(GBqGloUfS~E!;m4}?@Ag~ImY?5zvkfid7{2TrBW*l@3@`PN_HPXm~V!268 zG^2W)5vsFsT5to9>b-QHojf-6C)@k%YZ*zuYw{3(Fwe~Mtg~Bj24jWj%v)FD;F8n5 zi5`s#GgnsABDc1OdX4P$NC10H~X54MR(+0L#opOlj;zT2n~D-v=$Y~ z!%a{Shct7F%!83Jn9L!e(1}<`61w1$jonAmNSO*(mE0QsxG0X(UvP)v} z%cF^+(sRg5fi}w@F)iNJgQhq426Beb85x1p;EaJK_AQ{g3|u(`FZ=i^vTgL3i=t(K*{cc) zW5BvKRF-$JA&hP;c^mm9sMQ%-vu)Fad-=l#Zd@hB=*L()B?Wgi*~Kg6+_DEZo)L8$ ziUJ0^oRwuzQLnSa5E2|Y2Sw0fxji{nkaVWiN?s%`8RRsCv=o_*)UJp|0b<)~0Et4U z7p)lhMolnA%V%ZYVBgiu+kv-i2)H`;jO`|4a;nH#?}))Z3d=5hB~HHBSUXOLVaHno z+;rdF>0bPt;sK0BB|xif?jyp)5bbOYZsPXpvN>N%57Awl^QMC8d2`DajIme)tIRK! z`)mS(O{R$l&;%I6$D?!C98zSX7HU5`Qy_p|La}Hu*<)*(6T0}?lMLlr7GsR|HApm1 z!YTWzZ9NA%DI=8!JsJlb>?!FTF=lzYHgS+gPN)e6ab2dXq~ox&Ilk9X9!XenGjeZ9Kr!U5J9$hcK(Zx(7ri( z{C6JvYOD7)bL!=ee{y_-o4@47eE8cu$mH98%*gq0S>1Rt_n%*0`a58ElEz-!%=3Sa zvj6}f07*naRF%Z=FCF)2lY8?wk%O;-70Xq@wmiLR;5$zGz0IF5_2Ey;vsiQUeklQ; zTI(DLU47#Jjiba^3&bRPoAPx@Ecz=X%>jN|H3R2URox-x#OxvQR9E*?ee!aHhb_38 z$Uul$6a(sBtVT)JW{b(c9SCd!|BdSIvb+@~wPv#ey1|prIB>)f%p;?o?|7;Lq>W4w zU?~X_9og9Hr&T zDO7f&mXg#AhF+8dAGHRCBdNLe1#M?((Ab&49;N#o=5ixLqvm`OgkRR`E8XYIwfctU z?XTPixrL{6|Em^H`E`)b=8Q>_bJ)XMGSAJm_S>vuO7enz4e4IGI$<5rM#n-5hL>ub zh6tp=n#GiYV2Vq7QB${M=(&TDD~~uxbf<04nBhIxPPB`@hhK)|xI{0*K#sr#u0S;W&B zy(_obK1h>2IoGBEgJ8)uxV*mz=%j+mKu<-W^(Kt{dZxhAAv4UjdVv8D+utN1chq1F z1^YW{`o+x$ zWWUAZjrt46gVy`z8InX46`XkBOaoWvOM%@LHeS(WY>Ct#?H}1Y3=^EKwq$I0tr}ndUlW034fxSy!g5ns?&) zfeES%!Bg9vi@6dUZy$2VwMKn440eoqau&R5U~T&nRgnvw!kEq^w=`R5L92`VY=*fT zL%O7*ofkSNu<(2YF?O?!MWY0>#V!Yp4JPfh014zyY`10N4ZCd_j!9AM(Jx&zAnS|$ zKg_-DmgGo|BMOl6$n2i?f79Dtnc+s@{vb_~M?_{-_3q59PM_*Xce!LT*#`-NpvA5G zGd&=}G<2~%8k~$VH^&=c$eCoKi{%-;*_AIej57ChXfu(MhSNRWf$=kk2s8Ii)Xt7M z#T%R^K^e^(a#E*e{>_i}<*jeac<-qV{Li;{uf7e(Fm`!_v1upKQymxBK$T(Ux%1r} zlCctALiYoKwdEjSNBBsRnP8IDASLTSCETi9foz^I|FDWUNJbUPT#P(| zN8~{#@L!q5_)&gW{cAk|e1ChyE?>|JS!fx|Kyk_{_M1Hz8693m3KoAzTJ>Q5Bl1ZU zOT^Rdm#g3ekBEq*i^gMSTvOD&T&|K(s;BjY4p%asncsuXbYz$5E|e(*PuUfQyZlkK z3MXTY#S{yA-_vR%r7V&-0*^}+aXW@Sb0FOGq7P2lb>v25hBY9cd(ho0?UX=Fs-ZVt zdd}AQulDe}`IgsQYwQ1Z%@`L1z{Zy`k9RrD7huQh9Bku^+lM?)`^ah9*V!(_7vy1TTr-)022m>o4SaiH7jlJCW!zb~7$=>*UBi|T9_rqh3e*FBUZ-0B` zKmFAJ~yV{9>4Fp z^HQJisr|?6=bx|i`cY5(>+kdb&fw55et7%A>ql*s?gAOVdyp?7r}@#XO&6T^>xTkN%Im3Goy$(!P&m!v!F)UzuvR_I zr3p(yt6&_N0Y1qbuAWtrp3ivxgU3JeAK&80z|+qvCvboV<69m(WjR!Q`uT3!av;J- z#CPQPjPLoNkPux!C7dx8u%5zGHgIHQM({u$N-~fRAW0^@sI_o_P}eVUMgS`7xt3)V zS!t^dOH&Kya4c(CHs0(xBXEw&;B5g;C-AvU$F#F3fuU z8Zf%87jwdCKxX|mZo*U zcC?Hh8hp5S_lc0U!3?TZ1%L{?RUR2le2$l3>J-px7qXKka=)RC0!F)m(V*mj-JL2= z4XI;Dj=o1tPHDuTfg;v{L+)(5;+Z1aC~dU(oVUAOCzrA>#&$fZhG(I?h3W|;xuzMX zyG75ED;nWw(75nIdTl0z*`N-HnyO}2g5DW^xA_%5iDI0bV-xQN&Wu~5%%^yuBV|`= zpeU0IhVU?(lr18B#Q5<+lD%ZIkP6tSpeLEyo$S)Q4Ia+k0%#;0_F)KG$$nWx`{{7{ zP`fU&SDLogSl=XgH2LUtheoKez{v9)Nw>GqUun{TyF7K zM+k9*2_URDj#W&vG0i?LbN+jjzFR3T~0D0jyBL|8eZ zQ(y;;b^yxk1d0fEnYdmphhFz3oA>PBo11s_{_kzr7d!ZM*W1YK%hkTT$jhd9UT-kX z+3K!ye&vf_Hy+;52hRLdV*TxL-DPm2-id}(-(cY80ToD%o0Nb()LFR&wty&rWm1R^ z*U$zH*(qy*A!PxJ>xY`298g3c4(1`06f1;9zVQ(XcNojnBeXx){}EF`0G zqNbJRWV7^E)+-bXMN`%RnZq?Luv%IbVTL+Md}3h~L#P4}6+{k%&VVCWH4T_wY#=N^&mKh#!w@sIr&1-}UcF&`iCz5Twz<{Iks|?w3-?|&{ zo>-Xa!T!xx3sUcbhg5o0Ff>z*%_mn7T-AG-4eC#30acbeA_bNomu+3}8B27@JIj z&bcFWpo-|w;*25mu2$PPl4Ux;XwjgKGV>x$j}b9m@pN@;VGVDiv;E!^<-L(3&cvKc zS7L7qBqBJG0J#$m&iH8Tj(S<1xMTPxZB_Jp?+rE3@s+8FIB4Dle0KwG@q?Kh*t~`b zb6nOQ?)RPyiFs=7^mGF@O0l4JFQ>{}aM3gtWKV%$Za^6m%@Lhl*3p(!Pt|kjxz+<_ znBkaCQbfFkk8~VUOl@y?2_ zH(w7Qhy4!Ocv@mE>S?@}vU%=7hN}rkZPiaC*PZH+LyW-FUBA=sat%Fe_9Yiwt_4*9 zU8av@#130^vPdm2>1Q>+%xiOc$j*bZRsVJ^=A&yWhBVaYJqu#^0L=;>R;i=wG=O2V z)gom)?Eu%*KT)$~UtOVVAHMH6*zeq~`>CgeGA@DG2r71k!>vWu(fBi*xy@PN3ej*Q zvbT%Bg4GJ#R1r^dP>cNeQB-BJ;$mI^efw@n>t{>vX956MeQZHh}!4@$~H@Ww|9CqgC88TFD`X^il(_; zPg-Z{@2fF+-&+3cvfBHmfk{op*6-)1pY(t06N0n-$lnIN}MXH6TS2G2;j~E*Pe-|;FSSITjp{0*wq7VKcOi>LC3>9 znTDP^?Vh4sV<~Z`(K#D2kx^3&HXH>vxha}v)NTVO=cZ8}j5TS|WE4!75gK+$`>iqQ zhTT!p8ji~xEv=E5&Pq-V!0K^6>m$p4t~$Ju$KkG|5Q5eu|AY!H7nXTEm&&W4pQ@*k zI1rK)i9`xIs;XZ_C;XBYp;(Ge5IGnJ`3MAdF(PP&H<;wEZ;WqbL@wb+IHJ?csAvRR z=3)p~ikOU}ru%7DN-`hOZeY=`GrIA)UoJ|wk#>{0@HY6nsrL(>q6haf1{)da#@wdr zjgS1@6DwKLb9ly}b1vZe~gEgg6In6IfbG(cT-kJSO{i23L-2+nDvUQFM zst8!c_=IfCsKX|5g(g|MU_)I9FhDpOYHu68Miiw?*UWVUh9c{!n$yrj!0peCyl((q zEk=V{H3%@|sslXSbZJ)0Ls_IN+-V4h^Dxcqr>id8URp-c0vGzd_uzwF9ytKmhMHm& zi40_%#k1s4G7K+Z#Ho+Tp=1-_a6tr@&9kb0ay_+{YUEbjzFqg>gpq-MscQD0tH+Pg zbngLd+$`UXUyXz0t^CMd)wVZ(+Eu-{O+*Iac2UWGvLo_1qDqnj$*T4-3ko|U+;AUM zproowVy_~itS3qA=yWSTgY}Pkj{fy8Al)r6?(_` zNG2cee1>%3$d#a@#K!}X$OrRa9!(i=46!v_C=MKL!R**PS#}v^NUOpTu(7Pe{DyW93YvHj5p>gLiGzEqw+pRmP78z-$xvge0gRk;_~}Wi6JSGLW)V(CtM7+Xr$1;l zvLjkC*-{v)UF#iPZ?i{E;YyDJ5S@p0GEnx*?Va(Oo z!o^T8i(9-EQ_Mqq=^Y6_aro2S54!@*u2&`da{U_!Fj#(=O4*a_iM`YF>jU1YJqpYjhiIBPau%XoK`Sto+^^x<6DN05MUvGimTRBwc34V5XTb!t@X!xuVqmE0Je{0 zyd7~Ep-3Hp2aw=Td%0_8*V7QVMhGa05UZs3T8exS7&6U+y$`oJ9{2%O2~w4x?WlW6 zDM{jbqRO@4AVZD>8gcFHT~y&+`gc8_Yc01{MjH)X<%q6Q)lcA^{%7X5G$eCsEuO5l z&YV4mS%4I+Y&n`JQeM`A7m!v(kB0{SL%4(jW>fIkEGNnsCmrV1BkdEy*rfqa>-KAe zZJ0Hmz)O9x!fo&}cwy4lbx2OKux4qWLaATgwDt%Hpdt`;5s-N}aDZ?doIq)D- z;JfN)t#|9eN5)a5B9P2r2U#_yiC4c3&rUj z8hAxT@A&fX*Oph~79R}D|69iidAAEX*ee0zx2W>R!yb7newvKu1iiMQjrsu}e{z2K z;okYWFMqijY&UKH^IY-n{l6ik^PICuogLoqWrsdCG`wX^e}NfHtL^~ShbIDt52rx} z7ke4vcF(SMYQDI=fX{E@97s6;BHS{{3^hUxw85{&vm81{rbjr|lYrNLoeC<3vR%t- zk*w{I?FSLS5klCZJm1$?a-fiNrr$fN|Jx46~T6o-w1Qfhn>5{4R7x6QBvD zEE;xeLv*yr^g5%C*aQfGo`TzDC=i3YW9_OJ2PS&A=KUEsIf8af{S`N&PAW(;$cK2q zh8JPRJAAZm=k$oql!(JlyCTe#JJ`F(I40}cMLxkpNRLQMK(H!ZfYG^_aqa)J)NHU5 zj4g;<*1|e)BzS<66=@f}I+q;sAp4;4FcY3f8*K@v3C240SmxwB90ZHCq4bH*1)Pd7 zZ7!mmbq;G=+0uu2;1EKnvVTVXbUka8@N~R`i^i~}d6>lpim;6r01;*&9*j32U?=S) zWmV0nG06u8t8H)WO4HnytxHeVAM3rO_v&2ykmQzn#lRxHxb@CD_R@*?al6*&mCD)-@wKZ-{NQY?>&J{kk@RU;33x zx{nVl`{#x4<%CJHeLdrDS>6Jb_e+iSx$}O1bGz%qnmnyg~QbeS36{&QQp(7It z%8Y_m9P~R8&^wihi06?6vl`V5VgW*CRuwWM-~*L>HV2GGiw%a4 zsMg^}v&CD>AW8NjAjHO7PCUX5D42g=*NSp|TdU<1FyK_;?tE#w3YM+h*u0I<hVe#S=FzNA$7LKZO+7XzVX6<)r(@fY1 zWWdT}5)lU@69gjj8CbTv zrhPl5w1Q+{WsjUKFdgwozeR8J5Emj5$vhATIkM3cOGjkJ5qxAec>snGv>!NvszAcY zjMiv|1(!)VP@)Ba$_|so@%_l}adaUAo6CAQb0fkJ;*H6OvY+xIxh2IC_!ekuisUy! zJc_xb79Fw69FvPoLv5J>A|E7!^%i_XSN}@@?W?rZV`0re+A(8y#GI_oBttJ6fzF27 zo5j$6p}y0Jhn>jL#u{eEksMxL8`ez?*wC%ITB@6d5Uu<_!~ZM)txn8$aPa*03K?AFq!8PjPbv%Ab1aeth1VFd8^Fo6B@7bo1t z7q9xdk+-mWvo(L^Ui&2;@Hg6Y#~D8W1otCuC+~su@r~@?UVFg!5??iSkT%~&9I)AC z7Y}zoOOVXlh^a3?r>iBu87t@bJa2tEJRi>dO*h_q`!^76V0cN_59jAic8(9%xy;-f zSX`%l{ux7sgy;Km)C9HWmN^&tY8vKbt4@5ujscH>Rb}xFE9ut-=xUz;XDXBk(Yu-{W|8d=7vidwDHOC&$o@ zsh!+y%P2^6D;?MFi6h#`ftyXhQC171IWA_jNt<-;ZMPvMKwSvvEsi6PgYhtPF^UA( zHd~9IQL>+0panl7gMNhn>v%}6<+sR!72=^>eB|-2TD6W0A~HbOnL3bSI$c^_y?fOU zuEPZUvsP#LHU~ApN5+xyfDe>}pSIv<)lr2?bgdD)toNm#!cQp>(FKoNzzl4>%&z5y zoe!RXtpb;|1UVNnof@0@=Aa=?3hHosF_*oMxpPL}l77CNo9BS;%IfIxa|#7uuY`Ak z*qx7jP1sw&_Y_XwURy(s+g&iqr!(|A9k`A8{>S9#KpGaSPXqV1{>T0Awx-V+{mIe( z+zT&kkK2ZR!T}#9brZ~YS+i!(-o<-whWC}{A+$t;otV7!muWvn@-&-s1!#+0bLTpA zqyYErNj|S|E~MTyS8|hoPoTCR2>_T)tKsF8ezB__n}gee}a5`lz4K_09l)#42;mq*{I61^Rh0F^vdOn`pI(I(d6 zraP#i3N&M!=WfWo@Wcsoo?D`4Nog}#VSM+op%0rQB^+Q-VIB;#Z1j6eo0t?(1TA6H z#|thLnZ41`9hHE9j4-fIT8fb4vF1>364O#`+|bm4F~FqNdvN!`p61Cu7S zx4G!?-wu?Ot=a)9x)>f|gcWoaWv7u=oorgaM5P~$geTfNRP6SFs`br92vMH+5;-}x z;yK9oW*mmu0hyAIh#}$4dmn_le5z>7;Z3#fE;E~D#Rr>VOvaI!nTRUV7-k@Z(9V@P z7+tggBFb?vGnzN%A>;Pif}r961eO~X9>BO0qWY;C)_Ne`BBIxmR=Y9og~)HY6#ggwqbgXbh=+Qev6!a7iD48)e4A^OdkTY=v0(k_@ zC`My{Esjx?O}b;ND;aN*y>gs&{4h3+w@w0RL^*bvzyWt969NI&hFNP;F*2NVM2)l+ zt#EAM4q>wML&#Ib} zF3U|u?h`Q4&$c*}97%2K1=JFAV5&3N^pXqWDSYX%dphXoa_4vvh$sA0u4SYjfFqairi?g( z8B`tz9cgeByc^ zXWR&36X=|qkJtJ=$QXM-@10<7|8m0lu=`3U3W@2B?bqGz`k?{zNqu5r@MU-S@jPxw zVs8yGYEL&m++Ua(zj?qfkIyjihhr~Ue~+h3pBVlB{&9cC^OL{+TYoaT{`-!;-D_Jv z;>-UtE%|RceiaP))XATO@Ah|>4ctNJ?y<8seE+}w)yLQEJ=L!t{%S~^U*FsM>1x+E zm#D@4b2x0Ve1*$j9^5a@-tqM9!p;he$;QGSC-$y_F@VG%O8qByBuS_zy&8?!__EF9 z@xU9Ap#XL8Kseh{=-ODWch~a;G2GQu_fdfbmt}f&2{Jex(N3>z$4E2t>XPv&fHx~6 zj?7>N;4ZZd1^9@39Px$!G2KTOUIC;5Ej>w5se zvma+`YVB9TyUl#-xLx0GHYQwQy}i7*chT=}TqB>e$J%hJKVJEzBeuEZ_9X#y8Be#R zcrLKhKNDRP7@X9`v+&n8?b!ajn`P9)Xy6B(W=}tMQ?Ksp+FWbnusr=5&{(Ez3#6mV z5uULax!_apOI3NiYNDR|OAKi}*=Cz;8WrI=hlM zni@g?#XtgSltWg(k8WEyj;_wOxl-eagD{d*5aUO$ZUKxeH{74A!i(phhanJv-2~?AH`u-au+MN;lntBRbDk+LfT<9NsTJ{@a6tn z6k;Wh&O4{O1Ye^Q4OMn4!|HTTNEvZV{dp|b!gC=M%fysgjbL;#+ZwcCeEVORJe#Ej@=0}2^ahN%EI!+s5<}Ni|wBn_c0JL?a>?p zZeg;oj`{LRAKQ1IZk_MQ2rDa9e}Gz zj)6g<=JZ-tsp9z_B9e}-dHKNlw%~}sQ9uFZ_oEubbyY>gp*N-@)D*-=Re;J&Muwhz z62cK|!2?@5-V&JriHD`aY+NZoogm185qsrNI3mnu_pqoC1)faHl!DQfGlY%@Dg|bc zN=8@C?T3vSc;yKx7YL=dehnKE#tujKIu};Q<7R|!lW6bL#g0;PWOrgllr1*pLhMbn z>yrYlv}fC^DRcpLeM4&U5$^_5zcNOs8KX@(V^bZ`A@rdqw?2IrYnIK?Js8#rCJWQd z-o^q9PZi$&J=t{?d!5agt#i~dINMl9*KW4!P-x?d*Y~=)fs9i-tqq0FuK{;_xMe=Z zOPLabl2qqF9rSrm`rw~#|2 zm__ky2r%)74@ZpE1@gk$UgmyR-rJ$%EqWU^`kV;!!{ z14p;KT+e!cU&~neL$?2M7zmk>DI?-|7~4fBJj?1ALl4R5=Hyj z{zeC|f@s~Fpdy}!*P&doNabW-8FC}QFg+^Yi78Uw$&@=$wcw^CfKV2 za06%Cs_n(FEhuu|$FnKhW23i$-s{>99X0{|MgkoNyIrr#G>BcBV#a*D%sFy0Ag@mb zyq-|y{p2R?&Ft75&)7^W0NnWLYZm?l_D;9IQ&&FNFXzMbv(7a1^mF%2Q&YD<098a-AI( z{RIAcV37L*sx1NR`gGgM8Z-FweQ%F)eeMsE%DxlauEv!8=~6G&9l-0H+p^+t*S|6h z&7ON6DjX!QQ94(y)8?_9&-!o=YvRIv+<-~hvT5R4-9 z#G*x3dL^wBs}ZUod51#XG%q5XvXIF~%<8Nf)viHO+;5~AguP7+-81ZivCImPIdDV_ zW20cW%U2;yGBX)S$`SDhvO$fuu*Wv*`gnBt59>Yhdkv+)h$=jP`X>>}xAY^Ah!F5D zBZP>zh>Ya%ko3n2s3;>L>0Qh37@CywKuLNp71w+E0Nd3Fw8lok1r_Rnh=P~azv}%* z4aJ+Jsk9LIp7}lEAl>12!Gskmwsv({%T#aAXwkXmay1E4I3Z?U>#(u^xIvGnU42@E zLpyD%?ofO;emWztV_U3&xvt5$JSxE8sW!XG!Wt68HPfgQ_1<%DnswTt*!C&_`iv9z ze7q*1PcqH^CxF(!Vm}7Q+1jELw-tdiQNtjmfo(VV*u47bt5*=Y6IB6V*L9hNtBtzT z5ZTMa2@{{I&t_Ynll{t3# zzTl6IYIT~DEmV^+Zn#08R+ElqxY{v|;jSv~C-&M-VL#>&f$pR0HX>|a4&{v5f|z7W zxSmmvEe;UT$k(eSfLZCdT_N;HyeFGB*nw?IZ4=O)QhTx{ci|pwU(0Nr-*yOhSkrKU zwnnYwdf_`eO*X=YATR=+LUSBw1v|Z_Im)owvSb$!ksV1E&Eph70!Sv@#2RoQvsntD z01s!w?snK^Fd}nO9Sl&N#NNeN=r9T{5Kg+mrVZ19u-WzgBy_@aipUJWDc+BVw$5yWP2DMAzmuf%=C0#t6A&fEm%-?t@Vg-;%c9)iV^q zp5;u5G~Ky zZ)HF2o+x1>)Fn#Qx@)vr2T+0_m6VmvbQVILIU>dbWZfpBc8Wtk#!%J`W=XVMXkD8|v| zkQgx1tE#l>$Yg>MT`aE2yKqLojqDH4As`ZXv`AdPHg1~?&Ep`k%VxtUarojf_{jD@ z01oa8!B*@#a|AluG0?Q?B3rSpheXS^PKt?MM|)h(Ms(n2b)5#P!?utgNWrB56}`Vn zT_V?iIKE1(65Cbi5IPdvH%VO*%_ ze&4KGR)_3?yLlM_O#@ z7}NWs4}8yR-0{3~soXF41P(TQG`n3;Q!-gG^)Tk~?~7Q{ZoLJ@TjW8IRxrBg0m48z zL_kI2aqv;~FbS6orp4r2AX8XerRP)YeZ99$BOBiW2p{o~#Uze5yaDxd{eKaWcqZ{i zF6-$sWqN_7_)#l?Zz?+5Q7UTD#dt!8%FbF^Ppqfj-`3NI2{JN};3I>NbRM$5KOT|% z&c{3b9)6gI5G$W0GHfooV89Wmv8s45j!3};im3FFc#nFro>-)h;Oyd^Ny{kH#5?Mp z?r7N&M#O{p$ZW}-XjuNKay@9Vr84tbDl4;BfKdU;etYQL4ldBtfmnnS61~_OT03M+ zp~X5)wQ7N_=xw*JJ8$VWubzyCLftsIpXY@_I&4A76!Cw4&5g%hf zdsc2F>65Fu@6r=i+X3nSUd@|a`thM|*{Jh6zQl8{Zt%-|-`#b=2QQ!dTv5OYoO>Ge z=_Vg=w;f+O|JfJHk3Yi~JzzADp;cv@k(r6p5E^iV_eRiPy>#FrgKvM}Y~BVA>i*z2 zzx5-@;BKVd3)*}*@`gp;e?BaMuk-P)mTb>{7V2%{3QR!Z1jL;L<10}H=aA@o-Wq&w zN&oPd3a+QUdL6$5k^hg5!L|JHzS5_OOu~+P|6i?h>^)DPn(BQHUjK;K*Wj<7@p3Xg zxBPc_{cYIz;xKBz+y14l>v{yU;tz>mDb2)|h#sh$(G9n{N_-Q@BBrS49@<=j@w*Ors z9r^8BMnu3|1tX34p8B3|NBj&NOITPY0!aD+Mx<`@+A1gCm!9&$LMfh z?&E<&=rm3bP-8Xsqk?}}KeXO$7z^-0LFvkf??-+k9`Z7u{j%*+yes+ivYz(SC5*tU zsnr9%`EbqOoQ=rX<5>l?$cYc?cPeyF**p~ULjA9nDcF8wf3&A*-9NYH3|eD zSGfVoUp}80?HN)M>@KQepYY#IaZWfvb5F zxfQx1HD+VrirEjzr5FUck=OExT{B^UrZXrwGNkC0*}MFmfVTIG0?>X!0B> zqKViA(hUSO#3T%0-6SWRP<6xP0zCSeK1YlVQ3Q^y;o60YdI)&Xl!@D&$i7TL<>i)j z3U@WR1wNa6dS$aUED+ezrTcY;+|YxMR_pB;C2=^CErf>@);29g(L8qYKmkkHo+HU4 zLam6~FuEUM(j}rs9xr-oaa-(ed>L4+bx_}B0?VN(*=2$c zczCm>4>=8I816cj)RSXb9*A@hd^!u6j)&L`+o5$%);Ek7Yf6JSzd!L<2+9ZWP6>+< z6f>N{dvIhq`+L7abu%MzM84(m)5fzWSD_t`QC2qWG-y|73E9qf6j#LrSkR*Ak|1`B zHY1~zr|oJQ2M#hHO_MAwSinIx#LS3}vV151$@nS1S2d&OKnqTUnCrkYo-m|_t-wIj z%A1PUAQ9cTz!A9-OA$i&d45op=j>paR54) zG@sQ~u_h`e7g~)z^k7T6Ckc>S>w?fMQu0eL_2MHBfq>1oJ^yXU&PF7glVyhbvTc8e z4U~e=$RDLA2gx=larA#D2G~+b=diil;NGGJ1#zg(8QWy*83d+V6?^-=(LqeKY0xBQ z+M6*m8BCYx*hD7BuxU<3!!d2sc-Zs~w>QzhAt>*tEx(#@4bu#FuhE&!$Dg#gcG3*X z)tUk$0$frXe~kxE)4QL+n4(`M84pgF0b`ODk$_IyugT%31jn{Z=G)w%8THQITMx#7 z*~risq36dsFX7{OaJf>gV$vWW56*oj`<$R`=iz3ulhvHhxGnk{N;HAcHI5U}joUjIn)? zN8}?Ii6?7uz1Q=}E)+y`(Jx8^M>y<1wEk5EIFXGXJvSuL)2nqen>jYup^H^S9T3N- zw?`w#x<<}msk22fc-DrRLD(bY^bBts&CrSW!rSLpBeTB59AjJtU@UwDaSgExY5K+P z)}QBQ4*v3-Tiy8cQYXQ1P?wM1@|9oTKFFQI{P`B2QKu8I#xGz++&${aIt-4a+$~(b z#c%%CkNYz6VPUx+AA0HD4}bkeeMle8lbgZwMPA64ZTQo>_X7OaZM@G9_^TWJExVB$ zFTQ5e?z+Etk-vDmFNf=YcKqg2zrV}<+kTtZ-}^yso6igIgc}TfyT})J`S96!j$gmp z_{-PF=g&Xf%fC47%Zo%qVbg~G!yiubmM8k^Zmnke5?vV+(bfCWorNj8d7*a0LXcdw zEVKzV|Lel9MobEZWj|R@h^YsCz-6ct34yYOwUkQ}503~%K#Q(`z3t;GRibwR45ZY= z#vr57B7>_X*HR+$Wkaa6Sw?K?ZYkU#_6)VLv@NOaVH0w{EMLu=mpXWbj)A__q)*jOa6_>$k)aUAhQS9R%@|3Ot^1&jRH!9 zpky|7-BfFL)QWA?@08JfUo>7ZWNTiY8(LU7CorXxTp07K?ZyUhBnQwoJQ=tqcz~uB zf}mVr1;VBf1(ANROCnZBZ;Px%0Qo}MZvCEl;A2=Hc1u#gVG=s%r?tQ z2@)!B(drU<_5y44`JqlkSLcbe_I5%bR_`F4I)8TGvs1IFW=69!3CL%-S}3_e78j7M zoq7l)*7>5_1x+g?u5$GYwf&qzFTT48^IoK~!h|D`i~M)hAJk9!Av}DjmTYRJ1+I$K zaYD7*HbmwY*@56L@Yo!SlN(^vmDM(?GP{}9#lk1&&Fk4R zqK*hhtZ=%N`K(Cgfk+9cNG$4~5zVtL9(1d?bO;=fvUiF^rown29}&-JE7rC<4aB=* zDFAQ<$bd+x<8NWBsw~M;hJrGV;h|48td&!)*BXn2*%WOxdD%G=?%ZSci}HjiD?A}Qw&W6fPcDkB z2iI|{ty00JV2WoXqB|~v)X^87Rji}JWN%BvGdr9X2e@O(eSS2AySL(PHgU|Nj#&hT zH+*9@5Q(FPOVRfmyuPeLmjGAUXdvB2c~vc!?QfnUm%+_QhFd>~GQ$+ea&XuBs<`D3 z*i0f~il2BA3{Kj4&s_Dc8O8;i8G#mZ8T&LCc0-9JDZYT#W3L`(vcU<4?e2g#*SQ0O z&3Nk>%kHk*1fL}nr>%_h6AUw(9I$(jThV!0v1;>X;t!3b-W-^oQY~xXkWho_Zp(cI zijxCECJe)Z-@VG(v=IiFjEKn0BMztzMuG=AlOeir5Xneq^6f}OJn5&QI$0rO^V2wb z!E$JbRQ01|@g1S62MME=E4doUf`ryGw&ZvD$P6knCShsFJ6={v5pf_*2q?RxOh)iA zNnrpYBO)@4C-hzw;K9sf>zOa0x^hB94e!Je`3N3FQqOQf&!|;;L~I^P2Xa!w;nh#n z53M)w(Yb>_AY~lr(2hB!N`*+$52DL;RzT5}c%wZF%BhRq$JXv>a#m*z-~7z`Q9eNp zcEQ#AxA&bz?o|NI4?Z!ZSrxYN4DRXiX~X=?ChiW;JtOzn3+x%yqYpFK`UX9h^X0NH z_llVX6IJTK*hT9A@Is082m7RJOd7_m_Q~#qmu>pyJ#ttfKE1kLB(H|w5AAI|_cMNR z>>&NM``yi*FT;Buuh7wy_I>#hS&df{g?o7XrakxL^CP`9TSmzeBR(M7A1t)bw%;o( z%a5M}_%-N{d*QqNIQ|kh@9*M%ufK`~-%h*kHT>n9V94-g`aZa0uK&rwP2D=jz&RbR zb7pLR?6mvwyB9YhAD|!V6IJ5#1z%Wi_s?G;h7WJqp9aI1cKfePdA**0$2k7tMP3k) z`+skrzYL_kT-f9Od;W1f{milx?7Q~;y&AM(-7Lbrs&IDUF?ls5c4l$wblE2*lTF)d zMKOa;8D51h3nCB)Tw+5HUMR&gs3ZJ__~BJka><27MG4Eu2Ac?y2@=*&7h`SB4UXj? z5oL7UhTapSiF=v_Fgi*N(JJJ#^aBnS$8zHXeP9<84y2K6#c zH%0e^`g~!T`?#iwpb;IIefNAi*&gLwux|DAynS#^5$zEzB`NM~zr8y(UR9IAq0YT5Xf7>Xu zPq>>d*TOjMH#`5m|3A$aK^{WXiDPb1K__i!D{M>=$8&3Fr?*?Rh#}h!JL#gL$CSCh zteTjGNFa=w(3yu++g-w|i?(;OcM9&sf8N(^Nh~?2K(>5P1L_1U(j&DAfa!$E(R=B% z$aXUOEf!H*_(iwBb)*bcr1Q`n`l zY3zcHJ6UTFrft30(e3Sg!@$k=YX%(A!kZ4V;AM%em;fM-5u;#r-gc9MY=KYsNgqvJ zj>6!RFkR6(!0ZHW0c6QWI@J6>17V__L4btbfHxDQT+aw0oT79H{d`h2$!T>xADDFG z%nNA4C*5k+w(uT&w%cfi5mKj4Kf%K4N%}MrJg)a5fE6KZ#cJ)oq*JYWY}nN)mp!L~ zrW{ov@d+yE?#%3>aWp!aW?LhYxFyWPcmhxBr}Yek<1p+{tuUfgsAAz>GL33P)c-$w zZ?`K;mNW^Oxkv6()!hsq14vwe5EtAcA)bE_Z-Ed`Fx;S#=IcIZ=W;VH+*f4e-us+7 z)m`(;UZt+Cof#RiB4Yixo12@P77JXYBX5x%2bkHgi>vRrLzCywdRu2+xG*UY=s_~G zDI}0;XgeZ;!vm9OQd7`!AZ7|+Awb@W@k-z6JL`z(6;eCH(uxg+5$Lq0qScxJ8M=YD zP=bf2)*opif(OZC1uB}vi6)-Y5BbH85Fx{jJ*QHvq|j{H?ZMW^KA4g z$P{2mu2X0RA2fcCS$BT>L&&)2^Y@VJzq|b*C;ZLMpG)xj&jFk<+xJewi3j*6uF^>m zZ`ed9(xgo}U1+X(p=JwQdpYe*kBo)#p}eWG7&khj;KZ^Zkx8?hUk|NN5VtNchr9)o z3`ZpI9x)agiZ)E2+TlpLRpdJ?*htyrn{{%`RM$mwmplJrzVk^~3m{5xw90>=m(TMd zSOyEUXd>ZIYYX&CiLQ&;5hsX~18G_!9SpEq#T=73HfxiufaJK#bo699T9N@g%L5u4 zLn2R~W%eUtvF0#?!Nx%MmWjfYV`%F?$Ak&n#SWqYh}zB#^^hOkabdSQvw%)_Qfp9n z5t)2q4UF|r4N4EZ86Eb;rCRH|$!HHSnHW26csGrltD+>-vM9@}QdJFzsX9CmK*YhU z$PVHL9jKNh3L;Ke%sY(Vku3pI*8uD}wR2t1?p~(U11&l&B%f&6W2K_usp>pg{~+iI zkkXsV$rGY~b~v^%pwWXcly;;a2SaoZZ|?lct^DuxS7Jy@buy1Kqic;a0q<$ zy1V7UQPDL!;>dU@SLLe@g<5ed1;VvrL3c;OVW|*chHuRF?IP-cBN&J^CRwwJDfgMJ@D`L_5x`=VTj*rBn6-D@%bR$bbG$_{j2^Dc8QhUe)ESve~Ev0?LFT8{==V#q2DaC z|M|7+P`tvvPq^1^Xe_li#qE@xuHA=&`Uio8>ks1lUw!W+?;&Qr|Lp~09>GlyBGm`g zJI}>$&U}&D0MKjs)|owpGSrdB#@z-}Ye=GVq#%@*^y>QRQrEIG1TC$*>%LaiL0I-T zcW$A(3J1~2L0JkoJB^m8E?v?+yqC<-s>vYhWunVVH)!L@?`cpg;6MZkd-+Zz^{_MT zN+Ll-04~(s_^VJ0uYEZS!DP~%zd~S;qhtgkp|Te76}tJ=3__*#s)hUA-{M|cU6&6| zr=$!xY@(`5f=kj`>#K2NG9#HJVHKA#rIgBagck0Wq(f0UTvjx`U1fY->!0g&S#4Xh zkmXd-PR7fzY_7IcBtq$zgbuEI;8ycM!pE257xQMas_FqTU-wHs3-rF76QhE44p`tB zVxF%qgLZGz+iHdVc0+wT3-EM6qm|RQbLZOi_nwUB{$xh@=``%?_x*Ne87^Dco3*r= zS&bNaE0&@mX3U*;P9*wcY@8KS(8U*sxxLn=wN5ETKa2rgHbb-XP&*#`_5ocX<_D5t z%NASU?g}xFW#6%i$2&X=p4;Z~1kl?mzo<|6@tkcewzTyQfL$PFKD zUT-%JIyZLS=_Ltrv~il&O0omtrg|(7`tJcX`+3kfQElx+hlhm4CDwaBhjw67I0FM? zCO4KOuCw}OIb!1EYRAhiLXi;-oO0aI4(QuCZW=+fetH-}fzfP25zQWpf&8##f)UnM z)!(C+Pjjx1w-H8alqm+RCkoYQDF=~mt`cWr5V@VibI`DZdoyf=cGcV-nA*L!5ny#q zKsbfYeF0YzXs+OP>jON9=AU55jw1`+2uVvA5yKz!?nUba%f3Tv3M3NbjI%CtCswd0 z=$)1O$&CK~u=G0H5l}PikRF=Tts;Sxk9odA%ZvA1l5Y@OHNmAlh=L?hbig;J$EPI; zMGw&()=4r_wvZ;;fx0PQ&^3i*JB1e$YPOpPZn^qF291*bZN1(yiO4wq(nYCk0O=^8 zV#zFXysXO#+H1{OOD4gAq?m0ZG``$3-TTV6jXKxcV7$q-XOmy9gU7frS`edG52*{! zj_F~u+|yYRu4=jYy7dxh+m=vOOVz>QSGC4ggG=L7-Xd>EfVH@84GEev>)lz)N5Knb z1Vqg;AI<*?<}BMbwwq-;kpUk($m9f2(X|S$-sMz=C0Yh19I41ze;ni4%69k|qr5@J#bi@d|m+W?*L*BNY|RcsFHT>5R|pv_bP2*f1{zhmZw3?MtS=H9ttSG%!KqAvQm zHFTX~>lh5rTkX0mszNTys&;M~V!k(Ww^*K1QQ-yPXrV&OVg%s>j?~SKC-*IKn*}^+ z6g@1$03U4eiCXv_ZS%b6(P^KcsIb$-0F>3$$r}Cd*~Lv@Bf{uOC)A=B_`2$5zC^UoS+$l89;*%D@Eu-u zNQVw2BMzEkSCe(i!5mX%1=TLA#e#G%TEg9RgAusYUJXPL+sbLl zyP@3rf-hg)zy4Au<8xc1dOq^GJ(jnpE$nja%$E=L{hVprlfXJl=A5T~-!@kM^ylN` zoA7_0;5`bw13WW-WBiKVBK>BQZ=I#ul(F`&w!Ts`5-#S7qghUEI}sCddlUw^^qo(O ztv`_{dD?ApKh89~)C-sVa?3n73ELcoT)gRF%pq5_<#88p?ooIy zRe5d}=b8Gy+IHIEz_aM*?{3fg+&M{q0ObB`d!iMS#Ar$S(a`c&|HJ?EKmXIe z{BQna2q%2D&-U3q+h_YvuKn|0|M~y?zyGg){r~*yI7XGmVKUuT)}|TRsO$>!v@KT4 zE+3PCNAy=4i)rhLm&oA8ok!x*&6e-Nf^FJuC>gT@ZfKr+r*3o4gLQO89J}~1*nrN7 z?l6Ga|Fm4;+zE%)Wg?Ktmc!dv+*}6vvvorugs}wklgUmCL76O|pK3Gua>k8^1 z*OT+NHfb4CP{TUs01+;AD6-Dr(!t$}x1!#tDIrE(mV4wcWeM)f1+*B!Z3z z;f5%dVxUZbBD?I(qGcbFh!`I1l%SV%r_%gl9%jHvP(C`;fT#wCE`aY2@`HwcM4zE>WPSDNlpi?DfdBiq)T z=e4aT#Lk2pkH{o~bh1m%#yr8PUD$zv1W*R5D`8BUFK`C9TvCbOO5aL%=5bGIgMyGk=Vl*og;MJo6jKEQ*ydg570*E5f!135h^ z(=ho0ydV~|2mFwFIM7vxG2g<(=bZlDYVvp6)7PJ0fSV5v`0xU6KK`y#^h0#}=Uu4{ zB0qQRx9rOV2dE?BsU77`^DbbJxBCM9K?x$C?oiwfy7)?F93vz&VVpG&j#4e>3 zy#>gK7OU$w?j$r~tz?(~2I$dy>goI82p{CVkHN9E1^cm{xJYPw-;CZvYDTr^2}#m} zlR_0j)Um{I!9zj`(hUf^v;OEiMn!F!X(ol zgA{vvN9WAjZoq25+lJqW9i5vS&poX;o5GMx&u2&@w^9l;%nW{NuUDaZE>d1i1 zMR)9cnWfdtCI{08;$WtkGGFD2D(EZxD!)pA?qb5WSJmBE@BuDDE=fhcQs9vY1;SA$ zy#N3e$d@+ndaoQSH5W^u*VrMFJ6~79+ISL4B;0kn-y(+lfQ?RGcbvAEXWYN}*{KF| zVNtzly$b08B{ywkIKLm^%a^=PUUA`%Te|~qCfD0ze#>?^%>(p5eA}h-UT}6>##sXB zT^DJ@R7|?wyUsY@8z}rAX+LcmX?nH~-}v>9&|W+bjNiP*3G`oq-Cg?nH-7k&m-xXM zeryQ+9X8}1f&Zxe`K}wkyC}%-ZU14>+tb^|1z#Sjn)KiO_y6O6^Kk4@8KmGZC`(OUo|NZ~?SCZJZi`vy|>}y;i0#h@vVPFp|OP?ASWB@jIwa!g@ zC(jI(OWhGQ))5hRD7&!YVA*Uzq2w^7&BhrUCyt!OK!2oyZ(FhM|S zP6>ttoempm#Ur54m}-zL?PxSt(ry|ZqWvb*;VHxMKn%$+JiF``30p^rz21N+6w2Mm+kvuENy^>I$Q8(uv-} z%@a|2bm?t>V%T5j4Q#SfjuO!2eCj8$4>SB;OxZYBv+IX`k}`PH+ewkw3|7*uSkg`) zTfgavnA72auI1L{JPf25#GN&aYoU;3%bg`sw{&s>EIepuwqP3s^P5`Q_9h}!VFquG zuHVKM7yv`|La~+*U<6!l$#noIJBLO(%1|`5tKT|2Txilx2M%zOm&rzrxm`P<03<`r zHSMaD4i_RAtpI>cgWY43t%W+7EG@r8!@?^0^_%YZdI{f>iQ5skduvy*dCeOWZ5lQU zaN(E)2~P2l1`SWa<9bRIkR1ZZ3J$4ygfQUN8AI?aAK2+Qt&w~VF-EKMrg@!i8o*Ql zGyKGsFVvw?HFAt(m%(b4=vL_Q$pt=1SuOI(b}rFMBE#=ib$%$f2(Bcns@7ViSoXc{ zORM0Pzgu1@kV!-RXlkN+uj%aF7|h(sz>|vpIjkR4};6rrsx`Z@d@$RdNu9WJzQ$ z=~WJkG?@VtE~~oiKpZbe*6QjHv|IJN?xyWqm!j_6x~OoH>VVnI$6!R z(c(g_1RZe6->fydnYNWcsqVGP214`^=qd0@6nJ!*-aTlpS=dRw_&7RyhzQHfJE?8i zw0fVt6cA$%D%-_Ta=A|V;r3z#C(hK5=+F^>+RWquqJ5O$m%*-R_c}k354_ ze*PTW3M6(-)93-6=LMUo`jp{_=aj2w-X7Bd0>I}M31FB0`rxX+ft+?v+*aLBLYD2U)!Cn5-24O|&w6=2 z(sw8JhZKZU#9&|MeY@I|e@Aj;sC0_xkf;JL4bc zC+B4OPS1V=^#5MFUg9!o@Zq)I z+dZv3%+_=#(T;A@crgs2lS9z3imV+Mkb!A3_p+hD%g z1X*y7ra!kfskdHBJO~`!Vb-)9>S1D1|1`y;^_&dR?&&Bz`#w~PmqbWUmFYXJpKl7H+ML| zSEvY6L5GRz+T^i0UQQ6svOS6reWcs%9TC+=P9@M026-5r!f6o>_y{M!<_=z8RaPH;F;T(94QWN-_?Wt^d z$uQY?#{t)avbY7IIAhL4i%9pRc-X`nDR}dG{vOteG1F?M-5*0g`L5UJ6ENQ$_z8bN zmj&*_bIz&0)06jC`SCsWw+(b#3O;oG&(`8f=jUVwqf4s+ve;#b&=pw+LI`3Cg?`g& zNH_c~l`PNlE(p0qCCV)FMb6}bOcKeAl@T|D!xb};Y^p4fqKE~DgArZ)ibkN?d2g`1 zA*$X%KokNQ!B7)JP43hTvTFvIn*-DeeFTZ@b{qm(?phT!p(Z~%B5092Ah89FarHG(*>dN_kXU~bo`PexJgZ)$s zc>uj<^$yzE2o39QksH_?5^|LgfayZS)DqkdB6|SU~?m!4T?97Ie?b^ttynfs;cgFzgN``#|bW*_FW)!;0U{{mtZLA zq&p1evcts;**I{g$?7#OK{xZ*lY%Tb5xt`jkFpgrW!MVePgCuR{_p}hUp;lwWD6d1 zqi=v|1O@Kb-WVLv{O;z(>w zoFV{rRsil5S|KN;5Tn(ma?*a<5JG}C^Ou%C1O?xXZ(85h{bt(w>+5~#{*sYosRBx{ z;MaBcfy4QF*FS%~CyyJBKk=4F9LBB0DVOYJ2_$X|3%biyR{0C?rz2YN&D4Fdl_^(M zNsO?gMC*3DWhSL%tZzkAf4UtBe!0E;jq9tv0U#J=0RbLhGH#h2E(aZ{j3bO!>R=#` zTjl{Sj2s7dO=y(W`F0LhN4oF=mbe7LmhQs{*FmN!Nb=oPf57RB_x5_C(2Xx^tHyt}&-U3q+h_Z1|41`XmKh|&2B8+O?-Xq` z>-DjTw~RuAlHPt(L(iv^HION>vDe{zv_`Z$74+GU!^2dFvRWLvi;Sm{+om;|zSrE{ zXa}(xtTh6CaPz58SFPQv_JjLGGBvW-oRha}ZQD?5QinNY4B(!ca_0?o8g@MVv9B9I$O}D<`oa&0&HK^Xo)%`&_Z)PG2Uan=`y}xd}hY(uqI7CbmFdgu{>Mlpc z4Z)0WbPW+mX=cCRJ@h54^4IXqd|}F5mMFp*I2gy#Z$V9mq;LWvJQy}d$znzy^HS&X z1e`YIZ{IxZO_DG86eukC07Z_B_wXcVHfl(z4#3fvb?qlE)TBpcdB@v+_wymp4(VQl&d+0GMuW;Hg;^0lI`x%` za&oSB(MjwZYI<)!-7aTDvNakmT-~|H%{V#&7F07%*d%IpQEBE#{>$Y8J80ryqA8^A z$OTny@QPgRjT{caHz96d9$%7RK>=r1;k9jqDk9QRASi~B9NZgd$x}EEas%A}IkGos zuz1&XZP}VGve&9E!Iu9QKvB7G9nlC8TfBej!qM6IQeWY^lpx)QA)L?DvFzMAvi#4d~C7AfDLaiB*WzHS*fg z^e|+#YOPvptySy3ROMC(T1|rnP>!%E;Gk(H(+7}Fr;%7*X>cVo6hv2tU?q<3XrqDM zcanlevl&C@oRQ-P1rLo)cNBT7i_2Psp04NYNo-hpI9n4|JCk72=dT_#&6AfWKd)=M z;AGF%HfLIYo11qE&d~3DF-ALwc#!}AAOJ~3K~!^n;^UmLdPPapv%6EdM(cC7>AesL zTBr)F)>)Z&Z!=`O7(LEF_W>@qGI;C_!nKygRj+sJXj-v#FxnLE7%V3$mqJ6)GLiNf;@sI?p;~Ma(EEf?q_GtId3?Ue&wjX(D)KZ zL}X@Ywdih;iLiJu4jf0^j%Y~^HGTReQZ`kjGb3S^x{M)#Xboi>c2yk=Mz%qAivawM zOmY&cM%bDM;|us|ezR0)p$sTqSxE&lfQT@#9vZRH5$d6$ckSow<*^qW10o-K>w7)* z6VADpnQity@2$9w{~gEJgY^OrxfcWN^O7{T*7{xuuIHaM_KeeRQY zr=!1b9$fdt{rBZgaGlo|v*g*;h(+vn)i*%^N9JeyY@hA3eYVf`^G#h1TZ(|m@Nt%xsKEizK9ZYc1^^=v+WYzthY_+m zd9kD6-W8!hZL37HzmbX)W;AwPM{FylS{|W&rksjVCfDM5687a6< zR}=srn`rk{!=UbZfs9skMr?L~-K8w$*4Yc|O#*(W_!?<@O&a|POGOUlj-83DX7WJ+ z++a#(Xg`V@hAdT+hmE6}7v)ZHlaTPvt=C+6m}m{1M2yO_WVf8i7VGqp2nT_~xHkoj z0Gyqan*y?7ifGg=xyY4p($Sf^!%&vnw~c66)78O)bR5nbA{j?SG7jSK5sacv1Ac_0 z&zimG6Ys&(KpEH`A^=I9ryIzmP1d9KZ_9ij2A$~$MK;cVzV0S3UfCMvw&+F{+(f8P zO90ps*q91E5s=im?5F|-mawcNz>3$Qzyrvbq&+NJsxH-W)E!duzWb%nOytxk zIbldMOv(4~GOE-05m`spEh3E)YL_2r&odUV6=2x@ck8!4rZ-q{XahMN2C-Y1ueO!^ zp%MR&wDWzxaT?zqcI9$@r#0&I{==(T|1g<(sTcFEo%#-M$)wxJe>o3C0wwqcWms*#I|i) z6Wg{qv2EM7ZQGdGHYRrNoO7P<{)t|z>#eFL0EG#%*0>jnJQcu^i_2$y0wY464hAO< z&`J7X+hWdI0pAxN7d4}{r>kO`nHB`lCfMt~%=^3PZqDh(6EA!?vJJ)9jyeJ^^G^o8 z`?-FbbY!#ng5$fFmsmuyXxfZ3$zTlA0?sQ;m}(&Iex8;huW8j?aJ*1TmpmF z<+ljVH<=@~j!gM)oeHAM1`&?{(+NAsvnKUJ0!f}B@wh^Ko!o^1H+Ngp;_6kC$|ZlF z^7`|!)3-Z!tf%an{kWnGluY|AN?!xQ3czZg3Pi1-q$aO_W)70Mi);r_NG9us1h%>> zPaU}VC)4#+-oDvvS33H4gi+c!m4~lT0E;X#D+SgB`J@YP5 zHAp#TO$LUin%4&eSN$MjQce9ss=Br>Rb=B2br5!dw)WlQAg~_B5x^caruHi-uhY1C zfe5W!LX0q)A{aP6H!%h#saixNFrDJXaG}*9Z`=DVo#Ax*d0y=VU%= zH9A11Wed-=>vW5Jt=)qB!ON8Jv&QCHa`_my^N?Ncaa-a==8YL3SF&rDm44V>=4^i@ zoOw7M%HKHu-6QUt(#6g1&i`}!;Y7P(Tj#m^?{cno$r0c9&Dq|2<;TZtuj|atW0KEY zE)xIi-&si?3X`YMR{rIP>!-vmK4Hp}J#_V6u<@2^#d05(-TxsS|2NQbt#tay6MtZ= zT zqYT2HH+@09G-6s5WE*2b(6{Z@HF`_JK{Fb5j#|2CH!4cI6lD;4NRl8Gu5&z#rPrqi z)}1ZY6p?Odl3=|DLofyFquYf?>L#v|PdBuMDCIGL3`ytV3suHPu z@S#*d6ys?(u<88Dm>hM3Wa7o`DQqLv0joII1cTT|`STb|f+nvIy#LM5Z&04VQ_)y{Tod`nv{-p4)4lid#$(`Ku%Z*q4TBMsx z@ho=&T(ZB%4$Rp9N@59_*5(5s@i;-_O$Q4Etx)*bub1;F1leihlm+Og#iED}EL2!A znE-^|(9UTMH?l^eexaR0Wj4~|b#$}hq1azy+2yC*8Q}Ac>L9nv768l>HBD?B4-Yeqz<2I3{bwfwB6vGyEGjzgQ1Rzy-#x$BT>R<3>2 zJnB!qxv0FBTFROhP_#wxj3W%?=3}#4+}{)XnPu4K1v=eouKbquC3CUsEvtg_6rxWS|#TpTC2|8Sp+n*QP2h_GwL9Nze zfMT=TE9D3R*mP}QY z=#FnA)wTUg>ZBW;25n0Aa^5LYZ;fBV)jfj~A(%GL79wFfk{Tw`##72PRnedv3uE3e zm7=8try1znWUQ%ZrOZkcH{%@FfbO>oR6tH}0G~o5_(6AYjw58ph5$G_?qx^SffwMx zXdNRan%z5}cI+My_^ff~>?QBMh6&*rMGpl#=e5G(EcOikQ{1#wZvU(_hCaT@%~;F$ zc9N_2&awvi9#Q%^V+Im&UsJpKnkf~fG#{WNeD3>#x*bk%^LHoq+w*IBQPo`@`(LAi zw{OBl=#4>-D~!xZ6Dd7uw(sVQbJBD68%T}E@I)uC_`^}R8((*u)60iX(W7=Qe*B-( zoMxDZzjn{7FS{4lSD~rgzAwyRFE=B#wdfsL*9P;fMtfU6k1tp6924)~U%Hu`fE_)y4DWa(N4Yx3ZPan9of;wkHFvKMq>`2W16y<4BL zpDb$+>|C2ZL<@ultn=`gI&{TktqZilu#tq7vqpyPw0Mq5Im!A74078kQ2BMo-_vxH zf41OSd_6^XPDeV}pv#Y+>j|$GnaG{dR3a3VIKQ!SJc!A0sgMoC+S6kUAV2*r^VSI5 z=Bj4)GQJ=%Gk*Neq%?mR=UTxKT!F8v^xmM4^kjkL0!JP`EmF-(x3)z@85hW~JU0IZ zm-#`mg;eraPeVrthBfWS{XZV37MWsi%RBA{9a)GHmWuEvzpNld#d#d+1%j}yitb}e z>?FnMs^h8Z81Kzr*`>vPK2;)a1}N(Z94c#LnV}+RF#Xf zvqL}x(lKgAHnsGGi%YgKdf3)snx5=3judD{cVsYHcxqH{F0`Q| zF#c<8Y_SY9{DXlNu0ycdDd*%L*p*kDVW3X{P7V_ZFP1(hE6Q&1b~==*->U{w3T-sW zpix03`MeC8uw2pX+`HnvRC%q}%=P|cKQIsY-s2Gxf9^xB$1u)6(2x{iun_r4Je6_Y zXJ%6`*|JtA%DmV(h>SGb1?Gh?!H$O{joHLVBGOf%Yeh_VVW%6K*B7a38aLBNdoUtx@Y}+i+w}Q_4YvK47FT;DXWnJu(ikvBs;x5x zR=}(wn9|Cfl8IQ7Y8kxnfbHlP>C;P$dcNV+hGtd9_gk*>9|G9gAh0t>~cym6^|3dZM|8#sV=c{|NWlFf( za-8d%`}y(T(wS>@e@f37CVAL3BEzbQc}##FZ5S;&O{Uy%7p^s{A850`E5f(m{Wf9R&_Mz-1jRSeUYdrz*NcH8)^GIFQJ5~WWlYTfCVoo5) z@Nq#7X=+X34Yrp0e0JEn$~0TUq~hX87V$D=A~klT5$1Y=S2!&IyGeUPXCmKMBZW8` zc!|isfkhEsmXahOCKA5XY@C56~uIjHjwHHRSsJ#q65J?OZ!UmG$mL&$x6UL(xkZO>uLVeP&u z#oA@${8p$oxfv1i>;vcg*P|fpr zh?n3B*tVd}>{m()_Mwi`SJYyo;g-`E$7N@%dt`=eKzXVIg8j^}-8xxB)?a$#9;34{ z%@mSUdGzoVU80ZCI+Vgg+^$!|QI^EWAUqr(b6CiR-Cz#nSU(PuJ$TJ?o z6x;VnI8px5`Ig6eTJ{O8-3)2ppKx8F(i}y#;@F*{s#2};dj%_669Ok02t;Jogaj+n zCazI-6;tZTFkX@C6RckddQ))ekl4BWjkT=H*)gMMeW4#q6q9n4WkBY(^A0u+`lf@y zkZbBusOBX?!|RkCv5n}VK2yYBdX=XRFi-fYDN<7U_S=M$7=iD7f%%gsEaw|WXBPCb zBc_oIqr3I_X(c4}Bs!xE!+?nkoUBuTw6jJ(U{gh_@?2L_cyL9tc^wpXl*NTLW5dkcEL|&U!$|km|(F*LxDY|K?OFFx~oxj~nt)<*F=LGt!BHfJLrT*>1O?qPy704_!Ed| zt~%ywgoMAd+cOpGd-v%Q<8s}%&Ho2a-8Yj^>Eyrx;62lY6u^ob?tX8=llyvwT3R!% zwLJAY#oxs2The_(-;0o(DLnDJ&(Bwpu=gyg)1DFqRUin5q$qbEBh9|ch@pIJE+fkr_ z7Ffqc&_CIn4kQWHyx{|c{4W&^+#fMPBll+b(GUSL38PN=$ZARAvM4J5!+A*Be(*xK ztcchY3_MyV@Yeu0Lc6o!w~?i#Ryy`-W#=7q`_Z^mL>ZQ{cGiZz@fsJD9QyViACiqP z#_7x&*RN0UtlNX@ZUf*_tE#7vqj>%XJ(HXj2MJ>LWpVAQV{_ z;1WQjGcqrrE6R^EX|f5$O+mxmfA{$~+<%D!1p`f^!bFjB+sblT=mGH?ggOqBJ>;r$ zn2JMp%$fPlV8rr|%%Fj?5v9`dY*+wxiiGqoC`k zHMGDZ@j2yHjrHPR(jC2vjn-egYT|g9Kv%Uh#2s_xKIw55dC03e(gfG-MJoGpnie_< zCP4Yv5KJl6%p8*HLxZ|Vr3rIp^J*ot)>ir|vSVOGrkI(){2PD#r9_+!8Gx}POurw- zSj2(lCq*259qBVUv~*LzMDlE2+c~gPpX~N8uQrG$l(Y((hWw&&#v2c@jw?!@Oln4_o31Ob$?S0VW=faUGBD zS{0vWDbs4?WVc|r-%4a0#lO3INNn|bK2m)>UQ78u@8sxvdl-7%*C4@+V|n`$mJ9sU z1jEYDC|7%owme4B#U2Rw^R?A>-X{ujJc5WQG?p9O60#jd5(EAx}v+QzMXuY`S#Sic&)sE@x5jE?t97% zoZwz&$lO1=@m=x$|JdQX^tgK#dPyiv7}h+tSkV6|WyC%jY6CLwIc8ZmhyLV>AGPku zz`6y>))Wi360wQ|-8n*Tz1+Tl6=HPE&H%PGxeOZ9x&$$%{E|KV&!U(tp$nD+iW&m9 z;9X07Ys&}r4N2w_gLZ+b>}*VTbRD#spX>VkPqYm3Tiz8S0tl|Xbk#~BlyqRjUP5Xn z__oXQ%eTUTJiG+1TlDW$_K>|yf9q*+DVo*WEnNfTezN;;`&IwVu=?4qz2IN60-e9P z!D%^R*iQ<1Gs;WVp4)1@hU+n49sO&`TrHdv%%Z~t3UM56UxHtQNmMik3|uU`kqRRx zYHLP^RiS(?s3aykQgO_;&Mh4emSGrH-$1|%2;1ygLQoUL4BVLCHGyDJGmbrnOs&?= zgX_2=&?ReY7bfcZ5Qr5fN#&2U(9BbT69PbA;jPXJmDog|5A$ieZb!urZl!P5V0CC* z!XT@5!RtY#*dECnNQ$J@xUc{yicVw#q!3&g7f55SnL3#q5_GPqfIW^2q$jX`c~L*y z@xOu4Yxe~7vMaBR;+}=ycO}^@OZV_H(8J?H>2r%XF6Y9R&l`GK=w1Q6JI%*^d~X(f zuj$+!k1yw41EkQ8ZH4igU$X1F?n;LTKF1`qNAQ5MNvBBK%e%ujj~;H(uz#5NpfsbEE0KW|5x`ZF<{rxFZhZif+^R^FM%5qXYmM?I zrypJ1o_v9$G-PsdXnligc=Vdr`V7_tRiPE!Cu+R4uz=q+66XZtoX8VrW5f8z$i77@Tmsi?#> zq#Uj^2mMl#%Epp^JPIRb){AM1)dG)wL+|bSnAG!e9|u67{(>i?tZ0e*Oh9XiG3!H9 zcHNSy9iTT!^`@t-EH$I;5#kD(*HF^ffi2EoaQ|r(VjQP0^29XHFG*M5Fm=pVXE6~DEOaRb_O?a?-`k<0B!PV z-pL9vf%7Kup4~>+^~}a=k#sXGbk+-|Hihn>S;X)*(=LVS8z%xC>RIOZzwbF@aom@) zM)SOB;A{rN@qbdCem#-LX4jh$#qf_p|6| zr{6f&=kAM~{p)$e6gqUq>fjd|s2Xct_?&vKUpqe4hc^@W6p044SP>z@wa@q;ytMmf6&J zH6+}V;a@H=W*l1;Q&0sR%XW%xLXNFdQM+x_5uPjD|GWUQlOL9-t+ZqLR?5XCb_Pp` z>>EhjSSJZEXwl|U6bDgYOQ{1Xg;!(de_e5y{kz(O=A6A@- z@xKH9M5;A_g|MNmORH7dVaz{%F$6AU{`D@S%o8Got>FMNvj$;XRR+tkvZ6Im7={;- zWezQC59$8wOx2Z1xOkz>JhDkgo=}De=`>9jSeZjpZA$E}Lk6}Renm0a8GsuZhQ!zS z6PXH#(E;LTxvCj13(QSxv*6{2!z3;r*PjA*BFofq{fb07`?c5<8a14}qoZ`E+Z~!v z4Ol6hjl$we(S)xrNj4gwN$xZ#bDQk*)=qxa5wz05hSwRy1sW-YRrzzYVA&i{0YWm% z;H#0&h7}6JaTKqY#DimQd7YUBzQV~T+Ko+I^elvqFsaqlwCF2aPy<6|m%?VQm#iF4 z@8cfy%vX*Ckq|bsN^)yP*rp!#2Jv&(QS^@A%|9=GEj_=tYx_t!y}T`jAHREn`8Q@H ze6qJYoA}GcxmzGXe%^zpxMK~7fS=uE;@0ZacF2JpG74n;oGK~pFo5H)XF^$wU?Rh1 zc?@90`jp*B0gqQo_HYCBhpx~D!pwFIf96njaFeHgaRdaIM52!henAb`sA_CFKTbcv6Cg%q32GX09%r%+kSeS9lhDS$BJ zWQZ)pVKi%J5t7VsQRc2dLHMGOLxx12PvF^uW@tJrW)+GeplzM;XmnoTXdt2JGxz)9 zLa;E+l=`lstKWZ~cLce`ftI!$-EG}N#4iO>$PHVM`A1#b z(NF!!vl0x0^v__ZRMw)3I4>Rt;!MRs*#XCSTF!!kR9{AvJqcq%IJm=so9J}P!q4wzY;glc#cPE{#&)^+qVUZd*Mnr~?)^pZ^W-sJ|CC#ufB0T_#+?urtRt zngUSJV13%?!eG1>oVtz6=42?cSz|GnTGsDMs)A(fhuK%RGTV3{qqi|2Bfd3EVw+eJ zpW*xB=;?b~X*cN*M(u@8oyQX9=WTw5{sxF#xQen2?s8VnfK5uN_5cf>ith}iy?*|k zQY|S?9Ti0~nhJ9?g(Bk?mx`RWisIVTyqwA@{_BWBU*T~Ov!}=b0LqI-&lK@4g>l55 zggk_E>a1W1#vd3jB0{p-p(W}s&tY8s^JBr}%qswzQ8zlXfbxJgSfP$lKSe4B9FjxM zys_8^O|iE_=UQ^jOw)n=1}Nt##=S%A$=Np&K?zdB6&stlwXxQM`Ss#weudZBzerBC zm8c(j@8;sRPoumUzVf_!+W6f&80=f09XNu{I9{6g&RunHUETDBNbn^Ux1V{CL&*2W z!p|w^C^+y1c=`*)v6CqOK?(S_iuM&necM8s?LA238Ibe2tM`V5)w5gI+j@+i8HWhuz|ZS@7Q ze|Rza{8x~-+%?(w8uRZ#e2_t?O~>+gBWzp7O(xk-m2?-W`|^S}$<-i5?FgUf-&%AY zA+a@Zc13y-y2$OUOH81_kmb05?y(M=F%0{L$eJ~ii8X5>&h+MMu$wS7|HTBvN>IEy zFRmbwM7T^lK^PT#;L=^V7-+xaLSGex9@0$EU_j%_Exywk(GP+|sivZg3tay((J7w7 zYqVUFmSuB#$1cyqVp4ZuoIej)RgO+TjlNS&yTRT5Djz8V1#kZ;Xqs(Zct>zh1(4mc zvjibHgaRMh)8!KnLL3qI8jOuxaRX6XDc1A0CA4!`uVGx7o z#sX>+@4?L@RduVPwrK5w(|E^K^-S)YhSIYM{P)^KVSe8I>k6a3PKZ&<-VLg|>{G$m2W>~g4F~g;L zMb&7(Achj~-#t4_qqw4fH*5Y~8OfGhk@r*%XQIk*w4lTD22An2_Rx%g^5^??9QU=b zw%_Sdho7A0r?>wws-D{)S$&VDt9d1BvP6KrRdiSAT$FK7L29(Dh~X@C=72wX0GX$w zHf{_bivXpx#iIaeB47Oz0O!+*a#lIK!v9Z54r zw`^^vqM#@<%~|=8cCT<><}sC_6svLcgsDSWP2dw03pq(1+1SkA zF4o-QNZ{|%FPfSSP-k!|-D}8w$0O{*CF;!W1gT3LS#np`Vi?yxU^ceFs4D$itUNd8 z>#XuqfDVi4xw7*I6m_blbpZ<<=~MW>Wt7h3%o3R+YaM(z8+0z@K83pw=ZrOx7m71| zvlguZ*o$cWB)`Jke9V+e(YM>O2A#pkD^(FwST!RZ%CPH$n>gNLgXdKy(#h7V?ih46 zqd21afD}}@IZ8Ke2vf2AIS>R#=cbCwDjqVmQf_3qT)D;bMhXq)ho~B=kQ*KcA0cGWB>4v5tvKkZue~F*B!t(l-YFR$SMA z?ifza?ZdnI_%hz_CP@6p!D-8&KhYes)|iBIs@}4v?$2pTV!$R=+q8$d8A27M3-FUZ z?SL~jjk?&a=axSWEtnZ^HBr-?`UC5YX0MZ(Q)(LukZy`JIO`&2$PWQu3nFa2{MsJ+ zXsF}k8}KiPTILjZ-)hI$a02m0>9vzyj+*Bh*4A>bM()Ks_eg=y|GFQV>(wLPV&%yc zx*}2seC4}8LG5-p<+G!7Et#|ey6WD1>G^tY-#7oR{j=Ph1=D*k&8IsinfW@->I0MG zQM;DWe@}AH*J$_G_FWGosXI+{_UG79>+F{c=9w$oQNqWm(Y^QOicZ_6*=hlMk5`4s@Lj4K`oB5q-Fox%Z>Xk57hoR< zONj%}dv;CFY{l7g8uZ(IB39M*?DweHerL<$6&GHPdavilKoKSI>|#0As~ z`fRRGXfa^Hm(SC~GX#J=6ZRw_qV*5a3 z3WhTZ^G&Ql*jKb~O`d+GyC{W@p*6=KD#C$tbUZA|i)b)dsmaklEF0wYNG`GrM)(Y7hcV47_fRJNN99~+>fNE_43lkXFl1{FRUG1l8hI=R~) zP0mTUXo8p#_WofQ%xsY@!57;Jr7t|pt!dr{@3;FdrzQDRgQ4WN!EYDJ%~^2Y5a`y@cbrb2%@Xlhuh?K$a*GDf!p~~zx{%T*f{nYw%YA%+IxHIr_mxk`e=TVC+oMlS}6%rPlpZ2I6#dR`-cW zBzR#PtUFDUW5YGx29>zf8;>t()K!{)vRJY`nfu97;f=KDLX6w5!!-W#6DTIm5-n4> z4xz;avLSL`alGLo(pb-cPeJP!$N{((Znwm{Si2i(qD>2WoLm zHOB$t=nh`%3f{iN_r}+JLljLB%2^$77a+a1t;rEx%i4@D<`AcnXj_C7G6#Ylr41ruYv%8Dae_jDu8Qi=$4R?qC(!ji?<%&p*HYC>#+S4=<7r2Fk-xyeCx(f?_fr9* z&QVLZ{=mKM+Z^N0o%osQY-eq7mhbF%%g3a(w{1-h$zyA`_WJ(DN>8Lh*A&Ek>&|z# z?VGt;jb=seYu26Ozd810XL%NE!`fl(NsziXMm2UYR6wwnd1nSK7O@~9Ux}p53TL~UeUbqAgYq+U>;Z` z(mH#iDqTCZpF$l51O$UVq>a3)o=>gCj)ZK%GpQw{X`sGX*|_tPN@8$YnKS$*&``OS zs!sW&Xgv_R=oCh}Hd)E4e53+Dn#A_WPLv(S+Tj2#vfYZi)38fkpD7MLgH4K} zaEKCbW{~QnAyo*oY@`E(qhk_NgoFhIbyMJd%~W`mOjEArTU%d1$$he=#jdNH>()Ax zo1GUn1S|L~d8;zols4bLPmERjmgU#)$gttw6MQJp8kais;G@$SSdc~)E~7{Kfj#J0 z6jsATm40}{41*-}JM5q-&{8n5aZ+??H_cGqU}8q%CeMYLjt}s%tIfz%jy@rN(9_O) zZ3Len*`C$2_hmnIv%qZ@x{o7Czln=AwvvXpHP>FRS!B*V676L$^pCgKcU`WmbGP5G zd)(t)5Nz46iL|vJk{sI+yx?p`ryVjhB$mY0Ue|)^MXbmI84OG^keR6Jd6>3n^jLb3 zxZy{vt!fA z$BN99ql`ICS=lyO;rhi!qiY_wjhn(`nP9NP;7B~newiAx5I2&iNyS>R1UXBH6(OWA z#nqFlJ!-XP%~e|B(Q{86$JdK~8F<7A@KU1(Eo$@%;ZCn{Q zY(byu(r|;I2T6l`z3h3t+n2~8g%HS9sCq5}c~5TF#_W*Qq_cMmWl(oNDB0(yhc-)V zZ0aA9(ijiFcPq{e{F9CV-gk9c*A>f6Yxx+3gn3tvyhKE-<4rVIQI%yKBUvf(W^~pcsKj?y=}h0OeqxxBEnhTG>oUB1kIrj=-Wm_#`D+bAg*}ptbVbv1h$v|v3gkUfvJlRP^#FXd|8J1y+39<$R#)J=hlet^T z6sj^4hI3HHaFeOFgxhU6wjd4%lX#ehCI55F zW_e}l{a9tEm0Vi*tXw$!oPig^IlbAX$E6wp$Y*18mW3=(327$rP?6F2hJ_lVdOyA}mn_6O!i z?I^IDz=&SNV%0DRa~@zn8eE;7O=}@o_gPI~pyILNJ~I8!iWUk3$&_JEK|UR3Ml$PM z4j^L=kE(;p^xBde?`OoQ;Hr2_mz``wO@$*J*Eb%L5Ft3?f)GZpA%nOdi|#Jy>4kq)IuW zEBbwU*i*)!{c?x-;0Z#sO2OPgl_S}(*D-Zj<7>}34Utl*-{eVxs}F=#oNA7mL4fQR znK#&k=9pMwD=h+JBmEZu$H16>ZR!I{V^fYhD_|D%sJs2uK_%}WA+5GG0c3$p5UsnC zlIvk2-lUWe6IqWANJaBPxAB~4W5hA|5n~x*&X6*Npzqo+yFd}#^b?n?lt6`6UipfL z9Z6-af^Oty@1UP^PnZu@<@Y}^4D&B&G%w(>Dn-mt1fw4|dI*{aqXan+l19C^m3EH? zN=gw@%%nsLwYf+JUchvIjpdl2|x@tdkBvMAAY^Z}(J3z8wkY~7} zW7fK^2_gW(?=+F`qWWDp$X^q;>qJtEF17TkA|dF<V6M$jB^WP%6t*rm!@AV8ohzw?wR0lZy0| zO}b5BYTDrjQ^@uyML3#+J!z3M1a=IRXtNna5VkGb_;gw4Z6B8({W!OuLPzD{Kw+O( z=`nj5(OTHjxQe{ed+`abQTCnuT>JJ~d2TTsh}ArBFm~$uj)jch?$gEJ z#?l=l!QW|){Tq1o23V@DTHqT(k6+lC|1k3Gh~1lwW&0}lT)L_qeY5Agkvk1759`hM z_P_hi6!&t{v5LOs7i{>#=NNjN@dBZE?l@1p=dQf|Pw(??^(_p>y@Mueqv()fA9Pw0 z4$Vw*3XTS`{xP4v)RMnS_}m#D!MAt#z8BifClsal2lql!osfkCNc?xJ4N5msSKw!p+nn30` zZxCb{G{JgOC-iHm1$o6(uerkvjx-9f!=mY889~7T$D%lycA@QQ4&eB1Osk_UE|xkO zTf?tAmxW+o)~pL6@F^TrPZ<^6VDGHOX+kTx;CmymQ^L*;mp!YFoTyY;Doi8Pk^LEJV5`LBFS!rjzp4OfZr)I=$TMi z3T_X6jG?8fObe7m%!Z{EdoqH~$;jnMU5tk*VFX`Y#H;q{Ho;gIv)uBCnDv-?8uIG# z&{5`hV6sHt|JSW-Oe^Dyx9p22Krh_UT7RSH<-1_;6w!IK%D=Nw8uiakcbJ*`l8A3v z$>>8uRDk5*m7$Jg^Vxh85a*c}w)zRu|}W@*|p*Zo43TZGfwP9@icuDF_rn z1u~UBGrMnr42nTOC90WLIKz*)Xi={up{Wn$bwlQ3M!ZC&6i;=@pb8@k>iT zPPAipRFSv=sVitW(+~g~OG0E^pnkhxCozP8)5nl=KT7qNjR=#L1s7W;3F~UxyF^EV zuzdKKbVb3G@;FN=B?c`k`_4#KE&sHF^CUmRUIR&Ge6iw=MlPA8C@bB52Ly0MOLid8 z4-;>U6AWXAB#b z#MQ2oK!2$^X)bq1WMRay3E3bnT)vwFpWq|psan7nqyUOEPgR182sfi)>!lo8s0~iX zkufB)%HKB`1d*A&rw=gBpS8e_;9|DmggS88x|9uIra21`E2?{asR!;f2FvhePyCZH z`_TMss2Edd_tJ}wJ$9a;<+aFDN%4^L<5ZJji?~im0?|A<;5U{br3bBTiqSS(ub^+L z#z!6MW~aC<_Zu{{cs8i%TJT8gDUZ-mqmHkJK@l?DTc9chwBVnUph&w>(kA))(FQ39 z=g!Rl4UZ{lh+JAXzn*vP7^#}30AteI>o)+pi&>9u-Z@x{e}EkOeA!-`E&AotCvqr1fVhK)Dp4*wF}YsOsIMGaVA*Qn zNn(>okExr>ejE^g2v{4|Y$-)N%RK_wEC71oJq&h8X7vjt!7x%q0Y9Q&J&&bG!ZXs! z4BRgV*${frAiH*Hu$0QAaoe+rPKvP9C%yZ+}H!(sI8(((tU4e^m*rV^402vdJK? z7JV&N&)fAs$ZeRpUwip{p?Q7(#Jj59r}b-7W$cB2ioao%o_V6?ZpV3U>c$tb|X-Kvi~_Mt;% zP9h>wzmrDzBgjKFn-V=>O{(FJv$ryhF-g>q+rm3GR&_RZ9s_Gbj<1Y>>MVQnK=b( z%}rel6QYHB!w3^#>!$VPaz}M zWQqf7Wm21vI*TATgQ;ALn*tC!@?`k5?ttB6*UbW&irDuo2GI-wU91m*X80VF<&hA| zzfIZ&^sSj3Q5M&>7UZraoK3-QhX10uth6Y9@+QOk^#l7=&2XjyZsHqh>}s4{wNEw+ z@~V$NHUPuJVyEps(8mjU zgefv=3G7VbVOsWR=3*62D$-?=RS-~t^2#o@bEnVa<78wT1Q;laHE%PSX{KUisTr2J zl8<%%r>P=waAEp;whU8_jTaR_^9dZAay;2`QiyECSdbp%&{qchg35>g zya4HBD&)az2~%NJ%ZC=ppKg2<=}E#=Mp!kDOTv6n8W|?-Mea$ZA17H9!Fw7`vgK5_ z^4%S#2C@c*g=Hv#I4Yb`X&?ah#!-1jQyHMJgOT!~gvq~KHdygfN#12dSujaB62%Dx zZz-@-eGJ6vO#_uv1Y|-WP>|^A?VHgVZZo74+oq0rLpVCB1g?*g&mCyHA-q7uCIaNH zyOIiCXVAO~ayv}ga4p(rV*psgaIrP-q+)XAF%3Rde?dSG5QPV8H(G-tA8o>z8eHFx zy^~cJmZJl2gp7=FA&kk+EZWzZ7G_Wz#mh~Lsfs{fCNsN8gV_|Rki)=`BL(iS2YxDP zcBy?>;y~4(bY*RZPY<2<5ORrm8mMH0w~+YkO$h*q*jh9>31kk+Q)UZ4k9fYUpRL9$ zZ-&{}o~TLBS9zqTU2>xdnY zS*)IOYHBWf?Z72JX27>ntgoo3ydXREUHUG@@1&^Y!K2FlmtwuZ)|+Y(qiJ;D5W?$^ z!UfC@vz|?2@sC$Gb?KNej3}m(ipDeJ6FUZJG=&_>2|VZ9Z{ba1{6po)lFpM;>_Pbr z73J6F^WKw>(YCD)z9%L3g51yVzV$O0X{YK zBsu+aC_k@nA4H^Pc_!LRY1JL3lga89;AgktuF+ABl(vdj5F`Y&%U&bQ)IiP5+-G@^ zSByJ2hh}YRuBdfeRv`HUpl4@2+jeCiYupfX{d>IUTJvtxr#o!FC~H2cqgTk^Uh{`r zJ(ofcuA2u={++8_6)i00ubpM{^|a+5arz5l=9_r?;urlj;qOy?#p{cQ{8YN)U481i zNO?=TF2x?de}C}xfW!ZFOM~^M@UGDMT0s2C)%FporOSSRX3DA8l&kmje~kHm*a+P8 zm2ArcBiCI=5GEu>JI}fx*L-B&Vs_a<)@{OwWjhFZ>fs7i^p;50FpA~LZLs3+`IfW& zflf5F^5^QKAZ@rZ3vj1#mHuleTJX@{e0U{f6l*X$$$nL~ZP&atM`~=-D$aBh=*cXV z641mPU^usZd9Pd7M4n%ufC5({#FXh^ZLnCR=|-FZ-BNY!0ny4q*Y44Fi7c3y9_Y-H zc0P49D)!SqN+NHd1-AW3fLkaMADSI^k&ES1r59IC&Sq`$WH|1tGV z(UnEpwy|wn728fKwr$(2*tTukwko!5J3G#+d)qzjyx;XRe^#5bkJ0tX9mwCe8aCSz zD&f*0&Y8zsm-M!VYa=13L5`I(0#mLfo-dh+Z59nD4wx;GMWXZX4UY~)&u{*tg+l^H zHOVIFwg3?$sa*oD1Ig6FN>AD1vK3(oYh#F>@1O1@Dq55h9#&nyRoL6k2BkzSmO^;m8LZdml$Ts-D>P?^vx zJYp+pG*vzKP)TWu9wbgBUNXe5&dfzkFWs<8HdLsFP){mO(?iHq+y*mLXYD3f29dbq z^J%*w53_H}nkH#W6jib2Rpx_=5E2|F6Rt;Bpi$x)R=c*WJ{HxG0PhHW4JCmsM(Q+> zr$KB&55Z0EcUnB8j=xh%Oj&-A1+Ut*-ke{7ep=Cwb*iu!aw_=ej+0y7&#YuFRZ&xY zyQ8X9va-P*ssb?&9Ksva{ex^zqt2Pn1GyVOpb!P@E_F4mx}xfPU#iDFkqd;IqCywM zlg7Gwj9zq<%9&6cQu@3mBVyu;h{(WaA?DqPlZqrHjjw^k`n%Znp{H;J^BT7JaN9NK z0qV-%#&~|6(*X6;Hmhk-n&tpn%T2C-)S=i4kctAw+z-5a<$Z@`IGW97+uuiwH_yyU zEXK%EG?H%qb?ci)}0|HlE=+HBqtS z=S<+~(R#|O1x-vVj+^);`R=?z$cEozix8$m4cS~d`;xp^TNTvJWH;=lKSFbaVE>Qx zKbNv~4-wM;`Wx-`{ak_Lc8<8+A#hDi$dm4S6aqN5_v@TqWjJIJcjCj=c@WOK{;U($ zgpKm^E6)?f|7__8;>+#jncH2YH{SNM343iBd#}5CyG6Y4Wo5T}nE%;A_It1DJ2d(3 zeZi!E%o_askM2ca1I-~D>fzDZ$#aEcBTFYGov>_;2v_IUUOK2Y~To(p-NHVK&=}j92)k_eDq3;UJ)^w3)@9%svQZ5EE-OOM<7NI z3HQ+9H@y&%M4hS4rk9XmF&A3(NJ?}#aH}qX9Kk4bp^r|%nm=AlXTGXZYMVh;Wykv# z3=l~w(}x?7X1Md>047~$I6}sC2p|btk8LiT;??WMZtl4&2viW<4!Lbp)>#dIRGH*~ zcoV(5py$mfYFYx8oTL)p|F5h|@>BV*bHO^8j0{qzy+6l5hA4Oj9bc=$6YbrlFa^Jg zgo`LIyFX;f+!DT=2E5v;7b!}UaZ7csiXYeajIFUQ&99f<`?W(y>KsITJ%>0S z&l_eDR=F^n$)ME}z&op+8&WkITmIS^lBg35=Im>7KO@J6@P)|7I6xGZAZwAPnK8!C zyIBB<%2$Prhv2*z5PL*{vR;r$&JS5b6O*2=I50p4yD)-aY$VV_m2YGqT?<73)eDxJ z6^Jp5tkYK~1zt7*<5Uz!ovXz&9Tt*}q>F8)(agnVDONrHt(|mToNOK8QEXiQ2;9^6J zNpWC>4o6Tc%LSYJt?PxqZY3Qg7%6PnYV)xjK*YMo>Pae*KrF5iGtFk3P$0vTtWuzp zsE4G3)H<=KP3hGRg2C9voM5q6A!}JSljaUxc|!eJ@6~Rj3z!LY-Eedz33o!nSG;@q zYYjWvXd6MFx?-D_=3aPF{zjFuv5puWWE|4sO&RMjGDyt1+vUu7@# zItG@gNER2u*uk+Ib`i{hh6XRSOQQ7A<0w&5|BdYVmo58l;KL+T|NH}`cM#`tMvo1c z@#R1(^D4BEqiNHMNLwX~&Y6(+Vb515A{kkx5k-}<_RTpYcyux3AJW@|xZz;X%CM^y zUHKLV3C4uB_5jqUg7-(qPmDP}p;i?)9NURBc4_BSq@VB%2=h||79+_%nPnzd-ivb0 z+Jv^W1VDS67(}2c3m9mLIDVMzfmkmX-=^OI8s8q{kYSO`Mp0FB^uA3-oVe%A`e?56 zOl4*Hf-D3T(zG_Dg9a*hb*;cf5*Mx9zic*DmI-7~9yB=yaIz5F;8YpE)+Ii?Cn!c6 ztJZu3wHeIhL0wZ7TUE>suWzfuc{3MZP?rZw*a!05v$i!0XD(2~F6;LdRu8kxIv!r{ zt*}1 zwO)_Ub=gCGaE5*jo0pE5IlEt+bxOAzaCBeINO%8HwYYz@vOs@hrP=5h3 z(c8~9QDm!`yR_2RKG*U^YfcxZUbGNB{{BTq5@l{kmBU0f zE4OVk1p)`x0OGi)p}5rQX-pR-h7yAvZILFd2NpW~i$$7g=%bGVZG(w@Gg7xnoh`E< zS|PFy_z*0&?;ZY54302tRxZ?&9%7ltwAq-9!f8KyW zic+yh3lVP-Cy<6fTo};^Bj&F~0!4&uTdQJcdG4EkV{~dJRe-q{zs;{qEG6xQVn?h@ zbq0(e9v++`F*;tY)bX1cBp04ue`pY}wH`Bj&`32`S~aQdKVt5;rOoWcw@Skc*tRyB zuFQ;Hn+T!vpYL1oWJbP6IV2D554+$W01HU&n7S(GqC@SxS+m~jHMoN5PSPy-GgZgn4gIuU6Ze|D58K}5-D;7@LN zY@3_5Xi<4SI=^i{yOU!`H;o~F5)&8&C5GH)@E|$>B)FJF@viH(;5o^rhgOyCXEiuV zTf*)4z+>kQR>oyg!A$63@lO&dj(DHz%ForsTIGV5*;HC(qS6sb7wd=>w$DwVTqmA_ z#(e#YHh#$~e~UfPDp?OAl(RIc!D6gAf|+$YkiFRs4kK)FEko(3nc$)#evIjOjt-9? zoT>$o76d{QSvz&bRYiD1i;FxtUGLUd1FR;7bd!i~gV5DsFJ_};HM!ar2u*)$BkyYj zrIGDgrR?W6P%|Jy_qQ~EhL;P+!p&20(3&Ny#8T!xA0}oSu#aH;R~tN28_`4ZgcLW3 z#$XLI1STO?Ash&O;ErHNO^TvfziwV(N)zb!0IV}22WiW%0`1O$m|%5*)B2Le7)^S# zs=dmhmKRx$M;yD%YV}YkIp7SIGi1Ah8r>5#?F!>#|94G#z|3X)z3&{?uE@f4=W)?4?UOo_S`EP7dG>=WSWucd%PbIsBEoww4vd=k_artA>lb(2s?$1X_anPz z=xsvZsqInwww-bGzspWr%JG$HiibpW<|SJtEa>a#c2poR4vP3Ep-m(=J&c#n57&{< z6ESuilzYn@JxIvR{Sb4{AQE{mTy$z6Sz1FcA1WCg8F?NBV}gC-vWs=;9(Ad59ouO? zg(gVO3^uoW=8$}}CS${44jS>!?7KFdy|RSO<026*Np<*Ba>21ngi2FWROCXEeDi@_})--&k}E|b7 zMF*~@hTeW#oPwzwD zmS^@W&;In!YRr#iE#O)3vhM|2KF|F)s_NsT_UrQSJL|gaJovvWy<3aZB?@}V@D)sU ze&Vkl*dI7f3mT*)R8`>AeOXeLX?$Hsn4`@7G!8G?N))Zi>3)}h`KJT7dc>gyq#^5# z_7aEz)tWVfgC|d~;e}3}sBWtVO;90R5eP;_3KZS8_CkCtY+lEQmjmR@cLt;VY@k2E z;DE>unw6|or$J_Ek!3iry<#+iezY11dUD9bED23uME1H63#~Q&|DFy$D4XSY4mL5J}!(RavK=B@LzU{30v}O8%o5&L!cis7B5ND7i#mK<&Rp1Hun$0BqVhJ07K0?uWXaolwvtWaCH#Tj&lMuBo!FjVU*5QTM zn7Pq#A2s`r=JA_&1AQCgFELS*(s4=od=LjX2-qnO1OGdmA07Ol3b#hs%-C|co@>3BU~jm-7ou2nr~ z)6F7g$UT&0aGd&hS%rnvt$l-Hcz* z8v1pd3}WynL#l{(t_td}hq>9v{i#$A)7i-oy*W1k1be;0j4IUO`-IkYTmO{S6!~=vYvThRml|hyAr>zH|<&Z zQ&VwaJ^(@Uv0fQsa<`MRzHBEuU*` z=A@x^Fk{9AGu1_E6-II~kvHT5&xS?2$~-XeoHlYi(tqWMrb9IL;tWi45ij=Gq*|_t zffTy`EU`eW06PuHRA}Pn4U8tuC-N)rY!oN99iP(cbsba>aeq$-G^r@y16H2p<)=Kk zQ@vmz@{AuHREl^clb_&`v6PAPW_SqX_22V))7E|59^)OGK&p9M*=@R$c7LL5-X_n3 z&1G^(D9L!+K{bMyrh>x!AlA+J6R|3}I|wS&DobbyKg##YNa{p{E+-ZWiWQAp;6IJ* zNa#rTmN=vU29kZ{OSbASuujJR7@cSDSZZ z3y)9e)`HLsemZ;jfYQ^`Rbub^{gUSm@_v!aAX~-1gZVEp-uDYkfd8z{Zo`~zM{ndg zBJcG8+f>&*S^j_wTcpDCsV@Eceq#nrmYRdMvuiB~QD_w3oW< zumA4!3Um*(4YZ%>)XMRBQ(||2=Aa5!LsSd^X&igkAI?bN5a3SJ7rmckZKk^2d?BDi*> zz5JVvqXWZ?Jy+*{w?cvbv$;HC_lrUVx#R<7U>INTw3eIW zktA9ObfIR7SW706;b|>2S}h7~n(k)1-z`U4dqOs|}sZf6>VaC6X8IpUk+^8SEk~ii){xJ0l$dr)>$B&NDubQ`pFFD2{g` zyQ@9sby^U(X@MzYLqpKbSOf$+Ms4zi<|At$=s;14*Lk;aM$fC>1y-^A$`LzT7C8db zZy*bh6dTT#h8y@psOisxA(JiRf_dkZrnzfK36; zfS=i&E{d^4vYrAU-l(!usmu6`mp-^_p{n*wOSMo?K$tj2RNP`+hCRPznxU;NuZb!@ z2`MS>p2MC}2sG~yf?zzZhOAVPxpgei+tImjYB}k8tToiy6R?vDml9Kx4Wx%Z#N?4MVUA!0*&(Ng$9Ox%U1F(j{huP&VVQJmVf7Ubk45F6yAxxr|R1Fn*c*9kn6E{QBreTY}*+OVi>Ijt()K9I1N{Io?%e-3?Zc^n2e2IBAO#l$cs72d$n-=l}gH=s4 zBdiPO0fSgrEhvroj2!q#+k1lvc8WYGL_+e!?_!U6!WpN~hvthj+Ab}qiX?o_{iFp_ zH>NL>mX?v>tsNi^qtlRgWCIU@+a}&-xA5d-LP5~~dab^ft8`(}si^gO>)J%xwDHG; zfU&NcV-H~U$`{AJTFLRtm!^?)$S=?KO5cAo#d&ePZb(+S->5q%j);8j55G)&*747x zj$W@#1!=7wQ6C&1yX{#V35vQ<-nWvGm0d}R3JH@tpmfA@M<#<>;Hv^*T;?tspN1O? zfZ9sl_?9=AEKnPQ;U~w}QeR813AlU;_v!%C;}aS;yH6B2gH%+O2TmflQLLMdvl5TU zxA<~3mwEL8JI_Lx5vtScb(r*y#hJVLg{nAzeOFXoRs}p0t`Km^*Lt)7Ek(k$vz$Q z<5--mKTaED(28wE;0FD&*`6~}N)h8$@2XLyxf(K`k<|q)YyepdL7XPChSWG6HeMI6H zJ!1kNgo3S-E65I53Kz92(6WF~GG27)=y;3s-n?_6S6ga*5ym*k*;p&ywx)UuOyyAb zXn#~Mt{V#)!2KnLb?~VC!K~wJO!0W%jYK7H#SypZ@iX1Fu}t=A74_N?qJLEp_VBpo zDv)Hib8nhUZ>Wc8NNoeKf1#X*eWt3vl7{wm(i!3=SKt9>8z1bN)(-q#Zr+O?(|}7V zPFRGy`D8yQ6vqyO6e+_K>Gl^K$jJ6Hkm{F=lnYrCVQE@#u%Rkk;t5g~modU#e=yuO zO0=F($a(Bcdm(c$Sd5R$r}ePhQ=%zWSm}8BeRWowqCC?A9gzrdoN1{H>cEVz_ms5geBdqB3!_ zZoKE~!a06A2!^QR7|=V4Pd3)+RA@c1O>oQMy1OrkA`t3PG|V_ z5|8b=x^DR>EPYVocAB%xEEdD(- zP^4Qv0rsRk#uDocI%bkqUfBrrF^6=NAc)z~)$Q{#Z9OXwJ_R37o$g{QB~4B2C_zw> z8g12?dtxB#e`{R9@x~QFWiPbKt*m0C)O-J&l*7}{s4&$Li)mj<0s$`HF0|rWJ!U?; z%jn1?O8YAz%b#f*S-9j0+SFB|q8N^d~`&B~r6(ysd1F7wBgeh&Uji9YCOJ(_jYP+xf z{-XsrfeT>tVgj=}knUNMz>pQ2(J3si4^X78I~`Aqn|&nlJ^OfnxaP0Ms{gZ28y6gG9Zz-~sX!#+WvHTKq)zq|h3w*}hg zGJA7?{a#yq#S-;_S}T=j>8*&%u;gd) z?vCSpddn7T4qtD&^1{|<7l1lq`{FwM_{i-9x`ci3+5LX!&y-1l_`F}rGepOQ-L@e= zJ*Dg>T)+K~=lFlUa^DV<3N8T+L=RM`a>49`>Fpf1uDk7AH9^4oeX@)yoA8RjYps_P zuQ6bxi$LU*^W!l*TW%6!^F&QVj+UGpgGb{Sm0$#9xk87RY?Qy!)IjADz!_HDAkEzv=~J1+Dhz1omu8Ly!+NklZA%N?+yny+&tw1H1OX z9bEhi`W;8TOC>{oBV+xmK(Gd&7ACsk-GRU|Y&rO4tU_|x?< zm3;HDvmHW`cM`?qLqM(Fodpne9{72>7rcft-pc(;7&jBI?oSyV0F!^8)RuMt3u#l| zFPUSs^k4U2GD0BRGgTOEyUzgPL$H}o;CjRLh>;$}$O3OE`b&q+NZj6`s*N?B0@lD# zos!(R1xO8I%Pye#Cm{($xOsfF5!)yxoz^3$r2a173KNu(dIGJ>#uMA8k}}c9sph!r zU%H{jd5eMtmqR0z5K6jP%gisHdwjO2azF&8%c{#Hp2zRvp-Qi z!Oo&ulF^>k7Q5KTfMFr~i_mUWwWde)qD_5*6%kFO;ctWB?)m30PQo7N{00t9l?|aMF2A6!E`OMABi?g-4?Pz5V|Ma{IRdunm z-P&MEJV#X~I%O3uk$y#R&Y~ow`RUb!5B4Av?StV~rqvf`Tl@?P9@~a3&~(K>-Ni3n z3#uq6{BuE71PXThj+9G(R$ehil$eY7ov4(IrF5avMtD+SnOq>jLUXL~ii9uXbZp()Uu@Rw0Oa!xl~Xn5_c}#H|^k{cNNTs5h8j zfFd*s^40MEQ7>~KxxMn1Mycazd9PJrj$|B5O!m-WF7v6}D2@kA9!hhWd3Y7OEfZ`n zFeJi>e?O<)RmuS|ZCsE?!1sw%d+K#W>r}G`4^(n=k?bZCjC4QqawN9u_9w~@l}s4g zYt)@S!q;K0dNpCMqoHX*Aw@W$Ng6~SeA7W!&7S{Fj~uRsqMpYYCrX4(%0RI=ipdUM zR^6m|*LD&Nk+SMP)Q3r+y+ON!Mc=a*qUVyX>0=K`1Kr;3`Sg3cGWO7b!G%{ja;)?{ z+bc4Nik&mWp{+FzFJz**=pgNgfYl)$JohQ$dShuL7z*gb)kmMWK;yb^l;r;?(T~1)KzbgXKr}LD@0G(#{V9xt4@_}Np z^V6*}zH2zW3i)wA0*mp}2>E?{eX8()D;PJ{@+D_Qy*l>84gb>C_ge5HV36}s=l8Jm zGqwDEJSrXY{)Y2X^R^A|i(vh;w9F4!>kEtdZfg3WpZR|4`YBlbAD{654$(j2boZr_ zAmdb!)~~w5z|o&WDeEVtgdmvu<`P&Gsvu)2cL2#}D}<{*b$S{Zlk`AmFS$5Ct` z`C(GL2MLYY;nx?@ctkMyS7HW~p^z(Z_slNy>%evn?u!sYB<$$T^!Uir@Uigkd+ihO zSW&z*U10o{9pd6sNeobq(M#s>=&B08n0b)^5jGQQ#T458`D+&W_%05x2oDCoqOq6o zi@nPsf^ucrfN>5>+Hw*)$!TDGC!!9MZY*4P^D*&)a0rP73xF zj*loS?Sk{glEI@T=;5+XkU4|ohagFG=SVz^UIv!>GMq(WD_ln8pn>k?SXk<1YrW1} zO@lEd#fN>Hb)t%}9iR{;FeM7frj3CnRc>%b=u8}m3xT74PE^8W;8 zDLyilkYa@u zvQnezTap42NBfYxF&m?wUhuE~pd4~(50q7$;&dA#DGjM*i=+*1y5*MeTYfFl!alK^ z4p?tqO=e7O3p-0Zvf4WKk;rv5)fLFrJAgU4zU$CvaL)jST691cUU(e#Vy1pB$Vgr( z;qk&V1vKHoVh2^(UFirkaY*L0$E#!Z(e+s%`s4f~!&z(8l2NiQWKl%g2GngvY+*Wd z`dAjxOgJUM%nSTl3>1ZDSvh2}wMXpPL<&~}LLGysG?WY;Toq=Mt3hTC5LAc|BWDYZ zZAnzuGb~&3*`4_-5-VpPOcrmguu;;j1c>i|-$AU!o7ptl8&nFj(OQS=t0O<|XJ#uaWH z8CC$9g(x)!6^IP6_Fv#;aGau4#QZN0@G)+t$G=nZLJr583$kPyO<<+_=f?WmLpyPJzn&_!k`FKVDJ$HxsE77>?-~hmD8c zkg2x!ZaP^%G}jfK3T6g7kC4+bafdcc1k4sN7N}}Fxi}CeVMvO?SNBI<%*s2K%(3`j z{XuLf3jWi{`HsKy&G872r1SH0Ql7^zvbg*=SWGipvR0 zR?h?2g-~IWoJmIlW#p{(ns03jGC6acSy{y@rLlYOL?wm8@r0o{9td2zx7aDTh|WW| z#2I%OGKohT+#p9;BE#F4RaRk5z*)?(cow02fX!ZNYAmaXQd zZpJf!N{{%|KRnB$gQa#BjUe@Vu?E&@CRHh4!O7m6DV!K!386>Y^9}jGen^f^m|kj) zPu`C)6>gPlFSR!6PA)<9%VcsvKzr5S)*z3tnoN{WcXjmWdk)u)d8x|@?6*u0?>{eR zP1dSJ`}b1Yaf^Z(m-soJuHD8>JMUI310=)qc4pF6 z1sJqzw^ys_g!C*b^_{%Hw3J2XB(f_YROI(BiM8K zGvan()B64|)yC&vHwruIL7*?IRg?Po?|*@xg022ce8ERF7VWLRL3!9%M^8RW_jdam zAIH8Xdz1=)v~GlWWd_aiSVgnf>;I{80-zj#Nk8Oq(%pn36{n@a_&bVug(K-0113XG z9R(pyf;+p?2JwO5ZDi!|AGhYiwW1%aLLpzl#t>VZMj)n6D=TX7tJjK=Ox@R=F@cP{ zqHifgv4|}#T3gv$3A4QmA#^wKLCS^b&E0d^*Mr51o=Ac*7f`Dpf*|4gWgmcOnsB3c z#sv0By)tUo3$ha^aL`PK<(i~HqRvU>R7g#L1=XbPY za%~oaQN0Lto$LYxW=pI71960c1RObPD^vSw`0;gn|4<;z{vm~2=awG-LjzQ-FEfk^ zYff#PuT0pqHbI9pDl=sGRzlH0$BZa4cB)6W8E@`KgLkj-k2&a3MApjOX4sT=z<93v zbB(mbV2@?L8f&Urk^rv!_%(GpmGUtkd)fsnY8ZEUcnM!LI%N)AFKx_B^m@`^p@hE% z=dZ0!vGWlfYs)5+X(+nym^L{aa#)R6iyd(2vIh=qYoOCKMJI|wy7fZiOR@BJ=or*( zy&1l@Ek*$B)tYaO7D0x( z5v%oM>(G^>#NmsIssbMy6@My%T2Rcls|%`%akBM0(D)|x5Td|zHHn| zWst1}FXIiy`_5F}Ha2Z_oerzRodMuRzV`8qP08*$Xa#H*VWO(KU1^sX8I$cG)Z4*o z%A*yiVi+cJDE~6dk_(3;E$T7H3*n;gg;oSuVhP>87mJ^Lv94?K@v3RrFjuqjE=l_t zaAn>LCt<8vi7RQ;A!dx;r#C3;AEO>HTw~V zj+yp%y6Xiwy=W51CiasJaVg6FvXT>+2%p#*LQgg$&dfpI8Lf0wFh4km3{kR*e4-P`4HA*a(_*T5Qy>sHB-)ZXZ(XT_UuQ%_G z|Bu&Z;7IIbRSWz52gt?xk2l=1O&=(hfo#mH2(&Sc5D?}p!=J^rja08D#6OD*K=iQG zBx#V7b8J>e9B@$896rLr7Pm1O^&vbmPw0PR1BbpdHgP;|QwK=ESB>xS=SO^|N$K${ zq%{{PLXE9&uWEtTa+qRaVWUy4&uFG4JxC=S#*)WT3s_$vxv>^<_i84A8qK17x6gt7 znY-fIXH1M>hpAwfo?h7^z? zqXX@sguHV$mY>35N+3scKz9JeFlHaT@<&8b%5-%bFEU)Ak~(CgSJ9B|ZscBJ1olnX z*v>@A;Hd+F5eVuq5m+H)+POBMymF$$j4t?5LP928<5Jj-EQpeOND=U;Ub}10 ziIZ4RiOn7*&uS;n9#!auIFOfzvT+?yeiZu^Hr_cl@4h36OQ>Ov55fk2aksvtoULhp z&inQ}@T%Jx*oTc99#(MpN5j%&TiSK{0*n*uUGJF))xSQ89880~pt3%~Hwa7}5=2sE z7qD$}+rk*ba0)WE2fA6o7CM8&6J-hOa-RRHr3N66!#O8n(GyXvL>s$WS3vGwr?Rei zs5wdCO%zC=0KzE?v^~TE895V``MkNzhBUl=;UZ4TIo52e4Yxb>XCId@U2Af|5~T*L z-RtlyKxl6AS0A);QWWiabT)Y7ds_^+9m^O3%O@1~iAQ;(kDhFeG|O2RXaE@?{_Vi6 zo%1v*8nG&%mERH(Mw()*T&2I}_dzy&kkO?rOrSE;n+`Wx5GCP34{nJYi7U=ab>4=s zclX^$(i<$h7R$U}{<5Zp=*4vZJzZhBze}I*>JQ}M0@<7-5I*bKzJAh*N#g1e3nSvw zkqLEmEC|oxuNh#7avf^V1oz)UI}7An(D9i9fkLlMQ$ZN72O@(YpHtQWt(HvI6E0Zy z5_21?7Y}-KeePN9S@paX=kb2#nsv-^85SAR<+~9t)K(p!RzL05E8m3T1AF0i73|V8 ze~Lrb#Xwstq5K9z)Rov-0|CQ2c)6h;>`*xOR5=take1lDH9I&91VYTt3@KQUr?5

74Z{ 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 @pnJcLo0NRzPA8yi+_z|(m_ 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

8Nj-`V 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