├── .editorconfig
├── .env.development
├── .env.production
├── .eslintignore
├── .eslintrc.cjs
├── .gitignore
├── .husky
├── commit-msg
└── pre-commit
├── .prettierignore
├── .prettierrc.cjs
├── README-CN.md
├── README.md
├── commitlint.config.cjs
├── index.html
├── license
├── package.json
├── public
└── logo.svg
├── server
├── config
│ ├── index.js
│ └── index.js.map
├── helpers
│ ├── alipay
│ │ ├── index.js
│ │ └── index.js.map
│ ├── mailer
│ │ ├── index.js
│ │ └── index.js.map
│ ├── queue
│ │ ├── checkTokenQueue.js
│ │ ├── checkTokenQueue.js.map
│ │ ├── function.js
│ │ ├── function.js.map
│ │ ├── index.js
│ │ └── index.js.map
│ ├── redis
│ │ ├── index.js
│ │ └── index.js.map
│ ├── schedule
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── scheduleCarmi.js
│ │ ├── scheduleCarmi.js.map
│ │ ├── scheduleToken.js
│ │ └── scheduleToken.js.map
│ └── yipay
│ │ ├── index.js
│ │ └── index.js.map
├── index.js
├── index.js.map
├── middlewares
│ ├── catch_error.js
│ ├── catch_error.js.map
│ ├── verify.js
│ └── verify.js.map
├── models
│ ├── action
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── carmi
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── config
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── db.js
│ ├── db.js.map
│ ├── index.js
│ ├── index.js.map
│ ├── message
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── notification
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── order
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── payment
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── product
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── signin
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── token
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ ├── turnover
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
│ └── user
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── mysql.js
│ │ └── mysql.js.map
├── routers
│ ├── admin
│ │ ├── action.js
│ │ ├── action.js.map
│ │ ├── carmi.js
│ │ ├── carmi.js.map
│ │ ├── config.js
│ │ ├── config.js.map
│ │ ├── index.js
│ │ ├── index.js.map
│ │ ├── message.js
│ │ ├── message.js.map
│ │ ├── notification.js
│ │ ├── notification.js.map
│ │ ├── order.js
│ │ ├── order.js.map
│ │ ├── payment.js
│ │ ├── payment.js.map
│ │ ├── product.js
│ │ ├── product.js.map
│ │ ├── signin.js
│ │ ├── signin.js.map
│ │ ├── token.js
│ │ ├── token.js.map
│ │ ├── turnover.js
│ │ ├── turnover.js.map
│ │ ├── user.js
│ │ └── user.js.map
│ ├── api.js
│ ├── api.js.map
│ ├── index.js
│ └── index.js.map
├── type.js
├── type.js.map
└── utils
│ ├── buildQueryString.js
│ ├── buildQueryString.js.map
│ ├── filterObjectNull.js
│ ├── filterObjectNull.js.map
│ ├── formatTime.js
│ ├── formatTime.js.map
│ ├── generateCode.js
│ ├── generateCode.js.map
│ ├── generateMd5.js
│ ├── generateMd5.js.map
│ ├── generateNowflakeId.js
│ ├── generateNowflakeId.js.map
│ ├── generateToken.js
│ ├── generateToken.js.map
│ ├── generateUUID.js
│ ├── generateUUID.js.map
│ ├── getClientIP.js
│ ├── getClientIP.js.map
│ ├── getKeyUsage.js
│ ├── getKeyUsage.js.map
│ ├── handleChatData.js
│ ├── handleChatData.js.map
│ ├── httpBody.js
│ ├── httpBody.js.map
│ ├── index.js
│ ├── index.js.map
│ ├── ksort.js
│ ├── ksort.js.map
│ ├── pagingData.js
│ └── pagingData.js.map
├── sql
├── chatgpt_test_xin_530.sql
└── config_530.sql
├── src
├── assets
│ ├── 3.png
│ ├── 4.png
│ ├── emojis.json
│ ├── header.png
│ ├── openai.svg
│ ├── prompts-zh.json
│ ├── react.svg
│ ├── recommend.json
│ └── vite.svg
├── components
│ ├── ConfigModal
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── FormItemCard
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── Global
│ │ └── index.tsx
│ ├── GoodsList
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── HeaderRender
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── Layout
│ │ └── index.tsx
│ ├── LoginModal
│ │ └── index.tsx
│ ├── MenuList
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── OpenAiLogo
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── Reminder
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── RichEdit
│ │ └── index.tsx
│ ├── UserHead
│ │ └── index.tsx
│ └── UserInfoCard
│ │ ├── index.module.less
│ │ └── index.tsx
├── hooks
│ ├── useDocumentResize.ts
│ └── useScroll.ts
├── main.tsx
├── pages
│ ├── 404
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── App.tsx
│ ├── admin
│ │ ├── carmi
│ │ │ ├── index.module.less
│ │ │ └── index.tsx
│ │ ├── components
│ │ │ └── FormCard
│ │ │ │ ├── index.module.less
│ │ │ │ └── index.tsx
│ │ ├── config
│ │ │ ├── index.module.less
│ │ │ └── index.tsx
│ │ ├── index.module.less
│ │ ├── index.tsx
│ │ ├── message
│ │ │ └── index.tsx
│ │ ├── notification
│ │ │ └── index.tsx
│ │ ├── order
│ │ │ ├── index.module.less
│ │ │ └── index.tsx
│ │ ├── payment
│ │ │ └── index.tsx
│ │ ├── product
│ │ │ └── index.tsx
│ │ ├── signin
│ │ │ └── index.tsx
│ │ ├── token
│ │ │ └── index.tsx
│ │ ├── turnover
│ │ │ └── index.tsx
│ │ └── user
│ │ │ └── index.tsx
│ ├── chat
│ │ ├── components
│ │ │ ├── AllInput
│ │ │ │ ├── index.module.less
│ │ │ │ └── index.tsx
│ │ │ ├── ChatMessage
│ │ │ │ ├── index.module.less
│ │ │ │ └── index.tsx
│ │ │ ├── RoleLocal
│ │ │ │ ├── index.module.less
│ │ │ │ └── index.tsx
│ │ │ └── RoleNetwork
│ │ │ │ ├── index.module.less
│ │ │ │ └── index.tsx
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── draw
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── login
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── result
│ │ ├── index.module.less
│ │ └── index.tsx
│ ├── shop
│ │ ├── index.module.less
│ │ └── index.tsx
│ └── user
│ │ ├── index.module.less
│ │ └── index.tsx
├── request
│ ├── adminApi.ts
│ ├── api.ts
│ └── index.ts
├── routers
│ ├── auth_router.tsx
│ ├── index.tsx
│ └── menu_list.tsx
├── store
│ ├── async.ts
│ ├── chat
│ │ ├── async.ts
│ │ └── slice.ts
│ ├── config
│ │ ├── async.ts
│ │ └── slice.ts
│ ├── draw
│ │ ├── async.ts
│ │ └── slice.ts
│ ├── index.ts
│ ├── prompt
│ │ └── slice.ts
│ ├── shop
│ │ ├── async.ts
│ │ └── slice.ts
│ └── user
│ │ ├── async.ts
│ │ └── slice.ts
├── styles
│ ├── global.less
│ ├── highlight.less
│ └── markdown.less
├── types
│ ├── admin.ts
│ └── index.ts
├── utils
│ ├── copyToClipboard.ts
│ ├── filterObjectNull.ts
│ ├── formatTime.ts
│ ├── generateChatInfo.ts
│ ├── generateUUID.ts
│ ├── getEmailPre.ts
│ ├── handleChatData.ts
│ ├── index.ts
│ ├── is.ts
│ ├── joinTrim.ts
│ └── paginate.ts
└── vite-env.d.ts
├── tsconfig.json
├── tsconfig.node.json
├── vercel.json
├── vite.config.ts
└── yarn.lock
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true # 控制配置文件 .editorconfig 是否生效的字段
2 |
3 | [**] # 匹配全部文件
4 | indent_style = tab # 缩进风格,可选space|tab
5 | indent_size = 4 # 缩进的空格数
6 | charset = utf-8 # 设置字符集
7 | trim_trailing_whitespace = true # 删除一行中的前后空格
8 | insert_final_newline = true # 设为true表示使文件以一个空白行结尾
9 | end_of_line = lf
10 |
11 | [**.md] # 匹配md文件
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/.env.development:
--------------------------------------------------------------------------------
1 | # 系统环境
2 | VITE_APP_ENV=development
3 |
4 | # 请求地址
5 | VITE_APP_REQUEST_HOST=http://localhost:3200
6 |
7 | # APP 名称&Logo
8 | VITE_APP_TITLE=ChatGPT
9 | VITE_APP_LOGO=https://u1.dl0.cn/icon/openailogo.svg
10 |
--------------------------------------------------------------------------------
/.env.production:
--------------------------------------------------------------------------------
1 | # 系统环境
2 | VITE_APP_ENV=production
3 |
4 | # 请求地址
5 | VITE_APP_REQUEST_HOST=
6 |
7 | # APP 名称&Logo
8 | VITE_APP_TITLE=ChatGpt
9 | VITE_APP_LOGO=https://u1.dl0.cn/icon/openailogo.svg
10 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | *.sh
2 | *.md
3 | *.woff
4 | *.ttf
5 | .vscode
6 | .idea
7 | .husky
8 | .local
9 | dist
10 | node_modules
11 | Dockerfile
12 | /public
13 | /docs
14 | /bin
15 | /dist
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 | package-lock.json
10 |
11 | node_modules
12 | dist
13 | dist-ssr
14 | *.local
15 | .vite
16 |
17 | # Editor directories and files
18 | .vscode/*
19 | .vscode
20 | !.vscode/extensions.json
21 | .idea
22 | .DS_Store
23 | *.suo
24 | *.ntvs*
25 | *.njsproj
26 | *.sln
27 | *.sw?
28 |
29 |
30 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
31 |
32 | # dependencies
33 | /node_modules
34 | /.pnp
35 | .pnp.js
36 |
37 | # testing
38 | /coverage
39 |
40 | # next.js
41 | /.next/
42 | /out/
43 |
44 | # production
45 | /build
46 |
47 | # misc
48 | *.pem
49 |
50 | # local env files
51 | .env*.local
52 |
53 | # vercel
54 | .vercel
55 |
56 | # typescript
57 | *.tsbuildinfo
58 | next-env.d.ts
59 |
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | npx --no-install commitlint --edit "$1"
5 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | npm run eslint:fix
5 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | /dist/*
2 | /public/*
3 | /node_modules/**
4 | .local
5 | .output.js
6 | **/*.svg
7 | **/*.sh
8 |
--------------------------------------------------------------------------------
/.prettierrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | printWidth: 100, // 最大行长规则通常设置为 100 或 120。
3 | tabWidth: 2, // 指定每个标签缩进级别的空格数。
4 | useTabs: false, // 使用制表符而不是空格缩进行。
5 | semi: false, // true(默认): 在每条语句的末尾添加一个分号。false:仅在可能导致 ASI 失败的行的开头添加分号。
6 | singleQuote: true, // 使用单引号而不是双引号
7 | quoteProps: 'as-needed', // 引用对象中的属性时,仅在需要时在对象属性周围添加引号。
8 | bracketSpacing: true, // 在对象文字中的括号之间打印空格。
9 | trailingComma: 'none', // "none":没有尾随逗号。"es5": 在 ES5 中有效的尾随逗号(对象、数组等),TypeScript 中的类型参数中没有尾随逗号。"all"- 尽可能使用尾随逗号。
10 | bracketSameLine: false, // 将>多行 HTML(HTML、JSX、Vue、Angular)元素放在最后一行的末尾,而不是单独放在下一行(不适用于自闭合元素)。
11 | jsxSingleQuote: false, // 在 JSX 中使用单引号而不是双引号。
12 | arrowParens: 'always', // 在唯一的箭头函数参数周围始终包含括号。
13 | insertPragma: false, // 插入编译指示
14 | requirePragma: false, // 需要编译指示
15 | proseWrap: 'never', // 如果散文超过打印宽度,则换行
16 | htmlWhitespaceSensitivity: 'strict', // 所有标签周围的空格(或缺少空格)被认为是重要的。
17 | endOfLine: 'lf', // 确保在文本文件中仅使用 ( \n)换行,常见于 Linux 和 macOS 以及 git repos 内部。
18 | rangeStart: 0, // 格式化文件时,回到包含所选语句的第一行的开头。
19 | };
20 |
--------------------------------------------------------------------------------
/commitlint.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | // 继承的规则
3 | extends: ['@commitlint/config-conventional'],
4 | // 定义规则类型
5 | rules: {
6 | // type 类型定义,表示 git 提交的 type 必须在以下类型范围内
7 | 'type-enum': [
8 | 2,
9 | 'always',
10 | [
11 | 'feat', // 新功能 feature
12 | 'fix', // 修复 bug
13 | 'docs', // 文档注释
14 | 'style', // 代码格式(不影响代码运行的变动)
15 | 'refactor', // 重构(既不增加新功能,也不是修复bug)
16 | 'perf', // 性能优化
17 | 'test', // 增加测试
18 | 'chore', // 构建过程或辅助工具的变动
19 | 'revert', // 回退
20 | 'build' // 打包
21 | ]
22 | ],
23 | // subject 大小写不做校验
24 | 'subject-case': [0]
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/license:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 79E
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/public/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/server/config/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, '__esModule', { value: true });
4 | function getConfig(key) {
5 | const config = {
6 | port: 3200,
7 | mysql_config: {
8 | dialect: 'mysql',
9 | host: '43.156.76.15',
10 | port: 3306,
11 | username: 'chatgpt',
12 | password: 'dPs4zKtDxhijt87P',
13 | database: 'chatgpt',
14 | timezone: '+08:00',
15 | dialectOptions: {
16 | dateStrings: true,
17 | typeCast: true
18 | }
19 | },
20 | redis_config: {
21 | type: 'redis',
22 | host: '43.156.76.15',
23 | port: 6379,
24 | password: 'redis'
25 | },
26 | email: '1191500820@qq.com',
27 | email_config: {
28 | host: 'smtp.qq.com',
29 | port: 465,
30 | ignoreTLS: true,
31 | secure: false,
32 | auth: {
33 | user: '1191500820@qq.com',
34 | pass: 'ktqqegpigqpligdd'
35 | }
36 | }
37 | };
38 | if (key) {
39 | return config[key];
40 | }
41 | return config;
42 | }
43 | exports.default = {
44 | getConfig
45 | };
46 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/config/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/config/index.ts"],"names":[],"mappings":";;AAoCA,SAAS,SAAS,CAAC,GAAkB;IACnC,MAAM,MAAM,GAAW;QACrB,IAAI,EAAE,IAAI;QACV,YAAY,EAAE;YACZ,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,kBAAkB;YAC5B,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,QAAQ;YAClB,cAAc,EAAE;gBACd,WAAW,EAAE,IAAI;gBACjB,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,sBAAsB;SACjC;QACD,KAAK,EAAE,oBAAoB;QAC3B,YAAY,EAAE;YACZ,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,IAAI,EAAE;gBACJ,IAAI,EAAE,oBAAoB;gBAC1B,IAAI,EAAE,kBAAkB;aACzB;SACF;KACF,CAAA;IAED,IAAI,GAAG,EAAE;QACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;KACnB;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,kBAAe;IACb,SAAS;CACV,CAAA"}
--------------------------------------------------------------------------------
/server/helpers/alipay/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, "__esModule", { value: true });
4 | exports.precreate = void 0;
5 | const tslib_1 = require("tslib");
6 | const alipay_sdk_1 = tslib_1.__importDefault(require("alipay-sdk"));
7 | const utils_1 = require("../../utils");
8 | async function precreate({ config, notify_url, out_trade_no, total_amount, subject, body, goods_detail }) {
9 | const alipaySdk = new alipay_sdk_1.default(config);
10 | const response = await alipaySdk.exec('alipay.trade.precreate', {
11 | notify_url: notify_url,
12 | bizContent: {
13 | out_trade_no,
14 | subject,
15 | goods_detail: [goods_detail],
16 | body,
17 | total_amount,
18 | product_code: 'FACE_TO_FACE_PAYMENT'
19 | } // 业务(API)参数
20 | });
21 | return {
22 | ...response,
23 | code: response.code === '10000' ? 0 : response.code
24 | };
25 | }
26 | exports.precreate = precreate;
27 | async function checkNotifySign(config, body) {
28 | const alipaySdk = new alipay_sdk_1.default(config);
29 | const data = (0, utils_1.filterObjectNull)({
30 | ...body,
31 | channel: null
32 | });
33 | return alipaySdk.checkNotifySign(data);
34 | }
35 | exports.default = {
36 | precreate,
37 | checkNotifySign
38 | };
39 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/helpers/alipay/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/helpers/alipay/index.ts"],"names":[],"mappings":";;;;AAAA,oEAAkC;AAClC,uCAA8C;AAqBvC,KAAK,UAAU,SAAS,CAAC,EAC9B,MAAM,EACN,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,IAAI,EACJ,YAAY,EASb;IACC,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAW,wBAAwB,EAAE;QACxE,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE;YACV,YAAY;YACZ,OAAO;YACP,YAAY,EAAE,CAAC,YAAY,CAAC;YAC5B,IAAI;YACJ,YAAY;YACZ,YAAY,EAAE,sBAAsB;SACrC,CAAC,YAAY;KACf,CAAC,CAAA;IAEF,OAAO;QACL,GAAG,QAAQ;QACX,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;KACpD,CAAA;AACH,CAAC;AAlCD,8BAkCC;AAED,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,IAA4B;IACzE,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,IAAA,wBAAgB,EAAC;QAC5B,GAAG,IAAI;QACP,OAAO,EAAE,IAAI;KACd,CAAC,CAAA;IACF,OAAO,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAED,kBAAe;IACb,SAAS;IACT,eAAe;CAChB,CAAA"}
--------------------------------------------------------------------------------
/server/helpers/mailer/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, "__esModule", { value: true });
4 | const tslib_1 = require("tslib");
5 | const nodemailer_1 = tslib_1.__importDefault(require("nodemailer"));
6 | const config_1 = tslib_1.__importDefault(require("../../config"));
7 | const transporter = nodemailer_1.default.createTransport({
8 | ...config_1.default.getConfig('email_config')
9 | });
10 | const baseOptions = {
11 | from: `"ChatGpt" <${config_1.default.getConfig('email')}>`
12 | };
13 | // 用 Promise 包装发送邮件的操作
14 | const sendMail = (opts) => {
15 | return new Promise((resolve, reject) => {
16 | transporter.sendMail(opts, (err, resp) => {
17 | if (err) {
18 | reject(err);
19 | }
20 | else {
21 | resolve(resp);
22 | }
23 | });
24 | });
25 | };
26 | exports.default = {
27 | async send(to, body, title = '通知邮件', type = 'code') {
28 | const sendOptions = Object.assign(baseOptions, {
29 | to,
30 | subject: title,
31 | html: body
32 | });
33 | return sendMail(sendOptions);
34 | }
35 | };
36 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/helpers/mailer/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/helpers/mailer/index.ts"],"names":[],"mappings":";;;AAAA,oEAAwD;AACxD,kEAAiC;AAEjC,MAAM,WAAW,GAAG,oBAAU,CAAC,eAAe,CAAC;IAC7C,GAAG,gBAAM,CAAC,SAAS,CAAC,cAAc,CAAC;CACpC,CAAC,CAAA;AAEF,MAAM,WAAW,GAAoB;IACnC,IAAI,EAAE,cAAc,gBAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG;CACjD,CAAA;AAED,sBAAsB;AACtB,MAAM,QAAQ,GAAG,CAAC,IAAqB,EAAE,EAAE;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACvC,IAAI,GAAG,EAAE;gBACP,MAAM,CAAC,GAAG,CAAC,CAAA;aACZ;iBAAM;gBACL,OAAO,CAAC,IAAI,CAAC,CAAA;aACd;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAID,kBAAe;IACb,KAAK,CAAC,IAAI,CACR,EAAU,EACV,IAAqB,EACrB,KAAK,GAAG,MAAM,EACd,OAA0B,MAAM;QAEhC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;YAC7C,EAAE;YACF,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC9B,CAAC;CACF,CAAA"}
--------------------------------------------------------------------------------
/server/helpers/queue/checkTokenQueue.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, "__esModule", { value: true });
4 | const tslib_1 = require("tslib");
5 | // 检查key 是否正常
6 | // import { payModels } from '../../models';
7 | // import { wxPayClose } from '../request/wx_api';
8 | const models_1 = require("../../models");
9 | const utils_1 = require("../../utils");
10 | const function_1 = tslib_1.__importDefault(require("./function"));
11 | const CheckTokenQueue = (0, function_1.default)('CheckTokenQueue');
12 | // 向队列新增
13 | async function addTask(data, options) {
14 | const res = await CheckTokenQueue.add(data, options);
15 | return res;
16 | }
17 | // 消费
18 | CheckTokenQueue.process(async (job) => {
19 | const { id, key, host } = job.data;
20 | const check = await (0, utils_1.getKeyUsage)(host, key);
21 | let status = 1;
22 | const limit = Number(check.hard_limit_usd);
23 | const usage = Number(check.total_usage);
24 | console.log(limit, usage);
25 | if (check.status) {
26 | status = 0;
27 | }
28 | if (limit <= usage) {
29 | status = 0;
30 | }
31 | await models_1.tokenModel.editToken(id, {
32 | limit,
33 | usage,
34 | status
35 | });
36 | return;
37 | });
38 | exports.default = {
39 | addTask
40 | };
41 | //# sourceMappingURL=checkTokenQueue.js.map
--------------------------------------------------------------------------------
/server/helpers/queue/checkTokenQueue.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"checkTokenQueue.js","sourceRoot":"","sources":["../../../server/helpers/queue/checkTokenQueue.ts"],"names":[],"mappings":";;;AAAA,aAAa;AACb,4CAA4C;AAC5C,kDAAkD;AAClD,yCAA0C;AAC1C,uCAA0C;AAC1C,kEAAqC;AAErC,MAAM,eAAe,GAAG,IAAA,kBAAW,EAAC,iBAAiB,CAAC,CAAC;AAEvD,QAAQ;AACR,KAAK,UAAU,OAAO,CAAC,IAAI,EAAE,OAAQ;IACjC,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,KAAK;AACL,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IAClC,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAW,EAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACzB,IAAG,KAAK,CAAC,MAAM,EAAC;QACZ,MAAM,GAAG,CAAC,CAAA;KACb;IACD,IAAG,KAAK,IAAI,KAAK,EAAC;QACd,MAAM,GAAG,CAAC,CAAA;KACb;IACD,MAAM,mBAAU,CAAC,SAAS,CAAC,EAAE,EAAE;QAC3B,KAAK;QACL,KAAK;QACL,MAAM;KACT,CAAC,CAAA;IACF,OAAM;AACV,CAAC,CAAC,CAAC;AAEH,kBAAe;IACX,OAAO;CACV,CAAC"}
--------------------------------------------------------------------------------
/server/helpers/queue/function.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const bull_1 = tslib_1.__importDefault(require("bull"));
5 | const config_1 = tslib_1.__importDefault(require("../../config"));
6 | function createQueue(queueName) {
7 | return new bull_1.default(queueName, {
8 | redis: {
9 | ...config_1.default.getConfig('redis_config'),
10 | db: 11
11 | },
12 | defaultJobOptions: {
13 | removeOnComplete: false,
14 | removeOnFail: false,
15 | }
16 | });
17 | }
18 | exports.default = createQueue;
19 | //# sourceMappingURL=function.js.map
--------------------------------------------------------------------------------
/server/helpers/queue/function.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"function.js","sourceRoot":"","sources":["../../../server/helpers/queue/function.ts"],"names":[],"mappings":";;;AAAA,wDAAwB;AACxB,kEAAkC;AAElC,SAAS,WAAW,CAAC,SAAS;IAC1B,OAAO,IAAI,cAAK,CAAC,SAAS,EAAE;QACxB,KAAK,EAAE;YACH,GAAG,gBAAM,CAAC,SAAS,CAAC,cAAc,CAAC;YACnC,EAAE,EAAE,EAAE;SACT;QACD,iBAAiB,EAAE;YACf,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,KAAK;SACtB;KACJ,CAAC,CAAC;AACP,CAAC;AAED,kBAAe,WAAW,CAAC"}
--------------------------------------------------------------------------------
/server/helpers/queue/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.checkTokenQueue = void 0;
4 | const tslib_1 = require("tslib");
5 | const checkTokenQueue_1 = tslib_1.__importDefault(require("./checkTokenQueue"));
6 | exports.checkTokenQueue = checkTokenQueue_1.default;
7 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/helpers/queue/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/helpers/queue/index.ts"],"names":[],"mappings":";;;;AAAA,gFAA+C;AAE3C,0BAFG,yBAAe,CAEH"}
--------------------------------------------------------------------------------
/server/helpers/redis/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, "__esModule", { value: true });
4 | const tslib_1 = require("tslib");
5 | const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
6 | const config_1 = tslib_1.__importDefault(require("../../config"));
7 | const ioredis = new ioredis_1.default({
8 | ...config_1.default.getConfig('redis_config')
9 | });
10 | class Redis {
11 | ioredis;
12 | constructor(ioredis) {
13 | this.ioredis = ioredis;
14 | this.select(0);
15 | }
16 | select(index = 0) {
17 | this.ioredis.select(index);
18 | return this;
19 | }
20 | // 秒
21 | expire(key, time = 0) {
22 | if (time) {
23 | ioredis.expire(key, time);
24 | }
25 | return this;
26 | }
27 | // 毫秒
28 | pexpire(key, time = 0) {
29 | if (time) {
30 | ioredis.pexpire(key, time);
31 | }
32 | return this;
33 | }
34 | async get(key) {
35 | const results = await ioredis.get(key);
36 | return results;
37 | }
38 | set(key, value) {
39 | ioredis.set(key, value);
40 | return this;
41 | }
42 | setex(key, value, time) {
43 | ioredis.setex(key, time, value);
44 | return this;
45 | }
46 | sadd(key, value, time) {
47 | ioredis.sadd(key, value);
48 | if (time) {
49 | ioredis.expire(key, time);
50 | }
51 | return this;
52 | }
53 | // 删除集合中某个数据
54 | srem(key, value) {
55 | return ioredis.srem(key, value);
56 | }
57 | sismember(key, value) {
58 | return ioredis.sismember(key, value);
59 | }
60 | smembers(key) {
61 | return ioredis.smembers(key);
62 | }
63 | async del(...args) {
64 | const results = await ioredis.del(args);
65 | return results;
66 | }
67 | }
68 | exports.default = new Redis(ioredis);
69 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/helpers/redis/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/helpers/redis/index.ts"],"names":[],"mappings":";;;AAAA,8DAA+D;AAC/D,kEAAiC;AAEjC,MAAM,OAAO,GAAG,IAAI,iBAAS,CAAC;IAC5B,GAAG,gBAAM,CAAC,SAAS,CAAC,cAAc,CAAC;CACpC,CAAC,CAAA;AAEF,MAAM,KAAK;IACT,OAAO,CAAS;IAChB,YAAY,OAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IACD,MAAM,CAAC,KAAK,GAAG,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI;IACJ,MAAM,CAAC,GAAa,EAAE,IAAI,GAAG,CAAC;QAC5B,IAAI,IAAI,EAAE;YACR,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;SAC1B;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK;IACL,OAAO,CAAC,GAAa,EAAE,IAAI,GAAG,CAAC;QAC7B,IAAI,IAAI,EAAE;YACR,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;SAC3B;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAa;QACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,GAAG,CAAC,GAAa,EAAE,KAAsB;QACvC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,GAAa,EAAE,KAAsB,EAAE,IAAY;QACvD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,GAAa,EAAE,KAAsB,EAAE,IAAa;QACvD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACxB,IAAI,IAAI,EAAE;YACR,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;SAC1B;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,YAAY;IACZ,IAAI,CAAC,GAAa,EAAE,KAAa;QAC/B,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACjC,CAAC;IACD,SAAS,CAAC,GAAa,EAAE,KAAsB;QAC7C,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;IACD,QAAQ,CAAC,GAAa;QACpB,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAG,IAAgB;QAC3B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AAED,kBAAe,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA"}
--------------------------------------------------------------------------------
/server/helpers/schedule/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, "__esModule", { value: true });
4 | exports.globalScheduleJobs = void 0;
5 | const tslib_1 = require("tslib");
6 | const node_schedule_1 = tslib_1.__importDefault(require("node-schedule"));
7 | const scheduleCarmi_1 = tslib_1.__importDefault(require("./scheduleCarmi"));
8 | const scheduleToken_1 = tslib_1.__importDefault(require("./scheduleToken"));
9 | // 每分钟的第30秒触发: '30 * * * * *'
10 | // 每小时的1分30秒触发 :'30 1 * * * *'
11 | // 每天的凌晨1点1分30秒触发 :'30 1 1 * * *'
12 | // 每月的1日1点1分30秒触发 :'30 1 1 1 * *'
13 | // 2016年的1月1日1点1分30秒触发 :'30 1 1 1 2016 *'
14 | // 每周1的1点1分30秒触发 :'30 1 1 * * 1'
15 | const globalScheduleJobs = () => {
16 | node_schedule_1.default.scheduleJob({ second: 1, minute: 0, hour: 0 }, (date) => {
17 | // 这里执行相关逻辑
18 | (0, scheduleCarmi_1.default)();
19 | });
20 | node_schedule_1.default.scheduleJob({ second: 0, minute: 0, hour: 1 }, (date) => {
21 | // 这里执行相关逻辑
22 | (0, scheduleToken_1.default)();
23 | });
24 | };
25 | exports.globalScheduleJobs = globalScheduleJobs;
26 | exports.default = {
27 | // 发布任务
28 | schedule(executionTime, callback) {
29 | return node_schedule_1.default.scheduleJob(executionTime, (date) => {
30 | if (typeof callback === 'function') {
31 | callback(date);
32 | }
33 | });
34 | },
35 | // 重新安排任务
36 | reschedule(job, spec) {
37 | return node_schedule_1.default.rescheduleJob(job, spec);
38 | },
39 | // 取消任务
40 | cancel(job) {
41 | return node_schedule_1.default.cancelJob(job);
42 | },
43 | // 取消所有任务
44 | cancelAll() {
45 | return node_schedule_1.default.gracefulShutdown();
46 | },
47 | };
48 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/helpers/schedule/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/helpers/schedule/index.ts"],"names":[],"mappings":";;;;AAAA,0EAMuB;AACvB,4EAA4C;AAC5C,4EAA4C;AAI5C,6BAA6B;AAC7B,8BAA8B;AAC9B,iCAAiC;AACjC,iCAAiC;AACjC,yCAAyC;AACzC,gCAAgC;AAEzB,MAAM,kBAAkB,GAAG,GAAG,EAAE;IACnC,uBAAQ,CAAC,WAAW,CAChB,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAC/B,CAAC,IAAI,EAAE,EAAE;QACX,WAAW;QACX,IAAA,uBAAa,GAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,uBAAQ,CAAC,WAAW,CAClB,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAC/B,CAAC,IAAI,EAAE,EAAE;QACX,WAAW;QACX,IAAA,uBAAa,GAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAdW,QAAA,kBAAkB,sBAc7B;AAEF,kBAAe;IACX,OAAO;IACP,QAAQ,CAAC,aAAmB,EAAE,QAAqB;QACjD,OAAO,uBAAQ,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YAClD,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;gBAClC,QAAQ,CAAC,IAAI,CAAC,CAAC;aAChB;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IACD,SAAS;IACT,UAAU,CAAC,GAAiB,EAAE,IAAU;QACtC,OAAO,uBAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO;IACP,MAAM,CAAC,GAAiB;QACtB,OAAO,uBAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,SAAS;IACT,SAAS;QACP,OAAO,uBAAQ,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC;CACJ,CAAC"}
--------------------------------------------------------------------------------
/server/helpers/schedule/scheduleCarmi.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const models_1 = require("../../models");
4 | const utils_1 = require("../../utils");
5 | async function scheduleCarmi() {
6 | const time = (0, utils_1.formatTime)('yyyy-MM-dd');
7 | models_1.carmiModel.checkCarmiEndTime(time);
8 | }
9 | exports.default = scheduleCarmi;
10 | //# sourceMappingURL=scheduleCarmi.js.map
--------------------------------------------------------------------------------
/server/helpers/schedule/scheduleCarmi.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"scheduleCarmi.js","sourceRoot":"","sources":["../../../server/helpers/schedule/scheduleCarmi.ts"],"names":[],"mappings":";;AAAA,yCAA0C;AAC1C,uCAAyC;AAEzC,KAAK,UAAU,aAAa;IACxB,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,YAAY,CAAC,CAAA;IACrC,mBAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,kBAAe,aAAa,CAAC"}
--------------------------------------------------------------------------------
/server/helpers/schedule/scheduleToken.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, "__esModule", { value: true });
4 | const models_1 = require("../../models");
5 | const queue_1 = require("../queue");
6 | async function scheduleToken() {
7 | const tokens = await models_1.tokenModel.getTokens({ page: 0, page_size: 100 }, {
8 | status: 1
9 | });
10 | const list = tokens.rows;
11 | list.forEach((item) => {
12 | queue_1.checkTokenQueue.addTask({
13 | ...item.toJSON()
14 | });
15 | });
16 | }
17 | exports.default = scheduleToken;
18 | //# sourceMappingURL=scheduleToken.js.map
--------------------------------------------------------------------------------
/server/helpers/schedule/scheduleToken.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"scheduleToken.js","sourceRoot":"","sources":["../../../server/helpers/schedule/scheduleToken.ts"],"names":[],"mappings":";;AAAA,yCAA0C;AAC1C,oCAA2C;AAE3C,KAAK,UAAU,aAAa;IACxB,MAAM,MAAM,GAAG,MAAM,mBAAU,CAAC,SAAS,CAAC,EAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAC,EAAE;QACjE,MAAM,EAAE,CAAC;KACZ,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAC,EAAE;QACjB,uBAAe,CAAC,OAAO,CAAC;YACpB,GAAG,IAAI,CAAC,MAAM,EAAE;SACnB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AAED,kBAAe,aAAa,CAAC"}
--------------------------------------------------------------------------------
/server/helpers/yipay/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
3 | Object.defineProperty(exports, "__esModule", { value: true });
4 | const tslib_1 = require("tslib");
5 | const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
6 | const querystring_1 = tslib_1.__importDefault(require("querystring"));
7 | const utils_1 = require("../../utils");
8 | async function precreate(base, config, options) {
9 | const data = (0, utils_1.filterObjectNull)({
10 | device: 'pc',
11 | ...config,
12 | ...options
13 | });
14 | console.log(data);
15 | const sortedData = (0, utils_1.ksort)(data);
16 | const query = (0, utils_1.buildQueryString)(sortedData);
17 | const sign = (0, utils_1.generateMd5)(query + base.key);
18 | const formBody = querystring_1.default.stringify({
19 | sign,
20 | sign_type: 'MD5',
21 | ...data
22 | });
23 | const api = base.api + '/mapi.php';
24 | const response = await (0, node_fetch_1.default)(api, {
25 | method: 'POST',
26 | headers: {
27 | 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
28 | },
29 | body: formBody
30 | });
31 | const json = await response.json();
32 | console.log('支付结构', json);
33 | return {
34 | code: json.code === 1 ? 0 : json.code,
35 | pay_url: json.payurl || json.qrcode || json.urlscheme
36 | };
37 | }
38 | async function checkNotifySign(params, key) {
39 | const sign = params.sign;
40 | const data = (0, utils_1.filterObjectNull)({
41 | ...params,
42 | channel: null,
43 | sign: null,
44 | sign_type: null
45 | });
46 | const sortedData = (0, utils_1.ksort)(data);
47 | const query = (0, utils_1.buildQueryString)(sortedData);
48 | const newSign = (0, utils_1.generateMd5)(query + key);
49 | return sign === newSign;
50 | }
51 | exports.default = {
52 | precreate,
53 | checkNotifySign
54 | };
55 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/helpers/yipay/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/helpers/yipay/index.ts"],"names":[],"mappings":";;;AAAA,oEAA8B;AAC9B,sEAAqC;AACrC,uCAAoF;AAOpF,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,MAAM,EAAE,OAAO;IAClD,MAAM,IAAI,GAAG,IAAA,wBAAgB,EAAC;QAC5B,MAAM,EAAE,IAAI;QACZ,GAAG,MAAM;QACT,GAAG,OAAO;KACX,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjB,MAAM,UAAU,GAAG,IAAA,aAAK,EAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAA,wBAAgB,EAAC,UAAU,CAAC,CAAA;IAC1C,MAAM,IAAI,GAAG,IAAA,mBAAW,EAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,qBAAW,CAAC,SAAS,CAAC;QACrC,IAAI;QACJ,SAAS,EAAE,KAAK;QAChB,GAAG,IAAI;KACR,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,WAAW,CAAA;IAClC,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kDAAkD;SACnE;QACD,IAAI,EAAE,QAAQ;KACf,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAC,IAAI,CAAC,CAAA;IACxB,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;QACrC,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS;KACtD,CAAA;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAM,EAAE,GAAG;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,MAAM,IAAI,GAAG,IAAA,wBAAgB,EAAC;QAC5B,GAAG,MAAM;QACT,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IACF,MAAM,UAAU,GAAG,IAAA,aAAK,EAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAA,wBAAgB,EAAC,UAAU,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,KAAK,GAAG,GAAG,CAAC,CAAA;IACxC,OAAO,IAAI,KAAK,OAAO,CAAA;AACzB,CAAC;AAED,kBAAe;IACb,SAAS;IACT,eAAe;CAChB,CAAA"}
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | Object.defineProperty(exports, '__esModule', { value: true });
3 | const tslib_1 = require('tslib');
4 | const express_1 = tslib_1.__importDefault(require('express'));
5 | require('express-async-errors');
6 | // const path_1 = tslib_1.__importDefault(require('path'));
7 | const cors_1 = tslib_1.__importDefault(require('cors'));
8 | const routers_1 = tslib_1.__importDefault(require('./routers'));
9 | const db_1 = tslib_1.__importDefault(require('./models/db'));
10 | const config_1 = tslib_1.__importDefault(require('./config'));
11 | const verify_1 = tslib_1.__importDefault(require('./middlewares/verify'));
12 | const schedule_1 = require('./helpers/schedule');
13 | const catch_error_1 = tslib_1.__importDefault(require('./middlewares/catch_error'));
14 | const app = (0, express_1.default)();
15 | // 错误处理
16 | app.use(catch_error_1.default);
17 | app.use((0, cors_1.default)());
18 | // 校验Token
19 | app.use(verify_1.default);
20 | // 链接mysql
21 | (0, db_1.default)();
22 | // 获取静态目录
23 | // app.use(express_1.default.static(path_1.default.join(__dirname, '../dist')))
24 | app.use(express_1.default.json());
25 | app.use(express_1.default.urlencoded({ extended: false }));
26 | // 初始化路由
27 | (0, routers_1.default)(app);
28 | // 系统级别的定时任务
29 | (0, schedule_1.globalScheduleJobs)();
30 | app.all('/api/*', (req, res) => {
31 | res.status(404).json({ code: -1, data: [], message: 'The current access API address does not exist' });
32 | });
33 | // 渲染页面
34 | // app.get('*', (req, res) => {
35 | // res.sendFile(path_1.default.join(__dirname, '../dist', 'index.html'))
36 | // })
37 | // 错误处理
38 | app.use(catch_error_1.default);
39 | // 启动服务器
40 | app.listen(config_1.default.getConfig('port'), () => {
41 | console.log(`Server is running on port ${config_1.default.getConfig('port')}`);
42 | });
43 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,0BAA0B;AAC1B,wDAAuB;AACvB,gEAA+B;AAC/B,6DAAgC;AAChC,8DAA6B;AAC7B,0EAAyC;AACzC,iDAAuD;AACvD,oFAAkD;AAElD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAA;AAErB,OAAO;AACP,GAAG,CAAC,GAAG,CAAC,qBAAU,CAAC,CAAA;AAEnB,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAA;AAEf,UAAU;AACV,GAAG,CAAC,GAAG,CAAC,gBAAM,CAAC,CAAA;AAEf,UAAU;AACV,IAAA,YAAM,GAAE,CAAA;AAER,SAAS;AACT,mEAAmE;AACnE,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AACvB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;AAEhD,QAAQ;AACR,IAAA,iBAAO,EAAC,GAAG,CAAC,CAAA;AAEZ,YAAY;AACZ,IAAA,6BAAkB,GAAE,CAAC;AAErB,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,+CAA+C,EAAE,CAAC,CAAA;AACxG,CAAC,CAAC,CAAA;AAEF,OAAO;AACP,+BAA+B;AAC/B,wEAAwE;AACxE,KAAK;AAEL,QAAQ;AACR,GAAG,CAAC,MAAM,CAAC,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE;IACxC,OAAO,CAAC,GAAG,CAAC,6BAA6B,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACtE,CAAC,CAAC,CAAA"}
--------------------------------------------------------------------------------
/server/middlewares/catch_error.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const utils_1 = require("../utils");
4 | const catchError = (err, req, res, next) => {
5 | console.log(`[${req.method}][${req.path}]:${err.message} [body]:${JSON.stringify(req.body)} [query]:${JSON.stringify(req.query)}`);
6 | try {
7 | const errJson = JSON.parse(err.message);
8 | res.status(500).json(errJson);
9 | }
10 | catch (e) {
11 | res.status(500).json((0, utils_1.httpBody)(5000, err.message));
12 | }
13 | next(err);
14 | };
15 | exports.default = catchError;
16 | //# sourceMappingURL=catch_error.js.map
--------------------------------------------------------------------------------
/server/middlewares/catch_error.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"catch_error.js","sourceRoot":"","sources":["../../server/middlewares/catch_error.ts"],"names":[],"mappings":";;AAAA,oCAAoC;AAEpC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC/H,IAAG;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;KAChC;IAAA,OAAM,CAAC,EAAC;QACL,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;KACpD;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC,CAAA;AAED,kBAAe,UAAU,CAAC"}
--------------------------------------------------------------------------------
/server/middlewares/verify.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const redis_1 = tslib_1.__importDefault(require("../helpers/redis"));
5 | const utils_1 = require("../utils");
6 | const verifyPath = [
7 | 'post:/api/login',
8 | 'get:/api/send_sms',
9 | 'get:/api/pay/notify',
10 | 'post:/api/pay/notify',
11 | 'get:/api/config',
12 | ];
13 | // 校验
14 | async function verify(req, res, next) {
15 | const { token } = req.headers;
16 | const { path, method } = req;
17 | const filter = verifyPath.filter((router) => router.toUpperCase() === `${method}:${path}`.toUpperCase());
18 | if (filter.length || path.indexOf('/api') === -1) {
19 | await next();
20 | return;
21 | }
22 | const redisTokenKey = `token:${token}`;
23 | let tokenInfo = (await redis_1.default.select(1).get(redisTokenKey)) || null;
24 | if (tokenInfo) {
25 | // 当前为前端用户登陆
26 | try {
27 | tokenInfo = JSON.parse(tokenInfo);
28 | }
29 | catch (e) {
30 | redis_1.default.select(1).del(redisTokenKey);
31 | res.status(401).json((0, utils_1.httpBody)(-1, 'token失效'));
32 | return;
33 | }
34 | }
35 | else {
36 | res.status(401).json((0, utils_1.httpBody)(-1, '请登陆'));
37 | return;
38 | }
39 | // 在加一层是否访问的后端接口
40 | if (path.indexOf('/api/admin') !== -1 && tokenInfo?.role !== 'administrator') {
41 | res.status(403).json((0, utils_1.httpBody)(-1, '拒绝访问'));
42 | return;
43 | }
44 | req.user_id = tokenInfo?.id;
45 | next();
46 | }
47 | exports.default = verify;
48 | //# sourceMappingURL=verify.js.map
--------------------------------------------------------------------------------
/server/middlewares/verify.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../server/middlewares/verify.ts"],"names":[],"mappings":";;;AACA,qEAAoC;AACpC,oCAAmC;AAGnC,MAAM,UAAU,GAAG;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,qBAAqB;IACrB,sBAAsB;IACtB,iBAAiB;CAClB,CAAA;AAED,KAAK;AACL,KAAK,UAAU,MAAM,CAAC,GAAmB,EAAE,GAAa,EAAE,IAAkB;IAC1E,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,OAAO,CAAA;IAC7B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAC9B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CACvE,CAAA;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;QAChD,MAAM,IAAI,EAAE,CAAA;QACZ,OAAM;KACP;IAED,MAAM,aAAa,GAAG,SAAS,KAAK,EAAE,CAAA;IACtC,IAAI,SAAS,GAAQ,CAAC,MAAM,eAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,CAAA;IACvE,IAAI,SAAS,EAAE;QACb,YAAY;QACZ,IAAI;YACF,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;SAClC;QAAC,OAAO,CAAC,EAAE;YACV,eAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;YAC7C,OAAM;SACP;KACF;SAAM;QACL,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QACzC,OAAM;KACP;IAED,gBAAgB;IAChB,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,EAAE,IAAI,KAAK,eAAe,EAAE;QAC5E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;QAC1C,OAAM;KACP;IAED,GAAG,CAAC,OAAO,GAAG,SAAS,EAAE,EAAE,CAAA;IAC3B,IAAI,EAAE,CAAA;AACR,CAAC;AACD,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/models/action/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const mysql_1 = tslib_1.__importDefault(require("../user/mysql"));
5 | const mysql_2 = tslib_1.__importDefault(require("./mysql"));
6 | async function addAction(data) {
7 | const create = await mysql_2.default.create(data);
8 | return create;
9 | }
10 | async function getActions({ page, page_size }, where) {
11 | mysql_2.default.belongsTo(mysql_1.default, { foreignKey: 'user_id', targetKey: 'id' });
12 | const find = await mysql_2.default.findAndCountAll({
13 | where,
14 | include: [
15 | {
16 | model: mysql_1.default,
17 | required: false,
18 | }
19 | ],
20 | order: [['create_time', 'DESC']],
21 | offset: page * page_size,
22 | limit: page_size
23 | });
24 | return find;
25 | }
26 | exports.default = {
27 | addAction,
28 | getActions
29 | };
30 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/action/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/action/index.ts"],"names":[],"mappings":";;;AACA,kEAAsC;AACtC,4DAAiC;AAEjC,KAAK,UAAU,SAAS,CAAC,IAA0B;IACjD,MAAM,MAAM,GAAG,MAAM,eAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7C,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAA8B;IAC3E,eAAW,CAAC,SAAS,CAAC,eAAS,EAAE,EAAE,UAAU,EAAC,SAAS,EAAE,SAAS,EAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,eAAW,CAAC,eAAe,CAAC;QAC7C,KAAK;QACL,OAAO,EAAC;YACN;gBACE,KAAK,EAAE,eAAS;gBAChB,QAAQ,EAAC,KAAK;aACf;SACF;QACD,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kBAAe;IACb,SAAS;IACT,UAAU;CACX,CAAA"}
--------------------------------------------------------------------------------
/server/models/action/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.actionMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.actionMysql = db_1.sequelizeExample.define('action', {
7 | user_id: {
8 | type: sequelize_1.DataTypes.NUMBER
9 | },
10 | type: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | describe: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | ip: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | create_time: {
20 | type: sequelize_1.DataTypes.STRING
21 | },
22 | update_time: {
23 | type: sequelize_1.DataTypes.STRING
24 | }
25 | }, {
26 | timestamps: false,
27 | freezeTableName: true
28 | });
29 | exports.default = exports.actionMysql;
30 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/action/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/action/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,WAAW,GAAG,qBAAgB,CAAC,MAAM,CAChD,QAAQ,EACR;IACE,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,EAAE,EAAE;QACF,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,mBAAW,CAAA"}
--------------------------------------------------------------------------------
/server/models/carmi/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const db_1 = require("../db");
5 | const mysql_1 = tslib_1.__importDefault(require("./mysql"));
6 | const mysql_2 = tslib_1.__importDefault(require("../user/mysql"));
7 | async function getCarmiInfo(where) {
8 | const find = await mysql_1.default.findOne({
9 | where
10 | });
11 | return find;
12 | }
13 | async function updateCarmiInfo(data, where) {
14 | const update = await mysql_1.default.update(data, {
15 | where: {
16 | ...where
17 | }
18 | });
19 | return update;
20 | }
21 | // 获取卡密列表
22 | async function getCarmis({ page, page_size }, where) {
23 | mysql_1.default.belongsTo(mysql_2.default, { foreignKey: 'user_id', targetKey: 'id' });
24 | const find = await mysql_1.default.findAndCountAll({
25 | where,
26 | include: [
27 | {
28 | model: mysql_2.default,
29 | required: false,
30 | }
31 | ],
32 | order: [['create_time', 'DESC']],
33 | offset: page * page_size,
34 | limit: page_size
35 | });
36 | return find;
37 | }
38 | async function delCarmi(id) {
39 | const del = await mysql_1.default.destroy({
40 | where: {
41 | id
42 | }
43 | });
44 | return del;
45 | }
46 | async function addCarmis(datas) {
47 | const captains = await mysql_1.default.bulkCreate([...datas]);
48 | return captains;
49 | }
50 | // 清理过期的卡密
51 | async function checkCarmiEndTime(time) {
52 | const captains = await mysql_1.default.update({
53 | status: 2
54 | }, {
55 | where: {
56 | end_time: {
57 | [db_1.sequelize.Op.lt]: time,
58 | [db_1.sequelize.Op.ne]: ''
59 | },
60 | status: 0
61 | }
62 | });
63 | return captains;
64 | }
65 | exports.default = {
66 | getCarmiInfo,
67 | updateCarmiInfo,
68 | getCarmis,
69 | delCarmi,
70 | addCarmis,
71 | checkCarmiEndTime
72 | };
73 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/carmi/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/carmi/index.ts"],"names":[],"mappings":";;;AAAA,8BAAiC;AACjC,4DAAgC;AAChC,kEAAsC;AAEtC,KAAK,UAAU,YAAY,CAAC,KAA8B;IACxD,MAAM,IAAI,GAAG,MAAM,eAAU,CAAC,OAAO,CAAC;QACpC,KAAK;KACN,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAA4B,EAAE,KAA8B;IACzF,MAAM,MAAM,GAAG,MAAM,eAAU,CAAC,MAAM,CAAC,IAAI,EAAE;QAC3C,KAAK,EAAE;YACL,GAAG,KAAK;SACT;KACF,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS;AACT,KAAK,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAA8B;IAC1E,eAAU,CAAC,SAAS,CAAC,eAAS,EAAE,EAAE,UAAU,EAAC,SAAS,EAAE,SAAS,EAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,MAAM,eAAU,CAAC,eAAe,CAAC;QAC5C,KAAK;QACL,OAAO,EAAC;YACN;gBACE,KAAK,EAAE,eAAS;gBAChB,QAAQ,EAAC,KAAK;aACf;SACF;QACD,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,EAAE;IACxB,MAAM,GAAG,GAAG,MAAM,eAAU,CAAC,OAAO,CAAC;QACnC,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAA8C;IACrE,MAAM,QAAQ,GAAG,MAAM,eAAU,CAAC,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;IACxD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,UAAU;AACV,KAAK,UAAU,iBAAiB,CAAE,IAAY;IAC5C,MAAM,QAAQ,GAAG,MAAM,eAAU,CAAC,MAAM,CAAC;QACvC,MAAM,EAAE,CAAC;KACV,EAAC;QACA,KAAK,EAAE;YACL,QAAQ,EAAE;gBACR,CAAC,cAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI;gBACvB,CAAC,cAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;aACtB;YACD,MAAM,EAAE,CAAC;SACV;KACF,CAAC,CAAA;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kBAAe;IACb,YAAY;IACZ,eAAe;IACf,SAAS;IACT,QAAQ;IACR,SAAS;IACT,iBAAiB;CAClB,CAAA"}
--------------------------------------------------------------------------------
/server/models/carmi/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.carmiMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.carmiMysql = db_1.sequelizeExample.define('carmi', {
7 | user_id: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | ip: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | key: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | value: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | type: {
20 | type: sequelize_1.DataTypes.STRING
21 | },
22 | level: {
23 | type: sequelize_1.DataTypes.NUMBER
24 | },
25 | end_time: {
26 | type: sequelize_1.DataTypes.STRING
27 | },
28 | status: {
29 | type: sequelize_1.DataTypes.NUMBER
30 | },
31 | create_time: {
32 | type: sequelize_1.DataTypes.STRING
33 | },
34 | update_time: {
35 | type: sequelize_1.DataTypes.STRING
36 | }
37 | }, {
38 | timestamps: false,
39 | freezeTableName: true
40 | });
41 | exports.default = exports.carmiMysql;
42 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/carmi/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/carmi/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,UAAU,GAAG,qBAAgB,CAAC,MAAM,CAC/C,OAAO,EACP;IACE,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,EAAE,EAAE;QACF,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,kBAAU,CAAA"}
--------------------------------------------------------------------------------
/server/models/config/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const db_1 = require("../db");
5 | const mysql_1 = tslib_1.__importDefault(require("./mysql"));
6 | async function getConfig(key) {
7 | const findAll = await mysql_1.default.findAll();
8 | if (key && findAll && findAll.length > 0) {
9 | let value = null;
10 | for (const item of findAll) {
11 | const json = await item.toJSON();
12 | if (json.name === key) {
13 | value = json.value;
14 | }
15 | }
16 | return value;
17 | }
18 | return findAll;
19 | }
20 | async function editConfigs(updatedData) {
21 | return db_1.sequelizeExample.transaction(async (t) => {
22 | for (const data of updatedData) {
23 | await mysql_1.default.update({ value: data.value }, { where: { id: data.id, name: data.name }, transaction: t });
24 | }
25 | }).then((res) => {
26 | return { code: 0, data: res };
27 | }).catch(error => {
28 | return { code: -1, error };
29 | });
30 | }
31 | exports.default = {
32 | getConfig,
33 | editConfigs
34 | };
35 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/config/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/config/index.ts"],"names":[],"mappings":";;;AACA,8BAAwC;AACxC,4DAAiC;AAEjC,KAAK,UAAU,SAAS,CAAC,GAAY;IACnC,MAAM,OAAO,GAAG,MAAM,eAAW,CAAC,OAAO,EAAE,CAAA;IAC3C,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QACxC,IAAI,KAAK,GAAG,IAAI,CAAA;QAChB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;YAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;YAChC,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE;gBACrB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;aACnB;SACF;QACD,OAAO,KAAK,CAAA;KACb;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,WAA0C;IACnE,OAAO,qBAAgB,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;YAC9B,MAAM,eAAW,CAAC,MAAM,CACtB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EACrB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAC5D,CAAC;SACH;IACH,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACf,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kBAAe;IACb,SAAS;IACT,WAAW;CACZ,CAAA"}
--------------------------------------------------------------------------------
/server/models/config/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.configMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.configMysql = db_1.sequelizeExample.define('config', {
7 | name: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | value: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | remarks: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | create_time: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | update_time: {
20 | type: sequelize_1.DataTypes.STRING
21 | }
22 | }, {
23 | timestamps: false,
24 | freezeTableName: true
25 | });
26 | exports.default = exports.configMysql;
27 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/config/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/config/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,WAAW,GAAG,qBAAgB,CAAC,MAAM,CAChD,QAAQ,EACR;IACE,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,mBAAW,CAAA"}
--------------------------------------------------------------------------------
/server/models/db.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.sequelizeExample = exports.sequelize = void 0;
4 | const tslib_1 = require("tslib");
5 | const sequelize_1 = tslib_1.__importStar(require("sequelize"));
6 | exports.sequelize = sequelize_1.default;
7 | const config_1 = tslib_1.__importDefault(require("../config"));
8 | const sequelizeExample = new sequelize_1.Sequelize({
9 | ...config_1.default.getConfig('mysql_config'),
10 | logging: (sql, timing) => {
11 | console.log(sql);
12 | }
13 | });
14 | exports.sequelizeExample = sequelizeExample;
15 | const initMysql = async () => {
16 | try {
17 | await sequelizeExample.authenticate();
18 | console.log('MySQL database connection succeeded.');
19 | }
20 | catch (error) {
21 | console.log(`MySQL database link error: ${error}`);
22 | }
23 | return sequelizeExample;
24 | };
25 | const initDB = async () => {
26 | await initMysql();
27 | };
28 | exports.default = initDB;
29 | //# sourceMappingURL=db.js.map
--------------------------------------------------------------------------------
/server/models/db.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"db.js","sourceRoot":"","sources":["../../server/models/db.ts"],"names":[],"mappings":";;;;AAAA,+DAAgD;AAyBvC,oBAzBF,mBAAS,CAyBE;AAxBlB,+DAA8B;AAE9B,MAAM,gBAAgB,GAAG,IAAI,qBAAS,CAAC;IACrC,GAAG,gBAAM,CAAC,SAAS,CAAC,cAAc,CAAC;IACnC,OAAO,EAAE,CAAC,GAAW,EAAE,MAAe,EAAE,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;CACF,CAAC,CAAA;AAiBkB,4CAAgB;AAfpC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;IAC3B,IAAI;QACF,MAAM,gBAAgB,CAAC,YAAY,EAAE,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;KACpD;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAA;KACnD;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;IACxB,MAAM,SAAS,EAAE,CAAA;AACnB,CAAC,CAAA;AAGD,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/models/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.notificationModel = exports.actionModel = exports.orderModel = exports.paymentModel = exports.configModel = exports.tokenModel = exports.messageModel = exports.signinModel = exports.turnoverModel = exports.carmiModel = exports.productModel = exports.userModel = void 0;
4 | const tslib_1 = require("tslib");
5 | const user_1 = tslib_1.__importDefault(require("./user"));
6 | exports.userModel = user_1.default;
7 | const product_1 = tslib_1.__importDefault(require("./product"));
8 | exports.productModel = product_1.default;
9 | const carmi_1 = tslib_1.__importDefault(require("./carmi"));
10 | exports.carmiModel = carmi_1.default;
11 | const turnover_1 = tslib_1.__importDefault(require("./turnover"));
12 | exports.turnoverModel = turnover_1.default;
13 | const signin_1 = tslib_1.__importDefault(require("./signin"));
14 | exports.signinModel = signin_1.default;
15 | const message_1 = tslib_1.__importDefault(require("./message"));
16 | exports.messageModel = message_1.default;
17 | const token_1 = tslib_1.__importDefault(require("./token"));
18 | exports.tokenModel = token_1.default;
19 | const config_1 = tslib_1.__importDefault(require("./config"));
20 | exports.configModel = config_1.default;
21 | const payment_1 = tslib_1.__importDefault(require("./payment"));
22 | exports.paymentModel = payment_1.default;
23 | const order_1 = tslib_1.__importDefault(require("./order"));
24 | exports.orderModel = order_1.default;
25 | const action_1 = tslib_1.__importDefault(require("./action"));
26 | exports.actionModel = action_1.default;
27 | const notification_1 = tslib_1.__importDefault(require("./notification"));
28 | exports.notificationModel = notification_1.default;
29 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/models/index.ts"],"names":[],"mappings":";;;;AAAA,0DAA8B;AAa5B,oBAbK,cAAS,CAaL;AAZX,gEAAoC;AAalC,uBAbK,iBAAY,CAaL;AAZd,4DAAgC;AAa9B,qBAbK,eAAU,CAaL;AAZZ,kEAAsC;AAapC,wBAbK,kBAAa,CAaL;AAZf,8DAAkC;AAahC,sBAbK,gBAAW,CAaL;AAZb,gEAAoC;AAalC,uBAbK,iBAAY,CAaL;AAZd,4DAAgC;AAa9B,qBAbK,eAAU,CAaL;AAZZ,8DAAkC;AAahC,sBAbK,gBAAW,CAaL;AAZb,gEAAoC;AAalC,uBAbK,iBAAY,CAaL;AAZd,4DAAgC;AAa9B,qBAbK,eAAU,CAaL;AAZZ,8DAAkC;AAahC,sBAbK,gBAAW,CAaL;AAZb,0EAA8C;AAa5C,4BAbK,sBAAiB,CAaL"}
--------------------------------------------------------------------------------
/server/models/message/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const mysql_1 = tslib_1.__importDefault(require("../user/mysql"));
5 | const mysql_2 = tslib_1.__importDefault(require("./mysql"));
6 | async function addMessages(datas) {
7 | const captains = await mysql_2.default.bulkCreate([...datas]);
8 | return captains;
9 | }
10 | async function getMessages({ page, page_size }, where) {
11 | mysql_2.default.belongsTo(mysql_1.default, { foreignKey: 'user_id', targetKey: 'id' });
12 | const find = await mysql_2.default.findAndCountAll({
13 | where,
14 | include: [
15 | {
16 | model: mysql_1.default,
17 | required: false,
18 | }
19 | ],
20 | order: [['create_time', 'DESC']],
21 | offset: page * page_size,
22 | limit: page_size
23 | });
24 | return find;
25 | }
26 | exports.default = {
27 | addMessages,
28 | getMessages
29 | };
30 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/message/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/message/index.ts"],"names":[],"mappings":";;;AAAA,kEAAsC;AACtC,4DAAkC;AAElC,KAAK,UAAU,WAAW,CAAC,KAAoC;IAC7D,MAAM,QAAQ,GAAG,MAAM,eAAY,CAAC,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;IAC1D,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAA8B;IAC5E,eAAY,CAAC,SAAS,CAAC,eAAS,EAAE,EAAE,UAAU,EAAC,SAAS,EAAE,SAAS,EAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,eAAe,CAAC;QAC9C,KAAK;QACL,OAAO,EAAC;YACN;gBACE,KAAK,EAAE,eAAS;gBAChB,QAAQ,EAAC,KAAK;aACf;SACF;QACD,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAGD,kBAAe;IACb,WAAW;IACX,WAAW;CACZ,CAAA"}
--------------------------------------------------------------------------------
/server/models/message/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.messageMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.messageMysql = db_1.sequelizeExample.define('message', {
7 | content: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | user_id: {
11 | type: sequelize_1.DataTypes.NUMBER
12 | },
13 | role: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | frequency_penalty: {
17 | type: sequelize_1.DataTypes.NUMBER
18 | },
19 | max_tokens: {
20 | type: sequelize_1.DataTypes.NUMBER
21 | },
22 | model: {
23 | type: sequelize_1.DataTypes.STRING
24 | },
25 | presence_penalty: {
26 | type: sequelize_1.DataTypes.NUMBER
27 | },
28 | temperature: {
29 | type: sequelize_1.DataTypes.NUMBER
30 | },
31 | parent_message_id: {
32 | type: sequelize_1.DataTypes.STRING
33 | },
34 | status: {
35 | type: sequelize_1.DataTypes.NUMBER
36 | },
37 | create_time: {
38 | type: sequelize_1.DataTypes.STRING
39 | },
40 | update_time: {
41 | type: sequelize_1.DataTypes.STRING
42 | }
43 | }, {
44 | timestamps: false,
45 | freezeTableName: true
46 | });
47 | exports.default = exports.messageMysql;
48 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/message/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/message/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,YAAY,GAAG,qBAAgB,CAAC,MAAM,CACjD,SAAS,EACT;IACE,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,oBAAY,CAAA"}
--------------------------------------------------------------------------------
/server/models/notification/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const mysql_1 = tslib_1.__importDefault(require("./mysql"));
5 | async function getNotification({ page, page_size }, where) {
6 | const finds = await mysql_1.default.findAndCountAll({
7 | where,
8 | order: [['create_time', 'DESC']],
9 | offset: page * page_size,
10 | limit: page_size
11 | });
12 | return finds;
13 | }
14 | async function delNotification(id) {
15 | const del = await mysql_1.default.destroy({
16 | where: {
17 | id
18 | }
19 | });
20 | return del;
21 | }
22 | async function addNotification(data) {
23 | const add = await mysql_1.default.create(data);
24 | return add;
25 | }
26 | async function editNotification(id, data) {
27 | const edit = await mysql_1.default.update(data, {
28 | where: {
29 | id
30 | }
31 | });
32 | return edit;
33 | }
34 | exports.default = {
35 | getNotification,
36 | delNotification,
37 | addNotification,
38 | editNotification
39 | };
40 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/notification/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/notification/index.ts"],"names":[],"mappings":";;;AACA,4DAAuC;AAEvC,KAAK,UAAU,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAU,EAAE,KAA8B;IACxF,MAAM,KAAK,GAAG,MAAM,eAAiB,CAAC,eAAe,CAAC;QACpD,KAAK;QACL,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,EAAE;IAC/B,MAAM,GAAG,GAAG,MAAM,eAAiB,CAAC,OAAO,CAAC;QAC1C,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAA4B;IACzD,MAAM,GAAG,GAAG,MAAM,eAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAChD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,EAAmB,EAAE,IAA4B;IAC/E,MAAM,IAAI,GAAG,MAAM,eAAiB,CAAC,MAAM,CAAC,IAAI,EAAE;QAChD,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kBAAe;IACb,eAAe;IACf,eAAe;IACf,eAAe;IACf,gBAAgB;CACjB,CAAA"}
--------------------------------------------------------------------------------
/server/models/notification/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.notificationMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.notificationMysql = db_1.sequelizeExample.define('notification', {
7 | title: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | content: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | sort: {
14 | type: sequelize_1.DataTypes.NUMBER
15 | },
16 | status: {
17 | type: sequelize_1.DataTypes.NUMBER
18 | },
19 | create_time: {
20 | type: sequelize_1.DataTypes.STRING
21 | },
22 | update_time: {
23 | type: sequelize_1.DataTypes.STRING
24 | }
25 | }, {
26 | timestamps: false,
27 | freezeTableName: true
28 | });
29 | exports.default = exports.notificationMysql;
30 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/notification/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/notification/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,iBAAiB,GAAG,qBAAgB,CAAC,MAAM,CACtD,cAAc,EACd;IACE,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,yBAAiB,CAAA"}
--------------------------------------------------------------------------------
/server/models/order/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const mysql_1 = tslib_1.__importDefault(require("../user/mysql"));
5 | const mysql_2 = tslib_1.__importDefault(require("./mysql"));
6 | async function getOrders({ page, page_size }, where) {
7 | mysql_2.default.belongsTo(mysql_1.default, { foreignKey: 'user_id', targetKey: 'id' });
8 | const finds = await mysql_2.default.findAndCountAll({
9 | where,
10 | include: [
11 | {
12 | model: mysql_1.default,
13 | required: false,
14 | }
15 | ],
16 | order: [['create_time', 'DESC']],
17 | offset: page * page_size,
18 | limit: page_size
19 | });
20 | return finds;
21 | }
22 | async function getOrderInfo(id) {
23 | const find = await mysql_2.default.findByPk(id);
24 | if (!find)
25 | return null;
26 | return find.toJSON();
27 | }
28 | async function delOrder(id) {
29 | const del = await mysql_2.default.destroy({
30 | where: {
31 | id
32 | }
33 | });
34 | return del;
35 | }
36 | async function addOrder(data) {
37 | const add = await mysql_2.default.create(data);
38 | return add;
39 | }
40 | async function editOrder(data) {
41 | const edit = await mysql_2.default.upsert(data);
42 | return edit;
43 | }
44 | exports.default = {
45 | getOrders,
46 | delOrder,
47 | addOrder,
48 | editOrder,
49 | getOrderInfo
50 | };
51 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/order/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/order/index.ts"],"names":[],"mappings":";;;AACA,kEAAsC;AACtC,4DAAgC;AAEhC,KAAK,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAU,EAAE,KAA8B;IAClF,eAAU,CAAC,SAAS,CAAC,eAAS,EAAE,EAAE,UAAU,EAAC,SAAS,EAAE,SAAS,EAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,MAAM,eAAU,CAAC,eAAe,CAAC;QAC7C,KAAK;QACL,OAAO,EAAC;YACN;gBACE,KAAK,EAAE,eAAS;gBAChB,QAAQ,EAAC,KAAK;aACf;SACF;QACD,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,EAAE;IAC5B,MAAM,IAAI,GAAG,MAAM,eAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,EAAE;IACxB,MAAM,GAAG,GAAG,MAAM,eAAU,CAAC,OAAO,CAAC;QACnC,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAA4B;IAClD,MAAM,GAAG,GAAG,MAAM,eAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACzC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAA4B;IACnD,MAAM,IAAI,GAAG,MAAM,eAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kBAAe;IACb,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,YAAY;CACb,CAAA"}
--------------------------------------------------------------------------------
/server/models/order/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.orderMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.orderMysql = db_1.sequelizeExample.define('order', {
7 | trade_no: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | pay_type: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | product_id: {
14 | type: sequelize_1.DataTypes.NUMBER
15 | },
16 | product_title: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | trade_status: {
20 | type: sequelize_1.DataTypes.STRING
21 | },
22 | user_id: {
23 | type: sequelize_1.DataTypes.NUMBER
24 | },
25 | product_info: {
26 | type: sequelize_1.DataTypes.STRING
27 | },
28 | channel: {
29 | type: sequelize_1.DataTypes.STRING
30 | },
31 | params: {
32 | type: sequelize_1.DataTypes.STRING
33 | },
34 | payment_id: {
35 | type: sequelize_1.DataTypes.NUMBER
36 | },
37 | payment_info: {
38 | type: sequelize_1.DataTypes.STRING
39 | },
40 | money: {
41 | type: sequelize_1.DataTypes.NUMBER
42 | },
43 | notify_info: {
44 | type: sequelize_1.DataTypes.STRING
45 | },
46 | pay_url: {
47 | type: sequelize_1.DataTypes.STRING
48 | },
49 | ip: {
50 | type: sequelize_1.DataTypes.STRING
51 | },
52 | create_time: {
53 | type: sequelize_1.DataTypes.STRING
54 | },
55 | update_time: {
56 | type: sequelize_1.DataTypes.STRING
57 | }
58 | }, {
59 | timestamps: false,
60 | freezeTableName: true
61 | });
62 | exports.default = exports.orderMysql;
63 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/order/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/order/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,UAAU,GAAG,qBAAgB,CAAC,MAAM,CAC/C,OAAO,EACP;IACE,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,aAAa,EAAE;QACb,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,EAAE,EAAE;QACF,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,kBAAU,CAAA"}
--------------------------------------------------------------------------------
/server/models/payment/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/payment/index.ts"],"names":[],"mappings":";;;AACA,8BAAiC;AACjC,4DAAkC;AAElC,KAAK,UAAU,aAAa,CAAC,IAAI;IAC/B,MAAM,IAAI,GAAG,MAAM,eAAY;SAC5B,OAAO,CAAC;QACP,KAAK,EAAE;YACL,MAAM,EAAE,CAAC;YACT,CAAC,cAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;gBACjB,EAAE,KAAK,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE;gBAC/C,EAAE,KAAK,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE;gBAC/C,EAAE,KAAK,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,EAAE,EAAE;gBACjD,EAAE,KAAK,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,qBAAqB;aAC7D;SACF;QACD,KAAK,EAAE,cAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;KACnC,CAAC;SACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAU,EAAE,KAA8B;IACpF,MAAM,KAAK,GAAG,MAAM,eAAY,CAAC,eAAe,CAAC;QAC/C,KAAK;QACL,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAE;IAC1B,MAAM,GAAG,GAAG,MAAM,eAAY,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAA4B;IACpD,MAAM,GAAG,GAAG,MAAM,eAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3C,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAA4B;IACrD,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,EAAE;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,MAAM,eAAY,CAAC,OAAO,CAAC;QAC3C,KAAK,EAAE;YACN,MAAM,EAAE,CAAC;SACT;KACD,CAAC,CAAA;IAEF,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACnC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;KACjC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;AACnC,CAAC;AAED,kBAAe;IACb,aAAa;IACb,WAAW;IACX,UAAU;IACV,UAAU;IACV,WAAW;IACX,cAAc;IACd,eAAe;CAChB,CAAA"}
--------------------------------------------------------------------------------
/server/models/payment/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.paymentMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.paymentMysql = db_1.sequelizeExample.define('payment', {
7 | name: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | channel: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | types: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | params: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | status: {
20 | type: sequelize_1.DataTypes.NUMBER
21 | },
22 | create_time: {
23 | type: sequelize_1.DataTypes.STRING
24 | },
25 | update_time: {
26 | type: sequelize_1.DataTypes.STRING
27 | }
28 | }, {
29 | timestamps: false,
30 | freezeTableName: true
31 | });
32 | exports.default = exports.paymentMysql;
33 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/payment/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/payment/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,YAAY,GAAG,qBAAgB,CAAC,MAAM,CACjD,SAAS,EACT;IACE,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,oBAAY,CAAA"}
--------------------------------------------------------------------------------
/server/models/product/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const mysql_1 = tslib_1.__importDefault(require("./mysql"));
5 | async function getProducts({ page, page_size }, where) {
6 | const finds = await mysql_1.default.findAndCountAll({
7 | where,
8 | order: [['create_time', 'DESC']],
9 | offset: page * page_size,
10 | limit: page_size
11 | });
12 | return finds;
13 | }
14 | async function getProduct(id) {
15 | const find = await mysql_1.default.findByPk(id);
16 | if (!find)
17 | return null;
18 | return find.toJSON();
19 | }
20 | async function delProduct(id) {
21 | const del = await mysql_1.default.destroy({
22 | where: {
23 | id
24 | }
25 | });
26 | return del;
27 | }
28 | async function addProduct(data) {
29 | const add = await mysql_1.default.create(data);
30 | return add;
31 | }
32 | async function editProduct(data) {
33 | const edit = await mysql_1.default.upsert(data);
34 | return edit;
35 | }
36 | exports.default = {
37 | getProducts,
38 | delProduct,
39 | addProduct,
40 | editProduct,
41 | getProduct
42 | };
43 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/product/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/product/index.ts"],"names":[],"mappings":";;;AACA,4DAAkC;AAElC,KAAK,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAU,EAAE,KAA8B;IACpF,MAAM,KAAK,GAAG,MAAM,eAAY,CAAC,eAAe,CAAC;QAC/C,KAAK;QACL,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAE;IAC1B,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAE;IAC1B,MAAM,GAAG,GAAG,MAAM,eAAY,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAA4B;IACpD,MAAM,GAAG,GAAG,MAAM,eAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3C,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAA4B;IACrD,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kBAAe;IACb,WAAW;IACX,UAAU;IACV,UAAU;IACV,WAAW;IACX,UAAU;CACX,CAAA"}
--------------------------------------------------------------------------------
/server/models/product/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.productMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.productMysql = db_1.sequelizeExample.define('product', {
7 | title: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | price: {
11 | type: sequelize_1.DataTypes.NUMBER
12 | },
13 | original_price: {
14 | type: sequelize_1.DataTypes.NUMBER
15 | },
16 | value: {
17 | type: sequelize_1.DataTypes.NUMBER
18 | },
19 | badge: {
20 | type: sequelize_1.DataTypes.STRING
21 | },
22 | type: {
23 | type: sequelize_1.DataTypes.STRING
24 | },
25 | level: {
26 | type: sequelize_1.DataTypes.NUMBER
27 | },
28 | status: {
29 | type: sequelize_1.DataTypes.NUMBER
30 | },
31 | create_time: {
32 | type: sequelize_1.DataTypes.STRING
33 | },
34 | update_time: {
35 | type: sequelize_1.DataTypes.STRING
36 | }
37 | }, {
38 | timestamps: false,
39 | freezeTableName: true
40 | });
41 | exports.default = exports.productMysql;
42 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/product/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/product/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,YAAY,GAAG,qBAAgB,CAAC,MAAM,CACjD,SAAS,EACT;IACE,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,cAAc,EAAE;QACd,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACJ,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACE,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,oBAAY,CAAA"}
--------------------------------------------------------------------------------
/server/models/signin/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const db_1 = require("../db");
5 | const mysql_1 = tslib_1.__importDefault(require("../user/mysql"));
6 | const mysql_2 = tslib_1.__importDefault(require("./mysql"));
7 | async function addSignin(data) {
8 | const create = await mysql_2.default.create({
9 | ...data
10 | });
11 | return create;
12 | }
13 | async function getUserDaySignin(user_id, time) {
14 | const create = await mysql_2.default.findOne({
15 | where: {
16 | user_id,
17 | create_time: {
18 | [db_1.sequelize.Op.gte]: time
19 | }
20 | }
21 | });
22 | return create;
23 | }
24 | async function getSignins({ page, page_size }, where) {
25 | mysql_2.default.belongsTo(mysql_1.default, { foreignKey: 'user_id', targetKey: 'id' });
26 | const find = await mysql_2.default.findAndCountAll({
27 | where,
28 | include: [
29 | {
30 | model: mysql_1.default,
31 | required: false,
32 | }
33 | ],
34 | order: [['create_time', 'DESC']],
35 | offset: page * page_size,
36 | limit: page_size
37 | });
38 | return find;
39 | }
40 | async function getUserSigninList(user_id, { start_time, end_time }) {
41 | const list = await mysql_2.default.findAll({
42 | where: {
43 | user_id,
44 | status: 1,
45 | create_time: {
46 | [db_1.sequelize.Op.gte]: start_time,
47 | [db_1.sequelize.Op.lt]: end_time,
48 | }
49 | }
50 | });
51 | return list;
52 | }
53 | exports.default = {
54 | addSignin,
55 | getUserDaySignin,
56 | getSignins,
57 | getUserSigninList
58 | };
59 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/signin/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/signin/index.ts"],"names":[],"mappings":";;;AAAA,8BAAiC;AACjC,kEAAqC;AACrC,4DAAgC;AAEhC,KAAK,UAAU,SAAS,CAAC,IAA6B;IACpD,MAAM,MAAM,GAAG,MAAM,eAAU,CAAC,MAAM,CAAC;QACrC,GAAG,IAAI;KACR,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAa;IAC5D,MAAM,MAAM,GAAG,MAAM,eAAU,CAAC,OAAO,CAAC;QACtC,KAAK,EAAE;YACL,OAAO;YACP,WAAW,EAAE;gBACX,CAAC,cAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI;aACzB;SACF;KACF,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAA8B;IAC3E,eAAU,CAAC,SAAS,CAAC,eAAS,EAAE,EAAE,UAAU,EAAC,SAAS,EAAE,SAAS,EAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,MAAM,eAAU,CAAC,eAAe,CAAC;QAC5C,KAAK;QACL,OAAO,EAAC;YACN;gBACE,KAAK,EAAE,eAAS;gBAChB,QAAQ,EAAC,KAAK;aACf;SACF;QACD,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;IAChE,MAAM,IAAI,GAAG,MAAM,eAAU,CAAC,OAAO,CAAC;QACpC,KAAK,EAAE;YACL,OAAO;YACP,MAAM,EAAE,CAAC;YACT,WAAW,EAAE;gBACX,CAAC,cAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU;gBAC9B,CAAC,cAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ;aAC5B;SACF;KACF,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kBAAe;IACb,SAAS;IACT,gBAAgB;IAChB,UAAU;IACV,iBAAiB;CAClB,CAAA"}
--------------------------------------------------------------------------------
/server/models/signin/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.signinMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.signinMysql = db_1.sequelizeExample.define('signin', {
7 | user_id: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | ip: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | status: {
14 | type: sequelize_1.DataTypes.NUMBER
15 | },
16 | create_time: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | update_time: {
20 | type: sequelize_1.DataTypes.STRING
21 | }
22 | }, {
23 | timestamps: false,
24 | freezeTableName: true
25 | });
26 | exports.default = exports.signinMysql;
27 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/signin/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/signin/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,WAAW,GAAG,qBAAgB,CAAC,MAAM,CAChD,QAAQ,EACR;IACE,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,EAAE,EAAE;QACF,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,mBAAW,CAAA"}
--------------------------------------------------------------------------------
/server/models/token/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const db_1 = require("../db");
5 | const mysql_1 = tslib_1.__importDefault(require("./mysql"));
6 | async function getOneToken({ model }) {
7 | const find = await mysql_1.default
8 | .findOne({
9 | where: {
10 | status: 1,
11 | [db_1.sequelize.Op.or]: [
12 | { models: { [db_1.sequelize.Op.like]: `${model},%` } },
13 | { models: { [db_1.sequelize.Op.like]: `%,${model}` } },
14 | { models: { [db_1.sequelize.Op.like]: `%,${model},%` } },
15 | { models: { [db_1.sequelize.Op.eq]: model } }
16 | ]
17 | },
18 | order: db_1.sequelize.literal('RAND()')
19 | })
20 | .then((info) => info?.toJSON());
21 | return find;
22 | }
23 | async function getTokens({ page, page_size }, where) {
24 | const finds = await mysql_1.default.findAndCountAll({
25 | where,
26 | order: [['create_time', 'DESC']],
27 | offset: page * page_size,
28 | limit: page_size
29 | });
30 | return finds;
31 | }
32 | async function delToken(id) {
33 | const del = await mysql_1.default.destroy({
34 | where: {
35 | id
36 | }
37 | });
38 | return del;
39 | }
40 | async function addToken(data) {
41 | const add = await mysql_1.default.create(data);
42 | return add;
43 | }
44 | async function editToken(id, data) {
45 | const edit = await mysql_1.default.update(data, {
46 | where: {
47 | id
48 | }
49 | });
50 | return edit;
51 | }
52 | exports.default = {
53 | getOneToken,
54 | getTokens,
55 | delToken,
56 | addToken,
57 | editToken
58 | };
59 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/token/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/token/index.ts"],"names":[],"mappings":";;;AACA,8BAAiC;AACjC,4DAAgC;AAEhC,KAAK,UAAU,WAAW,CAAC,EAAE,KAAK,EAAqB;IACrD,MAAM,IAAI,GAAG,MAAM,eAAU;SAC1B,OAAO,CAAC;QACP,KAAK,EAAE;YACL,MAAM,EAAE,CAAC;YACT,CAAC,cAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;gBACjB,EAAE,MAAM,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,EAAE,EAAE;gBACjD,EAAE,MAAM,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE,EAAE;gBACjD,EAAE,MAAM,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,EAAE;gBACnD,EAAE,MAAM,EAAE,EAAE,CAAC,cAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;aACzC;SACF;QACD,KAAK,EAAE,cAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;KACnC,CAAC;SACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAU,EAAE,KAA8B;IAClF,MAAM,KAAK,GAAG,MAAM,eAAU,CAAC,eAAe,CAAC;QAC7C,KAAK;QACL,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,EAAE;IACxB,MAAM,GAAG,GAAG,MAAM,eAAU,CAAC,OAAO,CAAC;QACnC,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAA4B;IAClD,MAAM,GAAG,GAAG,MAAM,eAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACzC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,EAAmB,EAAE,IAA4B;IACxE,MAAM,IAAI,GAAG,MAAM,eAAU,CAAC,MAAM,CAAC,IAAI,EAAE;QACzC,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kBAAe;IACb,WAAW;IACX,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;CACV,CAAA"}
--------------------------------------------------------------------------------
/server/models/token/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.tokenMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.tokenMysql = db_1.sequelizeExample.define('token', {
7 | key: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | host: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | remarks: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | models: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | usage: {
20 | type: sequelize_1.DataTypes.NUMBER
21 | },
22 | limit: {
23 | type: sequelize_1.DataTypes.NUMBER
24 | },
25 | status: {
26 | type: sequelize_1.DataTypes.NUMBER
27 | },
28 | create_time: {
29 | type: sequelize_1.DataTypes.STRING
30 | },
31 | update_time: {
32 | type: sequelize_1.DataTypes.STRING
33 | }
34 | }, {
35 | timestamps: false,
36 | freezeTableName: true
37 | });
38 | exports.default = exports.tokenMysql;
39 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/token/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/token/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,UAAU,GAAG,qBAAgB,CAAC,MAAM,CAC/C,OAAO,EACP;IACE,GAAG,EAAE;QACH,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACJ,MAAM,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACtB;IACE,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,kBAAU,CAAA"}
--------------------------------------------------------------------------------
/server/models/turnover/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const mysql_1 = tslib_1.__importDefault(require("../user/mysql"));
5 | const mysql_2 = tslib_1.__importDefault(require("./mysql"));
6 | async function addTurnover(data) {
7 | const create = await mysql_2.default.create(data);
8 | return create;
9 | }
10 | async function getUserTurnovers({ page, page_size }, where) {
11 | const finds = await mysql_2.default.findAndCountAll({
12 | where,
13 | order: [['create_time', 'DESC']],
14 | offset: page * page_size,
15 | limit: page_size
16 | });
17 | return finds;
18 | }
19 | async function getTurnovers({ page, page_size }, where) {
20 | mysql_2.default.belongsTo(mysql_1.default, { foreignKey: 'user_id', targetKey: 'id' });
21 | const find = await mysql_2.default.findAndCountAll({
22 | where,
23 | include: [
24 | {
25 | model: mysql_1.default,
26 | required: false,
27 | }
28 | ],
29 | order: [['create_time', 'DESC']],
30 | offset: page * page_size,
31 | limit: page_size
32 | });
33 | return find;
34 | }
35 | async function delTurnover(id) {
36 | const del = await mysql_2.default.destroy({
37 | where: {
38 | id
39 | }
40 | });
41 | return del;
42 | }
43 | async function editTurnover(data) {
44 | const res = await mysql_2.default.upsert({
45 | ...data
46 | });
47 | return res;
48 | }
49 | exports.default = {
50 | addTurnover,
51 | getUserTurnovers,
52 | delTurnover,
53 | getTurnovers,
54 | editTurnover
55 | };
56 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/models/turnover/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/models/turnover/index.ts"],"names":[],"mappings":";;;AACA,kEAAsC;AACtC,4DAAmC;AAEnC,KAAK,UAAU,WAAW,CAAC,IAAwB;IACjD,MAAM,MAAM,GAAG,MAAM,eAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAA;AACf,CAAC;AACD,KAAK,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAU,EAAE,KAA8B;IACzF,MAAM,KAAK,GAAG,MAAM,eAAa,CAAC,eAAe,CAAC;QAChD,KAAK;QACL,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAA8B;IAC7E,eAAa,CAAC,SAAS,CAAC,eAAS,EAAE,EAAE,UAAU,EAAC,SAAS,EAAE,SAAS,EAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,eAAa,CAAC,eAAe,CAAC;QAC/C,KAAK;QACL,OAAO,EAAC;YACN;gBACE,KAAK,EAAE,eAAS;gBAChB,QAAQ,EAAC,KAAK;aACf;SACF;QACD,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,IAAI,GAAG,SAAS;QACxB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,EAAE;IAC3B,MAAM,GAAG,GAAG,MAAM,eAAa,CAAC,OAAO,CAAC;QACtC,KAAK,EAAE;YACL,EAAE;SACH;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAA6B;IACvD,MAAM,GAAG,GAAG,MAAM,eAAa,CAAC,MAAM,CAAC;QACrC,GAAG,IAAI;KACR,CAAC,CAAC;IACH,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,kBAAe;IACb,WAAW;IACX,gBAAgB;IAChB,WAAW;IACX,YAAY;IACZ,YAAY;CACb,CAAA"}
--------------------------------------------------------------------------------
/server/models/turnover/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.turnoverMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.turnoverMysql = db_1.sequelizeExample.define('turnover', {
7 | user_id: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | value: {
11 | type: sequelize_1.DataTypes.NUMBER
12 | },
13 | describe: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | create_time: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | update_time: {
20 | type: sequelize_1.DataTypes.STRING
21 | }
22 | }, {
23 | timestamps: false,
24 | freezeTableName: true
25 | });
26 | exports.default = exports.turnoverMysql;
27 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/turnover/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/turnover/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,aAAa,GAAG,qBAAgB,CAAC,MAAM,CAClD,UAAU,EACV;IACE,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,qBAAa,CAAA"}
--------------------------------------------------------------------------------
/server/models/user/mysql.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.userMysql = void 0;
4 | const sequelize_1 = require("sequelize");
5 | const db_1 = require("../db");
6 | exports.userMysql = db_1.sequelizeExample.define('user', {
7 | account: {
8 | type: sequelize_1.DataTypes.STRING
9 | },
10 | nickname: {
11 | type: sequelize_1.DataTypes.STRING
12 | },
13 | avatar: {
14 | type: sequelize_1.DataTypes.STRING
15 | },
16 | role: {
17 | type: sequelize_1.DataTypes.STRING
18 | },
19 | integral: {
20 | type: sequelize_1.DataTypes.NUMBER
21 | },
22 | vip_expire_time: {
23 | type: sequelize_1.DataTypes.STRING
24 | },
25 | svip_expire_time: {
26 | type: sequelize_1.DataTypes.STRING
27 | },
28 | password: {
29 | type: sequelize_1.DataTypes.STRING
30 | },
31 | ip: {
32 | type: sequelize_1.DataTypes.STRING
33 | },
34 | status: {
35 | type: sequelize_1.DataTypes.NUMBER
36 | },
37 | create_time: {
38 | type: sequelize_1.DataTypes.STRING
39 | },
40 | update_time: {
41 | type: sequelize_1.DataTypes.STRING
42 | }
43 | }, {
44 | timestamps: false,
45 | freezeTableName: true
46 | });
47 | exports.default = exports.userMysql;
48 | //# sourceMappingURL=mysql.js.map
--------------------------------------------------------------------------------
/server/models/user/mysql.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../server/models/user/mysql.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AACrC,8BAAwC;AAE3B,QAAA,SAAS,GAAG,qBAAgB,CAAC,MAAM,CAC9C,MAAM,EACN;IACE,OAAO,EAAE;QACP,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,EAAE,EAAE;QACF,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,MAAM;KACvB;CACF,EACD;IACE,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,IAAI;CACtB,CACF,CAAA;AAED,kBAAe,iBAAS,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/action.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | // 获取卡密列表
9 | router.get('/action', async function (req, res, next) {
10 | const { page, page_size } = (0, utils_1.pagingData)({
11 | page: req.query.page,
12 | page_size: req.query.page_size
13 | });
14 | const actions = await models_1.actionModel.getActions({ page, page_size });
15 | res.json((0, utils_1.httpBody)(0, actions));
16 | });
17 | exports.default = router;
18 | //# sourceMappingURL=action.js.map
--------------------------------------------------------------------------------
/server/routers/admin/action.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../server/routers/admin/action.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAkD;AAClD,yCAA0C;AAC1C,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,SAAS;AACT,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAClD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACrC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KAC/B,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,MAAM,oBAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IACjE,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/config.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/config', async function (req, res, next) {
9 | const configs = await models_1.configModel.getConfig();
10 | res.json((0, utils_1.httpBody)(0, configs));
11 | });
12 | router.put('/config', async function (req, res, next) {
13 | const { body } = req;
14 | const configs = await models_1.configModel.getConfig();
15 | if (!body || !configs || configs.length <= 0) {
16 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
17 | return;
18 | }
19 | const insert = [];
20 | for (const config of configs) {
21 | const json = config.toJSON();
22 | if (body[json.name] || body[json.name] === 0) {
23 | insert.push((0, utils_1.filterObjectNull)({
24 | ...json,
25 | value: body[json.name].toString(),
26 | create_time: null,
27 | update_time: null
28 | }));
29 | }
30 | }
31 | console.log(insert);
32 | if (insert.length < 0) {
33 | res.json((0, utils_1.httpBody)(-1, '无内容需要修改'));
34 | return;
35 | }
36 | const editRes = await models_1.configModel.editConfigs(insert);
37 | res.json((0, utils_1.httpBody)(editRes.code, '修改成功'));
38 | });
39 | exports.default = router;
40 | //# sourceMappingURL=config.js.map
--------------------------------------------------------------------------------
/server/routers/admin/config.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../server/routers/admin/config.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAwD;AACxD,yCAA0C;AAC1C,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAChD,MAAM,OAAO,GAAG,MAAM,oBAAW,CAAC,SAAS,EAAE,CAAA;IAC7C,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAChD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACrB,MAAM,OAAO,GAAG,MAAM,oBAAW,CAAC,SAAS,EAAE,CAAA;IAE7C,IAAG,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAC;QACxC,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACT;IACD,MAAM,MAAM,GAAe,EAAE,CAAA;IAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;QAC5B,IAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC;YACxC,MAAM,CAAC,IAAI,CAAC,IAAA,wBAAgB,EAAC;gBACzB,GAAG,IAAI;gBACP,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;gBACjC,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,IAAI;aACpB,CAAC,CAAC,CAAA;SACN;KACJ;IACJ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChB,IAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAC;QACjB,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;QACjC,OAAM;KACT;IACD,MAAM,OAAO,GAAG,MAAM,oBAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACrD,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5C,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const carmi_1 = tslib_1.__importDefault(require("./carmi"));
5 | const user_1 = tslib_1.__importDefault(require("./user"));
6 | const turnover_1 = tslib_1.__importDefault(require("./turnover"));
7 | const signin_1 = tslib_1.__importDefault(require("./signin"));
8 | const message_1 = tslib_1.__importDefault(require("./message"));
9 | const product_1 = tslib_1.__importDefault(require("./product"));
10 | const token_1 = tslib_1.__importDefault(require("./token"));
11 | const config_1 = tslib_1.__importDefault(require("./config"));
12 | const payment_1 = tslib_1.__importDefault(require("./payment"));
13 | const order_1 = tslib_1.__importDefault(require("./order"));
14 | const notification_1 = tslib_1.__importDefault(require("./notification"));
15 | exports.default = [
16 | carmi_1.default,
17 | user_1.default,
18 | turnover_1.default,
19 | signin_1.default,
20 | message_1.default,
21 | product_1.default,
22 | token_1.default,
23 | config_1.default,
24 | payment_1.default,
25 | order_1.default,
26 | notification_1.default
27 | ];
28 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/routers/admin/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/routers/admin/index.ts"],"names":[],"mappings":";;;AAAA,4DAAiC;AACjC,0DAA+B;AAC/B,kEAAuC;AACvC,8DAAmC;AACnC,gEAAqC;AACrC,gEAAqC;AACrC,4DAAiC;AACjC,8DAAmC;AACnC,gEAAqC;AACrC,4DAAiC;AACjC,0EAA+C;AAC/C,kBAAe;IACb,eAAW;IACX,cAAU;IACV,kBAAc;IACd,gBAAY;IACZ,iBAAa;IACb,iBAAa;IACb,eAAW;IACX,gBAAY;IACZ,iBAAa;IACb,eAAW;IACX,sBAAkB;CACnB,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/message.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/messages', async function (req, res, next) {
9 | const { page, page_size } = (0, utils_1.pagingData)({
10 | page: req.query.page,
11 | page_size: req.query.page_size
12 | });
13 | const signins = await models_1.messageModel.getMessages({ page, page_size });
14 | res.json((0, utils_1.httpBody)(0, signins));
15 | });
16 | exports.default = router;
17 | //# sourceMappingURL=message.js.map
--------------------------------------------------------------------------------
/server/routers/admin/message.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../server/routers/admin/message.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAkD;AAClD,yCAA2C;AAC3C,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAClD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACnC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KACjC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,MAAM,qBAAY,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IACnE,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/notification.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/notification', async function (req, res, next) {
9 | const { page, page_size } = (0, utils_1.pagingData)({
10 | page: req.query.page,
11 | page_size: req.query.page_size
12 | });
13 | const tokens = await models_1.notificationModel.getNotification({ page, page_size });
14 | res.json((0, utils_1.httpBody)(0, tokens));
15 | });
16 | router.delete('/notification/:id', async function (req, res, next) {
17 | const { id } = req.params;
18 | if (!id) {
19 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
20 | return;
21 | }
22 | const delRes = await models_1.notificationModel.delNotification(id);
23 | res.json((0, utils_1.httpBody)(0, delRes));
24 | });
25 | router.post('/notification', async function (req, res, next) {
26 | const { title, content, sort, status } = req.body;
27 | if (!title || !content) {
28 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
29 | return;
30 | }
31 | const id = (0, utils_1.generateNowflakeId)(1)();
32 | const addRes = await models_1.notificationModel.addNotification({
33 | id,
34 | title,
35 | content,
36 | sort,
37 | status
38 | });
39 | res.json((0, utils_1.httpBody)(0, addRes));
40 | });
41 | router.put('/notification', async function (req, res, next) {
42 | const { id, title, content, sort, status } = req.body;
43 | if (!id || !title || !content) {
44 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
45 | return;
46 | }
47 | const editRes = await models_1.notificationModel.editNotification(id, (0, utils_1.filterObjectNull)({
48 | title,
49 | content,
50 | sort,
51 | status
52 | }));
53 | res.json((0, utils_1.httpBody)(0, editRes));
54 | });
55 | exports.default = router;
56 | //# sourceMappingURL=notification.js.map
--------------------------------------------------------------------------------
/server/routers/admin/notification.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../server/routers/admin/notification.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAwF;AACxF,yCAAgD;AAChD,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACxD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACrC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KAC/B,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,0BAAiB,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IAC3E,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAC/D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,EAAE;QACP,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,MAAM,MAAM,GAAG,MAAM,0BAAiB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IAC1D,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACzD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACjD,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;QACtB,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,MAAM,EAAE,GAAG,IAAA,0BAAkB,EAAC,CAAC,CAAC,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,MAAM,0BAAiB,CAAC,eAAe,CAAC;QACrD,EAAE;QACF,KAAK;QACL,OAAO;QACP,IAAI;QACJ,MAAM;KACP,CAAC,CAAA;IACF,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACxD,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACrD,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;QAC7B,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,MAAM,OAAO,GAAG,MAAM,0BAAiB,CAAC,gBAAgB,CACtD,EAAE,EACF,IAAA,wBAAgB,EAAC;QACf,KAAK;QACL,OAAO;QACP,IAAI;QACJ,MAAM;KACP,CAAC,CACH,CAAA;IACD,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/order.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/orders', async function (req, res, next) {
9 | const { page, page_size } = (0, utils_1.pagingData)({
10 | page: req.query.page,
11 | page_size: req.query.page_size
12 | });
13 | const all = await models_1.orderModel.getOrders({ page, page_size });
14 | res.json((0, utils_1.httpBody)(0, all));
15 | });
16 | exports.default = router;
17 | //# sourceMappingURL=order.js.map
--------------------------------------------------------------------------------
/server/routers/admin/order.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"order.js","sourceRoot":"","sources":["../../../server/routers/admin/order.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAkD;AAClD,yCAAyC;AACzC,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAClD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACrC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KAC/B,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,MAAM,mBAAU,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IAC3D,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/payment.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/payment', async function (req, res, next) {
9 | const { page, page_size } = (0, utils_1.pagingData)({
10 | page: req.query.page,
11 | page_size: req.query.page_size
12 | });
13 | const all = await models_1.paymentModel.getPayments({ page, page_size });
14 | res.json((0, utils_1.httpBody)(0, all));
15 | });
16 | router.delete('/payment/:id', async function (req, res, next) {
17 | const { id } = req.params;
18 | if (!id) {
19 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
20 | return;
21 | }
22 | const delRes = await models_1.paymentModel.delPayment(id);
23 | res.json((0, utils_1.httpBody)(0, delRes));
24 | });
25 | router.post('/payment', async function (req, res, next) {
26 | const { channel, name, params, types, status = 1 } = req.body;
27 | if (!channel || !name || !params || !types) {
28 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
29 | return;
30 | }
31 | const id = (0, utils_1.generateNowflakeId)(1)();
32 | const addRes = await models_1.paymentModel.addPayment((0, utils_1.filterObjectNull)({
33 | id,
34 | channel,
35 | name,
36 | params,
37 | types,
38 | status
39 | }));
40 | res.json((0, utils_1.httpBody)(0, addRes));
41 | });
42 | router.put('/payment', async function (req, res, next) {
43 | const { id, channel, name, params, types, status } = req.body;
44 | if (!id || !channel || !name || !params || !types) {
45 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
46 | return;
47 | }
48 | const editRes = await models_1.paymentModel.editPayment((0, utils_1.filterObjectNull)({
49 | id,
50 | channel,
51 | name,
52 | params,
53 | types,
54 | status
55 | }));
56 | res.json((0, utils_1.httpBody)(0, editRes));
57 | });
58 | exports.default = router;
59 | //# sourceMappingURL=payment.js.map
--------------------------------------------------------------------------------
/server/routers/admin/payment.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"payment.js","sourceRoot":"","sources":["../../../server/routers/admin/payment.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAwF;AACxF,yCAA2C;AAC3C,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACnD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACrC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KAC/B,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,MAAM,qBAAY,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IAC/D,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAC1D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,EAAE;QACP,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,MAAM,MAAM,GAAG,MAAM,qBAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAChD,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACpD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAC7D,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;QAC1C,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,MAAM,EAAE,GAAG,IAAA,0BAAkB,EAAC,CAAC,CAAC,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,MAAM,qBAAY,CAAC,UAAU,CAC1C,IAAA,wBAAgB,EAAC;QACf,EAAE;QACF,OAAO;QACP,IAAI;QACJ,MAAM;QACN,KAAK;QACL,MAAM;KACP,CAAC,CACH,CAAA;IACD,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACnD,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAC7D,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;QACjD,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,MAAM,OAAO,GAAG,MAAM,qBAAY,CAAC,WAAW,CAC5C,IAAA,wBAAgB,EAAC;QACf,EAAE;QACF,OAAO;QACP,IAAI;QACJ,MAAM;QACN,KAAK;QACL,MAAM;KACP,CAAC,CACH,CAAA;IACD,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/signin.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/signin', async function (req, res, next) {
9 | const { page, page_size } = (0, utils_1.pagingData)({
10 | page: req.query.page,
11 | page_size: req.query.page_size
12 | });
13 | const signins = await models_1.signinModel.getSignins({ page, page_size });
14 | res.json((0, utils_1.httpBody)(0, signins));
15 | });
16 | exports.default = router;
17 | //# sourceMappingURL=signin.js.map
--------------------------------------------------------------------------------
/server/routers/admin/signin.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"signin.js","sourceRoot":"","sources":["../../../server/routers/admin/signin.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAkD;AAClD,yCAA0C;AAC1C,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAChD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACnC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KACjC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,MAAM,oBAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IACjE,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/turnover.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/turnover', async function (req, res, next) {
9 | const { page, page_size } = (0, utils_1.pagingData)({
10 | page: req.query.page,
11 | page_size: req.query.page_size
12 | });
13 | const carmis = await models_1.turnoverModel.getTurnovers({ page, page_size });
14 | res.json((0, utils_1.httpBody)(0, carmis));
15 | });
16 | router.delete('/turnover/:id', async function (req, res, next) {
17 | const { id } = req.params;
18 | if (!id) {
19 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
20 | return;
21 | }
22 | const delRes = await models_1.turnoverModel.delTurnover(id);
23 | res.json((0, utils_1.httpBody)(0, delRes));
24 | });
25 | router.put('/turnover', async function (req, res, next) {
26 | const { id, user_id, value, describe } = req.body;
27 | if (!id || !value || !describe || !user_id) {
28 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
29 | return;
30 | }
31 | const delRes = await models_1.turnoverModel.editTurnover({
32 | id,
33 | value,
34 | describe,
35 | user_id
36 | });
37 | res.json((0, utils_1.httpBody)(0, delRes));
38 | });
39 | exports.default = router;
40 | //# sourceMappingURL=turnover.js.map
--------------------------------------------------------------------------------
/server/routers/admin/turnover.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"turnover.js","sourceRoot":"","sources":["../../../server/routers/admin/turnover.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAkD;AAClD,yCAA4C;AAC5C,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAClD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACnC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KACjC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,sBAAa,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IACpE,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACzD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,EAAE;QACL,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACT;IACD,MAAM,MAAM,GAAG,MAAM,sBAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAClD,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAClD,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;QACxC,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACT;IACD,MAAM,MAAM,GAAG,MAAM,sBAAa,CAAC,YAAY,CAAC;QAC5C,EAAE;QACF,KAAK;QACL,QAAQ;QACR,OAAO;KACV,CAAC,CAAA;IACF,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/admin/user.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const express_1 = tslib_1.__importDefault(require("express"));
5 | const utils_1 = require("../../utils");
6 | const models_1 = require("../../models");
7 | const router = express_1.default.Router();
8 | router.get('/user', async function (req, res, next) {
9 | const { page, page_size } = (0, utils_1.pagingData)({
10 | page: req.query.page,
11 | page_size: req.query.page_size
12 | });
13 | const carmis = await models_1.userModel.getUsers({ page, page_size });
14 | res.json((0, utils_1.httpBody)(0, carmis));
15 | });
16 | router.delete('/user/:id', async function (req, res, next) {
17 | const { id } = req.params;
18 | if (!id) {
19 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
20 | return;
21 | }
22 | const delRes = await models_1.userModel.delUser(id);
23 | res.json((0, utils_1.httpBody)(0, delRes));
24 | });
25 | router.put('/user', async function (req, res, next) {
26 | const { id, account, avatar, integral, nickname, role, vip_expire_time, svip_expire_time } = req.body;
27 | if (!id) {
28 | res.json((0, utils_1.httpBody)(-1, '缺少必要参数'));
29 | return;
30 | }
31 | // 修改用户
32 | const editRes = await models_1.userModel.editUser((0, utils_1.filterObjectNull)({
33 | id,
34 | account,
35 | avatar,
36 | integral,
37 | nickname,
38 | role,
39 | vip_expire_time,
40 | svip_expire_time
41 | }));
42 | res.json((0, utils_1.httpBody)(0, editRes));
43 | });
44 | exports.default = router;
45 | //# sourceMappingURL=user.js.map
--------------------------------------------------------------------------------
/server/routers/admin/user.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../server/routers/admin/user.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAoE;AACpE,yCAAwC;AACxC,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAChD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAU,EAAC;QACrC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;KAC/B,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IAC5D,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IACvD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,EAAE;QACP,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC1C,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;IAChD,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACrG,IAAI,CAAC,EAAE,EAAE;QACP,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAChC,OAAM;KACP;IACD,OAAO;IACP,MAAM,OAAO,GAAG,MAAM,kBAAS,CAAC,QAAQ,CAAC,IAAA,wBAAgB,EAAC;QACxD,EAAE;QACF,OAAO;QACP,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,IAAI;QACJ,eAAe;QAClB,gBAAgB;KACd,CAAC,CAAC,CAAA;IACH,GAAG,CAAC,IAAI,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
--------------------------------------------------------------------------------
/server/routers/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const api_1 = tslib_1.__importDefault(require("./api"));
5 | const admin_1 = tslib_1.__importDefault(require("./admin"));
6 | exports.default = (app) => {
7 | // 前端用户用的一些接口
8 | app.use('/api', [api_1.default]);
9 | // 管理后台用的一些接口
10 | app.use('/api/admin', [...admin_1.default]);
11 | return app;
12 | };
13 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/routers/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/routers/index.ts"],"names":[],"mappings":";;;AACA,wDAAuB;AACvB,4DAAkC;AAElC,kBAAe,CAAC,GAAY,EAAE,EAAE;IAC9B,aAAa;IACb,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,aAAG,CAAC,CAAC,CAAA;IACtB,aAAa;IACb,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,eAAY,CAAC,CAAC,CAAA;IAExC,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
--------------------------------------------------------------------------------
/server/type.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | //# sourceMappingURL=type.js.map
--------------------------------------------------------------------------------
/server/type.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"type.js","sourceRoot":"","sources":["../server/type.ts"],"names":[],"mappings":""}
--------------------------------------------------------------------------------
/server/utils/buildQueryString.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function buildQueryString(params) {
4 | return Object.keys(params)
5 | .map(function (key) {
6 | return key + '=' + params[key];
7 | })
8 | .join('&');
9 | }
10 | exports.default = buildQueryString;
11 | //# sourceMappingURL=buildQueryString.js.map
--------------------------------------------------------------------------------
/server/utils/buildQueryString.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"buildQueryString.js","sourceRoot":"","sources":["../../server/utils/buildQueryString.ts"],"names":[],"mappings":";;AAAA,SAAS,gBAAgB,CAAC,MAAM;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACvB,GAAG,CAAC,UAAU,GAAG;QAChB,OAAO,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED,kBAAe,gBAAgB,CAAA"}
--------------------------------------------------------------------------------
/server/utils/filterObjectNull.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function filterObjectNull(obj) {
4 | const params = Object.keys(obj)
5 | .filter((key) => obj[key] !== '' && obj[key] !== null && obj[key] !== undefined)
6 | .reduce((acc, key) => ({ ...acc, [key]: obj[key] }), {});
7 | return { ...params };
8 | }
9 | exports.default = filterObjectNull;
10 | //# sourceMappingURL=filterObjectNull.js.map
--------------------------------------------------------------------------------
/server/utils/filterObjectNull.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"filterObjectNull.js","sourceRoot":"","sources":["../../server/utils/filterObjectNull.ts"],"names":[],"mappings":";;AAAA,SAAS,gBAAgB,CAAC,GAA2B;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;SAC5B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;SAC/E,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1D,OAAO,EAAE,GAAG,MAAM,EAAE,CAAA;AACtB,CAAC;AAED,kBAAe,gBAAgB,CAAA"}
--------------------------------------------------------------------------------
/server/utils/formatTime.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function formatTime(fmt = 'yyyy-MM-dd HH:mm:ss', timeDate) {
4 | const date = timeDate ? timeDate : new Date();
5 | const add0 = (num) => num < 10 ? `0${num}` : num;
6 | const o = {
7 | 'yyyy': date.getFullYear(),
8 | 'MM': add0(date.getMonth() + 1),
9 | 'dd': add0(date.getDate()),
10 | 'HH': add0(date.getHours()),
11 | 'mm': add0(date.getMinutes()),
12 | 'ss': add0(date.getSeconds()),
13 | 'qq': Math.floor((date.getMonth() + 3) / 3),
14 | 'S': date.getMilliseconds() //毫秒
15 | };
16 | Object.keys(o).forEach((i) => {
17 | if (fmt.includes(i)) {
18 | fmt = fmt?.replace(i, o[i]);
19 | }
20 | });
21 | return fmt;
22 | }
23 | exports.default = formatTime;
24 | //# sourceMappingURL=formatTime.js.map
--------------------------------------------------------------------------------
/server/utils/formatTime.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"formatTime.js","sourceRoot":"","sources":["../../server/utils/formatTime.ts"],"names":[],"mappings":";;AAAA,SAAwB,UAAU,CAAE,GAAG,GAAG,qBAAqB,EAAE,QAAe;IAC5E,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,MAAM,CAAC,GAAwB;QAC3B,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI;KACnC,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,EAAE;QACxB,IAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC;YACf,GAAG,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/B;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACf,CAAC;AArBD,6BAqBC"}
--------------------------------------------------------------------------------
/server/utils/generateCode.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function generateCode(number = 6) {
4 | const random = String(Math.random()).split('.')[1];
5 | const code = random.slice(0, number);
6 | return code;
7 | }
8 | exports.default = generateCode;
9 | //# sourceMappingURL=generateCode.js.map
--------------------------------------------------------------------------------
/server/utils/generateCode.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"generateCode.js","sourceRoot":"","sources":["../../server/utils/generateCode.ts"],"names":[],"mappings":";;AAAA,SAAwB,YAAY,CAAC,MAAM,GAAG,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC;AAJD,+BAIC"}
--------------------------------------------------------------------------------
/server/utils/generateMd5.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const crypto_1 = tslib_1.__importDefault(require("crypto"));
5 | function generateMd5(str) {
6 | const md5 = crypto_1.default.createHash('md5').update(str).digest('hex');
7 | return md5;
8 | }
9 | exports.default = generateMd5;
10 | //# sourceMappingURL=generateMd5.js.map
--------------------------------------------------------------------------------
/server/utils/generateMd5.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"generateMd5.js","sourceRoot":"","sources":["../../server/utils/generateMd5.ts"],"names":[],"mappings":";;;AAAA,4DAA2B;AAC3B,SAAwB,WAAW,CAAC,GAAW;IAC7C,MAAM,GAAG,GAAG,gBAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9D,OAAO,GAAG,CAAA;AACZ,CAAC;AAHD,8BAGC"}
--------------------------------------------------------------------------------
/server/utils/generateNowflakeId.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | /**
4 | * 生成分布式全局唯一ID(雪花算法)
5 | * @param {number} nodeId 节点ID,取值范围是0-4095
6 | * @param {number} epoch 起始时间戳,单位是毫秒,默认值为2021-01-01 00:00:00的时间戳
7 | * @throws {Error} 如果在同一毫秒内生成的ID数量达到了最大值(4096),则会抛出异常
8 | * @returns {string} 64位整数字符串
9 | */
10 | function generateSnowflakeId(nodeId, epoch = 1672502400000) {
11 | let sequence = 0;
12 | let lastTimestamp = 0;
13 | /**
14 | * 等待下一毫秒
15 | * @param {number} timestamp 当前时间戳
16 | * @returns {number} 下一毫秒的时间戳
17 | */
18 | const waitNextMillis = (timestamp) => {
19 | let nextTimestamp = Date.now() - epoch;
20 | while (nextTimestamp <= timestamp) {
21 | nextTimestamp = Date.now() - epoch;
22 | }
23 | return nextTimestamp;
24 | };
25 | return function () {
26 | let timestamp = Date.now() - epoch;
27 | if (timestamp < lastTimestamp) {
28 | throw new Error('Clock moved backwards!');
29 | }
30 | if (timestamp === lastTimestamp) {
31 | sequence = (sequence + 1) & 4095;
32 | if (sequence === 0) {
33 | timestamp = waitNextMillis(timestamp);
34 | }
35 | }
36 | else {
37 | sequence = 0;
38 | }
39 | lastTimestamp = timestamp;
40 | const id = ((BigInt(timestamp) << 22n) | (BigInt(nodeId) << 12n) | BigInt(sequence)).toString();
41 | return id;
42 | };
43 | }
44 | exports.default = generateSnowflakeId;
45 | //# sourceMappingURL=generateNowflakeId.js.map
--------------------------------------------------------------------------------
/server/utils/generateNowflakeId.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"generateNowflakeId.js","sourceRoot":"","sources":["../../server/utils/generateNowflakeId.ts"],"names":[],"mappings":";;AAAA;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,MAAc,EAAE,KAAK,GAAG,aAAa;IAChE,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB;;;;OAIG;IACH,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,EAAE;QAC3C,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACtC,OAAO,aAAa,IAAI,SAAS,EAAE;YACjC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;SACnC;QACD,OAAO,aAAa,CAAA;IACtB,CAAC,CAAA;IAED,OAAO;QACL,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QAElC,IAAI,SAAS,GAAG,aAAa,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;SAC1C;QAED,IAAI,SAAS,KAAK,aAAa,EAAE;YAC/B,QAAQ,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;YAChC,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAClB,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;aACtC;SACF;aAAM;YACL,QAAQ,GAAG,CAAC,CAAA;SACb;QAED,aAAa,GAAG,SAAS,CAAA;QAEzB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC/F,OAAO,EAAE,CAAA;IACX,CAAC,CAAA;AACH,CAAC;AAED,kBAAe,mBAAmB,CAAA"}
--------------------------------------------------------------------------------
/server/utils/generateToken.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const crypto_1 = tslib_1.__importDefault(require("crypto"));
5 | function generateToken(info, secret = 'chatgpt') {
6 | const timestamp = Date.now().toString(); // 可以使用可读性更高的日期字符串
7 | const str = JSON.stringify(info) + timestamp + secret;
8 | const sha256 = crypto_1.default.createHash('sha256').update(str).digest('hex');
9 | const md5 = crypto_1.default.createHash('md5').update(sha256).digest('hex');
10 | return md5;
11 | }
12 | exports.default = generateToken;
13 | //# sourceMappingURL=generateToken.js.map
--------------------------------------------------------------------------------
/server/utils/generateToken.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"generateToken.js","sourceRoot":"","sources":["../../server/utils/generateToken.ts"],"names":[],"mappings":";;;AAAA,4DAA2B;AAC3B,SAAwB,aAAa,CAAC,IAA4B,EAAE,MAAM,GAAG,SAAS;IACpF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA,CAAC,kBAAkB;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAAA;IACrD,MAAM,MAAM,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACpE,MAAM,GAAG,GAAG,gBAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACjE,OAAO,GAAG,CAAA;AACZ,CAAC;AAND,gCAMC"}
--------------------------------------------------------------------------------
/server/utils/generateUUID.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function generateUUID() {
4 | let d = new Date().getTime();
5 | if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
6 | d += performance.now(); // use high-precision timer if available
7 | }
8 | const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
9 | const r = (d + Math.random() * 16) % 16 | 0;
10 | d = Math.floor(d / 16);
11 | return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
12 | });
13 | return uuid;
14 | }
15 | exports.default = generateUUID;
16 | //# sourceMappingURL=generateUUID.js.map
--------------------------------------------------------------------------------
/server/utils/generateUUID.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"generateUUID.js","sourceRoot":"","sources":["../../server/utils/generateUUID.ts"],"names":[],"mappings":";;AAAA,SAAwB,YAAY;IAClC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAC5B,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,EAAE;QAC/E,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,CAAA,CAAC,wCAAwC;KAChE;IACD,MAAM,IAAI,GAAG,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;QAC9E,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3C,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;QACtB,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAXD,+BAWC"}
--------------------------------------------------------------------------------
/server/utils/getClientIP.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function getClientIP(req) {
4 | let ip = req.headers['x-forwarded-for'] ||
5 | req.headers['x-real-ip'] ||
6 | req.headers['remote-host'] ||
7 | req.socket.remoteAddress || // 判断后端的 socket 的 IP
8 | req.ip ||
9 | '';
10 | if (ip) {
11 | ip = ip.replace('::ffff:', '');
12 | }
13 | return ip;
14 | }
15 | exports.default = getClientIP;
16 | //# sourceMappingURL=getClientIP.js.map
--------------------------------------------------------------------------------
/server/utils/getClientIP.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"getClientIP.js","sourceRoot":"","sources":["../../server/utils/getClientIP.ts"],"names":[],"mappings":";;AAAA,SAAwB,WAAW,CAAC,GAAQ;IAC1C,IAAI,EAAE,GACH,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAY;QACzC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAY;QACnC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAY;QACtC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,oBAAoB;QAChD,GAAG,CAAC,EAAE;QACN,EAAE,CAAA;IAEJ,IAAI,EAAE,EAAE;QACN,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;KAC/B;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAbD,8BAaC"}
--------------------------------------------------------------------------------
/server/utils/getKeyUsage.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
5 | const formatTime_1 = tslib_1.__importDefault(require("./formatTime"));
6 | async function getKeyUsage(url, key) {
7 | const subscriptionUrl = `${url}/v1/dashboard/billing/subscription`;
8 | const subscriptionRes = await (0, node_fetch_1.default)(subscriptionUrl, {
9 | method: 'GET',
10 | headers: {
11 | Authorization: 'Bearer ' + key
12 | }
13 | });
14 | if (subscriptionRes.status !== 200) {
15 | return {
16 | status: subscriptionRes.status,
17 | hard_limit_usd: 0,
18 | total_usage: 0
19 | };
20 | }
21 | const data = await subscriptionRes.json();
22 | const hard_limit_usd = data?.hard_limit_usd || 0;
23 | const now = new Date();
24 | const usageUrl = `${url}/v1/dashboard/billing/usage`;
25 | let startDate = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);
26 | const endDate = new Date(now.getTime() + 24 * 60 * 60 * 1000);
27 | const subDate = new Date(now);
28 | subDate.setDate(1);
29 | if (hard_limit_usd > 20) {
30 | startDate = subDate;
31 | }
32 | if (data?.has_payment_method) {
33 | const day = now.getDate(); // 本月过去的天数
34 | startDate = new Date(now.getTime() - (day - 1) * 24 * 60 * 60 * 1000); // 本月第一天
35 | }
36 | const usageres = await (0, node_fetch_1.default)(`${usageUrl}?start_date=${(0, formatTime_1.default)('yyyy-MM-dd', new Date(startDate))}&end_date=${(0, formatTime_1.default)('yyyy-MM-dd', new Date(endDate))}`, {
37 | headers: {
38 | Authorization: 'Bearer ' + key
39 | }
40 | });
41 | let total_usage = 0;
42 | if (usageres.status === 200) {
43 | const usageData = await usageres.json();
44 | total_usage = usageData.total_usage ? (usageData.total_usage / 100).toFixed(2) : 0;
45 | }
46 | return {
47 | status: 0,
48 | hard_limit_usd,
49 | total_usage
50 | };
51 | }
52 | exports.default = getKeyUsage;
53 | //# sourceMappingURL=getKeyUsage.js.map
--------------------------------------------------------------------------------
/server/utils/getKeyUsage.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"getKeyUsage.js","sourceRoot":"","sources":["../../server/utils/getKeyUsage.ts"],"names":[],"mappings":";;;AAAA,oEAA8B;AAC9B,sEAAqC;AAErC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW;IACjD,MAAM,eAAe,GAAG,GAAG,GAAG,oCAAoC,CAAA;IAClE,MAAM,eAAe,GAAG,MAAM,IAAA,oBAAK,EAAC,eAAe,EAAE;QACnD,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,GAAG,GAAG;SAC/B;KACF,CAAC,CAAA;IAEF,IAAI,eAAe,CAAC,MAAM,KAAK,GAAG,EAAE;QAClC,OAAO;YACL,MAAM,EAAE,eAAe,CAAC,MAAM;YAC9B,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;SACf,CAAA;KACF;IAED,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,CAAA;IACzC,MAAM,cAAc,GAAG,IAAI,EAAE,cAAc,IAAI,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAG,GAAG,GAAG,6BAA6B,CAAA;IACpD,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAClB,IAAI,cAAc,GAAG,EAAE,EAAE;QACvB,SAAS,GAAG,OAAO,CAAA;KACpB;IAED,IAAI,IAAI,EAAE,kBAAkB,EAAE;QAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAA,CAAC,UAAU;QACpC,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA,CAAC,QAAQ;KAC/E;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAC1B,GAAG,QAAQ,eAAe,IAAA,oBAAU,EAAC,YAAY,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,IAAA,oBAAU,EAC5F,YAAY,EACZ,IAAI,IAAI,CAAC,OAAO,CAAC,CAClB,EAAE,EACH;QACE,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,GAAG,GAAG;SAC/B;KACF,CACF,CAAA;IAED,IAAI,WAAW,GAAoB,CAAC,CAAA;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;QAC3B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACvC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KACnF;IAED,OAAO;QACL,MAAM,EAAE,CAAC;QACT,cAAc;QACd,WAAW;KACZ,CAAA;AACH,CAAC;AAED,kBAAe,WAAW,CAAA"}
--------------------------------------------------------------------------------
/server/utils/handleChatData.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | const tslib_1 = require("tslib");
4 | const formatTime_1 = tslib_1.__importDefault(require("./formatTime"));
5 | function handleOpenChatData(chunk, parentMessageId) {
6 | // 将字符串按照连续的两个换行符进行分割
7 | let chunks = chunk.toString().split(/\n{2}/g);
8 | // 过滤掉空白的消息
9 | chunks = chunks.filter((item) => item.trim());
10 | const contents = [];
11 | for (let i = 0; i < chunks.length; i++) {
12 | const message = chunks[i];
13 | let payload = message.replace(/^data: /, '');
14 | if (payload === '[DONE]') {
15 | contents.push(JSON.stringify({
16 | id: '',
17 | role: 'assistant',
18 | segment: 'stop',
19 | dateTime: (0, formatTime_1.default)(),
20 | content: '',
21 | parentMessageId
22 | }));
23 | }
24 | try {
25 | payload = JSON.parse(payload);
26 | }
27 | catch (e) {
28 | // 忽略无法解析为 JSON 的消息
29 | continue;
30 | }
31 | const payloadContent = payload.choices?.[0]?.delta?.content || '';
32 | const payloadRole = payload.choices?.[0]?.delta?.role;
33 | const segment = payload === '[DONE]' ? 'stop' : payloadRole === 'assistant' ? 'start' : 'text';
34 | contents.push(JSON.stringify({
35 | id: payload.id,
36 | role: 'assistant',
37 | segment,
38 | dateTime: (0, formatTime_1.default)(),
39 | content: payloadContent,
40 | parentMessageId
41 | }) + '\n\n');
42 | }
43 | return contents.join('');
44 | }
45 | exports.default = handleOpenChatData;
46 | //# sourceMappingURL=handleChatData.js.map
--------------------------------------------------------------------------------
/server/utils/handleChatData.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"handleChatData.js","sourceRoot":"","sources":["../../server/utils/handleChatData.ts"],"names":[],"mappings":";;;AAAA,sEAAqC;AAErC,SAAwB,kBAAkB,CAAC,KAAa,EAAE,eAAuB;IAC/E,qBAAqB;IACrB,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC7C,WAAW;IACX,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAE7C,MAAM,QAAQ,GAAG,EAAE,CAAA;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,OAAO,GAAW,MAAM,CAAC,CAAC,CAAC,CAAA;QAEjC,IAAI,OAAO,GAAQ,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAEjD,IAAI,OAAO,KAAK,QAAQ,EAAE;YACxB,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,SAAS,CAAC;gBACb,EAAE,EAAE,EAAE;gBACN,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,IAAA,oBAAU,GAAE;gBACtB,OAAO,EAAE,EAAE;gBACX,eAAe;aAChB,CAAC,CACH,CAAA;SACF;QAED,IAAI;YACF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;SAC9B;QAAC,OAAO,CAAC,EAAE;YACV,mBAAmB;YACnB,SAAQ;SACT;QAED,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,CAAA;QACjE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAA;QACrD,MAAM,OAAO,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;QAE9F,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,SAAS,CAAC;YACb,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,QAAQ,EAAE,IAAA,oBAAU,GAAE;YACtB,OAAO,EAAE,cAAc;YACvB,eAAe;SAChB,CAAC,GAAG,MAAM,CACZ,CAAA;KACF;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC1B,CAAC;AAhDD,qCAgDC"}
--------------------------------------------------------------------------------
/server/utils/httpBody.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function httpBody(code, ...rest) {
4 | const body = {
5 | code,
6 | data: [],
7 | message: ''
8 | };
9 | if (rest.length === 1 && typeof rest[0] === 'string') {
10 | body.message = rest[0];
11 | }
12 | else if (rest.length === 2 && typeof rest[0] !== 'string' && typeof rest[1] === 'string') {
13 | body.data = rest[0];
14 | body.message = rest[1];
15 | }
16 | else if (rest.length === 1 && typeof rest[0] !== 'string') {
17 | body.data = rest[0];
18 | }
19 | return body;
20 | }
21 | exports.default = httpBody;
22 | //# sourceMappingURL=httpBody.js.map
--------------------------------------------------------------------------------
/server/utils/httpBody.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"httpBody.js","sourceRoot":"","sources":["../../server/utils/httpBody.ts"],"names":[],"mappings":";;AAWA,SAAS,QAAQ,CAAU,IAAY,EAAE,GAAG,IAAgC;IAC1E,MAAM,IAAI,GAAa;QACrB,IAAI;QACJ,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,EAAE;KACZ,CAAA;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACvB;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QAC1F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACvB;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACpB;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kBAAe,QAAQ,CAAA"}
--------------------------------------------------------------------------------
/server/utils/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | exports.buildQueryString = exports.ksort = exports.getKeyUsage = exports.generateMd5 = exports.handleChatData = exports.generateUUID = exports.formatTime = exports.pagingData = exports.generateToken = exports.httpBody = exports.getClientIP = exports.generateNowflakeId = exports.generateCode = exports.filterObjectNull = void 0;
4 | const tslib_1 = require("tslib");
5 | const filterObjectNull_1 = tslib_1.__importDefault(require("./filterObjectNull"));
6 | exports.filterObjectNull = filterObjectNull_1.default;
7 | const generateCode_1 = tslib_1.__importDefault(require("./generateCode"));
8 | exports.generateCode = generateCode_1.default;
9 | const generateNowflakeId_1 = tslib_1.__importDefault(require("./generateNowflakeId"));
10 | exports.generateNowflakeId = generateNowflakeId_1.default;
11 | const getClientIP_1 = tslib_1.__importDefault(require("./getClientIP"));
12 | exports.getClientIP = getClientIP_1.default;
13 | const httpBody_1 = tslib_1.__importDefault(require("./httpBody"));
14 | exports.httpBody = httpBody_1.default;
15 | const generateToken_1 = tslib_1.__importDefault(require("./generateToken"));
16 | exports.generateToken = generateToken_1.default;
17 | const pagingData_1 = tslib_1.__importDefault(require("./pagingData"));
18 | exports.pagingData = pagingData_1.default;
19 | const formatTime_1 = tslib_1.__importDefault(require("./formatTime"));
20 | exports.formatTime = formatTime_1.default;
21 | const generateUUID_1 = tslib_1.__importDefault(require("./generateUUID"));
22 | exports.generateUUID = generateUUID_1.default;
23 | const handleChatData_1 = tslib_1.__importDefault(require("./handleChatData"));
24 | exports.handleChatData = handleChatData_1.default;
25 | const generateMd5_1 = tslib_1.__importDefault(require("./generateMd5"));
26 | exports.generateMd5 = generateMd5_1.default;
27 | const getKeyUsage_1 = tslib_1.__importDefault(require("./getKeyUsage"));
28 | exports.getKeyUsage = getKeyUsage_1.default;
29 | const ksort_1 = tslib_1.__importDefault(require("./ksort"));
30 | exports.ksort = ksort_1.default;
31 | const buildQueryString_1 = tslib_1.__importDefault(require("./buildQueryString"));
32 | exports.buildQueryString = buildQueryString_1.default;
33 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/server/utils/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/utils/index.ts"],"names":[],"mappings":";;;;AAAA,kFAAiD;AAe/C,2BAfK,0BAAgB,CAeL;AAdlB,0EAAyC;AAevC,uBAfK,sBAAY,CAeL;AAdd,sFAAqD;AAenD,6BAfK,4BAAkB,CAeL;AAdpB,wEAAuC;AAerC,sBAfK,qBAAW,CAeL;AAdb,kEAAiC;AAe/B,mBAfK,kBAAQ,CAeL;AAdV,4EAA2C;AAezC,wBAfK,uBAAa,CAeL;AAdf,sEAAqC;AAenC,qBAfK,oBAAU,CAeL;AAdZ,sEAAqC;AAenC,qBAfK,oBAAU,CAeL;AAdZ,0EAAyC;AAevC,uBAfK,sBAAY,CAeL;AAdd,8EAA6C;AAe3C,yBAfK,wBAAc,CAeL;AAdhB,wEAAuC;AAerC,sBAfK,qBAAW,CAeL;AAdb,wEAAuC;AAerC,sBAfK,qBAAW,CAeL;AAdb,4DAA2B;AAezB,gBAfK,eAAK,CAeL;AAdP,kFAAiD;AAe/C,2BAfK,0BAAgB,CAeL"}
--------------------------------------------------------------------------------
/server/utils/ksort.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function ksort(obj) {
4 | const keys = Object.keys(obj).sort();
5 | const sortedObj = {};
6 | for (let i = 0; i < keys.length; i++) {
7 | sortedObj[keys[i]] = obj[keys[i]];
8 | }
9 | return sortedObj;
10 | }
11 | exports.default = ksort;
12 | //# sourceMappingURL=ksort.js.map
--------------------------------------------------------------------------------
/server/utils/ksort.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"ksort.js","sourceRoot":"","sources":["../../server/utils/ksort.ts"],"names":[],"mappings":";;AAAA,SAAS,KAAK,CAAC,GAAG;IAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IACpC,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;KAClC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,kBAAe,KAAK,CAAA"}
--------------------------------------------------------------------------------
/server/utils/pagingData.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function pagingData({ page, page_size }, zero = true) {
4 | page = Number(page) || 1;
5 | page_size = Number(page_size) || 10;
6 | if (page <= 0 || typeof page != 'number') {
7 | page = 1;
8 | }
9 | if (zero && (page > 0 || typeof page != 'number')) {
10 | page -= 1;
11 | }
12 | if (typeof page_size != 'number') {
13 | page_size = 10;
14 | }
15 | return { page, page_size };
16 | }
17 | exports.default = pagingData;
18 | //# sourceMappingURL=pagingData.js.map
--------------------------------------------------------------------------------
/server/utils/pagingData.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"pagingData.js","sourceRoot":"","sources":["../../server/utils/pagingData.ts"],"names":[],"mappings":";;AAAA,SAAS,UAAU,CACjB,EACE,IAAI,EACJ,SAAS,EAIV,EACD,IAAI,GAAG,IAAI;IAEX,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACnC,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE;QACxC,IAAI,GAAG,CAAC,CAAA;KACT;IACD,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,IAAI,IAAI,QAAQ,CAAC,EAAE;QACjD,IAAI,IAAI,CAAC,CAAA;KACV;IACD,IAAI,OAAO,SAAS,IAAI,QAAQ,EAAE;QAChC,SAAS,GAAG,EAAE,CAAA;KACf;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AAC5B,CAAC;AAED,kBAAe,UAAU,CAAA"}
--------------------------------------------------------------------------------
/src/assets/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yancyuu/ChatGPT-Web-Admin/5fed680ecc503f97484762a5601d5f1eb8205aa7/src/assets/3.png
--------------------------------------------------------------------------------
/src/assets/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yancyuu/ChatGPT-Web-Admin/5fed680ecc503f97484762a5601d5f1eb8205aa7/src/assets/4.png
--------------------------------------------------------------------------------
/src/assets/header.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yancyuu/ChatGPT-Web-Admin/5fed680ecc503f97484762a5601d5f1eb8205aa7/src/assets/header.png
--------------------------------------------------------------------------------
/src/assets/openai.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/recommend.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "key": "awesome-chatgpt-prompts-zh",
4 | "desc": "🤖️ ChatGPT 中文调教指南",
5 | "downloadUrl": "https://raw.githubusercontent.com/PlexPt/awesome-chatgpt-prompts-zh/main/prompts-zh.json",
6 | "url": "https://github.com/PlexPt/awesome-chatgpt-prompts-zh"
7 | },
8 | {
9 | "key": "awesome-chatgpt-prompts-zh-TW",
10 | "desc": "🤖️ ChatGPT 中文調教指南 (透過 OpenAI / OpenCC 協助,從簡體中文轉換為繁體中文的版本)",
11 | "downloadUrl": "https://raw.githubusercontent.com/PlexPt/awesome-chatgpt-prompts-zh/main/prompts-zh-TW.json",
12 | "url": "https://github.com/PlexPt/awesome-chatgpt-prompts-zh"
13 | }
14 | ]
15 |
--------------------------------------------------------------------------------
/src/assets/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/ConfigModal/index.module.less:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yancyuu/ChatGPT-Web-Admin/5fed680ecc503f97484762a5601d5f1eb8205aa7/src/components/ConfigModal/index.module.less
--------------------------------------------------------------------------------
/src/components/FormItemCard/index.module.less:
--------------------------------------------------------------------------------
1 | .formItemCard {
2 | display: flex;
3 | justify-content: space-between;
4 | flex-wrap: wrap;
5 | padding-bottom: 12px;
6 | margin-top: 12px;
7 | border-bottom: 1px solid #f4f4f4;
8 | &_text{
9 | p{
10 | font-size: 14px;
11 | font-weight: 500;
12 | color: #333;
13 | }
14 | span{
15 | font-size: 12px;
16 | color: #999;
17 | font-weight: 400;
18 | }
19 | }
20 | &_field{
21 | [class*='ant-form-item']{
22 | margin-bottom: 0;
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/components/FormItemCard/index.tsx:
--------------------------------------------------------------------------------
1 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
2 | import useDocumentResize from '@/hooks/useDocumentResize'
3 | import styles from './index.module.less'
4 |
5 | type Props = {
6 | title: string
7 | describe: string
8 | children?: React.ReactNode
9 | }
10 |
11 | function FormItemCard(props: Props) {
12 | const { width } = useDocumentResize()
13 |
14 | return (
15 |
22 |
23 |
{props.title}
24 |
{props.describe}
25 |
26 |
{props.children}
27 |
28 | )
29 | }
30 |
31 | export default FormItemCard
32 |
--------------------------------------------------------------------------------
/src/components/GoodsList/index.module.less:
--------------------------------------------------------------------------------
1 | .goodsList {
2 | display: flex;
3 | flex-wrap: wrap;
4 | gap: 10px;
5 | &_item{
6 | flex: 1;
7 | min-width: 150px;
8 | min-height: 11px;
9 | box-sizing: content-box;
10 | background-color: #fff;
11 | border-radius: 8px;
12 | padding: 20px 20px;
13 | display: flex;
14 | flex-direction: column;
15 | // align-items: center;
16 | border: 2px solid transparent;
17 | transition: border-color 0.4s ease-in-out;
18 | cursor: pointer;
19 | position: relative;
20 |
21 | &:hover{
22 | border-color: #1877ff;
23 | }
24 |
25 | &_select {
26 | border-color: #1877ff;
27 | }
28 |
29 | h3 {
30 | font-size: 24px;
31 | color: #1877ff;
32 | }
33 |
34 | &_tag{
35 | position: absolute;
36 | top: 0;
37 | right: 0;
38 | border-top-right-radius: 8px;
39 | border-bottom-left-radius: 8px;
40 | background-color: #fcbf24;
41 | color: #fff;
42 | padding: 2px 6px;
43 | }
44 |
45 | &_level{
46 | color: #f4c17a;
47 | font-weight: 500;
48 | font-size: 14px;
49 | }
50 |
51 | &_price{
52 | display: flex;
53 | align-items: flex-end;
54 | .sales_price{
55 | font-size: 16px;
56 | font-weight: 500;
57 | color: #333;
58 | }
59 | .original_price{
60 | font-size: 12px;
61 | color: #999;
62 | text-decoration: line-through;
63 | margin-bottom: 2px;
64 | margin-left: 4px;
65 | }
66 | }
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/src/components/GoodsList/index.tsx:
--------------------------------------------------------------------------------
1 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
2 | import { ProductInfo } from '@/types'
3 | import styles from './index.module.less'
4 | import { useEffect, useState } from 'react'
5 |
6 | function GoodsList(props: { list: Array; onChange: (item: ProductInfo) => void }) {
7 | const [selectItem, setSelectItem] = useState()
8 |
9 | useEffect(() => {
10 | if (selectItem && selectItem.id) {
11 | props.onChange?.(selectItem)
12 | }
13 | }, [selectItem])
14 |
15 | return (
16 |
17 | {props.list.map((item) => {
18 | const className =
19 | selectItem?.id === item.id
20 | ? `${styles.goodsList_item} ${styles.goodsList_item_select}`
21 | : styles.goodsList_item
22 | return (
23 |
{
27 | setSelectItem(item)
28 | }}
29 | >
30 |
{ item.level === 1 ? '会员' : item.level === 2 ? '超级会员' : '超级特惠' }
31 | {item.type === 'integral' ?
{item.value}积分
:
{item.value}天
}
32 |
33 |
{(item.price / 100).toFixed(2)}元
34 | {item.original_price &&
¥{(item.original_price / 100).toFixed(2)}
}
35 |
36 |
{item.badge}
37 |
38 | )
39 | })}
40 |
41 | )
42 | }
43 |
44 | export default GoodsList
45 |
--------------------------------------------------------------------------------
/src/components/HeaderRender/index.module.less:
--------------------------------------------------------------------------------
1 | .header{
2 | height: 56px;
3 | display: flex;
4 | align-items: center;
5 | padding: 0 12px;
6 | &__menuIcon{
7 | font-size: 18px;
8 | margin-right: 12px;
9 | }
10 | &__logo{
11 | display: flex;
12 | height: 28px;
13 | img{
14 | width: 28px;
15 | }
16 | h1{
17 | margin-block: 0;
18 | margin-inline: 0;
19 | margin-inline-start: 8px;
20 | font-weight: 600;
21 | color: rgba(0, 0, 0, 0.88);
22 | font-size: 18px;
23 | line-height: 1.6;
24 | }
25 | }
26 |
27 | &__actives{
28 | display: flex;
29 | align-items: center;
30 | margin-left: auto;
31 | &_menu{
32 | font-size: 24px;
33 | margin-left: 12px;
34 | color: #666;
35 | cursor: pointer;
36 | &:hover{
37 | color: #1877ff;
38 | }
39 | }
40 | }
41 | &__balance {
42 | height: 34px;
43 | padding: 0 8px;
44 | margin: 0 8px;
45 | background-color: #f1f1f1;
46 | border-radius: 4px;
47 | display: flex;
48 | align-items: center;
49 | justify-content: center;
50 | cursor: pointer;
51 | transition: all 0.3s ease-in-out;
52 | &:hover{
53 | background-color: #d9d9d9;
54 | }
55 | p{
56 | margin-right: 12px;
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/src/components/MenuList/index.module.less:
--------------------------------------------------------------------------------
1 | .menuList{
2 | display: flex;
3 | .item{
4 | display: flex;
5 | align-items: center;
6 | cursor: pointer;
7 | height: 100%;
8 | color: #999;
9 | transition: all 0.3s ease-in-out;
10 | &_text{
11 | height: 100%;
12 | display: flex;
13 | flex-direction: column;
14 | align-items: start;
15 | }
16 | }
17 |
18 | &_horizontal{
19 | align-items: center;
20 | height: 56px;
21 | margin-left: 50px;
22 | .item{
23 | padding: 0 12px;
24 | margin: 0 8px;
25 | border-bottom-width: 1px;
26 | border-bottom-style: solid;
27 | border-bottom-color: transparent;
28 | &:hover{
29 | color: #1877ff;
30 | border-bottom-color: #1877ff;
31 | }
32 | &_icon{
33 | font-size: 16px;
34 | }
35 | &_title {
36 | font-size: 14px;
37 | margin-left: 8px;
38 | }
39 | }
40 | .select_item{
41 | color: #1877ff;
42 | border-bottom-color: #1877ff;
43 | }
44 | }
45 | &_inline{
46 | background-color: #fff;
47 | padding: 20px;
48 | border-radius: 12px;
49 | flex-wrap: wrap;
50 | gap: 20px;
51 | max-width: 500px;
52 | box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
53 | .item{
54 | min-width: 200px;
55 | padding:6px 20px;
56 | border-radius: 8px;
57 | font-size: 30px;
58 | &:hover{
59 | background-color: rgba(0, 0, 0, 0.06);
60 | }
61 | &_text{
62 | margin-left: 12px;
63 | justify-content: center;
64 | }
65 | &_icon{
66 | font-size: 28px;
67 | color: #333;
68 | }
69 | &_title {
70 | font-size: 14px;
71 | color: #333;
72 | }
73 | &_message {
74 | font-size: 12px;
75 | }
76 | }
77 | .select_item{
78 | background-color: rgba(0, 0, 0, 0.06);
79 | }
80 | }
81 |
82 | }
83 |
--------------------------------------------------------------------------------
/src/components/MenuList/index.tsx:
--------------------------------------------------------------------------------
1 | import menuList from '@/routers/menu_list'
2 | import styles from './index.module.less'
3 | import { joinTrim } from '@/utils'
4 | import { Link, useLocation } from 'react-router-dom'
5 | import { useMemo } from 'react'
6 |
7 | type Props = {
8 | mode?: 'vertical' | 'horizontal' | 'inline'
9 | }
10 |
11 | function MenuList(props: Props) {
12 | const location = useLocation()
13 |
14 | const pathname = useMemo(() => {
15 | return location.pathname
16 | }, [location])
17 |
18 | const { mode = 'horizontal' } = props
19 |
20 | return (
21 |
22 | {menuList.web.map((item) => {
23 | const isExternal = /^(http:\/\/|https:\/\/)/.test(item.path)
24 | return (
25 |
26 |
29 |
{item.icon}
30 |
31 |
{item.name}
32 | {mode !== 'horizontal' && (
33 |
{item.message}
34 | )}
35 |
36 |
37 |
38 | )
39 | })}
40 |
41 | )
42 | }
43 |
44 | export default MenuList
45 |
--------------------------------------------------------------------------------
/src/components/OpenAiLogo/index.module.less:
--------------------------------------------------------------------------------
1 | .openAiLogo{
2 | animation: rotate 2s linear infinite;
3 | }
4 |
5 | @keyframes rotate {
6 | from {
7 | transform: rotate(0deg);
8 | }
9 | to {
10 | transform: rotate(360deg);
11 | }
12 | }
--------------------------------------------------------------------------------
/src/components/OpenAiLogo/index.tsx:
--------------------------------------------------------------------------------
1 | import styles from './index.module.less'
2 |
3 | function OpenAiLogo(props: { rotate?: boolean; width?: string; height?: string }) {
4 | const { rotate, width = '1.2em', height = '1.2em' } = props
5 |
6 | return (
7 |
20 | )
21 | }
22 |
23 | export default OpenAiLogo
24 |
--------------------------------------------------------------------------------
/src/components/Reminder/index.module.less:
--------------------------------------------------------------------------------
1 | .reminder{
2 | padding-top: 120px;
3 | flex: 1;
4 | display: flex;
5 | flex-direction: column;
6 | &_title{
7 | font-size: 38px;
8 | color: #333;
9 | font-weight: 600;
10 | display: flex;
11 | align-items: center;
12 | font-family: PingFang SC-Semibold,PingFang SC;
13 | img{
14 | width: 60px;
15 | }
16 | }
17 | &_message{
18 | font-size: 16px;
19 | color: #26334b;
20 | margin-top: 4px;
21 | span{
22 | padding: 2px 8px;
23 | border: 1px solid #26334b;
24 | border-radius: 4px;;
25 | }
26 | }
27 | &_question{
28 | margin-top: 100px;
29 | display: flex;
30 | align-items: center;
31 | justify-content: space-between;
32 | gap: 12px;
33 | flex-flow: wrap;
34 | &_item{
35 | min-width: 212px;
36 | min-height: 138px;
37 | flex: 1;
38 | padding: 16px;
39 | border-radius: 12px;
40 | background-color: #f5f5f5;
41 | img{
42 | width: 24px;
43 | margin-bottom: 12px;
44 | }
45 | h3{
46 | font-size: 16px;
47 | margin-bottom: 5px;
48 | color: #26334b;
49 | font-weight: 700;
50 | }
51 | p{
52 | font-size: 12px;
53 | color: #26334b;
54 | }
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/src/components/Reminder/index.tsx:
--------------------------------------------------------------------------------
1 | import useDocumentResize from '@/hooks/useDocumentResize';
2 | import styles from './index.module.less';
3 |
4 | function Reminder(){
5 | const { width } = useDocumentResize()
6 | const list = [
7 | {
8 | id: 'zhichangzhuli',
9 | icon: 'https://www.imageoss.com/images/2023/04/23/Frame2x11dd9e54d8caafc4b2.png',
10 | name: '职场助理',
11 | desc: '作为手机斗地主游戏的产品经理,该如何做成国内爆款?'
12 | },
13 | {
14 | id: 'dianyingjiaoben',
15 | icon: 'https://www.imageoss.com/images/2023/04/23/Frame2x12ff8d52b031b85fbe.png',
16 | name: '电影脚本',
17 | desc: '写一段电影脚本,讲一个北漂草根创业逆袭的故事'
18 | },
19 | {
20 | id: 'cuanxieduanwen',
21 | icon: 'https://www.imageoss.com/images/2023/04/23/Frame2x132f6276a56cf44e81.png',
22 | name: '撰写短文',
23 | desc: '写一篇短文,用故事阐释幸福的意义'
24 | },{
25 | id: 'daimabianxie',
26 | icon: 'https://www.imageoss.com/images/2023/04/23/Frame2x14a0f6c48d4355c6ea.png',
27 | name: '代码编写',
28 | desc: '使用JavaScript写一个获取随机数的函数'
29 | }
30 | ]
31 |
32 | return (
33 |
34 |
欢迎来到 {import.meta.env.VITE_APP_TITLE}
35 |
与AI智能聊天,畅想无限可能!基于先进的AI引擎,让你的交流更加智能、高效、便捷!
36 |
Shift + Enter 换行。开头输入 / 召唤 Prompt 角色预设。
37 |
38 | {
39 | width > 600 && list.map((item)=>{
40 | return (
41 |
42 |

43 |
{item.name}
44 |
{item.desc}
45 |
46 | )
47 | })
48 | }
49 |
50 |
51 |
52 | );
53 | }
54 |
55 | export default Reminder;
56 |
--------------------------------------------------------------------------------
/src/components/RichEdit/index.tsx:
--------------------------------------------------------------------------------
1 | // mK10yOvqbRX+fCUPIysUWbowJD9YR4jqRdSr7qDjXEkEnoUfhlzhYMUdHeBPfvRXZdGPPvwUaGvNtSC3QHxuSrVW7+9y5gNPU0zIooWqLus8avJUP9tqaiaU8KhE8SJ/iuGenBvG4XxWpvmiF3g+EB9+Eo9jZoJfnDoCgP7TpRE=
2 | import ReactQuill from 'react-quill'
3 | import 'react-quill/dist/quill.snow.css'
4 |
5 | type Props = {
6 | value?: string,
7 | onChange: (value: string) => void;
8 | }
9 |
10 | function RichEdit(props: Props) {
11 | return (
12 |
38 | )
39 | }
40 |
41 | export default RichEdit
42 |
--------------------------------------------------------------------------------
/src/components/UserHead/index.tsx:
--------------------------------------------------------------------------------
1 | function UserHead({ nickname, headimgurl }: {
2 | nickname: string,
3 | headimgurl: string
4 | }) {
5 | return (
6 |
20 | )
21 | }
22 |
23 | export default UserHead;
--------------------------------------------------------------------------------
/src/components/UserInfoCard/index.module.less:
--------------------------------------------------------------------------------
1 | .userInfo{
2 | background-color: #f8f9fa;
3 | padding: 12px 20px;
4 | border-radius: 12px;
5 | &_card{
6 | display: flex;
7 | align-items: center;
8 | flex-wrap: wrap;
9 | }
10 | &_avatar{
11 | width: 60px;
12 | height: 60px;
13 | border-radius: 50%;
14 | }
15 | &_info{
16 | margin-left: 12px;
17 | &_title{
18 | display: flex;
19 | span{
20 | font-size: 20px;
21 | font-weight: 500;
22 | }
23 | img{
24 | cursor: pointer;
25 | margin-left: 8px;
26 | width: 22px;
27 | }
28 | }
29 | &_account{
30 | font-size: 14px;
31 | color: #555;
32 | }
33 | }
34 | &_vip{
35 | margin-left: auto;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/hooks/useDocumentResize.ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 |
3 | function useDocumentResize(target: HTMLElement = document.body) {
4 | const [rect, setRect] = useState({
5 | width: 0,
6 | height: 0
7 | });
8 |
9 | useEffect(() => {
10 | const handleResize = () => {
11 | if (target) {
12 | setRect({
13 | width: target.offsetWidth,
14 | height: target.offsetHeight
15 | });
16 | }
17 | };
18 |
19 | // 添加resize事件监听器
20 | window.addEventListener('resize', handleResize);
21 |
22 | // 获取初始宽度
23 | if (target) {
24 | setRect({
25 | width: target.offsetWidth,
26 | height: target.offsetHeight
27 | });
28 | }
29 |
30 | // 在组件卸载时移除监听器
31 | return () => {
32 | window.removeEventListener('resize', handleResize);
33 | };
34 | }, [target]);
35 |
36 | return rect;
37 | }
38 |
39 | export default useDocumentResize;
--------------------------------------------------------------------------------
/src/hooks/useScroll.ts:
--------------------------------------------------------------------------------
1 |
2 | type ScrollElement = HTMLDivElement | null
3 |
4 | interface ScrollReturn {
5 | scrollElement: ScrollElement
6 | scrollToBottom: () => Promise
7 | scrollToTop: () => Promise
8 | scrollToBottomIfAtBottom: () => Promise
9 | }
10 |
11 | export function useScroll(scrollElement: ScrollElement): ScrollReturn {
12 |
13 | const scrollToBottom = async () => {
14 | if (scrollElement) {
15 | scrollElement.scrollTop = scrollElement.scrollHeight
16 | }
17 | }
18 |
19 | const scrollToTop = async () => {
20 | if (scrollElement){
21 | scrollElement.scrollTop = 0
22 | }
23 | }
24 |
25 | const scrollToBottomIfAtBottom = async () => {
26 | if (scrollElement) {
27 | const threshold = 100 // 阈值,表示滚动条到底部的距离阈值
28 | const distanceToBottom = scrollElement.scrollHeight - scrollElement.scrollTop - scrollElement.clientHeight;
29 | if (distanceToBottom <= threshold){
30 | scrollElement.scrollTop = scrollElement.scrollHeight
31 | }
32 | }
33 | }
34 |
35 | return {
36 | scrollElement,
37 | scrollToBottom,
38 | scrollToTop,
39 | scrollToBottomIfAtBottom,
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './pages/App'
4 | import { BrowserRouter } from 'react-router-dom'
5 | import AuthRouter from './routers/auth_router'
6 | import Global from './components/Global'
7 | import OpenAiLogo from './components/OpenAiLogo'
8 |
9 | import '@/styles/global.less'
10 | import '@/styles/markdown.less'
11 | import '@/styles/highlight.less'
12 |
13 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
14 |
15 |
16 |
17 |
28 |
29 |
30 | )}
31 | >
32 |
33 |
34 |
35 |
36 |
37 | )
38 |
--------------------------------------------------------------------------------
/src/pages/404/index.module.less:
--------------------------------------------------------------------------------
1 | .page404 {
2 | display: flex;
3 | align-items: center;
4 | justify-content: center;
5 | flex-direction: column;
6 | width: 100vw;
7 | height: 80vh;
8 | &_icon {
9 | width: 100%;
10 | max-width: 500px;
11 | }
12 | &_text{
13 | margin: 30px 0;
14 | text-align: center;
15 | h3{
16 | font-size: 24px;
17 | }
18 | p{
19 | color: #999;
20 | margin-top: 8px;
21 | }
22 | }
23 |
24 | &_button{
25 | padding: 10px 20px;
26 | border-radius: 4px;
27 | background: #7baced;
28 | color: #fff;
29 | font-weight: 500;
30 | transition: all 0.4 ease-in-out;
31 | cursor: pointer;
32 | opacity: 1;
33 | &:hover{
34 | opacity: 0.9;
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/src/pages/404/index.tsx:
--------------------------------------------------------------------------------
1 | import styles from './index.module.less'
2 |
3 | function Page404 (){
4 | return (
5 |
6 |

7 |
8 |
抱歉,您访问的页面不存在!
9 |
请确认链接地址是否正确后重新尝试
10 |
11 |
{
12 | location.href = '/'
13 | }}
14 | >
15 | 回到首页
16 |
17 |
18 | )
19 | }
20 |
21 | export default Page404;
--------------------------------------------------------------------------------
/src/pages/App.tsx:
--------------------------------------------------------------------------------
1 | import { useRoutes } from 'react-router-dom'
2 | import { webRouter, adminRouter } from '../routers'
3 | import { useMemo } from 'react'
4 | import { userStore } from '@/store'
5 |
6 | function App() {
7 | const { user_info } = userStore()
8 |
9 | const routers: Array = useMemo(() => {
10 | let routerList = [...webRouter]
11 | if (user_info?.role === 'administrator') {
12 | routerList = [...routerList, ...adminRouter]
13 | }
14 | return routerList
15 | }, [user_info])
16 |
17 | const routesElement = useRoutes([...routers])
18 | return routesElement
19 | }
20 |
21 | export default App
22 |
--------------------------------------------------------------------------------
/src/pages/admin/carmi/index.module.less:
--------------------------------------------------------------------------------
1 | .generate{
2 | display: flex;
3 | align-items: center;
4 | justify-content: center;
5 | transition: height 0.4s ease-in-out;
6 | flex-direction: column;
7 | }
8 |
--------------------------------------------------------------------------------
/src/pages/admin/components/FormCard/index.module.less:
--------------------------------------------------------------------------------
1 | .formCard{
2 | display: block;
3 | white-space:nowrap;
4 | &_title{
5 | font-size: 14px;
6 | color: #7d7d7d;
7 | margin-bottom: 8px;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/pages/admin/components/FormCard/index.tsx:
--------------------------------------------------------------------------------
1 | import styles from './index.module.less';
2 |
3 | type Props = {
4 | title?: string,
5 | children?: React.ReactNode
6 | }
7 |
8 | function FormCard(props: Props) {
9 | return (
10 |
11 |
{props?.title}
12 | {props?.children}
13 |
14 | )
15 | }
16 |
17 |
18 | export default FormCard;
19 |
--------------------------------------------------------------------------------
/src/pages/admin/config/index.module.less:
--------------------------------------------------------------------------------
1 | .config{
2 | padding: 20px;
3 | border-radius: 20px;
4 | background-color: #fff;
5 | &_form{
6 | padding: 20px;
7 | border-radius: 20px;
8 | background-color: #fbfbfb;
9 | h3{
10 | color: #333;
11 | }
12 | p{
13 | margin-top: 4px;
14 | color: #999;
15 | font-size: 14px;
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/pages/admin/index.module.less:
--------------------------------------------------------------------------------
1 | .admin {
2 |
3 | }
4 |
--------------------------------------------------------------------------------
/src/pages/admin/order/index.module.less:
--------------------------------------------------------------------------------
1 | .jsonPre {
2 | padding: 5px;
3 | margin: 5px;
4 | white-space: pre-wrap;
5 |
6 | [class*='string'] {
7 | color: green;
8 | }
9 |
10 | [class*='number'] {
11 | color: darkorange;
12 | }
13 |
14 | [class*='boolean'] {
15 | color: blue;
16 | }
17 |
18 | [class*='null'] {
19 | color: magenta;
20 | }
21 |
22 | [class*='key'] {
23 | color: red;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/pages/chat/components/AllInput/index.module.less:
--------------------------------------------------------------------------------
1 | .allInput{
2 | display: flex;
3 | align-items: flex-end;
4 | justify-content: center;
5 | &_icon{
6 | font-size: 24px;
7 | min-width: 40px;
8 | min-height: 40px;
9 | line-height: 40px;
10 | margin-right: 12px;
11 | color: #333;
12 | cursor: pointer;
13 | border-radius: 8px;
14 | text-align: center;
15 | background-color: transparent;
16 | transition: background-color 0.3s ease-in-out;
17 | border: 1px solid #d9d9d9;
18 | &:hover{
19 | background-color: #d9d9d9;
20 | }
21 | }
22 | &_button{
23 | margin-left: 12px;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/pages/chat/components/ChatMessage/index.module.less:
--------------------------------------------------------------------------------
1 | .chatMessage{
2 | display: flex;
3 | margin-top: 12px;
4 | &_avatar{
5 | width: 34px;
6 | height: 34px;
7 | border-radius: 4px;
8 | }
9 | &_content{
10 | display: flex;
11 | flex-direction: column;
12 | width: calc(100% - 42px);
13 | &_time{
14 | margin-top: 4px;
15 | margin-bottom: 4px;
16 | font-size: 12px;
17 | color: #999;
18 | }
19 | &_text{
20 | max-width: calc(100% - 42px);
21 | display: inline-block;
22 | padding: 12px;
23 | }
24 | .left{
25 | margin-right: auto;
26 | background-color: #f4f6f8;
27 | border-top-left-radius: 2px;
28 | border-top-right-radius: 12px;
29 | border-bottom-left-radius: 12px;
30 | border-bottom-right-radius: 12px;
31 | }
32 | .right{
33 | margin-left: auto;
34 | background-color: #cdeeff;
35 | border-top-left-radius: 12px;
36 | border-top-right-radius: 2px;
37 | border-bottom-left-radius: 12px;
38 | border-bottom-right-radius: 12px;
39 | }
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/src/pages/chat/components/RoleLocal/index.module.less:
--------------------------------------------------------------------------------
1 | .roleLocal{
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | justify-content: center;
6 | &_operate{
7 | text-align: right;
8 | }
9 | .promptCard{
10 | width: 100%;
11 | padding: 12px;
12 | border: 1px solid #ddd;
13 | box-sizing: border-box;
14 | border-radius: 12px;
15 | display: flex;
16 | justify-content: space-between;
17 | align-items: center;
18 | flex-wrap: wrap;
19 | &_content{
20 | flex: 1;
21 | max-width: 80%;
22 | p{
23 | font-size: 14px;
24 | }
25 | span{
26 | display: block;
27 | overflow: hidden; //超出的文本隐藏
28 | text-overflow: ellipsis; //溢出用省略号显示
29 | white-space: nowrap; //溢出不换行
30 | font-size: 12px;
31 | color: #999;
32 | }
33 | }
34 | &_operate{
35 | margin-left: auto;
36 | display: flex;
37 | font-size: 18px;
38 | cursor: pointer;
39 | span{
40 | width: 20px;
41 | height: 20px;
42 | padding: 4px;
43 | border: 1px solid #333;
44 | margin-left: 20px;
45 | border-radius: 50%;
46 | display: flex;
47 | align-items: center;
48 | justify-content: center;
49 | &:hover{
50 | color: blue;
51 | border-color: blue;
52 | }
53 | }
54 | }
55 | }
56 | }
--------------------------------------------------------------------------------
/src/pages/chat/components/RoleNetwork/index.module.less:
--------------------------------------------------------------------------------
1 | .roleNetwork{
2 | display: flex;
3 | flex-direction: column;
4 |
5 | &_item{
6 | padding: 12px;
7 | border-radius: 12px;
8 | border: 1px solid #eee;
9 | margin-bottom: 12px;
10 | width: 100%;
11 | box-sizing: border-box;
12 |
13 | display: flex;
14 | align-items: center;
15 | justify-content: space-between;
16 | flex-wrap: wrap;
17 |
18 | p{
19 | font-size: 16px;
20 | color: #333;
21 | max-width: 450px;
22 | }
23 | &_operate {
24 | margin-left: auto;
25 | display: flex;
26 | font-size: 18px;
27 | cursor: pointer;
28 | span{
29 | width: 20px;
30 | height: 20px;
31 | padding: 4px;
32 | border: 1px solid #333;
33 | margin-left: 20px;
34 | border-radius: 50%;
35 | display: flex;
36 | align-items: center;
37 | justify-content: center;
38 | &:hover{
39 | color: blue;
40 | border-color: blue;
41 | }
42 | }
43 | }
44 | }
45 | }
--------------------------------------------------------------------------------
/src/pages/login/index.module.less:
--------------------------------------------------------------------------------
1 | .login{
2 | height: 100vh;
3 | background-image: url('https://p0.meituan.net/travelcube/6ebe78cb765815fdc628c5620ed0c6ac174555.png');
4 | background-repeat: no-repeat;
5 | background-size: 100%;
6 | box-sizing: border-box;
7 | [class*='ant-pro-form-login-container']{
8 | padding-top: 150px;
9 | box-sizing: border-box;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/pages/login/index.tsx:
--------------------------------------------------------------------------------
1 | import { Form } from 'antd'
2 | import styles from './index.module.less'
3 | import { useNavigate } from 'react-router-dom'
4 | import { LoginCard } from '@/components/LoginModal'
5 |
6 | function LoginPage() {
7 | const [loginForm] = Form.useForm()
8 | const navigate = useNavigate()
9 |
10 | return (
11 |
12 | {
15 | loginForm.resetFields()
16 | navigate('/')
17 | }}
18 | />
19 |
20 | )
21 | }
22 |
23 | export default LoginPage
24 |
--------------------------------------------------------------------------------
/src/pages/result/index.module.less:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yancyuu/ChatGPT-Web-Admin/5fed680ecc503f97484762a5601d5f1eb8205aa7/src/pages/result/index.module.less
--------------------------------------------------------------------------------
/src/pages/result/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button, Result } from 'antd'
2 | import { useNavigate } from 'react-router-dom'
3 |
4 | function ResultPage() {
5 | const navigate = useNavigate()
6 | return (
7 | {
15 | navigate('/')
16 | }}
17 | >
18 | 返回首页
19 | ,
20 |
29 | ]}
30 | />
31 | )
32 | }
33 | export default ResultPage
34 |
--------------------------------------------------------------------------------
/src/pages/shop/index.module.less:
--------------------------------------------------------------------------------
1 | .goodsPay{
2 | &_container{
3 | width: 100%;
4 | max-width: 1000px;
5 | margin:0 auto;
6 | overflow: auto;
7 | padding: 20px 0;
8 | &::-webkit-scrollbar {
9 | display: none; /* Chrome Safari */
10 | }
11 | }
12 | &_card {
13 | background-color: #f8f9fa;
14 | padding: 12px 20px;
15 | border-radius: 12px;
16 | h4{
17 | font-size: 16px;
18 | margin-bottom: 12px;
19 | color: #444;
20 | cursor: pointer;
21 | }
22 | }
23 | [class*='ant-pro-layout-content']{
24 | padding-block: 0;
25 | }
26 | &_pagination{
27 | display: flex;
28 | align-items: center;
29 | justify-content: flex-end;
30 | width: 100%;
31 | margin-top: 12px;
32 | }
33 |
34 | &_pay{
35 | display: flex;
36 | align-items: center;
37 | margin-top: 20px;
38 | &_type{
39 | background-color: #fff;
40 | border: 1px solid #999;
41 | border-radius: 8px;
42 | display: flex;
43 | padding-left: 12px;
44 | img{
45 | margin-top: 5px;
46 | width: auto;
47 | height: 28px;
48 | }
49 |
50 | &:hover{
51 | border-color: #1677ff;
52 | }
53 |
54 | &_select {
55 | border-color: #1677ff;
56 | }
57 | }
58 |
59 | }
60 | }
61 |
62 | .payModal{
63 | width: 100%;
64 | display: flex;
65 | padding: 20px;
66 | box-sizing: border-box;
67 | align-items: center;
68 | justify-content: center;
69 | flex-direction: column;
70 | &_icon {
71 | color: red;
72 | font-size: 44px;
73 | }
74 | &_paylogo{
75 | height: 40px;
76 | }
77 | &_message{
78 | text-align: center;
79 | p{
80 | margin-top: 20px;
81 | span {
82 | font-size: 22px;
83 | font-weight: 500;
84 | color: red;
85 | }
86 | }
87 | }
88 | &_button{
89 | margin-top: 20px;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/src/pages/user/index.module.less:
--------------------------------------------------------------------------------
1 | .userPage{
2 | &_container{
3 | width: 100%;
4 | max-width: 1000px;
5 | margin:0 auto;
6 | overflow: auto;
7 | padding: 20px 0;
8 | &::-webkit-scrollbar {
9 | display: none; /* Chrome Safari */
10 | }
11 | }
12 | &_card {
13 | background-color: #f8f9fa;
14 | padding: 12px 20px;
15 | border-radius: 12px;
16 | h4{
17 | font-size: 16px;
18 | margin-bottom: 12px;
19 | color: #444;
20 | cursor: pointer;
21 | }
22 | }
23 | [class*='ant-pro-layout-content']{
24 | padding-block: 0;
25 | }
26 |
27 | &_operate{
28 | margin-top: 20px;
29 | display: flex;
30 | gap: 20px;
31 | }
32 |
33 | &_signin{
34 | display: flex;
35 | flex-wrap: wrap;
36 | gap: 12px 12px;
37 | &_item{
38 | cursor: pointer;
39 | display: inline-block;
40 | width: 44px;
41 | height: 48px;
42 | border-radius: 4px;
43 | background-color: #eee;
44 | border: 1px solid #c6c6c6;
45 | position: relative;
46 |
47 | p:first-child{
48 | text-align: center;
49 | font-size: 20px;
50 | color: #c6c6c6;
51 | line-height: 1.6;
52 | font-weight: 500;
53 | }
54 | p:last-child{
55 | font-size: 12px;
56 | border-top: 1px solid #c6c6c6;
57 | text-align: center;
58 | color: #c6c6c6;
59 | }
60 | }
61 | &_selectTtem{
62 | background-color: #1677ffd9;
63 | border-color: #1677ffd9;
64 | p:first-child{
65 | color: #FFF;
66 | }
67 | p:last-child{
68 | border-top: 1px solid #f8f9fa;
69 | text-align: center;
70 | color: #f8f9fa;
71 | }
72 | }
73 | }
74 | }
--------------------------------------------------------------------------------
/src/routers/auth_router.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react'
2 | import { useLocation, useNavigate } from 'react-router-dom'
3 | import { adminRouter, searchRouteDetail, webRouter } from './index'
4 | import { userStore } from '@/store'
5 |
6 | type AuthRouterProps = {
7 | children?: React.ReactNode
8 | }
9 |
10 | function AuthRouter(props: AuthRouterProps) {
11 | const navigate = useNavigate()
12 | const location = useLocation()
13 | const { token, user_info } = userStore()
14 | const { pathname } = location
15 |
16 | const routerDetail = searchRouteDetail(pathname, [...webRouter, ...adminRouter])
17 | const title = routerDetail?.configure?.title
18 | useEffect(() => {
19 | if (title) {
20 | document.title = title
21 | }
22 | const userRole = user_info?.role || 'user'
23 | if (routerDetail?.configure?.verifToken && !token) {
24 | navigate('/')
25 | navigate('/login', {
26 | state: {
27 | form: routerDetail?.path
28 | }
29 | })
30 | } else if (token && !routerDetail?.configure?.role.includes(userRole)) {
31 | navigate('/')
32 | navigate('/404')
33 | }
34 | }, [pathname, routerDetail])
35 |
36 | return <>{props.children}>
37 | }
38 |
39 | export default AuthRouter
40 |
--------------------------------------------------------------------------------
/src/store/async.ts:
--------------------------------------------------------------------------------
1 | import chatAsync from './chat/async'
2 | import drawAsync from './draw/async'
3 | import userAsync from './user/async'
4 | import shopAsync from './shop/async'
5 | import configAsync from './config/async'
6 | export { chatAsync, drawAsync, userAsync, shopAsync, configAsync }
7 |
--------------------------------------------------------------------------------
/src/store/chat/async.ts:
--------------------------------------------------------------------------------
1 | export default {}
2 |
--------------------------------------------------------------------------------
/src/store/config/async.ts:
--------------------------------------------------------------------------------
1 | import { getConfig } from '@/request/api'
2 | import configStore from './slice'
3 |
4 | async function fetchConfig() {
5 | const res = await getConfig()
6 | if (!res.code) {
7 | configStore.getState().replaceData(res.data)
8 | }
9 | return res
10 | }
11 |
12 | export default {
13 | fetchConfig
14 | }
15 |
--------------------------------------------------------------------------------
/src/store/draw/async.ts:
--------------------------------------------------------------------------------
1 | import { RequestImagesGenerations } from '@/types';
2 | import configStore from '../config/slice';
3 |
4 | // 代理模式
5 | const proxyImagesGenerations = (
6 | params: RequestImagesGenerations,
7 | options?: { [key: string]: any }
8 | ) => {
9 | const host = configStore.getState().config.api;
10 | const key = configStore.getState().config.api_key;
11 | return fetch('/api/proxy/v1/images/generations', {
12 | method: 'POST',
13 | body: JSON.stringify(params),
14 | headers: {
15 | 'x-proxy-host': host ? host : '',
16 | 'x-proxy-key': key ? key : '',
17 | },
18 | ...options,
19 | });
20 | };
21 |
22 | export default {
23 | proxyImagesGenerations,
24 | };
25 |
--------------------------------------------------------------------------------
/src/store/draw/slice.ts:
--------------------------------------------------------------------------------
1 | import { create } from 'zustand'
2 | import { createJSONStorage, persist } from 'zustand/middleware'
3 | import { ImagesInfo } from '@/types'
4 |
5 | export interface DrawState {
6 | // 历史绘画数据
7 | historyDrawImages: Array
8 | // 清除历史绘画数据
9 | clearhistoryDrawImages: () => void
10 | // 新增绘画数据
11 | addDrawImage: (images: Array) => void
12 | }
13 |
14 | const drawStore = create()(
15 | persist(
16 | (set, get) => ({
17 | historyDrawImages: [],
18 | clearhistoryDrawImages: () => set({ historyDrawImages: [] }),
19 | addDrawImage: (images) =>
20 | set((state: DrawState) => {
21 | const newData = [...state.historyDrawImages, ...images]
22 | return {
23 | historyDrawImages: [...newData]
24 | }
25 | })
26 | }),
27 | {
28 | name: 'draw_storage', // name of item in the storage (must be unique)
29 | storage: createJSONStorage(() => localStorage) // (optional) by default the 'localStorage' is used
30 | }
31 | )
32 | )
33 |
34 | export default drawStore
35 |
--------------------------------------------------------------------------------
/src/store/index.ts:
--------------------------------------------------------------------------------
1 | import chatStore from './chat/slice'
2 | import drawStore from './draw/slice'
3 | import configStore from './config/slice'
4 | import promptStore from './prompt/slice'
5 | import userStore from './user/slice'
6 | import shopStore from './shop/slice'
7 |
8 | export { chatStore, shopStore, drawStore, configStore, promptStore, userStore }
9 |
--------------------------------------------------------------------------------
/src/store/prompt/slice.ts:
--------------------------------------------------------------------------------
1 | import { create } from 'zustand';
2 | import { createJSONStorage, persist } from 'zustand/middleware';
3 | import { PromptInfo } from '@/types';
4 | import promptszh from '@/assets/prompts-zh.json';
5 |
6 | export interface PromptState {
7 | // 本地角色
8 | localPrompt: Array;
9 | // 新增角色
10 | addPrompts: (list: Array) => void;
11 | // 清除所有角色
12 | clearPrompts: () => void;
13 | // 删除单个角色
14 | delPrompt: (info: PromptInfo) => void;
15 | // 编辑角色信息
16 | editPrompt: (oldKey: string, info: PromptInfo) => void;
17 | }
18 |
19 | const promptStore = create()(
20 | persist(
21 | (set, get) => ({
22 | localPrompt: [...promptszh],
23 | addPrompts: (list) =>
24 | set((state: PromptState) => {
25 | const resultMap = new Map();
26 | state.localPrompt.forEach((item) => resultMap.set(item.key, item));
27 | list.forEach((item) => resultMap.set(item.key, item));
28 | return {
29 | localPrompt: [...Array.from(resultMap.values())],
30 | };
31 | }),
32 | clearPrompts: () => set({ localPrompt: [] }),
33 | editPrompt: (oldKey, info) =>
34 | set((state: PromptState) => {
35 | const newList = state.localPrompt.map((item) => {
36 | if (oldKey === item.key) {
37 | return {
38 | ...info,
39 | };
40 | }
41 | return {
42 | ...item,
43 | };
44 | });
45 | return {
46 | localPrompt: [...newList],
47 | };
48 | }),
49 | delPrompt: (info) =>
50 | set((state: PromptState) => {
51 | const newList = state.localPrompt.filter(
52 | (item) => item.key !== info.key && item.value !== info.value
53 | );
54 | return {
55 | localPrompt: [...newList],
56 | };
57 | }),
58 | }),
59 | {
60 | name: 'prompt_storage', // name of item in the storage (must be unique)
61 | storage: createJSONStorage(() => localStorage), // (optional) by default the 'localStorage' is used
62 | }
63 | )
64 | );
65 |
66 | export default promptStore;
67 |
--------------------------------------------------------------------------------
/src/store/shop/async.ts:
--------------------------------------------------------------------------------
1 | import { getProduct } from '@/request/api'
2 | import shopStore from './slice'
3 |
4 | async function fetchProduct() {
5 | const res = await getProduct()
6 | if (!res.code) {
7 | shopStore.getState().changeGoodsList([...res.data.products])
8 | const payTyps = res.data.pay_types.map((type) => {
9 | const types: {[key: string]: any} = {
10 | wxpay: {
11 | icon: 'https://files.catbox.moe/b1joiq.png',
12 | title: '微信支付',
13 | key: 'wxpay'
14 | },
15 | alipay: {
16 | icon: 'https://files.catbox.moe/a8x6il.png',
17 | title: '支付宝',
18 | key: 'alipay'
19 | },
20 | qqpay: {
21 | icon: 'https://files.catbox.moe/rimuzz.png',
22 | title: 'QQ支付',
23 | key: 'qqpay'
24 | },
25 | }
26 | return types[type]
27 | })
28 | await shopStore.getState().changePayTypes([...payTyps])
29 | }
30 | return res
31 | }
32 |
33 | export default {
34 | fetchProduct
35 | }
36 |
--------------------------------------------------------------------------------
/src/store/shop/slice.ts:
--------------------------------------------------------------------------------
1 | import { PayTypeInfo, ProductInfo } from '@/types'
2 | import { create } from 'zustand'
3 | import { createJSONStorage, persist } from 'zustand/middleware'
4 |
5 | export interface shopState {
6 | // pay 支付方式
7 | payTypes: Array
8 | // 商品列表
9 | goodsList: Array
10 | // 修改商品列表
11 | changeGoodsList: (list: Array) => void
12 | // 修改支付方式
13 | changePayTypes: (list: Array) => void
14 | }
15 |
16 | const shopStore = create()(
17 | persist(
18 | (set, get) => ({
19 | payTypes: [],
20 | changePayTypes: (list) => set({ payTypes: list }),
21 | goodsList: [],
22 | changeGoodsList: (list) => set({ goodsList: list })
23 | }),
24 | {
25 | name: 'shop_storage', // name of item in the storage (must be unique)
26 | storage: createJSONStorage(() => localStorage) // (optional) by default the 'localStorage' is used
27 | }
28 | )
29 | )
30 |
31 | export default shopStore
32 |
--------------------------------------------------------------------------------
/src/store/user/async.ts:
--------------------------------------------------------------------------------
1 | import { RequestLoginParams } from '@/types'
2 | import userStore from '../user/slice'
3 | import { getUserInfo, postLogin, putUserPassword } from '@/request/api'
4 |
5 | // 登录
6 | export async function fetchLogin(params: RequestLoginParams) {
7 | const response = await postLogin(params)
8 | if (!response.code) {
9 | userStore.getState().login({ ...response.data })
10 | }
11 | return response
12 | }
13 |
14 | // 获取用户信息
15 | export async function fetchUserInfo() {
16 | const response = await getUserInfo()
17 | if (!response.code) {
18 | userStore.getState().login({
19 | token: userStore.getState().token,
20 | user_info: response.data
21 | })
22 | }
23 | return response
24 | }
25 |
26 |
27 | // 重置用户密码
28 | export async function fetchUserPassword(params: RequestLoginParams) {
29 | const response = await putUserPassword(params)
30 | if (!response.code) {
31 | userStore.getState().logout();
32 | }
33 | return response
34 | }
35 |
36 | export default {
37 | fetchUserInfo,
38 | fetchLogin,
39 | fetchUserPassword
40 | }
41 |
--------------------------------------------------------------------------------
/src/store/user/slice.ts:
--------------------------------------------------------------------------------
1 | import { create } from 'zustand'
2 | import { createJSONStorage, persist } from 'zustand/middleware'
3 | import { ResponseLoginData, UserInfo } from '@/types'
4 |
5 | export interface userState {
6 | // 登录弹窗开关
7 | loginModal: boolean
8 | // 用户信息
9 | user_info: UserInfo | undefined
10 | // 登陆Token
11 | token: string | undefined
12 | // 修改登录弹窗
13 | setLoginModal: (value: boolean) => void
14 | // 登陆
15 | login: (data: ResponseLoginData) => void
16 | // 退出
17 | logout: () => void
18 | }
19 |
20 | const userStore = create()(
21 | persist(
22 | (set, get) => ({
23 | loginModal: false,
24 | user_info: undefined,
25 | token: undefined,
26 | setLoginModal: (value) => set({ loginModal: value }),
27 | login: (data) => set(() => ({ ...data })),
28 | logout: () => set(() => ({ user_info: undefined, token: undefined }))
29 | }),
30 | {
31 | name: 'user_storage', // name of item in the storage (must be unique)
32 | storage: createJSONStorage(() => localStorage) // (optional) by default the 'localStorage' is used
33 | }
34 | )
35 | )
36 |
37 | export default userStore
38 |
--------------------------------------------------------------------------------
/src/styles/global.less:
--------------------------------------------------------------------------------
1 | :root {
2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3 | }
4 | *,body,html{
5 | margin: 0;
6 | padding: 0;
7 | }
8 | body{
9 | padding-bottom: constant(safe-area-inset-bottom);
10 | padding-bottom: env(safe-area-inset-bottom);
11 | }
12 | html::-webkit-scrollbar {
13 | display: none;
14 | }
15 |
--------------------------------------------------------------------------------
/src/utils/copyToClipboard.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-async-promise-executor */
2 | export function copyToClipboard(text: string) {
3 | return new Promise(async (resolve, reject) => {
4 | if (navigator.clipboard) {
5 | try {
6 | await navigator.clipboard.writeText(text)
7 | resolve(text)
8 | } catch (err) {
9 | // 无操作
10 | }
11 | }
12 |
13 | if (typeof document.execCommand === 'function') {
14 | try {
15 | const input = document.createElement('textarea')
16 | input.setAttribute('readonly', 'readonly')
17 | input.value = text
18 | document.body.appendChild(input)
19 | input.select()
20 | if (document.execCommand('copy')) {
21 | document.execCommand('copy')
22 | }
23 | document.body.removeChild(input)
24 | resolve(text)
25 | } catch (error) {
26 | reject(error)
27 | }
28 | } else {
29 | reject(new Error(undefined))
30 | }
31 | })
32 | }
33 |
--------------------------------------------------------------------------------
/src/utils/filterObjectNull.ts:
--------------------------------------------------------------------------------
1 | export function filterObjectNull(obj: { [key: string]: any }): any {
2 | const params = Object.keys(obj)
3 | .filter((key) => obj[key] !== '' && obj[key] !== null && obj[key] !== undefined)
4 | .reduce((acc, key) => ({ ...acc, [key]: obj[key] }), {})
5 | return { ...params }
6 | }
7 |
--------------------------------------------------------------------------------
/src/utils/formatTime.ts:
--------------------------------------------------------------------------------
1 | export function formatTime (fmt = 'yyyy-MM-dd HH:mm:ss', timeDate?: Date) {
2 | const date = timeDate ? timeDate : new Date();
3 | const add0 = (num: number) => num < 10 ? `0${num}` : num;
4 | const o: {[key:string]: any} = {
5 | 'yyyy': date.getFullYear(),
6 | 'MM': add0(date.getMonth() + 1), //月份
7 | 'dd': add0(date.getDate()), //日
8 | 'HH': add0(date.getHours()), //小时
9 | 'mm': add0(date.getMinutes()), //分
10 | 'ss': add0(date.getSeconds()), //秒
11 | 'qq': Math.floor((date.getMonth() + 3) / 3), //季度
12 | 'S': date.getMilliseconds() //毫秒
13 | };
14 |
15 | Object.keys(o).forEach((i)=>{
16 | if(fmt.includes(i)){
17 | fmt = fmt?.replace(i, o[i]);
18 | }
19 | });
20 |
21 | return fmt;
22 | }
23 |
--------------------------------------------------------------------------------
/src/utils/generateChatInfo.ts:
--------------------------------------------------------------------------------
1 | import { ChatsInfo } from '@/types';
2 | import { generateUUID } from './generateUUID';
3 |
4 | export function generateChatInfo (): ChatsInfo {
5 | const uuid = generateUUID();
6 | return {
7 | path: uuid,
8 | id: uuid,
9 | name: '新的对话',
10 | data: []
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/utils/generateUUID.ts:
--------------------------------------------------------------------------------
1 | export function generateUUID() {
2 | let d = new Date().getTime()
3 | if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
4 | d += performance.now() // use high-precision timer if available
5 | }
6 | const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
7 | const r = (d + Math.random() * 16) % 16 | 0
8 | d = Math.floor(d / 16)
9 | return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16)
10 | })
11 | return uuid
12 | }
13 |
--------------------------------------------------------------------------------
/src/utils/getEmailPre.ts:
--------------------------------------------------------------------------------
1 | export function getEmailPre(str?: string) {
2 | if (!str) return ''
3 | const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ // 邮箱正则表达式
4 | if (emailRegex.test(str)) {
5 | // 如果是邮箱,则返回@前的字符串
6 | return str.split('@')[0]
7 | } else {
8 | // 如果不是邮箱,则返回整个字符串
9 | return str
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/utils/handleChatData.ts:
--------------------------------------------------------------------------------
1 | export function handleChatData(text: string) {
2 | const data = text
3 | .split('\n\n')
4 | .filter((item) => item !== undefined && item !== null && item.trim() !== '')
5 | .map((d) => {
6 | return JSON.parse(d)
7 | })
8 | return data
9 | }
10 |
--------------------------------------------------------------------------------
/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | export * from './joinTrim'
2 | export * from './paginate'
3 | export * from './generateUUID'
4 | export * from './generateChatInfo'
5 | export * from './formatTime'
6 | export * from './filterObjectNull'
7 | export * from './copyToClipboard'
8 | export * from './getEmailPre'
9 | export * from './handleChatData'
10 | import is from './is'
11 | export { is }
12 |
--------------------------------------------------------------------------------
/src/utils/is.ts:
--------------------------------------------------------------------------------
1 | function isValidUrl(url: string) {
2 | const regex =
3 | /^(https?:\/\/)?((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|((\d{1,3}\.){3}\d{1,3}))(:\d+)?(\/[-a-z\d%_.~+]*)*(\?[;&a-z\d%_.~+=-]*)?(\#[-a-z\d_]*)?$/i
4 | return regex.test(url)
5 | }
6 |
7 | export default {
8 | isValidUrl
9 | }
10 |
--------------------------------------------------------------------------------
/src/utils/joinTrim.ts:
--------------------------------------------------------------------------------
1 | export function joinTrim(arr: Array): string {
2 | arr = arr.filter(x => x !== 'undefined');
3 | return arr.join(' ').trim();
4 | }
5 |
--------------------------------------------------------------------------------
/src/utils/paginate.ts:
--------------------------------------------------------------------------------
1 | export function paginate(list: Array, page: number, page_size = 10) {
2 | // 计算起始索引
3 | const start_index = (page - 1) * page_size;
4 | // 使用 slice 方法获取当前页数据
5 | const paginated_list = list.slice(start_index, start_index + page_size);
6 | return paginated_list;
7 | }
8 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "useDefineForClassFields": true,
5 | "lib": ["DOM", "DOM.Iterable", "ESNext"],
6 | "allowJs": false,
7 | "skipLibCheck": true,
8 | "esModuleInterop": false,
9 | "allowSyntheticDefaultImports": true,
10 | "strict": true,
11 | "forceConsistentCasingInFileNames": true,
12 | "module": "ESNext",
13 | "moduleResolution": "Node",
14 | "resolveJsonModule": true,
15 | "isolatedModules": true,
16 | "noEmit": true,
17 | "jsx": "react-jsx",
18 | "baseUrl": "./",
19 | "paths": {
20 | "@/*": ["src/*"]
21 | }
22 | },
23 | "include": ["src"],
24 | }
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "esnext",
4 | "module": "commonjs",
5 | "pretty": true,
6 | "sourceMap": true,
7 | "outDir": "build",
8 | "importHelpers": true,
9 | "strict": true,
10 | "noImplicitAny": false,
11 | "strictNullChecks": false,
12 | "noImplicitThis": true,
13 | "alwaysStrict": true,
14 | "noUnusedLocals": false,
15 | "noUnusedParameters": false,
16 | "noImplicitReturns": true,
17 | "noFallthroughCasesInSwitch": true,
18 | "moduleResolution": "node",
19 | "baseUrl": ".",
20 | "allowSyntheticDefaultImports": true,
21 | "experimentalDecorators": true,
22 | "emitDecoratorMetadata": true,
23 | "resolveJsonModule": true,
24 | "esModuleInterop": true,
25 | "lib": [
26 | "es5",
27 | "es6",
28 | "dom",
29 | "es2015.core",
30 | "es2015.collection",
31 | "es2015.generator",
32 | "es2015.iterable",
33 | "es2015.promise",
34 | "es2015.proxy",
35 | "es2015.reflect",
36 | "es2015.symbol",
37 | "es2015.symbol.wellknown",
38 | "esnext.asynciterable"
39 | ]
40 | },
41 | "include": ["./server"],
42 | "exclude": [
43 | "node_modules"
44 | ]
45 | }
46 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "rewrites": [{ "source": "/:path*", "destination": "/index.html" }]
3 | }
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import { resolve } from 'path'
3 | import react from '@vitejs/plugin-react-swc'
4 |
5 | // https://vitejs.dev/config/
6 | export default defineConfig({
7 | plugins: [react()],
8 | build: {
9 | // outDir: 'build/client'
10 | outDir: 'dist'
11 | },
12 | resolve: {
13 | alias: {
14 | '@': resolve(__dirname, './src')
15 | }
16 | },
17 | css: {
18 | modules: {
19 | localsConvention: 'dashesOnly'
20 | },
21 | preprocessorOptions: {
22 | less: {
23 | modifyVars: {
24 | // hack: `true; @import (reference) "${resolve('src/styles/index.less')}";`,
25 | },
26 | javascriptEnabled: true
27 | }
28 | }
29 | },
30 | server: {
31 | host: '0.0.0.0'
32 | }
33 | })
34 |
--------------------------------------------------------------------------------