cloudisk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/.env.example +17 -0
  2. package/README.md +120 -0
  3. package/dist/config/index.d.ts +27 -0
  4. package/dist/config/index.d.ts.map +1 -0
  5. package/dist/config/index.js +45 -0
  6. package/dist/config/index.js.map +1 -0
  7. package/dist/dto/auth.dto.d.ts +14 -0
  8. package/dist/dto/auth.dto.d.ts.map +1 -0
  9. package/dist/dto/auth.dto.js +16 -0
  10. package/dist/dto/auth.dto.js.map +1 -0
  11. package/dist/dto/user.dto.d.ts +76 -0
  12. package/dist/dto/user.dto.d.ts.map +1 -0
  13. package/dist/dto/user.dto.js +70 -0
  14. package/dist/dto/user.dto.js.map +1 -0
  15. package/dist/handlers/auth.handler.d.ts +10 -0
  16. package/dist/handlers/auth.handler.d.ts.map +1 -0
  17. package/dist/handlers/auth.handler.js +41 -0
  18. package/dist/handlers/auth.handler.js.map +1 -0
  19. package/dist/handlers/disk.handler.d.ts +12 -0
  20. package/dist/handlers/disk.handler.d.ts.map +1 -0
  21. package/dist/handlers/disk.handler.js +61 -0
  22. package/dist/handlers/disk.handler.js.map +1 -0
  23. package/dist/handlers/samba.handler.d.ts +16 -0
  24. package/dist/handlers/samba.handler.d.ts.map +1 -0
  25. package/dist/handlers/samba.handler.js +120 -0
  26. package/dist/handlers/samba.handler.js.map +1 -0
  27. package/dist/handlers/share.handler.d.ts +11 -0
  28. package/dist/handlers/share.handler.d.ts.map +1 -0
  29. package/dist/handlers/share.handler.js +52 -0
  30. package/dist/handlers/share.handler.js.map +1 -0
  31. package/dist/handlers/system.handler.d.ts +17 -0
  32. package/dist/handlers/system.handler.d.ts.map +1 -0
  33. package/dist/handlers/system.handler.js +210 -0
  34. package/dist/handlers/system.handler.js.map +1 -0
  35. package/dist/handlers/user.handler.d.ts +16 -0
  36. package/dist/handlers/user.handler.d.ts.map +1 -0
  37. package/dist/handlers/user.handler.js +101 -0
  38. package/dist/handlers/user.handler.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +799 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lib/errors.d.ts +13 -0
  44. package/dist/lib/errors.d.ts.map +1 -0
  45. package/dist/lib/errors.js +35 -0
  46. package/dist/lib/errors.js.map +1 -0
  47. package/dist/lib/log-buffer.d.ts +20 -0
  48. package/dist/lib/log-buffer.d.ts.map +1 -0
  49. package/dist/lib/log-buffer.js +75 -0
  50. package/dist/lib/log-buffer.js.map +1 -0
  51. package/dist/lib/response.d.ts +5 -0
  52. package/dist/lib/response.d.ts.map +1 -0
  53. package/dist/lib/response.js +19 -0
  54. package/dist/lib/response.js.map +1 -0
  55. package/dist/lib/shell.d.ts +9 -0
  56. package/dist/lib/shell.d.ts.map +1 -0
  57. package/dist/lib/shell.js +32 -0
  58. package/dist/lib/shell.js.map +1 -0
  59. package/dist/middleware/auth.d.ts +17 -0
  60. package/dist/middleware/auth.d.ts.map +1 -0
  61. package/dist/middleware/auth.js +43 -0
  62. package/dist/middleware/auth.js.map +1 -0
  63. package/dist/middleware/error-handler.d.ts +3 -0
  64. package/dist/middleware/error-handler.d.ts.map +1 -0
  65. package/dist/middleware/error-handler.js +14 -0
  66. package/dist/middleware/error-handler.js.map +1 -0
  67. package/dist/middleware/logger.d.ts +3 -0
  68. package/dist/middleware/logger.d.ts.map +1 -0
  69. package/dist/middleware/logger.js +25 -0
  70. package/dist/middleware/logger.js.map +1 -0
  71. package/dist/middleware/validate.d.ts +3 -0
  72. package/dist/middleware/validate.d.ts.map +1 -0
  73. package/dist/middleware/validate.js +28 -0
  74. package/dist/middleware/validate.js.map +1 -0
  75. package/dist/operators/disk.operator.d.ts +29 -0
  76. package/dist/operators/disk.operator.d.ts.map +1 -0
  77. package/dist/operators/disk.operator.js +70 -0
  78. package/dist/operators/disk.operator.js.map +1 -0
  79. package/dist/operators/linux-user.operator.d.ts +13 -0
  80. package/dist/operators/linux-user.operator.d.ts.map +1 -0
  81. package/dist/operators/linux-user.operator.js +47 -0
  82. package/dist/operators/linux-user.operator.js.map +1 -0
  83. package/dist/operators/quota.operator.d.ts +18 -0
  84. package/dist/operators/quota.operator.d.ts.map +1 -0
  85. package/dist/operators/quota.operator.js +54 -0
  86. package/dist/operators/quota.operator.js.map +1 -0
  87. package/dist/operators/samba.operator.d.ts +41 -0
  88. package/dist/operators/samba.operator.d.ts.map +1 -0
  89. package/dist/operators/samba.operator.js +274 -0
  90. package/dist/operators/samba.operator.js.map +1 -0
  91. package/dist/operators/share.operator.d.ts +21 -0
  92. package/dist/operators/share.operator.d.ts.map +1 -0
  93. package/dist/operators/share.operator.js +67 -0
  94. package/dist/operators/share.operator.js.map +1 -0
  95. package/dist/repositories/admin.repo.d.ts +30 -0
  96. package/dist/repositories/admin.repo.d.ts.map +1 -0
  97. package/dist/repositories/admin.repo.js +20 -0
  98. package/dist/repositories/admin.repo.js.map +1 -0
  99. package/dist/repositories/user.repo.d.ts +44 -0
  100. package/dist/repositories/user.repo.d.ts.map +1 -0
  101. package/dist/repositories/user.repo.js +3 -0
  102. package/dist/repositories/user.repo.js.map +1 -0
  103. package/dist/repositories/user.repo.sqlite.d.ts +16 -0
  104. package/dist/repositories/user.repo.sqlite.d.ts.map +1 -0
  105. package/dist/repositories/user.repo.sqlite.js +47 -0
  106. package/dist/repositories/user.repo.sqlite.js.map +1 -0
  107. package/dist/routes/auth.routes.d.ts +4 -0
  108. package/dist/routes/auth.routes.d.ts.map +1 -0
  109. package/dist/routes/auth.routes.js +15 -0
  110. package/dist/routes/auth.routes.js.map +1 -0
  111. package/dist/routes/disk.routes.d.ts +4 -0
  112. package/dist/routes/disk.routes.d.ts.map +1 -0
  113. package/dist/routes/disk.routes.js +16 -0
  114. package/dist/routes/disk.routes.js.map +1 -0
  115. package/dist/routes/index.d.ts +4 -0
  116. package/dist/routes/index.d.ts.map +1 -0
  117. package/dist/routes/index.js +64 -0
  118. package/dist/routes/index.js.map +1 -0
  119. package/dist/routes/samba.routes.d.ts +4 -0
  120. package/dist/routes/samba.routes.d.ts.map +1 -0
  121. package/dist/routes/samba.routes.js +20 -0
  122. package/dist/routes/samba.routes.js.map +1 -0
  123. package/dist/routes/share.routes.d.ts +4 -0
  124. package/dist/routes/share.routes.d.ts.map +1 -0
  125. package/dist/routes/share.routes.js +15 -0
  126. package/dist/routes/share.routes.js.map +1 -0
  127. package/dist/routes/system.routes.d.ts +4 -0
  128. package/dist/routes/system.routes.d.ts.map +1 -0
  129. package/dist/routes/system.routes.js +20 -0
  130. package/dist/routes/system.routes.js.map +1 -0
  131. package/dist/routes/user.routes.d.ts +5 -0
  132. package/dist/routes/user.routes.d.ts.map +1 -0
  133. package/dist/routes/user.routes.js +44 -0
  134. package/dist/routes/user.routes.js.map +1 -0
  135. package/dist/services/auth.service.d.ts +23 -0
  136. package/dist/services/auth.service.d.ts.map +1 -0
  137. package/dist/services/auth.service.js +62 -0
  138. package/dist/services/auth.service.js.map +1 -0
  139. package/dist/services/disk.service.d.ts +12 -0
  140. package/dist/services/disk.service.d.ts.map +1 -0
  141. package/dist/services/disk.service.js +34 -0
  142. package/dist/services/disk.service.js.map +1 -0
  143. package/dist/services/init.service.d.ts +8 -0
  144. package/dist/services/init.service.d.ts.map +1 -0
  145. package/dist/services/init.service.js +47 -0
  146. package/dist/services/init.service.js.map +1 -0
  147. package/dist/services/quota.service.d.ts +14 -0
  148. package/dist/services/quota.service.d.ts.map +1 -0
  149. package/dist/services/quota.service.js +32 -0
  150. package/dist/services/quota.service.js.map +1 -0
  151. package/dist/services/samba.service.d.ts +45 -0
  152. package/dist/services/samba.service.d.ts.map +1 -0
  153. package/dist/services/samba.service.js +61 -0
  154. package/dist/services/samba.service.js.map +1 -0
  155. package/dist/services/share.service.d.ts +18 -0
  156. package/dist/services/share.service.d.ts.map +1 -0
  157. package/dist/services/share.service.js +29 -0
  158. package/dist/services/share.service.js.map +1 -0
  159. package/dist/services/user.service.d.ts +48 -0
  160. package/dist/services/user.service.d.ts.map +1 -0
  161. package/dist/services/user.service.js +196 -0
  162. package/dist/services/user.service.js.map +1 -0
  163. package/dist/types/index.d.ts +7 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/index.js +23 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/dist/types/service.interfaces.d.ts +45 -0
  168. package/dist/types/service.interfaces.d.ts.map +1 -0
  169. package/dist/types/service.interfaces.js +3 -0
  170. package/dist/types/service.interfaces.js.map +1 -0
  171. package/package.json +63 -0
  172. package/prisma/schema.prisma +53 -0
  173. package/public/assets/Dashboard-BupoWE_7.js +1 -0
  174. package/public/assets/DiskManage-BY6Sy7T6.js +1 -0
  175. package/public/assets/InitWizard-CA9epEkr.css +1 -0
  176. package/public/assets/InitWizard-D5Xj7dX0.js +1 -0
  177. package/public/assets/Layout-D-CPXnPP.js +1 -0
  178. package/public/assets/Layout-DaQY8YzE.css +1 -0
  179. package/public/assets/LogViewer-CIJZzoXw.css +1 -0
  180. package/public/assets/LogViewer-DDAIjW9J.js +1 -0
  181. package/public/assets/Login-D92i6dQA.js +1 -0
  182. package/public/assets/Login-DimFYijw.css +1 -0
  183. package/public/assets/ServiceManage-CIWLurL_.css +1 -0
  184. package/public/assets/ServiceManage-D-ZWP7Ry.js +1 -0
  185. package/public/assets/ShareManage-BMsFoGea.js +1 -0
  186. package/public/assets/UserList-CqeA7r2Y.js +1 -0
  187. package/public/assets/index-B-crAlzg.css +1 -0
  188. package/public/assets/index-CfC5GCM9.js +100 -0
  189. package/public/index.html +14 -0
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=service.interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.interfaces.js","sourceRoot":"","sources":["../../src/types/service.interfaces.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "cloudisk",
3
+ "version": "1.0.0",
4
+ "description": "Samba 文件共享管理平台",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "cloudisk": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "dev": "tsx watch src/index.ts",
11
+ "build:frontend": "cd ../frontend && npm run build",
12
+ "build:backend": "tsc",
13
+ "build": "npm run build:frontend && npm run build:backend",
14
+ "start": "node dist/index.js",
15
+ "postinstall": "prisma generate",
16
+ "test": "vitest",
17
+ "db:migrate": "prisma migrate dev",
18
+ "db:generate": "prisma generate"
19
+ },
20
+ "files": [
21
+ "dist/",
22
+ "public/",
23
+ "prisma/",
24
+ ".env.example",
25
+ "README.md"
26
+ ],
27
+ "engines": {
28
+ "node": ">=18"
29
+ },
30
+ "keywords": [
31
+ "samba",
32
+ "storage",
33
+ "management",
34
+ "file-sharing"
35
+ ],
36
+ "license": "MIT",
37
+ "dependencies": {
38
+ "@prisma/client": "^6.19.3",
39
+ "bcryptjs": "^3.0.3",
40
+ "commander": "^14.0.3",
41
+ "dotenv": "^17.4.2",
42
+ "express": "^5.2.1",
43
+ "jsonwebtoken": "^9.0.3",
44
+ "pino": "^10.3.1",
45
+ "pino-pretty": "^13.1.3",
46
+ "proper-lockfile": "^4.1.2",
47
+ "swagger-jsdoc": "^6.2.8",
48
+ "swagger-ui-express": "^5.0.1",
49
+ "zod": "^4.4.3"
50
+ },
51
+ "devDependencies": {
52
+ "@types/bcryptjs": "^2.4.6",
53
+ "@types/express": "^5.0.6",
54
+ "@types/jsonwebtoken": "^9.0.10",
55
+ "@types/proper-lockfile": "^4.1.4",
56
+ "@types/swagger-jsdoc": "^6.0.4",
57
+ "@types/swagger-ui-express": "^4.1.8",
58
+ "prisma": "^6.19.3",
59
+ "tsx": "^4.21.0",
60
+ "typescript": "^6.0.3",
61
+ "vitest": "^4.1.5"
62
+ }
63
+ }
@@ -0,0 +1,53 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "sqlite"
7
+ url = env("DATABASE_URL")
8
+ }
9
+
10
+ model User {
11
+ id Int @id @default(autoincrement())
12
+ username String @unique
13
+ password String
14
+ groupName String @map("group_name")
15
+ sharePath String @map("share_path")
16
+ quotaSoft Int @default(0) @map("quota_soft")
17
+ quotaHard Int @default(0) @map("quota_hard")
18
+ status String @default("active")
19
+ createdAt DateTime @default(now()) @map("created_at")
20
+ updatedAt DateTime @updatedAt @map("updated_at")
21
+
22
+ @@map("users")
23
+ }
24
+
25
+ model Admin {
26
+ id Int @id @default(autoincrement())
27
+ username String @unique
28
+ password String
29
+ role String @default("admin")
30
+ createdAt DateTime @default(now()) @map("created_at")
31
+ updatedAt DateTime @updatedAt @map("updated_at")
32
+
33
+ @@map("admins")
34
+ }
35
+
36
+ model AuditLog {
37
+ id Int @id @default(autoincrement())
38
+ adminId Int? @map("admin_id")
39
+ action String
40
+ target String
41
+ detail String?
42
+ ip String?
43
+ createdAt DateTime @default(now()) @map("created_at")
44
+
45
+ @@map("audit_logs")
46
+ }
47
+
48
+ model Setting {
49
+ key String @id
50
+ value String
51
+
52
+ @@map("settings")
53
+ }
@@ -0,0 +1 @@
1
+ import{d as I,m as V,x as B,y as N,n as $,c as i,q as m,w as t,f as C,a,g as f,r,e as l,s as k,b as o,t as d,u as D,o as s}from"./index-CfC5GCM9.js";const E={key:0,style:{"text-align":"center"}},q={style:{"margin-top":"10px"}},H={style:{color:"#909399"}},M={key:1,style:{"text-align":"center",color:"#909399",padding:"40px"}},O={key:0},j=I({__name:"Dashboard",setup(P){const v=D(),n=f(null),u=f(null),p=f(null);return V(async()=>{try{n.value=await B()}catch{}try{u.value=await N()}catch{}try{p.value=await $()}catch{}}),(R,e)=>{const y=r("el-button"),_=r("el-alert"),c=r("el-progress"),g=r("el-skeleton"),b=r("el-card"),w=r("el-col"),S=r("el-row");return s(),i("div",null,[u.value&&!u.value.sambaInstalled?(s(),m(_,{key:0,type:"warning",closable:!1,style:{"margin-bottom":"16px"}},{default:t(()=>[e[4]||(e[4]=l(" Samba 服务未安装,文件共享功能不可用。 ",-1)),a(y,{type:"primary",link:"",onClick:e[0]||(e[0]=x=>k(v).push("/services"))},{default:t(()=>[...e[3]||(e[3]=[l("前往安装",-1)])]),_:1})]),_:1})):C("",!0),u.value&&u.value.sambaInstalled&&!u.value.shareExists?(s(),m(_,{key:1,type:"warning",closable:!1,style:{"margin-bottom":"16px"}},{default:t(()=>[e[6]||(e[6]=l(" 共享目录不存在,请先创建共享目录。 ",-1)),a(y,{type:"primary",link:"",onClick:e[1]||(e[1]=x=>k(v).push("/disks"))},{default:t(()=>[...e[5]||(e[5]=[l("前往磁盘管理",-1)])]),_:1})]),_:1})):C("",!0),a(S,{gutter:20},{default:t(()=>[a(w,{span:12},{default:t(()=>[a(b,{shadow:"hover"},{header:t(()=>[...e[7]||(e[7]=[l("存储用量",-1)])]),default:t(()=>[n.value&&n.value.mounted?(s(),i("div",E,[a(c,{type:"dashboard",percentage:parseInt(n.value.usePercent),width:150},null,8,["percentage"]),o("p",q," 已用 "+d(n.value.used)+" / 共 "+d(n.value.total),1),o("p",H,"可用 "+d(n.value.available),1)])):n.value&&!n.value.mounted?(s(),i("div",M,[e[9]||(e[9]=o("p",null,"共享磁盘未挂载",-1)),a(y,{type:"primary",link:"",onClick:e[2]||(e[2]=x=>k(v).push("/disks"))},{default:t(()=>[...e[8]||(e[8]=[l("前往挂载",-1)])]),_:1})])):(s(),m(g,{key:2,rows:3,animated:""}))]),_:1})]),_:1}),a(w,{span:12},{default:t(()=>[a(b,{shadow:"hover"},{header:t(()=>[...e[10]||(e[10]=[l("系统信息",-1)])]),default:t(()=>[p.value?(s(),i("div",O,[o("p",null,[e[11]||(e[11]=o("b",null,"OS:",-1)),l(" "+d(p.value.os),1)]),o("p",null,[e[12]||(e[12]=o("b",null,"内核:",-1)),l(" "+d(p.value.kernel),1)]),o("p",null,[e[13]||(e[13]=o("b",null,"Samba:",-1)),l(" "+d(p.value.sambaVersion),1)])])):(s(),m(g,{key:1,rows:3,animated:""}))]),_:1})]),_:1})]),_:1})])}}});export{j as default};
@@ -0,0 +1 @@
1
+ import{k as b,d as X,m as j,c as z,a as e,w as t,r as o,g,o as D,A,q as R,b as T,e as f,h as C,E as k,B as S}from"./index-CfC5GCM9.js";function G(){return b.get("/disks")}function H(u,d){return b.post("/disks/format",{device:u,fsType:d})}function I(u,d,i){return b.post("/disks/mount",{device:u,target:d,options:i})}function J(u){return b.post("/disks/umount",{target:u})}const K={style:{display:"flex","justify-content":"space-between","align-items":"center"}},P=X({__name:"DiskManage",setup(u){const d=g([]),i=g(!1),v=g(!1),r=C({device:"",fsType:"xfs"}),a=C({device:"",target:"/share",options:"usrquota,grpquota"});async function p(){i.value=!0;try{d.value=await G()}catch{}finally{i.value=!1}}async function q(){try{await H(r.device,r.fsType),k.success("格式化成功"),p()}catch{}}async function U(){v.value=!0;try{await I(a.device,a.target,a.options),k.success("挂载成功"),p()}catch{}finally{v.value=!1}}async function h(){try{await J(a.target),k.success("卸载成功"),p()}catch{}}return j(p),(L,l)=>{const c=o("el-button"),m=o("el-table-column"),B=o("el-table"),V=o("el-card"),_=o("el-input"),s=o("el-form-item"),y=o("el-option"),E=o("el-select"),F=o("el-popconfirm"),x=o("el-form"),w=o("el-tab-pane"),M=o("el-tabs"),N=S("loading");return D(),z("div",null,[e(V,{shadow:"never"},{header:t(()=>[T("div",K,[l[6]||(l[6]=T("span",null,"磁盘设备",-1)),e(c,{icon:"Refresh",onClick:p},{default:t(()=>[...l[5]||(l[5]=[f("刷新",-1)])]),_:1})])]),default:t(()=>[A((D(),R(B,{data:d.value,border:"",stripe:""},{default:t(()=>[e(m,{prop:"name",label:"设备"}),e(m,{prop:"size",label:"大小"}),e(m,{prop:"type",label:"类型"}),e(m,{prop:"fsType",label:"文件系统"}),e(m,{prop:"mountpoint",label:"挂载点"})]),_:1},8,["data"])),[[N,i.value]])]),_:1}),e(V,{shadow:"never",style:{"margin-top":"20px"}},{header:t(()=>[...l[7]||(l[7]=[f("操作",-1)])]),default:t(()=>[e(M,null,{default:t(()=>[e(w,{label:"格式化"},{default:t(()=>[e(x,{"label-width":"100px",style:{"max-width":"500px"}},{default:t(()=>[e(s,{label:"设备路径"},{default:t(()=>[e(_,{modelValue:r.device,"onUpdate:modelValue":l[0]||(l[0]=n=>r.device=n),placeholder:"/dev/sdb"},null,8,["modelValue"])]),_:1}),e(s,{label:"文件系统"},{default:t(()=>[e(E,{modelValue:r.fsType,"onUpdate:modelValue":l[1]||(l[1]=n=>r.fsType=n)},{default:t(()=>[e(y,{label:"XFS",value:"xfs"}),e(y,{label:"EXT4",value:"ext4"}),e(y,{label:"EXT3",value:"ext3"})]),_:1},8,["modelValue"])]),_:1}),e(s,null,{default:t(()=>[e(F,{title:"格式化将清除所有数据,确认继续?",onConfirm:q},{reference:t(()=>[e(c,{type:"danger"},{default:t(()=>[...l[8]||(l[8]=[f("格式化",-1)])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),e(w,{label:"挂载"},{default:t(()=>[e(x,{"label-width":"100px",style:{"max-width":"500px"}},{default:t(()=>[e(s,{label:"设备路径"},{default:t(()=>[e(_,{modelValue:a.device,"onUpdate:modelValue":l[2]||(l[2]=n=>a.device=n),placeholder:"/dev/sdb1"},null,8,["modelValue"])]),_:1}),e(s,{label:"挂载点"},{default:t(()=>[e(_,{modelValue:a.target,"onUpdate:modelValue":l[3]||(l[3]=n=>a.target=n),placeholder:"/share"},null,8,["modelValue"])]),_:1}),e(s,{label:"挂载选项"},{default:t(()=>[e(_,{modelValue:a.options,"onUpdate:modelValue":l[4]||(l[4]=n=>a.options=n),placeholder:"usrquota,grpquota"},null,8,["modelValue"])]),_:1}),e(s,null,{default:t(()=>[e(c,{type:"primary",onClick:U,loading:v.value},{default:t(()=>[...l[9]||(l[9]=[f("挂载",-1)])]),_:1},8,["loading"]),e(c,{onClick:h},{default:t(()=>[...l[10]||(l[10]=[f("卸载",-1)])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})])}}});export{P as default};
@@ -0,0 +1 @@
1
+ .init-container[data-v-a19c9fe2]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#667eea,#764ba2)}.init-card[data-v-a19c9fe2]{width:550px;padding:20px}.init-title[data-v-a19c9fe2]{text-align:center;margin-bottom:30px;color:#303133}
@@ -0,0 +1 @@
1
+ import{d as I,c as p,a as t,w as l,r as s,u as E,o as f,b as _,e as n,f as w,g as b,h as M,i as N,j as R,E as B,_ as L}from"./index-CfC5GCM9.js";const Q={class:"init-container"},$={key:0},z={style:{"text-align":"right"}},F={key:1},W={style:{"text-align":"right"}},j={key:2},A={style:{"text-align":"right"}},D=I({__name:"InitWizard",setup(G){const P=E(),i=b(0),g=b(!1),V=b(),a=M({dbType:"sqlite",adminUsername:"",adminPassword:"",confirmPassword:"",siteTitle:"Cloud Storage Manager"}),T={adminUsername:[{required:!0,message:"请输入用户名",trigger:"blur"},{min:3,message:"用户名至少3个字符",trigger:"blur"}],adminPassword:[{required:!0,message:"请输入密码",trigger:"blur"},{min:6,message:"密码至少6个字符",trigger:"blur"}],confirmPassword:[{required:!0,message:"请确认密码",trigger:"blur"},{validator:(c,e,d)=>{e!==a.adminPassword?d(new Error("两次密码不一致")):d()},trigger:"blur"}]};async function x(){var e;await((e=V.value)==null?void 0:e.validate().catch(()=>!1))&&(i.value=2)}async function C(){g.value=!0;try{await N({dbType:a.dbType,adminUsername:a.adminUsername,adminPassword:a.adminPassword,siteTitle:a.siteTitle}),localStorage.setItem("siteTitle",a.siteTitle),R(),B.success("初始化成功,请登录"),P.push("/login")}catch{}finally{g.value=!1}}return(c,e)=>{const d=s("el-step"),U=s("el-steps"),v=s("el-radio"),k=s("el-radio-group"),r=s("el-form-item"),q=s("el-tag"),y=s("el-form"),u=s("el-button"),m=s("el-input"),S=s("el-card");return f(),p("div",Q,[t(S,{class:"init-card"},{default:l(()=>[e[17]||(e[17]=_("h2",{class:"init-title"},"系统初始化",-1)),t(U,{active:i.value,"finish-status":"success","align-center":"",style:{"margin-bottom":"30px"}},{default:l(()=>[t(d,{title:"数据库"}),t(d,{title:"管理员账户"}),t(d,{title:"站点设置"})]),_:1},8,["active"]),i.value===0?(f(),p("div",$,[t(y,{"label-width":"100px"},{default:l(()=>[t(r,{label:"数据库类型"},{default:l(()=>[t(k,{modelValue:a.dbType,"onUpdate:modelValue":e[0]||(e[0]=o=>a.dbType=o)},{default:l(()=>[t(v,{value:"sqlite"},{default:l(()=>[...e[8]||(e[8]=[n("SQLite",-1)])]),_:1}),t(v,{value:"postgresql",disabled:""},{default:l(()=>[...e[9]||(e[9]=[n("PostgreSQL (即将支持)",-1)])]),_:1}),t(v,{value:"mysql",disabled:""},{default:l(()=>[...e[10]||(e[10]=[n("MySQL (即将支持)",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,null,{default:l(()=>[t(q,{type:"info"},{default:l(()=>[...e[11]||(e[11]=[n("数据将存储在 /etc/cloudisk/data/ 目录下",-1)])]),_:1})]),_:1})]),_:1}),_("div",z,[t(u,{type:"primary",onClick:e[1]||(e[1]=o=>i.value=1)},{default:l(()=>[...e[12]||(e[12]=[n("下一步",-1)])]),_:1})])])):w("",!0),i.value===1?(f(),p("div",F,[t(y,{ref_key:"adminFormRef",ref:V,model:a,rules:T,"label-width":"100px"},{default:l(()=>[t(r,{label:"用户名",prop:"adminUsername"},{default:l(()=>[t(m,{modelValue:a.adminUsername,"onUpdate:modelValue":e[2]||(e[2]=o=>a.adminUsername=o),placeholder:"请输入管理员用户名"},null,8,["modelValue"])]),_:1}),t(r,{label:"密码",prop:"adminPassword"},{default:l(()=>[t(m,{modelValue:a.adminPassword,"onUpdate:modelValue":e[3]||(e[3]=o=>a.adminPassword=o),type:"password","show-password":"",placeholder:"请输入密码"},null,8,["modelValue"])]),_:1}),t(r,{label:"确认密码",prop:"confirmPassword"},{default:l(()=>[t(m,{modelValue:a.confirmPassword,"onUpdate:modelValue":e[4]||(e[4]=o=>a.confirmPassword=o),type:"password","show-password":"",placeholder:"请再次输入密码"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),_("div",W,[t(u,{onClick:e[5]||(e[5]=o=>i.value=0)},{default:l(()=>[...e[13]||(e[13]=[n("上一步",-1)])]),_:1}),t(u,{type:"primary",onClick:x},{default:l(()=>[...e[14]||(e[14]=[n("下一步",-1)])]),_:1})])])):w("",!0),i.value===2?(f(),p("div",j,[t(y,{"label-width":"100px"},{default:l(()=>[t(r,{label:"站点标题"},{default:l(()=>[t(m,{modelValue:a.siteTitle,"onUpdate:modelValue":e[6]||(e[6]=o=>a.siteTitle=o),placeholder:"Cloud Storage Manager"},null,8,["modelValue"])]),_:1})]),_:1}),_("div",A,[t(u,{onClick:e[7]||(e[7]=o=>i.value=1)},{default:l(()=>[...e[15]||(e[15]=[n("上一步",-1)])]),_:1}),t(u,{type:"primary",loading:g.value,onClick:C},{default:l(()=>[...e[16]||(e[16]=[n("完成初始化",-1)])]),_:1},8,["loading"])])])):w("",!0)]),_:1})])}}}),J=L(D,[["__scopeId","data-v-a19c9fe2"]]);export{J as default};
@@ -0,0 +1 @@
1
+ import{d as N,l as V,g as H,m as L,n as R,q,w as t,r as o,o as M,a as e,b as l,t as d,s as r,e as i,v as P,u as Y,_ as j}from"./index-CfC5GCM9.js";const z={class:"logo"},E={style:{margin:"0"}},G={style:{cursor:"pointer"}},J=N({__name:"Layout",setup(K){const c=P(),w=Y(),m=V(),_=H(localStorage.getItem("siteTitle")||"Cloud Storage");document.title=_.value,L(async()=>{try{const s=await R();s.siteTitle&&(_.value=s.siteTitle,document.title=s.siteTitle,localStorage.setItem("siteTitle",s.siteTitle))}catch{}});function g(s){s==="logout"&&(m.logout(),w.push("/login"))}return(s,n)=>{const v=o("Odometer"),a=o("el-icon"),u=o("el-menu-item"),x=o("User"),y=o("SetUp"),S=o("HardDrive"),D=o("FolderOpened"),T=o("Document"),C=o("el-menu"),b=o("el-aside"),h=o("ArrowDown"),k=o("el-dropdown-item"),A=o("el-dropdown-menu"),I=o("el-dropdown"),O=o("el-header"),U=o("router-view"),B=o("el-main"),F=o("el-footer"),p=o("el-container");return M(),q(p,{class:"layout"},{default:t(()=>[e(b,{width:"220px",class:"aside"},{default:t(()=>[l("div",z,d(_.value),1),e(C,{"default-active":r(c).path,router:"","background-color":"#001529","text-color":"#ffffffa6","active-text-color":"#fff"},{default:t(()=>[e(u,{index:"/dashboard"},{default:t(()=>[e(a,null,{default:t(()=>[e(v)]),_:1}),n[0]||(n[0]=l("span",null,"仪表盘",-1))]),_:1}),e(u,{index:"/users"},{default:t(()=>[e(a,null,{default:t(()=>[e(x)]),_:1}),n[1]||(n[1]=l("span",null,"用户管理",-1))]),_:1}),e(u,{index:"/services"},{default:t(()=>[e(a,null,{default:t(()=>[e(y)]),_:1}),n[2]||(n[2]=l("span",null,"服务管理",-1))]),_:1}),e(u,{index:"/disks"},{default:t(()=>[e(a,null,{default:t(()=>[e(S)]),_:1}),n[3]||(n[3]=l("span",null,"磁盘管理",-1))]),_:1}),e(u,{index:"/shares"},{default:t(()=>[e(a,null,{default:t(()=>[e(D)]),_:1}),n[4]||(n[4]=l("span",null,"共享目录",-1))]),_:1}),e(u,{index:"/logs"},{default:t(()=>[e(a,null,{default:t(()=>[e(T)]),_:1}),n[5]||(n[5]=l("span",null,"系统日志",-1))]),_:1})]),_:1},8,["default-active"])]),_:1}),e(p,{class:"main-container"},{default:t(()=>[e(O,{class:"header"},{default:t(()=>[l("h3",E,d(r(c).meta.title),1),e(I,{onCommand:g},{dropdown:t(()=>[e(A,null,{default:t(()=>[e(k,{command:"logout"},{default:t(()=>[...n[6]||(n[6]=[i("退出登录",-1)])]),_:1})]),_:1})]),default:t(()=>{var f;return[l("span",G,[i(d(((f=r(m).user)==null?void 0:f.username)||"Admin")+" ",1),e(a,null,{default:t(()=>[e(h)]),_:1})])]}),_:1})]),_:1}),e(B,{class:"main-content"},{default:t(()=>[e(U)]),_:1}),e(F,{class:"footer"},{default:t(()=>[i(" © "+d(new Date().getFullYear())+" Powered by Suanxiang ",1)]),_:1})]),_:1})]),_:1})}}}),W=j(J,[["__scopeId","data-v-75ab68aa"]]);export{W as default};
@@ -0,0 +1 @@
1
+ .layout[data-v-75ab68aa]{height:100vh;overflow:hidden}.aside[data-v-75ab68aa]{background:#001529;overflow-y:auto}.logo[data-v-75ab68aa]{height:60px;line-height:60px;text-align:center;color:#fff;font-size:18px;font-weight:700;border-bottom:1px solid #ffffff1a}.main-container[data-v-75ab68aa]{display:flex;flex-direction:column;overflow:hidden}.header[data-v-75ab68aa]{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e8e8e8;flex-shrink:0}.main-content[data-v-75ab68aa]{flex:1;overflow-y:auto;padding:20px}.footer[data-v-75ab68aa]{height:40px;line-height:40px;text-align:center;font-size:12px;color:#909399;border-top:1px solid #e8e8e8;background:#fff;flex-shrink:0}
@@ -0,0 +1 @@
1
+ .log-container[data-v-c2a06445]{height:calc(100vh - 260px);overflow-y:auto;background:#1e1e1e;border-radius:4px;padding:12px;font-family:Courier New,Courier,monospace;font-size:13px}.log-line[data-v-c2a06445]{display:flex;gap:12px;padding:2px 0;line-height:1.6;color:#d4d4d4}.log-time[data-v-c2a06445]{color:#6a9955;flex-shrink:0}.log-level[data-v-c2a06445]{flex-shrink:0;width:50px;text-align:center;font-weight:700}.level-trace[data-v-c2a06445],.level-debug[data-v-c2a06445]{color:gray}.level-info[data-v-c2a06445]{color:#4fc1ff}.level-warn[data-v-c2a06445]{color:#cca700}.level-error[data-v-c2a06445],.level-fatal[data-v-c2a06445]{color:#f44747}.log-msg[data-v-c2a06445]{word-break:break-all}.log-detail[data-v-c2a06445]{color:#b5cea8;word-break:break-all}.log-err[data-v-c2a06445]{color:#f44747;word-break:break-all}
@@ -0,0 +1 @@
1
+ import{d as B,m as D,H as I,c as u,a,w as _,I as U,r as v,g as f,G as E,o as d,b as c,F,D as z,f as y,e as A,J as x,t as r,_ as J}from"./index-CfC5GCM9.js";const M={style:{display:"flex","justify-content":"space-between","align-items":"center"}},$={style:{display:"flex",gap:"12px","align-items":"center"}},j={class:"log-time"},G={class:"log-msg"},O={key:0,class:"log-detail"},R={key:1,class:"log-err"},W={key:0,style:{"text-align":"center",color:"#909399",padding:"40px"}},q=B({__name:"LogViewer",setup(K){const l=f([]),p=f("all"),m=f(!0),i=f();let s=null;function k(o){const t=new Date(o);return t.toLocaleTimeString("zh-CN",{hour12:!1})+"."+String(t.getMilliseconds()).padStart(3,"0")}function h(){E(()=>{i.value&&m.value&&(i.value.scrollTop=i.value.scrollHeight)})}function V(){if(!i.value)return;const{scrollTop:o,scrollHeight:t,clientHeight:n}=i.value;m.value=t-o-n<50}function b(){l.value=[]}async function w(){try{const o=await U({level:p.value,limit:500});Array.isArray(o)&&(l.value=o,h())}catch{}}function g(){s&&s.close();const o=localStorage.getItem("token")||"";s=new EventSource(`/api/v1/system/logs/stream?level=${p.value}&token=${o}`),s.onmessage=t=>{try{const n=JSON.parse(t.data);l.value.push(n),l.value.length>2e3&&l.value.splice(0,l.value.length-1500),h()}catch{}},s.onerror=()=>{setTimeout(g,3e3)}}async function C(){l.value=[],await w(),g()}return D(async()=>{await w(),g()}),I(()=>{s&&(s.close(),s=null)}),(o,t)=>{const n=v("el-option"),S=v("el-select"),T=v("el-switch"),L=v("el-button"),N=v("el-card");return d(),u("div",null,[a(N,{shadow:"never"},{header:_(()=>[c("div",M,[t[3]||(t[3]=c("span",null,"系统日志",-1)),c("div",$,[a(S,{modelValue:p.value,"onUpdate:modelValue":t[0]||(t[0]=e=>p.value=e),style:{width:"120px"},onChange:C},{default:_(()=>[a(n,{label:"全部",value:"all"}),a(n,{label:"Debug",value:"debug"}),a(n,{label:"Info",value:"info"}),a(n,{label:"Warn",value:"warn"}),a(n,{label:"Error",value:"error"})]),_:1},8,["modelValue"]),a(T,{modelValue:m.value,"onUpdate:modelValue":t[1]||(t[1]=e=>m.value=e),"active-text":"自动滚动"},null,8,["modelValue"]),a(L,{icon:"Refresh",onClick:b},{default:_(()=>[...t[2]||(t[2]=[A("清空",-1)])]),_:1})])])]),default:_(()=>[c("div",{ref_key:"logContainer",ref:i,class:"log-container",onScroll:V},[(d(!0),u(F,null,z(l.value,(e,H)=>(d(),u("div",{key:H,class:x(["log-line","log-"+e.level])},[c("span",j,r(k(e.time)),1),c("span",{class:x(["log-level","level-"+e.level])},r(e.level.toUpperCase()),3),c("span",G,r(e.msg),1),e.method?(d(),u("span",O,r(e.method)+" "+r(e.url)+" "+r(e.status)+" "+r(e.duration),1)):y("",!0),e.err?(d(),u("span",R,r(e.err),1)):y("",!0)],2))),128)),l.value.length===0?(d(),u("div",W," 暂无日志 ")):y("",!0)],544)]),_:1})])}}}),Q=J(q,[["__scopeId","data-v-c2a06445"]]);export{Q as default};
@@ -0,0 +1 @@
1
+ import{k as V,d as S,l as T,g as m,m as b,n as k,c as x,a as t,w as a,r as n,b as C,t as I,p as L,e as q,h as z,E as B,u as E,o as M,_ as N}from"./index-CfC5GCM9.js";function R(p,r){return V.post("/auth/login",{username:p,password:r})}const U={class:"login-container"},A={class:"login-title"},D=S({__name:"Login",setup(p){const r=E(),g=T(),f=m(),i=m(!1),u=m(localStorage.getItem("siteTitle")||"Cloud Storage");document.title=u.value;const o=z({username:"",password:""}),w={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};b(async()=>{try{const s=await k();s.siteTitle&&(u.value=s.siteTitle,document.title=s.siteTitle,localStorage.setItem("siteTitle",s.siteTitle))}catch{}});async function _(){var e;if(await((e=f.value)==null?void 0:e.validate().catch(()=>!1))){i.value=!0;try{const l=await R(o.username,o.password);g.setAuth(l.token,l.user),B.success("登录成功"),r.push("/")}catch{}finally{i.value=!1}}}return(s,e)=>{const l=n("el-input"),d=n("el-form-item"),v=n("el-button"),h=n("el-form"),y=n("el-card");return M(),x("div",U,[t(y,{class:"login-card"},{default:a(()=>[C("h2",A,I(u.value),1),t(h,{ref_key:"formRef",ref:f,model:o,rules:w,onSubmit:L(_,["prevent"])},{default:a(()=>[t(d,{prop:"username"},{default:a(()=>[t(l,{modelValue:o.username,"onUpdate:modelValue":e[0]||(e[0]=c=>o.username=c),"prefix-icon":"User",placeholder:"用户名",size:"large"},null,8,["modelValue"])]),_:1}),t(d,{prop:"password"},{default:a(()=>[t(l,{modelValue:o.password,"onUpdate:modelValue":e[1]||(e[1]=c=>o.password=c),"prefix-icon":"Lock",placeholder:"密码",type:"password",size:"large","show-password":""},null,8,["modelValue"])]),_:1}),t(d,null,{default:a(()=>[t(v,{type:"primary",loading:i.value,onClick:_,size:"large",style:{width:"100%"}},{default:a(()=>[...e[2]||(e[2]=[q(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1})])}}}),F=N(D,[["__scopeId","data-v-d10e5b01"]]);export{F as default};
@@ -0,0 +1 @@
1
+ .login-container[data-v-d10e5b01]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#667eea,#764ba2)}.login-card[data-v-d10e5b01]{width:400px;padding:20px}.login-title[data-v-d10e5b01]{text-align:center;margin-bottom:30px;color:#303133}
@@ -0,0 +1 @@
1
+ .service-item[data-v-336b4105]{display:flex;justify-content:space-between;align-items:center;padding:20px 0;border-bottom:1px solid #f0f0f0}.service-item[data-v-336b4105]:last-child{border-bottom:none}.service-name[data-v-336b4105]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:500}.service-desc[data-v-336b4105]{color:#909399;font-size:13px;margin-top:4px}.service-actions[data-v-336b4105]{display:flex;gap:8px}.log-container[data-v-336b4105]{height:400px;overflow-y:auto;background:#1e1e1e;border-radius:4px;padding:12px;font-family:Courier New,Courier,monospace;font-size:13px;color:#d4d4d4}.log-line[data-v-336b4105]{padding:2px 0;line-height:1.6}
@@ -0,0 +1 @@
1
+ import{k as S,d as U,m as j,c as g,a as p,w as a,g as i,r as b,o as l,b as u,q as v,e as n,F as N,f as R,D as A,C as G,E as _,G as H,t as J,_ as O}from"./index-CfC5GCM9.js";function K(){return S.get("/samba/status")}function P(){return S.post("/samba/start")}function Q(){return S.post("/samba/stop")}function W(){return S.post("/samba/restart")}const X={style:{display:"flex","justify-content":"space-between","align-items":"center"}},Y={key:0},Z={class:"service-item"},h={class:"service-info"},ee={class:"service-name"},ae={class:"service-actions"},le={key:0,style:{color:"#909399","text-align":"center",padding:"20px"}},te=U({__name:"ServiceManage",setup(se){const c=i(null),o=i(!1),w=i(!1),x=i(!1),y=i(!1),$=i(""),r=i([]),m=i(!1),C=i();function z(){H(()=>{C.value&&(C.value.scrollTop=C.value.scrollHeight)})}async function f(){try{c.value=await K()}catch{}}function E(V,e,s){$.value=e,r.value=[],y.value=!0,m.value=!0;const k=localStorage.getItem("token")||"",B=V.includes("?")?"&":"?",d=new EventSource(`${V}${B}token=${k}`);d.onmessage=M=>{try{const t=JSON.parse(M.data);t.type==="log"?(r.value.push(t.msg),z()):t.type==="done"?(r.value.push("--- 完成 ---"),z(),_.success(e+"完成"),d.close(),m.value=!1,s==null||s()):t.type==="error"?(r.value.push(`错误: ${t.msg}`),z(),_.error(e+"失败: "+t.msg),d.close(),m.value=!1):t.type==="close"&&(d.close(),m.value=!1)}catch{}},d.onerror=()=>{r.value.push("连接断开"),d.close(),m.value=!1}}function D(){w.value=!0,E("/api/v1/samba/install-stream","Samba 安装",()=>{f(),w.value=!1})}function I(){G.confirm("确认卸载 Samba 服务?所有共享配置将被清除。","确认卸载",{type:"warning"}).then(()=>{x.value=!0,E("/api/v1/samba/uninstall-stream","Samba 卸载",()=>{f(),x.value=!1})}).catch(()=>{})}async function L(){o.value=!0;try{await P(),_.success("服务已启动"),f()}catch{}finally{o.value=!1}}async function T(){o.value=!0;try{await Q(),_.success("服务已停止"),f()}catch{}finally{o.value=!1}}async function F(){o.value=!0;try{await W(),_.success("服务已重启"),f()}catch{}finally{o.value=!1}}return j(f),(V,e)=>{const s=b("el-button"),k=b("el-tag"),B=b("el-skeleton"),d=b("el-card"),M=b("el-dialog");return l(),g("div",null,[p(d,{shadow:"never"},{header:a(()=>[u("div",X,[e[4]||(e[4]=u("span",null,"系统服务",-1)),p(s,{icon:"Refresh",onClick:f},{default:a(()=>[...e[3]||(e[3]=[n("刷新",-1)])]),_:1})])]),default:a(()=>[c.value?(l(),g("div",Y,[u("div",Z,[u("div",h,[u("div",ee,[e[8]||(e[8]=u("span",null,"Samba 文件共享服务",-1)),c.value.installed?c.value.smb?(l(),v(k,{key:1,type:"success",size:"small"},{default:a(()=>[...e[6]||(e[6]=[n("运行中",-1)])]),_:1})):(l(),v(k,{key:2,type:"danger",size:"small"},{default:a(()=>[...e[7]||(e[7]=[n("已停止",-1)])]),_:1})):(l(),v(k,{key:0,type:"info",size:"small"},{default:a(()=>[...e[5]||(e[5]=[n("未安装",-1)])]),_:1}))]),e[9]||(e[9]=u("div",{class:"service-desc"},"提供 SMB/CIFS 文件共享协议支持",-1))]),u("div",ae,[c.value.installed?(l(),g(N,{key:1},[c.value.smb?(l(),v(s,{key:1,type:"warning",size:"small",loading:o.value,onClick:T},{default:a(()=>[...e[12]||(e[12]=[n(" 停止 ",-1)])]),_:1},8,["loading"])):(l(),v(s,{key:0,type:"success",size:"small",loading:o.value,onClick:L},{default:a(()=>[...e[11]||(e[11]=[n(" 启动 ",-1)])]),_:1},8,["loading"])),p(s,{size:"small",loading:o.value,onClick:F},{default:a(()=>[...e[13]||(e[13]=[n(" 重启 ",-1)])]),_:1},8,["loading"]),p(s,{type:"danger",size:"small",loading:x.value,onClick:I},{default:a(()=>[...e[14]||(e[14]=[n(" 卸载 ",-1)])]),_:1},8,["loading"])],64)):(l(),v(s,{key:0,type:"primary",size:"small",loading:w.value,onClick:D},{default:a(()=>[...e[10]||(e[10]=[n(" 安装 ",-1)])]),_:1},8,["loading"])),r.value.length>0?(l(),v(s,{key:2,size:"small",onClick:e[0]||(e[0]=t=>y.value=!0)},{default:a(()=>[...e[15]||(e[15]=[n(" 查看日志 ",-1)])]),_:1})):R("",!0)])])])):(l(),v(B,{key:1,rows:2,animated:""}))]),_:1}),p(M,{modelValue:y.value,"onUpdate:modelValue":e[2]||(e[2]=t=>y.value=t),title:$.value,width:"600px","close-on-click-modal":!1,"close-on-press-escape":!1},{footer:a(()=>[p(s,{onClick:e[1]||(e[1]=t=>y.value=!1),disabled:m.value},{default:a(()=>[...e[16]||(e[16]=[n("关闭",-1)])]),_:1},8,["disabled"])]),default:a(()=>[u("div",{class:"log-container",ref_key:"logContainerRef",ref:C},[(l(!0),g(N,null,A(r.value,(t,q)=>(l(),g("div",{key:q,class:"log-line"},J(t),1))),128)),r.value.length===0?(l(),g("div",le,"等待日志...")):R("",!0)],512)]),_:1},8,["modelValue","title"])])}}}),oe=O(te,[["__scopeId","data-v-336b4105"]]);export{oe as default};
@@ -0,0 +1 @@
1
+ import{k as w,d as M,m as $,c as D,b as y,a as l,w as a,A as N,q as j,g as m,r as n,B as q,o as h,e as f,h as z,E as V,C as A}from"./index-CfC5GCM9.js";function I(){return w.get("/shares")}function O(i,d,s){return w.post("/shares",{path:i,owner:d,group:s})}function P(i){return w.delete(`/shares/${encodeURIComponent(i)}`)}const R={style:{display:"flex","justify-content":"space-between","margin-bottom":"16px"}},G=M({__name:"ShareManage",setup(i){const d=m([]),s=m(!1),r=m(!1),c=m(!1),t=z({path:"",owner:"",group:""});async function _(){s.value=!0;try{d.value=await I()}catch{}finally{s.value=!1}}function C(){Object.assign(t,{path:"",owner:"",group:""}),r.value=!0}async function k(){c.value=!0;try{await O(t.path,t.owner,t.group||void 0),V.success("创建成功"),r.value=!1,_()}catch{}finally{c.value=!1}}async function x(g){await A.confirm(`确认删除共享目录 "${g.path}"?`,"确认",{type:"warning"});try{await P(g.path),V.success("删除成功"),_()}catch{}}return $(_),(g,e)=>{const p=n("el-button"),u=n("el-table-column"),B=n("el-table"),v=n("el-input"),b=n("el-form-item"),S=n("el-form"),U=n("el-dialog"),E=q("loading");return h(),D("div",null,[y("div",R,[e[6]||(e[6]=y("span",null,null,-1)),l(p,{type:"primary",icon:"Plus",onClick:C},{default:a(()=>[...e[5]||(e[5]=[f("创建共享目录",-1)])]),_:1})]),N((h(),j(B,{data:d.value,border:"",stripe:""},{default:a(()=>[l(u,{prop:"name",label:"名称"}),l(u,{prop:"path",label:"路径"}),l(u,{prop:"owner",label:"所有者"}),l(u,{prop:"permissions",label:"权限"}),l(u,{label:"操作",width:"160"},{default:a(({row:o})=>[l(p,{link:"",type:"danger",size:"small",onClick:T=>x(o)},{default:a(()=>[...e[7]||(e[7]=[f("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[E,s.value]]),l(U,{modelValue:r.value,"onUpdate:modelValue":e[4]||(e[4]=o=>r.value=o),title:"创建共享目录",width:"450px"},{footer:a(()=>[l(p,{onClick:e[3]||(e[3]=o=>r.value=!1)},{default:a(()=>[...e[8]||(e[8]=[f("取消",-1)])]),_:1}),l(p,{type:"primary",onClick:k,loading:c.value},{default:a(()=>[...e[9]||(e[9]=[f("确定",-1)])]),_:1},8,["loading"])]),default:a(()=>[l(S,{model:t,"label-width":"80px"},{default:a(()=>[l(b,{label:"路径"},{default:a(()=>[l(v,{modelValue:t.path,"onUpdate:modelValue":e[0]||(e[0]=o=>t.path=o),placeholder:"/share/newshare"},null,8,["modelValue"])]),_:1}),l(b,{label:"所有者"},{default:a(()=>[l(v,{modelValue:t.owner,"onUpdate:modelValue":e[1]||(e[1]=o=>t.owner=o),placeholder:"用户名"},null,8,["modelValue"])]),_:1}),l(b,{label:"用户组"},{default:a(()=>[l(v,{modelValue:t.group,"onUpdate:modelValue":e[2]||(e[2]=o=>t.group=o),placeholder:"默认与所有者相同"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])}}});export{G as default};
@@ -0,0 +1 @@
1
+ import{k as w,d as Y,m as Z,c as h,b as _,a,z as ee,w as t,A as le,q as N,g as n,r,B as ae,e as i,t as B,h as te,E as q,C as G,o as C}from"./index-CfC5GCM9.js";function oe(u){return w.get("/users",{params:u})}function se(u){return w.post("/users",u)}function ne(u,g){return w.put(`/users/${u}`,g)}function ue(u){return w.delete(`/users/${u}`)}function ie(u){return w.post(`/users/${u}/disable`)}function re(u,g){return w.post(`/users/${u}/enable`,{password:g})}const de={style:{display:"flex","justify-content":"space-between","margin-bottom":"16px"}},pe={style:{"margin-top":"16px",display:"flex","justify-content":"flex-end"}},fe=Y({__name:"UserList",setup(u){const g=n([]),U=n(!1),x=n(1),S=n(10),D=n(0),z=n(""),b=n(!1),d=n(null),y=n(!1),E=n(),V=n(!1),$=n(null),k=n(""),o=te({username:"",password:"",groupName:"",quotaSoft:50,quotaHard:50}),M={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],quotaSoft:[{required:!0,message:"请设置配额",trigger:"blur"}]};async function p(){U.value=!0;try{const s=await oe({page:x.value,size:S.value,q:z.value});g.value=s.items,D.value=s.total}catch{}finally{U.value=!1}}function R(){d.value=null,Object.assign(o,{username:"",password:"",groupName:"",quotaSoft:50,quotaHard:50}),b.value=!0}function K(s){d.value=s,Object.assign(o,{username:s.username,password:"",groupName:s.groupName,quotaSoft:s.quotaSoft,quotaHard:s.quotaHard}),b.value=!0}async function O(){var s;if(!(!d.value&&!await((s=E.value)==null?void 0:s.validate().catch(()=>!1)))){y.value=!0;try{if(d.value){const e={};o.password&&(e.password=o.password),o.quotaSoft&&(e.quotaSoft=o.quotaSoft),o.quotaHard&&(e.quotaHard=o.quotaHard),await ne(d.value.id,e),q.success("更新成功")}else await se(o),q.success("创建成功");b.value=!1,p()}catch{}finally{y.value=!1}}}async function A(s){await G.confirm(`确认删除用户 "${s.username}"?`,"确认",{type:"warning"});try{await ue(s.id),q.success("删除成功"),p()}catch{}}async function I(s){await G.confirm(`确认禁用用户 "${s.username}"? 禁用后该用户将无法访问共享资源。`,"确认禁用",{type:"warning"});try{await ie(s.id),q.success("用户已禁用"),p()}catch{}}function L(s){$.value=s,k.value="",V.value=!0}async function T(){y.value=!0;try{await re($.value.id,k.value||void 0),q.success("用户已启用"),V.value=!1,p()}catch{}finally{y.value=!1}}return Z(p),(s,e)=>{const c=r("el-input"),m=r("el-button"),f=r("el-table-column"),J=r("el-tag"),Q=r("el-table"),W=r("el-pagination"),v=r("el-form-item"),j=r("el-input-number"),P=r("el-form"),F=r("el-dialog"),X=ae("loading");return C(),h("div",null,[_("div",de,[a(c,{modelValue:z.value,"onUpdate:modelValue":e[0]||(e[0]=l=>z.value=l),placeholder:"搜索用户名","prefix-icon":"Search",style:{width:"300px"},clearable:"",onClear:p,onKeyup:ee(p,["enter"])},null,8,["modelValue"]),a(m,{type:"primary",icon:"Plus",onClick:R},{default:t(()=>[...e[13]||(e[13]=[i("创建用户",-1)])]),_:1})]),le((C(),N(Q,{data:g.value,border:"",stripe:""},{default:t(()=>[a(f,{prop:"id",label:"ID",width:"60"}),a(f,{prop:"username",label:"用户名"}),a(f,{prop:"groupName",label:"用户组"}),a(f,{prop:"sharePath",label:"共享目录"}),a(f,{label:"配额 (GB)"},{default:t(({row:l})=>[i(B(l.quotaSoft)+" / "+B(l.quotaHard),1)]),_:1}),a(f,{label:"状态",width:"100"},{default:t(({row:l})=>[a(J,{type:l.status==="active"?"success":"info",size:"small"},{default:t(()=>[i(B(l.status==="active"?"正常":"禁用"),1)]),_:2},1032,["type"])]),_:1}),a(f,{label:"操作",width:"260",fixed:"right"},{default:t(({row:l})=>[a(m,{link:"",type:"primary",size:"small",onClick:H=>K(l)},{default:t(()=>[...e[14]||(e[14]=[i("编辑",-1)])]),_:1},8,["onClick"]),l.status==="active"?(C(),N(m,{key:0,link:"",type:"warning",size:"small",onClick:H=>I(l)},{default:t(()=>[...e[15]||(e[15]=[i("禁用",-1)])]),_:1},8,["onClick"])):(C(),N(m,{key:1,link:"",type:"success",size:"small",onClick:H=>L(l)},{default:t(()=>[...e[16]||(e[16]=[i("启用",-1)])]),_:1},8,["onClick"])),a(m,{link:"",type:"danger",size:"small",onClick:H=>A(l)},{default:t(()=>[...e[17]||(e[17]=[i("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[X,U.value]]),_("div",pe,[a(W,{"current-page":x.value,"onUpdate:currentPage":e[1]||(e[1]=l=>x.value=l),"page-size":S.value,"onUpdate:pageSize":e[2]||(e[2]=l=>S.value=l),total:D.value,"page-sizes":[10,20,50],layout:"total, sizes, prev, pager, next",onCurrentChange:p,onSizeChange:p},null,8,["current-page","page-size","total"])]),a(F,{modelValue:b.value,"onUpdate:modelValue":e[9]||(e[9]=l=>b.value=l),title:d.value?"编辑用户":"创建用户",width:"500px"},{footer:t(()=>[a(m,{onClick:e[8]||(e[8]=l=>b.value=!1)},{default:t(()=>[...e[20]||(e[20]=[i("取消",-1)])]),_:1}),a(m,{type:"primary",loading:y.value,onClick:O},{default:t(()=>[...e[21]||(e[21]=[i("确定",-1)])]),_:1},8,["loading"])]),default:t(()=>[a(P,{ref_key:"dialogFormRef",ref:E,model:o,rules:M,"label-width":"100px"},{default:t(()=>[a(v,{label:"用户名",prop:"username"},{default:t(()=>[a(c,{modelValue:o.username,"onUpdate:modelValue":e[3]||(e[3]=l=>o.username=l),disabled:!!d.value},null,8,["modelValue","disabled"])]),_:1}),a(v,{label:"密码",prop:d.value?"":"password"},{default:t(()=>[a(c,{modelValue:o.password,"onUpdate:modelValue":e[4]||(e[4]=l=>o.password=l),type:"password","show-password":"",placeholder:d.value?"留空则不修改":"请输入密码"},null,8,["modelValue","placeholder"])]),_:1},8,["prop"]),a(v,{label:"用户组"},{default:t(()=>[a(c,{modelValue:o.groupName,"onUpdate:modelValue":e[5]||(e[5]=l=>o.groupName=l),placeholder:"默认与用户名相同"},null,8,["modelValue"])]),_:1}),a(v,{label:"配额软上限",prop:"quotaSoft"},{default:t(()=>[a(j,{modelValue:o.quotaSoft,"onUpdate:modelValue":e[6]||(e[6]=l=>o.quotaSoft=l),min:0},null,8,["modelValue"]),e[18]||(e[18]=_("span",{style:{"margin-left":"8px"}},"GB",-1))]),_:1}),a(v,{label:"配额硬上限"},{default:t(()=>[a(j,{modelValue:o.quotaHard,"onUpdate:modelValue":e[7]||(e[7]=l=>o.quotaHard=l),min:0},null,8,["modelValue"]),e[19]||(e[19]=_("span",{style:{"margin-left":"8px"}},"GB (默认等于软上限)",-1))]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"]),a(F,{modelValue:V.value,"onUpdate:modelValue":e[12]||(e[12]=l=>V.value=l),title:"启用用户",width:"400px"},{footer:t(()=>[a(m,{onClick:e[11]||(e[11]=l=>V.value=!1)},{default:t(()=>[...e[22]||(e[22]=[i("取消",-1)])]),_:1}),a(m,{type:"primary",loading:y.value,onClick:T},{default:t(()=>[...e[23]||(e[23]=[i("确定",-1)])]),_:1},8,["loading"])]),default:t(()=>[a(P,{"label-width":"80px"},{default:t(()=>[a(v,{label:"用户名"},{default:t(()=>{var l;return[a(c,{"model-value":(l=$.value)==null?void 0:l.username,disabled:""},null,8,["model-value"])]}),_:1}),a(v,{label:"新密码"},{default:t(()=>[a(c,{modelValue:k.value,"onUpdate:modelValue":e[10]||(e[10]=l=>k.value=l),type:"password","show-password":"",placeholder:"留空则使用默认密码"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])])}}});export{fe as default};