diff --git a/.env.development b/.env.development index e4c78e48..0676c220 100644 --- a/.env.development +++ b/.env.development @@ -4,13 +4,11 @@ ENV = 'development' -VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7001' +#VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7001' -# VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' - - +VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001' # VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' @@ -46,7 +44,7 @@ VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7001' # VITE_APP_BASE_H5_API_Url = 'http://25.18.122.78:9786' -# VITE_APP_BASE_H5_API_Url_TRAAPP = 'http://25.64.16.130:9601' +# VITE_APP_BASE_H5_API_Url_TRAAPP = 'http://25.64.32.150:9601' # VITE_APP_BASE_H5_API_Url_TRASTUDY = 'http://25.64.16.130:9602' # VITE_APP_BASE_H5_API_Url_TRAASK = 'http://25.64.16.144:9605' diff --git a/devops/自动化构建/安卓打包/2-编译vue/nodejs构建.txt b/devops/自动化构建/安卓打包/2-编译vue/nodejs构建.txt index 96ac9b34..d2f6f65d 100644 --- a/devops/自动化构建/安卓打包/2-编译vue/nodejs构建.txt +++ b/devops/自动化构建/安卓打包/2-编译vue/nodejs构建.txt @@ -6,9 +6,11 @@ rm -rf dist rm -rf node_modules echo "-----删除成功-----" ls -a - +export TLS_MAX_MEM=8388608 +npm install @dcloudio/uts-linux-x64-gnu --registry=http://25.12.10.69:8081/repository/aliyun-npm/ --force #下载依赖 -npm install --unsafe-perm=true --allow-root --registry=http://25.12.10.69:8081/repository/aliyun-npm/ +# npm install --unsafe-perm=true --allow-root --registry=http://25.12.10.69:8081/repository/aliyun-npm/ +npm install --registry=http://25.12.10.69:8081/repository/aliyun-npm/ #打包成静态资源 npm run build:app-plus:${ENV_NAME} echo "打包成功" diff --git a/src/api/pointsAndRank.js b/src/api/pointsAndRank.js index aa6a614b..1390743f 100644 --- a/src/api/pointsAndRank.js +++ b/src/api/pointsAndRank.js @@ -127,3 +127,26 @@ export const queryRankWall = (data) => { data }); }; + + +/** + * 查询当前时间是否存在假日积分奖励 + */ +export const queryHolidayReward = (data) => { + return request({ + url: base_url + '/traPointsInfo/queryHolidayReward', + method: 'post', + data + }); +}; + +/** + * 随机假日积分获得 + */ +export const obtainRewardRandom = (data) => { + return request({ + url: base_url + '/traPointsInfo/obtainRewardRandom', + method: 'post', + data + }); +}; diff --git a/src/components/examination/es-analysis.vue b/src/components/examination/es-analysis.vue index a2de879c..996216ae 100644 --- a/src/components/examination/es-analysis.vue +++ b/src/components/examination/es-analysis.vue @@ -3,16 +3,23 @@ 维度评分: {{ dimension_all_score }} - - + {{ item.gradeDimens }}: {{ item.anlyGrade }} + + 未命中: + + + {{ keyword }} + + + @@ -39,7 +46,7 @@ required: true } }); - + const evalSettingVos = computed(() => props.value.evalSettingVos); const status = computed(() => (props.judgeResult ? 'success' : 'error')); const select_status_icon = computed(() => { @@ -49,15 +56,15 @@ return optionErrorIcon(); } }); - + const keywords = computed(() => { if (!props.value.relKeyword) return []; return props.value.relKeyword.split(/[,、/]/).map((key) => key.trim()); }); - + const highlightedText = computed(() => { // 如果没有关键词,直接返回原文本 - if (!keywords.value.length) return '你的答案:' + props.anserResult; + if (!keywords.value.length) return '命中:' + props.anserResult; // 构建正则表达式,匹配所有关键词(不区分大小写) // 对关键词进行转义,避免特殊字符影响正则 const escapedKeywords = keywords.value.map((keyword) => keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); @@ -66,7 +73,7 @@ const regex = new RegExp(`(${escapedKeywords.join('|')})`, 'gi'); // 替换匹配到的关键词,用span包裹并添加高亮样式 - return '你的答案:' + props.anserResult.replace(regex, (match) => `${match}`); + return '命中:' + props.anserResult.replace(regex, (match) => `${match}`); }); const dimension_all_score = computed(() => { return ( @@ -77,13 +84,51 @@ .reduce((total, current) => total + current, 0) ); }); + // 找出答案中不存在的关键词 + const missingKeywords = computed(() => { + const relKeyword = props.value.relKeyword; + // 容错:答案为空时返回所有关键词 + if (!props.anserResult) { + return relKeyword.split('、'); + } + + // 步骤1:按顿号拆分关键词组 + const keywordGroups = relKeyword.split('、'); + const missing = []; + + // 步骤2:遍历每个关键词组,检查是否存在任意一种说法 + keywordGroups.forEach((group) => { + // 拆分同关键词的不同说法(/ 分隔) + const keywordVariants = group.split('/'); + let isFound = false; + + // 检查答案中是否包含任意一种说法 + for (const variant of keywordVariants) { + // 可选:增加 trim() 忽略首尾空格,提升匹配容错 + if (props.anserResult.trim().includes(variant.trim())) { + isFound = true; + break; + } + } + + // 未找到则加入缺失列表 + if (!isFound) { + missing.push(group); + } + }); + + return missing; + }); const click_option = () => { emit('click_option', props.analysisVo); }; diff --git a/src/components/examination/subject.vue b/src/components/examination/subject.vue index 392a171c..220ed4f5 100644 --- a/src/components/examination/subject.vue +++ b/src/components/examination/subject.vue @@ -2,7 +2,9 @@ {{ subject_type_text }} - {{ item.tgtGrade }}分 + + {{ item.tgtGrade }}分 + @@ -66,7 +68,12 @@ - - 参考答案: - {{ subject_data.itemVos[0]?.itemAnswer ?? '' }} + + + 试题解析:{{ subject_data?.analyContent }} - 试题解析:{{ subject_data?.analyContent }} @@ -120,6 +130,7 @@ import { ref, reactive, onMounted, nextTick, computed, getCurrentInstance, watch } from 'vue'; import radioSubjectItem from './radio-subject-item.vue'; import esAnalysis from './es-analysis.vue'; + import referenceAnswer from './reference-answer.vue'; import questionVue from './question.vue'; import { markIcon, feedbackIcon } from '@/common/imgSvg'; import { SUBJECT_TYPE } from '@/enum.js'; @@ -153,7 +164,9 @@ // 学习: study // 考试结算页 settlement // 练习记录页 practice_record, 'practice_record' - return ['examination', 'practice', 'mistake', 'study', 'settlement', 'practice_record', 'pk_in'].includes(value); + return ['examination', 'practice', 'mistake', 'study', 'settlement', 'practice_record', 'pk_in'].includes( + value + ); } }, // 是否预览模式 diff --git a/src/components/points-and-badge/holiday - 副本.vue b/src/components/points-and-badge/holiday - 副本.vue new file mode 100644 index 00000000..9ba5e746 --- /dev/null +++ b/src/components/points-and-badge/holiday - 副本.vue @@ -0,0 +1,412 @@ + + + + + diff --git a/src/components/points-and-badge/holiday.vue b/src/components/points-and-badge/holiday.vue new file mode 100644 index 00000000..6036e8b5 --- /dev/null +++ b/src/components/points-and-badge/holiday.vue @@ -0,0 +1,412 @@ + + + + + diff --git a/src/components/points-and-badge/points.vue b/src/components/points-and-badge/points.vue index e468a510..4bbdbc4f 100644 --- a/src/components/points-and-badge/points.vue +++ b/src/components/points-and-badge/points.vue @@ -188,6 +188,6 @@ overflow: hidden; margin-top: var(--status-bar-height); margin-bottom: 100rpx; - overflow: auto; + overflow-y: auto; } diff --git a/src/components/points-and-badge/types/holiday.ts b/src/components/points-and-badge/types/holiday.ts new file mode 100644 index 00000000..4f69bbcc --- /dev/null +++ b/src/components/points-and-badge/types/holiday.ts @@ -0,0 +1,68 @@ +// 奖励类型枚举(和接口相关的枚举也放一起) +export enum RewardType { + FIXED_POINT = '1', // 固定积分 + RANDOM_POINT = '2' // 随机积分 +} + +// 定义抽奖动画状态枚举(码值) +export enum AnimationStatus { + // 未开始(初始状态) + UNSTARTED = 'unstarted', + // 动画进行中 + LOADING = 'loading', + // 动画已完成 + COMPLETED = 'completed' +} + +// 节日奖励信息接口 +export interface HolidayInfo { + holidayCode : string; + rewardFlag : boolean; + rewardType : RewardType; + rewardPoints : number; + holidayDesc : string; + rangeEnd : number; + rangeStart : number; + obtainFlag : boolean; + ossKey : string; + ossAddr : string; + backgroundOssKey : string; + backgroundOssAddr : string; +} + +/** + * 节日弹窗关闭后的回调函数接口 + * @param params - 回调参数 + * @param params.status - 签到状态(false 表示关闭/未完成) + */ +export interface CompleteCallback { + (params : { + status : boolean; + }) : void; +} + + +/** 抽取积分成功的回调类型 */ +export interface LotterySuccessCb { + // val 为抽取到的积分,start积分的最小数,end为积分的最大值 + (data : { val : number; start : number; end : number }) : void; +} + +/** 抽取积分失败的回调类型 */ +export interface LotteryFailCb { + // 失败回调接收错误信息 + (error : any) : void; +} + + +/** + * 需要随机抽取积分的节日,随机抽取积分的回调函数 + * @param params - 回调参数 + */ +export interface StartLotteryCallback { + (params : { + holidayCode : string; + successCb : LotterySuccessCb; + failCb : LotteryFailCb; + }) : void; +} \ No newline at end of file diff --git a/src/composables/useCheckIn.js b/src/composables/useCheckIn.js index 67a8d5bd..d7a55548 100644 --- a/src/composables/useCheckIn.js +++ b/src/composables/useCheckIn.js @@ -1,6 +1,8 @@ import { queryCheckIn, - addPointsByCheckIn + addPointsByCheckIn, + queryHolidayReward, + obtainRewardRandom } from '@/api/pointsAndRank.js'; import common from '@/common/common'; import { @@ -11,6 +13,7 @@ import { } from 'vue'; export default function useCheckIn() { const checkInRef = ref(null) + const holidayRef = ref(null) // ========== 核心工具方法 ========== /** * 获取当前用户的签到存储key(区分不同用户) @@ -45,81 +48,99 @@ export default function useCheckIn() { PopupDay: '' }; try { - // 读取本地存储的签到信息(兼容JSON格式) + // 读取本地存储的签到信息 const rawData = common.getValue(key); if (!rawData) return { signDate: '', checkInDays: 0, - popupDay: '' + popupDay: '', + rewardFlag: null, + obtainFlag: null, }; - // 兼容存储的是字符串或JSON对象的情况 const signStatus = rawData; return { signDate: signStatus.signDate || '', checkInDays: signStatus.checkInDays || 0, popupDay: signStatus.popupDay || '', - + rewardFlag: signStatus.rewardFlag || null, + obtainFlag: signStatus.obtainFlag || null, }; } catch (e) { console.error('读取本地签到状态失败', e); return { signDate: '', checkInDays: 0, - popupDay: '' + popupDay: '', + rewardFlag: null, + obtainFlag: null, }; } }; - + /** * 更新本地签到状态(支持按需更新字段) - * @param {boolean|undefined} isSigned - 是否签到(可选,传入则更新) - * @param {number|undefined} checkInDays - 签到天数(可选,传入则更新) - * @param {string|undefined} popupDay - 弹窗关闭日期(可选,传入则更新) */ - const setLocalSignStatus = (isSigned, checkInDays, popupDay) => { - const key = getKey(); - if (!key) return; - - // 1. 读取本地原有数据(若无则初始化空对象) - let oldSignStatus = {}; - try { - oldSignStatus = common.getValue(key) || {}; // 兼容common.getValue返回null/undefined的情况 - } catch (e) { - console.warn('读取原有签到状态失败,使用空对象初始化', e); - oldSignStatus = {}; - } - - // 2. 初始化新状态:先继承原有数据 - const newSignStatus = { ...oldSignStatus }; - - // 3. 按需更新字段(仅当参数传入时覆盖) - // 处理isSigned:传入则更新,且为true时自动设置signDate - if (isSigned !== undefined) { - // 保持原有逻辑:isSigned为true时,signDate设为今日 - newSignStatus.signDate = isSigned ? getTodayDate() : oldSignStatus.signDate; - } - - // 处理checkInDays:传入则更新,未传入保留原有值 - if (checkInDays !== undefined) { - newSignStatus.checkInDays = checkInDays; - } - - // 处理popupDay:传入非空则更新,未传入/空值保留原有值 - if (popupDay !== undefined) { - newSignStatus.popupDay = popupDay? getTodayDate() : oldSignStatus.popupDay; - } - - // 4. 重新存入本地(覆盖原有数据) - try { - console.log('存入的数据(原有+更新)', newSignStatus); - common.setValue(key, newSignStatus); - } catch (e) { - console.error('更新本地签到状态失败', e); - } + const setLocalSignStatus = (params) => { + const { + isSigned, + checkInDays, + popupDay, + rewardFlag, + obtainFlag + } = params; + const key = getKey(); + if (!key) return; + + // 1. 读取本地原有数据(若无则初始化空对象) + let oldSignStatus = {}; + try { + oldSignStatus = common.getValue(key) || {}; // 兼容common.getValue返回null/undefined的情况 + } catch (e) { + console.warn('读取原有签到状态失败,使用空对象初始化', e); + oldSignStatus = {}; + } + + // 2. 初始化新状态:先继承原有数据 + const newSignStatus = { + ...oldSignStatus + }; + + // 3. 按需更新字段(仅当参数传入时覆盖) + // 处理isSigned:传入则更新,且为true时自动设置signDate + if (isSigned !== undefined) { + // 保持原有逻辑:isSigned为true时,signDate设为今日 + newSignStatus.signDate = isSigned ? getTodayDate() : oldSignStatus.signDate; + } + + // 处理checkInDays:传入则更新,未传入保留原有值 + if (checkInDays !== undefined) { + newSignStatus.checkInDays = checkInDays; + } + + // 处理popupDay:传入非空则更新,未传入/空值保留原有值 + if (popupDay !== undefined) { + newSignStatus.popupDay = popupDay ? getTodayDate() : oldSignStatus.popupDay; + } + + if (rewardFlag !== undefined) { + newSignStatus.rewardFlag = rewardFlag; + } + if (obtainFlag !== undefined) { + newSignStatus.obtainFlag = obtainFlag; + } + + + // 4. 重新存入本地 + try { + console.log('存入的数据(原有+更新)', newSignStatus); + common.setValue(key, newSignStatus); + } catch (e) { + console.error('更新本地签到状态失败', e); + } }; - - + + // ========== 对外暴露的核心方法 ========== /** @@ -129,37 +150,51 @@ export default function useCheckIn() { const initCheckInStatus = async (complete = () => {}) => { const today = getTodayDate(); const localStatus = getLocalSignStatus(); - console.log('localStatus', localStatus); // 1. 本地已有今日签到记录 → 直接返回本地状态 if (localStatus.signDate === today) { - - complete(true, localStatus.checkInDays, localStatus.popupDay === today) + const checkInInfo = { + isSigned: true, + checkInDays: localStatus.checkInDays, + popUpStatus: localStatus.popupDay === today + } + const holidayBody = { + rewardFlag: localStatus.rewardFlag, + obtainFlag: localStatus.obtainFlag + } + complete(checkInInfo, holidayBody) return true; } // 2. 本地记录过期/无记录 → 请求接口获取最新状态 try { - const res = await queryCheckIn(); // 调用查询签到状态接口 - const { - body - } = res || {}; - console.log('bodbodyy', body); - // // 接口返回格式适配(根据实际后端返回调整) + + const [{ + body = {} + }, { + body: holidayBody = {} + }] = await Promise.all([ + queryCheckIn(), // 第一个接口:查询签到状态 + queryHolidayReward() // 第二个接口:查询节日奖励 + ]); + const isSigned = body?.checkInToday === 'Y'; const checkInDays = body?.days || 0; - setLocalSignStatus(isSigned, checkInDays); - // if (!isSigned) { // 没签到执行签到弹窗 - // console.log('没签到执行签到弹窗'); - // //如果今日点击过x那么久不弹了 - // // if(localStatus.popupDay === today) return; - // complete(isSigned, checkInDays, localStatus.popupDay === today) - // } - complete(isSigned, checkInDays, localStatus.popupDay === today) - + setLocalSignStatus({ + isSigned, + checkInDays, + rewardFlag: holidayBody?.rewardFlag, + obtainFlag: holidayBody?.obtainFlag, + }); + const checkInInfo = { + isSigned, + checkInDays, + popUpStatus: localStatus.popupDay === today + } + complete(checkInInfo, holidayBody) } catch (e) { console.error('请求签到状态接口失败', e); } }; - + /** * 判断今日是否已签到(简化版,供快速判断) * @returns {boolean} @@ -181,14 +216,15 @@ export default function useCheckIn() { */ const checkInFun = async ({ status, - days=0, - successCb=() =>{}, - failCb=() =>{} + days = 0, + successCb = () => {}, + failCb = () => {} }) => { - if(!status) { // 点击了关闭 + if (!status) { // 点击了关闭 console.log('点击了关闭'); - - setLocalSignStatus(undefined, undefined, true); + setLocalSignStatus({ + popupDay: true, + }); return; } console.log('请求接口', days); @@ -197,7 +233,10 @@ export default function useCheckIn() { }) .then((res) => { console.log('接口成功回调', res); - setLocalSignStatus(true, days + 1); + setLocalSignStatus({ + isSigned: true, + checkInDays: days + 1, + }); successCb?.({ days: days + 1, res @@ -207,6 +246,30 @@ export default function useCheckIn() { }) }; + /** + * 执行抽取节日积分操作 + * @param {string} holidayCode - 节日积分 + * @param {Function} successCb - 抽取积分成功回调 + * @param {Function} failCb - 抽取积分失败回调 + * @returns {Promise} 签到是否成功 + */ + const startLotteryFun = async ({ + holidayCode, + successCb = () => {}, + failCb = () => {} + }) => { + obtainRewardRandom({ + holidayCode + }).then(({body}) => { + console.log('抽取成功回调', body); + // 把缓存中的记录设置为已经抽取积分 + setLocalSignStatus({ obtainFlag: true}); + successCb?.(body); + }).catch((error) => { + failCb?.(error) + }) + }; + /** * 重置签到状态(可选,用于特殊场景) */ @@ -217,9 +280,11 @@ export default function useCheckIn() { // ========== 返回对外暴露的方法 ========== return { + holidayRef, checkInRef, initCheckInStatus, // 初始化签到状态(页面加载时调用) checkInFun, // 执行签到 + startLotteryFun, // 抽取随机积分 getLocalSignStatus, // 获取签到缓存信息 getTodayCheckInStatus // 获取今天签到状态 }; diff --git a/src/pages/courseDetail/components/knowledge.vue b/src/pages/courseDetail/components/knowledge.vue index 4fc35754..42ecfc8f 100644 --- a/src/pages/courseDetail/components/knowledge.vue +++ b/src/pages/courseDetail/components/knowledge.vue @@ -1,74 +1,99 @@ \ No newline at end of file + diff --git a/src/pages/courseDetail/index.vue b/src/pages/courseDetail/index.vue index cba7fbcd..bb64774d 100644 --- a/src/pages/courseDetail/index.vue +++ b/src/pages/courseDetail/index.vue @@ -24,33 +24,36 @@ - 知识点 - {{ form.pgrphNum || 0 }} + 知识点 - - - 已学 - {{ form.styParaGraphNum || 0 }} + + + {{ form.styParaGraphNum || 0 }} + + {{ form.pgrphNum || 0 }} + 考试排行榜 - + @@ -110,6 +114,7 @@ diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue index 95a3dc9a..a8ea8164 100644 --- a/src/pages/index/index.vue +++ b/src/pages/index/index.vue @@ -156,43 +156,13 @@ - - - + @@ -210,10 +180,11 @@ import classScroll from './components/class_scroll.vue'; import useCheckIn from '@/composables/useCheckIn'; import checkIn from '@/components/points-and-badge/check-in'; + import holiday from '@/components/points-and-badge/holiday'; import badge from '@/components/points-and-badge/badge'; import points from '@/components/points-and-badge/points'; import usePointsAndBadge from '@/components/points-and-badge/usePointsAndBadge'; - const { initCheckInStatus, checkInRef, checkInFun } = useCheckIn(); + const { initCheckInStatus, checkInRef, checkInFun, startLotteryFun, holidayRef } = useCheckIn(); const { handlePointsBadgePopup, badgeRef, pointsRef } = usePointsAndBadge(); const scrollTop = ref(0); const no_read_message_num = ref(0); @@ -339,12 +310,19 @@ return; } - initCheckInStatus((isSigned, checkInDays, popUpStatus) => { - if(!isSigned && !popUpStatus) { - checkInRef.value.open(isSigned, checkInDays, checkInFun, (status, days, pointsList = [], badgesList = []) => { - handlePointsBadgePopup(pointsList, badgesList); - }); - } + initCheckInStatus((checkInInfo, holidayBody) => { + // 先判断是否有节日活动 + const handleCheckInComplete = (params) => { + const {isSigned, checkInDays, popUpStatus} = checkInInfo + setTimeout(() => { + if(!isSigned && !popUpStatus) { + checkInRef.value.open(isSigned, checkInDays, checkInFun, (status, days, pointsList = [], badgesList = []) => { + handlePointsBadgePopup(pointsList, badgesList); + }); + } + }, 140) + }; + holidayRef.value?.open(holidayBody, startLotteryFun, handleCheckInComplete) }); const userInfo = getUserInfo(); if (userInfo) { diff --git a/src/pages/me/index.vue b/src/pages/me/index.vue index 0b467e43..db535971 100644 --- a/src/pages/me/index.vue +++ b/src/pages/me/index.vue @@ -314,10 +314,13 @@ Object.assign(user_info, getUserInfo()); statistics_data['get_statistics_data'](); // 获取统计数据 // 获取今日是否签到消息 - initCheckInStatus((isSigned, checkInDays, popUpStatus) => { + initCheckInStatus(({isSigned, checkInDays, popUpStatus}) => { user_info.checkInToday = isSigned ? 1 : 2; user_info.checkInDays = checkInDays; }); + + + }); onHide(() => { checkInRef.value && checkInRef.value.close(); diff --git a/src/static/images/courseDetail/charts.png b/src/static/images/courseDetail/charts.png index 719c3d13..b853d712 100644 Binary files a/src/static/images/courseDetail/charts.png and b/src/static/images/courseDetail/charts.png differ diff --git a/src/static/images/courseDetail/knowledgeComplete.png b/src/static/images/courseDetail/knowledgeComplete.png new file mode 100644 index 00000000..39e95a60 Binary files /dev/null and b/src/static/images/courseDetail/knowledgeComplete.png differ diff --git a/src/static/images/courseDetail/knowledgeUnfinished.png b/src/static/images/courseDetail/knowledgeUnfinished.png new file mode 100644 index 00000000..5b74d03f Binary files /dev/null and b/src/static/images/courseDetail/knowledgeUnfinished.png differ diff --git a/src/static/images/courseDetail/zhishidian.png b/src/static/images/courseDetail/zhishidian.png index b85c6734..f98c94a4 100644 Binary files a/src/static/images/courseDetail/zhishidian.png and b/src/static/images/courseDetail/zhishidian.png differ diff --git a/src/static/images/pointsAndRank/badge-bg1.png b/src/static/images/pointsAndRank/badge-bg1.png deleted file mode 100644 index 0c800a1a..00000000 Binary files a/src/static/images/pointsAndRank/badge-bg1.png and /dev/null differ diff --git a/src/static/images/pointsAndRank/festival-bg-up.png b/src/static/images/pointsAndRank/festival-bg-up.png new file mode 100644 index 00000000..ae7fd110 Binary files /dev/null and b/src/static/images/pointsAndRank/festival-bg-up.png differ diff --git a/src/static/images/pointsAndRank/festival-bg.png b/src/static/images/pointsAndRank/festival-bg.png new file mode 100644 index 00000000..1662a024 Binary files /dev/null and b/src/static/images/pointsAndRank/festival-bg.png differ diff --git a/src/static/images/pointsAndRank/festival-button.png b/src/static/images/pointsAndRank/festival-button.png new file mode 100644 index 00000000..5fca3f80 Binary files /dev/null and b/src/static/images/pointsAndRank/festival-button.png differ diff --git a/src/static/images/pointsAndRank/festival-main.png b/src/static/images/pointsAndRank/festival-main.png new file mode 100644 index 00000000..e8d59529 Binary files /dev/null and b/src/static/images/pointsAndRank/festival-main.png differ diff --git a/src/static/images/pointsAndRank/festival-text.png b/src/static/images/pointsAndRank/festival-text.png new file mode 100644 index 00000000..65fd82b3 Binary files /dev/null and b/src/static/images/pointsAndRank/festival-text.png differ diff --git a/src/static/images/test/1.png b/src/static/images/test/1.png deleted file mode 100644 index e9c44581..00000000 Binary files a/src/static/images/test/1.png and /dev/null differ diff --git a/src/static/images/test/2.png b/src/static/images/test/2.png deleted file mode 100644 index c2628b2f..00000000 Binary files a/src/static/images/test/2.png and /dev/null differ diff --git a/src/static/images/test/3.png b/src/static/images/test/3.png deleted file mode 100644 index 9473e130..00000000 Binary files a/src/static/images/test/3.png and /dev/null differ diff --git a/src/static/images/test/4.png b/src/static/images/test/4.png deleted file mode 100644 index 522212fd..00000000 Binary files a/src/static/images/test/4.png and /dev/null differ diff --git a/src/static/images/test/BG@2x.png b/src/static/images/test/BG@2x.png new file mode 100644 index 00000000..dc994c5e Binary files /dev/null and b/src/static/images/test/BG@2x.png differ diff --git a/src/static/images/test/bg-1.png b/src/static/images/test/bg-1.png new file mode 100644 index 00000000..394c6657 Binary files /dev/null and b/src/static/images/test/bg-1.png differ diff --git a/src/static/images/test/bg-2.png b/src/static/images/test/bg-2.png new file mode 100644 index 00000000..ec3aea02 Binary files /dev/null and b/src/static/images/test/bg-2.png differ diff --git a/src/static/images/test/bg-3.png b/src/static/images/test/bg-3.png new file mode 100644 index 00000000..8a3bddce Binary files /dev/null and b/src/static/images/test/bg-3.png differ diff --git a/src/static/images/test/festival-01.png b/src/static/images/test/festival-01.png new file mode 100644 index 00000000..489ca22f Binary files /dev/null and b/src/static/images/test/festival-01.png differ diff --git a/src/static/images/test/festival-02.png b/src/static/images/test/festival-02.png new file mode 100644 index 00000000..638789e9 Binary files /dev/null and b/src/static/images/test/festival-02.png differ diff --git a/src/static/images/test/festival-03.png b/src/static/images/test/festival-03.png new file mode 100644 index 00000000..36162fdb Binary files /dev/null and b/src/static/images/test/festival-03.png differ diff --git a/src/static/images/test/festival-04.png b/src/static/images/test/festival-04.png new file mode 100644 index 00000000..529a039f Binary files /dev/null and b/src/static/images/test/festival-04.png differ diff --git a/src/static/images/test/festival-05.png b/src/static/images/test/festival-05.png new file mode 100644 index 00000000..3f3728db Binary files /dev/null and b/src/static/images/test/festival-05.png differ diff --git a/src/static/images/test/festival-06.png b/src/static/images/test/festival-06.png new file mode 100644 index 00000000..5cfeba4f Binary files /dev/null and b/src/static/images/test/festival-06.png differ diff --git a/src/static/images/test/festival-07.png b/src/static/images/test/festival-07.png new file mode 100644 index 00000000..08c313ab Binary files /dev/null and b/src/static/images/test/festival-07.png differ diff --git a/src/static/images/test/festival-08.png b/src/static/images/test/festival-08.png new file mode 100644 index 00000000..4762d373 Binary files /dev/null and b/src/static/images/test/festival-08.png differ diff --git a/src/static/images/test/festival-09.png b/src/static/images/test/festival-09.png new file mode 100644 index 00000000..86d967a0 Binary files /dev/null and b/src/static/images/test/festival-09.png differ diff --git a/src/static/images/test/festival-10.png b/src/static/images/test/festival-10.png new file mode 100644 index 00000000..d918fdc6 Binary files /dev/null and b/src/static/images/test/festival-10.png differ diff --git a/src/static/images/test/search_img.png b/src/static/images/test/search_img.png deleted file mode 100644 index ba1127d6..00000000 Binary files a/src/static/images/test/search_img.png and /dev/null differ diff --git a/src/static/images/test/touxiang.png b/src/static/images/test/touxiang.png deleted file mode 100644 index 02a5d4e9..00000000 Binary files a/src/static/images/test/touxiang.png and /dev/null differ diff --git a/src/static/images/test/xz.png b/src/static/images/test/xz.png deleted file mode 100644 index 13cfd3c6..00000000 Binary files a/src/static/images/test/xz.png and /dev/null differ diff --git a/src/static/images/test/xz1.png b/src/static/images/test/xz1.png deleted file mode 100644 index a77a124a..00000000 Binary files a/src/static/images/test/xz1.png and /dev/null differ diff --git a/src/static/images/test/xz2.png b/src/static/images/test/xz2.png deleted file mode 100644 index 82ed1ae9..00000000 Binary files a/src/static/images/test/xz2.png and /dev/null differ diff --git a/src/static/images/test/xz3.png b/src/static/images/test/xz3.png deleted file mode 100644 index 7bf9600f..00000000 Binary files a/src/static/images/test/xz3.png and /dev/null differ diff --git a/src/static/images/test/xz4.png b/src/static/images/test/xz4.png deleted file mode 100644 index 0012f157..00000000 Binary files a/src/static/images/test/xz4.png and /dev/null differ diff --git a/src/static/images/test/xz5.png b/src/static/images/test/xz5.png deleted file mode 100644 index b86ad563..00000000 Binary files a/src/static/images/test/xz5.png and /dev/null differ diff --git a/上架信息/应用上架信息.xlsx b/上架信息/应用上架信息.xlsx index 134d12be..26bb354b 100644 Binary files a/上架信息/应用上架信息.xlsx and b/上架信息/应用上架信息.xlsx differ