提交 843e729c authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 d1d0f463
node_modules
.pnpm-store
.DS_Store
dist
\ No newline at end of file
# 页面参数说明
本文档说明各个页面通过 `callbackInFlutterComponent` 函数接收的参数。
## 参数传递方式
所有页面都通过全局函数 `callbackInFlutterComponent` 接收参数,该函数由 Flutter 端调用。
## 各页面参数详情
### 1. evaluating.html (测评页面)
**参数格式**: 逗号分隔的字符串
```javascript
callbackInFlutterComponent('baseURL,book_id,chapter_id,token,position')
```
**参数说明**:
- `baseURL` (string): API 基础地址
- `book_id` (string): 书籍 ID,例如: "175"
- `chapter_id` (string): 章节 ID,例如: "335"
- `token` (string): 用户认证令牌
- `position` (string): 位置标识,例如: "0vm56t7l"
**示例**:
```javascript
callbackInFlutterComponent('https://api.example.com,175,335,726cca8efcb328672202656f63e176e8,bgi0jn6p')
```
---
### 2. evaluating_result.html (测评结果页面)
**参数格式**: 逗号分隔的字符串
```javascript
callbackInFlutterComponent('baseURL,book_id,chapter_id,token,position')
```
**参数说明**:
- `baseURL` (string): API 基础地址
- `book_id` (string): 书籍 ID,例如: "323"
- `chapter_id` (string): 章节 ID,例如: "2635"
- `token` (string): 用户认证令牌
- `position` (string): 位置标识,例如: "ab4bg8qf"
**示例**:
```javascript
callbackInFlutterComponent('https://api.example.com,175,2834,726cca8efcb328672202656f63e176e8,bgi0jn6p')
```
---
### 3. evaluating_wrong.html (错题页面)
**参数格式**: 逗号分隔的字符串
```javascript
callbackInFlutterComponent('baseURL,book_id,token')
```
**参数说明**:
- `baseURL` (string): API 基础地址
- `book_id` (string): 书籍 ID
- `token` (string): 用户认证令牌
**示例**:
```javascript
callbackInFlutterComponent('https://api.example.com,175,726cca8efcb328672202656f63e176e8')
```
---
### 4. read.html (阅读页面)
**参数格式**: 逗号分隔的字符串
```javascript
callbackInFlutterComponent('baseURL,book_id,chapter_id,token,noteId,searchText')
```
**参数说明**:
- `baseURL` (string): API 基础地址
- `book_id` (string): 书籍 ID,例如: "175" 或 "358"
- `chapter_id` (string): 章节 ID,例如: "335" 或 "1931"
- `token` (string): 用户认证令牌
- `noteId` (string, 可选): 笔记 ID
- `searchText` (string, 可选): 搜索文本
**示例**:
```javascript
callbackInFlutterComponent('https://api.example.com,175,335,2f85d063f94485c0c2ef31e652875bd5,,')
```
---
### 5. read_unline.html (在线阅读页面)
**参数格式**: 对象形式
```javascript
callbackInFlutterComponent({
book_id: '175',
chapter_id: '335',
next_chapter: {...}, // 下一章节信息
up_chapter: {...}, // 上一章节信息
color_line: {...}, // 高亮信息
direction: 'scrollUp' // 可选,滚动方向
})
```
**参数说明**:
- `book_id` (string): 书籍 ID
- `chapter_id` (string): 章节 ID
- `next_chapter` (object, 可选): 下一章节信息对象
- `up_chapter` (object, 可选): 上一章节信息对象
- `color_line` (object, 可选): 高亮线条信息
- `direction` (string, 可选): 滚动方向,例如: "scrollUp"
**注意**: 此页面会将参数对象直接传递给 `getBookChapterData` 方法处理。
---
### 6. read_info.html (阅读信息页面)
**参数格式**: 对象形式
```javascript
callbackInFlutterComponent({
base_url: 'https://api.example.com',
book_id: '175',
chapter_id: '2834',
token: '726cca8efcb328672202656f63e176e8',
position: '49732578',
type: 'gallery', // 或 'expand'
})
```
**参数说明**:
- `base_url` (string): API 基础地址
- `book_id` (string): 书籍 ID,例如: "175" 或 "358"
- `chapter_id` (string): 章节 ID,例如: "2253" 或 "2825"
- `token` (string): 用户认证令牌
- `position` (string): 位置标识,例如: "73736505" 或 "75972319"
- `type` (string): 类型,可选值: "gallery" (画廊) 或 "expand" (扩展内容)
**示例**:
```javascript
callbackInFlutterComponent({
base_url: 'https://api.example.com',
book_id: 175,
chapter_id: 2834,
token: '726cca8efcb328672202656f63e176e8',
position: '49732578',
type: 'gallery',
})
```
---
### 7. read_img.html (阅读图片页面)
**参数格式**: 对象形式
```javascript
callbackInFlutterComponent({
url: 'https://example.com/image.jpg',
title: '图片标题',
})
```
**参数说明**:
- `url` (string): 图片 URL
- `title` (string): 图片标题(如果为 "图片展示" 则不显示标题)
**示例**:
```javascript
callbackInFlutterComponent({
url: 'https://example.com/image.jpg',
title: '图片标题',
})
```
---
## 通用说明
1. **Token 存储**: 所有页面都会将 `token` 存储到 `localStorage`
2. **数据加载**: 调用 `callbackInFlutterComponent` 后,页面会自动加载相应的数据
3. **Flutter 交互**: 页面通过 `window.flutter_inappwebview.callHandler` 与 Flutter 端通信
## 开发测试
在浏览器控制台中可以直接调用 `callbackInFlutterComponent` 函数进行测试:
```javascript
// 测评页面测试
callbackInFlutterComponent('https://api.example.com,175,335,token123,position456')
// 阅读页面测试
callbackInFlutterComponent('https://api.example.com,175,335,token123,,')
```
# Book App H5
这是一个基于 Vue 2 的多页面 H5 应用项目。
## 技术栈
- Vue 2
- Vite 7
- pnpm
## 开发
### 安装依赖
```bash
pnpm install
```
### 启动开发服务器
```bash
pnpm dev
```
开发服务器将在 `http://localhost:3000` 启动。
### 构建生产版本
```bash
pnpm build
```
构建产物将输出到 `dist` 目录。
### 预览生产构建
```bash
pnpm preview
```
## 项目结构
- `*.html` - 多页面入口文件
- `assets/` - 静态资源目录
- `css/` - 样式文件
- `js/` - JavaScript 文件
- `images/` - 图片资源
- `fonts/` - 字体文件
## 页面说明
- `evaluating.html` - 测评页面
- `evaluating_result.html` - 测评结果页面
- `evaluating_wrong.html` - 错题页面
- `read.html` - 阅读页面
- `read_unline.html` - 在线阅读页面
- `read_info.html` - 阅读信息页面
- `read_img.html` - 阅读图片页面
# read.html 逻辑与通信机制说明
## 概述
`read.html` 是一个基于 Vue 2 的阅读页面,支持章节阅读、文本选择、划线、高亮、笔记等功能。页面通过 `flutter_inappwebview` 与 Flutter 原生应用进行双向通信。
## 核心逻辑流程
### 1. 初始化流程
```
Flutter 调用 callbackInFlutterComponent()
解析参数 (baseURL, book_id, chapter_id, token, noteId, searchText)
存储 token 到 localStorage
调用 getBookChapterData() 加载章节内容
显示加载状态 (showLoadingCallback)
请求 API 获取章节数据
渲染内容、初始化交互功能
隐藏加载状态 (dismissLoadingCallback)
```
### 2. 数据加载流程
**主要方法**: `getBookChapterData(chapterId, scroll)`
1. **防重复加载**: 检查 `nextChapterLoading` 标志
2. **清空内容**: 重置章节内容和选区状态
3. **API 请求**: 调用 `/v1/book/Information/getChapterContent` 获取:
- 章节内容 (`content`)
- 下一章节信息 (`next_chapter`)
- 上一章节信息 (`up_chapter`)
- 高亮数据 (`color_line`)
- 划线数据 (`line_list`)
4. **内容处理**:
- 代码高亮 (highlight.js)
- 视频转音频处理
- 渲染划线和高亮
- 搜索文本定位
5. **进度上报**: 计算并上报阅读进度
6. **事件监听**: 初始化触摸、滚动等交互事件
### 3. 阅读进度上报
**定时上报**: 每 5 秒上报一次 (`uploadReadInterval`)
**进度计算逻辑**:
```javascript
// 如果内容高度 <= 屏幕高度,进度 = 100%
// 否则根据滚动位置计算:
progress = (已滚动高度 + 屏幕高度) / 总内容高度 * 100
```
**上报接口**:
- `/v1/book/Information/uploadReadProgress` - 阅读进度
- `/v1/book/Information/uploadReadRecord` - 阅读记录
## 与 Flutter 的通信机制
### 通信方式
使用 `window.flutter_inappwebview.callHandler` 进行通信,这是一个双向通信机制。
### 1. Flutter → H5 (接收数据)
#### `callbackInFlutterComponent(args)`
**参数格式**: 逗号分隔的字符串
```
baseURL,book_id,chapter_id,token,noteId,searchText
```
**功能**: 初始化页面,加载章节数据
#### `refreshTokenSuccess(args)`
**参数格式**: 对象
```javascript
{ token: 'new_token' }
```
**功能**: Token 过期后刷新,重新加载数据
### 2. H5 → Flutter (发送数据)
#### `callHandlerNoticeFlutterSubmit(funcname, data)`
**核心方法**,用于向 Flutter 发送各种事件通知:
```javascript
callHandlerNoticeFlutterSubmit(funcname, data)
```
**常用回调函数名**:
| 回调函数名 | 触发时机 | 数据格式 | 说明 |
|----------|---------|---------|------|
| `showLoadingCallback` | 开始加载数据 | - | 显示加载状态 |
| `dismissLoadingCallback` | 数据加载完成 | - | 隐藏加载状态 |
| `refreshTokenCallback` | Token 过期 (403) | - | 请求刷新 Token |
| `loadChapterCallBack` | 切换章节 | `[chapter_id, chapter_name]` | 通知章节切换 |
| `openLinkCallback` | 点击链接 | `href` | 打开外部链接 |
| `readInfoCallback` | 点击扩展内容 | `[position, type, title]` | 打开画廊/扩展内容 |
| `scaleImageCallback` | 点击图片 | `[imgUrl, title]` | 放大图片 |
| `answerResultCallBack` | 点击练习 | `[chapter_id, position, counts, title]` | 打开练习页面 |
| `payCallback` | 点击付费内容 | - | 打开支付页面 |
| `dbClickCallBack` | 双击屏幕 | - | 显示/隐藏工具栏 |
| `offlineAddNoteCallBack` | 添加笔记 | `{...noteData, notes_id}` | 离线添加笔记 |
| `offlineUpdateNoteCallBack` | 更新笔记 | `{...noteData}` | 离线更新笔记 |
| `offlineDelNoteCallBack` | 删除笔记 | `{...noteData}` | 离线删除笔记 |
## 核心功能模块
### 1. 文本选择与操作
**监听选择**: `selectionRangeOperation()`
- 监听 `selectionchange` 事件
- 获取选中文本和位置信息
- 显示操作工具栏(划线、高亮、复制等)
**划线功能**:
- `rangeTextInLine()`: 添加划线
- `delLine()`: 删除划线
- API: `/v1/book/Information/addNotes` (type=1)
**高亮功能**:
- `rangeTextInLight()`: 添加/编辑高亮
- `delLight()`: 删除高亮
- API: `/v1/book/Information/addNotes` (type=2)
### 2. 滚动与翻页
**触摸事件处理**:
- `touchStartEvent`: 记录起始位置
- `touchMoveEvent`: 实时更新滚动位置
- `touchEndEvent`: 处理滚动结束、章节切换
**章节切换**:
- **下拉**: 加载上一章节 (`prev_chapter`)
- **上拉**: 加载下一章节 (`next_chapter`)
- 通过 `translateY` CSS 变换实现滚动效果
### 3. 交互功能
**气泡提示** (`tooltipOpa`):
- 点击特定位置显示气泡内容
- API: `/v1/book/Information/getBubbleByPosition`
**交互练习** (`practiceOpa`):
- 点击练习按钮
- API: `/v1/book/Information/checkChapterQuestion`
- 回调: `answerResultCallBack`
**图片处理**:
- 点击图片可放大查看
- 回调: `scaleImageCallback``readInfoCallback`
**链接处理**:
- 内部链接: 加载对应章节
- 外部链接: 回调 `openLinkCallback` 由 Flutter 处理
### 4. 内容渲染
**划线和高亮渲染**:
- `line_listFilterShow()`: 渲染已保存的划线
- `color_lineFilterShow()`: 渲染已保存的高亮
- 使用 DOM 操作在内容中插入标记元素
**代码高亮**:
- 使用 `highlight.js` 处理 `<pre><code>` 标签
**视频转音频**:
- `replaceVideoToAudio()`: 将视频标签转换为音频播放器
## 数据流图
```
┌─────────────┐
│ Flutter │
└──────┬──────┘
│ callbackInFlutterComponent()
│ (初始化参数)
┌─────────────────┐
│ read.html │
│ (Vue App) │
└──────┬──────────┘
├─→ getBookChapterData()
│ └─→ API 请求
│ └─→ 渲染内容
├─→ 用户交互
│ ├─→ 文本选择 → 划线/高亮
│ ├─→ 滚动 → 章节切换
│ └─→ 点击 → 各种回调
└─→ callHandlerNoticeFlutterSubmit()
└─→ Flutter 处理
```
## 关键状态管理
### 主要状态变量
```javascript
{
book_id: '', // 书籍ID
chapter_id: '', // 章节ID
token: '', // 认证令牌
chapterContent: '', // 章节内容
next_chapter: {}, // 下一章节
prev_chapter: {}, // 上一章节
line_list: [], // 划线列表
color_line: [], // 高亮列表
selectedText: '', // 选中的文本
boolControllStatus: false, // 操作工具栏显示状态
nextChapterLoading: false, // 章节加载中
lockedContent: false, // 内容是否锁定
translateY: 0, // 滚动位置
}
```
## 错误处理
1. **Token 过期 (403)**:
- 调用 `refreshTokenCallback`
- Flutter 刷新 Token 后调用 `refreshTokenSuccess`
2. **章节锁定 (3001)**:
- 显示锁定界面
- 显示"获取完整版"按钮
3. **网络错误**:
- 显示错误提示
- 隐藏加载状态
## 性能优化
1. **防抖处理**: 文本选择、滚动等操作使用防抖
2. **懒加载**: 章节内容按需加载
3. **定时上报**: 阅读进度每 5 秒上报一次,避免频繁请求
4. **CSS 变换**: 使用 `transform` 而非 `top/left` 实现滚动,性能更好
## 开发调试
在浏览器控制台可以直接测试:
```javascript
// 初始化页面
callbackInFlutterComponent('https://api.example.com,175,335,token123,,searchText')
// 刷新 Token
refreshTokenSuccess({ token: 'new_token' })
```
## 注意事项
1. **Flutter 环境**: 必须在 `flutter_inappwebview` 环境中运行
2. **Token 管理**: Token 会自动存储到 `localStorage`
3. **离线支持**: 笔记操作支持离线,通过回调同步到 Flutter
4. **触摸事件**: 移动端使用触摸事件,桌面端可能需要适配
差异被折叠。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>清控紫荆数智学堂充值服务协议</title>
<meta
name="viewport"
content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,initial-scale=1.0" />
<style>
* {
margin: 0px;
padding: 0px;
line-height: 1.8rem;
}
body {
margin: 20px;
font-size: 1rem;
}
body h2 {
padding: 15px 0px;
font-size: 1.5rem;
}
a {
color: black;
}
.p2 {
margin: 10px 0;
}
</style>
</head>
<body>
<h2>清控紫荆数智学堂充值服务协议</h2>
<p class="p2"><b>更新日期:</b>2024年02月29日</p>
<p class="p2"><b>生效日期:</b>2024年02月29日</p>
<p class="p2"><b>版本:</b>v1.0</p>
<p>
本协议是由您(以下简称“用户”)与本充值清控紫荆数智学堂APP服务平台(以下简称“平台”)达成的,以明确双方权益和义务的法律文件。请您在使用本平台提供的充值服务之前,仔细阅读并理解本协议的全部内容。
</p>
<p>一、协议的接受与生效</p>
<p>
1.1
用户在使用本平台充值服务之前,必须认真阅读并同意本协议的全部内容。用户通过点击“同意”按钮,即表示用户已完全接受并同意本协议的所有条款。
</p>
<p>1.2 本协议生效之日起,用户与平台之间即建立起了协议关系。</p>
<p>二、充值服务简介</p>
<p>
2.1
平台提供的充值服务指的是用户通过平台的充值页面,充值一定金额的虚拟货币(紫金币)到用户账户,以便用于在平台上进行支付或其他有关活动。
</p>
<p>2.2 平台所提供的充值服务不涉及任何实物交易,仅限于虚拟货币(紫金币)的充值及使用。</p>
<p>三、用户充值的方式和规则</p>
<p>3.1 用户可以通过平台提供的充值页面进行充值,包括支付宝、微信等方式。</p>
<p>3.2 用户在充值时需按平台规定的金额范围进行充值,超出规定范围的金额将无法充值成功。</p>
<p>3.3 充值金额一经成功后,不可退换。</p>
<p>3.4 用户在进行充值时需确保所提供的充值信息真实、准确、完整,如因信息错误导致的充值失败或损失由用户自行承担。</p>
<p>3.5 平台有权根据业务需要或监管要求,对用户在充值服务上的使用额度进行限制。</p>
<p>四、用户权益与义务</p>
<p>
4.1
用户享有按平台规定方式进行充值的权益,平台将根据用户的实际充值金额,及时将对应的虚拟货币(紫金币)充值到用户的账户上。
</p>
<p>4.2 用户在进行充值时必须保证所使用的支付账户合法、有效,并承担因违反该义务而产生的一切责任。</p>
<p>4.3 用户在使用充值服务过程中,必须遵守平台的相关规定及国家法律法规,不得利用充值服务进行任何非法活动。</p>
<p>4.4 用户充值成功后,所获得的虚拟货币(紫金币)不可提现,仅限于在平台内进行消费和使用。</p>
<p>4.5 用户应妥善保管自己的账户及充值相关信息,避免账户被他人非法使用。</p>
<p>4.6 用户在使用充值服务过程中,如遇到任何问题或疑问,应及时与平台客服联系,寻求帮助和解决方案。</p>
<p>五、免责与争议解决</p>
<p>
5.1
平台在任何情况下均不对用户在充值服务过程中的损失、延误或其他不良影响承担责任,包括但不限于因网络故障、技术问题、操作失误等原因导致的损失。
</p>
<p>
5.2
用户在使用充值服务过程中,如遇到纠纷或争议,应与平台友好协商解决。如协商不果,任何一方均有权向有管辖权的人民法院提起诉讼解决争议。
</p>
<p>六、协议的终止</p>
<p>6.1 用户可随时终止本协议,终止后用户将不再享有本协议下的充值服务权益。</p>
<p>6.2 平台在用户违反本协议内容或国家法律法规的情况下,有权终止本协议,并保留采取法律手段追究用户责任的权利。</p>
<p>七、协议的修改</p>
<p>
7.1
平台有权随时对本协议进行修改,修改后的协议一经公布即生效。用户在继续使用充值服务时,视为用户已完全接受并同意修改后的协议。
</p>
<p>7.2 如用户不同意修改后的协议内容,可停止使用充值服务。</p>
<p>八、其他条款</p>
<p>8.1 本协议的订立、执行和解释及争议解决适用中华人民共和国法律。</p>
<p>8.2 如协议的任何条款被认定为无效或不具有执行力,不影响其他条款的效力。</p>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>清控紫荆数智学堂用户协议</title>
<meta
name="viewport"
content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,initial-scale=1.0" />
<style>
* {
margin: 0px;
padding: 0px;
line-height: 1.8rem;
}
body {
margin: 20px;
font-size: 1rem;
}
body h2 {
padding: 15px 0px;
font-size: 1.5rem;
}
a {
color: black;
}
.p2 {
margin: 10px 0;
}
</style>
</head>
<body>
<h2>清控紫荆数智学堂用户协议</h2>
<p class="p2"><b>更新日期:</b>2024年02月29日</p>
<p class="p2"><b>生效日期:</b>2024年02月29日</p>
<p class="p2"><b>版本:</b>v1.0</p>
<p>
尊敬的用户,欢迎使用清控紫荆数智学堂APP提供的服务。在使用前请您阅读如下用户协议,使用本应用即表示您同意接受本协议,本协议产生法律效力,特别涉及免除或者限制清控紫荆数智学堂责任的条款,请仔细阅读。如有任何问题,可向清控紫荆数智学堂咨询。
</p>
<p>1. 用户协议的确认和接受</p>
<p>通过访问或使用本应用,表示用户同意接受本协议的所有条件和条款。</p>
<p>2. 用户协议的变更和修改</p>
<p>
清控紫荆数智学堂有权在必要时修改本条款,本条款一旦发生变更,将会在重要页面上提示修改内容。如果不同意所改动的内容,用户可以放弃获得的本应用信息服务。如果用户继续享用本应用的信息服务,则视为接受用户协议的变更。本应用保留随时修改或中断服务而不需要通知用户的权利。本应用行使修改或中断服务的权利,不需对用户或第三方负责。
</p>
<p>3. 用户行为</p>
<p>3.1 用户账号、密码和安全</p>
<p>
用户一旦注册成功,便成为清控紫荆数智学堂的合法用户,用户应采取合理措施维护其密码和帐号的安全。用户对利用该密码和帐号所进行的一切活动负全部责任;由该等活动所导致的任何损失或损害由用户承担,清控紫荆数智学堂不承担任何责任。
用户的密码和帐号遭到未授权的使用或发生其他任何安全问题,用户可以立即通知清控紫荆数智学堂,并且用户在每次连线结束,应结束帐号使用,否则用户可能得不到清控紫荆数智学堂的安全保护。对于用户长时间未使用的帐号,清控紫荆数智学堂有权予以关闭并注销其内容。
</p>
<p>3.2 账号注册时的禁止行为</p>
<p>(1)请勿以党和国家领导人或其他社会名人的真实姓名、字号、艺名、笔名注册;</p>
<p>(2)冒充任何人或机构,或以虚伪不实的方式谎称或使人误认为与任何人或任何机构有关的名称;</p>
<p>(3)请勿注册和其他网友之名相近、相仿的名字;</p>
<p>(4)请勿注册不文明、不健康名字,或包含歧视、侮辱、猥亵类词语的名字;</p>
<p>(5)请勿注册易产生歧义、引起他人误解的名字;</p>
<p>3.3 用户在本应用上不得发布下列违法信息和照片:</p>
<p>(1)反对宪法所确定的基本原则的;</p>
<p>(2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</p>
<p>(3)损害国家荣誉和利益的;</p>
<p>(4)煽动民族仇恨、民族歧视,破坏民族团结的;</p>
<p>(5)破坏国家宗教政策,宣扬邪教和封建迷信的;</p>
<p>(6)散布谣言,扰乱社会秩序,破坏社会稳定的;</p>
<p>(7)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</p>
<p>(8)侮辱或者诽谤他人,侵害他人合法权益的;</p>
<p>(9)含有法律、行政法规禁止的其他内容的;</p>
<p>(10)禁止骚扰、毁谤、威胁、仿冒网站其他用户;</p>
<p>(11)严禁煽动非法集会、结社、游行、示威、聚众扰乱社会秩序;</p>
<p>
(12)严禁发布可能会妨害第三方权益的文件或者信息,例如(包括但不限于):病毒代码、黑客程序、软件破解注册信息。
</p>
<p>(13)禁止上传他人作品。其中包括您从互联网上下载、截图或收集的他人的作品;</p>
<p>(14)禁止上传广告、横幅、标志等网络图片;</p>
<p>4. 上传或发布的内容</p>
<p>
用户上传的内容是指用户在清控紫荆数智学堂上传或发布的视频或其它任何形式的内容包括文字、图片、音频等。除非清控紫荆数智学堂收到相关通知,否则清控紫荆数智学堂将用户视为其在本应用上传或发布的内容的版权拥有人。作为内容的发表者,需自行对所发表内容负责,因所发表内容引发的一切纠纷,由该内容的发表者承担全部法律及连带责任。清控紫荆数智学堂不承担任何法律及连带责任。
</p>
<p>
对于经由本应用而传送的内容,清控紫荆数智学堂不保证前述其合法性、正当性、准确性、完整性或品质。用户在使用本应用时,有可能会接触到令人不快、不适当或令人厌恶的内容。在任何情况下,清控紫荆数智学堂均不对任何内容承担任何责任,包括但不限于任何内容发生任何错误或纰漏以及衍生的任何损失或损害。清控紫荆数智学堂有权(但无义务)自行拒绝或删除经由本应用提供的任何内容。
</p>
<p>
个人或单位如认为清控紫荆数智学堂存在侵犯自身合法权益的内容,应准备好具有法律效应的证明材料,及时与清控紫荆数智学堂取得联系,以便清控紫荆数智学堂迅速作出处理。
</p>
</body>
</html>
{
"name": "book-app-h5",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"vite": "^7.3.0",
"glob": "^11.0.0"
}
}
差异被折叠。
import { defineConfig } from 'vite'
import { resolve, dirname } from 'path'
import { fileURLToPath } from 'url'
import { glob } from 'glob'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
// 获取所有 HTML 文件作为入口
function getHtmlEntries() {
const htmlFiles = glob.sync('*.html', { cwd: __dirname })
const entries = {}
htmlFiles.forEach((file) => {
const name = file.replace(/\.html$/, '')
entries[name] = resolve(__dirname, file)
})
return entries
}
export default defineConfig({
root: '.',
build: {
outDir: 'dist',
rollupOptions: {
input: getHtmlEntries(),
output: {
entryFileNames: 'assets/js/[name]-[hash].js',
chunkFileNames: 'assets/js/[name]-[hash].js',
assetFileNames: (assetInfo) => {
const info = assetInfo.name.split('.')
const ext = info[info.length - 1]
if (/\.(css)$/.test(assetInfo.name)) {
return `assets/css/[name]-[hash].${ext}`
}
if (/\.(png|jpe?g|svg|gif|tiff|bmp|ico)$/i.test(assetInfo.name)) {
return `assets/images/[name]-[hash].${ext}`
}
if (/\.(woff2?|eot|ttf|otf)$/i.test(assetInfo.name)) {
return `assets/fonts/[name]-[hash].${ext}`
}
return `assets/[name]-[hash].${ext}`
},
},
},
// 保持原始 HTML 结构
minify: false,
},
server: {
port: 3000,
open: true,
host: true,
},
resolve: {
alias: {
'@': resolve(__dirname, './'),
},
},
})
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论