From 809ef778989ac200cb7f962d63aec9a406f48928 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 16 Jul 2025 14:28:56 +0800 Subject: [PATCH] first commit --- README.md | 10 +++++++ appbase/__init__.py | 0 appbase/businessdate.py | 47 +++++++++++++++++++++++++++++++ appbase/init.py | 7 +++++ appbase/params.py | 6 ++++ appbase/version.py | 1 + json/appcodes.json | 22 +++++++++++++++ json/appcodes_kv.json | 24 ++++++++++++++++ json/build.sh | 3 ++ json/params.json | 39 ++++++++++++++++++++++++++ models/appcodes.xlsx | Bin 0 -> 17811 bytes models/appcodes_kv.xlsx | Bin 0 -> 18876 bytes models/params.xlsx | Bin 0 -> 17612 bytes requirements.txt | 0 setup.py | 52 +++++++++++++++++++++++++++++++++++ wwwroot/get_appcodes_kv.dspy | 16 +++++++++++ wwwroot/get_code.dspy | 27 ++++++++++++++++++ wwwroot/menu.ui | 17 ++++++++++++ 18 files changed, 271 insertions(+) create mode 100644 README.md create mode 100644 appbase/__init__.py create mode 100644 appbase/businessdate.py create mode 100644 appbase/init.py create mode 100644 appbase/params.py create mode 100644 appbase/version.py create mode 100644 json/appcodes.json create mode 100644 json/appcodes_kv.json create mode 100755 json/build.sh create mode 100644 json/params.json create mode 100644 models/appcodes.xlsx create mode 100644 models/appcodes_kv.xlsx create mode 100644 models/params.xlsx create mode 100644 requirements.txt create mode 100755 setup.py create mode 100644 wwwroot/get_appcodes_kv.dspy create mode 100644 wwwroot/get_code.dspy create mode 100644 wwwroot/menu.ui diff --git a/README.md b/README.md new file mode 100644 index 0000000..f49cf56 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# appbase +基本应用包,主要是提供代码管理和系统参数管理能力 + +## 参数管理 +应用系统的参数集中管理,为系统提供可动态维护的参数 +业务日期,应用的业务日期存储在参数表中,并提供函数用于获得系统日期和设置心业务日期 + +## 代码管理 +提供系统键值对管理和维护能力 + diff --git a/appbase/__init__.py b/appbase/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/appbase/businessdate.py b/appbase/businessdate.py new file mode 100644 index 0000000..bb7b7e8 --- /dev/null +++ b/appbase/businessdate.py @@ -0,0 +1,47 @@ +from sqlor.dbpools import DBPools +from ahserver.serverenv import get_serverenv +from appPublic.timeUtils import strdate_add + +def get_dbname(): + f = get_serverenv('get_module_dbname') + if f is None: + raise Exception('get_module_dbname not found') + dbname = f('appbase') + +async def get_business_date(sor=None): + async def _f(sor): + sql = "select * from params where params_name = 'business_date'" + recs = await sor.sqlExe(sql, {}) + if len(recs) > 0: + return recs[0]['params_value'] + raise Exception('BusinessDateParamsError') + + if sor: + return await _f(sor) + db = DBPools() + dbname = get_dbname() + async with db.sqlorContext(dbname) as sor: + return await _f(sor) + +async def new_business_date(sor=None): + async def _f(sor): + dat = await get_business_date(sor) + new_dat = strdate_add(dat, days=1) + sql = "update params set params_value=${new_dat}$ where params_name='business_date'" + await sor.sqlExe(sql, {'new_dat':new_dat}) + + if sor: + return await _f(sor) + db = DBPools() + dbname = get_dbname() + async with db.sqlorContext(dbname) as sor: + return await _f(sor) + +async def previous_business_date(sor=None): + dat = await get_business_date(sor=sor) + return strdate_add(dat, days=-1) + +async def next_business_date(sor=None): + dat = await get_business_date(sor=sor) + return strdate_add(dat, days=1) + diff --git a/appbase/init.py b/appbase/init.py new file mode 100644 index 0000000..1fdf40e --- /dev/null +++ b/appbase/init.py @@ -0,0 +1,7 @@ +from appbase.businessdate import get_business_date, new_business_date +from ahserver.serverenv import ServerEnv + +def load_appbase(): + g = ServerEnv() + g.get_business_date = get_business_date + g.new_business_date = new_business_date diff --git a/appbase/params.py b/appbase/params.py new file mode 100644 index 0000000..c7fdcd2 --- /dev/null +++ b/appbase/params.py @@ -0,0 +1,6 @@ + +async def _get_params(sor, name): + ps = await sor.R('params', {'params_name': name}) + if len(ps) > 0: + return ps[0].params_value + diff --git a/appbase/version.py b/appbase/version.py new file mode 100644 index 0000000..b8023d8 --- /dev/null +++ b/appbase/version.py @@ -0,0 +1 @@ +__version__ = '0.0.1' diff --git a/json/appcodes.json b/json/appcodes.json new file mode 100644 index 0000000..019286a --- /dev/null +++ b/json/appcodes.json @@ -0,0 +1,22 @@ +{ + "tblname":"appcodes", + "title":"代码管理", + "params":{ + "sortby":"id", + "browserfields":{ + "exclouded":[], + "alters":{} + }, + "editexclouded":[], + "subtables":[ + { + "title":"代码键值管理", + "subtable":"appcodes_kv", + "params":{ + "hierarchy_flg":"${hierarchy_flg}" + }, + "field":"parentid" + } + ] + } +} diff --git a/json/appcodes_kv.json b/json/appcodes_kv.json new file mode 100644 index 0000000..1d7636c --- /dev/null +++ b/json/appcodes_kv.json @@ -0,0 +1,24 @@ +{ + "tblname":"appcodes_kv", + "title":"代码键值管理", + "params":{ + "sortby":["k", "v"], + "browserfields":{ + "exclouded":["id", "parentid" ], + "alters":{} + }, + "editexclouded":["id", "parentid" ], + "subtables_condition":" params_kw.hierarchy_flg == '1' ", + "subtables":[ + { + "title":"代码键值管理", + "params":{ + "hierarchy_flg":"{{params_kw.hierarchy_flg}}", + "parentid":"${id}" + }, + "subtable":"appcodes_kv", + "field":"parentid" + } + ] + } +} diff --git a/json/build.sh b/json/build.sh new file mode 100755 index 0000000..948b4ba --- /dev/null +++ b/json/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/bash + +xls2ui -m ../models -o ../wwwroot appbase *.json diff --git a/json/params.json b/json/params.json new file mode 100644 index 0000000..9cee11f --- /dev/null +++ b/json/params.json @@ -0,0 +1,39 @@ +{ + "tblname":"params", + "params":{ + "title":"参数", + "description":"系统参数,可以动态增加修改参数", + "sortby":"params_name", + "toolbar":{ + "tools":[ + { + "name":"switch", + "icon":"newdate.png", + "selected_row": true, + "label":"切日" + } + ] + }, + "browserfields":{ + "exclouded":["id"], + "alters":{} + }, + "binds":[ + { + "wid":"self", + "event":"row_selected", + "actiontype":"script", + "target":"self", + "script":"console.log('test', params);" + }, + { + "wid":"self", + "event":"switch", + "actiontype":"script", + "target":"self", + "script":"console.log('swith event', params);" + } + ], + "editexclouded":["id"] + } +} diff --git a/models/appcodes.xlsx b/models/appcodes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4eb4548cf43825b9276cbd26b54488ce185a3741 GIT binary patch literal 17811 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 literal 0 HcmV?d00001 diff --git a/models/appcodes_kv.xlsx b/models/appcodes_kv.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4f203d49f2f6afee59cd2fcefd7e7190fabd1fcb GIT binary patch literal 18876 zcmeIaV|bq1);1j5w$s>bY`ZZU+l_78jT_renxwJqq_NT1{O)$`=k40vYahq=|9S2o zm*;uRdtT!lbIgHDK^hbc4G01V3J3^@7)WVd`ZgID2&e{diV6e;q9tr=<7jN-sH^N| zXY8Ou?`myDlnVwz`2`3B@cjS%{uhtHX!43&4i2dyJC8|M?AJOQBy#drY$g`( zB*)vQ+iW(29x#^Xtkmqbf04)Q<;6DoO5kmjH<|?+UQZ1ivs##Yz_%|1K3Ubf>h136 zyT07U=?c~kwjWod?YpOPPeA45I8cWK#(d7A%+9t?C{7RunSy_WT`tIRGrliT$+hTB zSJ$Q8PZ+&P0g%MEH&7sjf1@+%#|~o<0G-zXY=s5TS@)B%l>-C)&+Y%w_1kyw=;m))>LQSas~-tdK&Z{-Hk zlfU_5If<+G`SZ4Dn{%oseZtbbmO?Bg*G}5S4_?Pn7-Q`lmw@7S0L|sQ|N8KiokO9>CHvsaa!N@_j65g} zG;{CagcH2}Yrd!hs?YaSG0%O*ugr)=>NX5Rxpz!8yoTdy6C5bxYqgL6NSUEqm-NdZJRUp>TS8Oas?$z=3ykx7(x$NBf^-5}8ISSgFl(+?|q9U>RuGET7Eg{lx2TyLf21usNI)=lAP-N?sfG z>wp+K0CMr43fY0vIN|`HjPW3WfDi#<1CXx2%T>P0icKCPl9#Ue8}LIW4%8%Cl5&ex zeVnt}lnp~n5~y6Y1!IFOed*&F_dCByBf?fXDL9k<0aFu%?c;Ro@d~!2@Gugw)1Uxa zO)?VWK58+SrVni~v;~rJDD*HmdH5;^Cg(RJH)4ZDK}hl#Kxoursq@BxHB!uJs7}OE zn!d(VMsln&yD()+O7W$UN|_EP@8v=rx?$?YLw7tFdp`}Ka3M=3%?O#L z6RiKTyO+~-6L0U{nNle_e2F2>qcZX8;qp)<`9qy1(nFHF`nZ zb#mB^ULT}^@RO{uAS-@^P{1t0EI&;djzm-3^b7yBI0`CXaO_?E?L^TgC^t46PP(Oe*Ok>J z=;d=rIq|W=%JsS8xQwPpj3^1|-G%W^NX`Nw#H}6ckEONQ>}9o0J2Uyp;Dm43PcMgN z&oEtsj8b4Fj?R?De$jD=bKER1WGnq!T#9|uq*0jrc1wHS%&d)SsMY2=cab);HP2z&N9J(+qV3v$>R)Z)<=7{pY5wOFA?S?^I&nJgro#uKS;LIA50LA=t+fL zX{&u@!+~)J5+^iWKfTPX!Ce4y_4juMxBhy@+@E14V9&vfZ>C)mrSg5dOowGbV`J_- z&O!q(7`3o@_L|b@7Ncjj0Zjp?M&-*3a?RwYn1?no=hJ*Dd)T7pRjW1utU2PE_=@Wg z-~y4b6XS}g-7<{hHE}9TBioDc3pqLc;D<5^DHzL)k{2jr=h27OXUN-c&79H;H|xD3 zRCVX{Pw-zAE*6x+`%P&&^oB5NhOm!)QpOrd$Z+CsQfL56h_+*fQ2rA*%yetV9uc6f`FT#u$PWPj;~4Te^d89Z=U=$J214 z?1Da#isTDtnv(~-ueY~f8>ePx=@s~ zPJLHGmfpL>TEzF9X@q5IbVQWi!C~a^_{Erw#0X7I@^~|ebf1MmqqoE+(iZa8gOeXd(z$Nc#vW!iby{8;`jp6^@g<2{J8TlJoTB(Uq8r4Bb zS(+LZ=1CScCCXu$3Evv&OW1F@g;Fq*59H(zEsP(JLy0j7Zv`G1vFwqLTEuoAt@2r#Q?Zt!W>L-3%?Lw(W3 zoeD}zTY0r{O@(N;I2*=5DjrYq)8lo*aO;&&Vt(AG`ygcTWEcr&3F77~Q$;}{lTUt9 z33uiwSnss<&pWY_RpsxhUPv3o`J9;o@P0SiFy{ z>%sg81H{|BhwQIyjP^Jdt{9cR48=Rv@mq=$QXlntIJ#>I_NEIW0w{~F<#DXp^E}(3 zFs|$gB9jkE2KSF??~xdSHCV?J<|yB!O%s&#f^?KcgxLzNn$-(PamL?u_<2Kdrm3;l zSUrKk+rb`?750{%qAEK>%Lat7NO{wcXLCCAMLJkrdA}|-P`>V{>1f#|Epxw;#*-); z@GMa2e-AfpW?Y~u9DKgq%7_~7{H~bBJCL57+<=8O}}*8BTw+!O0Q@{jI(`@L$~cB}<8EiZ&~ZNFr4R2S5!H z!!_uf5Y&ex!Ioci&5?1R&yKe3e6?Ep zNUdgV(>YPqbWycmxcuxi_Hg;Uy>8d8Q(1MFQu?}AHgkb8br$DUvTVWP?TyRt#m~!& z-*i^AeH$MeO;jQBh;4r(oZ6l+`eo##$KPsTKIOGN=WTHKHFLzcC^FLofeq|4GPWKh zutaKxA{bOKP+T7nJP+_#F%Sz02p$g@kui+C9v+)6fgs?9-7(j%8=&93uq0BSWw)SD z;DAXYfb9^>_JAb#Nsom?6PK>upBq6TX~4yfj5`RhP=AXoMa(s;R>nw9=YH>)=;2#BDgWkv>; zMg{=y;G0NQE>ttVAc~=TZjZ(*lsGjpxGt7QRhHF0Ak>K7aMj}KQm%+p3M_H7(p153*KryjtMKFwrd8aY z=){~wh6s{IiRSLr&CI`-VYYUwEH(G_Mi(!ZEhvJN^ozgah-Ub7VY&G8^0#Qp#XNuP zd>lg9-T7~R!sXv8hx_UFoJ86Q=0^U4pettj*i4PvgtdUY>#j^6puBCE^PRJUc>w05 z)atu|rnqv%U72C5#k2hk#%!*7Gc|`MMwdIuqOZR(5<5Yvr@X#9VnJE0eZ&V|dkcXg zW(hVvjNz#5ok;YbJutVGX2qG^OBN`-h#RWtqQ&;y{D~?j&)&c(#0^o>PdK);QHnxC zTSM@xXV<+Mz+*#zp5@`l>eq=dgoRP&ZZPMoN*)_6*jV4}2wxKGYJ?aYsc&CS5ea$(U#KUMChbUc18AX zFOet{r0S78U07gIGDP@+csy-5DJ#m*Tgl@#bioKR9cE@AheSqs#}-b$PtfGqp@(Q` zSZ!VHHj}XkLI}A!@J&V%NgH8k(SH7Y8>o@Ou<&v}Q6$=Mn&L}Pz^L$~AS0$IumZkJ zLFWg=2AHdDTe_5j3BrU3c5Pil_Y)mB0^mg!Dubnje_q}f>@v6kTsCt8T<$%p?0*pf zT$UoJapgs-;y7@E*u2m-n2(Xt$Welcm<5e{M3^Y20_%JsH+d;eM04j%L5H<9w0{Ka z`Lev(Elpglo&Dtot6ph7a#UZ@U6_4|`-X)mKpA1n@#e$3m)7Z+REWI0vD`)L#}^L? z!iKr~u&;s;J-1^d{o40EMWxkUu3mMa)R?b}{iWRypzvb@g2zh6>2C`gf13$eqXd6W z#-ddydqAp4_A`##!$BM9xtZ?-GYQ`b_pPMEEWO-eo<)%hE?#aI+W0LR-#U_+u6JjF znGOzXvIGX3(-L2@nT;x~MqpmmuV)ULN0-TIV%dJumM=1Q{0Bn&Gf6- zmInh?BWjUvt24v_fw%^B4XcN@8CQ*GVhI(hM)2d(mN03zs8Zjcw4~}N51v*G&$3Vm zo2goAAz)fTEH^?xlEbXaeK$I>n-pW)fa(_&ob+%SHM zQ>B%T=Pqnvb(9}mC5O{eQTjF-o&%`iS(?13 zGDs;`^z|#_{6&k<>dJL6Y^{^4u`42i`SQKSJG!8{HPxILqsFQS?bld%Y)t$^?KjcS z*TL`AM_hfym2W%ar&pqr@bv?Hx=*>(ztg8w8EH(O?Nr^^$rz?w#|xgwEhFN`NQF`0 zsUSnD2og?vCL>Vd#%O|iNi5zcybtrv&}xf>o%l>47zhbY!WCeLH_r%OKmsj$+WA^6 zDN-Bl#>Ib5sD;?c$-GZcsOmM$JbPb9R2UdurOXKtqH{85lO;fZ-Vv5 zu#WT?ixZ4D48KjP#3Y@ctNXwze@|b3zvp4W;p7OS@Y$mJaK-60zT?JAXVr#TFVK!S z(|Czp}s5|6S2Gs`ER0un=_qIp&n|s|_$|)9j8f>5(;vyAij1!k%5%E*b*HpxMXz!@iohz(H=!zAVU&3(lvNsm5(MwtdA)v3 zri8}Mk6@4R+$9L3&JZl~CUtTRvOopaj4QaK>NF;gbP$x*0ZUy!pZowS1OyAZg*)PJ zP_uZ5EGZ66HyX-8D4J^X^@ds(P}v9%yR?izEt*(rkZB9AXvxDPyg(v_C)0cna`=B8(9p~o7f39nY=+iJ1&h5&6lv3^$ zkq&+*1rNVY?UR}jcH!=1haFybCQC*4Ip*-;$e{to4)WqD?3@z9`?E2}mTszaojmJtnCVORcOfnBY~P zsUts&jthR@POYIDn9y%-T5T^IURjtpb(X9(;_!A^n0n?KF}h0+tK|22Zs=J=TzDd1 z>fDu7xyA5mD&M>`GJVAwyUaszOXVwN{(=8tLgq*{ZSjNXz4A!bbiI;mmF8Mv+DV+Jwst{uN>GXeeY7c;Z)jH0*mjkwK)XKqw!Exk#{J6I4}PO?K8%Vy!V`dmv#U ze=foB<)AzxuPg{h{1L5;#*m>!t)VWw$W&?l1uQLvnq#oj=lGJr2^W{r zNKyI=h<6I)!Tk8<1MLVKx&~@<Wtfh*5bSEIRIitn`1^i60CNM> zTERg?5E@tLlLxbG#mts}A$S(siY*j(S1d*mZ#N~L%YdufQn)isTyMIKs|&J+G3^)Z zqevE*Dv5#nu)`8#QSNu~t|Lh{onl`|!LkI9#Ws<5u=p>oP<))joFh{>b@+;3fB74K zy-lMiX_#&SB=9QcYv4#l5vWw({wUZkn%?~VfT8Qj8S1q)G9;a550wb_U0{%!9jTJ_?IGvYe+*Nh8!Nq>j}b%M*utE zKiAX2=dFVa0Iv`)_RoOxFNdh3nX$Do!>=vVPd#*^As>UwhSo`XfiLDzB-EF_q+1$iuGwu!VNl~O0jM3zzi z8mE<3qmrO3J@&*IFMsFVvxoP1P(%~z5xxOElr*>Z5AC@-JDlp+e8quIK0HsmwYxwO z^H54@`+;ozP2KOFZ|$&V!u_0G1cOBepia-~!&Z4p$iQ%<_R+?iK`w^ggmml(Mr%Ph`u}v9QG%N_6H}V z35BK}D4pVyEMMs7#^S?YSRZ}tNGmjW> zzCETQ^H%Q)sUqzhs~ITiwih2-XaO->9tDUT^U?+XFp^cI(s9H9|5w-NNso*Bu8U0Z z0T*w+4v)M0arqW{X*Swu!gLN7S>4kaeEUy8>JWnddWp@5h}chVKH4;sv7e zo$luYd64pFKDQ@N9tigs;-sj2WY8FE#-2MmhS24*-2IJsG52MXaE2nZ&}acRAx9mN zbQ`=+h0E}GH!BY&?@vr(m;dKL1u&KE?N#k)h=nmFzFFzI~)gHe&& z#eCd6GKXcE>BU}e%6GB3gKfk4upJX8___badu=Y9gr+|XJ>gq3lrCXVjE~hh_?N3~z6PMJ3eQ|q2kX>m=dLkb za|hqP-NCh6Fl6&Gq$tDD>SQ(FJaB8cJrkfxA?`$O@#e^HfWRnl`UWZ^9&UetWfX1GI4oDHP~|Zr;qnz0H1VViOJBwWx8{^Fw*f1V@;L$7-PqJX zbVa|*5jXm-K10kztvS+osn+1%n(d7 z9;;UuRgvXL?PwvfRae1K94XCcby^{kse*u-cxBLN(vdW|E)DU3%+!05d`JdVgpXVYbV z>g>gVtm+cFC_&ysB}fIZN!M_W@5S`j20Z)0-*b7wKA%Exm_H9EBzJ4rrZb8%a}RiC zzWUQ)VUiwly`?igM801farMJgzG#WPe2P=i)^o`Y91~aPp;x=Dtvs;2eU+)6FienT zo)xMMZsBOvoJXVod_I%ax55aw=Y*FW~ZOvKK}RE4rYnN_CSZ7+;-Jrm@LiThOW46#U&#=BXGH zjnk9Q`tX}PjPa&~9utET(8*PQ9AB*oa~okM^7!6OX5?v}XI2kDtw;m;AXHZ!yvXlE z%5#+|Jt`$HjCj_lgI|lKDVlO(&xecE}>WRy*%^+4nol09#a7_d1Y`)U* zlVs8P(8ul>m`VAVcW^>rc+UH_RTMJNjfbo;NUf4as$FuaFEM4$7HMBJY!+k1LgK%c zIdxXVY9I$4=Z9|HC~)reZ{0n<$j?;eM~j_~6pLe}ddcu+lQ=d%?oHnB4LD&tUcYA( zn#hw+4bk1rJ`|*~uN3E&;o$c5!V6~b_(z+vlk%M09H2|ckbr>D{<0|@%=AAQ8+~y6 zWNu^X@KcZEtI67~h#|FO9{3=+4h}_&Fgv5DDIoyET+a)8P{Zg8SLO!|k&o!Kev&^5 z0R^=$#oHRR)8Q1`o(<_oP#Q2pA%0-+lUy!(4MGrQvvYCQ`tttr$N5Ej>e8zIRX-7& z1q~}Q?H1ig$M;u)MYN+0hV=_@$%*66KVKh_$WdO1W-DPsI2BE)mxlz}m+gsCrO=JEwCc?% zjdw^Lj=|JmVpKSPsCNF)_#WE4j(%m#{XttlehA3VzFR21ytIZOjy2Rh)PPM44tSS$ zN!LKTbc*lBkx@Rt_j|XJ=Q6puuliR?II0vOV@zg6VhPf2Rf$-VF=L`Q1%9$r2@OT@nnF11Z2?*UV5-F)v^x~D_ zU6l5#l(uNi@*g+qXw+Ofpv1M#wCx!B$Tyx98L>`~{dys@J4V3E+3EB7jd|4N?k&U0 z$dY2oF1}rZd)*`H2cB}7sRv}=E#eFv5YNNrmFE?eNT#)C_KRc2>c^gpmAd8&N&B~r zA9j$R*AaZi=WR_Bh{O55)3c?4Ij3BOBv>&EIZ<)EO)JmF-^x%sXYZsB5TT>n^t(Dc zX4t+I?}863wYMFi49>EsmZX}XT!OTeo`42r^+~X@G1CmqA8$=byLR5+9CEkT3gzX^ zs68#U!~cj&jJdnY)JfdR44A=mVNDtypxECwWXrJk8s7iW!f^6%tUJCG75pgImss@{ zjgdu&vEDwJNQ`TZHt|u|cJB@4VqMU6Af7YWBQbpZGMu{bGY=(!H!QqvDD_%lA zkJMBp{k%M5C<4J373esi`%0VuCFqbOUik1QyDRBEue8}#=oLz?`gX`= z-#-LUTVnc$(!(%I3QbLAb`%ges>%!Yj~tE(TYT^@P)wq8AC`OJk<6?5ug zmW(rP5Q%^t;$bpLoV5U4z&s~|zKa~e9xxGzA+HbC<&c>V>PYB}O|YWpYb?Pd6Juc_ zaa1QEUYd$$NYcBY=#TfU`Gjsgd{Tn3Zw@i}y&6*qE>F>ZjWZ?Xt_9}TP(%CkcCkFa z<)&F+&Z9-_Xic+V-KhuQEO5{cvu{;6=avx9tprU|=4yxa@ZQz|x+@zC?Dq}-c8DLK zJFv09bngV`{U3*H_fGKMIsv*18w-Cs6!qR@(DbC6u0B$y@6vb&9PCaH2?W!pI& z4*EW~$o0ah|oz$zoZo9&czKJkCBt@8+$~LW zzZ;0EB`P+sw8pBK)FE2ZlYM0JU3LW?FYiy6TDLH=?H%6!J8!BP9|+nrce36&k0TRxYU850ATT2fM2S{axua4|yH2`uK@xpJpJ zoQqO~+s&MNFPsU_4((p5o{%Pt5@Z|;3tmcoQgc^iB^jFmE-j6OTiYj;gZByNa`pL0 z-n@rqlyqOZl*`w7%9_5B8@H)eyfGIrbn`c|xY2~r>m688=wgi?Fk>?>RS~@;*6Y2e*_Mg(uQ(uofCq$#VH2mrLXyBe`0NTEs&EKcsJpy~a(-!MZ8$_lysA;Y$Ptc0m?iL2Bv6g2|61URW-7(EijjkQd(?g|`Wgc6baPa9Z# z(4RODQC86~sz&OS34LuQ6P(z75c-*}8sa86SAP~x`gj#@S3E94op!jD)fHP0-aaa}~$tx+jQve68i$X3VX_=9slIHEmb^!;%7Q1MFA<-aE%> z@CLD5cWq@O>g&z7NqZE2$(y29ZRFH6)SdMF`!h|-OO1GccF?|$L3ZElR~fUG2IUVC zxZmPC2$A3*Leh`DbcI``9@}4X>mG*BLCwN>4dvMH5}9;{IJtujky_!hcdjg_ZfBP# zxx8YB?Ohh3Bs+yf#9lTf27C#aEL0$)EY=lhy(;A=DcUubLRHJsm^pPCL>Az^Izb%w z#wKsIy`n!n9+}{5t--ivCV(u+@SfC6}G-bQw9mzoozVF{mTv%t)MrA2OoF4QG?w)MS40csk~j2fHJ$O*rO- z`PhazN)3@Bv-Ez&uaj^Og%zj%d`uEkFQ#VTb=Hf}y)siydjg@5vo`OLtbS(l%C@NM zl3u0<`SyI&vhdjTqlf<7Mo(%kxqjkZ%MlA}RuEa&Iiwt?*Sn0(iNL#M z*#|XvT!vUliM>O6@uyHh_gcUS0WD59aAGmI=gCyO50Sa zhnfnnHY!iFB4@LJTqz(CXK-1Asy%eR7C2!4$#isLYqJ=ADd1{4Ee%6M4jM}z*PNa0 z<>JNsG7b=3G;gkjuy6;FCrmzDr$d;x_JTx$LW!(0#}v|K+7pFLdm6pfvnyzjyYj8F z>G3@C<)D(FQQdopG^dB>MWuFu?P;t)tFARD>I!7(_1glzy30Iy5t!M+$k?-KJErJ9 zB0#n*G2$erB-d1)z%|6zr73?>muVpq4{-^bSS3o>t4gd#8+Ts`h8sG`xN>@MU^mr{ z%s+m#?MC~sr^m1j@lj!SMTz=UT-D8QwH=uqSO3DL#eyO|?R7}E68cuu>Qb7e{H0(- zl+-@NP^DK;YertQftpH-KHkS$it}F05ama6qcbjMmf|~ce?VvvC&2FH_8dxT?waM@ zwhzTS1mr=nt>X&;A1R2}qro%}*ZQLrE1?hya6~Cky7dyfUm=W>P1r$M%<~ZsTE5mI z3ptu|5bKCT;}Q&g^dmj#`p5x9oq?DV{;z{*8cgYXbtuFJ`+yar_oyda@0gUI`ZCfz z@sll-bo^fg_{D<6Nm-a4z`NWm8^rq}h8vIaPDqP^M0Jpw4tr?g2X~OcoQ})U72QV> zfID?w)YQ(+#sFK;?@LO0n7lBofm+2?&vvz+=jUyxG06bIx73erBMiNFbF7qV0nONqGg?1+rtEeth5#FVV3=ZGkl2{+O#Ur0B1yXn`k zje<4j&ocfhX!U_uXpWMmXYgoP*cV3}T^-n|f`(k^_z*Kk5vBq;fm2R|qO0qvnZ>`f>e=ISH1LBw_-2A2HZ%^Z3 z@e*;3#ZaChn@=s=PduILxU!8KUu&%;-Qtx%D(aIg)W~06A6Z-SdLgG&g;p@69wD;U z82G$DpOtGpK@cI4)pz8}Lg{pUPJzeTL|qY#(6u;@gt|Xc9d$tvnTv=t(Ma1Hg_@fN z&9Pfxw9=u0j#0INtKS5&|04SB*(;BWe>(CjglV9bZEIM4p>VH~Ir^GACAk;|L)ko6 z&8+%emV6MIM~F-C#28j#c4w$jqT~Du7ny`fNCv}5b`3V_r9^A_8#P=uGo%(e$9drJ zS_(=hZ*48=$zEplGgQRLZg^Cw)FU^3CA20%h-3UEXNHc?fx$z}gN@>wsw zZ*tlqGJuqcI!nNcr-p%w{>=s|fr2Ny&@C9L<)SN%>6M5dswe>I2j$LCC;0=BAh%TQ zn*<*`N`0P@yNWxW))xj^u7GQV)sb-ZP7{Z_$h(xJ#z< z%i&cMe!q9KOj7tq1ChGfgsiuO-*O${8C z=#97I4FMHic0Zaeh*b^gBxxz3-526_5J*qL;4vFMj3ry}El8d~%7FPEu=$$wjQD|o ztH8u~HJ~9#_AJ;kCg_YR`-Xk&*|y?q&Io@O{A(zCIk5k5#-F_ zZE)4Po(Zf;Mk-VFGP6$>>Yy|waWtjv520AWkGc?zBXt}Qu?s2oXhwi-4yoXv!EGTF zy}+aqV0Q}lYX^aQZRonnGVk9K(05{t90`6Per&5wCR@g#gPZm?2XNc{kKZm*@yrt7 zbbV1%o~nxWnH#b)5I%84QrA~FaG6UsRMaYx-0#ymeCw!7h{Rwo=KFp~Fx}pE*H{Qj zr#QDxXDPUyGvqdi{mRU|k3&7lU*H78dKXcFEdD@rqG&$gzGN^SFc-{H7QK2Ct%t$7 zd4i3k->jO67FF+n?qC4&6(gl121UFll5v`^bX_Ft6NIW{6i67~J_N01PV7Ci=!a!t z)N$b<=+5`r%(xZ950)ycRW6dX7t^vDZY~qLO14c53u}B8)6L62hF#xoqUy{K8b%7w z>G$z-hdkHkGVubn;7c1fzVxZU2OwIPSsZd3nu9M$h6$gE3&uW{@Iw{2)fBwbAXVTA z`>0sxhF_*Xn-3G_ModD**F##QN&m9&cIJIiq!zt{VG%y?}aGGj%!M;8!&P~DeeIEl_;a9?aEoB4xBr(9m@QW*fIhKryz!-Y1cYY5h|~u zb0bkA0WoG3k!B@V(^LhIqCC8oT7w|_;wmJD1mg_^KWFFRJ^lC-MKwbNQ{P`N>d(?Y zPo+CZPyi`@5(7}l3v6U-sPM_w&Vj+u$-&Xq`lne4C;|Mx0w#czXH1S*1TvyQYpALd3EtC(GM_Dm`UE z1oY>F+Qwt%c;Z$X&BXY6!9JZDK{AR!_WD&!#5Q@T6XR5&FCOUfKAvvjCyZBgD+O0!_jICL1XpF3b^apxpR#inxsg)|kegD#yo>aA z+0nPN`#-?}4B5Ya83|p0U=*MP8uS(+_%!Ofjai6*DpNhKyLt_fWE%_3OpSsDGg-gH z?RB2@tkd$zG_L4tK3`m7>lz3BG2=U2PvUXRmchw%1uuX@M{otmXirz2d|{V zJcM)&+~(!L`_%21ro)UR{1J`JYD*8gvyRS?NC>jILb70(GZn5q>Dii$HUsKJ%=x?`yWp6m7 z|ENOD-jXdsOPug_TA$7>yEtbr)iO{+c7aqzZI1L0uRWf|~5U_6Wkn2Wx z&~$14?Ed)tDb8oeZOnv^T$exf6|h45&%_hxC6rB7fQ*|13XhQgF5`x_pN#)c$p1&g zfq*>YSEYLx(fZcG-$LT=*d_0Bf-6Cjc;BO)D0spS{lJ)iM;_+u>MIegvDw6#-t!^R7DG7p3Zh~1f4FZ9CYdy4o}K=hws4Kdom*8 z`Dms_SLS5|MBu?N7L#lGX$sHVH+q(L`$AQ484Z_D?;N@M@oNh>Lrw3-0m(4dEBW|0 zOhVq_>nZY8UUTY)r>Y^+@Pek%){-vq^ovAAbBsciE?1`PZz6DK8Q3YlbK-FprakuRrqn-|ag2?&l1 z(|p1XIo~C?ioi0P9OC270AGL&K7CKgCVd0c4*jPvb`D+ztpkSq9I%|B0PF!}p>}{! zm80>e55|s;KVw#Zo-@%KnA@Dht-=5+q6Ky4QSHowx`Gh%M{!SSMJ)U^!K-v=Tux$FH?vAglZs9g`k;PQnj{sFH(y71I>2QM_i>6aKD2kt98*5)? z4Vr$So_K^xZ7h;0AG=UV$U`XNXk=spG$AXHv+Rf*sWPIdEQ8U7sMDLW54g9Q9}Qpx{u(1-5IR5v@1H+T@>@dxI{JrCl_*I6 zJHWqx4&mnCZ{I@Q>c%KLP)Aul@!sW&RWJm$dwH zw*HCor;Fw{N;&&KqWp5${E71KOPSvoKtRLXKtTVnu=x|<-|gAI13>Wo4d7qa?Vqjx z-BS2_>mz}`wf-Nw;m_uO>h|9NF2cXY;Qx=NSC9q=OdLN~a;QMCfOOe(k)LP(9|Z&5 A4*&oF literal 0 HcmV?d00001 diff --git a/models/params.xlsx b/models/params.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2ecfa7970f5c70afc4f9b0bd30effd3f45c1d857 GIT binary patch literal 17612 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 F{{zG4?xX+! literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29 diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..f1ac277 --- /dev/null +++ b/setup.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +from appbase.version import __version__ +try: + from setuptools import setup +except ImportError: + from distutils.core import setup +required = [] +with open('requirements.txt', 'r') as f: + ls = f.read() + required = ls.split('\n') + +with open('appbase/version.py', 'r') as f: + x = f.read() + y = x[x.index("'")+1:] + z = y[:y.index("'")] + version = z +with open("README.md", "r") as fh: + long_description = fh.read() + +name = "appbase" +description = "appbase" +author = "yumoqing" +email = "yumoqing@gmail.com" + +package_data = {} + +setup( + name="appbase", + version=version, + + # uncomment the following lines if you fill them out in release.py + description=description, + author=author, + author_email=email, + platforms='any', + install_requires=required , + packages=[ + "appbase" + ], + package_data=package_data, + keywords = [ + ], + url="https://github.com/yumoqing/appbase", + long_description=long_description, + long_description_content_type="text/markdown", + classifiers = [ + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 3', + 'License :: OSI Approved :: MIT License', + ], +) diff --git a/wwwroot/get_appcodes_kv.dspy b/wwwroot/get_appcodes_kv.dspy new file mode 100644 index 0000000..56c0379 --- /dev/null +++ b/wwwroot/get_appcodes_kv.dspy @@ -0,0 +1,16 @@ +debug(params_kw) +ns = params_kw.copy() + +db = DBPools() +sql = f"""select id, k as {params_kw.valueField}, + v as {params_kw.textField} +from appcodes_kv where 1=1 """ +if params_kw.cond: + sql += f" and {params_kw.cond} " + +sql += f"order by {params_kw.textField}" + +async with db.sqlorContext(params_kw.dbname) as sor: + rs = await sor.sqlExe(sql, ns) + return rs +return [] diff --git a/wwwroot/get_code.dspy b/wwwroot/get_code.dspy new file mode 100644 index 0000000..0f5f998 --- /dev/null +++ b/wwwroot/get_code.dspy @@ -0,0 +1,27 @@ +debug(params_kw) +ns = params_kw.copy() + +db = DBPools() +sql = f"""select {params_kw.tblvalue} as {params_kw.valueField}, + {params_kw.tbltext} as {params_kw.textField} +from {params_kw.table} where 1=1 """ +if params_kw.cond: + sql += f" and {params_kw.cond} " + +sql += f"order by {params_kw.textField}" + +ac = ArgsConvert('[[', ']]') +vars = ac.findAllVariables(sql) +if 'userid' in vars: + ns['userid'] = await get_user() +if 'userorgid' in vars: + ns['userorgid'] = await get_userorgid() + +NameSpace = {v:'${' + v + '}$' for v in vars} +sql = ac.convert(sql, NameSpace) +debug(f'/appbase/get_code.dspy: {sql=}') + +async with db.sqlorContext(params_kw.dbname) as sor: + rs = await sor.sqlExe(sql, ns) + return rs +return [] diff --git a/wwwroot/menu.ui b/wwwroot/menu.ui new file mode 100644 index 0000000..47f3280 --- /dev/null +++ b/wwwroot/menu.ui @@ -0,0 +1,17 @@ +[ + { + "name":"codemgr", + "label":"代码管理", + "url":"{{entire_url('/appbase/appcodes')}}" + }, + { + "name":"params", + "label":"参数管理", + "url":"{{entire_url('/appbase/params')}}" + }, + { + "name":"jsonhttpapi", + "label":"json应用接口", + "url":"{{entire_url('/appbase/jsonhttpapi')}}" + } +]