feat: 提交家校活动前端工程源码(Vue3 + Vite + view-ui-plus)
build / build (push) Successful in 5m24s

This commit is contained in:
lijing
2026-09-20 18:00:18 +08:00
parent 267ba04af2
commit 66ad7fc6c3
333 changed files with 33141 additions and 2 deletions
+13
View File
@@ -0,0 +1,13 @@
# 开发环境 (dev):仅 vite dev --mode dev 加载;build 产物不读任何 .env.*
# (.env.base/.env.ld/.env.prod 已删,线上由 /api/env-config?target=front 运行时下发)。
# ⚠️ VITE_* 仅本地开发生效。
# API 走 /api 同源相对路径(vite proxy 转发到本地后端 8104,见 vite.config.ts),
# 规避后端 CAS 过滤器不回 CORS 头导致的跨域拦截;SSO/基础平台用真实环境。
# ⚠️ VITE_SERVICE_HOST 必须留空:host.config 设计约定 dev 模式走同源代理,
# 配置远端地址会导致浏览器直连被 CAS 过滤器拦截(无 CORS 头),全部请求失败
VITE_BASE_HOST=http://base.yunhaixingtong.com
VITE_SSO_HOST=http://sso.yunhaixingtong.com
VITE_SERVICE_HOST=http://base.yunhaixingtong.com/familyactivity/
VITE_ZIYUANKU_HOST=https://base.bestsch.com/BschZyk
VITE_ZHUANXIANG_HOST=https://base.bestsch.com/BschZncpd
VITE_IS_MOCK=false
+9
View File
@@ -0,0 +1,9 @@
# 本地纯前端调试模式:仅 vite dev --mode mock 加载(build 产物不读任何 .env.*,
# 线上由 /api/env-config?target=front 运行时下发)。后端 SSO/base 不可达时启用内置 mock
# 启动:npm run dev:mock
VITE_BASE_HOST=
VITE_SSO_HOST=
VITE_SERVICE_HOST=http://localhost:8102
VITE_ZIYUANKU_HOST=
VITE_ZHUANXIANG_HOST=
VITE_IS_MOCK=true
+34
View File
@@ -0,0 +1,34 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
yarn.lock
.npmrc
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# scratch
.temp
# 备份/临时文件
*.bak
*.orig
*.old
+15
View File
@@ -0,0 +1,15 @@
module.exports = {
extends: ["airbnb", "prettier", "prettier/react"],
singleQuote: false, // 是否强制使用单引号
printWidth: 120, // 超过最大值换行
tabWidth: 4,
htmlWhitespaceSensitivity: "ignore",
semi: true, // 结尾是否使用分号
//disableLanguages: ["vue"], // 不格式化vue文件,vue文件的格式化单独设置
endOfLine: "auto",
arrowParens: "avoid", // 箭头函数参数括号 默认avoid 可选 avoid| always
};
//如需显示webpack目录,运行以下命令
// npm run eject
//如需配合使eslint生效,运行以下命令
//npm install --save-dev eslint-plugin-prettier
+104 -2
View File
@@ -1,3 +1,105 @@
# familyactivity-front
# 家校活动信息发布(family-activity)
managed by projman
武校家校信息发布模块 —— **活动信息发布** 子模块。用于学校(德育处 / 武术训练部 / 教务处 / 校医务室等)向家长发布活动通知,
并回收家长的**阅读已读**与**报名回执**。
> 以 `D:\项目管理\CourseHomework`(课程作业)为模板工程改造:保留其 Vue3 + Vite + view-ui-plus + alova + vite-plugin-mock
> 技术栈、布局壳层、权限菜单契约、表格/分页/选人/富文本/附件等基础设施,业务域整体替换为「家校活动」。
## 快速开始
```bash
# 纯前端演示(内置 mock 数据,无需后端)
npm run dev:mock
# 联调本地后端
npm run dev
# 构建(产物直出 dist/)
npm run build
```
mock 模式访问:<http://localhost:8078/>
## 功能范围
### 发布端(教师 / 教练 / 处室)
| 菜单 | 路由 | 说明 |
| --- | --- | --- |
| 我发布的 | `/list` | 自己发布的活动列表,按流程状态分标签(全部/报名中/已截止/已结束/草稿) |
| 全部活动 | `/activitylist` | 管理端全量列表(同一组件,去掉 `scope=user`) |
| 发布活动 | `/list/new` | 新建 / 编辑 / 复用再发;支持存草稿与定时发布 |
| 活动详情 | `/list/detail`、`/activitylist/detail` | `type=0` 管理视角(阅读进度 + 回执进度 + 编辑/打印/复用);`type=1` 查看视角 |
| 报名情况 | `/signups` | 家长回执名单:按班级分组的汇总卡 + 回执状态筛选 + 回执详情 + 代为确认/取消 + 催报名 + 导出 CSV |
| 活动统计 | `/stats` | 总量卡、活动分类分布、月度发布趋势、按发布人统计、我发布活动的回执与名额 |
| 应用设置 | `/setting` | 主办部门(字典,可拖拽排序/启停)+ 自定义组(联系组与成员) |
### 家长端(家长 / 学生,演示用)
| 菜单 | 路由 | 说明 |
| --- | --- | --- |
| 活动广场 | `/par/activities` | 左列表右详情,按「全部 / 待回执 / 已报名 / 已结束」筛选,阅读即标读 |
| 我的报名 | `/par/mine` | 同组件,默认落「已报名」标签 |
| 发布端(教师) | `/list` | 从家长端切回发布端的入口(mock 演示便利项) |
## 业务模型要点
- **发布对象到班级一级**:`receiveList = "ALL"` 或班级 id 逗号串;应收人数、已读人数按班级学生数累加(家长即挂在学生档案上的联系人)。
- **回执方式 `receiptMode`**:
- `none` 仅通知 —— 只统计已读,不产生报名记录(如放假通知、安全演练告知);
- `signup` 需报名 —— 家长填报参加人数(可含随行家长),可设名额上限与随行开关;
- `confirm` 需确认 —— 家长端**打开活动详情即自动确认**,无需任何点击(如家长会、考核反馈)。
- **流程状态 `actStatus`**:`draft` 草稿 → `signup` 报名中 → `closed` 已截止 → `finished` 已结束。
- **回执状态 `status`**:`none` 未回执 / `signed` 已报名 / `confirmed` 已确认 / `canceled` 已取消(请假)。
- **名额**:`quota` 为 0 表示不限;按家长填报的参加人数累计占用,满额后拒绝新报名。
## 目录结构
```
src/
├── api/module/activity.ts # 活动域接口封装(get/postJSON/postForm 三件套,统一 {code,msg,data} 解包)
├── assets/
│ ├── config/menu.ts # 左侧菜单(对接后端 GetUserMod 前的兜底)
│ ├── mock/activityapi.ts # 本地 mock:种子数据 + 全部接口实现
│ └── styles/ # 平台主题 / 布局 / iconfont(沿用模板)
├── components/ # 布局壳层、表格、选人、上传、富文本附件等(沿用模板)
├── router/routes.ts # 扁平短路由 + modId 契约(菜单 ↔ 路由)
├── types/activity.ts # 活动域 TS 契约(对齐后端 VO/DTO)
└── views/activity/ # 业务页面(列表 / 发布 / 详情 / 报名 / 统计 / 设置 / 家长端)
```
## mock 演示数据
`src/assets/mock/activityapi.ts` 内置一套武校家校场景数据:
- 学校:少林文武学校;班级:小学部(三/四年级)、初中部(初一)、武术部(套路表演班、散打竞技班),共 7 个班 259 名学生;
- 8 条活动:金秋武术套路比赛、秋季家长会、国庆离校告知、体质健康测试、中秋文艺汇演、新生基本功考核、嵩山研学(草稿)、消防疏散演练;
- 每条活动按班级花名册生成完整回执记录(含家长姓名、手机号、参加人数、备注),并派生回执率与名额占用;
- 当前登录身份:德育处 **王建山**(发布端);家长端演示学生:三年级(1)班 第 1 位学生。
## 与模板工程的差异
| 方面 | 模板(课程作业) | 本工程(家校活动) |
| --- | --- | --- |
| 域模型 | 作业 / 提交 / 批改 | 活动 / 回执报名 / 名额 |
| 回执闭环 | 学生提交作业 → 教师批改 | 家长阅读 + 报名回执 → 学校核验/催办/导出 |
| 菜单 modId | 1/2/3/4/21/25/26/31/32 | 2/3/4/21/25/31/32(+22/23/24 深层子页) |
| 家长端前缀 | `/stu/*`(学生端) | `/par/*`(家长端) |
| 端口 | 8077 | 8078 |
| 已下线 | 审批流、批改中心、学生端提交 | —— |
## 交互实现要点(易踩坑,改动时别再踩回去)
下列几处是 view-ui-plus 的 API 契约(不是业务代码)导致的坑,已在工程内固化做法。
排查同类问题时**先读 `node_modules/view-ui-plus/src/components/<组件>/*.vue`,再怀疑业务代码**。
| 现象 | 根因 | 现行做法 |
| --- | --- | --- |
| 必填项「选完/填完值,红字还挂着」 | `FormItem.getFilteredRule(trigger)` 只保留 `!rule.trigger \|\| rule.trigger 命中` 的规则。控件只发它自己那种事件(Select/DatePicker/RadioGroup/Number 发 `change`,Input 发 `change`+`blur`):规则写了 `blur` 就漏掉 `change`,写了 `change` 就漏掉 `blur`,校验根本不执行,上一次的红字原地不动 | 规则**一律不写 `trigger`**(`NewActivity`、`ParentActivities`、`ActivitySetting`、`DictCardManager` 均已去掉)。数字字段必须显式 `type: "number"` |
| 同上,但值来自**程序化赋值** | 勾「全部班级」把数组填满、编辑/复用回显、弹窗回填都不产生控件事件,trigger 修法也救不了 | `Utils.clearFilledValidateState(formRef, props)` 按「值已填但仍标 error」兜底清状态;发布页 watch 字段值 + `nextTick` 调用 |
| 点左边栏「右边不刷新,点两次才刷」/ 家长端点菜单没反应 | `/list` ↔ `/activitylist`、`/par/activities` ↔ `/par/mine` 各自共用同一组件,Vue 复用实例 → `setup()`/`onMounted` 不重跑;点当前项又走 `router.go(0)`(整页 reload、白屏一下) | `App.vue` 给 `<router-view>` 加 `:key="viewKey"`(`route.fullPath + tick`)并提供 `refreshView`;`layout.vue` 的 `linkMenu` 点当前页时调 `refreshView` 而非 `router.go(0)` |
| Tabs 高亮不跟随变量/路由 | `Tabs` 的 props 里**没有 `value`**,只有 `modelValue`。`:value` 会被当成普通 HTML 属性 fallthrough 到根元素,高亮永远退回第一个 tab(点击有反应是因为组件内部自己改 `activeKey`,所以只表现为「点进来高亮不对」) | 统一 `v-model` / `:model-value` |
| 表格压住分页 | 表格高度用 `Utils.useTableHeight({...})` 常量估算,漏算 Tabs 栏与容器内边距(约 78px),而 `.page-panel` 是 absolute 吸底 | 列表页改用**真实 DOM 实测**:`分页顶边 − 表格顶边 − 12 − (列宽合计超出容器 ? 15 : 0)`;`onMounted` + `resize` 重算 |
| 表头挤成两行 | 为了「收进一屏」合并列 / 把列宽压太窄 | 让表格**横向滚动**(列宽给足),操作列 `fixed: "right"`;序号列宽 ≥ 76px(单元格左右各 18px padding,「序号」两字约需 36px)。横向滚动条样式在 `App.vue` 里覆写 `.ivu-table-overflowX::-webkit-scrollbar`(8px 圆角) |
| 附件名挤在「选择文件」按钮右边 | `Upload` 根节点内部是 `.ivu-upload-select` + `ul.ivu-upload-list` 两个兄弟节点;根节点一旦是 `flex/inline-flex`,`ul` 作为 flex item 会被排到按钮同排 | `.ivu-upload` 保持 `display: block`(关键),只让 `.ivu-upload-select` 内部 `inline-flex` 对齐;`.ivu-upload-list` 另起一行、每项独占一行(见 `components/AttachmentUpload.vue`) |
+41
View File
@@ -0,0 +1,41 @@
import type { GeneratorConfig } from "@alova/wormhole";
export default {
generator: [
{
input: "http://base.yunhaixingtong.com/homework/v3/api-docs",
// 文档平台类型
platform: "swagger",
// 生成代码的输出目录
output: "src/api",
// 响应数据的媒体类型
responseMediaType: "application/json",
// 请求体数据的媒体类型
bodyMediaType: "application/json",
// 生成的 API 版本
version: 1,
// 生成代码类型
type: "typescript",
// 全局 API 名称
global: "Apis",
splitImplementation: true,
implementation: "inline",
// API 处理函数
handleApi: apiDescriptor => {
// 过滤掉已废弃的 API
if (apiDescriptor.deprecated) {
return undefined;
}
const newOpId = apiDescriptor.summary?.trim() || apiDescriptor.operationId;
const url = apiDescriptor.url.replace(/^\/{platform}\//, "/api/");
return {
...apiDescriptor,
operationId: newOpId, // 关键:改掉它
url: apiDescriptor.url.replace(/^\/{platform}\//, "/api/"),
};
},
},
],
} as GeneratorConfig;
+6
View File
@@ -0,0 +1,6 @@
//铃铛debug
window.conf = {
baseHost: "http://basedebug.bestsch.com",
ssoHost: "http://ssodebug.bestsch.com",
serviceHost: "http://basedebug.bestsch.com/QualityEvaluate",
};
@@ -0,0 +1,124 @@
# 活动信息发布模块 · 功能与接口说明 v1
> 武校家校信息发布 —— 活动信息发布子模块。本文档面向后端联调与前端维护,与代码同步维护。
> 前端契约:`src/types/activity.ts`、`src/api/module/activity.ts`;本地 mock:`src/assets/mock/activityapi.ts`。
## 一、页面与路由
| 页面 | 路由 | 组件 | 关键交互 |
| --- | --- | --- | --- |
| 我发布的 | `/list` | `ActivityList.vue` | 状态标签(全部/报名中/已截止/已结束/草稿)、时间范围 + 分类 + 关键字筛选、发布活动入口 |
| 全部活动 | `/activitylist` | `ActivityList.vue` | 同组件;不传 `scope=user`,展示全量 |
| 发布活动 | `/list/new` | `NewActivity.vue` | `?serid=` 编辑、`?fid=` 复用;立即发布 / 存草稿 / 定时发布 |
| 活动详情 | `/list/detail`、`/activitylist/detail` | `ActivityDetails.vue` | `type=0` 管理视角(阅读 + 回执进度、报名情况、编辑、复用、打印);`type=1` 查看视角(标读) |
| 报名情况 | `/signups` | `Signups.vue` | 活动下拉切换、回执状态筛选、汇总卡、按班级分组名单、回执详情、代为确认/取消、催报名、导出 CSV |
| 活动统计 | `/stats` | `ActivityStats.vue` | 总量卡、分类分布、月度趋势、发布人分布、我发布活动的回执表 |
| 应用设置 | `/setting` | `ActivitySetting.vue` | 主办部门(拖拽排序 / 启停 / 内联改名)+ 自定义组(组成员设置) |
| 活动广场 | `/par/activities` | `ParentActivities.vue` | 家长端;标签(全部/待回执/已报名/已结束)+ 关键字;右侧详情 + 报名回执弹窗 |
| 我的报名 | `/par/mine` | `ParentActivities.vue` | 同组件,`meta.initTab=signed` |
菜单 ↔ 路由通过 `meta.modId` 契约绑定(`src/router/routes.ts` 头部注释为唯一口径来源):
```
2 我发布的 /list
3 全部活动 /activitylist
4 活动统计 /stats
21 应用设置 /setting
25 报名情况 /signups
31 活动广场 /par/activities
32 我的报名 /par/mine
22 发布活动 /list/new (深层子页,parentId=2,不在菜单)
23 活动详情 /list/detail (parentId=2)
24 活动详情 /activitylist/detail (parentId=3)
```
## 二、枚举口径
| 字段 | 取值 | 含义 |
| --- | --- | --- |
| `actStatus` | `draft` / `signup` / `closed` / `finished` | 草稿 / 报名中 / 已截止 / 已结束 |
| `receiptMode` | `none` / `signup` / `confirm` | 仅通知 / 需报名 / 需确认(打开即自动确认) |
| `status`(回执记录) | `none` / `signed` / `confirmed` / `canceled` | 未回执 / 已报名 / 已确认 / 已取消(请假) |
派生量(`ActivityProgress`):`should` 应收、`signed` 已报名、`confirmed` 已确认、`canceled` 已取消、
`unsigned` 未回执、`signupRate` 回执率(%)、`quota` 名额上限、`usedQuota` 已占名额、`full` 是否满额。
`receiptMode = none` 或 `actStatus = draft` 时 `progress` 为 `null`(不产生回执记录,只统计已读)。
## 三、接口清单
统一响应 `{ code, msg, data }`,`code` 为 0 表示成功,由 `utils/alova/alova-core.ts` 解包为 `data`。
### 基础 / 布局(`/api/base`)
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/api/base/GetUserInfo` | 当前登录用户 |
| GET | `/api/base/GetUserMod` | 已授权模块(左侧菜单) |
| POST | `/api/base/SetRole` | 切换视角 `{ as: "teacher" \| "parent" }`,需在拉取用户信息前调用 |
| GET | `/api/base/GetSchoolAll` | 教师组织树(选择用户) |
| GET | `/api/base/GetClassTree` | 年级 → 班级树(发布对象到班级一级,叶子带 `studentCount`) |
| POST | `/api/base/FileUpload` | 附件上传 |
### 活动域(`/api/activity`)
| 方法 | 路径 | 入参 | 说明 |
| --- | --- | --- | --- |
| GET | `/List` | `ActivityQuery` | 家长端收件箱(已发布 + 面向本班) |
| GET | `/SendList` | `ActivityQuery`(`scope=user` 只看自己) | 我发布的 / 全部活动 |
| GET | `/Detail` | `serid, type` | `type=1` 标读;`type=0` 不标读(管理视角) |
| GET | `/GetDetail` | `serid` | 编辑/复用回显,不标读 |
| GET | `/GetNextPrev` | `serid, type` | 上一篇/下一篇 id |
| GET | `/ReadDetail` | `serid` | 阅读情况:按年级分组的班级读/未读 |
| POST | `/Create` | `ActivityRequest` | 新建,返回活动 id |
| POST | `/Edit` | `ActivityRequest`(含 `sourceId`) | 编辑 |
| POST | `/Delete` | `number[]` | 批量删除(级联清回执记录) |
| POST | `/InitializeRed` | —— | 一键全部已读 |
| POST | `/UserPull` | `serid` | 撤回(家长端不可见) |
| POST | `/SetTopmost` | `serid, topmost` | 置顶 / 取消置顶 |
| POST | `/Expedite` | `serid` | 催办未读,返回 `{ reminded }` |
| POST | `/ReceiveClasses` | `serid, classes` | 追加接收班级(补发,自动补回执记录) |
| GET | `/Statis` | `startTime?, endTime?` | 活动统计 |
| GET | `/Signups` | `serid, signupStatus` | 报名回执名单(按班级分组 + 汇总) |
| GET | `/SignupDetail` | `signupId` | 单条回执详情 |
| POST | `/Review` | `{ signupId, action: "confirm"\|"cancel"\|"waitlist", remark? }` | 处理回执 |
| POST | `/Remind` | `serid` | 催报名,返回 `{ reminded }` |
| GET | `/ExportSignups` | `serid` | 导出回执名单(JSON 包装 `{ csv }`,csv 为带 BOM 的 CSV 文本,前端取 csv 字段生成文件下载) |
| GET | `/MyActivities` | `ActivityQuery` | 家长端活动广场(含分桶计数 `buckets`) |
| GET | `/MySignup` | `serid` | 家长端活动详情 + 我的回执(同时标读) |
| POST | `/Signup` | `{ serid, joinCount, guardianName, guardianPhone, remark }` | 家长报名 / 修改回执 |
| POST | `/CancelSignup` | `serid` | 取消报名 |
### 字典 / 联系组
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/api/dict/List?type=1` | 主办部门下拉(仅启用) |
| GET | `/api/dict/ManageList?type=dept` | 主办部门管理列表 |
| POST | `/api/dict/Add` / `Update` / `Delete` / `Sort` | 主办部门增删改与排序 |
| GET | `/api/contacts/GetGroup` | 自定义组分页 |
| POST | `/api/contacts/AddGroup` / `EditGroup` / `DelGroup` | 自定义组增删改 |
| GET | `/api/contacts/GetContactsTea` | 组内成员(`page=0&count=0` 取全部) |
| POST | `/api/contacts/SetContactsTea` | 设置组内成员 |
| GET | `/api/contacts/GetGroupTree` | 组 → 成员树(选人弹窗 tab) |
### 文件
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| POST | `/api/file/UploadImage` | 富文本内嵌图片上传 |
| GET | `/api/file/Preview` | 文件预览 |
| GET | `/api/file/Down` | 附件下载 |
| GET | `/api/activity/AllFileDown` | 全部附件打包下载 |
## 四、关键实现约定
1. **表单参数传递**:`postForm` 会把参数同时拼进 URL query。后端 `@RequestParam` 都能接收;本地 `vite-plugin-mock`
不解析 `application/x-www-form-urlencoded` body,靠 query 才能取到参数(不影响线上)。
2. **`@RequestBody` 接口**(`Create` / `Edit` / `Delete` / `Signup` / `Review`)走 `postJSON`,mock 侧用 `bodyOf(body, query)` 合并取参。
3. **接收班级**:`receiveList = "ALL"` 或班级 id 逗号串;`targetClassIds()` 统一解析。
4. **已读判定**:以班级为粒度(`classRead: string[]`);应收 / 已读人数按班级 `studentCount` 累加。
5. **端分离**:`App.vue` 依据路由前缀(`/par` → 家长端)调用 `SetRole` 切换视角并重新拉取 `GetUserMod`,
菜单与用户信息随视角变化;家长端菜单提供「发布端(教师)」入口便于返回。
6. **表格高度**:`Utils.useTableHeight({ isSearch, isTabs, isPage, isOperat })`,头部 112(自身 header 56 + 面包屑 56)。
7. **操作列图标**:`Utils.operatingHandle(h, 提示, iconClass, cb)`,图标取自 `src/assets/styles/icons.css` 的 bsch-icons 字体。
+45
View File
@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- 运行时配置引导:在任何应用模块执行前同步拉取 /<contextPath>/api/env-config
(后端免登录端点,projman 配置管理在线维护),替代生产构建环境变量。
必须同步:host.config.ts 在模块求值期就读 window.__APP_CONFIG__;失败/本地开发
(根路径,段数不足 2)则不设置:本地走 .env.dev/.env.mock(VITE_*),线上走同域推导兜底。
target = URL 第 2 段目录名:本应用产物部署于 /{contextPath}/front/,故为 front,
对应后端配置键 yh.env-config.source.front(环境变量 YH_ENV_CONFIG_SOURCE_FRONT)。
注意:同步 XHR 不支持 timeout 属性(赋值会抛 InvalidAccessError),依赖内网快速失败 -->
<script>
(function () {
try {
var seg = location.pathname.split("/").filter(Boolean);
if (seg.length < 2) return; // 本地开发(根路径):走 .env.dev / .env.mock
var xhr = new XMLHttpRequest();
xhr.open("GET", "/" + seg[0] + "/api/env-config?target=" + encodeURIComponent(seg[1]), false);
xhr.send(null);
if (xhr.status === 200) {
var conf = JSON.parse(xhr.responseText);
if (conf && typeof conf === "object") window.__APP_CONFIG__ = conf;
}
} catch (e) {
/* 拉取失败保持未设置,走同域推导兜底 */
}
})();
</script>
<title><%- title %></title>
<link rel="stylesheet" href="./libs/ztree/zTreeStyle.css" />
<script src="./libs/jquery.min.js"></script>
<script src="./libs/lodash.min.js"></script>
<script src="./libs/ztree/jquery.ztree.all.min.js"></script>
<%- injectScript %>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
+14346
View File
File diff suppressed because it is too large Load Diff
+53
View File
@@ -0,0 +1,53 @@
{
"name": "family-activity",
"private": true,
"version": "0.0.0",
"nodeversion": "20.19.4",
"type": "module",
"scripts": {
"dev": "vite --mode dev",
"dev:mock": "vite --mode mock",
"build": "vite build --mode base",
"build:base": "vite build --mode base",
"build:ld": "vite build --mode ld",
"build:prod": "vite build --mode prod",
"preview": "vite preview",
"api:gen": "alova gen -f"
},
"dependencies": {
"@open-file-viewer/core": "^0.1.43",
"@open-file-viewer/vue": "^0.1.43",
"@types/lodash": "^4.14.196",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"alova": "^3.4.0",
"axios": "^0.24.0",
"lodash": "^4.17.21",
"mitt": "^3.0.1",
"mockjs": "^1.1.0",
"node-sass": "latest",
"pdfjs-dist": "^4.10.38",
"pinia": "^2.1.4",
"sass": "^1.64.1",
"view-ui-plus": "^1.3.16",
"vite-plugin-mock": "2.9.6",
"vue": "^3.4.19",
"vue-router": "4",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@alova/wormhole": "^1.5.0",
"@types/node": "^20.4.4",
"@unocss/preset-rem-to-px": "^66.6.0",
"@unocss/preset-uno": "^66.6.0",
"@vitejs/plugin-vue": "^5.0.4",
"fast-glob": "^3.3.2",
"typescript": "^5.2.2",
"unocss": "^66.6.0",
"unplugin-auto-import": "0.18.3",
"vite": "^5.1.4",
"vite-plugin-html": "^3.2.2",
"vite-plugin-svg-icons": "^2.0.1",
"vue-tsc": "^1.8.27"
}
}
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.
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.
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.
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.
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.
+3
View File
@@ -0,0 +1,3 @@
àRCopyright 1990-2009 Adobe Systems Incorporated.
All rights reserved.
See ./LICENSEáCNS2-H
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
àRCopyright 1990-2009 Adobe Systems Incorporated.
All rights reserved.
See ./LICENSEá ETen-B5-H` ^
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.
+4
View File
@@ -0,0 +1,4 @@
àRCopyright 1990-2009 Adobe Systems Incorporated.
All rights reserved.
See ./LICENSE!!�º]aX!!]`�21�> �p �z�$]‚�"R‚d�-Uƒ7�*„ 4„%�+ „Z „{�/…%…<�9K…b�1]†.�"‡ ‰`]‡,�"]ˆ
�"]ˆh�"]‰F�"]Š$�"]‹�"]‹`�"]Œ>�"]��"]�z�"]ŽX�"]�6�"]��"]�r�"]‘P�"]’.�"]“ �"]“j�"]”H�"]•&�"]–�"]–b�"]—@�"]˜�"]˜|�"]™Z�"]š8�"]›�"]›t�"]œR�"]�0�"]ž�"]žl�"]ŸJ�"] (�"]¡�"]¡d�"]¢B�"]£ �"X£~�']¤W�"]¥5�"]¦�"]¦q�"]§O�"]¨-�"]© �"]©i�"]ªG�"]«%�"]¬�"]¬a�"]­?�"]®�"]®{�"]¯Y�"]°7�"]±�"]±s�"]²Q�"]³/�"]´ �"]´k�"]µI�"]¶'�"]·�"]·c�"]¸A�"]¹�"]¹}�"]º[�"]»9
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.
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.

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