diff --git a/src/api/base/kccyApi.ts b/src/api/base/kccyApi.ts new file mode 100644 index 0000000..3f9d186 --- /dev/null +++ b/src/api/base/kccyApi.ts @@ -0,0 +1,57 @@ +import { get, post } from "@/utils/request"; + +/** + * 分页查询课程成员 + */ +export function kccyFindPageApi(params: any) { + return get('/api/kccy/findPage', params); +} + +/** + * 根据ID查询课程成员详情 + */ +export function kccyFindByIdApi(params: any) { + return get('/api/kccy/findById', params); +} + +/** + * 新增/修改课程成员 + */ +export function kccySaveApi(params: any) { + return post('/api/kccy/save', params); +} + +/** + * 逻辑删除课程成员 + */ +export function kccyLogicDeleteApi(params: any) { + return post('/api/kccy/logicDelete', params); +} + +/** + * 根据课程建班ID查询成员列表 + */ +export function kccyFindByKcjbIdApi(params: any) { + return get('/api/kccy/findByKcjbId', params); +} + +/** + * 导出字段选择 + */ +export function kccyExportFieldChooseApi(params: any) { + return get('/api/kccy/exportFieldChoose', params); +} + +/** + * 导出课程成员数据 + */ +export function kccyExportFileApi(params: any) { + return post('/api/kccy/export', params); +} + +/** + * 导入课程成员数据 + */ +export function kccyImportDataApi(params: any) { + return post('/api/kccy/importData', params); +} \ No newline at end of file diff --git a/src/api/base/kcjbApi.ts b/src/api/base/kcjbApi.ts new file mode 100644 index 0000000..3092adf --- /dev/null +++ b/src/api/base/kcjbApi.ts @@ -0,0 +1,29 @@ +import { get, post } from "@/utils/request"; + +/** + * 获取课程建班列表 + */ +export function kcjbFindPageApi(params: any) { + return get('/api/kcjb/findPage', params); +} + +/** + * 获取课程建班详情 + */ +export function kcjbFindByIdApi(params: any) { + return get('/api/kcjb/findById', params); +} + +/** + * 报名课程 + */ +export function kcjbRegisterApi(params: any) { + return post('/api/kcjb/register', params); +} + +/** + * 获取轮播图数据 + */ +export function kcjbBannerApi() { + return get('/api/kcjb/banner'); +} diff --git a/src/api/base/rwApi.ts b/src/api/base/rwApi.ts new file mode 100644 index 0000000..3367e96 --- /dev/null +++ b/src/api/base/rwApi.ts @@ -0,0 +1,79 @@ +import { get, post } from "@/utils/request"; + +/** + * 分页查询 + */ +export function rwFindPageApi(params: any) { + return get('/api/rw/findPage', params); +} + +export function rwFindPageSummaryApi(params: any) { + return get('/api/rw/findPageSummary', params); +} + +export function rwCompletionSummaryApi() { + return get('/api/rw/completionSummary'); +} + +/** + * 新增/修改 + */ +export function rwSaveApi(params: any) { + return post('/api/rw/save', params); +} + +/** + * 删除 + */ +export function rwLogicDeleteApi(params: any) { + return post('/api/rw/logicDelete', params); +} + +/** + * 根据id查询 + */ +export function rwFindByIdApi(params: any) { + return get('/api/rw/findById', params); +} + +/** + * 查询全部 + */ +export function rwFindAllApi() { + return get('/api/rw/findAll'); +} + +/** + * 导出字段选择 + */ +export function rwExportFieldChooseApi(params: any) { + return get('/api/rw/exportFieldChoose', params); +} + +/** + * 导出 + */ +export function rwExportFileApi(params: any) { + return post('/api/rw/export', params); +} + +/** + * 导入 + */ +export function rwImportDataApi(params: any) { + return post('/api/rw/importData', params); +} + +/** + * 强删除活动 + */ +export function rwDelApi(params: any) { + return post('/api/rw/delete', params); +} + +/** + * 推送教师 + */ +export function rwPushJsApi(params: any) { + return post('/api/rw/pushJs', params); +} \ No newline at end of file diff --git a/src/api/base/rwzxApi.ts b/src/api/base/rwzxApi.ts new file mode 100644 index 0000000..1bb4cc1 --- /dev/null +++ b/src/api/base/rwzxApi.ts @@ -0,0 +1,113 @@ +import { get, post } from "@/utils/request"; + +/** + * 分页查询任务执行 + */ +export function rwzxFindPageApi(params: any) { + return get('/api/rwzx/findPage', params); +} + +/** + * 根据任务ID查询执行情况 + */ +export function rwzxFindByRwIdApi(params: any) { + return get('/api/rwzx/findByRwId', params); +} + +/** + * 根据任务ID查询已执行信息 + */ +export function executedInfoByRwIdApi(params: any) { + return get('/api/rwzx/executedInfoByRwId', params); +} + +/** + * 根据任务ID查询未执行教师信息 + */ +export function noxecuteJsbyRwIdApi(params: any) { + return get('/api/rwzx/noxecuteJsbyRwId', params); +} + +/** + * 新增/修改任务执行 + */ +export function rwzxSaveApi(params: any) { + return post('/api/rwzx/save', params); +} + +/** + * 删除任务执行 + */ +export function rwzxLogicDeleteApi(params: any) { + return post('/api/rwzx/logicDelete', params); +} + +/** + * 根据id查询任务执行 + */ +export function rwzxFindByIdApi(params: any) { + return get('/api/rwzx/findById', params); +} + +/** + * 查询全部任务执行 + */ +export function rwzxFindAllApi() { + return get('/api/rwzx/findAll'); +} + +/** + * 任务执行统计 + */ +export function rwzxCompletionSummaryApi(params: any) { + return get('/api/rwzx/completionSummary', params); +} + +/** + * 导出字段选择 + */ +export function rwzxExportFieldChooseApi(params: any) { + return get('/api/rwzx/exportFieldChoose', params); +} + +/** + * 导出任务执行数据 + */ +export function rwzxExportFileApi(params: any) { + return post('/api/rwzx/export', params); +} + +/** + * 导入任务执行数据 + */ +export function rwzxImportDataApi(params: any) { + return post('/api/rwzx/importData', params); +} + +/** + * 强删除任务执行记录 + */ +export function rwzxDelApi(params: any) { + return post('/api/rwzx/delete', params); +} + +/** + * 查询任务未执行教师 + */ +export function rwzxNoxecuteJsbyRwIdApi(params: any) { + return get('/api/rwzx/noxecuteJsbyRwId', params); +} + +/** + * 查询任务已执行信息 + */ +export function rwzxExecutedInfoByRwIdApi(params: any) { + return get('/api/rwzx/executedInfoByRwId', params); +} + +/** + * 批量创建任务执行记录 + */ +export function rwzxBatchCreateApi(params: any) { + return post('/api/rwzx/batchCreate', params); +} \ No newline at end of file diff --git a/src/components/BasicJsPicker/Picker.vue b/src/components/BasicJsPicker/Picker.vue index 89933c2..08177e7 100644 --- a/src/components/BasicJsPicker/Picker.vue +++ b/src/components/BasicJsPicker/Picker.vue @@ -13,7 +13,7 @@ - + 取消 diff --git a/src/components/ImageVideoUpload/ImageVideoUpload.vue b/src/components/ImageVideoUpload/ImageVideoUpload.vue index b1553ce..03657bd 100644 --- a/src/components/ImageVideoUpload/ImageVideoUpload.vue +++ b/src/components/ImageVideoUpload/ImageVideoUpload.vue @@ -87,11 +87,56 @@ + + + + + 文件 + ({{ fileList.length }}/{{ maxFileCount }}) + + + + + + + + + + {{ file.name }} + {{ formatFileSize(file.size) }} + {{ file.extension?.toUpperCase() || 'FILE' }} + + + + + + + + + + + + 添加文件 + + + @@ -842,4 +1093,84 @@ defineExpose({ color: #999; margin-top: 8rpx; } + +/* 文件相关样式 */ +.file-list { + display: flex; + flex-direction: column; + gap: 12rpx; +} + +.file-item { + display: flex; + align-items: center; + background: #f8f9fa; + border-radius: 8rpx; + padding: 16rpx; + border: 1rpx solid #e9ecef; + position: relative; +} + +.file-preview { + display: flex; + align-items: center; + flex: 1; + cursor: pointer; +} + +.file-icon { + width: 60rpx; + height: 60rpx; + background: white; + border-radius: 8rpx; + display: flex; + align-items: center; + justify-content: center; + margin-right: 16rpx; + border: 1rpx solid #dee2e6; +} + +.file-info { + flex: 1; + min-width: 0; +} + +.file-name { + font-size: 28rpx; + color: #333; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-bottom: 4rpx; +} + +.file-size { + font-size: 24rpx; + color: #999; + display: block; + margin-bottom: 2rpx; +} + +.file-type { + font-size: 20rpx; + color: #666; + display: block; +} + +.file-actions { + position: absolute; + top: 8rpx; + right: 8rpx; +} + +.file-actions .delete-btn { + width: 32rpx; + height: 32rpx; + background: rgba(255, 59, 48, 0.8); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/components/ImageVideoUpload/types.ts b/src/components/ImageVideoUpload/types.ts index 44cf045..0096844 100644 --- a/src/components/ImageVideoUpload/types.ts +++ b/src/components/ImageVideoUpload/types.ts @@ -17,6 +17,17 @@ export interface VideoItem { thumbnail?: string // 缩略图路径 } +// 文件项接口 +export interface FileItem { + tempPath?: string // 临时路径(用于预览) + url?: string // 服务器路径(上传成功后) + name?: string // 文件名 + type?: string // 文件类型(image/video/audio/document等) + size?: number // 文件大小(字节) + extension?: string // 文件扩展名 + mimeType?: string // MIME类型 +} + // 压缩配置接口 export interface CompressConfig { image: { @@ -45,6 +56,12 @@ export interface ImageVideoUploadProps { maxVideoCount?: number videoList?: VideoItem[] + // 文件相关 + enableFile?: boolean + maxFileCount?: number + fileList?: FileItem[] + allowedFileTypes?: string[] // 允许的文件类型,如 ['pdf', 'doc', 'docx', 'mp3', 'wav'] + // 压缩配置 compressConfig?: CompressConfig @@ -57,11 +74,14 @@ export interface ImageVideoUploadProps { export interface ImageVideoUploadEmits { 'update:imageList': [images: ImageItem[]] 'update:videoList': [videos: VideoItem[]] + 'update:fileList': [files: FileItem[]] 'image-upload-success': [image: ImageItem, index: number] 'image-upload-error': [error: any, index: number] 'video-upload-success': [video: VideoItem, index: number] 'video-upload-error': [error: any, index: number] - 'upload-progress': [type: 'image' | 'video', current: number, total: number] + 'file-upload-success': [file: FileItem, index: number] + 'file-upload-error': [error: any, index: number] + 'upload-progress': [type: 'image' | 'video' | 'file', current: number, total: number] } // 默认压缩配置 diff --git a/src/pages.json b/src/pages.json index 1c23ea3..9a369bd 100644 --- a/src/pages.json +++ b/src/pages.json @@ -136,6 +136,48 @@ "enablePullDownRefresh": false } }, + { + "path": "pages/view/routine/yishiyice/addkcrw", + "style": { + "navigationBarTitleText": "新增任务", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/routine/yishiyice/editkcrw", + "style": { + "navigationBarTitleText": "修改任务", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/routine/yishiyice/detail", + "style": { + "navigationBarTitleText": "任务列表", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/routine/yishiyice/push", + "style": { + "navigationBarTitleText": "任务推送", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/routine/yishiyice/kcrwzx", + "style": { + "navigationBarTitleText": "任务执行", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/routine/yishiyice/kcrwzxtj", + "style": { + "navigationBarTitleText": "提交任务", + "enablePullDownRefresh": false + } + }, { "path": "pages/view/routine/yishiyice/success", "style": { @@ -143,6 +185,20 @@ "enablePullDownRefresh": false } }, + { + "path": "pages/view/rw/index", + "style": { + "navigationBarTitleText": "任务执行", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/rw/detail", + "style": { + "navigationBarTitleText": "任务详情", + "enablePullDownRefresh": false + } + }, { "path": "pages/view/routine/JiaoXueZiYuan/index", "style": { diff --git a/src/pages/base/message/detail.vue b/src/pages/base/message/detail.vue index 43f1baa..41f2bd3 100644 --- a/src/pages/base/message/detail.vue +++ b/src/pages/base/message/detail.vue @@ -95,7 +95,7 @@ onLoad(async (options) => { rwflx.value = result.rwlxes; rw.value = result; for (let i = 0; i < rwflx.value.length; i++) { - if (rwflx.value[i].rwfl == "sctp" || rwflx.value[i].rwfl == "scsp" || rwflx.value[i].rwfl == "scwd") { + if (rwflx.value[i].rwfl == "sczy") { schema.push({ field: `${rwflx.value[i].id}`, label: `${rwflx.value[i].rwbt}`, diff --git a/src/pages/base/service/index.vue b/src/pages/base/service/index.vue index 7dd7070..02528fa 100644 --- a/src/pages/base/service/index.vue +++ b/src/pages/base/service/index.vue @@ -263,7 +263,23 @@ const sections = reactive([ permissionKey: "routine-yrcg", // 一日常规权限编码 path: "/pages/view/quantitativeAssessment/index/index", }, - + { + id: "r14", + icon: "ysyc", + text: "一师一策", + show: true, + permissionKey: "routine-ysyc", // 一日一策权限编码 + path: "/pages/view/routine/yishiyice/index", + }, + { + id: "r15", + icon: "rwzx", + text: "任务执行", + show: true, + permissionKey: "routine-ysyc", // 一日一策权限编码 + path: "/pages/view/rw/index", + }, +//path: "/pages/view/routine/yishiyice/index"rw/index, ], }, { diff --git a/src/pages/view/routine/yishiyice/addkcrw.vue b/src/pages/view/routine/yishiyice/addkcrw.vue new file mode 100644 index 0000000..cd4b7a8 --- /dev/null +++ b/src/pages/view/routine/yishiyice/addkcrw.vue @@ -0,0 +1,1190 @@ + + + + + + + + + + 基本信息 + + + + + 任务名称: + + + + + + 任务描述: + + + + + + 截止时间: + + + + {{ formData.rwjstime || '请选择截止时间' }} + + + + + + + + 负责人: + + + + + + 附件: + + + + + + + + + + + 任务下发设置 + + + + 新增任务方式 + + + + + + + + + 任务方式: + + + {{ getTaskTypeLabel(taskType.rwfl) }} + ▼ + + + + + × + + + + + + + + + × + + + + {{ itemIndex + 1 }} + + + + + ✓ + + 默认必填 + + + + + + + + + + + + + + + 添加任务项 + + + + + + + + + + + + + + + + 取消 + + + {{ isSubmitting ? '保存中...' : '保存' }} + + + + + + + + + \ No newline at end of file diff --git a/src/pages/view/routine/yishiyice/detail.vue b/src/pages/view/routine/yishiyice/detail.vue new file mode 100644 index 0000000..4518911 --- /dev/null +++ b/src/pages/view/routine/yishiyice/detail.vue @@ -0,0 +1,1193 @@ + + + + + + + 任务列表 + ({{ taskSummary.allNum }}) + + + 课程成员 + ({{ memberCount }}) + + + + + + + + + + + {{ taskSummary.allNum }} + 总任务 + + + {{ taskSummary.complateNum }} + 已完成 + + + {{ taskSummary.noComplateNum }} + 未完成 + + + + + + + 加载中... + + + + {{ getEmptyStateText() }} + 点击底部按钮创建第一个任务 + + + + + + + + — + + + × + + + + + + + + {{ task.rwmc }} + + + 截止:{{ formatDate(task.rwjstime) }} + 负责人:{{ task.rwfzrxm }} + + + + + + + + + 推送 + + + 执行情况 + + + + + + + + + + + + + + 加载中... + + + + 暂无课程成员 + 点击底部按钮添加成员 + + + + + + + {{ groupName }} + ({{ groupMembers.length }}人) + + + + + + {{ member.jsxm?.charAt(0) || '?' }} + + + {{ member.jsxm }} + {{ member.jsId }} + + + + 分组 + + + 删除 + + + + + + + + + + + + + + + + + 新增任务 + + + + + + 新增成员 + + + + + + + + \ No newline at end of file diff --git a/src/pages/view/routine/yishiyice/editkcrw.vue b/src/pages/view/routine/yishiyice/editkcrw.vue new file mode 100644 index 0000000..4f8aac0 --- /dev/null +++ b/src/pages/view/routine/yishiyice/editkcrw.vue @@ -0,0 +1,1423 @@ + + + + + + + + + + 基本信息 + + + + + 任务名称: + + + + + + 任务描述: + + + + + + 截止时间: + + + + {{ formData.rwjstime || '请选择截止时间' }} + + + + + + + + 负责人: + + + + + + 附件: + + + + + + + + + + + 任务下发设置 + + + + 新增任务方式 + + + + + + + + + 任务方式: + + + {{ getTaskTypeLabel(taskType.rwfl) }} + ▼ + + + + + × + + + + + + + + + × + + + + {{ itemIndex + 1 }} + + + + + ✓ + + 默认必填 + + + + + + + + + + + + + + + 添加任务项 + + + + + + + + + + + + + + + + 取消 + + + {{ isSubmitting ? '保存中...' : '保存' }} + + + + + + + + + \ No newline at end of file diff --git a/src/pages/view/routine/yishiyice/index.vue b/src/pages/view/routine/yishiyice/index.vue index 1b731f4..844886f 100644 --- a/src/pages/view/routine/yishiyice/index.vue +++ b/src/pages/view/routine/yishiyice/index.vue @@ -1,312 +1,500 @@ - - - - - - - - - - - - - - {{ item.title }} - {{ item.subtitle }} - - - - - - - - 暂无内容 + + + + + + + + + + - - - - - - - {{ course.title }} - {{ course.description }} - {{ course.date }} - - 立即报名 - - - - + + + + + 加载中... + + + + {{ course.kcmc }} + + > + + + + + + 课程描述: + {{ course.kcms || '暂无描述' }} + + + 主讲教师: + {{ course.jsxm }} + + + 班主任: + {{ course.bzrxm }} + + + 联系人: + {{ course.ljlxxm }} + + + + + + 暂无课程数据 + + + + 加载中... + + + + + 没有更多数据了 + + + + + + + + + - \ No newline at end of file diff --git a/src/pages/view/routine/yishiyice/kcrwzx.vue b/src/pages/view/routine/yishiyice/kcrwzx.vue new file mode 100644 index 0000000..4317573 --- /dev/null +++ b/src/pages/view/routine/yishiyice/kcrwzx.vue @@ -0,0 +1,886 @@ + + + + + 任务执行情况 + + + + + {{ taskInfo.rwmc }} + + 截止时间:{{ formatDate(taskInfo.rwjstime) }} + 负责人:{{ taskInfo.rwfzrxm }} + + + + + + + 完成情况:{{ completionStats.completed }} | {{ completionStats.total }} + + + + + + 已提交 + ({{ completionStats.completed }}) + + + 未提交 + ({{ completionStats.pending }}) + + + + + + + + + 加载中... + + + + {{ activeTab === 'submitted' ? '暂无已提交记录' : '暂无未提交记录' }} + + + + + + + + {{ execution.rwzxfzrxm?.charAt(0) || '?' }} + + + {{ execution.rwzxfzrxm }} + {{ execution.rwzxfzr }} + + + + + + + {{ execution.rwzxzt === 'A' ? '已完成' : '未完成' }} + + + + + {{ formatDateTime(execution.rwzxtime) }} + + + + + + → + + + + + + + + + + 评论交流 + + 👍 {{ commentStats.likes }} + 💬 {{ commentStats.comments }} + + + + + + + 暂无评论 + + + + + + + {{ comment.userName?.charAt(0) || '?' }} + + {{ comment.userName }} + + + {{ comment.content }} + + + {{ formatDateTime(comment.createTime) }} + + + + + + + + + + 发送 + + + + + + + + + \ No newline at end of file diff --git a/src/pages/view/routine/yishiyice/kcrwzxtj.vue b/src/pages/view/routine/yishiyice/kcrwzxtj.vue new file mode 100644 index 0000000..bc00075 --- /dev/null +++ b/src/pages/view/routine/yishiyice/kcrwzxtj.vue @@ -0,0 +1,431 @@ + + + + 加载中... + + + + {{ rw.rwmc }} + + + {{ rw.rwkstime }} + + + + + + + + onChange?.(file, field)" + @video-upload-success="(file, index) => onChange?.(file, field)" + @file-upload-success="(file, index) => onChange?.(file, field)" + v-bind="componentProps" + /> + + + + + 提交 + + + + + + + + + diff --git a/src/pages/view/routine/yishiyice/push.vue b/src/pages/view/routine/yishiyice/push.vue new file mode 100644 index 0000000..10b3da1 --- /dev/null +++ b/src/pages/view/routine/yishiyice/push.vue @@ -0,0 +1,875 @@ + + + + + {{ taskInfo.rwmc }} + + 截止时间:{{ formatDate(taskInfo.rwjstime) }} + 负责人:{{ taskInfo.rwfzrxm }} + + + + + + + 选择推送对象 + + 全选 + 取消全选 + + + + + + + + + + + ✓ + - + + + {{ groupName }} + ({{ groupMembers.length }}人) + + + + + + + + + + ✓ + + + + {{ member.jsxm?.charAt(0) || '?' }} + + + {{ member.jsxm }} + + + + + + + + + + 暂无课程成员 + 请先添加课程成员 + + + + + + 已选择 {{ selectedCount }} 名成员 + + + + + + + + 取消 + + + {{ isSubmitting ? '推送中...' : '确认推送' }} + + + + + + + + + 正在推送任务... + 请稍候,不要重复点击 + + + + + + + + diff --git a/src/pages/view/rw/detail.vue b/src/pages/view/rw/detail.vue index 43f1baa..41f2bd3 100644 --- a/src/pages/view/rw/detail.vue +++ b/src/pages/view/rw/detail.vue @@ -95,7 +95,7 @@ onLoad(async (options) => { rwflx.value = result.rwlxes; rw.value = result; for (let i = 0; i < rwflx.value.length; i++) { - if (rwflx.value[i].rwfl == "sctp" || rwflx.value[i].rwfl == "scsp" || rwflx.value[i].rwfl == "scwd") { + if (rwflx.value[i].rwfl == "sczy") { schema.push({ field: `${rwflx.value[i].id}`, label: `${rwflx.value[i].rwbt}`, diff --git a/src/pages/view/rw/index.vue b/src/pages/view/rw/index.vue index 43f1baa..06ac88d 100644 --- a/src/pages/view/rw/index.vue +++ b/src/pages/view/rw/index.vue @@ -1,273 +1,322 @@ - - - 加载中... - - - - {{ rw.rwmc }} - {{ rw.tagText }} - - - {{ rw.rwkstime }} - - - - - + + + + + - - - - 处理 - - - - + + + + {{ task.rwmc || '任务名称' }} + + 任务描述:{{ task.rwms || '暂无描述' }} + + + 执行状态:{{ getStatusText(task.zxzt) }} + + + 发布时间:{{ formatDate(task.fbsj) }} + + + 截止时间:{{ formatDate(task.jzsj) }} + + + 执行结果:{{ task.zxjg }} + + + + + + + 暂无任务数据 + + + + + 加载中... + + - - + \ No newline at end of file diff --git a/src/pages/view/rw/indexbak.vue b/src/pages/view/rw/indexbak.vue new file mode 100644 index 0000000..41f2bd3 --- /dev/null +++ b/src/pages/view/rw/indexbak.vue @@ -0,0 +1,273 @@ + + + + 加载中... + + + + {{ rw.rwmc }} + {{ rw.tagText }} + + + {{ rw.rwkstime }} + + + + + + + + + + 处理 + + + + + + + + + diff --git a/src/pages/view/rw/rwlist.vue b/src/pages/view/rw/rwlist.vue new file mode 100644 index 0000000..41f2bd3 --- /dev/null +++ b/src/pages/view/rw/rwlist.vue @@ -0,0 +1,273 @@ + + + + 加载中... + + + + {{ rw.rwmc }} + {{ rw.tagText }} + + + {{ rw.rwkstime }} + + + + + + + + + + 处理 + + + + + + + + + diff --git a/src/static/base/home/ysyc.png b/src/static/base/home/ysyc.png new file mode 100644 index 0000000..d20985b Binary files /dev/null and b/src/static/base/home/ysyc.png differ