主包体积太大,相关代码迁移

This commit is contained in:
francis-fh
2026-06-06 19:14:01 +08:00
parent 087c686d81
commit b4ff618477
104 changed files with 7336 additions and 8973 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
common/.DS_Store vendored

Binary file not shown.

BIN
components/.DS_Store vendored

Binary file not shown.

View File

@@ -111,7 +111,7 @@ const generateTabbarList = () => {
// baseItems.splice(1, 0, {
// id: 1,
// text: '招聘会',
// path: '/pages/careerfair/careerfair',
// path: '/packageA/pages/careerfair/careerfair',
// iconPath: '/static/tabbar/post.png',
// selectedIconPath: '/static/tabbar/posted.png',
// centerItem: false,
@@ -124,7 +124,7 @@ const generateTabbarList = () => {
baseItems.splice(1, 0, {
id: 5,
text: '招聘会',
path: '/pages/careerfair/careerfair',
path: '/packageA/pages/careerfair/careerfair',
iconPath: '/static/tabbar/careerfair.png',
selectedIconPath: '/static/tabbar/careerfaired.png',
centerItem: false,
@@ -178,7 +178,7 @@ const switchTab = (item, index) => {
const loginRequiredPages = [
'/packageA/pages/job/publishJob',
'/pages/mine/mine',
'/pages/mine/company-mine',
'/packageA/pages/company-mine/company-mine',
'/pages/msglog/msglog'
];
@@ -245,7 +245,7 @@ const switchTab = (item, index) => {
if (userType === 0) {
// 企业用户,跳转到企业我的页面
targetPath = '/pages/mine/company-mine';
targetPath = '/packageA/pages/company-mine/company-mine';
} else {
// 求职者或其他用户类型,跳转到普通我的页面
targetPath = '/pages/mine/mine';

View File

@@ -121,7 +121,7 @@ const generateTabbarList = () => {
baseItems.splice(1, 0, {
id: 1,
text: '招聘会',
path: '/pages/careerfair/careerfair',
path: '/packageA/pages/careerfair/careerfair',
iconPath: '../../static/tabbar/post.png',
selectedIconPath: '../../static/tabbar/posted.png',
centerItem: false,
@@ -147,7 +147,7 @@ const changeItem = (item) => {
// 判断是否为 TabBar 页面
const tabBarPages = [
'/pages/index/index',
'/pages/careerfair/careerfair',
'/packageA/pages/careerfair/careerfair',
'/packageA/pages/chat/chat',
'/pages/msglog/msglog',
'/pages/mine/mine'

View File

@@ -79,6 +79,7 @@
<button
class="auth-btn primary"
open-type="getPhoneNumber"
@tap="onPrepareWxAuth"
@getphonenumber="getPhoneNumber"
>
<uni-icons type="phone" size="20" color="#FFFFFF"></uni-icons>
@@ -126,7 +127,7 @@ import { ref, inject, onMounted } from 'vue';
import useUserStore from '@/stores/useUserStore';
import useDictStore from '@/stores/useDictStore';
import { tabbarManager } from '@/utils/tabbarManager';
import { refreshWxLoginCode, takeWxLoginCode } from '@/utils/loginHelper';
import { prepareWxLoginCodeOnTap, consumeWxLoginCodeFromTap } from '@/utils/loginHelper';
const { $api } = inject('globalFunction');
const { loginSetToken } = useUserStore();
@@ -173,9 +174,6 @@ const open = () => {
const agreed = uni.getStorageSync('agreedToUserAgreement');
agreedToAgreement.value = !!agreed;
// #ifdef MP-WEIXIN
refreshWxLoginCode().catch(() => {});
// #endif
};
// 关闭弹窗
@@ -217,6 +215,15 @@ const validateRole = () => {
return true;
};
const onPrepareWxAuth = () => {
if (!validateRole()) {
return;
}
prepareWxLoginCodeOnTap().catch((err) => {
console.error('预取微信登录凭证失败:', err);
});
};
const getPhoneNumber = async (e) => {
if (!validateRole()) {
return;
@@ -229,19 +236,17 @@ const getPhoneNumber = async (e) => {
return;
}
let loginCode = takeWxLoginCode();
if (!loginCode) {
if (encryptedData) {
$api.msg('登录凭证未就绪,请关闭弹窗后重新打开再试');
refreshWxLoginCode().catch(() => {});
return;
}
let loginCode = '';
try {
loginCode = await refreshWxLoginCode();
} catch {
loginCode = await consumeWxLoginCodeFromTap();
} catch (err) {
console.error('获取微信登录凭证失败:', err);
$api.msg('获取登录信息失败,请重试');
return;
}
if (!loginCode) {
$api.msg('登录凭证未就绪,请重新点击授权');
return;
}
const requestParams = {
@@ -291,10 +296,10 @@ const getPhoneNumber = async (e) => {
$api.msg(resData.msg || '登录失败,请重试');
}
} catch (err) {
$api.msg(err.msg || '登录失败,请重试');
console.error('微信登录请求异常:', err);
$api.msg(err.message || err.msg || '登录失败,请重试');
} finally {
uni.hideLoading();
refreshWxLoginCode().catch(() => {});
}
} else if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
$api.msg('您取消了授权');
@@ -314,7 +319,7 @@ const wxLogin = () => {
// H5端跳转到H5登录页面
close();
uni.navigateTo({
url: '/pages/login/h5-login'
url: '/packageA/pages/login/h5-login'
});
return;
// #endif

View File

@@ -85,7 +85,7 @@ export default {
},
shareConfig: {
baseUrl: 'https://qd.zhaopinzao8dian.com',
title: '找工作,用 AI 更高效|青岛市智能求职平台',
title: '找工作,用 AI 更高效|喀什智能求职平台',
desc: '融合海量岗位、智能简历匹配、竞争力分析,助你精准锁定理想职位!',
imgUrl: 'https://qd.zhaopinzao8dian.com/file/csn/qd_shareLogo.jpg',
},

BIN
hook/.DS_Store vendored

Binary file not shown.

View File

@@ -1,136 +0,0 @@
import {
ref,
onBeforeUnmount,
onMounted
} from 'vue'
import {
onHide,
onUnload
} from '@dcloudio/uni-app'
export function useSpeechReader() {
const isSpeaking = ref(false)
const isPaused = ref(false)
let utterance = null
const cleanMarkdown = (text) => {
return formatTextForSpeech(text)
}
const speak = (text, options = {
lang: 'zh-CN',
rate: 0.9,
pitch: 1.2
}) => {
cancelAudio() // 重置之前的
// const voices = speechSynthesis.getVoices()
// const chineseVoices = voices.filter(v => v.lang.includes('zh'))
const speechText = extractSpeechText(text);
utterance = new SpeechSynthesisUtterance(speechText)
// utterance.lang = options.lang || 'zh'
utterance.rate = options.rate || 1
utterance.pitch = options.pitch || 1.1 // 音调0 - 2偏高比较柔和
utterance.onend = () => {
isSpeaking.value = false
isPaused.value = false
}
speechSynthesis.speak(utterance)
isSpeaking.value = true
isPaused.value = false
}
const pause = () => {
if (isSpeaking.value && !isPaused.value) {
speechSynthesis.pause()
isPaused.value = true
}
}
const resume = () => {
if (isSpeaking.value && isPaused.value) {
speechSynthesis.resume()
isPaused.value = false
}
}
const cancelAudio = () => {
speechSynthesis.cancel()
isSpeaking.value = false
isPaused.value = false
}
// 页面刷新/关闭时
onMounted(() => {
if (typeof window !== 'undefined') {
window.addEventListener('beforeunload', cancelAudio)
}
})
onBeforeUnmount(() => {
cancelAudio()
if (typeof window !== 'undefined') {
window.removeEventListener('beforeunload', cancelAudio)
}
})
onHide(cancelAudio)
onUnload(cancelAudio)
return {
speak,
pause,
resume,
cancelAudio,
isSpeaking,
isPaused,
}
}
function extractSpeechText(markdown) {
const jobRegex = /``` job-json\s*({[\s\S]*?})\s*```/g;
const jobs = [];
let match;
let lastJobEndIndex = 0;
let firstJobStartIndex = -1;
// 提取岗位 json 数据及前后位置
while ((match = jobRegex.exec(markdown)) !== null) {
const jobStr = match[1];
try {
const job = JSON.parse(jobStr);
jobs.push(job);
if (firstJobStartIndex === -1) {
firstJobStartIndex = match.index;
}
lastJobEndIndex = jobRegex.lastIndex;
} catch (e) {
console.warn('JSON 解析失败', e);
}
}
// 提取引导语(第一个 job-json 之前的文字)
const guideText = firstJobStartIndex > 0 ?
markdown.slice(0, firstJobStartIndex).trim() :
'';
// 提取结束语(最后一个 job-json 之后的文字)
const endingText = lastJobEndIndex < markdown.length ?
markdown.slice(lastJobEndIndex).trim() :
'';
// 岗位信息格式化为语音文本
const jobTexts = jobs.map((job, index) => {
return `${index + 1} 个岗位,岗位名称是:${job.jobTitle},公司是:${job.companyName},薪资:${job.salary},地点:${job.location},学历要求:${job.education},经验要求:${job.experience}`;
});
// 拼接总语音内容
const finalTextParts = [];
if (guideText) finalTextParts.push(guideText);
finalTextParts.push(...jobTexts);
if (endingText) finalTextParts.push(endingText);
return finalTextParts.join('\n');
}

BIN
lib/.DS_Store vendored

Binary file not shown.

View File

@@ -1,10 +0,0 @@
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
Theme: GitHub Dark
Description: Dark theme as seen on github.com
Author: github.com
Maintainer: @Hirse
Updated: 2021-05-15
Outdated base version: https://github.com/primer/github-syntax-dark
Current colors taken from GitHub's CSS
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}

BIN
packageA/.DS_Store vendored

Binary file not shown.

View File

@@ -39,7 +39,7 @@
<script setup>
import { computed, onMounted, inject, ref, watch, nextTick } from 'vue';
import { parseMarkdown, codeDataList, jobCardsList } from '@/utils/markdownParser';
import { parseMarkdown, codeDataList, jobCardsList } from '@/packageA/utils/markdownParser';
const { navTo } = inject('globalFunction');
const props = defineProps({
content: {

View File

@@ -4,8 +4,7 @@ import {
} from 'vue'
import {
$api,
} from '../common/globalFunction';
} from '@/common/globalFunction';
import config from '@/config'

Binary file not shown.

View File

@@ -83,7 +83,7 @@
import { ref, inject, nextTick, computed, onMounted, onUnmounted } from 'vue';
const { $api, navTo, insertSortData, config } = inject('globalFunction');
import { onLoad, onShow, onHide } from '@dcloudio/uni-app';
import useChatGroupDBStore from '@/stores/userChatGroupStore';
import useChatGroupDBStore from '@/packageA/stores/userChatGroupStore';
import useUserStore from '@/stores/useUserStore';
import { tabbarManager } from '@/utils/tabbarManager';
import aiPaging from './components/ai-paging.vue';
@@ -122,7 +122,7 @@ onShow(() => {
onMounted(() => {
// 监听退出登录事件,显示微信登录弹窗
uni.$on('showLoginModal', () => {
uni.navigateTo({ url: '/pages/login/wx-login' });
uni.navigateTo({ url: '/packageA/pages/login/wx-login' });
});
});

View File

@@ -365,15 +365,15 @@ import {
} from 'vue';
import { storeToRefs } from 'pinia';
// 移除重复导入使用从globalFunction注入的config
import useChatGroupDBStore from '@/stores/userChatGroupStore';
import MdRender from '@/components/md-render/md-render.vue';
import useChatGroupDBStore from '@/packageA/stores/userChatGroupStore';
import MdRender from '@/packageA/components/md-render/md-render.vue';
import PopupFeeBack from './popupbadFeeback.vue';
import AudioWave from './AudioWave.vue';
import WaveDisplay from './WaveDisplay.vue';
import FileIcon from './fileIcon.vue';
import FileText from './fileText.vue';
import { useAudioRecorder } from '@/hook/useRealtimeRecorder.js';
import { useTTSPlayer } from '@/hook/useTTSPlayer.js';
import { useAudioRecorder } from '@/packageA/hook/useRealtimeRecorder.js';
import { useTTSPlayer } from '@/packageA/hook/useTTSPlayer.js';
import successIcon from '@/static/icon/success.png';
// 全局
const { $api, navTo, throttle, config } = inject('globalFunction');

View File

@@ -152,7 +152,7 @@ function editInfo(type) {
function editContacts() {
//
navTo('/pages/mine/edit-company-contacts');
navTo('/packageA/pages/company-mine/edit-company-contacts');
}
onShow(() => {

View File

@@ -176,7 +176,7 @@ const companyInfo = reactive({
});
function goToCompanyInfo() {
navTo('/pages/mine/company-info');
navTo('/packageA/pages/company-mine/company-info');
}
function handleInstitutionClick(i){
if(i==1){
@@ -221,7 +221,7 @@ onMounted(() => {
//
//
uni.navigateTo({
url: '/pages/login/wx-login'
url: '/packageA/pages/login/wx-login'
});
});
});

View File

@@ -234,7 +234,7 @@
<script setup>
import { ref, reactive, computed, inject } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import AreaCascadePicker from '@/components/area-cascade-picker/area-cascade-picker.vue'
import AreaCascadePicker from '@/packageA/components/area-cascade-picker/area-cascade-picker.vue'
import SelectPopup from '@/components/selectPopup/selectPopup.vue'
import useDictStore from '@/stores/useDictStore'
import useUserStore from '@/stores/useUserStore'

View File

@@ -185,7 +185,7 @@
</template>
<script setup>
import signDialog from '@/components/jobfair/signDialog.vue';
import signDialog from '@/packageA/components/jobfair/signDialog.vue';
import config from "@/config.js"
import {
reactive,

View File

@@ -219,7 +219,7 @@ const handleLogin = async () => {
//
const goToIdCardLogin = () => {
uni.navigateTo({
url: '/pages/login/id-card-login'
url: '/packageA/pages/login/id-card-login'
})
}

View File

@@ -83,6 +83,7 @@
<button
class="auth-btn primary"
open-type="getPhoneNumber"
@tap="onPrepareWxAuth"
@getphonenumber="onWxGetPhoneNumber"
>
<uni-icons type="phone" size="20" color="#FFFFFF"></uni-icons>
@@ -127,7 +128,7 @@ import { ref, inject, onMounted, computed } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import useUserStore from '@/stores/useUserStore';
import useDictStore from '@/stores/useDictStore';
import { refreshWxLoginCode, takeWxLoginCode } from '@/utils/loginHelper';
import { prepareWxLoginCodeOnTap, consumeWxLoginCodeFromTap } from '@/utils/loginHelper';
const { $api } = inject('globalFunction');
const userStore = useUserStore();
@@ -230,21 +231,17 @@ const validateForm = () => {
return true;
};
//
const checkBeforeWxAuth = (e) => {
//
// wx.login codetap getPhoneNumber session
const onPrepareWxAuth = () => {
if (!validateForm()) {
//
if (e && e.preventDefault) {
e.preventDefault();
}
return false;
} else {
console.log('Validation passed, allowing wx auth');
return;
}
prepareWxLoginCodeOnTap().catch((err) => {
console.error('预取微信登录凭证失败:', err);
});
};
// 使 login code login session_key
// 使 login code session_key encryptedData
const onWxGetPhoneNumber = async (e) => {
if (!validateForm()) {
return;
@@ -257,20 +254,11 @@ const onWxGetPhoneNumber = async (e) => {
return;
}
let loginCode = takeWxLoginCode();
if (!loginCode) {
if (encryptedData) {
uni.showToast({
title: '登录凭证未就绪,请稍后重新点击授权',
icon: 'none',
duration: 2000
});
refreshWxLoginCode().catch(() => {});
return;
}
let loginCode = '';
try {
loginCode = await refreshWxLoginCode();
} catch {
loginCode = await consumeWxLoginCodeFromTap();
} catch (err) {
console.error('获取微信登录凭证失败:', err);
uni.showToast({
title: '获取登录信息失败,请重试',
icon: 'none',
@@ -278,6 +266,13 @@ const onWxGetPhoneNumber = async (e) => {
});
return;
}
if (!loginCode) {
uni.showToast({
title: '登录凭证未就绪,请重新点击授权',
icon: 'none',
duration: 2000
});
return;
}
uni.showLoading({ title: '获取验证码中...' });
@@ -319,18 +314,19 @@ const onWxGetPhoneNumber = async (e) => {
params.orgType = orgType.value;
}
uni.navigateTo({
url: '/pages/login/sms-verify?' + Object.keys(params)
url: '/packageA/pages/login/sms-verify?' + Object.keys(params)
.map(key => `${key}=${encodeURIComponent(params[key])}`)
.join('&')
});
} else {
console.error('获取验证码接口失败:', resData);
$api.msg(resData.msg || '获取验证码失败');
}
} catch (err) {
$api.msg(err.msg || '获取验证码失败,请重试');
console.error('获取验证码请求异常:', err);
$api.msg(err.message || err.msg || '获取验证码失败,请重试');
} finally {
uni.hideLoading();
refreshWxLoginCode().catch(() => {});
}
} else if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
uni.showToast({
@@ -357,7 +353,7 @@ const wxLogin = () => {
// #ifdef H5
// H5H5
uni.navigateTo({
url: '/pages/login/h5-login'
url: '/packageA/pages/login/h5-login'
});
return;
// #endif
@@ -507,12 +503,9 @@ const testLogin = () => {
});
};
// wx.login code
// wx.login session
onLoad(() => {
getOrgTypeDict();
// #ifdef MP-WEIXIN
refreshWxLoginCode().catch(() => {});
// #endif
});
</script>

View File

@@ -14,7 +14,7 @@ const { $api, navTo, navBack, vacanciesTo } = inject('globalFunction');
import { storeToRefs } from 'pinia';
import useLocationStore from '@/stores/useLocationStore';
import { usePagination } from '@/packageA/hook/usePagination';
import { jobMoreMap } from '@/utils/markdownParser';
import { jobMoreMap } from '@/utils/jobMoreMap.js';
const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore());
const loadmoreRef = ref(null);

Binary file not shown.

View File

@@ -99,7 +99,7 @@ const startCreateResume = () => {
//
const viewExampleResume = () => {
navTo('/pages/resume-guide/resume-example');
navTo('/packageA/pages/resume-guide/resume-example');
};
</script>

View File

@@ -27,7 +27,7 @@
import { inject, ref, reactive } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
const { $api, navBack, navTo } = inject('globalFunction');
import mTikTok from '@/components/TikTok/TikTok.vue';
import mTikTok from '@/packageA/components/TikTok/TikTok.vue';
import useUserStore from '@/stores/useUserStore';
import { useRecommedIndexedDBStore } from '@/stores/useRecommedIndexedDBStore.js';
const recommedIndexDb = useRecommedIndexedDBStore();

View File

@@ -6,21 +6,21 @@ import {
ref,
toRaw
} from 'vue'
import baseDB from './BaseDBStore';
import baseDB from '@/stores/BaseDBStore';
import {
msg,
CloneDeep,
$api,
formatDate,
insertSortData
} from '../common/globalFunction';
} from '@/common/globalFunction';
import {
UUID
} from '../lib/uuid-min';
import config from '../config';
} from '@/lib/uuid-min';
import config from '@/config';
import {
clearJobMoreMap
} from '@/utils/markdownParser';
} from '@/utils/jobMoreMap.js';
const useChatGroupDBStore = defineStore("messageGroup", () => {
const tableName = ref('messageGroup')

View File

@@ -1,10 +1,10 @@
import MarkdownIt from '@/lib/markdown-it.min.js';
import hljs from "@/lib/highlight/highlight-uni.min.js";
import parseHtml from '@/lib/html-parser.js';
// import DOMPurify from '@/lib/dompurify@3.2.4es.js';
import MarkdownIt from '@/packageA/lib/markdown-it.min.js';
import hljs from '@/packageA/lib/highlight/highlight-uni.min.js';
import parseHtml from '@/packageA/lib/html-parser.js';
import { jobMoreMap } from '@/utils/jobMoreMap.js';
export { jobMoreMap } from '@/utils/jobMoreMap.js';
export let codeDataList = []
export let jobMoreMap = new Map()
export let jobCardsList = []
const md = new MarkdownIt({
@@ -141,10 +141,6 @@ function safeExtractJson(text) {
return null;
}
export function clearJobMoreMap() { // 切换对话清空
jobMoreMap.clear()
}
export function parseMarkdown(content) {
if (!content) {
return [] //处理特殊情况,比如网络异常导致的响应的 content 的值为空

View File

@@ -70,7 +70,7 @@
import testHead from "@/packageCa/testReport/components/testHead.vue"
import contrastBox from "@/packageCa/testReport/components/contrastBox.vue"
import api from "@/packageCa/apiCa/testManage.js";
import theme from '@/uni_modules/lime-echart/static/walden.json';
import theme from '@/packageCa/uni_modules/lime-echart/static/walden.json';
const echarts = require('../utilCa/echarts.min.js');
import * as echarts1 from '../utilCa/echarts.min';
// // 注册主题

View File

@@ -240,9 +240,9 @@
import testHead from "@/packageCa/testReport/components/testHead.vue"
import contrastBox from "@/packageCa/testReport/components/contrastBox.vue"
import api from "@/packageCa/apiCa/testManage.js";
import theme from '@/uni_modules/lime-echart/static/walden.json';
import theme from '@/packageCa/uni_modules/lime-echart/static/walden.json';
const echarts = require('../utilCa/echarts.min.js');
// import * as echarts from '@/uni_modules/lime-echart/static/echarts.min';
// import * as echarts from '@/packageCa/uni_modules/lime-echart/static/echarts.min';
// // 注册主题
// echarts.registerTheme('theme', theme);

View File

@@ -110,9 +110,9 @@
import contrastBox from "@/packageCa/testReport/components/contrastBox.vue"
import api from "@/packageCa/apiCa/testManage.js"
import wayData from "./multipleAbilityData.json";
import theme from '@/uni_modules/lime-echart/static/walden.json';
import theme from '@/packageCa/uni_modules/lime-echart/static/walden.json';
const echarts = require('../utilCa/echarts.min.js');
// import * as echarts from '@/uni_modules/lime-echart/static/echarts.min';
// import * as echarts from '@/packageCa/uni_modules/lime-echart/static/echarts.min';
// // 注册主题
// echarts.registerTheme('theme', theme);
export default {

View File

@@ -397,9 +397,9 @@
import contrastBox from "@/packageCa/testReport/components/contrastBox.vue"
import opts from "./chartOpts.js"
import api from "@/packageCa/apiCa/testManage.js";
import theme from '@/uni_modules/lime-echart/static/walden.json';
import theme from '@/packageCa/uni_modules/lime-echart/static/walden.json';
const echarts = require('../utilCa/echarts.min.js');
// import * as echarts from '@/uni_modules/lime-echart/static/echarts.min';
// import * as echarts from '@/packageCa/uni_modules/lime-echart/static/echarts.min';
// // 注册主题
// echarts.registerTheme('theme', theme);
export default {

View File

@@ -38,7 +38,7 @@
import testHead from "@/packageCa/testReport/components/testHead.vue"
import contrastBox from "@/packageCa/testReport/components/contrastBox.vue"
import api from "@/packageCa/apiCa/testManage.js";
import theme from '@/uni_modules/lime-echart/static/walden.json';
import theme from '@/packageCa/uni_modules/lime-echart/static/walden.json';
const echarts = require('../utilCa/echarts.min.js');
// // 注册主题
// echarts.registerTheme('theme', theme);

View File

@@ -43,7 +43,7 @@
:style="canvasStyle"
:webview-styles="webviewStyles"
ref="webview"
src="/uni_modules/lime-echart/static/uvue.html?v=1"
src="/packageCa/uni_modules/lime-echart/static/uvue.html?v=1"
@pagefinish="finished = true"
@onPostMessage="onMessage"
></web-view>

View File

@@ -19,7 +19,7 @@
<script>
// nvue
// #ifdef VUE2
import * as echarts from '@/uni_modules/lime-echart/static/echarts.min';
import * as echarts from '@/packageCa/uni_modules/lime-echart/static/echarts.min';
// #endif
// #ifdef VUE3
// #ifdef MP

View File

@@ -43,7 +43,7 @@
this.$store.dispatch('LogOut').then((res) => {
this.closeExitPopup()
uni.navigateTo({
url: '/pages/login/login-one'
url: '/packageA/pages/login/wx-login'
})
})
}

View File

@@ -674,7 +674,7 @@ const getCompanyInfo = () => {
// 跳转到企业信息详情页面
const goToCompanyInfo = () => {
navTo("/pages/mine/company-info");
navTo("/packageA/pages/company-mine/company-info");
};
// 组件初始化时加载数据
@@ -870,22 +870,22 @@ function nextDetail(job) {
function navToService(serviceType) {
// 根据服务类型跳转到不同页面
const serviceRoutes = {
"service-guidance": "/pages/service/guidance",
"public-recruitment": "/pages/service/public-recruitment",
"service-guidance": "/packageA/pages/service/guidance",
"public-recruitment": "/packageA/pages/service/public-recruitment",
"resume-creation": "/packageA/pages/myResume/myResume",
"labor-policy": "/pages/service/labor-policy",
"skill-training": "/pages/service/skill-training",
// 'skill-evaluation': '/pages/service/skill-evaluation',
"question-bank": "/pages/service/question-bank",
"quality-assessment": "/pages/service/quality-assessment",
"labor-policy": "/packageA/pages/service/labor-policy",
"skill-training": "/packageA/pages/service/skill-training",
// 'skill-evaluation': '/packageA/pages/service/skill-evaluation',
"question-bank": "/packageA/pages/service/question-bank",
"quality-assessment": "/packageA/pages/service/quality-assessment",
"ai-interview": "/packageA/pages/chat/chat",
"job-search": "/pages/search/search",
"career-planning": "/pages/service/career-planning",
"salary-query": "/pages/service/salary-query",
"company-info": "/pages/service/company-info",
"interview-tips": "/pages/service/interview-tips",
"employment-news": "/pages/service/employment-news",
"more-services": "/pages/service/more-services",
"career-planning": "/packageA/pages/service/career-planning",
"salary-query": "/packageA/pages/service/salary-query",
"company-info": "/packageA/pages/service/company-info",
"interview-tips": "/packageA/pages/service/interview-tips",
"employment-news": "/packageA/pages/service/employment-news",
"more-services": "/packageA/pages/service/more-services",
"skill-evaluation": "/packageB/train/index",
};

View File

@@ -674,7 +674,7 @@ const getCompanyInfo = () => {
// 跳转到企业信息详情页面
const goToCompanyInfo = () => {
navTo("/pages/mine/company-info");
navTo("/packageA/pages/company-mine/company-info");
};
// 组件初始化时加载数据
@@ -870,22 +870,22 @@ function nextDetail(job) {
function navToService(serviceType) {
// 根据服务类型跳转到不同页面
const serviceRoutes = {
"service-guidance": "/pages/service/guidance",
"public-recruitment": "/pages/service/public-recruitment",
"service-guidance": "/packageA/pages/service/guidance",
"public-recruitment": "/packageA/pages/service/public-recruitment",
"resume-creation": "/packageA/pages/myResume/myResume",
"labor-policy": "/pages/service/labor-policy",
"skill-training": "/pages/service/skill-training",
// 'skill-evaluation': '/pages/service/skill-evaluation',
"question-bank": "/pages/service/question-bank",
"quality-assessment": "/pages/service/quality-assessment",
"labor-policy": "/packageA/pages/service/labor-policy",
"skill-training": "/packageA/pages/service/skill-training",
// 'skill-evaluation': '/packageA/pages/service/skill-evaluation',
"question-bank": "/packageA/pages/service/question-bank",
"quality-assessment": "/packageA/pages/service/quality-assessment",
"ai-interview": "/packageA/pages/chat/chat",
"job-search": "/pages/search/search",
"career-planning": "/pages/service/career-planning",
"salary-query": "/pages/service/salary-query",
"company-info": "/pages/service/company-info",
"interview-tips": "/pages/service/interview-tips",
"employment-news": "/pages/service/employment-news",
"more-services": "/pages/service/more-services",
"career-planning": "/packageA/pages/service/career-planning",
"salary-query": "/packageA/pages/service/salary-query",
"company-info": "/packageA/pages/service/company-info",
"interview-tips": "/packageA/pages/service/interview-tips",
"employment-news": "/packageA/pages/service/employment-news",
"more-services": "/packageA/pages/service/more-services",
"skill-evaluation": "/packageB/train/index",
};

View File

@@ -9,12 +9,6 @@
// #endif
}
},
{
"path": "pages/city-select/index",
"style": {
"navigationBarTitleText": "选择城市"
}
},
{
"path": "pages/mine/mine",
"style": {
@@ -27,99 +21,11 @@
"navigationBarTitleText": "消息"
}
},
{
"path": "pages/msglog/messageDetail",
"style": {
"navigationBarTitleText": "消息详情"
}
},
{
"path": "pages/careerfair/careerfair",
"style": {
"navigationBarTitleText": "招聘会"
}
},
{
"path": "pages/search/search",
"style": {
"navigationBarTitleText": "搜索职位"
}
},
{
"path": "pages/service/career-planning",
"style": {
"navigationBarTitleText": "职业规划推荐",
"navigationBarTitleTextSize": "30rpx",
"navigationStyle": "custom"
}
},
{
"path": "pages/mine/company-mine",
"style": {
"navigationBarTitleText": "我的"
}
},
{
"path": "pages/mine/company-info",
"style": {
"navigationBarTitleText": "企业信息"
}
},
{
"path": "pages/mine/edit-company-contacts",
"style": {
"navigationBarTitleText": "编辑联系人"
}
},
{
"path": "pages/login/h5-login",
"style": {
"navigationBarTitleText": "登录",
"navigationStyle": "custom"
}
},
{
"path": "pages/login/id-card-login",
"style": {
"navigationBarTitleText": "社保登录",
"navigationStyle": "custom"
}
},
{
"path": "pages/login/wx-login",
"style": {
"navigationBarTitleText": "登录"
}
},
{
"path": "pages/login/sms-verify",
"style": {
"navigationBarTitleText": "短信验证"
}
},
{
"path": "pages/resume-guide/resume-guide",
"style": {
"navigationBarTitleText": "简历制作指导"
}
},
{
"path": "pages/resume-guide/resume-example",
"style": {
"navigationBarTitleText": "简历示例"
}
},
{
"path": "pages/service/salary-info",
"style": {
"navigationBarTitleText": "薪酬信息"
}
},
{
"path": "pages/service/guidance",
"style": {
"navigationBarTitleText": "服务指导"
}
}
],
"subpackages": [
@@ -352,6 +258,100 @@
"navigationBarTextStyle": "white",
"enablePullDownRefresh": false
}
},
{
"path": "pages/careerfair/careerfair",
"style": {
"navigationBarTitleText": "招聘会"
}
},
{
"path": "pages/msglog/messageDetail",
"style": {
"navigationBarTitleText": "消息详情"
}
},
{
"path": "pages/city-select/index",
"style": {
"navigationBarTitleText": "选择城市"
}
},
{
"path": "pages/login/h5-login",
"style": {
"navigationBarTitleText": "登录",
"navigationStyle": "custom"
}
},
{
"path": "pages/login/id-card-login",
"style": {
"navigationBarTitleText": "社保登录",
"navigationStyle": "custom"
}
},
{
"path": "pages/login/wx-login",
"style": {
"navigationBarTitleText": "登录"
}
},
{
"path": "pages/login/sms-verify",
"style": {
"navigationBarTitleText": "短信验证"
}
},
{
"path": "pages/resume-guide/resume-guide",
"style": {
"navigationBarTitleText": "简历制作指导"
}
},
{
"path": "pages/resume-guide/resume-example",
"style": {
"navigationBarTitleText": "简历示例"
}
},
{
"path": "pages/service/career-planning",
"style": {
"navigationBarTitleText": "职业规划推荐",
"navigationBarTitleTextSize": "30rpx",
"navigationStyle": "custom"
}
},
{
"path": "pages/service/salary-info",
"style": {
"navigationBarTitleText": "薪酬信息"
}
},
{
"path": "pages/service/guidance",
"style": {
"navigationBarTitleText": "服务指导"
}
},
{
"path": "pages/company-mine/company-mine",
"style": {
"navigationBarTitleText": "我的"
}
},
{
"path": "pages/company-mine/company-info",
"style": {
"navigationBarTitleText": "企业信息"
}
},
{
"path": "pages/company-mine/edit-company-contacts",
"style": {
"navigationBarTitleText": "编辑联系人"
}
}
]
},
@@ -922,6 +922,7 @@
"^AppLayout$": "@/components/AppLayout/AppLayout.vue",
"^CustomTabBar$": "@/components/CustomTabBar/CustomTabBar.vue",
"^UserTypeSwitcher$": "@/components/UserTypeSwitcher/UserTypeSwitcher.vue",
"^l-echart$": "@/packageCa/uni_modules/lime-echart/components/l-echart/l-echart.vue",
"^CollapseTransition$": "@/components/CollapseTransition/CollapseTransition.vue",
"^NoBouncePage$": "@/components/NoBouncePage/NoBouncePage.vue",
"^TikTok$": "@/components/TikTok/TikTok.vue",

BIN
pages/.DS_Store vendored

Binary file not shown.

View File

@@ -262,7 +262,7 @@
<uni-icons class="iconsearch" color="#666D7F" type="plusempty" size="18"></uni-icons>
<text>添加</text>
</view>
<view class="jobs-add button-click" @click="navTo('/pages/city-select/index')" style="padding-right:0;">
<view class="jobs-add button-click" @click="navTo('/packageA/pages/city-select/index')" style="padding-right:0;">
<text>{{ selectedCity.name || '地区' }}</text>
<image class="right-sx" :class="{ active: showFilter }" src="@/static/icon/shaixun.png"></image>
</view>
@@ -757,7 +757,7 @@ const helpTaskClick = () =>{
//招聘会模块跳转
const handleJobFairClick = () => {
if (checkLogin()) {
navTo('/pages/careerfair/careerfair');
navTo('/packageA/pages/careerfair/careerfair');
}
};
const list = ref([]);
@@ -851,7 +851,7 @@ const getCompanyInfo = () => {
// 跳转到企业信息详情页面
const goToCompanyInfo = () => {
navTo('/pages/mine/company-info');
navTo('/packageA/pages/company-mine/company-info');
};
@@ -861,7 +861,7 @@ onMounted(() => {
getCompanyInfo();
// pageNull.value = 0;
uni.$on('showLoginModal', () => {
uni.navigateTo({ url: '/pages/login/wx-login' });
uni.navigateTo({ url: '/packageA/pages/login/wx-login' });
pageNull.value = 0;
});
});
@@ -875,7 +875,7 @@ onMounted(() => {
// 绑定新的监听
uni.$on('showLoginModal', () => {
console.log('收到showLoginModal事件打开登录弹窗');
uni.navigateTo({ url: '/pages/login/wx-login' });
uni.navigateTo({ url: '/packageA/pages/login/wx-login' });
pageNull.value = 0;
});
@@ -1003,7 +1003,7 @@ const handleLiveClick = () => {
// 处理薪酬信息点击
const handleSalaryInfoClick = () => {
navTo('/pages/service/salary-info');
navTo('/packageA/pages/service/salary-info');
};
const handleH5SalaryClick = () => {
@@ -1090,23 +1090,23 @@ function nextDetail(job) {
function navToService(serviceType) {
// 根据服务类型跳转到不同页面
const serviceRoutes = {
'service-guidance': '/pages/service/guidance',
'public-recruitment': '/pages/service/public-recruitment',
'resume-creation': '/pages/resume-guide/resume-guide',
'service-guidance': '/packageA/pages/service/guidance',
'public-recruitment': '/packageA/pages/service/public-recruitment',
'resume-creation': '/packageA/pages/resume-guide/resume-guide',
'labor-policy': '/packageRc/pages/policy/policyList',
'skill-training': '/packageB/train/video/videoList',
'skill-evaluation': '/packageB/train/index',
// 'skill-evaluation': '/pages/service/skill-evaluation',
'question-bank': '/pages/service/question-bank',
// 'skill-evaluation': '/packageA/pages/service/skill-evaluation',
'question-bank': '/packageA/pages/service/question-bank',
// 'quality-assessment': '/packageCa/search/search',
// 'ai-interview': '/packageA/pages/chat/chat',
'job-search': '/pages/search/search',
'career-planning': '/pages/service/career-planning',
'salary-query': '/pages/service/salary-query',
'company-info': '/pages/service/company-info',
'interview-tips': '/pages/service/interview-tips',
'employment-news': '/pages/service/employment-news',
'more-services': '/pages/service/more-services',
'career-planning': '/packageA/pages/service/career-planning',
'salary-query': '/packageA/pages/service/salary-query',
'company-info': '/packageA/pages/service/company-info',
'interview-tips': '/packageA/pages/service/interview-tips',
'employment-news': '/packageA/pages/service/employment-news',
'more-services': '/packageA/pages/service/more-services',
};
if((serviceType=='skill-training'||serviceType=='skill-evaluation')&&!uni.getStorageSync('userInfo').idCard){
$api.msg('请先完善信息');

View File

@@ -242,7 +242,7 @@ onMounted(() => {
// 这里可以显示微信登录弹窗
// 跳转到微信登录页面
uni.navigateTo({
url: '/pages/login/wx-login'
url: '/packageA/pages/login/wx-login'
});
});
});
@@ -274,7 +274,7 @@ function getUserstatistics() {
function seeDetail() {
if (userType === 0) {
// 企业用户跳转到企业信息页面
navTo('/pages/mine/company-info');
navTo('/packageA/pages/company-mine/company-info');
} else {
// 求职者用户跳转到简历页面
navTo('/packageA/pages/myResume/myResume');

View File

@@ -70,7 +70,7 @@ onMounted(() => {
// 监听退出登录事件,显示微信登录弹窗
uni.$on('showLoginModal', () => {
uni.navigateTo({ url: '/pages/login/wx-login' });
uni.navigateTo({ url: '/packageA/pages/login/wx-login' });
});
});

View File

@@ -76,7 +76,7 @@ async function loadData() {
function seeDetail(item, index) {
uni.setStorageSync('currentMessageDetail', item);
navTo('/pages/msglog/messageDetail');
navTo('/packageA/pages/msglog/messageDetail');
}
defineExpose({ loadData });

View File

@@ -74,7 +74,7 @@ async function loadData() {
function seeDetail(item) {
uni.setStorageSync('currentMessageDetail', item);
navTo('/pages/msglog/messageDetail');
navTo('/packageA/pages/msglog/messageDetail');
}
defineExpose({ loadData });

View File

@@ -1,590 +0,0 @@
<template>
<view class="career-planning-page">
<!-- 提醒弹窗 -->
<RemindPopup
ref="remindPopup"
:remind-list="remindList"
@cancel="handleCancel"
@confirm="handleConfirm"
/>
<!-- 技能详情弹出层 -->
<SkillDetailPopup
ref="skillDetailPopup"
:job-title="selectedJobTitle"
:possessed-skills="selectedJobPossessedSkills"
:improvement-skills="selectedJobImprovementSkills"
@close="handleSkillPopupClose"
/>
<!-- 页面内容 -->
<view class="page-content" v-if="showContent">
<!-- #ifdef MP-WEIXIN -->
<!-- 小程序背景图片 -->
<image class="mp-background" src="/static/icon/background2.png" mode="aspectFill"></image>
<!-- #endif -->
<!-- 头部区域 -->
<PageHeader
:active-tab="activeTab"
@tab-change="switchTab"
@search-click="handleSearchClick"
@menu-click="handleMenuClick"
@more-click="handleMoreClick"
/>
<!-- 内容区域 -->
<scroll-view scroll-y class="content-scroll">
<CareerRecommend
v-if="activeTab === 0"
:current-job-id="currentJobId"
:current-job-name="currentJobName"
@job-card-click="handleJobCardClick"
@skills-updated="handleRecommendSkillsUpdated"
/>
<CareerPath
v-else-if="activeTab === 1"
:current-job-name="currentJobName"
@path-data-updated="handlePathDataUpdated"
/>
<SkillDevelopment
v-else
:current-job-name="currentJobName"
@path-data-updated="handlePathDataUpdated"
/>
</scroll-view>
</view>
<!-- 底部导航栏 -->
<view class="tabbar-wrapper" v-if="showContent">
<CustomTabBar :currentPage="0" />
</view>
</view>
</template>
<script setup>
import { ref, inject, nextTick, onMounted } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
import { appUserInfo } from '@/apiRc/user/user.js';
import RemindPopup from './components/RemindPopup.vue';
import PageHeader from './components/PageHeader.vue';
import SkillDetailPopup from './components/SkillDetailPopup.vue';
import CareerRecommend from './components/CareerRecommend.vue';
import CareerPath from './components/CareerPath.vue';
import SkillDevelopment from './components/SkillDevelopment.vue';
import CustomTabBar from '@/components/CustomTabBar/CustomTabBar.vue';
const { navBack, navTo } = inject('globalFunction');
// 弹窗引用
const remindPopup = ref(null);
const skillDetailPopup = ref(null);
// 提醒列表(由接口返回)
const remindList = ref([]);
// 是否显示页面内容
const showContent = ref(false);
// 当前激活的tab
const activeTab = ref(0);
// 选中的职位信息
const selectedJobTitle = ref('');
const selectedJobPossessedSkills = ref([]);
const selectedJobImprovementSkills = ref([]);
const isLoadingJobSkill = ref(false);
const currentJobId = ref(null);
const currentJobName = ref('');
// 技能发展所需的数据
const recommendSkillsData = ref({
currentJobSkills: [],
recommendedJobs: []
});
const pathSkillsData = ref({
pathData: {
start: { title: '', skills: [] },
steps: [],
end: { title: '', skills: [] }
},
targetCareer: ''
});
// 打开弹窗
function openRemindPopup() {
nextTick(() => {
if (remindPopup.value) {
try {
remindPopup.value.open();
} catch (error) {
// 静默处理错误
}
} else {
setTimeout(() => {
if (remindPopup.value) {
try {
remindPopup.value.open();
} catch (error) {
// 静默处理错误
}
} else {
setTimeout(() => {
if (remindPopup.value) {
try {
remindPopup.value.open();
} catch (error) {
// 静默处理错误
}
}
}, 500);
}
}, 500);
}
});
}
// 检查用户是否完善了个人信息(调用接口获取)
let hasCheckedRemindInfo = false;
// 保存缺失信息的标识
const missingInfo = ref({
hasJobInfo: false,
hasSkills: false
});
async function getRemindInfo() {
if (hasCheckedRemindInfo) {
return;
}
hasCheckedRemindInfo = true;
try {
const response = await appUserInfo();
const userInfo = response?.data || {};
// 检查 idCard身份证- 必须项
let idCard = userInfo?.resume?.idCard ?? userInfo?.idCard ?? null;
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
if (!idCard || idCard === null || idCard === '') {
idCard = cachedUserInfo?.resume?.idCard ?? cachedUserInfo?.idCard ?? null;
}
const hasIdCard = idCard !== null && idCard !== undefined && idCard !== '';
// 检查职位信息:优先从 jobTitles 数组获取
const jobTitles = Array.isArray(userInfo?.jobTitles) ? userInfo.jobTitles : [];
const hasJobTitle = jobTitles.length > 0;
// 如果 jobTitles 为空,尝试从其他字段获取
let jobName = '';
if (!hasJobTitle) {
jobName = userInfo?.jobName ??
userInfo?.currentJobName ??
userInfo?.resume?.jobName ??
userInfo?.resume?.currentJobName ??
'';
}
const hasJobInfo = hasJobTitle || (jobName && jobName.trim() !== '');
// 检查技能标签:从 appSkillsList 获取
const appSkillsList = Array.isArray(userInfo?.appSkillsList) ? userInfo.appSkillsList : [];
// 检查是否有有效的技能name 或 nameStr 不为空)
const hasSkills = appSkillsList.some(skill => {
const skillName = skill?.name || skill?.nameStr;
return skillName && skillName.trim() !== '';
});
// 保存缺失信息标识(只保存职位信息和技能标签,身份证信息跳转到个人信息页面)
missingInfo.value.hasJobInfo = hasJobInfo;
missingInfo.value.hasSkills = hasSkills;
// 判断信息是否完整idCard、职位信息、技能标签都必须有
const isComplete = hasIdCard && hasJobInfo && hasSkills;
if (!isComplete) {
// 收集缺失的信息提示
const missingItems = [];
if (!hasIdCard) {
missingItems.push('身份证信息');
}
if (!hasJobInfo) {
missingItems.push('职位信息');
}
if (!hasSkills) {
missingItems.push('技能标签');
}
remindList.value = [`请完善${missingItems.join('、')}`];
} else {
// 信息完整,设置职位信息
if (hasJobTitle) {
currentJobName.value = jobTitles[0];
} else {
currentJobName.value = jobName;
currentJobId.value = userInfo?.jobId ??
userInfo?.currentJobId ??
userInfo?.resume?.jobId ??
userInfo?.resume?.currentJobId ??
null;
}
// 信息完整,直接显示页面内容
showContent.value = true;
return;
}
setTimeout(() => {
openRemindPopup();
}, 500);
} catch (error) {
// 接口调用失败时,使用缓存作为降级方案
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
// 检查 idCard
const idCard = cachedUserInfo?.resume?.idCard ?? cachedUserInfo?.idCard ?? null;
const hasIdCard = idCard !== null && idCard !== undefined && idCard !== '';
// 检查职位信息
const cachedJobTitles = Array.isArray(cachedUserInfo?.jobTitles) ? cachedUserInfo.jobTitles : [];
const hasJobTitle = cachedJobTitles.length > 0;
let jobName = '';
if (!hasJobTitle) {
jobName = cachedUserInfo?.jobName ??
cachedUserInfo?.currentJobName ??
cachedUserInfo?.resume?.jobName ??
cachedUserInfo?.resume?.currentJobName ??
'';
}
const hasJobInfo = hasJobTitle || (jobName && jobName.trim() !== '');
// 检查技能标签
const cachedAppSkillsList = Array.isArray(cachedUserInfo?.appSkillsList) ? cachedUserInfo.appSkillsList : [];
const hasSkills = cachedAppSkillsList.some(skill => {
const skillName = skill?.name || skill?.nameStr;
return skillName && skillName.trim() !== '';
});
// 保存缺失信息标识
missingInfo.value.hasJobInfo = hasJobInfo;
missingInfo.value.hasSkills = hasSkills;
// 判断信息是否完整idCard、职位信息、技能标签都必须有
const isComplete = hasIdCard && hasJobInfo && hasSkills;
if (!isComplete) {
// 收集缺失的信息提示
const missingItems = [];
if (!hasIdCard) {
missingItems.push('身份证信息');
}
if (!hasJobInfo) {
missingItems.push('职位信息');
}
if (!hasSkills) {
missingItems.push('技能标签');
}
remindList.value = [`请完善${missingItems.join('、')}`];
} else {
// 信息完整,设置职位信息
if (hasJobTitle) {
currentJobName.value = cachedJobTitles[0];
} else {
currentJobName.value = jobName;
currentJobId.value = cachedUserInfo?.jobId ??
cachedUserInfo?.currentJobId ??
cachedUserInfo?.resume?.jobId ??
cachedUserInfo?.resume?.currentJobId ??
null;
}
// 信息完整,直接显示页面内容
showContent.value = true;
return;
}
setTimeout(() => {
openRemindPopup();
}, 500);
}
}
// 取消按钮
function handleCancel() {
remindPopup.value?.close();
navBack();
}
// 确认按钮
async function handleConfirm() {
remindPopup.value?.close();
const { hasJobInfo, hasSkills } = missingInfo.value;
// 如果同时缺少职位信息和技能标签:先跳转到职位信息页面,并传递参数表示完成后需要继续跳转到技能页面
if (!hasJobInfo && !hasSkills) {
// 跳转到职位信息页面,传递参数表示完成后需要继续跳转到技能页面
navTo('/packageA/pages/jobExpect/jobExpect?needSkill=true');
}
// 如果只缺少技能标签:直接跳转到技能页面(个人信息页面的技能部分)
else if (!hasSkills) {
navTo('/packageA/pages/personalInfo/personalInfo');
}
// 如果只缺少职位信息:直接跳转到职位信息页面
else if (!hasJobInfo) {
navTo('/packageA/pages/jobExpect/jobExpect');
}
// 如果只缺少身份证信息:跳转到个人信息页面
else {
navTo('/packageA/pages/personalInfo/personalInfo');
}
}
// 切换tab
function switchTab(index) {
activeTab.value = index;
if (index === 0 && !currentJobId.value) {
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
// 优先从缓存中的 jobTitles 数组获取职位信息(取第一个)
const cachedJobTitles = Array.isArray(cachedUserInfo?.jobTitles) ? cachedUserInfo.jobTitles : [];
let newJobName = '';
if (cachedJobTitles.length > 0) {
newJobName = cachedJobTitles[0];
} else {
// 如果缓存中没有 jobTitles从其他字段获取
newJobName = currentJobName.value ||
(cachedUserInfo?.jobName ??
cachedUserInfo?.currentJobName ??
cachedUserInfo?.resume?.jobName ??
cachedUserInfo?.resume?.currentJobName ??
'市场专员');
}
const newJobId = cachedUserInfo?.jobId ??
cachedUserInfo?.currentJobId ??
cachedUserInfo?.resume?.jobId ??
cachedUserInfo?.resume?.currentJobId ??
null;
currentJobId.value = newJobId;
currentJobName.value = newJobName;
}
}
// 搜索点击
function handleSearchClick() {
navTo('/pages/search/search');
}
// 菜单点击
function handleMenuClick() {
// TODO: 实现菜单功能
}
// 更多点击
function handleMoreClick() {
// TODO: 实现更多功能
}
function normalizeSkillLevel(score) {
const numericScore = Number(score);
if (Number.isNaN(numericScore)) {
return 0;
}
const rounded = Math.round(numericScore);
return Math.max(1, Math.min(6, rounded));
}
function splitSkillListByScore(skills = []) {
if (!Array.isArray(skills) || skills.length === 0) {
return {
possessed: [],
improvement: []
};
}
const sorted = [...skills].sort((a, b) => (Number(b.skillScore) || 0) - (Number(a.skillScore) || 0));
const midpoint = Math.ceil(sorted.length / 2);
const mapSkill = (item) => ({
name: item?.skillName || '',
level: normalizeSkillLevel(item?.skillScore)
});
return {
possessed: sorted.slice(0, midpoint).map(mapSkill),
improvement: sorted.slice(midpoint).map(mapSkill)
};
}
// 处理职位卡片点击
async function handleJobCardClick(job) {
if (!job) {
return;
}
selectedJobTitle.value = job.title || job.jobName || '';
selectedJobPossessedSkills.value = [];
selectedJobImprovementSkills.value = [];
if (isLoadingJobSkill.value) {
return;
}
isLoadingJobSkill.value = true;
uni.showLoading({
title: '加载中...',
mask: true
});
try {
// 从 appUserInfo 接口获取技能数据
const response = await appUserInfo();
const userInfo = response?.data || {};
const appSkillsList = Array.isArray(userInfo?.appSkillsList) ? userInfo.appSkillsList : [];
// 将 appSkillsList 转换为 splitSkillListByScore 需要的格式
const skillList = appSkillsList.map(item => ({
skillName: item?.name || item?.nameStr || '',
skillScore: item?.levels || item?.levelStr || 0
})).filter(item => item.skillName);
const { possessed, improvement } = splitSkillListByScore(skillList);
if (possessed.length === 0 && improvement.length === 0) {
// 如果 appUserInfo 中没有技能数据,尝试使用推荐职位数据中的技能信息
const fallbackSkills = Array.isArray(job?.rawSkills) ? job.rawSkills : [];
if (fallbackSkills.length === 0) {
uni.showToast({
title: '暂无技能数据',
icon: 'none'
});
return;
}
const fallbackSplit = splitSkillListByScore(fallbackSkills);
selectedJobPossessedSkills.value = fallbackSplit.possessed;
selectedJobImprovementSkills.value = fallbackSplit.improvement;
} else {
selectedJobPossessedSkills.value = possessed;
selectedJobImprovementSkills.value = improvement;
}
skillDetailPopup.value?.open();
} catch (error) {
// 接口调用失败,尝试使用推荐职位数据中的技能信息
const fallbackSkills = Array.isArray(job?.rawSkills) ? job.rawSkills : [];
if (fallbackSkills.length > 0) {
const fallbackSplit = splitSkillListByScore(fallbackSkills);
selectedJobPossessedSkills.value = fallbackSplit.possessed;
selectedJobImprovementSkills.value = fallbackSplit.improvement;
skillDetailPopup.value?.open();
} else {
uni.showToast({
title: '获取技能信息失败',
icon: 'none'
});
}
} finally {
isLoadingJobSkill.value = false;
uni.hideLoading();
}
}
// 处理技能弹出层关闭
function handleSkillPopupClose() {
// 可以在这里处理关闭后的逻辑
}
// 处理职业推荐技能数据更新
function handleRecommendSkillsUpdated(data) {
recommendSkillsData.value = {
currentJobSkills: data.currentJobSkills || [],
recommendedJobs: data.recommendedJobs || []
};
}
// 处理职业路径数据更新
function handlePathDataUpdated(data) {
pathSkillsData.value = {
pathData: data.pathData || {
start: { title: '', skills: [] },
steps: [],
end: { title: '', skills: [] }
},
targetCareer: data.targetCareer || ''
};
}
onLoad(() => {
getRemindInfo();
});
onShow(() => {
// 返回本页后,如果之前因为信息缺失未展示内容,则重新检查
if (!showContent.value) {
hasCheckedRemindInfo = false;
getRemindInfo();
}
});
onMounted(() => {
if (remindList.value.length > 0 && !showContent.value) {
setTimeout(() => {
if (remindPopup.value) {
openRemindPopup();
}
}, 300);
}
});
</script>
<style lang="scss" scoped>
.career-planning-page {
width: 100vw;
/* #ifdef H5 */
height: calc(100vh - var(--window-top) - var(--status-bar-height) - var(--window-bottom));
background: url('@/static/icon/background2.png') 0 0 no-repeat;
background-size: 100% 728rpx;
/* #endif */
/* #ifdef MP-WEIXIN */
height: 100vh;
position: relative;
/* #endif */
background-color: #FFFFFF;
overflow: hidden;
display: flex;
flex-direction: column;
position: relative;
}
/* #ifdef MP-WEIXIN */
.mp-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 728rpx;
z-index: 0;
}
/* #endif */
.page-content {
flex: 1;
display: flex;
flex-direction: column;
position: relative;
z-index: 1;
overflow: hidden;
}
.content-scroll {
flex: 1;
height: 0;
width: 100%;
padding-bottom: calc(88rpx + env(safe-area-inset-bottom));
box-sizing: border-box;
}
.tabbar-wrapper {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 999;
}
</style>

View File

@@ -76,13 +76,13 @@ const getCurrentTypeLabel = () => {
const goToCompanyMine = () => {
uni.navigateTo({
url: '/pages/mine/company-mine'
url: '/packageA/pages/company-mine/company-mine'
});
};
const goToCompanyInfo = () => {
uni.navigateTo({
url: '/pages/mine/company-info'
url: '/packageA/pages/company-mine/company-info'
});
};

View File

@@ -26,7 +26,20 @@
"compileType": "miniprogram",
"simulatorPluginLibVersion": {},
"packOptions": {
"ignore": [],
"ignore": [
{
"type": "suffix",
"value": ".DS_Store"
},
{
"type": "file",
"value": "static/iconfont/demo_index.html"
},
{
"type": "file",
"value": "static/iconfont/demo.css"
}
],
"include": []
},
"appid": "wx4aa34488b965a331",

BIN
static/.DS_Store vendored

Binary file not shown.

BIN
static/font/.DS_Store vendored

Binary file not shown.

BIN
static/gif/.DS_Store vendored

Binary file not shown.

BIN
static/icon/.DS_Store vendored

Binary file not shown.

View File

@@ -1,539 +0,0 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

View File

@@ -1,418 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>iconfont Demo</title>
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
<link rel="stylesheet" href="demo.css">
<link rel="stylesheet" href="iconfont.css">
<script src="iconfont.js"></script>
<!-- jQuery -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
<!-- 代码高亮 -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
<style>
.main .logo {
margin-top: 0;
height: auto;
}
.main .logo a {
display: flex;
align-items: center;
}
.main .logo .sub-title {
margin-left: 0.5em;
font-size: 22px;
color: #fff;
background: linear-gradient(-45deg, #3967FF, #B500FE);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div class="main">
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
</a></h1>
<div class="nav-tabs">
<ul id="tabs" class="dib-box">
<li class="dib active"><span>Unicode</span></li>
<li class="dib"><span>Font class</span></li>
<li class="dib"><span>Symbol</span></li>
</ul>
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=5044714" target="_blank" class="nav-more">查看项目</a>
</div>
<div class="tab-container">
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe63f;</span>
<div class="name">gxbys</div>
<div class="code-name">&amp;#xe63f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe60f;</span>
<div class="name">个人中心</div>
<div class="code-name">&amp;#xe60f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe607;</span>
<div class="name">素质测评</div>
<div class="code-name">&amp;#xe607;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe887;</span>
<div class="name">智能AI</div>
<div class="code-name">&amp;#xe887;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe614;</span>
<div class="name">技能培训</div>
<div class="code-name">&amp;#xe614;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe61d;</span>
<div class="name">政策</div>
<div class="code-name">&amp;#xe61d;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe67f;</span>
<div class="name">题库和考试</div>
<div class="code-name">&amp;#xe67f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe723;</span>
<div class="name">技能评价</div>
<div class="code-name">&amp;#xe723;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe61c;</span>
<div class="name">简历</div>
<div class="code-name">&amp;#xe61c;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe7e9;</span>
<div class="name">政府楼</div>
<div class="code-name">&amp;#xe7e9;</div>
</li>
</ul>
<div class="article markdown">
<h2 id="unicode-">Unicode 引用</h2>
<hr>
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
<ul>
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
</ul>
<blockquote>
<p>注意:新版 iconfont 支持两种方式引用多色图标SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
</blockquote>
<p>Unicode 使用步骤如下:</p>
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1761826914823') format('woff2'),
url('iconfont.woff?t=1761826914823') format('woff'),
url('iconfont.ttf?t=1761826914823') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
<pre><code class="language-css"
>.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
<pre>
<code class="language-html"
>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-Graduation-simple-"></span>
<div class="name">
gxbys
</div>
<div class="code-name">.icon-Graduation-simple-
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-gerenzhongxin"></span>
<div class="name">
个人中心
</div>
<div class="code-name">.icon-gerenzhongxin
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-suzhicepingtiku"></span>
<div class="name">
素质测评
</div>
<div class="code-name">.icon-suzhicepingtiku
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-ai"></span>
<div class="name">
智能AI
</div>
<div class="code-name">.icon-ai
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-jinengpeixun"></span>
<div class="name">
技能培训
</div>
<div class="code-name">.icon-jinengpeixun
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-zhengce"></span>
<div class="name">
政策
</div>
<div class="code-name">.icon-zhengce
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-chengjifuben"></span>
<div class="name">
题库和考试
</div>
<div class="code-name">.icon-chengjifuben
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-jinengpingjia"></span>
<div class="name">
技能评价
</div>
<div class="code-name">.icon-jinengpingjia
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-jianli"></span>
<div class="name">
简历
</div>
<div class="code-name">.icon-jianli
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-zhengfulou"></span>
<div class="name">
政府楼
</div>
<div class="code-name">.icon-zhengfulou
</div>
</li>
</ul>
<div class="article markdown">
<h2 id="font-class-">font-class 引用</h2>
<hr>
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
<p>与 Unicode 使用方式相比,具有如下特点:</p>
<ul>
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
</code></pre>
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"
iconfont" 是你项目下的 font-family。可以通过编辑项目查看默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-Graduation-simple-"></use>
</svg>
<div class="name">gxbys</div>
<div class="code-name">#icon-Graduation-simple-</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-gerenzhongxin"></use>
</svg>
<div class="name">个人中心</div>
<div class="code-name">#icon-gerenzhongxin</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-suzhicepingtiku"></use>
</svg>
<div class="name">素质测评</div>
<div class="code-name">#icon-suzhicepingtiku</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-ai"></use>
</svg>
<div class="name">智能AI</div>
<div class="code-name">#icon-ai</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-jinengpeixun"></use>
</svg>
<div class="name">技能培训</div>
<div class="code-name">#icon-jinengpeixun</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zhengce"></use>
</svg>
<div class="name">政策</div>
<div class="code-name">#icon-zhengce</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-chengjifuben"></use>
</svg>
<div class="name">题库和考试</div>
<div class="code-name">#icon-chengjifuben</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-jinengpingjia"></use>
</svg>
<div class="name">技能评价</div>
<div class="code-name">#icon-jinengpingjia</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-jianli"></use>
</svg>
<div class="name">简历</div>
<div class="code-name">#icon-jianli</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zhengfulou"></use>
</svg>
<div class="name">政府楼</div>
<div class="code-name">#icon-zhengfulou</div>
</li>
</ul>
<div class="article markdown">
<h2 id="symbol-">Symbol 引用</h2>
<hr>
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
<ul>
<li>支持多色图标了,不再受单色限制。</li>
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
</code></pre>
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
<pre><code class="language-html">&lt;style&gt;
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
&lt;/style&gt;
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
&lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
&lt;/svg&gt;
</code></pre>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$('.tab-container .content:first').show()
$('#tabs li').click(function (e) {
var tabContent = $('.tab-container .content')
var index = $(this).index()
if ($(this).hasClass('active')) {
return
} else {
$('#tabs li').removeClass('active')
$(this).addClass('active')
tabContent.hide().eq(index).fadeIn()
}
})
})
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

Binary file not shown.

BIN
stores/.DS_Store vendored

Binary file not shown.

View File

@@ -1,7 +1,6 @@
// BaseStore.js - 基础Store类
import IndexedDBHelper from '@/common/IndexedDBHelper.js'
import UniStorageHelper from '../common/UniStorageHelper'
import useChatGroupDBStore from './userChatGroupStore'
import config from '@/config'
@@ -54,6 +53,7 @@ class BaseStore {
unique: false
}]
}]).then(async () => {
const { default: useChatGroupDBStore } = await import('@/packageA/stores/userChatGroupStore.js')
useChatGroupDBStore().init()
this.isDBReady = true
});

BIN
uni_modules/.DS_Store vendored

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More