数字我 Digital Me:全量入库(大文件走 Git LFS)
nginx serve /uploads direct (audio speed) / patch-nginx (push) Failing after 1m34s

This commit is contained in:
2026-10-10 16:24:43 +08:00
commit 0593ff7e62
1893 changed files with 361723 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
node_modules
dist
.env
.git
.gitignore
*.log
test
AGENTS.md
tsconfig.tsbuildinfo
+2
View File
@@ -0,0 +1,2 @@
# Backend API base. Defaults to http://localhost:3701 in dev.
VITE_API_BASE_URL=http://localhost:3701
+5
View File
@@ -0,0 +1,5 @@
node_modules/
dist/
.env
*.log
tsconfig.tsbuildinfo
+1
View File
@@ -0,0 +1 @@
registry=https://registry.npmjs.org/
+32
View File
@@ -0,0 +1,32 @@
# Repository Guidelines
## Project Structure & Module Organization
This is a Vue 3 and TypeScript single-page application built with Vite. Application code lives in `src/`: route-level screens are in `src/views/`, reusable Vue components in `src/components/`, Pinia stores in `src/stores/`, composables in `src/composables/`, shared logic in `src/lib/`, and static domain content in `src/data/` and `src/content/`. Global styling is in `src/styles.css`; theme-specific CSS is under `src/lib/`. Public files belong in `public/`. Tests live in `test/`, while generated output in `dist/` must not be edited or committed.
## Build, Test, and Development Commands
Use Node.js 20 or newer and install the locked dependency set with `npm ci`.
- `npm run dev` starts Vite at `http://localhost:5173`.
- `npm run type-check` runs `vue-tsc` without emitting files.
- `npm run build` type-checks and creates the production bundle in `dist/`.
- `npm run build:fast` builds without the TypeScript gate; reserve it for quick local checks.
- `npm run preview` serves the built bundle locally.
- `node --experimental-strip-types --test test/*.test.ts` runs the current Node test suite (there is no `npm test` script yet).
## Coding Style & Naming Conventions
Follow the existing style: two-space indentation, semicolons, single-quoted TypeScript strings, and Vue Single-File Components using `<script setup lang="ts">`. Name components and views in PascalCase (`CareerPathGraph.vue`), composables with a `use` prefix (`useLoginGate.ts`), and functions or stores in camelCase. Prefer the `@/` alias for imports from `src/`. Reuse Tailwind tokens defined in `tailwind.config.js`; keep component-only CSS scoped. No formatter or linter is configured, so preserve nearby formatting and rely on type-checking.
## Testing Guidelines
Tests use `node:test` and `node:assert/strict`. Add focused files named `*.test.ts` under `test/`, mirror the domain module being tested, and isolate browser APIs with small in-memory stubs. Run tests and `npm run type-check` before opening a pull request. No coverage threshold is currently configured.
## Commit & Pull Request Guidelines
Git history is absent from this checkout, so no project-specific message convention can be inferred. Use short, imperative subjects, optionally with a conventional prefix such as `feat:`, `fix:`, or `test:`. Pull requests should explain user-visible impact, list verification commands, link the relevant issue, and include before/after screenshots for UI changes. Keep generated files and unrelated refactors out of the change.
## Configuration & Security
Copy `.env.example` to `.env` and set `VITE_API_BASE_URL` for the backend. Never commit `.env`, credentials, tokens, or production API endpoints; remember that all `VITE_` values are exposed to browser code.
+36
View File
@@ -0,0 +1,36 @@
FROM node:20-alpine AS dependencies
WORKDIR /app
COPY package.json package-lock.json .npmrc ./
RUN npm ci
FROM dependencies AS development
COPY . .
ENV NODE_ENV=development
EXPOSE 5173
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]
FROM dependencies AS build
COPY . .
ARG VITE_API_BASE_URL=http://localhost:3701
ENV VITE_API_BASE_URL=${VITE_API_BASE_URL}
RUN npm run build
FROM nginx:1.27-alpine AS runtime
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --quiet --spider http://127.0.0.1/ || exit 1
CMD ["nginx", "-g", "daemon off;"]
@@ -0,0 +1,299 @@
# 数字我·天下:缘起、铸身、照命交接文档
更新时间:2026-08-28
项目目录:
```text
C:\Users\Administrator\Desktop\无字卷_整合版\digital-me-history\digital-me-web
```
## 1. 当前目标与设计结论
当前主流程为:
```text
缘起 → 铸身 → 照命 → 入局 → 回响 → 传世
```
缘起、铸身、照命已经完成一轮视觉整合。当前统一标准为:
- 米黄宣纸与羊皮纸底色。
- 深褐正文、暗红朱印、哑金线框。
- 宋体与历史画卷式排版。
- 全宽章节舞台,不再使用嵌入式演示卡片的视觉结构。
- 顶部统一显示“未完之地 · 时史”及六章导航。
- 保留缘起的叙事感,同时保留铸身和照命已经验收的核心交互。
后续不要重新设计整套画风。优化应以排版、衔接、细节和交互流畅度为主。
架构结论:这三章不是另做的独立站点,而是直接接替 `digitme.cn` 原项目中的正式模块位置;必须保留原项目游客、登录分身、入局和传世的上下游链路。
## 2. 页面入口
```text
缘起:http://127.0.0.1:5173/menmian?start=1
铸身:http://127.0.0.1:5173/shishi/zhushen
照命:http://127.0.0.1:5173/shishi/zhaoming
独立命盘验收页:http://127.0.0.1:5173/zhaoming-wheel
```
正式路由定义位于:
```text
src/router.ts
```
## 3. 本轮完成的章节衔接
此前的主要问题:
- 缘起是全屏叙事页面。
- 铸身与照命受到全站 `.tx-big` 的 `zoom: 1.4` 和预缩宽度影响。
- 后两章像被塞进网页里的演示截图,纸面宽度、标题尺度和顶部起点与缘起不一致。
- 翻章后视觉上像进入另一个项目。
当前修正:
- 缘起、铸身、照命使用同一连续舞台。
- 三页统一纸张宽度、顶部起点和章节导航基线。
- 这三页不再使用旧的预缩放大逻辑。
- 铸身与照命移除最外层悬浮卡片阴影,保留内部纸面层级。
- 缘起增加与后两章一致的六章导航。
- 缘起身份卡后增加“第一章已落定 / 下一章 · 铸身”翻章提示。
- 路由进入仅保留短促的透明度和纵向位移动效。
- `prefers-reduced-motion` 下关闭翻章动效。
相关文件:
```text
src/App.vue
src/views/Menmian.vue
src/components/shishi/ChapterShell.vue
src/assets/life-chapter-continuity.css
```
## 4. 缘起当前状态
正式组件:
```text
src/views/Menmian.vue
src/components/shishi/HistoricalIdentityCard.vue
```
当前保留内容:
- 王莽序章与历史叙事。
- 现代职业输入和职业选择。
- 历朝身份推演。
- 第一份命格与历史人物题像。
- 身份卡保存、分享和复制判词。
- 进入铸身的正式入口。
视觉衔接新增内容:
- 顶部六章导航。
- 与铸身、照命一致的纸面宽度。
- 身份卡之后的翻章提示。
不要删除人物题像。铸身最终生成的人物名帖会继续读取缘起中选择的朝代画像。
## 5. 铸身当前状态
正式页面与组件:
```text
src/views/shishi/Zhushen.vue
src/components/shishi/ZhushenForgeBoard.vue
```
主要样式:
```text
src/assets/accepted-scroll-design.css
src/assets/shishi-polish.css
src/assets/life-chapter-continuity.css
```
铸身四笔:
```text
第一笔:本事
第二笔:性情
第三笔:分量
第四笔:来处
```
已经保留并验证的交互:
- 本事签牌选择和翻轮。
- 性情签牌选择。
- 七项分量逐项循环选择程度。
- 来处台座选择。
- 每次选择与中心铸炉进度联动。
- “铸胚 · n/4 笔成形”进度反馈。
- 四笔完成后的合炉定身。
- 人物名帖展示缘起题像。
- 人物名帖进入照命。
绝对不要回退:
- 不要改回现代下拉框。
- 不要恢复蓝色选中态。
- 不要把七项分量合并成单个选择。
- 不要恢复之前的大面积廉价橙色火焰遮罩。
- 不要删除中心铸炉或人物名帖。
## 6. 照命当前状态
正式页面与组件:
```text
src/views/Verdict.vue
src/components/shishi/ZhaomingWheelBoard.vue
```
独立验收页:
```text
src/views/shishi/WheelLab.vue
```
正式资源:
```text
public/assets/zhaoming-wheel-chronicle-v2.png
public/assets/zhaoming-pointer-v2.png
public/assets/zhaoming-wheel-reference.png
public/assets/zhaoming-landscape-bg-v2.png
public/assets/zhaoming-exact.png
```
当前命盘规则:
- 命盘外圈共有 30 个手绘格子。
- 30 格不是数学平均等分。
- `ZhaomingWheelBoard.vue` 中的 `slotCenters` 是逐格校准后的真实中线。
- 指针固定在上方,外圈命盘旋转。
- 每次停止必须吸附到单个格子的中线。
- 中心显示当前朝代和“当前照命”。
- 方向键、上一朝、下一朝和拖拽均可切换朝代。
- 当前选中格只使用底图已有的格子高亮效果。
绝对不要回退:
- 不要把 30 格改成平均等分。
- 不要重画指针。
- 不要给指针尾端增加方框、扇形框或半个铆钉。
- 不要在格子外叠加额外矩形选中框。
- 不要恢复旧轮盘组件。
- 不要把正式朝代参数从 path 挪到 query。
正式朝代选择沿用原项目 path:
```text
/shishi/zhaoming/朝代ID
/twin/分身ID/verdict/朝代ID
```
`App.vue` 为同一游客照命、同一分身照命提供稳定 `RouterView key`,`router.ts` 同时保持切朝时的滚动位置。因此 path 可以正常变化并保留正式深链语义,但页面不会整页重新挂载或闪烁。
旧的 `?dyn=朝代ID` 只做兼容:打开后自动改写为正式 path,不再生成新的 query 朝代链接。
## 7. 照命保留的正式业务
新命盘只替换了表现形式,没有删除正式业务:
- 最得时、最逆时、另一种命三张结果卡。
- 登录用户 compare 数据。
- 游客 preview 数据。
- 朝代判词、品级、入仕路径和史料依据。
- 出身选择。
- 制度详情和朝代展开内容。
- 进入入局的正式流程。
- 无障碍 slider 语义与键盘控制。
## 8. 已完成验证
生产构建:
```text
Vite v6.4.3
✓ 1991 modules transformed
✓ built in 8.07s
```
浏览器实测:
```text
铸身“文采·细腻”签牌:aria-pressed 可正常切换
照命方向键:刘宋 → 南朝
转盘中心朝代、右侧结果与选择同步更新
照命正式地址:/shishi/zhaoming/朝代ID
同一照命切朝:页面实例复用、滚动位置保持
铸身“三 · 照命”导航:正确进入 /shishi/zhaoming
缘起、铸身、照命:同一纸张宽度与顶部章节导航
```
测试时临时切换的“文采·细腻”已经恢复到测试前的选中状态。
## 9. 已知工程状态
Vite 生产构建通过。
仓库完整 `vue-tsc --noEmit` 仍可能报告此前已有的模板空值收窄警告,主要位置:
```text
src/views/shishi/Zhushen.vue:guestProf、mbtiPersona
src/views/Verdict.vue:selKaiguo、jinSides
```
这些不是本轮连续舞台或命盘产生的问题。若下一会话要处理,应单独修复,不要借此重写页面。
## 10. 工作区安全注意事项
当前工作区已有多批未提交修改与资源文件。
禁止操作:
```text
git reset --hard
git checkout -- .
批量删除未跟踪文件
把全部工作区无差别覆盖成远端版本
```
后续修改前应先查看具体文件,保留用户已有改动。
## 11. 后续优化建议
优先顺序:
1. 在 1280、1440、1920 三档检查纸面宽度和命盘详情布局。
2. 检查缘起身份卡进入铸身时的人物画像是否正确继承。
3. 优化铸身四笔切换的细小动效,不改变签牌形状和字段。
4. 检查照命拖拽在触摸屏上的吸附手感。
5. 单独清理 Vue 模板空值警告。
不要重新生成命盘底图,不要重新设计铸炉,不要改变已经确定的古风色板。
## 12. 新会话可直接复制的开场说明
```text
请先完整阅读交接文档:
C:\Users\Administrator\Desktop\无字卷_整合版\digital-me-history\digital-me-web\docs\HANDOFF-2026-08-27-YUANQI-ZHUSHEN-ZHAOMING.md
项目目录:
C:\Users\Administrator\Desktop\无字卷_整合版\digital-me-history\digital-me-web
请先打开并对照:
http://127.0.0.1:5173/menmian?start=1
http://127.0.0.1:5173/shishi/zhushen
http://127.0.0.1:5173/shishi/zhaoming
http://127.0.0.1:5173/zhaoming-wheel
当前缘起、铸身、照命已经完成连续舞台整合。铸身核心交互和照命命盘已经定稿。
不要重做命盘,不要重画指针,不要增加选中框,不要把 30 格改成平均等分,不要把铸身改回现代下拉框。
先确认现状,再按照我的下一条具体要求继续。
```
@@ -0,0 +1,364 @@
# 缘起到照命:前端路由流程
> 更新时间:2026-08-28
> 范围:完整项目入口、第一章「缘起」、第二章「铸身」、第三章「照命」
> 权威配置:`src/router.ts`
这三个新页面不是独立项目,也没有另起一套路由;它们直接接替 `digitme.cn` 原项目中缘起、铸身、照命的正式位置。
## 1. 当前主流程
```text
打开完整项目
/
│
└─ 六章总入口
│
└─ 进入第一章
/menmian?start=1
第一章 · 缘起
│
├─ 选择主业、第二擅长、性情
├─ 推演历朝结果
└─ 继续这一生 · 把我铸完整
/shishi/zhushen
第二章 · 铸身
│
├─ 本事
├─ 性情
├─ 分量
├─ 来处
└─ 持此身,进入照命
├─ 游客:/shishi/zhaoming
└─ 已登录分身:/twin/:id/verdict
第三章 · 照命
```
## 2. 路由总表
| 阶段 | 地址 | 路由名 | 页面组件 | 说明 |
|---|---|---|---|---|
| 完整项目首页 | `/` | `shishi` | `src/views/ShishiHome.vue` | 六章总入口,不被本分支替换 |
| 缘起 | `/menmian` | `menmian` | `src/views/Menmian.vue` | 第一章正文;加 `?start=1` 时先显示无字卷序幕 |
| 旧六章目录地址 | `/shishi` | 无 | 无 | 兼容地址,重定向到 `/` |
| 铸身 | `/shishi/zhushen` | `shishi-zhushen` | `src/views/shishi/Zhushen.vue` | 第二章;游客和登录用户共用 |
| 游客照命 | `/shishi/zhaoming/:dynasty?` | `zhaoming-guest` | `src/views/Verdict.vue` | 第三章;无分身也可进入 |
| 分身照命 | `/twin/:id/verdict/:dynasty?` | `verdict` | `src/views/Verdict.vue` | 登录分身使用,带分身 ID |
## 3. 完整项目首页与分支入口
### 地址
```text
/
```
### 当前行为
根地址继续渲染完整项目原有的六章总入口:
```text
/
```
我们的新流程不占用根地址。从总入口选择第一章「缘起」后才进入:
```text
/menmian?start=1
```
旧六章目录地址继续兼容:
```text
/shishi → /
```
## 4. 第一章:缘起
### 标准入口
```text
/menmian?start=1
```
### 可用查询参数
| 参数 | 示例 | 作用 |
|---|---|---|
| `start` | `?start=1` | 先显示无字卷序幕;用户点击后进入缘起正文 |
| `q` | `?q=医生` | 预填当前职业,并尝试映射职业签 |
可以组合:
```text
/menmian?start=1&q=医生
```
### 页面内流程
1. 进入无字卷序幕。
2. 点击继续,隐藏序幕并回到缘起正文顶部。
3. 选择主业。
4. 可补充第二擅长和性情。
5. 点击推演,生成历朝身份对照。
6. 推演成功后调用 `shishi.markYuanqi()`,标记缘起已阅。
7. 把以下草稿写入本机 `localStorage`:
```text
key: yuanqi_draft
profId 主业 ID
profName 主业名称
portraitDynasty 缘起题像朝代
chipTalents 第二擅长
chipTraits 性情
```
8. 点击“继续这一生 · 把我铸完整”进入:
```text
/shishi/zhushen
```
### 顶部导航
```text
一 · 缘起 当前页
二 · 铸身 /shishi/zhushen
三 · 照命 /shishi/zhaoming
四 · 入局 /shishi/ruju
六 · 传世 /shishi/chuanshi
```
## 5. 第二章:铸身
### 地址
```text
/shishi/zhushen
```
### 数据承接
铸身页会读取缘起写下的 `yuanqi_draft`,用于回显或补齐:
- 主业
- 第二擅长
- 性情
- 缘起题像朝代
游客铸身的稳定本地状态写入:
```text
key: shishi.guest.zhushen
```
### 页面内四步
```text
1 · 本事
2 · 性情
3 · 分量
4 · 来处
```
四步完成后合炉定身,显示人物名帖。
### 进入照命的分支
铸身页根据是否存在当前分身 ID 生成不同目标地址。
#### 游客
```text
/shishi/zhaoming
```
#### 已登录且有分身
```text
/twin/:id/verdict
```
例如:
```text
/twin/abc123/verdict
```
### 顶部导航
```text
一 · 缘起 /menmian?start=1
二 · 铸身 当前页
三 · 照命 /shishi/zhaoming
四 · 入局 /shishi/ruju
六 · 传世 /shishi/chuanshi
```
## 6. 第三章:照命
照命的游客版和分身版都复用:
```text
src/views/Verdict.vue
```
### 游客地址
```text
/shishi/zhaoming
```
可选 path 参数:
```text
/shishi/zhaoming/:dynasty?
```
例如:
```text
/shishi/zhaoming/nanchao
```
### 分身地址
```text
/twin/:id/verdict
```
可选朝代 path 参数:
```text
/twin/:id/verdict/:dynasty?
```
例如:
```text
/twin/abc123/verdict/nanchao
```
### 正式朝代参数
朝代沿用原项目的 path 参数:
```text
/shishi/zhaoming/:dynasty?
/twin/:id/verdict/:dynasty?
```
例如:
```text
/shishi/zhaoming/nanchao
/twin/abc123/verdict/nanchao
```
命盘连续切换朝代时使用 `router.replace()` 更新 path 参数:
- 保留原项目可复制、可回退的正式地址
- `App.vue` 对同一游客照命或同一分身照命使用稳定 `RouterView key`,不重新挂载整个页面
- 不制造大量浏览器历史记录
- `router.ts` 对同一照命页的朝代切换保持滚动位置
此前短暂生成过的 `?dyn=朝代ID` 链接只作为兼容入口;页面打开后会自动归一到正式 path,不再继续生成 query 形式的新链接。
### 其他查询参数
照命页会保留并向后传递现有 query,例如:
| 参数 | 作用 |
|---|---|
| `tier` | 当前位阶 |
| `twin` | 当前分身 ID |
| `chushen` | 选定的出身分支 |
### 从照命返回
```text
返回缘起:/menmian?start=1
返回铸身:/shishi/zhushen
```
### 从照命继续
游客点击“展开这朝命局”后,进入入局流程:
```text
/ruju/:code/:year?tier=...&dyn=...
```
登录分身点击后,先创建或续接一部传,再进入:
```text
/twin/:id/lineage/:lid
```
如果创建时已经直接成传,则进入:
```text
/twin/:id/zhuan/:lid
```
## 7. 游客与登录分身的区别
| 环节 | 游客 | 登录分身 |
|---|---|---|
| 缘起 | `/menmian?start=1` | `/menmian?start=1` |
| 铸身 | `/shishi/zhushen` | `/shishi/zhushen` |
| 铸身数据 | `localStorage` | 分身数据与接口 |
| 照命 | `/shishi/zhaoming` | `/twin/:id/verdict` |
| 照命计算 | 游客铸身预览数据 | 当前分身画像 |
| 展开命局 | 进入游客入局 | 创建或续接一部传 |
## 8. 推荐验收地址
```text
# 完整项目首页,应该显示六章总入口
http://127.0.0.1:5173/
# 我们分支的正式起点:缘起无字卷序幕
http://127.0.0.1:5173/menmian?start=1
# 带职业预填的缘起入口
http://127.0.0.1:5173/menmian?start=1&q=医生
# 铸身
http://127.0.0.1:5173/shishi/zhushen
# 照命
http://127.0.0.1:5173/shishi/zhaoming
# 指定朝代的照命
http://127.0.0.1:5173/shishi/zhaoming/nanchao
# 旧六章目录兼容地址,应该回到完整项目首页
http://127.0.0.1:5173/shishi
```
## 9. 相关代码
```text
src/router.ts
src/views/Menmian.vue
src/views/shishi/Zhushen.vue
src/views/Verdict.vue
src/components/shishi/ZhushenForgeBoard.vue
src/components/shishi/ZhaomingWheelBoard.vue
src/lib/shishi.ts
```
## 10. 路由修改原则
后续调整这段流程时应保持:
1. `/` 始终保留完整项目的六章总入口,不能被本分支覆盖。
2. `/menmian?start=1` 始终是「缘起 → 铸身 → 照命」分支的正式起点。
3. `/shishi` 作为旧目录兼容地址回到 `/`。
4. 游客照命继续使用 `/shishi/zhaoming`。
5. 分身照命继续使用 `/twin/:id/verdict`。
6. 朝代始终使用 `/:dynasty` path;通过稳定 `RouterView key` 避免同一照命页重挂。
7. 缘起写入的 `yuanqi_draft` 必须继续被铸身读取。
8. 铸身到照命必须保留游客和登录分身两条分支。
+22
View File
@@ -0,0 +1,22 @@
<!doctype html>
<!-- build: 2026-07-22 修部署目录判定(不再猜、发布后自检) + 全批史诗修复上线 -->
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="theme-color" content="#0c0b0a" />
<title>数字我 · 天下|你的历史第二人生</title>
<meta name="description" content="如果你生在古代,最终会活成谁?沿真实历史规则走完六章,带走《我的传》、官职照、主题曲与合传。" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="数字我 · 天下" />
<meta property="og:title" content="数字我 · 天下|你的历史第二人生" />
<meta property="og:description" content="正史是世界规则,传主是你。走完一生,带走属于你的历史作品。" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="数字我 · 天下|你的历史第二人生" />
<meta name="twitter:description" content="正史是世界规则,传主是你。走完一生,带走属于你的历史作品。" />
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
+66
View File
@@ -0,0 +1,66 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
client_max_body_size 100m;
location = /health {
proxy_pass http://backend:3701/health;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api/ {
proxy_pass http://backend:3701;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /uploads/ {
proxy_pass http://backend:3701;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location = /widget.js {
proxy_pass http://backend:3701/widget.js;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ ^/(zuopin|qa)/ {
proxy_pass http://backend:3701;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /assets/ {
try_files $uri =404;
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
try_files $uri $uri/ /index.html;
}
}
+3911
View File
File diff suppressed because it is too large Load Diff
+46
View File
@@ -0,0 +1,46 @@
{
"name": "digital-me-web",
"version": "0.1.0",
"description": "数字我 / Digital Me — 有脸有声音有知识库的另一个你",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "vue-tsc -b && vite build",
"build:fast": "vite build",
"test": "vitest run",
"preview": "vite preview",
"type-check": "vue-tsc --noEmit"
},
"dependencies": {
"@fontsource/fraunces": "^5.2.9",
"@fontsource/noto-serif-sc": "^5.2.9",
"axios": "^1.7.9",
"d3-force": "^3.0.0",
"lucide-vue-next": "^0.460.0",
"pinia": "^2.3.0",
"qrcode": "^1.5.4",
"three": "^0.185.1",
"vue": "^3.5.13",
"vue-i18n": "^9.14.5",
"vue-router": "^4.5.0"
},
"devDependencies": {
"@types/d3-force": "^3.0.10",
"@types/node": "^22.10.5",
"@types/qrcode": "^1.5.5",
"@types/three": "^0.185.0",
"@vitejs/plugin-vue": "^5.2.1",
"@vue/tsconfig": "^0.7.0",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.17",
"typescript": "~5.6.3",
"vite": "^6.0.7",
"vitest": "^4.1.11",
"vue-tsc": "^2.2.0"
},
"engines": {
"node": ">=20.0.0"
}
}
+6
View File
@@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1787640980513" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14469" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M962 962H62V62h900v900zM162 862h700V162H162v700z" p-id="14470" fill="#2c2c2c"></path></svg>

After

Width:  |  Height:  |  Size: 425 B

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1787640936341" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12356" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M64.164369 555.936675 64.164369 466.466967l894.496507 0 0 89.469708L64.164369 555.936675 64.164369 555.936675zM466.676745 958.450075 466.676745 63.953567l89.469708 0 0 894.497531L466.676745 958.451098 466.676745 958.450075z" fill="#2c2c2c" p-id="12357"></path></svg>

After

Width:  |  Height:  |  Size: 600 B

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1787640959653" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13428" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 928C282.624 928 96 741.376 96 512S282.624 96 512 96s416 186.624 416 416-186.624 416-416 416z m0-768C317.92 160 160 317.92 160 512s157.92 352 352 352 352-157.92 352-352S706.08 160 512 160z" fill="#2c2c2c" p-id="13429"></path></svg>

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More