Forráskód Böngészése

university detail - brochures

abpcoder 1 napja
szülő
commit
5fc7f0fb61

+ 4 - 0
src/api/modules/university.ts

@@ -474,4 +474,8 @@ export function concernUniversity(params: any) {
 // 02 移除关注院校
 export function removeConcernedUniversity(params: any) {
     return flyio.get('/front/customer/university/remove', params)
+}
+
+export function getUniversitiesEnrollBrochureDetail(params: any) {
+    return flyio.get('/front/university/getUniversitiesEnrollBrochureDetail', params)
 }

+ 267 - 259
src/common/enum.ts

@@ -2,170 +2,170 @@
  * 应用配置项的 key
  */
 export enum EnumAppConfigKey {
-  /**
-   * 短信验证码是否开启图形验证
-   */
-  SMS_CAPTCHA_ENABLE = 'sys.sms.captchaEnabled'
+    /**
+     * 短信验证码是否开启图形验证
+     */
+    SMS_CAPTCHA_ENABLE = 'sys.sms.captchaEnabled'
 }
 
 /**
  * 短信发送类型
  */
 export enum EnumSmsApiType {
-  /**
-   * 无需校验 无需token 发送短信-适用于登录
-   */
-  NO_VALIDATION_NO_TOKEN = 'NoValidationNoToken',
-  /**
-   * 需校验 需要 token 发送短信-适用于注册
-   */
-  NO_TOKEN = 'NoToken',
-  /**
-   * 普通发送短信
-   */
-  NORMAL = 'normal'
+    /**
+     * 无需校验 无需token 发送短信-适用于登录
+     */
+    NO_VALIDATION_NO_TOKEN = 'NoValidationNoToken',
+    /**
+     * 需校验 需要 token 发送短信-适用于注册
+     */
+    NO_TOKEN = 'NoToken',
+    /**
+     * 普通发送短信
+     */
+    NORMAL = 'normal'
 }
 
 /**
  * 短信类型
  */
 export enum EnumSmsType {
-  /**
-   * code
-   */
-  CODE = 'CODE',
-  /**
-   * ecard
-   */
-  ECARD = 'ECARD',
-  /**
-   * password
-   */
-  PASSWORD = 'PASSWORD'
+    /**
+     * code
+     */
+    CODE = 'CODE',
+    /**
+     * ecard
+     */
+    ECARD = 'ECARD',
+    /**
+     * password
+     */
+    PASSWORD = 'PASSWORD'
 }
 
 export enum EnumDictName {
-  /**
-   * 考生类别
-   */
-  EXAM_TYPE = 'exam_type'
+    /**
+     * 考生类别
+     */
+    EXAM_TYPE = 'exam_type'
 }
 
 export enum STATIC_PAGE_PATH {
-  /**
-   * 登录
-   */
-  LOGIN = '/pagesSystem/pages/login/login',
-  /**
-   * 注册
-   */
-  REGISTER = '/pagesSystem/pages/register/register',
-  /**
-   * 找回密码
-   */
-  FIND_PASSWORD = '/pagesSystem/pages/find-password/find-password',
-  /**
-   * 修改密码
-   */
-  CHANGE_PASSWORD = '/pagesSystem/pages/change-password/change-password',
-  /**
-   * 绑定手机号
-   */
-  BIND_PHONE = '/pagesSystem/pages/bind-phone/bind-phone'
+    /**
+     * 登录
+     */
+    LOGIN = '/pagesSystem/pages/login/login',
+    /**
+     * 注册
+     */
+    REGISTER = '/pagesSystem/pages/register/register',
+    /**
+     * 找回密码
+     */
+    FIND_PASSWORD = '/pagesSystem/pages/find-password/find-password',
+    /**
+     * 修改密码
+     */
+    CHANGE_PASSWORD = '/pagesSystem/pages/change-password/change-password',
+    /**
+     * 绑定手机号
+     */
+    BIND_PHONE = '/pagesSystem/pages/bind-phone/bind-phone'
 }
 
 export enum EnumExamMode {
-  /**
-   * 练习
-   */
-  PRACTICE = 1,
-  /**
-   * 考试
-   */
-  EXAM = 2
+    /**
+     * 练习
+     */
+    PRACTICE = 1,
+    /**
+     * 考试
+     */
+    EXAM = 2
 }
 
 /**
  * 题目类型
  */
 export enum EnumQuestionType {
-  /**
-   * 单选
-   */
-  SINGLE_CHOICE = 1,
-  /**
-   * 多选
-   */
-  MULTIPLE_CHOICE = 2,
-  /**
-   * 判断
-   */
-  JUDGMENT = 3,
-  /**
-   * 填空
-   */
-  FILL_IN_THE_BLANK = 4,
-  /**
-   * 主观题
-   */
-  SUBJECTIVE = 5,
-  /**
-   * 简答
-   */
-  SHORT_ANSWER = 6,
-  /**
-   * 问答题
-   */
-  ESSAY = 7,
-  /**
-   * 分析题
-   */
-  ANALYSIS = 8,
+    /**
+     * 单选
+     */
+    SINGLE_CHOICE = 1,
+    /**
+     * 多选
+     */
+    MULTIPLE_CHOICE = 2,
+    /**
+     * 判断
+     */
+    JUDGMENT = 3,
+    /**
+     * 填空
+     */
+    FILL_IN_THE_BLANK = 4,
+    /**
+     * 主观题
+     */
+    SUBJECTIVE = 5,
+    /**
+     * 简答
+     */
+    SHORT_ANSWER = 6,
+    /**
+     * 问答题
+     */
+    ESSAY = 7,
+    /**
+     * 分析题
+     */
+    ANALYSIS = 8,
 
-  /**
-   * 阅读题
-   */
-  OTHER = 99
+    /**
+     * 阅读题
+     */
+    OTHER = 99
 }
 
 /**
  * 用户类型
  */
 export enum EnumUserType {
-  /**
-   * 系统用户
-   */
-  SYSTEM = '00',
-  /**
-   * 学生
-   */
-  STUDENT = '01',
-  /**
-   * 教师
-   */
-  TEACHER = '11',
-  /**
-   * 代理商
-   */
-  AGENT = '10',
-  /**
-   * 机构
-   */
-  AGENCY = '12'
+    /**
+     * 系统用户
+     */
+    SYSTEM = '00',
+    /**
+     * 学生
+     */
+    STUDENT = '01',
+    /**
+     * 教师
+     */
+    TEACHER = '11',
+    /**
+     * 代理商
+     */
+    AGENT = '10',
+    /**
+     * 机构
+     */
+    AGENCY = '12'
 }
 
 /**
  * 考试类型
  */
 export enum EnumExamRecordType {
-  /**
-   * 模拟考试
-   */
-  SIMULATED = 'simulated',
-  /**
-   * 组卷作业
-   */
-  HOMEWORK = 'homework'
+    /**
+     * 模拟考试
+     */
+    SIMULATED = 'simulated',
+    /**
+     * 组卷作业
+     */
+    HOMEWORK = 'homework'
 }
 
 
@@ -173,169 +173,177 @@ export enum EnumExamRecordType {
  * 绑定场景
  */
 export enum EnumBindScene {
-  /**
-   * 注册
-   */
-  REGISTER = 'register',
-  /**
-   * 注册绑定
-   */
-  REGISTER_BIND = 'register_bind',
-  /**
-   * 登录绑定
-   */
-  LOGIN_BIND = 'login_bind',
-  /**
-   * 老师或者代理商完善信息
-   */
-  IMPROVE = 'improve'
+    /**
+     * 注册
+     */
+    REGISTER = 'register',
+    /**
+     * 注册绑定
+     */
+    REGISTER_BIND = 'register_bind',
+    /**
+     * 登录绑定
+     */
+    LOGIN_BIND = 'login_bind',
+    /**
+     * 老师或者代理商完善信息
+     */
+    IMPROVE = 'improve'
 }
 
 export enum EnumExamType {
-  /**
-   * 职高对口升学
-   */
-  VHS = 'VHS',
-  /**
-   * 单招(应届普高)
-   */
-  OHS = 'OHS',
-  /**
-   * 单招(中职)
-   */
-  SVS = 'SVS'
+    /**
+     * 职高对口升学
+     */
+    VHS = 'VHS',
+    /**
+     * 单招(应届普高)
+     */
+    OHS = 'OHS',
+    /**
+     * 单招(中职)
+     */
+    SVS = 'SVS'
 }
 
 export enum EnumSimulatedRecordStatus {
-  /**
-   * 空卷
-   */
-  INIT = 1,
-  /**
-   * 签到
-   */
-  SIGN = 2,
-  /**
-   * 考试
-   */
-  EXAM = 3,
-  /**
-   * 交卷
-   */
-  SUBMIT = 4,
-  /**
-   * 阅卷
-   */
-  REVIEW = 5,
-  /**
-   * 发布
-   */
-  PUBLISH = 6,
-  /**
-   * 关闭
-   */
-  CLOSE = 7,
+    /**
+     * 空卷
+     */
+    INIT = 1,
+    /**
+     * 签到
+     */
+    SIGN = 2,
+    /**
+     * 考试
+     */
+    EXAM = 3,
+    /**
+     * 交卷
+     */
+    SUBMIT = 4,
+    /**
+     * 阅卷
+     */
+    REVIEW = 5,
+    /**
+     * 发布
+     */
+    PUBLISH = 6,
+    /**
+     * 关闭
+     */
+    CLOSE = 7,
 }
 
 export enum EnumPaperType {
-  /**
-   * 练习
-   */
-  PRACTICE = 'Practice',
-  /**
-   * 考试
-   */
-  SIMULATED = 'Simulated',
-  /**
-   * 教材同步练习
-   */
-  COURSE = 'Course',
-  /**
-   * 测试卷
-   */
-  TEST = 'Test'
+    /**
+     * 练习
+     */
+    PRACTICE = 'Practice',
+    /**
+     * 考试
+     */
+    SIMULATED = 'Simulated',
+    /**
+     * 教材同步练习
+     */
+    COURSE = 'Course',
+    /**
+     * 测试卷
+     */
+    TEST = 'Test'
 }
 
 export enum EnumReviewMode {
-  /**
-   * 交卷后评卷
-   */
-  AFTER_SUBMIT = 1,
-  /**
-   * 答完一题就评卷
-   */
-  DURING_ANSWER = 2
+    /**
+     * 交卷后评卷
+     */
+    AFTER_SUBMIT = 1,
+    /**
+     * 答完一题就评卷
+     */
+    DURING_ANSWER = 2
 }
 
 export enum EnumUserRole {
-  /**
-   * 普通用户
-   */
-  NORMAL = 'normal',
-  /**
-   * 游客
-   */
-  GUEST = 'guest',
-  /**
-   * 会员
-   */
-  VIP = 'vip',
-  /**
-   * 代理商
-   */
-  AGENT = 'agent',
-  /**
-   * 教师
-   */
-  TEACHER = 'teacher'
+    /**
+     * 普通用户
+     */
+    NORMAL = 'normal',
+    /**
+     * 游客
+     */
+    GUEST = 'guest',
+    /**
+     * 会员
+     */
+    VIP = 'vip',
+    /**
+     * 代理商
+     */
+    AGENT = 'agent',
+    /**
+     * 教师
+     */
+    TEACHER = 'teacher'
 }
 
 export enum EnumEvent {
-  /**
-   * 打开VIP弹窗
-   */
-  OPEN_VIP_POPUP = 'OPEN_VIP_POPUP'
+    /**
+     * 打开VIP弹窗
+     */
+    OPEN_VIP_POPUP = 'OPEN_VIP_POPUP'
 }
 
 /**
  * 卡类型
  */
 export enum CardType {
-  VIP = 1,
-  DEPT = 2,
-  PLATFORM = 6,
-  /**
-   * 体验卡
-   */
-  EXPERIENCE = 9
+    VIP = 1,
+    DEPT = 2,
+    PLATFORM = 6,
+    /**
+     * 体验卡
+     */
+    EXPERIENCE = 9
 }
 
 export enum EnumPaperWorkState {
-  /**
-   * 未完成
-   */
-  NOT_COMPLETED = 2,
-  /**
-   * 已完成
-   */
-  COMPLETED = 4
+    /**
+     * 未完成
+     */
+    NOT_COMPLETED = 2,
+    /**
+     * 已完成
+     */
+    COMPLETED = 4
 }
 
 export enum EnumPaperBuildType {
-  /**
-   * 定向智能
-   */
-  EXACT_INTELLIGENT = 'ExactIntelligent',
-  /**
-   * 全量智能
-   */
-  FULL_INTELLIGENT = 'FullIntelligent',
-  /**
-   * 定向手动
-   */
-  EXACT_HAND = 'ExactHand',
-  /**
-   * 全量手动
-   */
-  FULL_HAND = 'FullHand'
+    /**
+     * 定向智能
+     */
+    EXACT_INTELLIGENT = 'ExactIntelligent',
+    /**
+     * 全量智能
+     */
+    FULL_INTELLIGENT = 'FullIntelligent',
+    /**
+     * 定向手动
+     */
+    EXACT_HAND = 'ExactHand',
+    /**
+     * 全量手动
+     */
+    FULL_HAND = 'FullHand'
+}
+
+export enum EnumBrochureType {
+    INTRODUCTION = 1, // 学校概况
+    ENROLL_RULE = 2, // 招生简章
+    EXAM_TIME = 3, // 考试大纲
+    WORK = 4, // 就业
+    OTHER_RULE = 5 // 其它
 }

+ 1 - 0
src/common/routes.ts

@@ -31,6 +31,7 @@ export const routes = {
   * 院校选择
   * */
   universityPicker: '/pagesOther/pages/university/picker/picker',
+  universityIntroduction: '/pagesOther/pages/university/intro/intro',
   /*
   * 院校专业选择
   * */

+ 6 - 0
src/pages.json

@@ -134,6 +134,12 @@
           "style": {
             "navigationBarTitleText": ""
           }
+        },
+        {
+          "path": "pages/university/intro/intro",
+          "style": {
+            "navigationBarTitleText": ""
+          }
         }
       ]
     },

+ 12 - 5
src/pagesOther/pages/university/detail/components/college-brochure.vue

@@ -1,11 +1,18 @@
 <template>
-
+    <view class="p-30">
+        <college-brochure-list :list="list"/>
+    </view>
 </template>
 
-<script>
-export default {
-    name: "college-brochure"
-}
+<script setup lang="ts">
+import {UNIVERSITY_DETAIL} from "@/types/injectionSymbols";
+import {UniversityDetail} from "@/types/university";
+import {EnumBrochureType} from "@/common/enum";
+import CollegeBrochureList from "@/pagesOther/pages/university/detail/components/plus/college-brochure-list.vue";
+
+const detail = inject(UNIVERSITY_DETAIL) || ref({} as UniversityDetail)
+const brochures = computed(() => detail.value.enrollBrochures || [])
+const list = computed(() => brochures.value.filter(b => b.type == EnumBrochureType.ENROLL_RULE))
 </script>
 
 <style scoped>

+ 12 - 5
src/pagesOther/pages/university/detail/components/college-exam.vue

@@ -1,11 +1,18 @@
 <template>
-
+    <view class="p-30">
+        <college-brochure-list :list="list"/>
+    </view>
 </template>
 
-<script>
-export default {
-    name: "college-exam"
-}
+<script setup lang="ts">
+import {UNIVERSITY_DETAIL} from "@/types/injectionSymbols";
+import {UniversityDetail} from "@/types/university";
+import {EnumBrochureType} from "@/common/enum";
+import CollegeBrochureList from "@/pagesOther/pages/university/detail/components/plus/college-brochure-list.vue";
+
+const detail = inject(UNIVERSITY_DETAIL) || ref({} as UniversityDetail)
+const brochures = computed(() => detail.value.enrollBrochures || [])
+const list = computed(() => brochures.value.filter(b => b.type == EnumBrochureType.EXAM_TIME))
 </script>
 
 <style scoped>

+ 1 - 1
src/pagesOther/pages/university/detail/components/college-info.vue

@@ -1,5 +1,5 @@
 <template>
-    <uv-skeleton v-if="loading" avatar loading rows="2"/>
+    <uv-skeleton v-if="loading" avatar rows="2"/>
     <view v-else class="-mt-50 flex justify-between gap-20">
         <view class="flex flex-col items-center gap-10">
             <ie-image :src="info.logo" custom-class="w-140 h-140" :round="9999"/>

+ 7 - 1
src/pagesOther/pages/university/detail/components/college-profile.vue

@@ -17,7 +17,7 @@
         <view class="mt-30">
             <view class="text-32 font-bold text-fore-title">开设专业</view>
             <uv-gap v-if="loading" height="15"/>
-            <uv-skeleton v-if="loading" loading rows="3"/>
+            <uv-skeleton v-if="loading" :title="false" rows="3" rows-height="44" :rows-width="['100%','100%','100%']"/>
             <view v-for="(g,i) in grouped" :key="i"
                   class="mt-28 p-28 flex justify-between items-center bg-back-light rounded-lg">
                 <view class="text-28 font-bold text-fore-title truncate">{{ g.root.name }}</view>
@@ -92,6 +92,12 @@ const actions = computed(() => [{
     id: 'copy',
     name: '复制'
 }])
+const skeleton = [{
+    num: 3,
+    type: 'line',
+    gap: '30rpx',
+    style: ['height: 100rpx']
+}]
 
 const popup = ref<InstanceType<typeof IePopup>>()
 const popupGroup = ref<ProfessionGroup>()

+ 49 - 0
src/pagesOther/pages/university/detail/components/plus/college-brochure-list.vue

@@ -0,0 +1,49 @@
+<template>
+    <uv-cell-group :border="false">
+        <uv-cell v-for="(b,i) in list" :key="i" cell-style="padding: 10px 0" @click="handlePreview(null, b)">
+            <template #title>
+                <view class="text-28 text-fore-title mb-20">{{ b.title }}</view>
+            </template>
+            <template #label>
+                <view class="text-24 text-fore-light">{{ b.createTime }}</view>
+            </template>
+        </uv-cell>
+    </uv-cell-group>
+</template>
+
+<script setup lang="ts">
+import {UniversityBrochure, UniversityDetail} from "@/types/university";
+import {UNIVERSITY_DETAIL} from "@/types/injectionSymbols";
+import {useTransferPage} from "@/hooks/useTransferPage";
+import {EnumBrochureType} from "@/common/enum";
+import {routes} from "@/common/routes";
+
+defineProps<{
+    list: UniversityBrochure[]
+}>()
+
+const detail = inject(UNIVERSITY_DETAIL)
+const brochures = computed(() => detail.value.enrollBrochures || [])
+const baseInfo = computed(() => detail.value.baseInfo || {})
+const {transferTo} = useTransferPage()
+
+const handlePreview = function (type: EnumBrochureType | null, item: UniversityBrochure | null = null) {
+    const brochure = item || brochures.value.find(b => b.type == type)
+    if (!brochure) return
+    if (brochure.url) {
+        uni.openDocument({
+            filePath: brochure.url,
+            fail: result => {
+                console.log('open failed', result)
+            }
+        })
+    } else {
+        brochure.logo = baseInfo.value.logo
+        transferTo(routes.universityIntroduction, {bigData: brochure})
+    }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 48 - 0
src/pagesOther/pages/university/intro/intro.vue

@@ -0,0 +1,48 @@
+<template>
+    <ie-page>
+        <ie-navbar title="院校动态"/>
+        <view class="bg-white px-20 pt-20">
+            <uv-text size="18" bold :text="prevData.title"/>
+        </view>
+        <uv-sticky :offset-top="appStore.isH5?0:baseStickyTop">
+            <view class="flex justify-between items-center bg-white border-0 border-b border-solid border-border p-20">
+                <uv-text size="13" :icon-style="{width: '22px', height: '20px'}" :prefix-icon="prevData.logo"
+                         :text="prevData.editor"/>
+                <text class="text-tips text-xs">{{ prevData.createTime.split(' ')[0] }}</text>
+            </view>
+        </uv-sticky>
+        <uv-gap height="10" bg-color="#F6F8FA"/>
+        <view class="p-30 text-28 leading-38 text-fore-content">
+            <uv-parse :content="detail.content||prevData.content"/>
+        </view>
+        <uv-back-top :scroll-top="scrollTop"/>
+    </ie-page>
+</template>
+
+<script setup lang="ts">
+import {useTransferPage} from "@/hooks/useTransferPage";
+import {useScroll} from "@/hooks/useScroll";
+import {UniversityBrochure} from "@/types/university";
+import {getUniversitiesEnrollBrochureDetail} from "@/api/modules/university";
+import {useAppStore} from "@/store/appStore";
+import {useNavbar} from "@/hooks/useNavbar";
+
+const detail = ref<UniversityBrochure>({} as UniversityBrochure)
+const {prevData} = useTransferPage()
+const {scrollTop} = useScroll()
+const {baseStickyTop} = useNavbar()
+const appStore = useAppStore()
+
+onMounted(async () => {
+    const {id, content} = prevData.value
+    if (id && !content) {
+        const payload = {id}
+        const res = await getUniversitiesEnrollBrochureDetail(payload)
+        detail.value = res.data
+    }
+})
+</script>
+
+<style lang="scss">
+
+</style>

+ 30 - 1
src/types/university.ts

@@ -1,3 +1,5 @@
+import {EnumBrochureType} from "@/common/enum";
+
 export interface University {
     bannerUrl: string;
     address: string;
@@ -41,9 +43,36 @@ export interface UniversityProfession {
     "majorDirection": string;
 }
 
+export interface UniversityBrochure {
+    "createBy": string;
+    "createTime": string;
+    "updateBy": string;
+    "updateTime": string;
+    "remark": string;
+    "id": number;
+    "year": string;
+    "collegeCode": string;
+    "collegeName": string;
+    "editor": string;
+    "url": string;
+    "summary": string;
+    "title": string;
+    "isArt": boolean|null;
+    "type": EnumBrochureType;
+    "metaDescription": string;
+    "content": string;
+    "tags": string;
+    "isShow": number;
+    "hits": number;
+    "createTime2": string;
+    "typeName": string;
+
+    "logo"?: string;
+}
+
 export interface UniversityDetail {
     baseInfo: University;
-    enrollBrochures: [];
+    enrollBrochures: UniversityBrochure[];
     enrollHistories: [];
     planHistories: [];
     professions: UniversityProfession[];