From 8ce68bd8f40e77a882fb7083491ad20f578185d6 Mon Sep 17 00:00:00 2001
From: 3octaves <873551943@qq.com>
Date: Tue, 19 Mar 2024 18:05:28 +0800
Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E6=96=B0=E5=A2=9Esqlserver?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=A4=87=E4=BB=BD=E5=92=8C=E8=B4=A6?=
=?UTF-8?q?=E5=8F=B7=E6=8E=88=E6=9D=83=E6=8E=A5=E5=8F=A3=E8=81=94=E8=B0=83?=
=?UTF-8?q?=20#3505?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
dbm-ui/frontend/package.json | 1 +
.../public/sqlserver_cluster_authorize.xlsx | Bin 0 -> 9360 bytes
dbm-ui/frontend/src/common/const.ts | 7 +
.../cluster-authorize/ClusterAuthorize.vue | 125 ++++--
.../accouter-rules-selector/Index.vue | 87 ++--
.../components/AccountRulesTable.vue | 174 ++++----
.../cluster-common/ExcelAuthorize.vue | 12 +-
.../cluster-event-change/EventChange.vue | 2 +-
.../components/sqlserver/Index.vue | 50 +--
.../components/module-group/SqlServer.vue | 10 +
dbm-ui/frontend/src/locales/zh-cn.json | 23 +
.../mongodb-permission-account.ts | 28 +-
.../sqlserver-permission-account.ts} | 32 +-
.../model/sqlserver/sqlserver-ha-cluster.ts | 2 +-
.../sqlserver/sqlserver-single-cluster.ts | 22 +-
dbm-ui/frontend/src/services/source/dbbase.ts | 18 +
.../frontend/src/services/source/sqlserver.ts | 27 +-
.../source/sqlserverPermissionAccount.ts | 58 +--
.../source/sqlserverPermissionAuthorize.ts | 52 +++
.../sqlserver-manage/apply/SqlServer.vue | 29 +-
.../apply/components/DomainTable.vue | 5 +-
.../components/cluster-reset/Index.vue | 163 +++++++
.../sqlserver-manage/db-backup/Index.vue | 47 ++
.../db-backup/pages/page1/Index.vue | 407 ++++++++++++++++++
.../page1/components/BatchEntry/Index.vue | 363 ++++++++++++++++
.../components/FianlDbReviewer/Index.vue | 198 +++++++++
.../page1/components/RenderData/Index.vue | 87 ++++
.../components/RenderData/RenderDbName.vue | 138 ++++++
.../components/RenderData/RenderDomain.vue | 146 +++++++
.../page1/components/RenderData/RenderRow.vue | 202 +++++++++
.../db-backup/pages/page2/Index.vue | 86 ++++
.../ha-cluster-list/components/List.vue | 242 ++++++-----
.../sqlserver-manage/permission/Index.vue | 274 ++++++------
.../permission/components/AccountDialog.vue | 2 +
.../permission/components/CreateRule.vue | 73 ++--
.../src/views/sqlserver-manage/routes.ts | 8 +
.../single-cluster/components/List.vue | 236 ++++++----
.../components/demand-factory/Index.vue | 32 ++
.../components/demand-factory/common/types.ts | 178 +++++---
.../sqlserver/AuthorizeRules.vue | 223 ++++++++++
.../sqlserver/ClusterOperation.vue | 115 +++++
.../demand-factory/sqlserver/ClusterReset.vue | 66 +++
.../demand-factory/sqlserver/DbBackup.vue | 145 +++++++
.../demand-factory/sqlserver/Details.vue | 198 +++++++++
.../src/views/version-files/list/Index.vue | 13 +
45 files changed, 3718 insertions(+), 688 deletions(-)
create mode 100644 dbm-ui/frontend/public/sqlserver_cluster_authorize.xlsx
rename dbm-ui/frontend/src/services/model/{sqlserver/sqlserver-permission.ts => sqlserver-permission/sqlserver-permission-account.ts} (67%)
create mode 100644 dbm-ui/frontend/src/services/source/sqlserverPermissionAuthorize.ts
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/components/cluster-reset/Index.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/Index.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/Index.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/BatchEntry/Index.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/FianlDbReviewer/Index.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/Index.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDbName.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDomain.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderRow.vue
create mode 100644 dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page2/Index.vue
create mode 100644 dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/AuthorizeRules.vue
create mode 100644 dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterOperation.vue
create mode 100644 dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterReset.vue
create mode 100644 dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/DbBackup.vue
create mode 100644 dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/Details.vue
diff --git a/dbm-ui/frontend/package.json b/dbm-ui/frontend/package.json
index 3ae3915a41..0709124280 100644
--- a/dbm-ui/frontend/package.json
+++ b/dbm-ui/frontend/package.json
@@ -88,6 +88,7 @@
"vite-plugin-html-env": "1.2.8",
"vite-plugin-imp": "2.4.0",
"vite-plugin-style-import": "2.0.0",
+ "vue-component-type-helpers": "^2.0.6",
"vue-tsc": "^1.8.22"
},
"simple-git-hooks": {
diff --git a/dbm-ui/frontend/public/sqlserver_cluster_authorize.xlsx b/dbm-ui/frontend/public/sqlserver_cluster_authorize.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..0c2a1dd5243c7004be30f6317cd0757ade17fa4e
GIT binary patch
literal 9360
zcmaJ{1z1#D*Cqs{L%If#?(Qz>?huidn4ue_hDN$WX`~y0p&RM$kP>MDDd7kG?)B<-
z|8GCfnR8}l#Xj%ad+q(KcdN+5K0<8~8b$C3`P*CD9P*52E6f*{anB8n`GGf~0VA(LhhyI5c4!{XqOu9L2v2OXw7iXl^
z)pjp<5L4`}ym47bAFZ^-0drPOl9%9?-qQd%E`4t=%_;EG8egJH)-0QO@n?eIhc6Zz
z7b1*GN2H&nlUpTy84&2Zz>Q{^yv;O_0+7YRnbLI__sD0n;=w2)*7n%P8mb`ytQCtQ
z>pSp*xIpVehNw|pHtc-Z733hkjhrK#zUwY`i96IGh}Gqh2Lu&Sr~eZMy)|bZ)6{tC
z&KO=-;=Il?QhAp~HWgX6ntsR8eFCj{X^pCP?yz7lQ_I5%a`W^h%Rm>=9wL%bmw5Qv
zx|Ywo^khpv6T{JAh9*R#j+DkpAlo9CW?C)&aX{My
zIjDE^(>ZSv71Z~RFStqpK9b>wBidQNgKR6?oTzdS^2>XWG5-m&3DCjp0cG#lF{J=j
zZ1AC?7s9xwrLm(f;fv5zL)*|${76?t&pOO^oVE$a(#r(p-T-e@WShS1V7M#*I~Qus(bxZ+`Qq@;G=4kdQl@(NheVx
zVX~=eX8zZ!_(-&3dI6neT_T3ajhw#EcVbnmKicLjDj+Pe=^qIb&wIw9cQ=*=c#K=|
z-eHK8XxA?l`Y|sgOtts87{$R%8n@&Cp_P6GNO}jU-oMrKT!MJ+=Fe*8G{6x-G60RJ@`s
z(91u+$qT_RM%F7!!wd10)Lv1%>}#vOiSV9wHT~p$Pm$h5;$Bxr4SZul!;+FKPdtTeFs7
zUvA1L6OpvH@I|xe`uWNsRAri-$4+-o=SR=4;NYYgWxW_79U4XLF^WMtKc!?nmxZv~
zD|cTPsnD;@#UI#7G)@VKA>r8=9rX1%D-q8F}3)q
zV2OQ3f7O|BJS=1TGQx^kAQc1mTnInkD)+U(Qx`)1EKx?xT0wM`7V{w>8+)yb~7+_(N*e1@zlCw{iuzG@?KhdB^L9FC!QY&+Lhca($y5
zdcke2t0TDZ)}iVs&y*QCaUgWKUmU}Z
zlaKW~R->l7z7Ch{KarX#I99tl0+yQR1QDIet
zuDJZTsE&PbG|zlHVQ-aTPi)P6?}!&n
zh7-9PsM;5(oNdM`M3pKMB*adchz0Zuc_J{1`)<4FtswTQCw*U-t~(opaDw*Qr52xj
zjj9`O$bDY+dn+3w@}5@3;AKYO+N1|5vvwt|eFH`A$_t+m75{M(>2Jke{pY;T?E4x>
zIK(I3nR;Wt=;K$-*$_2czZUwK4E}hLo*aIctjsZNWbw8Y20qHJgSH@IQvXDnFb2LU
zlGH&m*)W(3jy^M+r7n`DD<4&GB@?(tRIfkBm;JVVT(GGtuCkx=b7z`xl!J-j@|y;m
zV*ng)jbP_S559=cD(A$qHwrwSvPk=s$p1gu9~RX6(e7kvW^4Axf_i$2v|2S1}<=8x1!IwlHKPYnmQr`=djtzv{FT)F1uh-tCU0?^=#2`S#P5G
zPp_dn8;z5ooAz047)D{5oU*9(gG*traL#4qs_+Np$Ki>lr-CIZe7){gK0S3ln-2(i
zCqY5EX}?fxSmqJZB@CG0we)laf0rjBjYaA;`RJxFznm^}I6r-TXxN=bPl+j3A)J`j
zupcBxm6i~8YK%WPC`iusQL!PU!e1LxqXz~6y%eH3{eH@vs)O@fCE_WWrziV6VKE8C
z@r8kqZ}`nUa=Xx3p?=hg={WELnbVx&!)8f{P9eGru)-!joRsMC!T5ASa_CIzSI>K(Jwb1)Aqp$7aa0TBs$zC?|#o4nqJrnxH3W8!O
zqg3kIt#oPJ7~|``Pwe}4wW_5}7ck$?s8aMZlnTb=%qk^O`-G>Hj)nthpaP4N&CMXf&yY0Bv(qb7!Zy(N1wteYAjr{
zwnt+kdz5GT-tAthpYC49eF`3l0^B;??2H|E0+^UA)|jIL);p3`e9pIL068L=K3`9c
z@iyIbyY8+!X5iS+Z`<_xi)jg};Aq>ZLle^?N3D5iKp5t-tY@$vfT2RLlK)aoL6;ic2l6mHU63(-^@*UtU;shg6D0L0*wP_bE*@Zn%rpBcGI{&nRUsHr1|p&b$m0
z9>K(oGBS@p$^`#wgRsR^*$ml2
zU*V?vz)C>qov%sLo-wP@@-yYQKXH66d2nRK)1|5gCK=^rd?^yG{#Z5Q`~!W!p*@ep
zslWwvFT;{|5?1e00iM4ACrDE7QAlPA;=VlXq|*0D%Ny73WYxkRZun)KPj&UE`s%uJ
zdzrND#h|l8v7-7CB+KgZ@ID4qne
zbE`N?+sRGP$j>tNc;iog`3N1e5u8sM*jv*e&>;Gv8XmDsIGdh0kk^m2Y0HYjPeB#|
zi^`y5ZWtwLeA;biB0-3N`!uC}8a8x_6tJ-7ER;@y>cDP3i1_i6!=$DRF+E}KDj}Y>
z@H_vQCH3Pp|$oAd$bNtyxei>aeQWIKj!1B$%a*3%&F_K1kurG5DH58ZBS
z6o!-%g49KCYL*9u-xJW7Rla0~C3BJU${lep&?#*z&FgQ0uCL}T>MLvUH{62o9IN5B
zBeQ&N7K({tWTvJGA5&eh=9(rXJ+U7@rv{Y-_0mF@%P(CRO_6!r(+6KHBdz<{4v^F-UOa*D8q$ry1fUi3f&>l=6rvA@m^(PZ-Wah_SdQxhjgjxu6GO?B=KDnzgMe
z^<-UVnvc?sDk`z9q!Y#-LbwrbKM(g(bI@*18&8ayo{vZ|&S~y@R0}S6hKKEhN~LLz
zRKXItY!%N}Oi^t&Ssn7OA*XUE{d67Y7zf_(0X-
zwAaHcqIAG#U&Y!AMl(mdfF4E0k<_&3%IZ$!m&VoU)#)063evs`8QU<;>E3uNnQRZG
z3=a2qhjY5TGVYyrvB@iHuclGQ22;<8_3-w1P0{;{??vOOBXR%Q+*}~3WA^*M?
zjypjdw7B1);i*DFq5fRO9G%>4%p4!~R#OIdZx&>5?npxK+8y9T$XuTI_SZv(675`=
zGMwJV=}}UOCh*w1Fs1Wu^O}8AqQUVnTT_Wq@$2|Z86}W#0&BP`YT#_(d8ZI}aNE_|
zmPWAfm70LYF7yfTsWVCMA!Nk!kOOEgXaY16I&dFgqQP(UX)St{W~OO>W!w7c96fE<
z6{thxtVsZNX*KcmS+ROgGpqt>{5n-`gWmaMiX!tIm86Y;ZuSn$@hZgU2~&
z0>JBik@p2bNFcDh-PnrvF>w$LQQg
z_2sQxC!I6gvjC6odOP}8blgE_yAvKMqrRRBFE0j4i&Nb&Afm^m+9*1?}l5S1u
zl|uBwXN5w1K-VPOvwphL322n^k3m`>x;jFp6WvHAHGF-B>Zw;;gbXM0^{dr{`ZM$!
z_n)P^EmQMGkxVb7ZJq1RT^+Z*GzhFbhbjqZ%;QI?zEKaP)k^26&b&YKfEW|b@9t~2
z`E(ZYyytJD-Bz5^y+dU+D%RM=DSelww@gJ=)k?v`uPtMde%R_
z5X{|)OeoNduo{XS1)wpi(vMXU>4usVxYP+15Ov(}g3#aet&9Sq=c)kUiv0TOCHsAe
zR-h+HCyZ*nRT3+a+Zd<12>h%9iJ*K((v{ZL`GlNAG}M4_u8&siScR7W4$3V;Am@>z
zL*<***Nps?37Hf2&mdiwruakR((B1-p}8r^rui?YKROJR>}cYCEjj4+=~L^&ds>x`
zA!{m6j@6eePFaZpxQsk45vB;W5vK5qxW6ZzRepN&;!Jq$(?Z}2
z)Wzk}&8`!^2iV&al
zpa<2Hi75m
zm@^Jh``K`jG8d?eJ8f$|nVx=g)8C
zh#)ZZ&HZB5usO)GdjC;$X9~4TCWuzxHM%7b+`#eF_>DMeqxJhwG|IyO2m;GQ2>x5*
z2m|zUUTUvo%m&x(%L&g5mv1}l2c3OZPC_a?qpv#^k+LoQY!U#;BP2i8uU)TggxozOiO}28NP}5>gckayl9N+}+#yhHA%KhLQsH?lMOi
zYH{QI=@=nIpwEm!&4<+yi8YihX1U~(I0)8YU7zxiO<160l;wDhlsL$Wl5$)kZi@-a
zU;Zh13}6p4H)T|$Nu(vMB4DxenQHJ{ZC8#X2H$tVN(y!u>TULzY7q#pXLLwN`fK+B
zNz;@5{eA!->hQaZ*SFz~92P9y7`!7F>`=y>n+QgTZrj&9`GwOBKtbHXUFcAZCn_(Q
zno=Y{Sg{PR7|fj4bx~ct;Sqz{7>|lq?|XIA|4CAE!=HJx<05=yxfb^R0i
zi0?670h1sB;{~N{m&c{`0GM4nvJVFzRi53LS?lQu0=O89YpVN|q*A+^TDJ7M(m1no
zj1D+nr$|+Ha#R+28{d=Kt8pw(I;a@a9bqIyeo;0ONgMWANDDYUs@gyn2|Z9ug>2K}
zl|}<$Of@*Zx=3~HmE;zo+E)I9N{Y2y3d5S5nl5Tg_0a&6tczMs$5cpqkdOx!*H6ig
zGL6vG$wJCkWGK8-`8E7<*)V*@-%;Ja;!~v2ZQA^_oBx;H)Sq_!E?yMmeoT;rqs5hi
z(=dip8~)*qPd~YKeQ`EUH8QgVuyoq(6*nqwN5$3z>dMBJ19x-&!)ZtU>4^f_&|?+^D5rwKi;6I)bS
z4ySn(I*V*L>6<)>aH?yY>MghiJU*N;n}VC!Kwoq?jP^^tHl>T&mx&)Ym2f#)@3c2v
z`}fT~zH#;`E6Qd;5w?0q^?K;GKq(&FPlW1vi}3r7^oip>5bM71cXEF{@Dle06Guy9
z2QyQ3CkHD#iys?PXEjyexC*{E?&SOxH&QI-9O!-A2iwOz%;^Xqz+VyZTxEkSj@Q
z*2gCL#7}}*DgA86N?3FJP^o?MS8T6qT32lalDfNd>-$|>97p(8AliEF#b$wm+=cJs
z9)(F|%d}Az6=+l?ik3ew6ZVRD^opJ`&(z8P$qq@rrBsXOv+POii|67`Xl+yH%v5vx
zIj6A+$EuT$hOL)IvE!0@Qe~>)wbVExD~rs!x-Cy*3hC&@#MMSHIsDdT`Y_KF(L}EG
z2eCBG`lIvO%u>t~C|$SNv5DLxOn1D4Pg-Wu_?Ox@OPueXGhRtzDe7WflHPf?`<_Cg
zwb{K&@Ui%6-ap}Z)b@T3uSqyrfdRf-8)QRwVA4*;Yx;_Q3>AP4E2SPK^~jYMJinN!
zUt+&?9yK?U!m(tA&`s9$Qu4(VjJ0-#7N%0_$1AuDR8I%Aud!KtqA=@NG-&m@1>1U0
z8)gI62-11pwpb{)d=No5_VnUg2=p0bDg7{0)68PF?Fwi#oGrSW@VJdP86FGid~TdE
z*ifr}Zq>=a`2j^^;CV5oPR~;q6bltX(b@xa)%UzYgPE?gT0zdj4bP+s_c|{S(!Idv
zYQ4{7X|t|qGUZ!ksJ5J`n5`C-K3#3?n@UnXO_S4)
z7g(6i^x3I{4q9KJXs;#r5U9)}FZU8l3u&J*{*;KqP35ujXMM6^6PTvVjVw%_JjiF>k&bM!`bn(rehWlQ
zm2t8W;Z4frR@#b}X%o>B*>kr1sAhj>Rew=npG%ACk(Zm!lD|v|WD3?@1Jv=TY4_yi
zbzs1jVEjBYWsISh+9-Rl09~Bb*k=tD(JTQjsRBL`lcxdP5IYsSffMPTEK(Ik!R}@H
z5YHxfd)}btOCa$5m*G{RlpKi>4u%blm<(r|Xq<=uubkOdj58^Cc)k$_XW_v^SGnMl
zQgbF$DTAP7^{~ZFgI0USlwJcRKp55Ap-a(;iS3T|m@)mDK^gu)s_ZX!lSRUfIShaV
zjCtFSN3uz0JnwlsQ|bw2!r*K95W!G)y{hm+{kuS{4~
zO!;V0n6J1e;akuS(OKSx*dEn|L!(B>R4^PK)&XX96XhpsVCn1;P2U=mKCh*oc>$yg
zhlT&F!FHA?m9K|BO=27A5w|_U|NZQ>!&=e#vgrIZjY_b6^u`^;M6(ucCHwk-?I_`~
zVx;1Z2w%S&We@jMA3W}+LWr1Au)6^cxL4`9V}9~!>BUg$F{3~SpLeVWf4DwMcPdIj
za?~W*$wzy-7#n$hJbcK7{pKGf_QGR5M~nNJj(SfOJ@9$@5l3f1_^c%+=>m2N_2gzgROXqFjfaJa6MXP0aK^I?tqg0VC!YktWN(f7yC>
z13{5yunwb=oLrtNF*?(MR`SSODlrGdC7opABnPT@xFK-q!&Z$QUAY{GJBZ8<)e~dGWrHBe
zb2pqg5POR%f#0`kM$Mj16eWrhBFkfHjMkNiCiqd3Q=^Jx-kHh+)*LRFbLy^MuEWID
zCvl(?ChBe}TnvD0Bp;n+Qe?>NDfD89(b_=8a!qBP9~2UYL(XER;cu5jafQT`oQhs=
z16v)TbhjQI4fb9ZeET|F(OE-xHh{E0yt>UKKJWeh^YU3sOkFEu^VjyTCfqmhD)P`U
z*gsb7pQj1_jLdy-prE11?mrhu|20lO4g5P}_>gjbwugfW62!j}(C<$FOhFGiKb>0q
zt@C5b{4Zw@bMj|SkLI6h|2aVMCq#dq1^A^MaX+O0cKX-J
zfIrp$hx`Ez^t%TCcfP5f`0#Xl|lS@Qg40q>raez5R&0rY=?_4~W4BK%PO
zivj$7g#5_?{_^PdPqkl+;GbRob3gOT!2bQJaNp&B!uG#9{lL2aY!49*{2AfjIQZXt
k{wE9np!+jw75}CCi<4K8hx;*EG4D^eAl%D2l0E4CAJID_EdT%j
literal 0
HcmV?d00001
diff --git a/dbm-ui/frontend/src/common/const.ts b/dbm-ui/frontend/src/common/const.ts
index 94b83a93e6..b013941446 100644
--- a/dbm-ui/frontend/src/common/const.ts
+++ b/dbm-ui/frontend/src/common/const.ts
@@ -316,6 +316,10 @@ export enum TicketTypes {
MONGODB_BACKUP = 'MONGODB_BACKUP', // mongo 库表备份
MONGODB_RESTORE = 'MONGODB_RESTORE', // mongo 定点构造
MONGODB_TEMPORARY_DESTROY = 'MONGODB_TEMPORARY_DESTROY', // mongo 临时集群销毁
+ SQLSERVER_AUTHORIZE_RULES = 'SQLSERVER_AUTHORIZE_RULES', // sqlserver 集群授权
+ SQLSERVER_EXCEL_AUTHORIZE_RULES = 'SQLSERVER_EXCEL_AUTHORIZE_RULES', // sqlserver 导入授权
+ SQLSERVER_RESET = 'SQLSERVER_RESET', // sqlserver 集群重置
+ SQLSERVER_BACKUP_DBS = 'SQLSERVER_BACKUP_DBS', // sqlserver 数据库备份
}
export type TicketTypesStrings = keyof typeof TicketTypes;
@@ -499,6 +503,8 @@ export enum UserPersonalSettings {
MONGODB_INSTANCE_TABLE_SETTINGS = 'MONGODB_INSTANCE_TABLE_SETTINGS',
MONGODB_REPLICA_SET_SETTINGS = 'MONGODB_REPLICA_SET_SETTINGS',
MONGODB_SHARED_CLUSTER_SETTINGS = 'MONGODB_SHARED_CLUSTER_SETTINGS',
+ SQLSERVER_SINGLE_TABLE_SETTINGS = 'SQLSERVER_SINGLE_TABLE_SETTINGS',
+ SQLSERVER_HA_TABLE_SETTINGS = 'SQLSERVER_HA_TABLE_SETTINGS',
}
/**
@@ -558,6 +564,7 @@ export enum AccountTypes {
MYSQL = 'mysql',
TENDBCLUSTER = 'tendbcluster',
MONGODB = 'mongodb',
+ SQLSERVER = 'sqlserver',
}
export type AccountTypesValues = `${AccountTypes}`;
diff --git a/dbm-ui/frontend/src/components/cluster-authorize/ClusterAuthorize.vue b/dbm-ui/frontend/src/components/cluster-authorize/ClusterAuthorize.vue
index 4cd65ab6f9..52836c7ef6 100644
--- a/dbm-ui/frontend/src/components/cluster-authorize/ClusterAuthorize.vue
+++ b/dbm-ui/frontend/src/components/cluster-authorize/ClusterAuthorize.vue
@@ -26,7 +26,7 @@
-
-
-
-
-
- {{ t('添加账号规则') }}
-
-
-
- {{ t('全部清空') }}
-
-
-
-
-
-
+
{{ t('权限规则') }}
@@ -160,6 +129,38 @@
:empty-text="t('请选择访问DB')" />
+
+
+
+
+
+ {{ t('添加账号规则') }}
+
+
+
+ {{ t('全部清空') }}
+
+
+
+
+
-
+
@@ -203,17 +205,19 @@
import MongodbModel from '@services/model/mongodb/mongodb';
import MongodbPermissonAccountModel from '@services/model/mongodb-permission/mongodb-permission-account';
+ import SqlserverPermissionAccountModel from '@services/model/sqlserver-permission/sqlserver-permission-account';
import { getPermissionRules, preCheckAuthorizeRules } from '@services/permission';
import { checkHost } from '@services/source/ipchooser';
import { getMongodbPermissionRules } from '@services/source/mongodbPermissionAccount';
import { preCheckMongodbAuthorizeRules } from '@services/source/mongodbPermissionAuthorize';
+ import { getSqlserverPermissionRules } from '@services/source/sqlserverPermissionAccount';
+ import { preCheckSqlserverAuthorizeRules } from '@services/source/sqlserverPermissionAuthorize';
import { createTicket } from '@services/source/ticket';
import { getWhitelist } from '@services/source/whitelist';
import type { AuthorizePreCheckData, PermissionRule } from '@services/types/permission';
import { useCopy, useInfo, useStickyFooter, useTicketMessage } from '@hooks';
- import type { AccountTypesValues } from '@common/const';
import { AccountTypes, ClusterTypes, TicketTypes } from '@common/const';
import ClusterSelectorNew, { type TabConfig } from '@components/cluster-selector-new/Index.vue';
@@ -234,9 +238,10 @@
type ResourceItem = NonNullable[number] & { isMaster?: boolean };
type MysqlPreCheckResulst = ServiceReturnType
type MongoPreCheckResulst = ServiceReturnType
+ type SqlserverPreCheckResulst = ServiceReturnType
interface Props {
- accountType: AccountTypesValues,
+ accountType: AccountTypes,
user?: string,
accessDbs?: string[],
selected?: {
@@ -281,6 +286,14 @@
name: t('分片集群'),
showPreviewResultTitle: true,
},
+ [ClusterTypes.SQLSERVER_SINGLE]: {
+ name: t('单节点集群'),
+ showPreviewResultTitle: true,
+ },
+ [ClusterTypes.SQLSERVER_HA]: {
+ name: t('主从集群'),
+ showPreviewResultTitle: true,
+ },
};
/**
@@ -314,7 +327,7 @@
/** 权限规则功能 */
const accountState = reactive({
isLoading: false,
- rules: [] as PermissionRule[] | MongodbPermissonAccountModel[],
+ rules: [] as PermissionRule[] | MongodbPermissonAccountModel[] | SqlserverPermissionAccountModel[],
});
const clusterState = reactive({
@@ -344,6 +357,8 @@
],
});
+ const isMysql = computed(() => [AccountTypes.MYSQL, AccountTypes.TENDBCLUSTER].includes(props.accountType))
+
const collapseTableColumns = computed(() => {
const columns = [
{
@@ -419,7 +434,7 @@
tableProps,
} = clusterState;
selected[clusterType] = tableProps.data;
- return selected as unknown as Record;
+ return selected as unknown as Record;
});
const tabListConfig = computed(() => props.clusterTypes.reduce((prevConfig, clusterTypeItem) => ({
@@ -431,6 +446,7 @@
[AccountTypes.MYSQL]: TicketTypes.MYSQL_AUTHORIZE_RULES,
[AccountTypes.TENDBCLUSTER]: TicketTypes.TENDBCLUSTER_AUTHORIZE_RULES,
[AccountTypes.MONGODB]: TicketTypes.MONGODB_AUTHORIZE,
+ [AccountTypes.SQLSERVER]: TicketTypes.SQLSERVER_AUTHORIZE_RULES
};
const bizId = window.PROJECT_CONFIG.BIZ_ID;
@@ -497,6 +513,7 @@
[AccountTypes.MYSQL]: getPermissionRules,
[AccountTypes.TENDBCLUSTER]: getPermissionRules,
[AccountTypes.MONGODB]: getMongodbPermissionRules,
+ [AccountTypes.SQLSERVER]: getSqlserverPermissionRules
};
apiMap[props.accountType]({
@@ -522,6 +539,8 @@
[ClusterTypes.TENDBCLUSTER]: 'Spider',
[ClusterTypes.MONGO_REPLICA_SET]: t('副本集'),
[ClusterTypes.MONGO_SHARED_CLUSTER]: t('分片集群'),
+ [ClusterTypes.SQLSERVER_SINGLE]: t('单节点'),
+ [ClusterTypes.SQLSERVER_HA]: t('主从'),
};
return clusterTextMap[clusterState.clusterType];
});
@@ -621,6 +640,7 @@
[AccountTypes.MYSQL]: 'PermissionRules',
[AccountTypes.TENDBCLUSTER]: 'spiderPermission',
[AccountTypes.MONGODB]: 'MongodbPermission',
+ [AccountTypes.SQLSERVER]: 'SqlServerPermissionRules'
};
const url = router.resolve({ name: routeMap[props.accountType] });
window.open(url.href, '_blank');
@@ -629,7 +649,10 @@
/**
* 创建授权单据
*/
- const createAuthorizeTicket = (uid: string, data: MysqlPreCheckResulst['authorize_data'] | MongoPreCheckResulst['authorize_data']) => {
+ const createAuthorizeTicket = (
+ uid: string,
+ data: MysqlPreCheckResulst['authorize_data'] | MongoPreCheckResulst['authorize_data'] | SqlserverPreCheckResulst['authorize_data']
+ ) => {
const params = {
bk_biz_id: bizId,
details: {
@@ -664,6 +687,7 @@
[AccountTypes.MYSQL]: preCheckAuthorizeRules,
[AccountTypes.TENDBCLUSTER]: preCheckAuthorizeRules,
[AccountTypes.MONGODB]: preCheckMongodbAuthorizeRules,
+ [AccountTypes.SQLSERVER]: preCheckSqlserverAuthorizeRules
};
const params = {
target_instances: formdata.target_instances,
@@ -677,6 +701,13 @@
access_dbs: selectedItem.rules.map(mapItem => mapItem.access_db),
})),
});
+ } else if (props.accountType === AccountTypes.SQLSERVER) {
+ Object.assign(params, {
+ sqlserver_users: selectedList.value.map(selectedItem => ({
+ user: selectedItem.account.user,
+ access_dbs: selectedItem.rules.map(mapItem => mapItem.access_db),
+ })),
+ });
} else {
Object.assign(params, {
access_dbs: formdata.access_dbs,
diff --git a/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/Index.vue b/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/Index.vue
index 20db994aeb..155e9939e3 100644
--- a/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/Index.vue
+++ b/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/Index.vue
@@ -27,11 +27,12 @@
class="mb-16"
:data="filters"
:placeholder="t('请输入账号或DB名')"
- style="width: 520px;"
+ style="width: 520px"
unique-select
@change="handleSearchSelectChange" />
@@ -54,24 +55,27 @@
-
+
-
diff --git a/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/components/AccountRulesTable.vue b/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/components/AccountRulesTable.vue
index ca6325d95d..b98873763e 100644
--- a/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/components/AccountRulesTable.vue
+++ b/dbm-ui/frontend/src/components/cluster-authorize/accouter-rules-selector/components/AccountRulesTable.vue
@@ -26,25 +26,28 @@
-
diff --git a/dbm-ui/frontend/src/components/cluster-common/ExcelAuthorize.vue b/dbm-ui/frontend/src/components/cluster-common/ExcelAuthorize.vue
index 75407ecae9..315b7b6e15 100644
--- a/dbm-ui/frontend/src/components/cluster-common/ExcelAuthorize.vue
+++ b/dbm-ui/frontend/src/components/cluster-common/ExcelAuthorize.vue
@@ -166,7 +166,12 @@
downloadTemplatePath: `${basePath}mongo_cluster_authorize.xlsx`,
};
}
-
+ if ([ClusterTypes.SQLSERVER_SINGLE, ClusterTypes.SQLSERVER_HA].includes(props.clusterType)) {
+ return {
+ uploadLink: `/apis/sqlserver/bizs/${globalBizsStore.currentBizId}/permission/authorize/pre_check_excel_rules/`,
+ downloadTemplatePath: `${basePath}sqlserver_cluster_authorize.xlsx`,
+ };
+ }
return {
uploadLink: `/apis/mysql/bizs/${globalBizsStore.currentBizId}/permission/authorize/pre_check_excel_rules/`,
downloadTemplatePath: `${basePath}cluster-authorize.xlsx`,
@@ -195,7 +200,10 @@
excel_url: excelState.precheck.excelUrl,
authorize_data_list: excelState.precheck.authorizeDataList.map((authorizeItem) => {
const authorizeItemCopy = { ...authorizeItem };
- if ([ClusterTypes.MONGO_REPLICA_SET, ClusterTypes.MONGO_SHARED_CLUSTER].includes(props.clusterType)) {
+ if ([
+ ClusterTypes.MONGO_REPLICA_SET,
+ ClusterTypes.MONGO_SHARED_CLUSTER,
+ ].includes(props.clusterType)) {
delete authorizeItemCopy.source_ips;
}
return authorizeItemCopy;
diff --git a/dbm-ui/frontend/src/components/cluster-event-change/EventChange.vue b/dbm-ui/frontend/src/components/cluster-event-change/EventChange.vue
index c405465f54..e35975e7da 100644
--- a/dbm-ui/frontend/src/components/cluster-event-change/EventChange.vue
+++ b/dbm-ui/frontend/src/components/cluster-event-change/EventChange.vue
@@ -57,7 +57,7 @@
interface Props {
id: number, // 集群 or 实例 id
- isFetchInstance: boolean
+ isFetchInstance?: boolean
}
const props = withDefaults(defineProps(), {
diff --git a/dbm-ui/frontend/src/components/cluster-selector-new/components/sqlserver/Index.vue b/dbm-ui/frontend/src/components/cluster-selector-new/components/sqlserver/Index.vue
index 5652529685..96f9b8738c 100644
--- a/dbm-ui/frontend/src/components/cluster-selector-new/components/sqlserver/Index.vue
+++ b/dbm-ui/frontend/src/components/cluster-selector-new/components/sqlserver/Index.vue
@@ -12,29 +12,31 @@
-->
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/Index.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/Index.vue
new file mode 100644
index 0000000000..c88ead678c
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/Index.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/Index.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/Index.vue
new file mode 100644
index 0000000000..2d31536e37
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/Index.vue
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+
+ handleAppend(index)"
+ @input-backup-dbs-finish="(backupDbs: string[]) => handleDbListChange(index, backupDbs, 'backupDbs')"
+ @input-cluster-finish="(domain: string) => handleClusterChange(index, domain)"
+ @input-ignore-dbs-finish="(ignoreDbs: string[]) => handleDbListChange(index, ignoreDbs, 'ignoreDbs')"
+ @remove="() => handleRemove(index)"
+ @show-final-reviewer="() => handleShowFianlDbReviewer(item)" />
+
+
+
+
+
+ {{ t('全量备份') }}
+
+
+ {{ t('增量备份') }}
+
+
+
+
+
+
+
+
+
+ 3 {{ t('年') }}
+ 30 {{ t('天') }}
+
+
+
+ 15 {{ t('天') }}
+
+
+
+
+
+
+
+
+ {{ t('提交') }}
+
+
+
+ {{ t('重置') }}
+
+
+
+
+
+
+
+ {{ t('预览DB结果列表') }}
+ {{ currentRowData.domain }}
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/BatchEntry/Index.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/BatchEntry/Index.vue
new file mode 100644
index 0000000000..814e97df62
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/BatchEntry/Index.vue
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('n处格式错误', [inputInvalidStack.length]) }}
+
+
+
+ ;
+ {{ t('n处缺少匹配对象', [inputErrorStack.length]) }}
+
+
+
+ ;
+ {{ t('n处目标集群不存在', [inputClusterErrorStack.length]) }}
+
+
+
+
+
+
+ {{ t('确定') }}
+
+
+ {{ t('取消') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/FianlDbReviewer/Index.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/FianlDbReviewer/Index.vue
new file mode 100644
index 0000000000..858c2417ee
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/FianlDbReviewer/Index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+ {{ t('备份DB名') }}
+
+
+ {{ t('忽略DB名') }}
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+
+
+
+ {{ t('最终DB') }}
+ ({{ t('共n个', [finalDbs.length]) }})
+
+
+ {{ t('复制') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/Index.vue
new file mode 100644
index 0000000000..0bd133a2e4
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/Index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+ {{ t('目标集群') }}
+
+
+
+
+
+
+
+ {{ t('备份DB名') }}
+
+
+ {{ t('忽略DB名') }}
+
+
+ {{ t('最终DB') }}
+
+
+ {{ t('操作') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDbName.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDbName.vue
new file mode 100644
index 0000000000..eac49289e4
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDbName.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDomain.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDomain.vue
new file mode 100644
index 0000000000..7501a2553f
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderDomain.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderRow.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderRow.vue
new file mode 100644
index 0000000000..0a1abb35ca
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page1/components/RenderData/RenderRow.vue
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+ {{ finalDbs.length }}
+
+
+
+ {{ t('自动生成') }}
+
+ |
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page2/Index.vue b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page2/Index.vue
new file mode 100644
index 0000000000..30b0074794
--- /dev/null
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/db-backup/pages/page2/Index.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ t('数据库备份任务提交成功') }}
+
+
+
+ {{ t('我的服务单') }}
+
+
+
+
+ {{ t('去看看') }}
+
+
+ {{ t('继续提单') }}
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/ha-cluster-list/components/List.vue b/dbm-ui/frontend/src/views/sqlserver-manage/ha-cluster-list/components/List.vue
index effdabd2bd..b6d329d9a8 100644
--- a/dbm-ui/frontend/src/views/sqlserver-manage/ha-cluster-list/components/List.vue
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/ha-cluster-list/components/List.vue
@@ -97,8 +97,8 @@
+ :settings="settings"
+ @selection="handleSelection"
+ @setting-change="updateTableSettings" />
+ :cluster-type="ClusterTypes.SQLSERVER_HA"
+ :ticket-type="TicketTypes.SQLSERVER_EXCEL_AUTHORIZE_RULES"/>
+
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/AccountDialog.vue b/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/AccountDialog.vue
index a38301f706..b3ca86d255 100644
--- a/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/AccountDialog.vue
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/AccountDialog.vue
@@ -106,6 +106,7 @@
} from '@services/permission';
import { createSqlserverAccount } from '@services/source/sqlserverPermissionAccount';
+ import { AccountTypes } from '@common/const';
import { dbTippy } from '@common/tippy';
import { messageSuccess } from '@utils';
@@ -408,6 +409,7 @@
runCreateAccount({
password: getEncryptPassword(),
user: formData.user,
+ account_type: AccountTypes.SQLSERVER
});
};
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/CreateRule.vue b/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/CreateRule.vue
index 927c0789b3..27b342930c 100644
--- a/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/CreateRule.vue
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/permission/components/CreateRule.vue
@@ -6,7 +6,7 @@
:width="640"
@closed="handleClose">
handleSelectAllPrivileges(value)">
- db_owner({{ t('包含所有权限,其他权限无需授予') }})
+ db_owner ( {{ t('包含所有权限,其他权限无需授予') }} )
@@ -113,22 +113,26 @@
import { useI18n } from 'vue-i18n';
import { useRequest } from 'vue-request';
+ import SqlserverPermissionAccountModel from '@services/model/sqlserver-permission/sqlserver-permission-account';
import {
addSqlserverAccountRule,
querySqlserverAccountRules,
} from '@services/source/sqlserverPermissionAccount';
- import type { PermissionRuleAccount } from '@services/types/permission';
import {
useInfo,
useStickyFooter,
} from '@hooks';
+ import DbForm from '@components/db-form/index.vue'
+
import { messageSuccess } from '@utils';
+ import { AccountTypes } from '@/common/const';
+
interface Props {
accountId: number
- accountMapList: PermissionRuleAccount[]
+ accountMapList: SqlserverPermissionAccountModel['account'][]
dbOperations: string[]
}
@@ -147,14 +151,14 @@
default: false,
});
- const ruleRef = ref();
+ const formRef = ref>();
const checkAllPrivileges = ref(false);
- const existDBs = ref();
+ const existDBs = ref([]);
const textareaRef = ref();
const textareaHeight = ref(0);
/** 设置底部按钮粘性布局 */
- useStickyFooter(ruleRef);
+ useStickyFooter(formRef);
const { t } = useI18n();
@@ -170,19 +174,27 @@
/**
* 校验规则重复性
*/
- const verifyAccountRules = async () => {
+ const verifyAccountRules = () => {
+ existDBs.value = [];
+
+ const userInfo = props.accountMapList.find((item) => item.account_id === formData.account_id)
const dbs = formData.access_db.replace(/\n|;/g, ',')
.split(',')
.filter(db => db);
- if (!dbs.length) {
+
+ if (!userInfo || dbs.length === 0) {
return false;
}
- const res = await querySqlserverAccountRules({
- user: String(formData.account_id),
+
+ return querySqlserverAccountRules({
+ user: userInfo.user,
access_dbs: dbs,
- });
- existDBs.value = res.results[0].rules.map(item => item.access_db);
- return !res.results[0].rules.length;
+ })
+ .then((res) => {
+ const rules = res.results[0]?.rules || [];
+ existDBs.value = rules.map(item => item.access_db);
+ return rules.length === 0;
+ });
};
const rules = {
@@ -202,7 +214,7 @@
},
{
trigger: 'blur',
- message: () => t('该账号下已存在xx规则', [existDBs.value?.join(',')]),
+ message: () => t('该账号下已存在xx规则', [existDBs.value.join(',')]),
validator: verifyAccountRules,
},
],
@@ -214,7 +226,7 @@
const {
loading: isSubmitting,
- run: runaddSqlserverAccountRule,
+ run: addSqlserverAccountRuleRun,
} = useRequest(addSqlserverAccountRule, {
manual: true,
onSuccess() {
@@ -294,16 +306,23 @@
* 提交功能
*/
const handleSubmit = async () => {
- await ruleRef.value.validate();
- if (checkAllPrivileges.value) {
- // 包含所有权限
- formData.privilege = ['all privileges'];
- }
- runaddSqlserverAccountRule({
+ await formRef.value!.validate();
+ const params = {
access_db: formData.access_db.replace(/\n|;/g, ','), // 统一分隔符
- privilege: formData.privilege,
+ privilege: {},
account_id: formData.account_id,
- });
+ account_type: AccountTypes.SQLSERVER
+ }
+ if (checkAllPrivileges.value) {
+ Object.assign(params.privilege, {
+ sqlserver_owner: ['db_owner']
+ })
+ } else {
+ Object.assign(params.privilege, {
+ sqlserver_dml: formData.privilege
+ })
+ }
+ addSqlserverAccountRuleRun(params);
};
@@ -363,13 +382,9 @@
.check-all {
position: relative;
- width: 48px;
+ width: 50px;
margin-right: 48px;
- :deep(.bk-checkbox-label) {
- font-weight: bold;
- }
-
&::after {
position: absolute;
top: 50%;
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/routes.ts b/dbm-ui/frontend/src/views/sqlserver-manage/routes.ts
index a14dfd7b66..5f276c1188 100644
--- a/dbm-ui/frontend/src/views/sqlserver-manage/routes.ts
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/routes.ts
@@ -42,6 +42,14 @@ const routes: RouteRecordRaw[] = [
},
component: () => import('@views/sqlserver-manage/permission/Index.vue'),
},
+ {
+ name: 'SqlServerDbBackup',
+ path: 'sqlserver-db-backup/:page?',
+ meta: {
+ navName: t('数据库备份'),
+ },
+ component: () => import('@views/sqlserver-manage/db-backup/Index.vue'),
+ },
],
},
];
diff --git a/dbm-ui/frontend/src/views/sqlserver-manage/single-cluster/components/List.vue b/dbm-ui/frontend/src/views/sqlserver-manage/single-cluster/components/List.vue
index fe89ad0164..e2ca87e1f9 100644
--- a/dbm-ui/frontend/src/views/sqlserver-manage/single-cluster/components/List.vue
+++ b/dbm-ui/frontend/src/views/sqlserver-manage/single-cluster/components/List.vue
@@ -97,8 +97,8 @@
@@ -108,20 +108,29 @@
:data-source="getSingleClusterList"
:row-class="setRowClass"
selectable
- @selection="handleSelection" />
+ :settings="settings"
+ @selection="handleSelection"
+ @setting-change="updateTableSettings" />
+ :cluster-type="ClusterTypes.SQLSERVER_SINGLE"
+ :ticket-type="TicketTypes.SQLSERVER_EXCEL_AUTHORIZE_RULES"/>
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterOperation.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterOperation.vue
new file mode 100644
index 0000000000..e3b8fb5625
--- /dev/null
+++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterOperation.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterReset.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterReset.vue
new file mode 100644
index 0000000000..3d9ee2d959
--- /dev/null
+++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/ClusterReset.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/DbBackup.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/DbBackup.vue
new file mode 100644
index 0000000000..221796a06b
--- /dev/null
+++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/DbBackup.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/Details.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/Details.vue
new file mode 100644
index 0000000000..401037dcf2
--- /dev/null
+++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/sqlserver/Details.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbm-ui/frontend/src/views/version-files/list/Index.vue b/dbm-ui/frontend/src/views/version-files/list/Index.vue
index c026d36d9f..f5ae952e96 100644
--- a/dbm-ui/frontend/src/views/version-files/list/Index.vue
+++ b/dbm-ui/frontend/src/views/version-files/list/Index.vue
@@ -294,6 +294,19 @@
},
],
},
+ {
+ controller: {
+ moduleId: 'sqlserver',
+ },
+ label: 'SQLServer',
+ name: DBTypes.SQLSERVER,
+ children: [
+ {
+ label: 'SQLServer',
+ name: DBTypes.SQLSERVER,
+ },
+ ],
+ },
];
const renderTabs = tabs.filter((item) => {