qyani-web 1.0.1 → 1.0.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.
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * 首页
4
+ * @param req
5
+ * @param res
6
+ */
7
+ export const index = (req, res) => {
8
+ const request = req;
9
+ res.writeHead(200, { 'Content-Type': 'application/json' });
10
+ res.end(JSON.stringify({
11
+ message: 'Welcome to Qianrenni\'s WebApp FrameWork',
12
+ query: Object.fromEntries(request.query ?? {}),
13
+ params: request.params ?? {}
14
+ }));
15
+ return true;
16
+ };
17
+ /**
18
+ * 用户详情
19
+ * @param req
20
+ * @param res
21
+ */
22
+ export const userDetail = (req, res) => {
23
+ const request = req;
24
+ // 确保 query 存在并转换为 Record 类型
25
+ const queryParams = request.query
26
+ ? Object.entries(request.query)
27
+ : {};
28
+ res.writeHead(200, { 'Content-Type': 'application/json' });
29
+ res.end(JSON.stringify({
30
+ id: request.params?.id,
31
+ query: queryParams
32
+ }));
33
+ return true;
34
+ };
35
+ import fs from 'fs/promises';
36
+ import path from 'path';
37
+ import { fileURLToPath } from 'url';
38
+ // 替换 __dirname
39
+ const __filename = fileURLToPath(import.meta.url);
40
+ const __dirname = path.dirname(__filename);
41
+ // 确保 public 目录存在
42
+ const PUBLIC_DIR = path.join(__dirname, '../public');
43
+ fs.access(PUBLIC_DIR)
44
+ .then(() => { })
45
+ .catch(async () => {
46
+ await fs.mkdir(PUBLIC_DIR, { recursive: true }); // 添加 recursive 避免多级目录问题
47
+ });
48
+ /**
49
+ * 上传文件
50
+ * @param req
51
+ * @param res
52
+ */
53
+ export const uploadFiles = async (req, res) => {
54
+ const request = req;
55
+ const data = request.body;
56
+ const savedFiles = [];
57
+ const keys = Object.keys(data?.fields);
58
+ if (data?.files) {
59
+ for (const file of data.files) {
60
+ const filePath = path.join(PUBLIC_DIR, file.filename);
61
+ await fs.writeFile(filePath, file.data);
62
+ savedFiles.push(file.filename);
63
+ console.log(`文件已保存至: ${filePath}`);
64
+ }
65
+ }
66
+ res.writeHead(200, { 'Content-Type': 'application/json' });
67
+ res.end(JSON.stringify({
68
+ status: 'success',
69
+ message: `${savedFiles.length} 个文件 ${keys.length} 参数上传成功`,
70
+ files: data?.files?.map(f => f.filename),
71
+ fields: keys
72
+ }));
73
+ return true;
74
+ };
package/dist/lib/app.js CHANGED
@@ -219,5 +219,4 @@ class WebApp {
219
219
  server.listen(port, callback);
220
220
  }
221
221
  }
222
- const app = new WebApp();
223
- export default app;
222
+ export default new WebApp();
@@ -0,0 +1,43 @@
1
+ // routes/index.js
2
+ import app from '../lib/app.js';
3
+ import { index, uploadFiles, userDetail } from '../controllers/index.js';
4
+ import { requestLogger, responseLogger } from '../lib/middleware/logger.js';
5
+ import { validation } from '../lib/middleware/validate.js';
6
+ import { staticResources } from '../lib/middleware/static-resources.js';
7
+ import { cors } from '../lib/middleware/cors.js';
8
+ import { bodyParser } from '../lib/middleware/body-parser.js';
9
+ app.beforeRequest(requestLogger);
10
+ app.beforeRequest(staticResources());
11
+ app.beforeRequest(cors({
12
+ origin: ['http://localhost:300', 'https://www.bilibili.com'],
13
+ methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
14
+ allowedHeaders: ['Content-Type', 'Authorization'],
15
+ credentials: true // 如果需要跨域带 cookie,设为 true
16
+ }));
17
+ app.beforeRequest(bodyParser);
18
+ app.beforeRequest(responseLogger);
19
+ app.get('/', index);
20
+ app.get('/user/:id', userDetail, [validation({
21
+ params: {
22
+ id: {
23
+ type: 'number',
24
+ required: true
25
+ }
26
+ }
27
+ })]);
28
+ app.post('/uploadFiles', uploadFiles);
29
+ import { GroupRoute } from '../lib/GroupRoute.js';
30
+ const groupRouter = new GroupRoute('/route1');
31
+ app.registerGroupRoute(groupRouter);
32
+ console.log('Routes loaded.');
33
+ //
34
+ // app.use(loggerMiddleware); // 日志记录
35
+ // app.use(corsMiddleware); // CORS 控制
36
+ // app.use(bodyLimitMiddleware); // 请求体大小限制
37
+ // app.use(bodyParserMiddleware); // 请求体解析
38
+ // app.use(authMiddleware); // 身份认证
39
+ // app.use(validationMiddleware); // 参数校验
40
+ // app.use(staticMiddleware); // 静态资源服务
41
+ // app.use(router); // 路由分发
42
+ // app.use(errorLoggerMiddleware); // 错误日志记录
43
+ // app.use(errorHandlerMiddleware); // 错误统一处理
@@ -0,0 +1,11 @@
1
+ import { readFileSync } from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from "url";
4
+ // 获取当前模块文件路径
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ export default {
8
+ cert: readFileSync(path.join(__dirname, '../../keys/cert.pem')),
9
+ key: readFileSync(path.join(__dirname, '../../keys/key.pem'))
10
+ };
11
+ console.log('certs loaded');
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ // const forge = import('node-forge');
3
+ // const fs = import('fs');
4
+ //
5
+ // // 生成密钥对
6
+ // const keys = forge.pki.rsa.generateKeyPair(2048);
7
+ //
8
+ // // 创建证书
9
+ // const cert = forge.pki.createCertificate();
10
+ // cert.publicKey = keys.publicKey;
11
+ // cert.serialNumber = '01';
12
+ // cert.validity.notBefore = new Date();
13
+ // cert.validity.notAfter = new Date();
14
+ // cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
15
+ //
16
+ // // 设置主题和颁发者信息
17
+ // const attrs = [{
18
+ // name: 'commonName',
19
+ // value: 'localhost'
20
+ // }, {
21
+ // name: 'countryName',
22
+ // value: 'CN'
23
+ // }, {
24
+ // name: 'organizationName',
25
+ // value: 'Qianrenni'
26
+ // }, {
27
+ // name: 'organizationalUnitName',
28
+ // value: 'Development'
29
+ // }];
30
+ //
31
+ // cert.setSubject(attrs);
32
+ // cert.setIssuer(attrs); // 通常自签名证书 issuer == subject
33
+ // cert.sign(keys.privateKey, forge.md.sha256.create()); // ✅ 正确的方法
34
+ //
35
+ // // 转换为 PEM 格式
36
+ // const pem = {
37
+ // key: forge.pki.privateKeyToPem(keys.privateKey),
38
+ // cert: forge.pki.certificateToPem(cert)
39
+ // };
40
+ //
41
+ // // 写入文件
42
+ // fs.writeFileSync('key.pem', pem.key);
43
+ // fs.writeFileSync('cert.pem', pem.cert);
44
+ //
45
+ // console.log('✅ 私钥和证书已生成:key.pem 和 cert.pem');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qyani-web",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Backend for the app",
5
5
  "main": "index.js",
6
6
  "author": "Qianrenni",
package/src/lib/app.ts CHANGED
@@ -7,7 +7,7 @@ import * as http from "http";
7
7
  import {Handler, Middleware} from "../config/type";
8
8
 
9
9
 
10
- class WebApp {
10
+ class WebApp {
11
11
  private routes: { method: string; url: string; chain: Middleware[] }[]= [];
12
12
  private beforeRequestMiddleWares: Middleware[]= [];
13
13
  private afterRequestMiddleWares: Middleware[]= [];
@@ -228,5 +228,4 @@ class WebApp {
228
228
  }
229
229
  }
230
230
 
231
- const app= new WebApp();
232
- export default app;
231
+ export default new WebApp();