初始化
6
.env.development
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# 基础环境变量示例
|
||||||
|
VITE_API_BASE_URL=http://www.yishi.com
|
||||||
|
VITE_API_BASE_URL2=https://s2.siyuguanli.com:9991
|
||||||
|
VITE_API_WS_URL=wss://s2.siyuguanli.com:9993
|
||||||
|
# VITE_API_BASE_URL=https://ckbapi.quwanzhi.com
|
||||||
|
VITE_APP_TITLE=存客宝
|
||||||
6
.env.production
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# 基础环境变量示例
|
||||||
|
VITE_API_BASE_URL=https://ckbapi.quwanzhi.com
|
||||||
|
VITE_API_BASE_URL2=https://s2.siyuguanli.com:9991
|
||||||
|
VITE_API_WS_URL=wss://s2.siyuguanli.com:9993
|
||||||
|
# VITE_API_BASE_URL=http://www.yishi.com
|
||||||
|
VITE_APP_TITLE=存客宝
|
||||||
64
.eslintrc.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
es2021: true,
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
extends: [
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:react/recommended",
|
||||||
|
"plugin:react-hooks/recommended",
|
||||||
|
"plugin:@typescript-eslint/recommended",
|
||||||
|
"plugin:prettier/recommended", // 这个配置会自动处理大部分冲突
|
||||||
|
],
|
||||||
|
parser: "@typescript-eslint/parser",
|
||||||
|
parserOptions: {
|
||||||
|
ecmaFeatures: {
|
||||||
|
jsx: true,
|
||||||
|
},
|
||||||
|
ecmaVersion: 12,
|
||||||
|
sourceType: "module",
|
||||||
|
},
|
||||||
|
plugins: ["react", "react-hooks", "@typescript-eslint", "prettier"],
|
||||||
|
rules: {
|
||||||
|
"prettier/prettier": "error",
|
||||||
|
"react/react-in-jsx-scope": "off",
|
||||||
|
"@typescript-eslint/no-unused-vars": "warn",
|
||||||
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
|
"@typescript-eslint/no-unnecessary-type-constraint": "warn",
|
||||||
|
"react/prop-types": "off",
|
||||||
|
"linebreak-style": "off",
|
||||||
|
"eol-last": "off",
|
||||||
|
"no-empty": "warn",
|
||||||
|
"prefer-const": "warn",
|
||||||
|
// 确保与 Prettier 完全兼容
|
||||||
|
"comma-dangle": "off",
|
||||||
|
"comma-spacing": "off",
|
||||||
|
"comma-style": "off",
|
||||||
|
"object-curly-spacing": "off",
|
||||||
|
"array-bracket-spacing": "off",
|
||||||
|
indent: "off",
|
||||||
|
quotes: "off",
|
||||||
|
semi: "off",
|
||||||
|
"arrow-parens": "off",
|
||||||
|
"no-multiple-empty-lines": "off",
|
||||||
|
"max-len": "off",
|
||||||
|
"space-before-function-paren": "off",
|
||||||
|
"space-before-blocks": "off",
|
||||||
|
"keyword-spacing": "off",
|
||||||
|
"space-infix-ops": "off",
|
||||||
|
"space-in-parens": "off",
|
||||||
|
"space-in-brackets": "off",
|
||||||
|
"object-property-newline": "off",
|
||||||
|
"array-element-newline": "off",
|
||||||
|
"function-paren-newline": "off",
|
||||||
|
"object-curly-newline": "off",
|
||||||
|
"array-bracket-newline": "off",
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
react: {
|
||||||
|
version: "detect",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
27
.gitattributes
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# 设置默认行为,如果core.autocrlf没有设置,Git会自动处理行尾符
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
# 明确指定文本文件使用LF
|
||||||
|
*.js text eol=lf
|
||||||
|
*.jsx text eol=lf
|
||||||
|
*.ts text eol=lf
|
||||||
|
*.tsx text eol=lf
|
||||||
|
*.json text eol=lf
|
||||||
|
*.css text eol=lf
|
||||||
|
*.scss text eol=lf
|
||||||
|
*.html text eol=lf
|
||||||
|
*.md text eol=lf
|
||||||
|
*.yml text eol=lf
|
||||||
|
*.yaml text eol=lf
|
||||||
|
|
||||||
|
# 二进制文件
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.jpeg binary
|
||||||
|
*.gif binary
|
||||||
|
*.ico binary
|
||||||
|
*.svg binary
|
||||||
|
*.woff binary
|
||||||
|
*.woff2 binary
|
||||||
|
*.ttf binary
|
||||||
|
*.eot binary
|
||||||
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
yarn.lock
|
||||||
|
.env
|
||||||
|
.DS_Store
|
||||||
13
.prettierrc
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"semi": true,
|
||||||
|
"trailingComma": "all",
|
||||||
|
"singleQuote": false,
|
||||||
|
"printWidth": 80,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false,
|
||||||
|
"endOfLine": "lf",
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"arrowParens": "avoid",
|
||||||
|
"jsxSingleQuote": false,
|
||||||
|
"quoteProps": "as-needed"
|
||||||
|
}
|
||||||
8
.vite/deps/_metadata.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"hash": "45625a3b",
|
||||||
|
"configHash": "151db3de",
|
||||||
|
"lockfileHash": "e3b0c442",
|
||||||
|
"browserHash": "7201c060",
|
||||||
|
"optimized": {},
|
||||||
|
"chunks": {}
|
||||||
|
}
|
||||||
3
.vite/deps/package.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"type": "module"
|
||||||
|
}
|
||||||
11
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"bradlc.vscode-tailwindcss",
|
||||||
|
"ms-vscode.vscode-typescript-next",
|
||||||
|
"formulahendry.auto-rename-tag",
|
||||||
|
"christian-kohler.path-intellisense",
|
||||||
|
"ms-vscode.vscode-json"
|
||||||
|
]
|
||||||
|
}
|
||||||
45
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"files.eol": "\n",
|
||||||
|
"files.insertFinalNewline": true,
|
||||||
|
"files.trimFinalNewlines": true,
|
||||||
|
"files.trimTrailingWhitespace": true,
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.fixAll.eslint": "explicit",
|
||||||
|
"source.organizeImports": "never"
|
||||||
|
},
|
||||||
|
"eslint.validate": [
|
||||||
|
"javascript",
|
||||||
|
"javascriptreact",
|
||||||
|
"typescript",
|
||||||
|
"typescriptreact"
|
||||||
|
],
|
||||||
|
"eslint.format.enable": false,
|
||||||
|
"[javascript]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[typescript]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[javascriptreact]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[typescriptreact]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[json]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[scss]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[css]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"typescript.preferences.importModuleSpecifier": "relative",
|
||||||
|
"typescript.suggest.autoImports": true,
|
||||||
|
"editor.tabSize": 2,
|
||||||
|
"editor.insertSpaces": true,
|
||||||
|
"editor.detectIndentation": false
|
||||||
|
}
|
||||||
134
devlop.py
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
import os
|
||||||
|
import zipfile
|
||||||
|
import paramiko
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
local_dir = './dist' # 本地要打包的目录
|
||||||
|
zip_name = 'dist.zip'
|
||||||
|
# 上传到服务器的 zip 路径
|
||||||
|
remote_path = '/www/wwwroot/auto-devlop/tkb-wechat/dist.zip' # 服务器上的临时zip路径
|
||||||
|
server_ip = '42.194.245.239'
|
||||||
|
server_port = 6523
|
||||||
|
server_user = 'yongpxu'
|
||||||
|
server_pwd = 'Aa123456789.'
|
||||||
|
# 服务器 dist 相关目录
|
||||||
|
remote_base_dir = '/www/wwwroot/auto-devlop/tkb-wechat'
|
||||||
|
dist_dir = f'{remote_base_dir}/dist'
|
||||||
|
dist1_dir = f'{remote_base_dir}/dist1'
|
||||||
|
dist2_dir = f'{remote_base_dir}/dist2'
|
||||||
|
|
||||||
|
# 美化输出用的函数
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def info(msg):
|
||||||
|
print(f"\033[36m[INFO {datetime.now().strftime('%H:%M:%S')}] {msg}\033[0m")
|
||||||
|
|
||||||
|
def success(msg):
|
||||||
|
print(f"\033[32m[SUCCESS] {msg}\033[0m")
|
||||||
|
|
||||||
|
def error(msg):
|
||||||
|
print(f"\033[31m[ERROR] {msg}\033[0m")
|
||||||
|
|
||||||
|
def step(msg):
|
||||||
|
print(f"\n\033[35m==== {msg} ====" + "\033[0m")
|
||||||
|
|
||||||
|
# 1. 先运行 pnpm build
|
||||||
|
step('Step 1: 构建项目 (pnpm build)')
|
||||||
|
info('开始执行 pnpm build...')
|
||||||
|
ret = os.system('pnpm build')
|
||||||
|
if ret != 0:
|
||||||
|
error('pnpm build 失败,终止部署!')
|
||||||
|
exit(1)
|
||||||
|
success('pnpm build 完成')
|
||||||
|
|
||||||
|
# 2. 打包
|
||||||
|
step('Step 2: 打包 dist 目录为 zip')
|
||||||
|
info('开始打包 dist 目录...')
|
||||||
|
with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:
|
||||||
|
for root, dirs, files in os.walk(local_dir):
|
||||||
|
for file in files:
|
||||||
|
filepath = os.path.join(root, file)
|
||||||
|
arcname = os.path.relpath(filepath, local_dir)
|
||||||
|
zipf.write(filepath, arcname)
|
||||||
|
success('本地打包完成')
|
||||||
|
|
||||||
|
# 3. 上传
|
||||||
|
step('Step 3: 上传 zip 包到服务器')
|
||||||
|
info('开始上传 zip 包...')
|
||||||
|
|
||||||
|
# 获取本地文件大小
|
||||||
|
local_size = os.path.getsize(zip_name)
|
||||||
|
info(f'本地文件大小: {local_size / 1024 / 1024:.2f} MB')
|
||||||
|
|
||||||
|
transport = paramiko.Transport((server_ip, server_port))
|
||||||
|
transport.connect(username=server_user, password=server_pwd)
|
||||||
|
sftp = paramiko.SFTPClient.from_transport(transport)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 如果远程文件已存在,先删除
|
||||||
|
try:
|
||||||
|
sftp.remove(remote_path)
|
||||||
|
info('已删除远程旧文件')
|
||||||
|
except:
|
||||||
|
pass # 文件不存在,忽略
|
||||||
|
|
||||||
|
# 确保远程目录存在
|
||||||
|
remote_dir = os.path.dirname(remote_path)
|
||||||
|
try:
|
||||||
|
sftp.stat(remote_dir)
|
||||||
|
except:
|
||||||
|
error(f'远程目录不存在: {remote_dir}')
|
||||||
|
raise
|
||||||
|
|
||||||
|
# 上传进度回调
|
||||||
|
def progress_callback(transferred, total):
|
||||||
|
percent = (transferred / total) * 100
|
||||||
|
if transferred % (1024 * 1024) == 0 or transferred == total: # 每MB或完成时显示
|
||||||
|
info(f'上传进度: {transferred / 1024 / 1024:.2f}MB / {total / 1024 / 1024:.2f}MB ({percent:.1f}%)')
|
||||||
|
|
||||||
|
# 上传文件
|
||||||
|
sftp.put(zip_name, remote_path, callback=progress_callback, confirm=True)
|
||||||
|
|
||||||
|
# 验证远程文件大小
|
||||||
|
remote_size = sftp.stat(remote_path).st_size
|
||||||
|
info(f'远程文件大小: {remote_size / 1024 / 1024:.2f} MB')
|
||||||
|
|
||||||
|
if remote_size != local_size:
|
||||||
|
raise IOError(f'文件大小不匹配!本地: {local_size}, 远程: {remote_size}')
|
||||||
|
|
||||||
|
success('上传到服务器完成')
|
||||||
|
|
||||||
|
finally:
|
||||||
|
sftp.close()
|
||||||
|
transport.close()
|
||||||
|
|
||||||
|
# 删除本地 dist.zip
|
||||||
|
try:
|
||||||
|
os.remove(zip_name)
|
||||||
|
success('本地 dist.zip 已删除')
|
||||||
|
except Exception as e:
|
||||||
|
error(f'本地 dist.zip 删除失败: {e}')
|
||||||
|
|
||||||
|
# 4. 远程解压并覆盖
|
||||||
|
step('Step 4: 服务器端解压、切换目录')
|
||||||
|
ssh = paramiko.SSHClient()
|
||||||
|
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
ssh.connect(server_ip, server_port, server_user, server_pwd)
|
||||||
|
commands = [
|
||||||
|
f'unzip -oq {remote_path} -d {dist2_dir}', # 静默解压
|
||||||
|
f'rm {remote_path}',
|
||||||
|
f'if [ -d {dist_dir} ]; then mv {dist_dir} {dist1_dir}; fi',
|
||||||
|
f'mv {dist2_dir} {dist_dir}',
|
||||||
|
f'rm -rf {dist1_dir}'
|
||||||
|
]
|
||||||
|
for i, cmd in enumerate(commands, 1):
|
||||||
|
info(f'执行第{i}步: {cmd}')
|
||||||
|
stdin, stdout, stderr = ssh.exec_command(cmd)
|
||||||
|
out, err = stdout.read().decode(), stderr.read().decode()
|
||||||
|
# 只打印非 unzip 命令的输出
|
||||||
|
if i != 1 and out.strip():
|
||||||
|
print(out.strip())
|
||||||
|
if err.strip():
|
||||||
|
error(err.strip())
|
||||||
|
ssh.close()
|
||||||
|
success('服务器解压并覆盖完成,部署成功!')
|
||||||
121
emoji-mapping.json
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
{
|
||||||
|
"face": {
|
||||||
|
"微笑": "smile",
|
||||||
|
"撇嘴": "pout",
|
||||||
|
"色": "lust",
|
||||||
|
"发呆": "daze",
|
||||||
|
"得意": "proud",
|
||||||
|
"流泪": "cry",
|
||||||
|
"害羞": "shy",
|
||||||
|
"闭嘴": "shut-up",
|
||||||
|
"睡": "sleep",
|
||||||
|
"大哭": "sob",
|
||||||
|
"尴尬": "awkward",
|
||||||
|
"发怒": "angry",
|
||||||
|
"调皮": "naughty",
|
||||||
|
"呲牙": "grin",
|
||||||
|
"惊讶": "surprised",
|
||||||
|
"难过": "sad",
|
||||||
|
"囧": "embarrassed",
|
||||||
|
"抓狂": "crazy",
|
||||||
|
"吐": "vomit",
|
||||||
|
"偷笑": "snicker",
|
||||||
|
"愉快": "happy",
|
||||||
|
"白眼": "roll-eyes",
|
||||||
|
"傲慢": "arrogant",
|
||||||
|
"困": "sleepy",
|
||||||
|
"惊恐": "panic",
|
||||||
|
"憨笑": "silly-smile",
|
||||||
|
"悠闲": "relaxed",
|
||||||
|
"咒骂": "curse",
|
||||||
|
"疑问": "question",
|
||||||
|
"嘘": "shush",
|
||||||
|
"晕": "dizzy",
|
||||||
|
"衰": "unlucky",
|
||||||
|
"骷髅": "skull",
|
||||||
|
"敲打": "knock",
|
||||||
|
"再见": "goodbye",
|
||||||
|
"擦汗": "wipe-sweat",
|
||||||
|
"抠鼻": "pick-nose",
|
||||||
|
"鼓掌": "clap",
|
||||||
|
"坏笑": "evil-smile",
|
||||||
|
"右哼哼": "right-hum",
|
||||||
|
"鄙视": "despise",
|
||||||
|
"委屈": "wronged",
|
||||||
|
"快哭了": "about-to-cry",
|
||||||
|
"阴险": "sinister",
|
||||||
|
"亲亲": "kiss",
|
||||||
|
"可怜": "pitiful",
|
||||||
|
"笑脸": "smiley",
|
||||||
|
"生病": "sick",
|
||||||
|
"脸红": "blush",
|
||||||
|
"破涕为笑": "smile-through-tears",
|
||||||
|
"恐惧": "fear",
|
||||||
|
"失望": "disappointed",
|
||||||
|
"无语": "speechless",
|
||||||
|
"嘿哈": "hey-ha",
|
||||||
|
"捂脸": "facepalm",
|
||||||
|
"机智": "smart",
|
||||||
|
"皱眉": "frown",
|
||||||
|
"耶": "yeah",
|
||||||
|
"吃瓜": "eat-melon",
|
||||||
|
"加油": "cheer-up",
|
||||||
|
"汗": "sweat",
|
||||||
|
"天啊": "oh-my-god",
|
||||||
|
"Emm": "emm",
|
||||||
|
"社会社会": "social",
|
||||||
|
"旺柴": "doge",
|
||||||
|
"好的": "ok",
|
||||||
|
"打脸": "slap-face",
|
||||||
|
"哇": "wow",
|
||||||
|
"翻白眼": "eye-roll",
|
||||||
|
"666": "666",
|
||||||
|
"让我看看": "let-me-see",
|
||||||
|
"叹气": "sigh",
|
||||||
|
"苦涩": "bitter",
|
||||||
|
"裂开": "crack",
|
||||||
|
"奸笑": "wicked-smile"
|
||||||
|
},
|
||||||
|
"gesture": {
|
||||||
|
"握手": "handshake",
|
||||||
|
"胜利": "victory",
|
||||||
|
"抱拳": "fist-salute",
|
||||||
|
"勾引": "beckon",
|
||||||
|
"拳头": "fist",
|
||||||
|
"OK": "ok",
|
||||||
|
"合十": "pray",
|
||||||
|
"强": "strong",
|
||||||
|
"拥抱": "hug",
|
||||||
|
"弱": "weak"
|
||||||
|
},
|
||||||
|
"animal": {
|
||||||
|
"猪头": "pig-head",
|
||||||
|
"跳跳": "jump",
|
||||||
|
"发抖": "shiver",
|
||||||
|
"转圈": "spin"
|
||||||
|
},
|
||||||
|
"blessing": {
|
||||||
|
"庆祝": "celebrate",
|
||||||
|
"礼物": "gift",
|
||||||
|
"红包": "red-envelope",
|
||||||
|
"發": "fortune",
|
||||||
|
"福": "blessing",
|
||||||
|
"烟花": "fireworks",
|
||||||
|
"爆竹": "firecrackers"
|
||||||
|
},
|
||||||
|
"other": {
|
||||||
|
"嘴唇": "lips",
|
||||||
|
"爱心": "heart",
|
||||||
|
"心碎": "broken-heart",
|
||||||
|
"啤酒": "beer",
|
||||||
|
"咖啡": "coffee",
|
||||||
|
"蛋糕": "cake",
|
||||||
|
"凋谢": "wither",
|
||||||
|
"菜刀": "knife",
|
||||||
|
"炸弹": "bomb",
|
||||||
|
"便便": "poop",
|
||||||
|
"太阳": "sun",
|
||||||
|
"月亮": "moon",
|
||||||
|
"玫瑰": "rose"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
favicon.ico
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
23
index.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>触客宝</title>
|
||||||
|
<style>
|
||||||
|
html {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<!-- 引入 uni-app web-view SDK(必须) -->
|
||||||
|
<script type="text/javascript" src="/websdk.js"></script>
|
||||||
|
<script
|
||||||
|
charset="utf-8"
|
||||||
|
src="https://map.qq.com/api/gljs?v=1.exp&libraries=service&key=7DZBZ-ZSRK3-QJN3W-O5VTV-4E2P6-7GFYX"
|
||||||
|
></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
7769
package-lock.json
generated
Normal file
56
package.json
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"name": "cunkebao",
|
||||||
|
"version": "3.0.0",
|
||||||
|
"license": "MIT",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"dependencies": {
|
||||||
|
"@ant-design/icons": "^5.6.1",
|
||||||
|
"@sentry/react": "^10.29.0",
|
||||||
|
"@tanstack/react-query": "^5.90.12",
|
||||||
|
"antd": "^5.13.1",
|
||||||
|
"antd-mobile": "^5.39.1",
|
||||||
|
"antd-mobile-icons": "^0.3.0",
|
||||||
|
"axios": "^1.6.7",
|
||||||
|
"dayjs": "^1.11.13",
|
||||||
|
"dexie": "^4.2.0",
|
||||||
|
"echarts": "^5.6.0",
|
||||||
|
"echarts-for-react": "^3.0.2",
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-dom": "^18.2.0",
|
||||||
|
"react-router-dom": "^6.20.0",
|
||||||
|
"react-window": "^1.8.11",
|
||||||
|
"vconsole": "^3.15.1",
|
||||||
|
"xmldom": "^0.6.0",
|
||||||
|
"zustand": "^5.0.6"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^24.0.14",
|
||||||
|
"@types/react": "^19.1.8",
|
||||||
|
"@types/react-dom": "^19.1.6",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^7.7.0",
|
||||||
|
"@typescript-eslint/parser": "^7.7.0",
|
||||||
|
"@vitejs/plugin-react": "^4.6.0",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"eslint-config-prettier": "^9.1.0",
|
||||||
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
|
"eslint-plugin-react": "^7.34.1",
|
||||||
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
|
"postcss": "^8.4.38",
|
||||||
|
"postcss-pxtorem": "^6.0.0",
|
||||||
|
"prettier": "^3.2.5",
|
||||||
|
"sass": "^1.75.0",
|
||||||
|
"typescript": "^5.4.5",
|
||||||
|
"vite": "^7.0.5"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"dev": "pnpm vite",
|
||||||
|
"build": "pnpm vite build",
|
||||||
|
"build:check": "tsc && pnpm vite build",
|
||||||
|
"preview": "pnpm vite preview",
|
||||||
|
"lint": "eslint src --ext .js,.jsx,.ts,.tsx --fix",
|
||||||
|
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,scss,css}\"",
|
||||||
|
"lint:check": "eslint src --ext .js,.jsx,.ts,.tsx",
|
||||||
|
"format:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx,json,scss,css}\""
|
||||||
|
}
|
||||||
|
}
|
||||||
5144
pnpm-lock.yaml
generated
Normal file
8
postcss.config.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
"postcss-pxtorem": {
|
||||||
|
rootValue: 16,
|
||||||
|
propList: ["*"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
BIN
public/assets/animal/jump.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
public/assets/animal/pig-head.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
public/assets/animal/shiver.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
public/assets/animal/spin.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
public/assets/blessing/blessing.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
public/assets/blessing/celebrate.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
public/assets/blessing/firecrackers.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
public/assets/blessing/fireworks.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
public/assets/blessing/fortune.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/blessing/gift.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/blessing/red-envelope.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
public/assets/face/666.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
public/assets/face/Emm.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/assets/face/about-to-cry.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/angry.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/arrogant.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/awkward.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/bitter.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
public/assets/face/blush.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/cheer-up.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/assets/face/clap.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
public/assets/face/crack.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/crazy.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/crying.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
public/assets/face/curse.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/daze.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/despise.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
public/assets/face/disappointed.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/dizzy.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
public/assets/face/doge.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/eat-melon.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/assets/face/embarrassed.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/evil-smile.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/eye-roll.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
public/assets/face/facepalm.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/fear.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/frown.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/good.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/goodbye.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
public/assets/face/grin.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
public/assets/face/happy.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/hey-ha.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
public/assets/face/kiss.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/knock.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/leisurely.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
public/assets/face/let-me-see.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/lustful.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/naughty.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/oh-my.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/panic.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
public/assets/face/pick-nose.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/pitiful.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
public/assets/face/pout.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
public/assets/face/question.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/right-hum.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/roll-eyes.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/sad.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/shush.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
public/assets/face/shut-up.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
public/assets/face/shy.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/sick.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
public/assets/face/sigh.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
public/assets/face/silly-smile.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/assets/face/sinister.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/skull.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
public/assets/face/slap-face.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/sleep.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/sleepy.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/assets/face/sly-smile.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/assets/face/smart.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
public/assets/face/smile.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/smiley.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/smug.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
public/assets/face/snicker.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/social.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
public/assets/face/speechless.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/assets/face/surprised.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/assets/face/sweat.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
public/assets/face/tears-to-smile.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/assets/face/unlucky.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/vomit.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/assets/face/wail.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |