create-ssnode-cli 0.1.0 → 0.2.2

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 (107) hide show
  1. package/README.md +1 -2
  2. package/index.js +10 -4
  3. package/package.json +2 -2
  4. package/secrets.js +10 -7
  5. package/templates/backend/Dockerfile +4 -0
  6. package/templates/backend/config/config.develop.yaml +10 -0
  7. package/templates/backend/config/config.prod.yaml +10 -0
  8. package/templates/backend/dist/config/configuration.js +1 -1
  9. package/templates/backend/dist/config/configuration.js.map +1 -1
  10. package/templates/backend/dist/modules/auth/auth.service.js +1 -1
  11. package/templates/backend/dist/modules/auth/auth.service.js.map +1 -1
  12. package/templates/backend/dist/modules/page-data/page-data.controller.js +1 -1
  13. package/templates/backend/dist/modules/page-data/page-data.controller.js.map +1 -1
  14. package/templates/backend/dist/modules/screen-config/screen-config.controller.js +1 -1
  15. package/templates/backend/dist/modules/screen-config/screen-config.controller.js.map +1 -1
  16. package/templates/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  17. package/templates/backend/node_modules/.bin/js-yaml +2 -2
  18. package/templates/backend/node_modules/.bin/typeorm +2 -2
  19. package/templates/backend/node_modules/.bin/typeorm-ts-node-commonjs +2 -2
  20. package/templates/backend/node_modules/.bin/typeorm-ts-node-esm +2 -2
  21. package/templates/backend/ops/docker/.env.example +4 -0
  22. package/templates/backend/ops/docker/config.sh +2 -0
  23. package/templates/backend/ops/docker/install.sh +35 -0
  24. package/templates/backend/ops/install.sh +17 -3
  25. package/templates/backend/ops/pm2/config.sh +2 -0
  26. package/templates/backend/ops/systemd/config.sh +2 -0
  27. package/templates/backend/package.json +13 -6
  28. package/templates/backend/scripts/build.cjs +67 -1
  29. package/templates/backend/src/config/config.interface.ts +9 -0
  30. package/templates/backend/src/config/configuration.ts +11 -0
  31. package/templates/backend/src/modules/auth/auth.service.ts +57 -12
  32. package/templates/backend/src/modules/page-data/page-data.controller.ts +33 -10
  33. package/templates/backend/src/modules/screen-config/screen-config.controller.ts +33 -5
  34. package/templates/root/AGENTS.md +1 -1
  35. package/templates/root/README.md +9 -6
  36. package/templates/root/package.json +9 -1
  37. package/templates/web/dist/assets/{404-f80ef771.js → 404-e6edada0.js} +1 -1
  38. package/templates/web/dist/assets/{404-legacy-3002ee98.js → 404-legacy-f6ca5b91.js} +1 -1
  39. package/templates/web/dist/assets/AuthLayout-bcf98efb.js +1 -0
  40. package/templates/web/dist/assets/AuthLayout-legacy-6e7a8ae1.js +1 -0
  41. package/templates/web/dist/assets/Background-90a49ee7.css +1 -0
  42. package/templates/web/dist/assets/Background-eb77ef54.js +1 -0
  43. package/templates/web/dist/assets/Background-legacy-50457007.js +1 -0
  44. package/templates/web/dist/assets/{Screen-2126fd8d.js → Screen-318c3fc2.js} +1 -1
  45. package/templates/web/dist/assets/{Screen-legacy-e1974f1b.js → Screen-legacy-af123b0f.js} +1 -1
  46. package/templates/web/dist/assets/{ScreenChartOption-cc9d0192.js → ScreenChartOption-953b9157.js} +1 -1
  47. package/templates/web/dist/assets/{ScreenChartOption-legacy-b1b2d49d.js → ScreenChartOption-legacy-2e8fcfd8.js} +1 -1
  48. package/templates/web/dist/assets/api-beff4a3e.js +1 -0
  49. package/templates/web/dist/assets/api-legacy-9fe41d4b.js +1 -0
  50. package/templates/web/dist/assets/{base-8cbac341.js → base-a14309c8.js} +1 -1
  51. package/templates/web/dist/assets/{base-legacy-ee9fb316.js → base-legacy-2bc6e427.js} +1 -1
  52. package/templates/web/dist/assets/{child-10cea360.js → child-2a48ca65.js} +1 -1
  53. package/templates/web/dist/assets/{child-legacy-5af47aba.js → child-legacy-7665b5f8.js} +1 -1
  54. package/templates/web/dist/assets/{component-ae0df581.js → component-89b5253e.js} +1 -1
  55. package/templates/web/dist/assets/{component-legacy-7824b5dc.js → component-legacy-8c5a28ef.js} +1 -1
  56. package/templates/web/dist/assets/{demo-1b5e36be.js → demo-d7272cf4.js} +1 -1
  57. package/templates/web/dist/assets/{demo-legacy-e12d2ac9.js → demo-legacy-f7bbfe55.js} +1 -1
  58. package/templates/web/dist/assets/echarts-vendor-50090982.js +9 -0
  59. package/templates/web/dist/assets/echarts-vendor-legacy-50b58722.js +10 -0
  60. package/templates/web/dist/assets/{grandson-d5883b90.js → grandson-05f8bb58.js} +1 -1
  61. package/templates/web/dist/assets/{grandson-legacy-10cd2476.js → grandson-legacy-3e10990b.js} +1 -1
  62. package/templates/web/dist/assets/{index-9fbd51da.js → index-466a1ec1.js} +1 -1
  63. package/templates/web/dist/assets/{index-5dbae75a.js → index-5b5a8146.js} +1 -1
  64. package/templates/web/dist/assets/{index-6faaa6d8.js → index-7277cbfb.js} +1 -1
  65. package/templates/web/dist/assets/{index-8f6fba9f.js → index-777ef781.js} +1 -1
  66. package/templates/web/dist/assets/{index-2e42b180.js → index-86214b19.js} +1 -1
  67. package/templates/web/dist/assets/{index-463d9205.js → index-9cd5622a.js} +1 -1
  68. package/templates/web/dist/assets/{index-16f6b85c.js → index-a79e448b.js} +1 -1
  69. package/templates/web/dist/assets/{index-3a9a0a97.js → index-b60badf7.js} +1 -1
  70. package/templates/web/dist/assets/{index-fbf4ee3f.js → index-bd4ed808.js} +1 -1
  71. package/templates/web/dist/assets/{index-687d6cfe.js → index-cba19800.js} +1 -1
  72. package/templates/web/dist/assets/{index-5dbcad00.js → index-d70eb540.js} +1 -1
  73. package/templates/web/dist/assets/{index-25ea283a.js → index-e6071630.js} +1 -1
  74. package/templates/web/dist/assets/{index-legacy-ced5a7f1.js → index-legacy-028ed5d5.js} +1 -1
  75. package/templates/web/dist/assets/{index-legacy-8c7d1ee7.js → index-legacy-06483318.js} +1 -1
  76. package/templates/web/dist/assets/{index-legacy-ba034322.js → index-legacy-0da8de82.js} +1 -1
  77. package/templates/web/dist/assets/{index-legacy-3d221bb6.js → index-legacy-3965dcaf.js} +1 -1
  78. package/templates/web/dist/assets/{index-legacy-f3e49a4e.js → index-legacy-4a13dddc.js} +1 -1
  79. package/templates/web/dist/assets/{index-legacy-e9af81d8.js → index-legacy-783129a7.js} +1 -1
  80. package/templates/web/dist/assets/{index-legacy-07d00151.js → index-legacy-8a2cfb9d.js} +1 -1
  81. package/templates/web/dist/assets/{index-legacy-dd62c9e7.js → index-legacy-993ef005.js} +1 -1
  82. package/templates/web/dist/assets/{index-legacy-38c170dc.js → index-legacy-b075295d.js} +1 -1
  83. package/templates/web/dist/assets/{index-legacy-95da3338.js → index-legacy-b3bd40c1.js} +1 -1
  84. package/templates/web/dist/assets/{index-legacy-9be704da.js → index-legacy-d510e318.js} +1 -1
  85. package/templates/web/dist/assets/{index-legacy-0f01787c.js → index-legacy-feb54578.js} +1 -1
  86. package/templates/web/dist/assets/{parent-e7114c1b.js → parent-bba709aa.js} +1 -1
  87. package/templates/web/dist/assets/{parent-legacy-9e493d04.js → parent-legacy-48111978.js} +1 -1
  88. package/templates/web/dist/assets/vendor-affac96c.js +124 -0
  89. package/templates/web/dist/assets/vendor-legacy-55fa76eb.js +122 -0
  90. package/templates/web/dist/index.html +3 -3
  91. package/templates/web/package.json +7 -7
  92. package/templates/web/src/js/xlsl.ts +110 -59
  93. package/templates/web/src/layouts/AuthLayout.tsx +16 -11
  94. package/templates/web/src/layouts/Background.module.less +5 -3
  95. package/templates/web/src/services/api/admin/user.ts +9 -2
  96. package/templates/web/dist/assets/AuthLayout-f07f2dff.js +0 -1
  97. package/templates/web/dist/assets/AuthLayout-legacy-635887dd.js +0 -1
  98. package/templates/web/dist/assets/Background-63ce83a2.js +0 -1
  99. package/templates/web/dist/assets/Background-b264d337.css +0 -1
  100. package/templates/web/dist/assets/Background-legacy-a34b521f.js +0 -1
  101. package/templates/web/dist/assets/api-21ca288f.js +0 -1
  102. package/templates/web/dist/assets/api-legacy-b464070b.js +0 -1
  103. package/templates/web/dist/assets/echarts-vendor-fdb2c14f.js +0 -9
  104. package/templates/web/dist/assets/echarts-vendor-legacy-e99e5121.js +0 -10
  105. package/templates/web/dist/assets/vendor-e7ea3a11.js +0 -96
  106. package/templates/web/dist/assets/vendor-legacy-a62a28c9.js +0 -87
  107. package/templates/web/node_modules/.bin/xlsx +0 -17
package/README.md CHANGED
@@ -75,7 +75,6 @@ $ npm create ssnode-cli my-app
75
75
  │ pnpm install
76
76
  │ pnpm dev # web(6177)+ backend(3001)
77
77
  │ → 部署前:配 SSH 凭证 web/scripts/server.config.json + backend/scripts/server.config.cjs(从 example 拷)
78
- │ → 首次部署前:backend/ 下重生 package-lock.json(见 README「第 4 步」)
79
78
  │
80
79
  └ Happy hacking!
81
80
  ```
@@ -90,7 +89,7 @@ $ npm create ssnode-cli my-app
90
89
  - **密钥生成注入**:dev/prod 两套独立密钥(JWT secret、大屏签名 signKey、超管密码、AES cryptKey),前后端成对同值写入并回读校验;超管账号打印在控制台
91
90
  - **git init + 首次 commit**、**pnpm install**(交互可选)
92
91
 
93
- CLI 搞不定的两件事(生成结束会提示):部署前配 SSH 凭证(example 拷)、backend 首次部署前重生 `package-lock.json`。
92
+ CLI 搞不定的一件事(生成结束会提示):部署前配 SSH 凭证(example 拷)。backend lockfile 由 buildops 自动生成,无需手工。
94
93
 
95
94
  ## 仓库
96
95
 
package/index.js CHANGED
@@ -296,6 +296,7 @@ async function main() {
296
296
  .replace('JWT_SECRET=', `JWT_SECRET=${secrets.prod.jwtSecret}`)
297
297
  .replace('ADMIN_PASSWORD=', `ADMIN_PASSWORD=${secrets.prod.adminPassword}`)
298
298
  .replace('APP_SIGN_KEY=', `APP_SIGN_KEY=${secrets.prod.signKey}`)
299
+ .replace('SSO_TICKET_KEY=', `SSO_TICKET_KEY=${secrets.prod.ssoTicketKey}`)
299
300
  .replace('# ⚠️ 模板占位:新项目务必换成自己的强密钥(与 config.prod.yaml / web/.env.production 同款)。', '# 已由脚手架生成(与 config.prod.yaml / web/.env.production 同款)。');
300
301
  writeFileSync(envExamplePath, envExample);
301
302
  }
@@ -328,18 +329,24 @@ async function main() {
328
329
  }
329
330
 
330
331
  // ── ⑦ git init + 首次 commit ──
332
+ // ⚠️ spinner 的 start/stop 必须严格配对:@clack/prompts 0.11 的 stop 只清「最新一个」
333
+ // interval,重复 start 会泄漏旧 interval → 进程永不退出 + 终端无限重画最后一帧。
334
+ // 故此处先 stop 再弹确认框(prompt 不能与 spinner 同屏),git 段单独 start/stop。
331
335
  if (!isCI && existsSync(targetDir)) {
336
+ s.stop('模板与密钥就绪');
332
337
  const doGit = await p.confirm({ message: 'git init + 首次 commit?', initialValue: true });
333
338
  if (!p.isCancel(doGit) && doGit) {
334
339
  s.start('git init…');
335
340
  run('git', ['init'], targetDir);
336
341
  run('git', ['add', '-A'], targetDir);
337
342
  run('git', ['commit', '-m', `init: ${name}(create-ssnode-cli 生成)`], targetDir, true);
338
- s.message('git 仓库已建立');
343
+ s.stop('git 仓库已建立');
344
+ } else {
345
+ s.stop('生成完成');
339
346
  }
347
+ } else {
348
+ s.stop('生成完成');
340
349
  }
341
-
342
- s.stop('生成完成');
343
350
  p.log.success(`项目已生成:${targetDir}`);
344
351
 
345
352
  // ── ⑧ 密钥打印(仅控制台,不落盘;密钥本体已在文件里) ──
@@ -383,7 +390,6 @@ function nextSteps(stack, targetDir, installed, pm) {
383
390
  if (stack === 'fullstack') {
384
391
  lines.push(`${pm} ${pm === 'npm' ? 'run ' : ''}dev # web(6177)+ backend(3001)${pm === 'npm' ? '(workspace 顺序执行)' : ''}`);
385
392
  lines.push('→ 部署前:配 SSH 凭证 web/scripts/server.config.json + backend/scripts/server.config.cjs(从 example 拷)');
386
- lines.push('→ 首次部署前:backend/ 下重生 package-lock.json(见 README「第 4 步」)');
387
393
  } else if (stack === 'web') {
388
394
  lines.push(`${pm} ${pm === 'npm' ? 'run ' : ''}dev # 端口 6177;checkToken=false 免登录`);
389
395
  lines.push('→ 接后端时:public/env.config.js 的 checkToken 改回 true,并填 .env.* 签名密钥');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-ssnode-cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.2",
4
4
  "description": "SSNodeFullStack 脚手架 — 生成全栈 / 仅前端 / 仅后端项目(Vite+React+AntD / NestJS+SQLite)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -48,4 +48,4 @@
48
48
  "dependencies": {
49
49
  "@clack/prompts": "0.11.0"
50
50
  }
51
- }
51
+ }
package/secrets.js CHANGED
@@ -11,10 +11,11 @@
11
11
  * 本模块从同一个生成值写到两端,从根上消灭「改了一端忘另一端」。
12
12
  *
13
13
  * 密钥形态:
14
- * signKey 32 字节 hex(64 字符) — HMAC-SHA256
15
- * jwtSecret 48 字节 hex(96 字符) — 签发/校验 JWT
16
- * password 16 字节 urlSafe — 超管密码(打印给用户,启动 reconcile 到 DB)
17
- * cryptKey 32 字节 base64 — AES-256-GCM 预留(本期未启用,一并生成免得后期补)
14
+ * signKey 32 字节 hex(64 字符) — HMAC-SHA256
15
+ * jwtSecret 48 字节 hex(96 字符) — 签发/校验 JWT
16
+ * password 16 字节 urlSafe — 超管密码(打印给用户,启动 reconcile 到 DB)
17
+ * cryptKey 32 字节 base64 — AES-256-GCM 预留(本期未启用,一并生成免得后期补)
18
+ * ssoTicket 32 字节 hex(64 字符) — SSO 票据校验(默认关闭,接入时启用)
18
19
  */
19
20
  import { randomBytes } from 'node:crypto';
20
21
 
@@ -25,6 +26,7 @@ export function generateEnvSecrets() {
25
26
  cryptKey: randomBytes(32).toString('base64'),
26
27
  jwtSecret: randomBytes(48).toString('hex'),
27
28
  adminPassword: randomBytes(12).toString('base64url'),
29
+ ssoTicketKey: randomBytes(32).toString('hex'),
28
30
  };
29
31
  }
30
32
 
@@ -57,8 +59,8 @@ export function injectWebEnv(content, mode, signKey) {
57
59
 
58
60
  /**
59
61
  * 注入 backend/config/config.<env>.yaml:
60
- * jwt.secret / admin.password / appSign.signKey / appSign.cryptKey 四个空值字段。
61
- * 锚点 = `字段名: ''`(模板统一空字符串占位);只替换 yaml 值层,不碰注释。
62
+ * jwt.secret / admin.password / appSign.signKey / appSign.cryptKey / sso.ticketKey
63
+ * 五个空值字段。锚点 = `字段名: ''`(模板统一空字符串占位);只替换 yaml 值层,不碰注释。
62
64
  */
63
65
  export function injectBackendYaml(content, secrets) {
64
66
  const pairs = [
@@ -66,10 +68,11 @@ export function injectBackendYaml(content, secrets) {
66
68
  ['admin', 'password', secrets.adminPassword],
67
69
  ['appSign', 'signKey', secrets.signKey],
68
70
  ['appSign', 'cryptKey', secrets.cryptKey],
71
+ ['sso', 'ticketKey', secrets.ssoTicketKey],
69
72
  ];
70
73
  let out = content;
71
74
  for (const [, field, value] of pairs) {
72
- // 同一 yaml 内字段名唯一(secret/password/signKey/cryptKey 不重复出现),
75
+ // 同一 yaml 内字段名唯一(secret/password/signKey/cryptKey/ticketKey 不重复出现),
73
76
  // 直接按 `field: ''` 定位;若锚点缺失则报错,绝不静默跳过。
74
77
  const anchor = `${field}: ''`;
75
78
  if (!out.includes(anchor)) {
@@ -13,6 +13,9 @@
13
13
 
14
14
  # ── deps 阶段:构建工具 + npm ci + 编译 better-sqlite3 ──
15
15
  FROM docker.1ms.run/library/node:22-slim AS deps
16
+ # app label 烙进每一层中间镜像(经典 builder 下 build 失败/中断留下的 <none> 半成品也带标):
17
+ # ops/docker/install.sh::rotate_images 据此定向 prune 本应用悬空镜像。改名须与 ops/docker/config.sh 的 IMAGE 同步。
18
+ LABEL app=fullstack-template-backend
16
19
  WORKDIR /app
17
20
  # better-sqlite3 v13 无预编译二进制(GitHub release 0 asset、npmmirror 仅镜像源码包),prebuild-install
18
21
  # 取不到必回退 node-gyp 源码编译,需 python3/make/g++。node:22-slim 无,装之。
@@ -29,6 +32,7 @@ RUN npm config set registry https://registry.npmmirror.com \
29
32
 
30
33
  # ── runtime 阶段:精简,只带运行所需(无构建工具)──
31
34
  FROM docker.1ms.run/library/node:22-slim AS runtime
35
+ LABEL app=fullstack-template-backend
32
36
  WORKDIR /app
33
37
  # 编译好的 node_modules(含 better-sqlite3 .node;两阶段同 node:22-slim → ABI 一致)
34
38
  COPY --from=deps /app/node_modules ./node_modules
@@ -51,6 +51,16 @@ admin:
51
51
  # ⚠️ 模板占位:新项目务必改成强密码(启动 reconcile 到 DB)
52
52
  password: ''
53
53
 
54
+ # 单点登录 /api/ssologin(演示接入范式,默认关闭;未开启时接口返回 404)
55
+ # 开启后接入方(门户/统一认证)持 ticketKey 生成跳转 URL:
56
+ # GET /api/ssologin?username=xxx&ts=<unix秒>&sign=HMAC-SHA256('username\nts', ticketKey) hex
57
+ # role 固定 'web'(最小权限),勿给该角色挂敏感路由。
58
+ sso:
59
+ enabled: false
60
+ ticketKey: ''
61
+ # 时间戳允许偏差(秒),±5min
62
+ tsWindow: 300
63
+
54
64
  # 大屏 API 签名加密(无 token、无过期)
55
65
  # 签名密钥前端构建期注入 bundle,本期只启用请求侧签名;cryptKey 后期响应/body 加密用
56
66
  appSign:
@@ -53,6 +53,16 @@ admin:
53
53
  # ⚠️ 模板占位:新项目务必改成强密码(启动 reconcile 到 DB)
54
54
  password: ''
55
55
 
56
+ # 单点登录 /api/ssologin(演示接入范式,默认关闭;未开启时接口返回 404)
57
+ # 开启后接入方(门户/统一认证)持 ticketKey 生成跳转 URL:
58
+ # GET /api/ssologin?username=xxx&ts=<unix秒>&sign=HMAC-SHA256('username\nts', ticketKey) hex
59
+ # role 固定 'web'(最小权限),勿给该角色挂敏感路由。
60
+ sso:
61
+ enabled: false
62
+ ticketKey: ''
63
+ # 时间戳允许偏差(秒),±5min
64
+ tsWindow: 300
65
+
56
66
  # 大屏 API 签名加密(无 token、无过期)
57
67
  # signKey 与前端 VITE_APP_SIGN_KEY 须逐字一致;轮换改本 yaml + 重启或 APP_SIGN_KEY env 覆盖。
58
68
  # cryptKey 后期响应/body 加密用(本期未启用,占位不可移除——aes-js 解密侧待二期端到端做)。
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const fs=require("fs"),path=require("path"),yaml=require("js-yaml"),envStr=(e,n)=>{const t=process.env[e];return void 0!==t&&""!==t?t:n},envInt=(e,n)=>{const t=process.env[e];if(void 0===t||""===t)return n;const r=Number(t);return Number.isFinite(r)?r:n},envList=(e,n)=>{const t=process.env[e];return void 0===t||""===t?n:t.split(",").map(e=>e.trim()).filter(Boolean)};exports.default=()=>{const resolveConfig=e=>{const n=path.join(process.cwd(),"config.yaml");if(fs.existsSync(n))return n;const t=path.join(process.cwd(),"config",e);return fs.existsSync(t)?t:path.join(__dirname,"../../config",e)},e=resolveConfig(`config.${process.env.NODE_ENV||"develop"}.yaml`);let n;try{const t=fs.readFileSync(e,"utf8");n=yaml.load(t)}catch(e){n=yaml.load(fs.readFileSync(resolveConfig("config.develop.yaml"),"utf8"))}return{...n,app:{...n.app,port:envInt("PORT",n.app.port),corsOrigins:envList("CORS_ORIGINS",n.app.corsOrigins)},database:{...n.database,dir:envStr("DB_DIR",n.database.dir)},jwt:{...n.jwt,secret:envStr("JWT_SECRET",n.jwt.secret),expiresIn:envStr("JWT_EXPIRES",n.jwt.expiresIn)},log:{...n.log,level:envStr("LOG_LEVEL",n.log.level)},upload:{...n.upload,storagePath:envStr("UPLOAD_STORAGE_PATH",n.upload.storagePath)},admin:{...n.admin,username:envStr("ADMIN_USERNAME",n.admin.username),password:envStr("ADMIN_PASSWORD",n.admin.password)},appSign:{...n.appSign,signKey:envStr("APP_SIGN_KEY",n.appSign.signKey),tsWindow:envInt("APP_SIGN_TS_WINDOW",n.appSign.tsWindow)}}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const fs=require("fs"),path=require("path"),yaml=require("js-yaml"),envStr=(e,n)=>{const t=process.env[e];return void 0!==t&&""!==t?t:n},envInt=(e,n)=>{const t=process.env[e];if(void 0===t||""===t)return n;const s=Number(t);return Number.isFinite(s)?s:n},envBool=(e,n)=>{const t=process.env[e];return void 0===t||""===t?n:"true"===t||"1"===t},envList=(e,n)=>{const t=process.env[e];return void 0===t||""===t?n:t.split(",").map(e=>e.trim()).filter(Boolean)};exports.default=()=>{const resolveConfig=e=>{const n=path.join(process.cwd(),"config.yaml");if(fs.existsSync(n))return n;const t=path.join(process.cwd(),"config",e);return fs.existsSync(t)?t:path.join(__dirname,"../../config",e)},e=resolveConfig(`config.${process.env.NODE_ENV||"develop"}.yaml`);let n;try{const t=fs.readFileSync(e,"utf8");n=yaml.load(t)}catch(e){n=yaml.load(fs.readFileSync(resolveConfig("config.develop.yaml"),"utf8"))}return{...n,app:{...n.app,port:envInt("PORT",n.app.port),corsOrigins:envList("CORS_ORIGINS",n.app.corsOrigins)},database:{...n.database,dir:envStr("DB_DIR",n.database.dir)},jwt:{...n.jwt,secret:envStr("JWT_SECRET",n.jwt.secret),expiresIn:envStr("JWT_EXPIRES",n.jwt.expiresIn)},log:{...n.log,level:envStr("LOG_LEVEL",n.log.level)},upload:{...n.upload,storagePath:envStr("UPLOAD_STORAGE_PATH",n.upload.storagePath)},admin:{...n.admin,username:envStr("ADMIN_USERNAME",n.admin.username),password:envStr("ADMIN_PASSWORD",n.admin.password)},appSign:{...n.appSign,signKey:envStr("APP_SIGN_KEY",n.appSign.signKey),tsWindow:envInt("APP_SIGN_TS_WINDOW",n.appSign.tsWindow)},sso:{...n.sso,enabled:envBool("SSO_ENABLED",n.sso.enabled),ticketKey:envStr("SSO_TICKET_KEY",n.sso.ticketKey),tsWindow:envInt("SSO_TS_WINDOW",n.sso.tsWindow)}}};
2
2
  //# sourceMappingURL=configuration.js.map
@@ -1 +1 @@
1
- "{\"version\":3,\"file\":\"config/configuration.js\",\"names\":[\"fs\",\"require\",\"path\",\"yaml\",\"envStr\",\"k\",\"fallback\",\"v\",\"process\",\"env\",\"undefined\",\"envInt\",\"n\",\"Number\",\"isFinite\",\"envList\",\"split\",\"map\",\"s\",\"trim\",\"filter\",\"Boolean\",\"exports\",\"default\",\"resolveConfig\",\"name\",\"rootCfg\",\"join\",\"cwd\",\"existsSync\",\"byCwd\",\"__dirname\",\"filePath\",\"NODE_ENV\",\"config\",\"text\",\"readFileSync\",\"load\",\"e\",\"app\",\"port\",\"corsOrigins\",\"database\",\"dir\",\"jwt\",\"secret\",\"expiresIn\",\"log\",\"level\",\"upload\",\"storagePath\",\"admin\",\"username\",\"password\",\"appSign\",\"signKey\",\"tsWindow\"],\"sources\":[\"../../src/config/configuration.ts\"],\"mappings\":\"oEAAA,MAAAA,GAAAC,QAAA,MACAC,KAAAD,QAAA,QACAE,KAAAF,QAAA,WAiBMG,OAAS,CAACC,EAAWC,KACzB,MAAMC,EAAIC,QAAQC,IAAIJ,GACtB,YAAaK,IAANH,GAAyB,KAANA,EAAWA,EAAID,GAErCK,OAAS,CAACN,EAAWC,KACzB,MAAMC,EAAIC,QAAQC,IAAIJ,GACtB,QAAUK,IAANH,GAAyB,KAANA,EAAU,OAAOD,EACxC,MAAMM,EAAIC,OAAON,GACjB,OAAOM,OAAOC,SAASF,GAAKA,EAAIN,GAE5BS,QAAU,CAACV,EAAWC,KAC1B,MAAMC,EAAIC,QAAQC,IAAIJ,GACtB,YAAUK,IAANH,GAAyB,KAANA,EAAiBD,EACjCC,EAAES,MAAM,KAAKC,IAAKC,GAAMA,EAAEC,QAAQC,OAAOC,UAGlDC,QAAAC,QAAe,KACb,MASMC,cAAiBC,IACrB,MAAMC,EAAUxB,KAAKyB,KAAKnB,QAAQoB,MAAO,eACzC,GAAI5B,GAAG6B,WAAWH,GAAU,OAAOA,EACnC,MAAMI,EAAQ5B,KAAKyB,KAAKnB,QAAQoB,MAAO,SAAUH,GACjD,OAAIzB,GAAG6B,WAAWC,GAAeA,EAC1B5B,KAAKyB,KAAKI,UAAW,eAAgBN,IAExCO,EAAWR,cAfJ,UADDhB,QAAQC,IAAIwB,UAAY,kBAkBpC,IAAIC,EACJ,IACE,MAAMC,EAAOnC,GAAGoC,aAAaJ,EAAU,QACvCE,EAAS/B,KAAKkC,KAAKF,EACrB,CAAE,MAAOG,GAEPJ,EAAS/B,KAAKkC,KAAKrC,GAAGoC,aAAaZ,cAAc,uBAAwB,QAC3E,CAEA,MAAO,IACFU,EACHK,IAAK,IACAL,EAAOK,IACVC,KAAM7B,OAAO,OAAQuB,EAAOK,IAAIC,MAChCC,YAAa1B,QAAQ,eAAgBmB,EAAOK,IAAIE,cAElDC,SAAU,IACLR,EAAOQ,SAIVC,IAAKvC,OAAO,SAAU8B,EAAOQ,SAASC,MAExCC,IAAK,IACAV,EAAOU,IACVC,OAAQzC,OAAO,aAAc8B,EAAOU,IAAIC,QACxCC,UAAW1C,OAAO,cAAe8B,EAAOU,IAAIE,YAE9CC,IAAK,IACAb,EAAOa,IACVC,MAAO5C,OAAO,YAAa8B,EAAOa,IAAIC,QAExCC,OAAQ,IACHf,EAAOe,OAEVC,YAAa9C,OAAO,sBAAuB8B,EAAOe,OAAOC,cAM3DC,MAAO,IACFjB,EAAOiB,MACVC,SAAUhD,OAAO,iBAAkB8B,EAAOiB,MAAMC,UAChDC,SAAUjD,OAAO,iBAAkB8B,EAAOiB,MAAME,WAElDC,QAAS,IACJpB,EAAOoB,QACVC,QAASnD,OAAO,eAAgB8B,EAAOoB,QAAQC,SAC/CC,SAAU7C,OAAO,qBAAsBuB,EAAOoB,QAAQE\",\"ignoreList\":[]}"
1
+ "{\"version\":3,\"file\":\"config/configuration.js\",\"names\":[\"fs\",\"require\",\"path\",\"yaml\",\"envStr\",\"k\",\"fallback\",\"v\",\"process\",\"env\",\"undefined\",\"envInt\",\"n\",\"Number\",\"isFinite\",\"envBool\",\"envList\",\"split\",\"map\",\"s\",\"trim\",\"filter\",\"Boolean\",\"exports\",\"default\",\"resolveConfig\",\"name\",\"rootCfg\",\"join\",\"cwd\",\"existsSync\",\"byCwd\",\"__dirname\",\"filePath\",\"NODE_ENV\",\"config\",\"text\",\"readFileSync\",\"load\",\"e\",\"app\",\"port\",\"corsOrigins\",\"database\",\"dir\",\"jwt\",\"secret\",\"expiresIn\",\"log\",\"level\",\"upload\",\"storagePath\",\"admin\",\"username\",\"password\",\"appSign\",\"signKey\",\"tsWindow\",\"sso\",\"enabled\",\"ticketKey\"],\"sources\":[\"../../src/config/configuration.ts\"],\"mappings\":\"oEAAA,MAAAA,GAAAC,QAAA,MACAC,KAAAD,QAAA,QACAE,KAAAF,QAAA,WAiBMG,OAAS,CAACC,EAAWC,KACzB,MAAMC,EAAIC,QAAQC,IAAIJ,GACtB,YAAaK,IAANH,GAAyB,KAANA,EAAWA,EAAID,GAErCK,OAAS,CAACN,EAAWC,KACzB,MAAMC,EAAIC,QAAQC,IAAIJ,GACtB,QAAUK,IAANH,GAAyB,KAANA,EAAU,OAAOD,EACxC,MAAMM,EAAIC,OAAON,GACjB,OAAOM,OAAOC,SAASF,GAAKA,EAAIN,GAE5BS,QAAU,CAACV,EAAWC,KAC1B,MAAMC,EAAIC,QAAQC,IAAIJ,GACtB,YAAUK,IAANH,GAAyB,KAANA,EAAiBD,EAC3B,SAANC,GAAsB,MAANA,GAEnBS,QAAU,CAACX,EAAWC,KAC1B,MAAMC,EAAIC,QAAQC,IAAIJ,GACtB,YAAUK,IAANH,GAAyB,KAANA,EAAiBD,EACjCC,EAAEU,MAAM,KAAKC,IAAKC,GAAMA,EAAEC,QAAQC,OAAOC,UAGlDC,QAAAC,QAAe,KACb,MASMC,cAAiBC,IACrB,MAAMC,EAAUzB,KAAK0B,KAAKpB,QAAQqB,MAAO,eACzC,GAAI7B,GAAG8B,WAAWH,GAAU,OAAOA,EACnC,MAAMI,EAAQ7B,KAAK0B,KAAKpB,QAAQqB,MAAO,SAAUH,GACjD,OAAI1B,GAAG8B,WAAWC,GAAeA,EAC1B7B,KAAK0B,KAAKI,UAAW,eAAgBN,IAExCO,EAAWR,cAfJ,UADDjB,QAAQC,IAAIyB,UAAY,kBAkBpC,IAAIC,EACJ,IACE,MAAMC,EAAOpC,GAAGqC,aAAaJ,EAAU,QACvCE,EAAShC,KAAKmC,KAAKF,EACrB,CAAE,MAAOG,GAEPJ,EAAShC,KAAKmC,KAAKtC,GAAGqC,aAAaZ,cAAc,uBAAwB,QAC3E,CAEA,MAAO,IACFU,EACHK,IAAK,IACAL,EAAOK,IACVC,KAAM9B,OAAO,OAAQwB,EAAOK,IAAIC,MAChCC,YAAa1B,QAAQ,eAAgBmB,EAAOK,IAAIE,cAElDC,SAAU,IACLR,EAAOQ,SAIVC,IAAKxC,OAAO,SAAU+B,EAAOQ,SAASC,MAExCC,IAAK,IACAV,EAAOU,IACVC,OAAQ1C,OAAO,aAAc+B,EAAOU,IAAIC,QACxCC,UAAW3C,OAAO,cAAe+B,EAAOU,IAAIE,YAE9CC,IAAK,IACAb,EAAOa,IACVC,MAAO7C,OAAO,YAAa+B,EAAOa,IAAIC,QAExCC,OAAQ,IACHf,EAAOe,OAEVC,YAAa/C,OAAO,sBAAuB+B,EAAOe,OAAOC,cAM3DC,MAAO,IACFjB,EAAOiB,MACVC,SAAUjD,OAAO,iBAAkB+B,EAAOiB,MAAMC,UAChDC,SAAUlD,OAAO,iBAAkB+B,EAAOiB,MAAME,WAElDC,QAAS,IACJpB,EAAOoB,QACVC,QAASpD,OAAO,eAAgB+B,EAAOoB,QAAQC,SAC/CC,SAAU9C,OAAO,qBAAsBwB,EAAOoB,QAAQE,WAExDC,IAAK,IACAvB,EAAOuB,IACVC,QAAS5C,QAAQ,cAAeoB,EAAOuB,IAAIC,SAC3CC,UAAWxD,OAAO,iBAAkB+B,EAAOuB,IAAIE,WAC/CH,SAAU9C,OAAO,gBAAiBwB,EAAOuB,IAAID\",\"ignoreList\":[]}"
@@ -1,2 +1,2 @@
1
- "use strict";var __decorate=this&&this.__decorate||function(e,t,r,i){var a,o=arguments.length,c=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,r,i);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(c=(o<3?a(c):o>3?a(t,r,c):a(t,r))||c);return o>3&&c&&Object.defineProperty(t,r,c),c},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__param=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.AuthService=void 0;const common_1=require("@nestjs/common"),jwt_1=require("@nestjs/jwt"),config_1=require("@nestjs/config"),typeorm_1=require("@nestjs/typeorm"),typeorm_2=require("typeorm"),bcrypt=require("bcryptjs"),user_entity_1=require("../../entities/user.entity"),captcha_service_1=require("./captcha.service"),audit_service_1=require("../audit/audit.service");let AuthService=class{userRepo;jwtService;config;captchaService;auditService;constructor(e,t,r,i,a){this.userRepo=e,this.jwtService=t,this.config=r,this.captchaService=i,this.auditService=a}async login(e,t){if(!this.captchaService.verify(e.captchaId,e.verifycode))throw await this.auditService.record({actorName:e.username||"unknown",action:"login_fail",detail:{reason:"验证码错误或已过期"},ip:t}),new common_1.UnauthorizedException("验证码错误或已过期");const r=await this.userRepo.findOne({where:{username:e.username}});if(!r)throw await this.auditService.record({actorName:e.username,action:"login_fail",detail:{reason:"用户不存在"},ip:t}),new common_1.UnauthorizedException("用户名或密码错误");if(!(r.password.startsWith("$2")?await bcrypt.compare(e.password,r.password):e.password===r.password))throw await this.auditService.record({actorName:e.username,action:"login_fail",detail:{reason:"密码错误"},ip:t}),new common_1.UnauthorizedException("用户名或密码错误");if("1"!==r.status)throw await this.auditService.record({actorName:e.username,action:"login_fail",detail:{reason:"账号已禁用"},ip:t}),new common_1.UnauthorizedException("账号已禁用");const i={sub:r.id,username:r.username,role:r.role};return await this.auditService.record({actorName:r.username,action:"login_success",detail:{role:r.role},ip:t}),this.jwtService.sign(i)}async ssoLogin(e,t){if(!e||0===Object.keys(e).length)throw await this.auditService.record({actorName:e?.username||"sso",action:"login_fail",detail:{reason:"缺少 sso 参数"},ip:t}),new common_1.UnauthorizedException("缺少 sso 参数");const r=e.username||"sso";await this.auditService.record({actorName:r,action:"login_success",detail:{sso:!0,params:Object.keys(e)},ip:t});const i={sub:0,username:r,role:"web"};return this.jwtService.sign(i)}hashPassword(e){return bcrypt.hashSync(e,10)}};exports.AuthService=AuthService,exports.AuthService=AuthService=__decorate([(0,common_1.Injectable)(),__param(0,(0,typeorm_1.InjectRepository)(user_entity_1.UserEntity)),__metadata("design:paramtypes",[typeorm_2.Repository,jwt_1.JwtService,config_1.ConfigService,captcha_service_1.CaptchaService,audit_service_1.AuditService])],AuthService);
1
+ "use strict";var AuthService_1,__decorate=this&&this.__decorate||function(e,t,r,i){var a,o=arguments.length,c=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,r,i);else for(var n=e.length-1;n>=0;n--)(a=e[n])&&(c=(o<3?a(c):o>3?a(t,r,c):a(t,r))||c);return o>3&&c&&Object.defineProperty(t,r,c),c},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__param=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.AuthService=void 0;const common_1=require("@nestjs/common"),jwt_1=require("@nestjs/jwt"),config_1=require("@nestjs/config"),typeorm_1=require("@nestjs/typeorm"),typeorm_2=require("typeorm"),bcrypt=require("bcryptjs"),crypto=require("crypto"),user_entity_1=require("../../entities/user.entity"),captcha_service_1=require("./captcha.service"),audit_service_1=require("../audit/audit.service"),app_crypto_1=require("../../common/app-crypto");let AuthService=AuthService_1=class{userRepo;jwtService;config;captchaService;auditService;logger=new common_1.Logger(AuthService_1.name);constructor(e,t,r,i,a){this.userRepo=e,this.jwtService=t,this.config=r,this.captchaService=i,this.auditService=a}async login(e,t){if(!this.captchaService.verify(e.captchaId,e.verifycode))throw await this.auditService.record({actorName:e.username||"unknown",action:"login_fail",detail:{reason:"验证码错误或已过期"},ip:t}),new common_1.UnauthorizedException("验证码错误或已过期");const r=await this.userRepo.findOne({where:{username:e.username}});if(!r)throw await this.auditService.record({actorName:e.username,action:"login_fail",detail:{reason:"用户不存在"},ip:t}),new common_1.UnauthorizedException("用户名或密码错误");const i=r.password.startsWith("$2");if(!i||!await bcrypt.compare(e.password,r.password))throw i||this.logger.warn(`用户 ${r.username} 密码非 bcrypt 哈希,请管理员重置`),await this.auditService.record({actorName:e.username,action:"login_fail",detail:{reason:"密码错误"},ip:t}),new common_1.UnauthorizedException("用户名或密码错误");if("1"!==r.status)throw await this.auditService.record({actorName:e.username,action:"login_fail",detail:{reason:"账号已禁用"},ip:t}),new common_1.UnauthorizedException("账号已禁用");const a={sub:r.id,username:r.username,role:r.role};return await this.auditService.record({actorName:r.username,action:"login_success",detail:{role:r.role},ip:t}),this.jwtService.sign(a)}async ssoLogin(e,t){const r=this.config.get("sso"),i=e?.username||"";if(!r.enabled)throw new common_1.NotFoundException("接口不存在");const fail=async e=>{throw await this.auditService.record({actorName:i||"sso",action:"login_fail",detail:{reason:e},ip:t}),new common_1.UnauthorizedException(e)},a=Number(e.ts),o=Math.floor(Date.now()/1e3);i&&e.ts&&e.sign||await fail("缺少单点登录票据参数"),(!Number.isFinite(a)||a<=0)&&await fail("票据时间戳非法"),Math.abs(o-a)>r.tsWindow&&await fail("票据已过期");const c=crypto.createHmac("sha256",r.ticketKey).update(`${i}\n${e.ts}`,"utf8").digest("hex");(0,app_crypto_1.safeEqualHex)(c,String(e.sign).toLowerCase())||await fail("票据校验失败"),await this.auditService.record({actorName:i,action:"login_success",detail:{sso:!0},ip:t});const n={sub:0,username:i,role:"web"};return this.jwtService.sign(n)}hashPassword(e){return bcrypt.hashSync(e,10)}};exports.AuthService=AuthService,exports.AuthService=AuthService=AuthService_1=__decorate([(0,common_1.Injectable)(),__param(0,(0,typeorm_1.InjectRepository)(user_entity_1.UserEntity)),__metadata("design:paramtypes",[typeorm_2.Repository,jwt_1.JwtService,config_1.ConfigService,captcha_service_1.CaptchaService,audit_service_1.AuditService])],AuthService);
2
2
  //# sourceMappingURL=auth.service.js.map
@@ -1 +1 @@
1
- "{\"version\":3,\"file\":\"modules/auth/auth.service.js\",\"names\":[\"common_1\",\"require\",\"jwt_1\",\"config_1\",\"typeorm_1\",\"typeorm_2\",\"bcrypt\",\"user_entity_1\",\"captcha_service_1\",\"audit_service_1\",\"AuthService\",\"userRepo\",\"jwtService\",\"config\",\"captchaService\",\"auditService\",\"constructor\",\"this\",\"login\",\"params\",\"ip\",\"verify\",\"captchaId\",\"verifycode\",\"record\",\"actorName\",\"username\",\"action\",\"detail\",\"reason\",\"UnauthorizedException\",\"user\",\"findOne\",\"where\",\"password\",\"startsWith\",\"compare\",\"status\",\"payload\",\"sub\",\"id\",\"role\",\"sign\",\"ssoLogin\",\"Object\",\"keys\",\"length\",\"sso\",\"hashPassword\",\"plain\",\"hashSync\",\"exports\",\"__decorate\",\"Injectable\",\"__param\",\"InjectRepository\",\"UserEntity\",\"Repository\",\"JwtService\",\"ConfigService\",\"CaptchaService\",\"AuditService\"],\"sources\":[\"../../../src/modules/auth/auth.service.ts\"],\"mappings\":\"kqBAAA,MAAAA,SAAAC,QAAA,kBACAC,MAAAD,QAAA,eACAE,SAAAF,QAAA,kBACAG,UAAAH,QAAA,mBACAI,UAAAJ,QAAA,WACAK,OAAAL,QAAA,YACAM,cAAAN,QAAA,8BACAO,kBAAAP,QAAA,qBACAQ,gBAAAR,QAAA,0BAIO,IAAMS,YAAN,MAGcC,SACAC,WACAC,OACAC,eACAC,aANnB,WAAAC,CAEmBL,EACAC,EACAC,EACAC,EACAC,GAJAE,KAAAN,WACAM,KAAAL,aACAK,KAAAJ,SACAI,KAAAH,iBACAG,KAAAF,cAChB,CAOH,WAAMG,CACJC,EAMAC,GAGA,IAAKH,KAAKH,eAAeO,OAAOF,EAAOG,UAAWH,EAAOI,YAOvD,YANMN,KAAKF,aAAaS,OAAO,CAC7BC,UAAWN,EAAOO,UAAY,UAC9BC,OAAQ,aACRC,OAAQ,CAAEC,OAAQ,aAClBT,OAEI,IAAIpB,SAAA8B,sBAAsB,aAElC,MAAMC,QAAad,KAAKN,SAASqB,QAAQ,CACvCC,MAAO,CAAEP,SAAUP,EAAOO,YAE5B,IAAKK,EAOH,YANMd,KAAKF,aAAaS,OAAO,CAC7BC,UAAWN,EAAOO,SAClBC,OAAQ,aACRC,OAAQ,CAAEC,OAAQ,SAClBT,OAEI,IAAIpB,SAAA8B,sBAAsB,YAKlC,KAHWC,EAAKG,SAASC,WAAW,YAC1B7B,OAAO8B,QAAQjB,EAAOe,SAAUH,EAAKG,UAC3Cf,EAAOe,WAAaH,EAAKG,UAQ3B,YANMjB,KAAKF,aAAaS,OAAO,CAC7BC,UAAWN,EAAOO,SAClBC,OAAQ,aACRC,OAAQ,CAAEC,OAAQ,QAClBT,OAEI,IAAIpB,SAAA8B,sBAAsB,YAElC,GAAoB,MAAhBC,EAAKM,OAOP,YANMpB,KAAKF,aAAaS,OAAO,CAC7BC,UAAWN,EAAOO,SAClBC,OAAQ,aACRC,OAAQ,CAAEC,OAAQ,SAClBT,OAEI,IAAIpB,SAAA8B,sBAAsB,SAElC,MAAMQ,EAAU,CAAEC,IAAKR,EAAKS,GAAId,SAAUK,EAAKL,SAAUe,KAAMV,EAAKU,MAOpE,aANMxB,KAAKF,aAAaS,OAAO,CAC7BC,UAAWM,EAAKL,SAChBC,OAAQ,gBACRC,OAAQ,CAAEa,KAAMV,EAAKU,MACrBrB,OAEKH,KAAKL,WAAW8B,KAAKJ,EAC9B,CAKA,cAAMK,CAASxB,EAAgCC,GAC7C,IAAKD,GAAyC,IAA/ByB,OAAOC,KAAK1B,GAAQ2B,OAOjC,YANM7B,KAAKF,aAAaS,OAAO,CAC7BC,UAAWN,GAAQO,UAAY,MAC/BC,OAAQ,aACRC,OAAQ,CAAEC,OAAQ,aAClBT,OAEI,IAAIpB,SAAA8B,sBAAsB,aAElC,MAAMJ,EAAWP,EAAOO,UAAY,YAC9BT,KAAKF,aAAaS,OAAO,CAC7BC,UAAWC,EACXC,OAAQ,gBACRC,OAAQ,CAAEmB,KAAK,EAAM5B,OAAQyB,OAAOC,KAAK1B,IACzCC,OAEF,MAAMkB,EAAU,CAAEC,IAAK,EAAGb,WAAUe,KAAM,OAC1C,OAAOxB,KAAKL,WAAW8B,KAAKJ,EAC9B,CAKA,YAAAU,CAAaC,GACX,OAAO3C,OAAO4C,SAASD,EAAO,GAChC,GA1GWE,QAAAzC,wB,oBAAAA,YAAW0C,WAAA,EADvB,EAAApD,SAAAqD,cAGIC,QAAA,KAAAlD,UAAAmD,kBAAiBhD,cAAAiD,a,gCACSnD,UAAAoD,WACEvD,MAAAwD,WACJvD,SAAAwD,cACQnD,kBAAAoD,eACFnD,gBAAAoD,gBAPtBnD\",\"ignoreList\":[]}"
1
+ "{\"version\":3,\"file\":\"modules/auth/auth.service.js\",\"names\":[\"common_1\",\"require\",\"jwt_1\",\"config_1\",\"typeorm_1\",\"typeorm_2\",\"bcrypt\",\"crypto\",\"user_entity_1\",\"captcha_service_1\",\"audit_service_1\",\"app_crypto_1\",\"AuthService\",\"AuthService_1\",\"userRepo\",\"jwtService\",\"config\",\"captchaService\",\"auditService\",\"logger\",\"Logger\",\"name\",\"constructor\",\"this\",\"login\",\"params\",\"ip\",\"verify\",\"captchaId\",\"verifycode\",\"record\",\"actorName\",\"username\",\"action\",\"detail\",\"reason\",\"UnauthorizedException\",\"user\",\"findOne\",\"where\",\"hashed\",\"password\",\"startsWith\",\"compare\",\"warn\",\"status\",\"payload\",\"sub\",\"id\",\"role\",\"sign\",\"ssoLogin\",\"ssoCfg\",\"get\",\"enabled\",\"NotFoundException\",\"fail\",\"async\",\"tsNum\",\"Number\",\"ts\",\"nowSec\",\"Math\",\"floor\",\"Date\",\"now\",\"isFinite\",\"abs\",\"tsWindow\",\"expected\",\"createHmac\",\"ticketKey\",\"update\",\"digest\",\"safeEqualHex\",\"String\",\"toLowerCase\",\"sso\",\"hashPassword\",\"plain\",\"hashSync\",\"exports\",\"__decorate\",\"Injectable\",\"__param\",\"InjectRepository\",\"UserEntity\",\"Repository\",\"JwtService\",\"ConfigService\",\"CaptchaService\",\"AuditService\"],\"sources\":[\"../../../src/modules/auth/auth.service.ts\"],\"mappings\":\"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\",\"ignoreList\":[]}"
@@ -1,2 +1,2 @@
1
- "use strict";var __decorate=this&&this.__decorate||function(e,t,a,r){var o,n=arguments.length,_=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,a):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)_=Reflect.decorate(e,t,a,r);else for(var i=e.length-1;i>=0;i--)(o=e[i])&&(_=(n<3?o(_):n>3?o(t,a,_):o(t,a))||_);return n>3&&_&&Object.defineProperty(t,a,_),_},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__param=this&&this.__param||function(e,t){return function(a,r){t(a,r,e)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.PageDataController=void 0;const common_1=require("@nestjs/common"),platform_express_1=require("@nestjs/platform-express"),swagger_1=require("@nestjs/swagger"),page_data_service_1=require("./page-data.service");let PageDataController=class{service;constructor(e){this.service=e}getList(e){return this.service.getList(e)}add(e,t){return this.service.add(e,t.user)}edit(e){return this.service.update(e)}deleteById(e){return this.service.deleteById(Number(e))}import(e){if(!e)throw new Error("缺少 file");return{filename:e.originalname}}};exports.PageDataController=PageDataController,__decorate([(0,common_1.Get)("getList"),__param(0,(0,common_1.Query)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"getList",null),__decorate([(0,common_1.Post)("add"),__param(0,(0,common_1.Body)()),__param(1,(0,common_1.Request)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object,Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"add",null),__decorate([(0,common_1.Put)("edit"),__param(0,(0,common_1.Body)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"edit",null),__decorate([(0,common_1.Delete)("deleteById"),__param(0,(0,common_1.Query)("id")),__metadata("design:type",Function),__metadata("design:paramtypes",[String]),__metadata("design:returntype",void 0)],PageDataController.prototype,"deleteById",null),__decorate([(0,common_1.Post)("v1/import"),(0,common_1.UseInterceptors)((0,platform_express_1.FileInterceptor)("file")),(0,swagger_1.ApiConsumes)("multipart/form-data"),(0,swagger_1.ApiBody)({schema:{type:"object",properties:{file:{type:"string",format:"binary"}}}}),__param(0,(0,common_1.UploadedFile)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"import",null),exports.PageDataController=PageDataController=__decorate([(0,swagger_1.ApiTags)("page-data 大屏页面数据"),(0,common_1.Controller)(),__metadata("design:paramtypes",[page_data_service_1.PageDataService])],PageDataController);
1
+ "use strict";var __decorate=this&&this.__decorate||function(e,t,a,r){var o,n=arguments.length,_=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,a):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)_=Reflect.decorate(e,t,a,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(_=(n<3?o(_):n>3?o(t,a,_):o(t,a))||_);return n>3&&_&&Object.defineProperty(t,a,_),_},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__param=this&&this.__param||function(e,t){return function(a,r){t(a,r,e)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.PageDataController=void 0;const common_1=require("@nestjs/common"),platform_express_1=require("@nestjs/platform-express"),swagger_1=require("@nestjs/swagger"),page_data_service_1=require("./page-data.service"),jwt_auth_guard_1=require("../auth/jwt-auth.guard");let PageDataController=class{service;constructor(e){this.service=e}ensureAdmin(e){if("admin"!==e.user?.role&&"superadmin"!==e.user?.role)throw new common_1.ForbiddenException("仅管理员可操作大屏页面数据");return{id:e.user.id,username:e.user.username}}getList(e){return this.service.getList(e)}add(e,t){return this.ensureAdmin(t),this.service.add(e,t.user)}edit(e,t){return this.ensureAdmin(t),this.service.update(e)}deleteById(e,t){return this.ensureAdmin(t),this.service.deleteById(Number(e))}import(e,t){if(this.ensureAdmin(t),!e)throw new Error("缺少 file");return{filename:e.originalname}}};exports.PageDataController=PageDataController,__decorate([(0,common_1.Get)("getList"),__param(0,(0,common_1.Query)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"getList",null),__decorate([(0,common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),(0,common_1.Post)("add"),__param(0,(0,common_1.Body)()),__param(1,(0,common_1.Request)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object,Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"add",null),__decorate([(0,common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),(0,common_1.Put)("edit"),__param(0,(0,common_1.Body)()),__param(1,(0,common_1.Request)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object,Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"edit",null),__decorate([(0,common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),(0,common_1.Delete)("deleteById"),__param(0,(0,common_1.Query)("id")),__param(1,(0,common_1.Request)()),__metadata("design:type",Function),__metadata("design:paramtypes",[String,Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"deleteById",null),__decorate([(0,common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),(0,common_1.Post)("v1/import"),(0,common_1.UseInterceptors)((0,platform_express_1.FileInterceptor)("file")),(0,swagger_1.ApiConsumes)("multipart/form-data"),(0,swagger_1.ApiBearerAuth)(),(0,swagger_1.ApiBody)({schema:{type:"object",properties:{file:{type:"string",format:"binary"}}}}),__param(0,(0,common_1.UploadedFile)()),__param(1,(0,common_1.Request)()),__metadata("design:type",Function),__metadata("design:paramtypes",[Object,Object]),__metadata("design:returntype",void 0)],PageDataController.prototype,"import",null),exports.PageDataController=PageDataController=__decorate([(0,swagger_1.ApiTags)("page-data 大屏页面数据"),(0,common_1.Controller)(),__metadata("design:paramtypes",[page_data_service_1.PageDataService])],PageDataController);
2
2
  //# sourceMappingURL=page-data.controller.js.map
@@ -1 +1 @@
1
- "{\"version\":3,\"file\":\"modules/page-data/page-data.controller.js\",\"names\":[\"common_1\",\"require\",\"platform_express_1\",\"swagger_1\",\"page_data_service_1\",\"PageDataController\",\"service\",\"constructor\",\"this\",\"getList\",\"query\",\"add\",\"body\",\"req\",\"user\",\"edit\",\"update\",\"deleteById\",\"id\",\"Number\",\"import\",\"file\",\"Error\",\"filename\",\"originalname\",\"exports\",\"__decorate\",\"Get\",\"__param\",\"Query\",\"Post\",\"Body\",\"Request\",\"Put\",\"Delete\",\"UseInterceptors\",\"FileInterceptor\",\"ApiConsumes\",\"ApiBody\",\"schema\",\"type\",\"properties\",\"format\",\"UploadedFile\",\"ApiTags\",\"Controller\",\"PageDataService\"],\"sources\":[\"../../../src/modules/page-data/page-data.controller.ts\"],\"mappings\":\"yqBAAA,MAAAA,SAAAC,QAAA,kBAYAC,mBAAAD,QAAA,4BACAE,UAAAF,QAAA,mBACAG,oBAAAH,QAAA,uBAIO,IAAMI,mBAAN,MACwBC,QAA7B,WAAAC,CAA6BD,GAAAE,KAAAF,SAA2B,CAIxD,OAAAG,CAAiBC,GACf,OAAOF,KAAKF,QAAQG,QAAQC,EAC9B,CAIA,GAAAC,CAAYC,EAAsBC,GAChC,OAAOL,KAAKF,QAAQK,IAAIC,EAAMC,EAAIC,KACpC,CAIA,IAAAC,CAAaH,GACX,OAAOJ,KAAKF,QAAQU,OAAOJ,EAC7B,CAIA,UAAAK,CAAwBC,GACtB,OAAOV,KAAKF,QAAQW,WAAWE,OAAOD,GACxC,CASA,MAAAE,CAAuBC,GACrB,IAAKA,EACH,MAAM,IAAIC,MAAM,WAElB,MAAO,CAAEC,SAAUF,EAAKG,aAC1B,GAvCWC,QAAApB,sCAKXqB,WAAA,EADC,EAAA1B,SAAA2B,KAAI,WACIC,QAAA,KAAA5B,SAAA6B,U,iKAMTH,WAAA,EADC,EAAA1B,SAAA8B,MAAK,OACDF,QAAA,KAAA5B,SAAA+B,SAAmBH,QAAA,KAAA5B,SAAAgC,Y,oKAMxBN,WAAA,EADC,EAAA1B,SAAAiC,KAAI,QACCL,QAAA,KAAA5B,SAAA+B,S,8JAMNL,WAAA,EADC,EAAA1B,SAAAkC,QAAO,cACIN,QAAA,KAAA5B,SAAA6B,OAAM,O,oKAWlBH,WAAA,EANC,EAAA1B,SAAA8B,MAAK,cACL,EAAA9B,SAAAmC,kBAAgB,EAAAjC,mBAAAkC,iBAAgB,UAChC,EAAAjC,UAAAkC,aAAY,wBACZ,EAAAlC,UAAAmC,SAAQ,CACPC,OAAQ,CAAEC,KAAM,SAAUC,WAAY,CAAEpB,KAAM,CAAEmB,KAAM,SAAUE,OAAQ,cAElEd,QAAA,KAAA5B,SAAA2C,iB,2LAlCGtC,mBAAkBqB,WAAA,EAF9B,EAAAvB,UAAAyC,SAAQ,qBACR,EAAA5C,SAAA6C,c,gCAEuCzC,oBAAA0C,mBAD3BzC\",\"ignoreList\":[]}"
1
+ "{\"version\":3,\"file\":\"modules/page-data/page-data.controller.js\",\"names\":[\"common_1\",\"require\",\"platform_express_1\",\"swagger_1\",\"page_data_service_1\",\"jwt_auth_guard_1\",\"PageDataController\",\"service\",\"constructor\",\"this\",\"ensureAdmin\",\"req\",\"user\",\"role\",\"ForbiddenException\",\"id\",\"username\",\"getList\",\"query\",\"add\",\"body\",\"edit\",\"update\",\"deleteById\",\"Number\",\"import\",\"file\",\"Error\",\"filename\",\"originalname\",\"exports\",\"__decorate\",\"Get\",\"__param\",\"Query\",\"UseGuards\",\"JwtAuthGuard\",\"Post\",\"Body\",\"Request\",\"Put\",\"Delete\",\"UseInterceptors\",\"FileInterceptor\",\"ApiConsumes\",\"ApiBearerAuth\",\"ApiBody\",\"schema\",\"type\",\"properties\",\"format\",\"UploadedFile\",\"ApiTags\",\"Controller\",\"PageDataService\"],\"sources\":[\"../../../src/modules/page-data/page-data.controller.ts\"],\"mappings\":\"yqBAAA,MAAAA,SAAAC,QAAA,kBAcAC,mBAAAD,QAAA,4BACAE,UAAAF,QAAA,mBACAG,oBAAAH,QAAA,uBACAI,iBAAAJ,QAAA,0BAIO,IAAMK,mBAAN,MACwBC,QAA7B,WAAAC,CAA6BD,GAAAE,KAAAF,SAA2B,CAGhD,WAAAG,CAAYC,GAClB,GAAuB,UAAnBA,EAAIC,MAAMC,MAAuC,eAAnBF,EAAIC,MAAMC,KAC1C,MAAM,IAAIb,SAAAc,mBAAmB,iBAE/B,MAAO,CAAEC,GAAIJ,EAAIC,KAAKG,GAAIC,SAAUL,EAAIC,KAAKI,SAC/C,CAOA,OAAAC,CAAiBC,GACf,OAAOT,KAAKF,QAAQU,QAAQC,EAC9B,CAKA,GAAAC,CAAYC,EAAsBT,GAEhC,OADAF,KAAKC,YAAYC,GACVF,KAAKF,QAAQY,IAAIC,EAAMT,EAAIC,KACpC,CAKA,IAAAS,CAAaD,EAAsBT,GAEjC,OADAF,KAAKC,YAAYC,GACVF,KAAKF,QAAQe,OAAOF,EAC7B,CAKA,UAAAG,CAAwBR,EAAuBJ,GAE7C,OADAF,KAAKC,YAAYC,GACVF,KAAKF,QAAQgB,WAAWC,OAAOT,GACxC,CAWA,MAAAU,CAAuBC,EAAsBf,GAE3C,GADAF,KAAKC,YAAYC,IACZe,EACH,MAAM,IAAIC,MAAM,WAElB,MAAO,CAAEC,SAAUF,EAAKG,aAC1B,GA3DWC,QAAAxB,sCAgBXyB,WAAA,EADC,EAAA/B,SAAAgC,KAAI,WACIC,QAAA,KAAAjC,SAAAkC,U,iKAOTH,WAAA,EAFC,EAAA/B,SAAAmC,WAAU9B,iBAAA+B,eACV,EAAApC,SAAAqC,MAAK,OACDJ,QAAA,KAAAjC,SAAAsC,SAAmBL,QAAA,KAAAjC,SAAAuC,Y,oKAQxBR,WAAA,EAFC,EAAA/B,SAAAmC,WAAU9B,iBAAA+B,eACV,EAAApC,SAAAwC,KAAI,QACCP,QAAA,KAAAjC,SAAAsC,SAAmBL,QAAA,KAAAjC,SAAAuC,Y,qKAQzBR,WAAA,EAFC,EAAA/B,SAAAmC,WAAU9B,iBAAA+B,eACV,EAAApC,SAAAyC,QAAO,cACIR,QAAA,KAAAjC,SAAAkC,OAAM,OAAmBD,QAAA,KAAAjC,SAAAuC,Y,2KAcrCR,WAAA,EARC,EAAA/B,SAAAmC,WAAU9B,iBAAA+B,eACV,EAAApC,SAAAqC,MAAK,cACL,EAAArC,SAAA0C,kBAAgB,EAAAxC,mBAAAyC,iBAAgB,UAChC,EAAAxC,UAAAyC,aAAY,wBACZ,EAAAzC,UAAA0C,kBACA,EAAA1C,UAAA2C,SAAQ,CACPC,OAAQ,CAAEC,KAAM,SAAUC,WAAY,CAAEvB,KAAM,CAAEsB,KAAM,SAAUE,OAAQ,cAElEjB,QAAA,KAAAjC,SAAAmD,iBAA2BlB,QAAA,KAAAjC,SAAAuC,Y,kMArDxBjC,mBAAkByB,WAAA,EAF9B,EAAA5B,UAAAiD,SAAQ,qBACR,EAAApD,SAAAqD,c,gCAEuCjD,oBAAAkD,mBAD3BhD\",\"ignoreList\":[]}"
@@ -1,2 +1,2 @@
1
- "use strict";var __decorate=this&&this.__decorate||function(e,t,r,o){var n,a=arguments.length,c=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,r,o);else for(var i=e.length-1;i>=0;i--)(n=e[i])&&(c=(a<3?n(c):a>3?n(t,r,c):n(t,r))||c);return a>3&&c&&Object.defineProperty(t,r,c),c},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__param=this&&this.__param||function(e,t){return function(r,o){t(r,o,e)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ScreenConfigController=void 0;const common_1=require("@nestjs/common"),swagger_1=require("@nestjs/swagger"),screen_config_service_1=require("./screen-config.service");let ScreenConfigController=class{service;constructor(e){this.service=e}list(){return this.service.list()}update(e,t){return this.service.update(e,t)}};exports.ScreenConfigController=ScreenConfigController,__decorate([(0,common_1.Get)("list"),__metadata("design:type",Function),__metadata("design:paramtypes",[]),__metadata("design:returntype",void 0)],ScreenConfigController.prototype,"list",null),__decorate([(0,common_1.Put)(":key"),__param(0,(0,common_1.Param)("key")),__param(1,(0,common_1.Body)()),__metadata("design:type",Function),__metadata("design:paramtypes",[String,Object]),__metadata("design:returntype",void 0)],ScreenConfigController.prototype,"update",null),exports.ScreenConfigController=ScreenConfigController=__decorate([(0,swagger_1.ApiTags)("screen 大屏配置"),(0,common_1.Controller)("screen"),__metadata("design:paramtypes",[screen_config_service_1.ScreenConfigService])],ScreenConfigController);
1
+ "use strict";var __decorate=this&&this.__decorate||function(e,t,r,n){var o,a=arguments.length,i=a<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,n);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(i=(a<3?o(i):a>3?o(t,r,i):o(t,r))||i);return a>3&&i&&Object.defineProperty(t,r,i),i},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__param=this&&this.__param||function(e,t){return function(r,n){t(r,n,e)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ScreenConfigController=void 0;const common_1=require("@nestjs/common"),swagger_1=require("@nestjs/swagger"),screen_config_service_1=require("./screen-config.service"),jwt_auth_guard_1=require("../auth/jwt-auth.guard");let ScreenConfigController=class{service;constructor(e){this.service=e}ensureAdmin(e){if("admin"!==e.user?.role&&"superadmin"!==e.user?.role)throw new common_1.ForbiddenException("仅管理员可操作大屏配置");return{id:e.user.id,username:e.user.username}}list(){return this.service.list()}update(e,t,r){return this.ensureAdmin(r),this.service.update(e,t)}};exports.ScreenConfigController=ScreenConfigController,__decorate([(0,common_1.Get)("list"),__metadata("design:type",Function),__metadata("design:paramtypes",[]),__metadata("design:returntype",void 0)],ScreenConfigController.prototype,"list",null),__decorate([(0,common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),(0,swagger_1.ApiBearerAuth)(),(0,common_1.Put)(":key"),__param(0,(0,common_1.Param)("key")),__param(1,(0,common_1.Body)()),__param(2,(0,common_1.Request)()),__metadata("design:type",Function),__metadata("design:paramtypes",[String,Object,Object]),__metadata("design:returntype",void 0)],ScreenConfigController.prototype,"update",null),exports.ScreenConfigController=ScreenConfigController=__decorate([(0,swagger_1.ApiTags)("screen 大屏配置"),(0,common_1.Controller)("screen"),__metadata("design:paramtypes",[screen_config_service_1.ScreenConfigService])],ScreenConfigController);
2
2
  //# sourceMappingURL=screen-config.controller.js.map
@@ -1 +1 @@
1
- "{\"version\":3,\"file\":\"modules/screen-config/screen-config.controller.js\",\"names\":[\"common_1\",\"require\",\"swagger_1\",\"screen_config_service_1\",\"ScreenConfigController\",\"service\",\"constructor\",\"this\",\"list\",\"update\",\"key\",\"dto\",\"exports\",\"__decorate\",\"Get\",\"Put\",\"__param\",\"Param\",\"Body\",\"ApiTags\",\"Controller\",\"ScreenConfigService\"],\"sources\":[\"../../../src/modules/screen-config/screen-config.controller.ts\"],\"mappings\":\"6qBAAA,MAAAA,SAAAC,QAAA,kBACAC,UAAAD,QAAA,mBACAE,wBAAAF,QAAA,2BAKO,IAAMG,uBAAN,MACwBC,QAA7B,WAAAC,CAA6BD,GAAAE,KAAAF,SAA+B,CAI5D,IAAAG,GACE,OAAOD,KAAKF,QAAQG,MACtB,CAIA,MAAAC,CAAqBC,EAAqBC,GACxC,OAAOJ,KAAKF,QAAQI,OAAOC,EAAKC,EAClC,GAbWC,QAAAR,8CAKXS,WAAA,EADC,EAAAb,SAAAc,KAAI,Q,4JAOLD,WAAA,EADC,EAAAb,SAAAe,KAAI,QACGC,QAAA,KAAAhB,SAAAiB,OAAM,QAAqBD,QAAA,KAAAhB,SAAAkB,S,0MAXxBd,uBAAsBS,WAAA,EAFlC,EAAAX,UAAAiB,SAAQ,gBACR,EAAAnB,SAAAoB,YAAW,U,gCAE4BjB,wBAAAkB,uBAD3BjB\",\"ignoreList\":[]}"
1
+ "{\"version\":3,\"file\":\"modules/screen-config/screen-config.controller.js\",\"names\":[\"common_1\",\"require\",\"swagger_1\",\"screen_config_service_1\",\"jwt_auth_guard_1\",\"ScreenConfigController\",\"service\",\"constructor\",\"this\",\"ensureAdmin\",\"req\",\"user\",\"role\",\"ForbiddenException\",\"id\",\"username\",\"list\",\"update\",\"key\",\"dto\",\"exports\",\"__decorate\",\"Get\",\"UseGuards\",\"JwtAuthGuard\",\"ApiBearerAuth\",\"Put\",\"__param\",\"Param\",\"Body\",\"Request\",\"ApiTags\",\"Controller\",\"ScreenConfigService\"],\"sources\":[\"../../../src/modules/screen-config/screen-config.controller.ts\"],\"mappings\":\"6qBAAA,MAAAA,SAAAC,QAAA,kBAUAC,UAAAD,QAAA,mBACAE,wBAAAF,QAAA,2BAEAG,iBAAAH,QAAA,0BAIO,IAAMI,uBAAN,MACwBC,QAA7B,WAAAC,CAA6BD,GAAAE,KAAAF,SAA+B,CAGpD,WAAAG,CAAYC,GAClB,GAAuB,UAAnBA,EAAIC,MAAMC,MAAuC,eAAnBF,EAAIC,MAAMC,KAC1C,MAAM,IAAIZ,SAAAa,mBAAmB,eAE/B,MAAO,CAAEC,GAAIJ,EAAIC,KAAKG,GAAIC,SAAUL,EAAIC,KAAKI,SAC/C,CAOA,IAAAC,GACE,OAAOR,KAAKF,QAAQU,MACtB,CAMA,MAAAC,CACgBC,EACNC,EACGT,GAGX,OADAF,KAAKC,YAAYC,GACVF,KAAKF,QAAQW,OAAOC,EAAKC,EAClC,GA/BWC,QAAAf,8CAgBXgB,WAAA,EADC,EAAArB,SAAAsB,KAAI,Q,4JASLD,WAAA,EAHC,EAAArB,SAAAuB,WAAUnB,iBAAAoB,eACV,EAAAtB,UAAAuB,kBACA,EAAAzB,SAAA0B,KAAI,QAEFC,QAAA,KAAA3B,SAAA4B,OAAM,QACND,QAAA,KAAA3B,SAAA6B,SACAF,QAAA,KAAA3B,SAAA8B,Y,iNA3BQzB,uBAAsBgB,WAAA,EAFlC,EAAAnB,UAAA6B,SAAQ,gBACR,EAAA/B,SAAAgC,YAAW,U,gCAE4B7B,wBAAA8B,uBAD3B5B\",\"ignoreList\":[]}"