├── .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 |
11 | 18 | {nickname} 19 |
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 | --------------------------------------------------------------------------------