vue2server7 7.0.118 → 7.0.119

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/package.json +1 -1
  2. package/test/mini2.0-main/.editorconfig +8 -0
  3. package/test/mini2.0-main/.env.development +3 -0
  4. package/test/mini2.0-main/.env.production +3 -0
  5. package/test/mini2.0-main/.env.test +3 -0
  6. package/test/mini2.0-main/.gitattributes +1 -0
  7. package/test/mini2.0-main/.oxlintrc.json +10 -0
  8. package/test/mini2.0-main/.prettierrc.json +6 -0
  9. package/test/mini2.0-main/README.md +179 -0
  10. package/test/mini2.0-main/auto-imports.d.ts +629 -0
  11. package/test/mini2.0-main/components.d.ts +21 -0
  12. package/test/mini2.0-main/docs/MX_API.md +244 -0
  13. package/test/mini2.0-main/docs/REQUEST.md +217 -0
  14. package/test/mini2.0-main/docs/package-json-guide.md +132 -0
  15. package/test/mini2.0-main/env.d.ts +12 -0
  16. package/test/mini2.0-main/eslint.config.ts +26 -0
  17. package/test/mini2.0-main/index.html +16 -0
  18. package/test/mini2.0-main/package-lock.json +6421 -0
  19. package/test/mini2.0-main/package.json +64 -0
  20. package/test/mini2.0-main/plugins/bump-version.ts +50 -0
  21. package/test/mini2.0-main/postcss.config.ts +15 -0
  22. package/test/mini2.0-main/public/favicon.ico +0 -0
  23. package/test/mini2.0-main/public/images/12a73787-86a9-4891-a65f-66104746f6a8.png +0 -0
  24. package/test/mini2.0-main/public/images/5798d7aa-ba8b-4605-8079-58b35495ac55.png +0 -0
  25. package/test/mini2.0-main/public/images/73fef1e4-0fd0-4a1a-9b8b-a70a5b6acbbc.png +0 -0
  26. package/test/mini2.0-main/public/images/bc685b4c-0cca-4a79-924c-a8ee10e6f8eb.png +0 -0
  27. package/test/mini2.0-main/public/images/c3dbbd9d-be56-490e-b9f4-6ee17ebefffc.png +0 -0
  28. package/test/mini2.0-main/public/images/ea745a10-42aa-4f44-8d7f-3ab02cc0adcd.png +0 -0
  29. package/test/mini2.0-main/public/images/f5876785-b927-4347-ba19-999114240649.png +0 -0
  30. package/test/mini2.0-main/public/images/img.png +0 -0
  31. package/test/mini2.0-main/src/App.vue +11 -0
  32. package/test/mini2.0-main/src/api/user.ts +23 -0
  33. package/test/mini2.0-main/src/auto-imports.d.ts +639 -0
  34. package/test/mini2.0-main/src/components.d.ts +23 -0
  35. package/test/mini2.0-main/src/config/config.properties +3 -0
  36. package/test/mini2.0-main/src/config/env.ts +6 -0
  37. package/test/mini2.0-main/src/config/plugin.properties.pro +6 -0
  38. package/test/mini2.0-main/src/config/plugin.properties.test +6 -0
  39. package/test/mini2.0-main/src/core/mxApi/index.ts +237 -0
  40. package/test/mini2.0-main/src/core/request/index.ts +129 -0
  41. package/test/mini2.0-main/src/main.ts +21 -0
  42. package/test/mini2.0-main/src/router/index.ts +70 -0
  43. package/test/mini2.0-main/src/stores/counter.ts +12 -0
  44. package/test/mini2.0-main/src/stores/user.ts +48 -0
  45. package/test/mini2.0-main/src/types/api.d.ts +14 -0
  46. package/test/mini2.0-main/src/types/nprogress.d.ts +8 -0
  47. package/test/mini2.0-main/src/utils/request.ts +159 -0
  48. package/test/mini2.0-main/src/views/clearing-detail/index.vue +49 -0
  49. package/test/mini2.0-main/src/views/foreign-position/index.vue +49 -0
  50. package/test/mini2.0-main/src/views/home/index.vue +201 -0
  51. package/test/mini2.0-main/src/views/login/index.vue +166 -0
  52. package/test/mini2.0-main/src/views/net-debit/index.vue +49 -0
  53. package/test/mini2.0-main/src/views/pbc-position/index.vue +49 -0
  54. package/test/mini2.0-main/src/views/position-estimate/index.vue +49 -0
  55. package/test/mini2.0-main/src/views/rmb-position/index.vue +49 -0
  56. package/test/mini2.0-main/src/views/warning/index.vue +49 -0
  57. package/test/mini2.0-main/tsconfig.app.json +18 -0
  58. package/test/mini2.0-main/tsconfig.json +11 -0
  59. package/test/mini2.0-main/tsconfig.node.json +28 -0
  60. package/test/mini2.0-main/vite.config.ts +68 -0
  61. package/test/b137a0ec17d13d2093a89a18eb819e89.png +0 -0
  62. package/test/mini2.0-main (2).zip +0 -0
@@ -0,0 +1,21 @@
1
+ /* eslint-disable */
2
+ // @ts-nocheck
3
+ // biome-ignore lint: disable
4
+ // oxlint-disable
5
+ // ------
6
+ // Generated by unplugin-vue-components
7
+ // Read more: https://github.com/vuejs/core/pull/3399
8
+
9
+ export {}
10
+
11
+ /* prettier-ignore */
12
+ declare module 'vue' {
13
+ export interface GlobalComponents {
14
+ RouterLink: typeof import('vue-router')['RouterLink']
15
+ RouterView: typeof import('vue-router')['RouterView']
16
+ VanButton: typeof import('vant/es')['Button']
17
+ VanCellGroup: typeof import('vant/es')['CellGroup']
18
+ VanField: typeof import('vant/es')['Field']
19
+ VanForm: typeof import('vant/es')['Form']
20
+ }
21
+ }
@@ -0,0 +1,244 @@
1
+ # MX 原生桥接 API 使用指南
2
+
3
+ ## 概述
4
+
5
+ `core/mxApi` 是敏行混合应用的原生桥接模块,提供与原生 Android/iOS 应用通信的能力。
6
+
7
+ ## 功能列表
8
+
9
+ ### UI 控制
10
+
11
+ ```typescript
12
+ import { hideWebViewTitle, showOptionMenu, setCustomHeaderMenu } from '@/core/mxApi'
13
+
14
+ // 隐藏原生标题栏
15
+ hideWebViewTitle()
16
+
17
+ // 显示右上角菜单
18
+ showOptionMenu()
19
+
20
+ // 设置自定义菜单
21
+ setCustomHeaderMenu({
22
+ menus: [
23
+ { id: '1', title: '设置' },
24
+ { id: '2', title: '关于' }
25
+ ]
26
+ })
27
+ ```
28
+
29
+ ### 获取用户信息
30
+
31
+ ```typescript
32
+ import { getCurrentUser } from '@/core/mxApi'
33
+
34
+ const user = await getCurrentUser()
35
+ console.log(user.id, user.name, user.token)
36
+ ```
37
+
38
+ ### 选人组件
39
+
40
+ ```typescript
41
+ import { MXSelectUsers } from '@/core/mxApi'
42
+
43
+ const users = await MXSelectUsers({
44
+ enableSelectDept: false, // 是否允许选择部门
45
+ canSelectSelf: true // 是否可选自己
46
+ })
47
+
48
+ console.log('选中的用户:', users)
49
+ ```
50
+
51
+ ### 原生 HTTP 请求(绕过跨域)
52
+
53
+ ```typescript
54
+ import { ajaxGet, ajaxPost, ajaxPut, ajaxDelete } from '@/core/mxApi'
55
+
56
+ // GET 请求
57
+ const { data } = await ajaxGet('/api/users', { page: 1, limit: 10 })
58
+
59
+ // POST 请求
60
+ const { data } = await ajaxPost('/api/users', { name: '张三' })
61
+
62
+ // PUT 请求
63
+ await ajaxPut('/api/users/123', { name: '李四' })
64
+
65
+ // DELETE 请求
66
+ await ajaxDelete('/api/users', '123')
67
+ ```
68
+
69
+ ### 环境检测
70
+
71
+ ```typescript
72
+ import { isNativeApp } from '@/core/mxApi'
73
+
74
+ if (isNativeApp()) {
75
+ // 在原生环境中,可使用所有原生 API
76
+ const user = await getCurrentUser()
77
+ } else {
78
+ // 在浏览器中,使用 axios 或降级方案
79
+ import('@/utils/request').then(({ request }) => {
80
+ // 使用 axios 发起请求
81
+ })
82
+ }
83
+ ```
84
+
85
+ ## 与 axios 的区别
86
+
87
+ | 特性 | axios | MX ajax |
88
+ |------|-------|---------|
89
+ | 跨域限制 | 受同源策略限制 | 无限制 |
90
+ | 认证信息 | 需手动添加 Token | 可复用原生层认证 |
91
+ | 网络代理 | 无 | 使用原生层代理配置 |
92
+ | SSL 证书 | 浏览器验证 | 可使用企业证书 |
93
+ | 适用环境 | 浏览器、WebView | 仅混合应用原生环境 |
94
+
95
+ ## 项目中的两种 HTTP 方案
96
+
97
+ ### 方案 1:axios(默认)
98
+
99
+ ```typescript
100
+ // src/utils/request.ts
101
+ import axios from 'axios'
102
+ import { apiConfig } from '@/config/env'
103
+
104
+ const service = axios.create({
105
+ baseURL: apiConfig.baseURL,
106
+ timeout: apiConfig.timeout,
107
+ })
108
+
109
+ export default service
110
+ ```
111
+
112
+ **适用场景**:
113
+ - 浏览器开发调试
114
+ - 不需要绕过跨域限制
115
+ - 使用标准 RESTful API
116
+
117
+ ### 方案 2:原生 AJAX
118
+
119
+ ```typescript
120
+ // src/core/mxApi/index.ts
121
+ import { ajaxGet, ajaxPost } from '@/core/mxApi'
122
+
123
+ // 使用原生 HTTP 客户端
124
+ const { data } = await ajaxGet('/api/users')
125
+ ```
126
+
127
+ **适用场景**:
128
+ - 需要绕过浏览器跨域限制
129
+ - 使用原生层认证信息
130
+ - 需要企业证书支持
131
+ - 在敏行 App 中运行
132
+
133
+ ## 智能切换示例
134
+
135
+ ```typescript
136
+ import { isNativeApp, ajaxGet as nativeGet } from '@/core/mxApi'
137
+ import { request } from '@/utils/request'
138
+
139
+ export async function fetchUsers(page: number) {
140
+ if (isNativeApp()) {
141
+ // 使用原生 AJAX
142
+ const { data } = await nativeGet('/api/users', { page })
143
+ return data
144
+ } else {
145
+ // 使用 axios
146
+ const res = await request({
147
+ url: '/api/users',
148
+ params: { page }
149
+ })
150
+ return res.data
151
+ }
152
+ }
153
+ ```
154
+
155
+ ## 注意事项
156
+
157
+ ### 1. 设备就绪机制
158
+
159
+ mxApi 内置任务队列,在设备未就绪时会自动缓存调用请求。无需手动处理 `deviceready` 事件。
160
+
161
+ ### 2. 环境变量
162
+
163
+ 原生 AJAX 使用 `VITE_API_BASE_URL` 作为基础 URL,与 axios 配置保持一致。
164
+
165
+ ### 3. 错误处理
166
+
167
+ 当原生接口不存在时,会抛出错误。建议在调用前检测环境:
168
+
169
+ ```typescript
170
+ import { isNativeApp } from '@/core/mxApi'
171
+
172
+ if (!isNativeApp()) {
173
+ showToast('请在敏行 App 中使用此功能')
174
+ return
175
+ }
176
+ ```
177
+
178
+ ### 4. TypeScript 类型支持
179
+
180
+ 所有 API 都有完整的类型定义,包括:
181
+ - `MXUser` - 用户信息
182
+ - `MXSelectUsersOptions` - 选人配置
183
+ - `MXAjaxResponse<T>` - AJAX 响应
184
+
185
+ ## 开发调试
186
+
187
+ 在浏览器中开发时,原生接口不可用。建议:
188
+
189
+ 1. **使用条件判断**:根据环境选择不同的请求方式
190
+ 2. **使用 Vant 组件**:如 `showToast` 显示提示
191
+ 3. **日志输出**:mxApi 会自动输出调用日志
192
+
193
+ ```typescript
194
+ // 开发环境提示
195
+ if (!isNativeApp()) {
196
+ console.warn('当前为浏览器环境,原生 API 不可用')
197
+ }
198
+ ```
199
+
200
+ ## 完整示例
201
+
202
+ ```vue
203
+ <script setup lang="ts">
204
+ import { ref, onMounted } from 'vue'
205
+ import { showToast } from 'vant'
206
+ import { isNativeApp, getCurrentUser, MXSelectUsers } from '@/core/mxApi'
207
+ import type { MXUser } from '@/core/mxApi'
208
+
209
+ const user = ref<MXUser | null>(null)
210
+ const selectedUsers = ref<MXUser[]>([])
211
+
212
+ onMounted(async () => {
213
+ if (isNativeApp()) {
214
+ try {
215
+ user.value = await getCurrentUser()
216
+ showToast(`欢迎, ${user.value.name}`)
217
+ } catch (err) {
218
+ console.error('获取用户失败:', err)
219
+ }
220
+ }
221
+ })
222
+
223
+ const handleSelectUsers = async () => {
224
+ if (!isNativeApp()) {
225
+ showToast('请在敏行 App 中使用')
226
+ return
227
+ }
228
+
229
+ try {
230
+ selectedUsers.value = await MXSelectUsers()
231
+ showToast(`已选择 ${selectedUsers.value.length} 人`)
232
+ } catch (err) {
233
+ console.error('选人失败:', err)
234
+ }
235
+ }
236
+ </script>
237
+
238
+ <template>
239
+ <div>
240
+ <van-cell title="当前用户" :value="user?.name || '未登录'" />
241
+ <van-button @click="handleSelectUsers">选择联系人</van-button>
242
+ </div>
243
+ </template>
244
+ ```
@@ -0,0 +1,217 @@
1
+ # 统一请求中转层使用指南
2
+
3
+ ## 概述
4
+
5
+ `core/request` 是请求中转层,**接口与 `src/utils/request.ts` 完全一致**。
6
+
7
+ ```
8
+ 应用层(API 模块)
9
+
10
+
11
+ ┌─────────────────────────────────────┐
12
+ │ 中转层 core/request │
13
+ │ │
14
+ │ request() ← 与 utils/request 接口一致 │
15
+ │ │
16
+ │ • 自动环境检测 │
17
+ │ • 统一请求头管理 │
18
+ │ • Token 管理 │
19
+ └───────────────┬─────────────────────┘
20
+
21
+ ┌─────────┴─────────┐
22
+ ▼ ▼
23
+ ┌────────┐ ┌────────┐
24
+ │ axios │ │ mxApi │
25
+ │(已封装) │ │(原生) │
26
+ └────────┘ └────────┘
27
+ ```
28
+
29
+ ---
30
+
31
+ ## 核心特性
32
+
33
+ ### 1. 接口完全一致
34
+
35
+ ```typescript
36
+ // 原来使用 utils/request
37
+ import { request } from '@/utils/request'
38
+
39
+ // 现在使用 core/request(接口完全一致)
40
+ import { request } from '@/core/request'
41
+
42
+ // 用法完全相同,无需修改任何调用代码
43
+ const res = await request<UserInfo>({ url: '/user/1' })
44
+ ```
45
+
46
+ ### 2. 自动环境检测
47
+
48
+ - **浏览器环境**:调用 `utils/request`(axios 封装)
49
+ - **原生环境**:调用 `core/mxApi`(原生 AJAX)
50
+
51
+ ### 3. 统一请求头
52
+
53
+ 所有请求自动携带:
54
+ - `Content-Type: application/json`
55
+ - `Authorization: Bearer {token}`(如有)
56
+
57
+ ---
58
+
59
+ ## 使用方式
60
+
61
+ ### Token 管理
62
+
63
+ ```typescript
64
+ import { setToken, getToken, clearToken } from '@/core/request'
65
+
66
+ // 登录后保存 Token
67
+ setToken('your-jwt-token')
68
+
69
+ // 获取 Token
70
+ const token = getToken()
71
+
72
+ // 退出登录
73
+ clearToken()
74
+ ```
75
+
76
+ ### 请求函数
77
+
78
+ ```typescript
79
+ import { request } from '@/core/request'
80
+
81
+ // GET 请求
82
+ const user = await request<UserInfo>({ url: '/user/1' })
83
+
84
+ // POST 请求
85
+ const { token } = await request<{ token: string }, LoginParams>({
86
+ url: '/login',
87
+ method: 'POST',
88
+ data: { username: 'admin', password: '123' }
89
+ })
90
+
91
+ // 带查询参数
92
+ const users = await request<UserList>({
93
+ url: '/users',
94
+ params: { page: 1, limit: 10 }
95
+ })
96
+
97
+ // 自定义请求头
98
+ const res = await request({
99
+ url: '/upload',
100
+ method: 'POST',
101
+ data: formData,
102
+ headers: { 'Content-Type': 'multipart/form-data' }
103
+ })
104
+ ```
105
+
106
+ ---
107
+
108
+ ## API 模块示例
109
+
110
+ ### 用户模块
111
+
112
+ ```typescript
113
+ // src/api/user.ts
114
+ import { request } from '@/core/request'
115
+
116
+ interface UserInfo {
117
+ id: number
118
+ username: string
119
+ avatar: string
120
+ }
121
+
122
+ export function getUserInfo(id: number) {
123
+ return request<UserInfo>({ url: `/user/${id}` })
124
+ }
125
+
126
+ export function login(data: { username: string; password: string }) {
127
+ return request<{ token: string }, typeof data>({
128
+ url: '/login',
129
+ method: 'POST',
130
+ data
131
+ })
132
+ }
133
+
134
+ export function updateUser(id: string, data: UpdateUserParams) {
135
+ return request<User, typeof data>({
136
+ url: `/user/${id}`,
137
+ method: 'PUT',
138
+ data
139
+ })
140
+ }
141
+
142
+ export function deleteUser(id: string) {
143
+ return request({
144
+ url: `/user/${id}`,
145
+ method: 'DELETE'
146
+ })
147
+ }
148
+ ```
149
+
150
+ ### 在组件中使用
151
+
152
+ ```vue
153
+ <script setup lang="ts">
154
+ import { ref, onMounted } from 'vue'
155
+ import { showToast } from 'vant'
156
+ import { getUserInfo, login } from '@/api/user'
157
+ import { setToken } from '@/core/request'
158
+
159
+ const user = ref<UserInfo | null>(null)
160
+
161
+ onMounted(async () => {
162
+ try {
163
+ const res = await getUserInfo(1)
164
+ user.value = res.data
165
+ } catch (error) {
166
+ showToast('获取用户失败')
167
+ }
168
+ })
169
+
170
+ const handleLogin = async () => {
171
+ try {
172
+ const res = await login({
173
+ username: 'admin',
174
+ password: '123'
175
+ })
176
+ setToken(res.data.token)
177
+ showToast('登录成功')
178
+ } catch (error) {
179
+ showToast('登录失败')
180
+ }
181
+ }
182
+ </script>
183
+
184
+ <template>
185
+ <div>
186
+ <van-cell title="用户名" :value="user?.username" />
187
+ <van-button @click="handleLogin">登录</van-button>
188
+ </div>
189
+ </template>
190
+ ```
191
+
192
+ ---
193
+
194
+ ## 导出说明
195
+
196
+ | 导出 | 类型 | 说明 |
197
+ |------|------|------|
198
+ | `request` | 函数 | 核心中转函数,与 `utils/request` 接口一致 |
199
+ | `setToken` | 函数 | 设置 Token |
200
+ | `getToken` | 函数 | 获取 Token |
201
+ | `clearToken` | 函数 | 清除 Token |
202
+ | `getCommonHeaders` | 函数 | 获取公共请求头 |
203
+ | `RequestConfig` | 类型 | 请求配置接口 |
204
+
205
+ ---
206
+
207
+ ## 与 utils/request 的关系
208
+
209
+ | 特性 | utils/request | core/request |
210
+ |------|---------------|--------------|
211
+ | 底层实现 | axios | axios + mxApi |
212
+ | 环境支持 | 仅浏览器 | 浏览器 + 原生 |
213
+ | 接口格式 | ✅ | ✅ 完全一致 |
214
+ | Token 管理 | ❌ | ✅ 内置 |
215
+ | 请求头管理 | 分散 | 统一 |
216
+
217
+ **核心优势**:只需将 `import { request } from '@/utils/request'` 改为 `import { request } from '@/core/request'`,即可自动获得原生环境支持,无需修改任何业务代码。
@@ -0,0 +1,132 @@
1
+ # package.json 说明
2
+
3
+ ## 项目信息
4
+
5
+ | 字段 | 值 | 说明 |
6
+ |------|-----|------|
7
+ | `name` | `mini2.0` | 项目名称 |
8
+ | `version` | `0.0.0` | 当前版本(开发初期未正式定版) |
9
+ | `private` | `true` | 私有项目,禁止发布到 npm |
10
+ | `type` | `module` | 使用 ES Module 规范(`import/export`) |
11
+ | `engines.node` | `^20.19.0 \|\| >=22.12.0` | 要求 Node.js 20.19+ 或 22.12+ |
12
+
13
+ ---
14
+
15
+ ## 脚本命令(scripts)
16
+
17
+ ### 开发
18
+
19
+ | 命令 | 作用 |
20
+ |------|------|
21
+ | `npm run dev` | 启动 Vite 开发服务器(默认 `.env.development` 环境变量) |
22
+ | `npm run dev:test` | 以 test 模式启动开发服务器,加载 `.env.test` 环境变量,用于本地联调测试环境接口 |
23
+
24
+ ### 构建
25
+
26
+ | 命令 | 作用 |
27
+ |------|------|
28
+ | `npm run build` | 生产构建,先运行 TypeScript 类型检查(`vue-tsc --build`),再执行 Vite 构建 |
29
+ | `npm run build:test` | 测试环境构建,串行执行类型检查 + Vite 构建(`--mode test`) |
30
+ | `npm run build:prod` | 生产环境构建,串行执行类型检查 + Vite 构建(`--mode production`) |
31
+ | `npm run build-only` | **仅**执行 Vite 构建,不做类型检查,适合快速出包调试 |
32
+ | `npm run build-only:test` | 仅构建,使用 test 模式 |
33
+ | `npm run build-only:prod` | 仅构建,使用 production 模式 |
34
+ | `npm run preview` | 启动 Vite 静态文件预览服务器,用于本地查看构建产物 |
35
+
36
+ > `build` 命令使用 `npm-run-all2` 的 `run-p`(并行)执行类型检查和构建;`build:test` / `build:prod` 使用 `run-s`(串行)先类型检查再构建。
37
+
38
+ ### 代码质量
39
+
40
+ | 命令 | 作用 |
41
+ |------|------|
42
+ | `npm run lint` | 串行执行所有 `lint:*` 子命令 |
43
+ | `npm run lint:oxlint` | 使用 OxLint 对代码做快速 lint 检查并自动修复 |
44
+ | `npm run lint:eslint` | 使用 ESLint 做完整 lint 检查并自动修复,结果会缓存(`--cache`) |
45
+ | `npm run format` | 使用 Prettier 格式化 `src/` 目录下的代码 |
46
+
47
+ > `npm run lint` 会先执行 oxlint 再执行 eslint,两者分工:oxlint 速度快,适合捕获常见错误;eslint 规则更全面,特别是 Vue/TypeScript 相关规则。
48
+
49
+ ---
50
+
51
+ ## 生产依赖(dependencies)
52
+
53
+ 这些包会被打包到最终产物中,直接影响用户侧。
54
+
55
+ | 包名 | 版本 | 作用 |
56
+ |------|------|------|
57
+ | `vue` | `^3.5.32` | Vue 3 核心框架,提供响应式系统、组件系统和模板编译 |
58
+ | `vue-router` | `^5.0.4` | Vue 官方路由,管理页面导航和 URL 映射 |
59
+ | `pinia` | `^3.0.4` | Vue 官方状态管理库,替代 Vuex,支持组合式 API |
60
+ | `vant` | `^4.9.24` | 有赞出品的移动端 Vue 3 组件库,提供丰富的 UI 组件(按钮、弹窗、表单等) |
61
+ | `axios` | `^1.16.1` | HTTP 客户端,用于发起 API 请求,支持拦截器、取消请求等 |
62
+ | `@iconify/vue` | `^5.0.1` | Iconify 图标库的 Vue 组件封装,可使用数千个图标集(如 Material Design、Tabler 等) |
63
+ | `@vueuse/core` | `^14.3.0` | Vue 组合式工具函数集,提供 `useStorage`、`useDebounceFn`、`useClipboard` 等常用 hooks |
64
+ | `dayjs` | `^1.11.21` | 轻量级日期时间处理库(仅 2KB),Moment.js 的替代品 |
65
+ | `crypto-js` | `^4.2.0` | 加密算法库,支持 AES、MD5、SHA 等,用于前端数据加密/签名 |
66
+ | `clipboard` | `^2.0.11` | 剪贴板操作库,实现一键复制文本到系统剪贴板 |
67
+ | `nprogress` | `^0.2.0` | 页面顶部细线进度条,常用于路由切换或接口请求时的加载反馈 |
68
+ | `qrcode` | `^1.5.4` | 二维码生成库,可在 Canvas/SVG/Node.js 中生成二维码图片 |
69
+
70
+ ---
71
+
72
+ ## 开发依赖(devDependencies)
73
+
74
+ 这些包仅在开发/构建阶段使用,不会进入最终产物。
75
+
76
+ ### 构建工具
77
+
78
+ | 包名 | 版本 | 作用 |
79
+ |------|------|------|
80
+ | `vite` | `^8.0.8` | 下一代前端构建工具,提供极快的冷启动和热更新 |
81
+ | `@vitejs/plugin-vue` | `^6.0.6` | Vite 官方 Vue 插件,处理 `.vue` 单文件组件的编译 |
82
+ | `vite-plugin-vue-devtools` | `^8.1.1` | Vue DevTools 的 Vite 插件集成,开发时提供组件树、状态检查等调试能力 |
83
+ | `unplugin-vue-components` | `^32.1.0` | 组件自动导入插件,无需手动 `import` 即可使用 Vant 等组件(按需引入) |
84
+ | `postcss-px-to-viewport-8-plugin` | `^1.2.5` | PostCSS 插件,自动将 CSS 中的 `px` 单位转换为 `vw`,实现移动端视口适配 |
85
+ | `less` | `^4.6.4` | Less CSS 预处理器,支持变量、嵌套、混入等语法 |
86
+ | `npm-run-all2` | `^8.0.4` | 提供 `run-s`(串行)和 `run-p`(并行)命令,用于组合多个 npm scripts |
87
+ | `jiti` | `^2.6.1` | 运行时 TypeScript/ESM 模块加载器,部分工具链(如 ESLint flat config)依赖它在 Node 中直接解析 TS 配置文件 |
88
+
89
+ ### TypeScript
90
+
91
+ | 包名 | 版本 | 作用 |
92
+ |------|------|------|
93
+ | `typescript` | `~6.0.0` | TypeScript 编译器,提供静态类型检查 |
94
+ | `vue-tsc` | `^3.2.6` | Vue 单文件组件的 TypeScript 类型检查工具(基于 `tsc`,支持 `.vue` 文件) |
95
+ | `@tsconfig/node24` | `^24.0.4` | Node.js 24 的 `tsconfig.json` 基础配置预设 |
96
+ | `@types/node` | `^24.12.2` | Node.js 内置模块(`fs`、`path` 等)的类型声明 |
97
+ | `@vue/tsconfig` | `^0.9.1` | Vue 项目的 `tsconfig.json` 基础配置预设 |
98
+
99
+ ### 代码规范
100
+
101
+ | 包名 | 版本 | 作用 |
102
+ |------|------|------|
103
+ | `eslint` | `^10.2.1` | JavaScript/TypeScript 代码静态分析工具,检测代码风格和潜在错误 |
104
+ | `eslint-plugin-vue` | `~10.8.0` | ESLint 的 Vue 规则插件,检查 `.vue` 文件的模板和脚本 |
105
+ | `@vue/eslint-config-typescript` | `^14.7.0` | Vue 官方的 TypeScript ESLint 配置预设 |
106
+ | `eslint-plugin-oxlint` | `~1.60.0` | 让 ESLint 跳过 OxLint 已覆盖的规则,避免重复检查 |
107
+ | `eslint-config-prettier` | `^10.1.8` | 关闭 ESLint 中与 Prettier 冲突的格式化规则,保证两者不打架 |
108
+ | `oxlint` | `~1.60.0` | Rust 编写的超快 linter(比 ESLint 快 50-100 倍),用于替代部分 ESLint 规则 |
109
+ | `prettier` | `3.8.3` | 代码格式化工具,统一缩进、引号、分号等风格,只管格式不管逻辑 |
110
+
111
+ ---
112
+
113
+ ## 依赖关系速览
114
+
115
+ ```
116
+ 开发流程
117
+ ├── 代码编写阶段
118
+ │ ├── TypeScript (类型检查)
119
+ │ ├── ESLint + OxLint (代码规范)
120
+ │ └── Prettier (代码格式化)
121
+
122
+ ├── 开发调试阶段
123
+ │ ├── Vite (开发服务器 + HMR)
124
+ │ ├── Vue / Vant (UI 开发)
125
+ │ └── vite-plugin-vue-devtools (调试工具)
126
+
127
+ └── 构建部署阶段
128
+ ├── vue-tsc (类型检查)
129
+ ├── Vite (打包构建)
130
+ ├── postcss-px-to-viewport-8-plugin (移动端适配)
131
+ └── unplugin-vue-components (按需引入)
132
+ ```
@@ -0,0 +1,12 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ interface ImportMetaEnv {
4
+ readonly VITE_APP_ENV: 'development' | 'test' | 'production'
5
+ readonly VITE_API_BASE_URL: string
6
+ readonly VITE_PROXY_TARGET?: string
7
+ readonly VITE_API_TIMEOUT: string
8
+ }
9
+
10
+ interface ImportMeta {
11
+ readonly env: ImportMetaEnv
12
+ }
@@ -0,0 +1,26 @@
1
+ import { globalIgnores } from 'eslint/config'
2
+ import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'
3
+ import pluginVue from 'eslint-plugin-vue'
4
+ import pluginOxlint from 'eslint-plugin-oxlint'
5
+ import skipFormatting from 'eslint-config-prettier/flat'
6
+
7
+ // To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
8
+ // import { configureVueProject } from '@vue/eslint-config-typescript'
9
+ // configureVueProject({ scriptLangs: ['ts', 'tsx'] })
10
+ // More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup
11
+
12
+ export default defineConfigWithVueTs(
13
+ {
14
+ name: 'app/files-to-lint',
15
+ files: ['**/*.{vue,ts,mts,tsx}'],
16
+ },
17
+
18
+ globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
19
+
20
+ ...pluginVue.configs['flat/essential'],
21
+ vueTsConfigs.recommended,
22
+
23
+ ...pluginOxlint.buildFromOxlintConfigFile('.oxlintrc.json'),
24
+
25
+ skipFormatting,
26
+ )
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <link rel="icon" href="/favicon.ico">
6
+ <meta
7
+ name="viewport"
8
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"
9
+ />
10
+ <title>平台</title>
11
+ </head>
12
+ <body>
13
+ <div id="app"></div>
14
+ <script type="module" src="/src/main.ts"></script>
15
+ </body>
16
+ </html>