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.
- package/README.md +1 -2
- package/index.js +10 -4
- package/package.json +2 -2
- package/secrets.js +10 -7
- package/templates/backend/Dockerfile +4 -0
- package/templates/backend/config/config.develop.yaml +10 -0
- package/templates/backend/config/config.prod.yaml +10 -0
- package/templates/backend/dist/config/configuration.js +1 -1
- package/templates/backend/dist/config/configuration.js.map +1 -1
- package/templates/backend/dist/modules/auth/auth.service.js +1 -1
- package/templates/backend/dist/modules/auth/auth.service.js.map +1 -1
- package/templates/backend/dist/modules/page-data/page-data.controller.js +1 -1
- package/templates/backend/dist/modules/page-data/page-data.controller.js.map +1 -1
- package/templates/backend/dist/modules/screen-config/screen-config.controller.js +1 -1
- package/templates/backend/dist/modules/screen-config/screen-config.controller.js.map +1 -1
- package/templates/backend/dist/tsconfig.build.tsbuildinfo +1 -1
- package/templates/backend/node_modules/.bin/js-yaml +2 -2
- package/templates/backend/node_modules/.bin/typeorm +2 -2
- package/templates/backend/node_modules/.bin/typeorm-ts-node-commonjs +2 -2
- package/templates/backend/node_modules/.bin/typeorm-ts-node-esm +2 -2
- package/templates/backend/ops/docker/.env.example +4 -0
- package/templates/backend/ops/docker/config.sh +2 -0
- package/templates/backend/ops/docker/install.sh +35 -0
- package/templates/backend/ops/install.sh +17 -3
- package/templates/backend/ops/pm2/config.sh +2 -0
- package/templates/backend/ops/systemd/config.sh +2 -0
- package/templates/backend/package.json +13 -6
- package/templates/backend/scripts/build.cjs +67 -1
- package/templates/backend/src/config/config.interface.ts +9 -0
- package/templates/backend/src/config/configuration.ts +11 -0
- package/templates/backend/src/modules/auth/auth.service.ts +57 -12
- package/templates/backend/src/modules/page-data/page-data.controller.ts +33 -10
- package/templates/backend/src/modules/screen-config/screen-config.controller.ts +33 -5
- package/templates/root/AGENTS.md +1 -1
- package/templates/root/README.md +9 -6
- package/templates/root/package.json +9 -1
- package/templates/web/dist/assets/{404-f80ef771.js → 404-e6edada0.js} +1 -1
- package/templates/web/dist/assets/{404-legacy-3002ee98.js → 404-legacy-f6ca5b91.js} +1 -1
- package/templates/web/dist/assets/AuthLayout-bcf98efb.js +1 -0
- package/templates/web/dist/assets/AuthLayout-legacy-6e7a8ae1.js +1 -0
- package/templates/web/dist/assets/Background-90a49ee7.css +1 -0
- package/templates/web/dist/assets/Background-eb77ef54.js +1 -0
- package/templates/web/dist/assets/Background-legacy-50457007.js +1 -0
- package/templates/web/dist/assets/{Screen-2126fd8d.js → Screen-318c3fc2.js} +1 -1
- package/templates/web/dist/assets/{Screen-legacy-e1974f1b.js → Screen-legacy-af123b0f.js} +1 -1
- package/templates/web/dist/assets/{ScreenChartOption-cc9d0192.js → ScreenChartOption-953b9157.js} +1 -1
- package/templates/web/dist/assets/{ScreenChartOption-legacy-b1b2d49d.js → ScreenChartOption-legacy-2e8fcfd8.js} +1 -1
- package/templates/web/dist/assets/api-beff4a3e.js +1 -0
- package/templates/web/dist/assets/api-legacy-9fe41d4b.js +1 -0
- package/templates/web/dist/assets/{base-8cbac341.js → base-a14309c8.js} +1 -1
- package/templates/web/dist/assets/{base-legacy-ee9fb316.js → base-legacy-2bc6e427.js} +1 -1
- package/templates/web/dist/assets/{child-10cea360.js → child-2a48ca65.js} +1 -1
- package/templates/web/dist/assets/{child-legacy-5af47aba.js → child-legacy-7665b5f8.js} +1 -1
- package/templates/web/dist/assets/{component-ae0df581.js → component-89b5253e.js} +1 -1
- package/templates/web/dist/assets/{component-legacy-7824b5dc.js → component-legacy-8c5a28ef.js} +1 -1
- package/templates/web/dist/assets/{demo-1b5e36be.js → demo-d7272cf4.js} +1 -1
- package/templates/web/dist/assets/{demo-legacy-e12d2ac9.js → demo-legacy-f7bbfe55.js} +1 -1
- package/templates/web/dist/assets/echarts-vendor-50090982.js +9 -0
- package/templates/web/dist/assets/echarts-vendor-legacy-50b58722.js +10 -0
- package/templates/web/dist/assets/{grandson-d5883b90.js → grandson-05f8bb58.js} +1 -1
- package/templates/web/dist/assets/{grandson-legacy-10cd2476.js → grandson-legacy-3e10990b.js} +1 -1
- package/templates/web/dist/assets/{index-9fbd51da.js → index-466a1ec1.js} +1 -1
- package/templates/web/dist/assets/{index-5dbae75a.js → index-5b5a8146.js} +1 -1
- package/templates/web/dist/assets/{index-6faaa6d8.js → index-7277cbfb.js} +1 -1
- package/templates/web/dist/assets/{index-8f6fba9f.js → index-777ef781.js} +1 -1
- package/templates/web/dist/assets/{index-2e42b180.js → index-86214b19.js} +1 -1
- package/templates/web/dist/assets/{index-463d9205.js → index-9cd5622a.js} +1 -1
- package/templates/web/dist/assets/{index-16f6b85c.js → index-a79e448b.js} +1 -1
- package/templates/web/dist/assets/{index-3a9a0a97.js → index-b60badf7.js} +1 -1
- package/templates/web/dist/assets/{index-fbf4ee3f.js → index-bd4ed808.js} +1 -1
- package/templates/web/dist/assets/{index-687d6cfe.js → index-cba19800.js} +1 -1
- package/templates/web/dist/assets/{index-5dbcad00.js → index-d70eb540.js} +1 -1
- package/templates/web/dist/assets/{index-25ea283a.js → index-e6071630.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-ced5a7f1.js → index-legacy-028ed5d5.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-8c7d1ee7.js → index-legacy-06483318.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-ba034322.js → index-legacy-0da8de82.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-3d221bb6.js → index-legacy-3965dcaf.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-f3e49a4e.js → index-legacy-4a13dddc.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-e9af81d8.js → index-legacy-783129a7.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-07d00151.js → index-legacy-8a2cfb9d.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-dd62c9e7.js → index-legacy-993ef005.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-38c170dc.js → index-legacy-b075295d.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-95da3338.js → index-legacy-b3bd40c1.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-9be704da.js → index-legacy-d510e318.js} +1 -1
- package/templates/web/dist/assets/{index-legacy-0f01787c.js → index-legacy-feb54578.js} +1 -1
- package/templates/web/dist/assets/{parent-e7114c1b.js → parent-bba709aa.js} +1 -1
- package/templates/web/dist/assets/{parent-legacy-9e493d04.js → parent-legacy-48111978.js} +1 -1
- package/templates/web/dist/assets/vendor-affac96c.js +124 -0
- package/templates/web/dist/assets/vendor-legacy-55fa76eb.js +122 -0
- package/templates/web/dist/index.html +3 -3
- package/templates/web/package.json +7 -7
- package/templates/web/src/js/xlsl.ts +110 -59
- package/templates/web/src/layouts/AuthLayout.tsx +16 -11
- package/templates/web/src/layouts/Background.module.less +5 -3
- package/templates/web/src/services/api/admin/user.ts +9 -2
- package/templates/web/dist/assets/AuthLayout-f07f2dff.js +0 -1
- package/templates/web/dist/assets/AuthLayout-legacy-635887dd.js +0 -1
- package/templates/web/dist/assets/Background-63ce83a2.js +0 -1
- package/templates/web/dist/assets/Background-b264d337.css +0 -1
- package/templates/web/dist/assets/Background-legacy-a34b521f.js +0 -1
- package/templates/web/dist/assets/api-21ca288f.js +0 -1
- package/templates/web/dist/assets/api-legacy-b464070b.js +0 -1
- package/templates/web/dist/assets/echarts-vendor-fdb2c14f.js +0 -9
- package/templates/web/dist/assets/echarts-vendor-legacy-e99e5121.js +0 -10
- package/templates/web/dist/assets/vendor-e7ea3a11.js +0 -96
- package/templates/web/dist/assets/vendor-legacy-a62a28c9.js +0 -87
- 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
|
|
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.
|
|
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.
|
|
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
|
|
15
|
-
* jwtSecret
|
|
16
|
-
* password
|
|
17
|
-
* cryptKey
|
|
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
|
-
*
|
|
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
|
|
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,
|
|
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
|
|
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\",\"
|
|
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
|
|
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\",\"
|
|
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,
|
|
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,
|
|
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\":[]}"
|