hookehuyr

refactor(components): 重构组件目录结构,将UI组件按功能分类到对应子目录

将原ui目录下的组件按功能分类移动到新的子目录中:
- 将GradientHeader、ConfirmDialog等基础组件移至common目录
- 将CourseCard、LiveStreamCard等课程相关组件移至courses目录
- 将FrostedGlass等视觉特效组件移至effects目录
- 将VideoPlayer、AudioPlayer等媒体组件移至media目录
- 将CheckInDialog等打卡相关组件移至checkin目录
- 更新所有引用路径以匹配新的目录结构
Showing 83 changed files with 140 additions and 114 deletions
......@@ -262,3 +262,22 @@ src/
- 选中对象首次会弹窗确认(标记 `has_confirmed`),支持新增/编辑;删除对象调用 `gratitudeDeleteAPI`(当前页面内未引入该 API,需补齐后才可生效)。
- 预览能力:
- 上传组件点击预览时,根据扩展名识别:音频使用 `AudioPlayer` 底部弹窗;视频使用 `VideoPlayer` 居中弹窗(封面 → 点击播放 → 关闭时重置进度);图片使用 `van-image-preview`
## /src/components 目录下组件
| 目标目录(src/components/) | 包含组件 | 说明 |
| --------------------------- | ------------------------------------------------------------ | ---------------- |
| `checkin/` | `CheckInDialog.vue`, `CheckInList.vue`, `CheckInResult.vue` | 打卡相关组件 |
| `media/` | `AudioPlayer.vue`, `VideoPlayer.vue`, `MusicPlayer.vue` | 音视频播放组件 |
| `activity/` | `ActivityApplyHistoryPopup.vue`, `ActivityCard.vue`, `ActivityStatusBadge.vue`, `ActivityTicket.vue` | 活动相关组件 |
| `common/` | `ConfirmDialog.vue`, `GradientHeader.vue`, `MenuItem.vue`, `SearchBar.vue`, `TermsPopup.vue`, `UserAgreement.vue` | 通用基础组件 |
| `effects/` | `FrostedGlass.vue`, `LoadingSpinner.vue` | 视觉特效组件 |
| `courses/` | `CourseCard.vue`, `LiveStreamCard.vue` | 课程展示组件 |
| `payment/` | `WechatPayment.vue` | 支付组件 |
| `studyDetail/` | `StudyMaterialsPopup.vue` | 学习资料弹窗 |
| `layout/` | `AppLayout.vue`, `BottomNav.vue` | 布局与导航 |
| `share/` | `SharePoster.vue` | 分享海报 |
| `files/` | `FilePreview.vue` | 文件预览 |
| `feedback/` | `FeedbackForm.vue` | 反馈表单 |
---
......
......@@ -8,52 +8,52 @@ export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
ActivityApplyHistoryPopup: typeof import('./components/ui/ActivityApplyHistoryPopup.vue')['default']
ActivityCard: typeof import('./components/ui/ActivityCard.vue')['default']
ActivityApplyHistoryPopup: typeof import('./components/activity/ActivityApplyHistoryPopup.vue')['default']
ActivityCard: typeof import('./components/activity/ActivityCard.vue')['default']
AddTargetDialog: typeof import('./components/count/AddTargetDialog.vue')['default']
AppLayout: typeof import('./components/layout/AppLayout.vue')['default']
AudioPlayer: typeof import('./components/ui/AudioPlayer.vue')['default']
AudioPlayer: typeof import('./components/media/AudioPlayer.vue')['default']
BottomNav: typeof import('./components/layout/BottomNav.vue')['default']
CheckinCard: typeof import('./components/checkin/CheckinCard.vue')['default']
CheckInDialog: typeof import('./components/ui/CheckInDialog.vue')['default']
CheckInList: typeof import('./components/ui/CheckInList.vue')['default']
CheckInDialog: typeof import('./components/checkin/CheckInDialog.vue')['default']
CheckInList: typeof import('./components/checkin/CheckInList.vue')['default']
CheckinTargetList: typeof import('./components/count/CheckinTargetList.vue')['default']
CollapsibleCalendar: typeof import('./components/ui/CollapsibleCalendar.vue')['default']
ConfirmDialog: typeof import('./components/ui/ConfirmDialog.vue')['default']
CourseCard: typeof import('./components/ui/CourseCard.vue')['default']
CourseGroupCascader: typeof import('./components/ui/CourseGroupCascader.vue')['default']
CourseImageCard: typeof import('./components/ui/CourseImageCard.vue')['default']
CollapsibleCalendar: typeof import('./components/calendar/CollapsibleCalendar.vue')['default']
ConfirmDialog: typeof import('./components/common/ConfirmDialog.vue')['default']
CourseCard: typeof import('./components/courses/CourseCard.vue')['default']
CourseGroupCascader: typeof import('./components/courses/CourseGroupCascader.vue')['default']
CourseImageCard: typeof import('./components/courses/CourseImageCard.vue')['default']
CourseList: typeof import('./components/courses/CourseList.vue')['default']
FeaturedCoursesSection: typeof import('./components/homePage/FeaturedCoursesSection.vue')['default']
FormPage: typeof import('./components/infoEntry/formPage.vue')['default']
FrostedGlass: typeof import('./components/ui/FrostedGlass.vue')['default']
GradientHeader: typeof import('./components/ui/GradientHeader.vue')['default']
FrostedGlass: typeof import('./components/effects/FrostedGlass.vue')['default']
GradientHeader: typeof import('./components/common/GradientHeader.vue')['default']
HotCoursesSection: typeof import('./components/homePage/HotCoursesSection.vue')['default']
LatestActivitiesSection: typeof import('./components/homePage/LatestActivitiesSection.vue')['default']
LiveStreamCard: typeof import('./components/ui/LiveStreamCard.vue')['default']
MenuItem: typeof import('./components/ui/MenuItem.vue')['default']
OfficeViewer: typeof import('./components/ui/OfficeViewer.vue')['default']
PdfPreview: typeof import('./components/ui/PdfPreview.vue')['default']
PdfViewer: typeof import('./components/ui/PdfViewer.vue')['default']
LiveStreamCard: typeof import('./components/courses/LiveStreamCard.vue')['default']
MenuItem: typeof import('./components/common/MenuItem.vue')['default']
OfficeViewer: typeof import('./components/media/OfficeViewer.vue')['default']
PdfPreview: typeof import('./components/media/PdfPreview.vue')['default']
PdfViewer: typeof import('./components/media/PdfViewer.vue')['default']
PostCountModel: typeof import('./components/count/postCountModel.vue')['default']
RecallPoster: typeof import('./components/ui/RecallPoster.vue')['default']
RecallPoster: typeof import('./components/poster/RecallPoster.vue')['default']
RecommendationsSection: typeof import('./components/homePage/RecommendationsSection.vue')['default']
ReviewPopup: typeof import('./components/courses/ReviewPopup.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SearchBar: typeof import('./components/ui/SearchBar.vue')['default']
SharePoster: typeof import('./components/ui/SharePoster.vue')['default']
SearchBar: typeof import('./components/common/SearchBar.vue')['default']
SharePoster: typeof import('./components/poster/SharePoster.vue')['default']
StarryBackground: typeof import('./components/effects/StarryBackground.vue')['default']
StudyCatalogPopup: typeof import('./components/studyDetail/StudyCatalogPopup.vue')['default']
StudyCommentsSection: typeof import('./components/studyDetail/StudyCommentsSection.vue')['default']
StudyMaterialsPopup: typeof import('./components/studyDetail/StudyMaterialsPopup.vue')['default']
SummerCampCard: typeof import('./components/ui/SummerCampCard.vue')['default']
TaskCalendar: typeof import('./components/ui/TaskCalendar.vue')['default']
SummerCampCard: typeof import('./components/courses/SummerCampCard.vue')['default']
TaskCalendar: typeof import('./components/calendar/TaskCalendar.vue')['default']
TaskCascaderFilter: typeof import('./components/teacher/TaskCascaderFilter.vue')['default']
TaskFilter: typeof import('./components/teacher/TaskFilter.vue')['default']
TermsPopup: typeof import('./components/ui/TermsPopup.vue')['default']
UploadVideoPopup: typeof import('./components/ui/UploadVideoPopup.vue')['default']
UserAgreement: typeof import('./components/ui/UserAgreement.vue')['default']
TermsPopup: typeof import('./components/common/TermsPopup.vue')['default']
UploadVideoPopup: typeof import('./components/checkin/UploadVideoPopup.vue')['default']
UserAgreement: typeof import('./components/common/UserAgreement.vue')['default']
VanActionSheet: typeof import('vant/es')['ActionSheet']
VanBackTop: typeof import('vant/es')['BackTop']
VanBadge: typeof import('vant/es')['Badge']
......@@ -101,8 +101,8 @@ declare module 'vue' {
VanTag: typeof import('vant/es')['Tag']
VanTimePicker: typeof import('vant/es')['TimePicker']
VanUploader: typeof import('vant/es')['Uploader']
VideoBackground: typeof import('./components/ui/VideoBackground.vue')['default']
VideoPlayer: typeof import('./components/ui/VideoPlayer.vue')['default']
VideoBackground: typeof import('./components/media/VideoBackground.vue')['default']
VideoPlayer: typeof import('./components/media/VideoPlayer.vue')['default']
WechatPayment: typeof import('./components/payment/WechatPayment.vue')['default']
}
}
......
......@@ -75,7 +75,7 @@
</template>
<script setup>
import FrostedGlass from './FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
const props = defineProps({
activity: {
......
......@@ -22,7 +22,7 @@
<script setup>
import { ref, computed, onMounted, provide } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import CheckInList from '@/components/ui/CheckInList.vue'
import CheckInList from '@/components/checkin/CheckInList.vue'
import { getTaskListAPI } from "@/api/checkin";
import { normalizeCheckinTaskItems } from '@/utils/tools'
......
......@@ -98,8 +98,8 @@
<script setup>
import { ref } from 'vue'
import PostCountModel from "@/components/count/postCountModel.vue";
import VideoPlayer from "@/components/ui/VideoPlayer.vue";
import AudioPlayer from "@/components/ui/AudioPlayer.vue";
import VideoPlayer from "@/components/media/VideoPlayer.vue";
import AudioPlayer from "@/components/media/AudioPlayer.vue";
const props = defineProps({
/**
......
......@@ -40,7 +40,7 @@
<script setup>
import { ref, watch } from 'vue';
import { showToast } from 'vant';
import VideoPlayer from '@/components/ui/VideoPlayer.vue';
import VideoPlayer from '@/components/media/VideoPlayer.vue';
import { uploadFile, validateFile } from '@/utils/upload';
const props = defineProps({
......
......@@ -35,7 +35,7 @@
* @description 确认对话框组件,基于 FrostedGlass
-->
<script setup>
import FrostedGlass from './FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
const props = defineProps({
/** 是否显示弹窗 (v-model) */
......
......@@ -33,7 +33,7 @@
<script setup>
import { watch, ref } from 'vue'
import { useRouter } from 'vue-router'
import FrostedGlass from './FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
const router = useRouter()
......
......@@ -21,7 +21,7 @@
<script setup>
import { ref, onMounted } from 'vue'
import CourseCard from '@/components/ui/CourseCard.vue'
import CourseCard from '@/components/courses/CourseCard.vue'
import { getCourseListAPI } from '@/api/course'
const courses = ref([])
......
......@@ -19,7 +19,7 @@
<script setup>
import { ref, onMounted } from 'vue'
import ActivityCard from '@/components/ui/ActivityCard.vue'
import ActivityCard from '@/components/activity/ActivityCard.vue'
const activities = ref([])
......
......@@ -43,7 +43,7 @@
<script setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import { getCourseListAPI } from '@/api/course'
const router = useRouter()
......
......@@ -23,7 +23,7 @@
<script setup>
import BottomNav from './BottomNav.vue'
import GradientHeader from '../ui/GradientHeader.vue'
import GradientHeader from '../common/GradientHeader.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
......
......@@ -64,7 +64,7 @@
<script setup>
import { ref, onMounted } from 'vue'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import { wxPayAPI, wxPayCheckAPI } from "@/api/wx/pay"
// 定义组件的props
......
......@@ -81,7 +81,7 @@
<script setup>
import { computed } from 'vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
const props = defineProps({
/** 是否显示资料弹窗 (v-model) */
......
......@@ -330,10 +330,10 @@ import { useRoute } from 'vue-router'
// 导入布局和UI组件
import AppLayout from '@/components/layout/AppLayout.vue'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import LiveStreamCard from '@/components/ui/LiveStreamCard.vue'
import VideoPlayer from '@/components/ui/VideoPlayer.vue'
import CheckInList from '@/components/ui/CheckInList.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import LiveStreamCard from '@/components/courses/LiveStreamCard.vue'
import VideoPlayer from '@/components/media/VideoPlayer.vue'
import CheckInList from '@/components/checkin/CheckInList.vue'
import FeaturedCoursesSection from '@/components/homePage/FeaturedCoursesSection.vue'
import RecommendationsSection from '@/components/homePage/RecommendationsSection.vue'
......
......@@ -151,7 +151,7 @@
import { ref, computed, defineComponent, h } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import AppLayout from '@/components/layout/AppLayout.vue'
import ActivityCard from '@/components/ui/ActivityCard.vue'
import ActivityCard from '@/components/activity/ActivityCard.vue'
import { activities } from '@/utils/mockData'
import { useTitle } from '@vueuse/core';
const $route = useRoute();
......
......@@ -2,7 +2,7 @@
import { ref, onMounted, defineComponent, h } from "vue";
import { useRoute, useRouter } from "vue-router";
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
import { activities } from "@/utils/mockData";
import { useTitle } from '@vueuse/core';
const $route = useRoute();
......
......@@ -116,7 +116,7 @@
<script setup>
import { ref, reactive, computed, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import { activities } from '@/utils/mockData'
import { useTitle } from '@vueuse/core';
const $route = useRoute();
......
......@@ -35,7 +35,7 @@
<script setup>
import { ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import ActivityCard from '@/components/ui/ActivityCard.vue'
import ActivityCard from '@/components/activity/ActivityCard.vue'
import { activities as mockActivities } from '@/utils/mockData'
import { useTitle } from '@vueuse/core';
const $route = useRoute();
......
......@@ -109,7 +109,7 @@
<script setup>
import { ref, reactive } from 'vue'
import { useRouter } from 'vue-router'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import { smsAPI } from '@/api/common';
import { resetPasswordAPI } from '@/api/users';
import { showToast } from 'vant';
......
......@@ -184,13 +184,13 @@
<script setup>
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
import { useAuth } from "@/contexts/auth";
import { loginAPI, getUserInfoAPI } from "@/api/users";
import { useTitle } from "@vueuse/core";
import { smsAPI } from "@/api/common";
import { showToast } from "vant";
import UserAgreement from "@/components/ui/UserAgreement.vue";
import UserAgreement from "@/components/common/UserAgreement.vue";
import { setAuthHeaders } from "@/utils/axios";
import { applyUserInfoAuth } from "@/utils/auth_user_info";
import weixinLogo from '@/assets/images/weixin_logo_lg.jpeg'
......
......@@ -181,8 +181,8 @@
<script setup>
import { ref, reactive } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import TermsPopup from '@/components/ui/TermsPopup.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import TermsPopup from '@/components/common/TermsPopup.vue'
import { useAuth } from '@/contexts/auth'
import { useTitle } from '@vueuse/core';
import { smsAPI } from '@/api/common';
......
......@@ -177,8 +177,8 @@ import { getTaskDetailAPI, getUploadTaskInfoAPI, getSubtaskListAPI, reuseGratitu
import { useTitle } from '@vueuse/core'
import { useCheckin } from '@/composables/useCheckin'
import { normalizeAttachmentTypeConfig } from '@/utils/tools'
import AudioPlayer from '@/components/ui/AudioPlayer.vue'
import VideoPlayer from '@/components/ui/VideoPlayer.vue'
import AudioPlayer from '@/components/media/AudioPlayer.vue'
import VideoPlayer from '@/components/media/VideoPlayer.vue'
import AddTargetDialog from '@/components/count/AddTargetDialog.vue'
import CheckinTargetList from '@/components/count/CheckinTargetList.vue'
import { showToast, showLoadingToast } from 'vant'
......
......@@ -61,7 +61,7 @@
import { ref, computed } from "vue";
import { DatePicker, List, Popup } from "vant";
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
// 列表数据
const list = ref([]);
......
......@@ -157,8 +157,8 @@ import { ref, onBeforeUnmount, onMounted, computed, nextTick, getCurrentInstance
import { useRoute, useRouter, onBeforeRouteLeave } from 'vue-router'
import { showConfirmDialog, showSuccessToast, showFailToast, showLoadingToast } from 'vant';
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import CollapsibleCalendar from "@/components/ui/CollapsibleCalendar.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
import CollapsibleCalendar from "@/components/calendar/CollapsibleCalendar.vue";
import PostCountModel from "@/components/count/postCountModel.vue";
import CheckinCard from "@/components/checkin/CheckinCard.vue";
import { useTitle, useResizeObserver, useScroll } from '@vueuse/core';
......
......@@ -59,7 +59,7 @@
import { ref, computed } from "vue";
import { DatePicker, List, Popup } from "vant";
import AppLayout from '@/components/layout/AppLayout.vue'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
// 列表数据
const list = ref([]);
......
......@@ -60,7 +60,7 @@
import { ref, computed } from "vue";
import { DatePicker, List, Popup } from "vant";
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
// 列表数据
const list = ref([]);
......
......@@ -60,7 +60,7 @@
import { ref, computed } from "vue";
import { DatePicker, List, Popup } from "vant";
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
// 列表数据
const list = ref([]);
......
......@@ -259,8 +259,8 @@
import { ref, onMounted, onUnmounted, watch, nextTick } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import AppLayout from '@/components/layout/AppLayout.vue'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import ConfirmDialog from '@/components/ui/ConfirmDialog.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import ConfirmDialog from '@/components/common/ConfirmDialog.vue'
import WechatPayment from '@/components/payment/WechatPayment.vue'
import FormPage from '@/components/infoEntry/formPage.vue'
import { useCart } from '@/contexts/cart'
......
......@@ -338,9 +338,9 @@ import { sharePage } from '@/composables/useShare.js'
import { useImageLoader } from '@/composables/useImageLoader'
import AppLayout from '@/components/layout/AppLayout.vue'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import SharePoster from '@/components/ui/SharePoster.vue'
import CheckInDialog from '@/components/ui/CheckInDialog.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import SharePoster from '@/components/poster/SharePoster.vue'
import CheckInDialog from '@/components/checkin/CheckInDialog.vue'
// 导入接口
import { getCourseDetailAPI, getGroupCommentListAPI, addGroupCommentAPI } from "@/api/course";
......
......@@ -33,8 +33,8 @@
import { ref, onMounted, watch } from 'vue';
import { useRoute } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import SearchBar from '@/components/ui/SearchBar.vue';
import CourseCard from '@/components/ui/CourseCard.vue';
import SearchBar from '@/components/common/SearchBar.vue';
import CourseCard from '@/components/courses/CourseCard.vue';
import { courses as mockCourses } from '@/utils/mockData';
// 导入接口
import { getCourseListAPI } from "@/api/course";
......
......@@ -31,8 +31,8 @@
import { ref, onMounted, computed } from 'vue';
import { useRoute } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import CourseCard from '@/components/ui/CourseCard.vue';
import CourseImageCard from '@/components/ui/CourseImageCard.vue';
import CourseCard from '@/components/courses/CourseCard.vue';
import CourseImageCard from '@/components/courses/CourseImageCard.vue';
// 导入接口
import { getScheduleCombinationListAPI } from "@/api/course";
......
......@@ -97,10 +97,10 @@
import { computed, defineComponent, h } from "vue";
import { useRoute, useRouter } from 'vue-router'
import AppLayout from "@/components/layout/AppLayout.vue";
import SearchBar from "@/components/ui/SearchBar.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import CourseCard from "@/components/ui/CourseCard.vue";
import LiveStreamCard from "@/components/ui/LiveStreamCard.vue";
import SearchBar from "@/components/common/SearchBar.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
import CourseCard from "@/components/courses/CourseCard.vue";
import LiveStreamCard from "@/components/courses/LiveStreamCard.vue";
import { featuredCourse, liveStreams } from "@/utils/mockData";
import { useTitle } from '@vueuse/core';
......
......@@ -33,7 +33,7 @@
<script setup>
import { ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import CourseCard from '@/components/ui/CourseCard.vue';
import CourseCard from '@/components/courses/CourseCard.vue';
import { useTitle } from '@vueuse/core';
import AppLayout from "@/components/layout/AppLayout.vue";
......
......@@ -24,7 +24,7 @@
import { ref, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { useTitle } from '@vueuse/core';
// 导入接口
import { getArticleInfoAPI } from "@/api/help";
......
......@@ -49,7 +49,7 @@
import { ref } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { useTitle } from '@vueuse/core';
// 导入接口
import { getArticleListAPI } from "@/api/help";
......
......@@ -111,7 +111,7 @@
import { ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useTitle } from '@vueuse/core';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import AppLayout from '@/components/layout/AppLayout.vue';
import { formatDate } from '@/utils/tools';
......
......@@ -27,7 +27,7 @@
import { ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { useTitle } from '@vueuse/core';
// 导入接口
......
......@@ -66,7 +66,7 @@
import { ref } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { useTitle } from '@vueuse/core';
// 导入接口
......
......@@ -52,8 +52,8 @@
<script setup>
import { ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import CourseCard from '@/components/ui/CourseCard.vue';
import ActivityCard from '@/components/ui/ActivityCard.vue';
import CourseCard from '@/components/courses/CourseCard.vue';
import ActivityCard from '@/components/activity/ActivityCard.vue';
import { courses as mockCourses, activities as mockActivities } from '@/utils/mockData';
import { useTitle } from '@vueuse/core';
import AppLayout from "@/components/layout/AppLayout.vue";
......
......@@ -196,7 +196,7 @@
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { useRoute, useRouter } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
import FrostedGlass from '@/components/effects/FrostedGlass.vue'
import WechatPayment from '@/components/payment/WechatPayment.vue'
import { useTitle } from '@vueuse/core';
import { showConfirmDialog, showToast, Dialog } from 'vant';
......
......@@ -135,10 +135,10 @@
import { ref, h } from "vue";
import { useRoute, useRouter } from "vue-router";
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import MenuItem from "@/components/ui/MenuItem.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
import MenuItem from "@/components/common/MenuItem.vue";
import { useAuth } from "@/contexts/auth";
import CheckInDialog from "@/components/ui/CheckInDialog.vue";
import CheckInDialog from "@/components/checkin/CheckInDialog.vue";
import { getUserInfoAPI } from "@/api/users";
import { showToast } from "vant";
import { useTitle } from "@vueuse/core";
......
......@@ -119,7 +119,7 @@
import { ref, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { ChevronRightIcon } from '@heroicons/vue/24/outline';
import { useTitle } from '@vueuse/core';
import { getUserInfoAPI } from '@/api/users';
......
......@@ -118,7 +118,7 @@ import dayjs from 'dayjs';
import { showToast } from 'vant';
import { normalizeCheckinTaskItems } from '@/utils/tools'
import AppLayout from '@/components/layout/AppLayout.vue';
import CheckInDialog from '@/components/ui/CheckInDialog.vue';
import CheckInDialog from '@/components/checkin/CheckInDialog.vue';
// 导入接口
import { getCourseDetailAPI } from '@/api/course';
......
......@@ -20,8 +20,8 @@
<script setup>
import { ref } from 'vue';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import AudioPlayer from '@/components/ui/AudioPlayer.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import AudioPlayer from '@/components/media/AudioPlayer.vue';
// 测试音频数据
const audioList = ref([
......
......@@ -53,7 +53,7 @@
<script setup>
import { ref, onMounted } from "vue";
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
import { getUserInfoAPI, updateUserInfoAPI } from "@/api/users";
import { qiniuTokenAPI, qiniuUploadAPI, saveFileAPI } from '@/api/common';
import { showToast, showLoadingToast } from 'vant';
......
......@@ -61,7 +61,7 @@
<script setup>
import { ref } from 'vue';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { resetPasswordAPI } from '@/api/users';
import { useTitle } from '@vueuse/core';
......
......@@ -89,7 +89,7 @@
import { ref, onMounted, computed } from 'vue';
import { useRoute } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { getUserInfoAPI, updateUserInfoAPI } from '@/api/users';
import { smsAPI } from '@/api/common';
import { showToast } from 'vant';
......
......@@ -41,7 +41,7 @@
<script setup>
import { ref, onMounted } from 'vue';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { getUserInfoAPI, updateUserInfoAPI } from '@/api/users';
import { showToast } from 'vant';
import { useTitle } from '@vueuse/core';
......
......@@ -95,7 +95,7 @@ import { useRouter } from 'vue-router'
import { useTitle } from '@vueuse/core'
import { showToast } from 'vant'
import ActivityApplyHistoryPopup from '@/components/ui/ActivityApplyHistoryPopup.vue'
import ActivityApplyHistoryPopup from '@/components/activity/ActivityApplyHistoryPopup.vue'
import { userInfoAPI, searchOldActivityAPI } from '@/api/recall_users'
import { oldActivityBatchActivityRegistrationAPI } from '@/api/points'
......
......@@ -40,7 +40,7 @@
import { ref, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useTitle } from '@vueuse/core'
import VideoBackground from '@/components/ui/VideoBackground.vue'
import VideoBackground from '@/components/media/VideoBackground.vue'
import { getQrcodeAPI, trackingAPI } from '@/api/recall_users'
......
<!--
* @Date: 2025-12-23 13:44:58
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-25 11:22:16
* @LastEditTime: 2026-01-21 13:42:54
* @FilePath: /mlaj/src/views/recall/CompleteInfoPage.vue
* @Description: 文件描述
* @Description: 完善信息页面
-->
<template>
<div class="complete-info-page w-full min-h-screen relative overflow-hidden flex flex-col items-center">
......@@ -126,7 +126,7 @@ const handleConfirm = async () => {
// mobile: form.phone,
idcard: form.idCard
})
if (res.code) {
if (res.code === 1) {
// 埋点
trackingAPI({
event_type: 'edit_user'
......@@ -136,7 +136,7 @@ const handleConfirm = async () => {
mobile: form.phone,
idcard: form.idCard
})
if (activityRes.code) {
if (activityRes.code === 1) {
// 更新司总缓存user_info键里面的user_name的值改成新的用户名
localStorage.setItem('user_info', JSON.stringify({
...JSON.parse(localStorage.getItem('user_info') || '{}'),
......
<!--
* @Date: 2025-12-23 13:44:58
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2026-01-21 13:42:30
* @FilePath: /mlaj/src/views/recall/IDQueryPage.vue
* @Description: 查询信息页面
-->
<template>
<div class="id-query-page w-full min-h-screen relative overflow-hidden flex flex-col items-center">
<!-- Starry Background -->
......@@ -154,7 +161,7 @@ const handleConfirm = async () => {
mobile: phone.value,
idcard: idCard.value
})
if (res.code) {
if (res.code === 1) {
const campaign_info = res.data?.campaign_info || []
// 如果能查到数据, 则跳转到timeline, 否则弹出提示
const flag = campaign_info.length > 0;
......
......@@ -45,7 +45,7 @@
import { ref, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useTitle } from '@vueuse/core'
import RecallPoster from '@/components/ui/RecallPoster.vue'
import RecallPoster from '@/components/poster/RecallPoster.vue'
import { qiniuTokenAPI, qiniuUploadAPI, saveFileAPI } from '@/api/common'
import { showToast, showLoadingToast } from 'vant'
import { qiniuFileHash } from '@/utils/qiniuFileHash'
......
......@@ -89,7 +89,7 @@ import { useRouter, useRoute } from 'vue-router'
import { showToast } from 'vant'
import { useTitle } from '@vueuse/core'
import { setAuthHeaders } from "@/utils/axios";
import VideoBackground from '@/components/ui/VideoBackground.vue'
import VideoBackground from '@/components/media/VideoBackground.vue'
import { applyUserInfoAuth } from '@/utils/auth_user_info'
// 导入接口
......
......@@ -14,7 +14,7 @@
<script setup>
import { computed, onMounted, onBeforeUnmount } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import PdfViewer from '@/components/ui/PdfViewer.vue'
import PdfViewer from '@/components/media/PdfViewer.vue'
const route = useRoute()
const router = useRouter()
......
......@@ -241,10 +241,10 @@
import { ref, onMounted, nextTick } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useTitle } from '@vueuse/core';
import VideoPlayer from '@/components/ui/VideoPlayer.vue';
import AudioPlayer from '@/components/ui/AudioPlayer.vue';
import CheckInDialog from '@/components/ui/CheckInDialog.vue';
// import OfficeViewer from '@/components/ui/OfficeViewer.vue';
import VideoPlayer from '@/components/media/VideoPlayer.vue';
import AudioPlayer from '@/components/media/AudioPlayer.vue';
import CheckInDialog from '@/components/checkin/CheckInDialog.vue';
// import OfficeViewer from '@/components/media/OfficeViewer.vue';
import dayjs from 'dayjs';
import { showToast } from 'vant';
import { normalizeCheckinTaskItems } from '@/utils/tools'
......
......@@ -151,9 +151,9 @@ import { ref, onBeforeUnmount, onMounted, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { showConfirmDialog, showSuccessToast, showFailToast, showLoadingToast, showToast } from 'vant';
import AppLayout from "@/components/layout/AppLayout.vue";
import FrostedGlass from "@/components/ui/FrostedGlass.vue";
import FrostedGlass from "@/components/effects/FrostedGlass.vue";
import CheckinCard from "@/components/checkin/CheckinCard.vue";
import CourseGroupCascader from '@/components/ui/CourseGroupCascader.vue'
import CourseGroupCascader from '@/components/courses/CourseGroupCascader.vue'
import TaskCascaderFilter from '@/components/teacher/TaskCascaderFilter.vue'
import PostCountModel from '@/components/count/postCountModel.vue'
import { useTitle } from '@vueuse/core';
......
......@@ -381,7 +381,7 @@ import { ref, computed, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { showToast, DatePicker, Popup } from 'vant';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import FrostedGlass from '@/components/effects/FrostedGlass.vue';
import { useTitle } from '@vueuse/core';
import { getTeacherFindSettingsAPI, setTeacherTaskAPI } from "@/api/teacher";
......
......@@ -170,7 +170,7 @@ import { useRouter } from 'vue-router'
import AppLayout from '@/layouts/AppLayout.vue'
import { useTitle } from '@vueuse/core';
import { useAuth } from '@/contexts/auth'
import CourseGroupCascader from '@/components/ui/CourseGroupCascader.vue'
import CourseGroupCascader from '@/components/courses/CourseGroupCascader.vue'
import { getTeacherGradeClassListAPI, getStudentListAPI } from "@/api/teacher";
......
......@@ -31,8 +31,8 @@
<script setup>
import { ref } from 'vue';
import VideoPlayer from '@/components/ui/VideoPlayer.vue';
import UploadVideoPopup from '@/components/ui/UploadVideoPopup.vue';
import VideoPlayer from '@/components/media/VideoPlayer.vue';
import UploadVideoPopup from '@/components/checkin/UploadVideoPopup.vue';
const showUploadPopup = ref(false);
const videos = ref([]);
......