diff --git a/common/globalFunction.js b/common/globalFunction.js index a4bf4bd..34ec784 100644 --- a/common/globalFunction.js +++ b/common/globalFunction.js @@ -1,6 +1,7 @@ import '@/lib/encryption/sm4.min.js' import useUserStore from "../stores/useUserStore"; import { + createRequestWithCache, createRequest, uploadFile } from "../utils/request"; @@ -624,6 +625,7 @@ export const $api = { sendingMiniProgramMessage, copyText, aes_Decrypt, + createRequestWithCache } diff --git a/config.js b/config.js index fb1fc56..74e3c87 100644 --- a/config.js +++ b/config.js @@ -1,6 +1,6 @@ export default { - baseUrl: 'https://fw.rc.qingdao.gov.cn/rgpp-api/api', // 内网 - // baseUrl: 'https://qd.zhaopinzao8dian.com/api', // 测试 + // baseUrl: 'https://fw.rc.qingdao.gov.cn/rgpp-api/api', // 内网 + baseUrl: 'https://qd.zhaopinzao8dian.com/api', // 测试 // baseUrl: 'http://192.168.3.29:8081', // baseUrl: 'http://10.213.6.207:19010/api', // 语音转文字 diff --git a/packageA/pages/choiceness/choiceness.vue b/packageA/pages/choiceness/choiceness.vue index 16f89af..1abf65f 100644 --- a/packageA/pages/choiceness/choiceness.vue +++ b/packageA/pages/choiceness/choiceness.vue @@ -50,10 +50,11 @@ function delCollectionCard(item) { } function getPremiumList() { - $api.createRequest('/app/company/card').then((resData) => { + const LoadCache = (resData) => { const { rows, total } = resData; list.value = rows; - }); + }; + $api.createRequestWithCache('/app/company/card', {}, 'GET', false, {}, LoadCache).then(LoadCache); } function seeDetail(item) { diff --git a/packageA/pages/selectDate/selectDate.vue b/packageA/pages/selectDate/selectDate.vue index c686301..5812aa9 100644 --- a/packageA/pages/selectDate/selectDate.vue +++ b/packageA/pages/selectDate/selectDate.vue @@ -26,7 +26,7 @@ { - updateDateArray() if (options.date) { current.value = { date: options?.date || null, @@ -81,20 +80,30 @@ onLoad((options) => { addMonth(); }); } + if (options.entrance === 'careerfair') { + updateDateArray(); + } }); function hasZphInData(item) { - return hasZphDateArray.value.some(date=>date == item.date) + if (!item || typeof item.date !== 'string') { + return false; + } + + const dateArray = Array.isArray(hasZphDateArray.value) ? hasZphDateArray.value : []; + + return dateArray.some((date) => { + return typeof date === 'string' && date === item.date; + }); } async function updateDateArray() { - if(localStorage.getItem('hasZphDateArray')) hasZphDateArray.value = localStorage.getItem('hasZphDateArray') - - let res = await $api.createRequest('/app/internal/getDateList', {}, 'get') - if(res.data){ - hasZphDateArray.value = res.data - localStorage.setItem('hasZphDateArray',res.data) - } + const LoadCache = (resData) => { + if (resData.code === 200) { + hasZphDateArray.value = resData.data; + } + }; + $api.createRequestWithCache('/app/internal/getDateList', {}, 'GET', false, {}, LoadCache).then(LoadCache); } function backParams() { diff --git a/pages/careerfair/careerfair.vue b/pages/careerfair/careerfair.vue index 69b88ae..e5032cc 100644 --- a/pages/careerfair/careerfair.vue +++ b/pages/careerfair/careerfair.vue @@ -13,7 +13,14 @@ - + @@ -42,7 +49,14 @@ class="card press-button" v-for="(item, index) in fairList" :key="index" - @click="navTo('/packageA/pages/exhibitors/exhibitors?jobFairId=' + item.zphID + '&jobFairName=' + item.zphmc)" + @click=" + navTo( + '/packageA/pages/exhibitors/exhibitors?jobFairId=' + + item.zphID + + '&jobFairName=' + + item.zphmc + ) + " > {{ item.zphmc }} @@ -95,7 +109,7 @@ import Tabbar from '@/components/tabbar/midell-box.vue'; import useLocationStore from '@/stores/useLocationStore'; import { storeToRefs } from 'pinia'; const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore()); -const { $api, navTo, cloneDeep,debounce } = inject('globalFunction'); +const { $api, navTo, cloneDeep, debounce } = inject('globalFunction'); const weekList = ref([]); const fairList = ref([]); const currentDay = ref({}); @@ -108,7 +122,7 @@ const pageState = reactive({ total: 0, maxPage: 2, pageSize: 10, - zphmc:'' + zphmc: '', }); onLoad(() => { @@ -122,7 +136,7 @@ onLoad(() => { startDate: currentDate, }); weekList.value = result; - currentDay.value.fullDate = result[0].fullDate + currentDay.value.fullDate = result[0].fullDate; getFair('refresh'); }); @@ -130,6 +144,7 @@ function toSelectDate() { navTo('/packageA/pages/selectDate/selectDate', { query: { date: currentDay.value.fullDate, + entrance: 'careerfair', }, onBack: (res) => { console.log(res); @@ -162,12 +177,11 @@ function seemsg(index) { } const handleScrollToLower = () => { - return + return; getFair(); console.log('触底'); }; - function getFair(type = 'add') { if (type === 'refresh') { pageState.page = 1; @@ -177,7 +191,7 @@ function getFair(type = 'add') { pageState.page += 1; } let params = { - zphmc:pageState.zphmc, + zphmc: pageState.zphmc, // current: pageState.page, // pageSize: pageState.pageSize, }; @@ -194,7 +208,7 @@ function getFair(type = 'add') { // const end = fairList.value.length; // const reslist = rows; // fairList.value.splice(str, end, ...reslist); - fairList.value = rows + fairList.value = rows; } else { fairList.value = rows; } diff --git a/stores/BaseDBStore.js b/stores/BaseDBStore.js deleted file mode 100644 index ad61257..0000000 --- a/stores/BaseDBStore.js +++ /dev/null @@ -1,73 +0,0 @@ -// BaseStore.js - 基础Store类 -import IndexedDBHelper from '@/common/IndexedDBHelper.js' -// import UniStorageHelper from '../common/UniStorageHelper' -import useChatGroupDBStore from './userChatGroupStore' -import config from '@/config' - - -class BaseStore { - db = null - isDBReady = false - dbName = 'BrowsingHistory' - constructor() { - this.checkAndInitDB() - } - checkAndInitDB() { - // 获取本地数据库版本 - if (config.OnlyUseCachedDB) { - return this.initDB() - } - const localVersion = uni.getStorageSync('indexedDBVersion') || 1 - console.log('DBVersion: ', localVersion, config.DBversion) - if (localVersion === config.DBversion) { - this.initDB() - } else { - console.log('清空本地数据库') - this.clearDB().then(() => { - uni.setStorageSync('indexedDBVersion', config.DBversion); - this.initDB(); - }); - } - } - initDB() { - // // #ifdef H5 - this.db = new IndexedDBHelper(this.dbName, config.DBversion); - // // #endif - // // #ifndef H5 - // this.db = new UniStorageHelper(this.dbName, config.DBversion); - // // #endif - this.db.openDB([{ - name: 'record', - keyPath: "id", - autoIncrement: true, - }, { - name: 'messageGroup', - keyPath: "id", - autoIncrement: true, - }, { - name: 'messages', - keyPath: "id", - autoIncrement: true, - indexes: [{ - name: 'parentGroupId', - key: 'parentGroupId', - unique: false - }] - }]).then(async () => { - useChatGroupDBStore().init() - this.isDBReady = true - }); - } - async clearDB() { - return new Promise((resolve, rejetc) => { - new IndexedDBHelper().deleteDB(this.dbName).then(() => { - resolve() - }) - }) - } - -} - -const baseDB = new BaseStore() - -export default baseDB \ No newline at end of file diff --git a/stores/useRecommedIndexedDBStore.js b/stores/useRecommedIndexedDBStore.js index 3f74d19..3669828 100644 --- a/stores/useRecommedIndexedDBStore.js +++ b/stores/useRecommedIndexedDBStore.js @@ -9,7 +9,7 @@ import jobAnalyzer from '@/utils/jobAnalyzer'; import { msg } from '@/common/globalFunction.js' -import baseDB from './BaseDBStore'; +import baseDB from '@/utils/db.js'; import config from '../config'; class JobRecommendation { diff --git a/stores/userChatGroupStore.js b/stores/userChatGroupStore.js index af70f96..54478d3 100644 --- a/stores/userChatGroupStore.js +++ b/stores/userChatGroupStore.js @@ -6,7 +6,7 @@ import { ref, toRaw } from 'vue' -import baseDB from './BaseDBStore'; +import baseDB from '@/utils/db.js'; import { msg, CloneDeep, diff --git a/utils/db.js b/utils/db.js new file mode 100644 index 0000000..d901575 --- /dev/null +++ b/utils/db.js @@ -0,0 +1,91 @@ +// BaseDBStore.js +import IndexedDBHelper from '@/common/IndexedDBHelper.js' +// import UniStorageHelper from '../common/UniStorageHelper' +import useChatGroupDBStore from '@/stores/userChatGroupStore' +import config from '@/config' + +class BaseStore { + db = null + isDBReady = false + dbName = 'BrowsingHistory' // 'AppMainDB' + initPromise = null + + constructor() { + this.initPromise = this.checkAndInitDB() + } + + async getDB() { + if (!this.initPromise) { + this.initPromise = this.checkAndInitDB(); + } + await this.initPromise; // 等待初始化完成 + return this.db; + } + + async checkAndInitDB() { + if (config.OnlyUseCachedDB) { + return this.initDB() + } + const localVersion = uni.getStorageSync('indexedDBVersion') || 1 + console.log('DBVersion: ', localVersion, config.DBversion) + if (localVersion === config.DBversion) { + return this.initDB() // 🟢 记得加 return + } else { + console.log('清空本地数据库') + await this.clearDB() // 🟢 建议用 await + uni.setStorageSync('indexedDBVersion', config.DBversion); + return this.initDB(); // 🟢 记得加 return + } + } + + initDB() { + // // #ifdef H5 + this.db = new IndexedDBHelper(this.dbName, config.DBversion); + // // #endif + + return this.db.openDB([{ + name: 'record', + keyPath: "id", + autoIncrement: true, + }, + { + name: 'messageGroup', + keyPath: "id", + autoIncrement: true, + }, + { + name: 'messages', + keyPath: "id", + autoIncrement: true, + indexes: [{ + name: 'parentGroupId', + key: 'parentGroupId', + unique: false + }] + }, + { + name: 'api_cache', + keyPath: "cacheKey", // 使用 URL+参数 作为主键 + indexes: [] + } + ]).then(async () => { + // 这里原来的逻辑保留 + if (useChatGroupDBStore) { + useChatGroupDBStore().init() + } + this.isDBReady = true + return this.db; + }); + } + + async clearDB() { + return new Promise((resolve, rejetc) => { + new IndexedDBHelper().deleteDB(this.dbName).then(() => { + resolve() + }) + }) + } +} + +const baseDB = new BaseStore() +export default baseDB \ No newline at end of file diff --git a/utils/request.js b/utils/request.js index 9ee9c0d..b4eca8d 100644 --- a/utils/request.js +++ b/utils/request.js @@ -1,14 +1,15 @@ import config from "@/config.js" import { sm2_Decrypt, - sm2_Encrypt -} from '@/common/globalFunction'; -import useUserStore from '@/stores/useUserStore'; -import { + sm2_Encrypt, sm4Decrypt, sm4Encrypt -} from '../common/globalFunction'; +} from '@/common/globalFunction'; +import IndexedDBHelper from '@/common/IndexedDBHelper'; +import useUserStore from '@/stores/useUserStore'; +import baseDB from '@/utils/db.js'; +const CACHE_STORE_NAME = 'api_cache'; const needToEncrypt = [ ["post", "/app/login"], @@ -20,6 +21,47 @@ const needToEncrypt = [ ["get", "/app/user/experience/list"] ] +/** + * 带缓存的请求方法 + */ +export async function createRequestWithCache(url, data = {}, method = 'GET', loading = false, headers = {}, + onCacheLoad = null) { + const cacheKey = `${method.toUpperCase()}:${url}:${JSON.stringify(data)}`; + + baseDB.getDB().then(async (dbHelper) => { + try { + const cachedRecord = await dbHelper.get(CACHE_STORE_NAME, cacheKey); + + if (cachedRecord && cachedRecord.response && typeof onCacheLoad === 'function') { + onCacheLoad(cachedRecord.response); + } + } catch (e) { + console.error('读取缓存失败', e); + } + }); + + // 3. 发起网络请求 + try { + const networkResponse = await createRequest(url, data, method, loading, headers); + baseDB.getDB().then(async (dbHelper) => { + try { + await dbHelper.update(CACHE_STORE_NAME, { + cacheKey: cacheKey, + response: networkResponse, + timestamp: Date.now() + }); + console.log('💾 [BaseDB] 缓存更新:', url); + } catch (e) { + console.error('更新缓存失败', e); + } + }); + + return networkResponse; + } catch (error) { + throw error; + } +} + /** * @param url String,请求的地址,默认:none * @param data Object,请求的参数,默认:{}