Merge branch 'main' into yxl

This commit is contained in:
2026-06-09 21:42:58 +08:00
105 changed files with 7574 additions and 8515 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,6 +127,7 @@ import { ref, inject, onMounted } from 'vue';
import useUserStore from '@/stores/useUserStore';
import useDictStore from '@/stores/useDictStore';
import { tabbarManager } from '@/utils/tabbarManager';
import { prepareWxLoginCodeOnTap, consumeWxLoginCodeFromTap } from '@/utils/loginHelper';
const { $api } = inject('globalFunction');
const { loginSetToken } = useUserStore();
@@ -171,6 +173,7 @@ const open = () => {
// 检查是否已同意协议
const agreed = uni.getStorageSync('agreedToUserAgreement');
agreedToAgreement.value = !!agreed;
};
// 关闭弹窗
@@ -212,84 +215,92 @@ const validateRole = () => {
return true;
};
const getPhoneNumber = (e) => {
console.log('获取手机号:', e);
console.log('userType.value', userType.value)
const onPrepareWxAuth = () => {
if (!validateRole()) {
return;
}
prepareWxLoginCodeOnTap().catch((err) => {
console.error('预取微信登录凭证失败:', err);
});
};
// 验证角色、机构类型和隐私协议
const getPhoneNumber = async (e) => {
if (!validateRole()) {
return;
}
if (e.detail.errMsg === 'getPhoneNumber:ok') {
uni.login({
provider: 'weixin',
success: (loginRes) => {
console.log('微信登录code获取成功', loginRes.code);
const { encryptedData, iv } = e.detail;
const code = loginRes.code; // 使用wx.login返回的code
const { encryptedData, iv, code: wxPhoneCode } = e.detail;
if (!encryptedData && !wxPhoneCode) {
$api.msg('获取手机号失败');
return;
}
// 调用后端接口进行登录
uni.showLoading({ title: '登录中...' });
let loginCode = '';
try {
loginCode = await consumeWxLoginCodeFromTap();
} catch (err) {
console.error('获取微信登录凭证失败:', err);
$api.msg('获取登录信息失败,请重试');
return;
}
if (!loginCode) {
$api.msg('登录凭证未就绪,请重新点击授权');
return;
}
$api.createRequest('/app/appLogin', {
code,
encryptedData,
iv,
userType: userType.value,
orgType: orgType.value
}, 'post').then((resData) => {
uni.hideLoading();
console.log(resData, 'resume.idCard');
if (resData.token) {
// 登录成功存储token
loginSetToken(resData.token).then((resume) => {
// 更新用户类型到缓存
if (resData.isCompanyUser !== undefined) {
console.log(resData.isCompanyUser, 'resData.isCompanyUser');
const userInfo = uni.getStorageSync('userInfo') || {};
userInfo.isCompanyUser = Number(resData.isCompanyUser); // 0-企业用户1-求职者
uni.setStorageSync('userInfo', userInfo);
}
const requestParams = {
code: loginCode,
userType: userType.value,
orgType: orgType.value
};
if (encryptedData && iv) {
requestParams.encryptedData = encryptedData;
requestParams.iv = iv;
}
if (wxPhoneCode) {
requestParams.phoneCode = wxPhoneCode;
}
$api.msg('登录成功');
// 刷新tabbar以显示正确的用户类型
tabbarManager.refreshTabBar();
close();
emit('success');
uni.showLoading({ title: '登录中...' });
try {
const resData = await $api.createRequest('/app/appLogin', requestParams, 'post');
if (resData.token) {
await loginSetToken(resData.token).then((resume) => {
if (resData.isCompanyUser !== undefined) {
const userInfo = uni.getStorageSync('userInfo') || {};
userInfo.isCompanyUser = Number(resData.isCompanyUser);
uni.setStorageSync('userInfo', userInfo);
}
// 根据用户类型跳转到不同的信息补全页面
if (!resume.jobTitleId) {
console.log(resume, 'resume.idCard');
if (userType.value === 1 && !resData.idCard) {
// 求职者跳转到个人信息补全页面
uni.navigateTo({
url: '/packageA/pages/complete-info/complete-info?step=1'
});
} else if (userType.value === 0 && !resData.idCard) {
// 招聘者跳转到企业信息补全页面
uni.navigateTo({
url: '/packageA/pages/complete-info/company-info'
});
}
}
}).catch(() => {
$api.msg('获取用户信息失败');
});
} else {
// $api.msg('登录失败,请重试');
$api.msg(resData.msg || '登录失败,请重试');
}
}).catch((err) => {
uni.hideLoading();
$api.msg(err.msg || '登录失败,请重试');
});
},
fail: (err) => {
console.error('获取微信登录code失败', err);
$api.msg('获取登录信息失败,请重试');
}
});
$api.msg('登录成功');
tabbarManager.refreshTabBar();
close();
emit('success');
if (!resume.jobTitleId) {
if (userType.value === 1 && !resData.idCard) {
uni.navigateTo({
url: '/packageA/pages/complete-info/complete-info?step=1'
});
} else if (userType.value === 0 && !resData.idCard) {
uni.navigateTo({
url: '/packageA/pages/complete-info/company-info'
});
}
}
}).catch(() => {
$api.msg('获取用户信息失败');
});
} else {
$api.msg(resData.msg || '登录失败,请重试');
}
} catch (err) {
console.error('微信登录请求异常:', err);
$api.msg(err.message || err.msg || '登录失败,请重试');
} finally {
uni.hideLoading();
}
} else if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
$api.msg('您取消了授权');
} else {
@@ -308,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,6 +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 { prepareWxLoginCodeOnTap, consumeWxLoginCodeFromTap } from '@/utils/loginHelper';
const { $api } = inject('globalFunction');
const userStore = useUserStore();
@@ -229,96 +231,103 @@ 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 session_key encryptedData
const onWxGetPhoneNumber = async (e) => {
const { encryptedData, iv } = e.detail;
// 使
if (!validateForm()) {
return;
}
if (e.detail.errMsg === 'getPhoneNumber:ok') {
uni.login({
provider: 'weixin',
success: (loginRes) => {
const code = loginRes.code;
const { encryptedData, iv, code: wxPhoneCode } = e.detail;
if (!encryptedData && !wxPhoneCode) {
uni.showToast({ title: '获取手机号失败', icon: 'none', duration: 2000 });
return;
}
// /app/appWxphoneSmsCode
uni.showLoading({ title: '获取验证码中...' });
let loginCode = '';
try {
loginCode = await consumeWxLoginCodeFromTap();
} catch (err) {
console.error('获取微信登录凭证失败:', err);
uni.showToast({
title: '获取登录信息失败,请重试',
icon: 'none',
duration: 2000
});
return;
}
if (!loginCode) {
uni.showToast({
title: '登录凭证未就绪,请重新点击授权',
icon: 'none',
duration: 2000
});
return;
}
//
const requestParams = {
code,
encryptedData,
iv,
uni.showLoading({ title: '获取验证码中...' });
const requestParams = {
code: loginCode,
userType: userType.value
};
if (encryptedData && iv) {
requestParams.encryptedData = encryptedData;
requestParams.iv = iv;
}
if (wxPhoneCode) {
requestParams.phoneCode = wxPhoneCode;
}
if (userType.value === 0) {
requestParams.orgType = orgType.value;
}
try {
const resData = await $api.createRequest('/app/appWxphoneSmsCode', requestParams, 'post');
const possiblePhoneFields = ['phone', 'mobile', 'phoneNumber', 'tel', 'mobilePhone'];
let phoneValue = '';
for (const field of possiblePhoneFields) {
if (resData[field]) {
phoneValue = resData[field];
break;
}
}
if (resData.code === 200 || resData.success) {
const params = {
phone: phoneValue || '',
openid: resData.openid || '',
unionid: resData.unionid || '',
userType: userType.value
};
//
if (userType.value === 0) {
requestParams.orgType = orgType.value;
params.orgType = orgType.value;
}
$api.createRequest('/app/appWxphoneSmsCode', requestParams, 'post').then((resData) => {
uni.hideLoading();
//
const possiblePhoneFields = ['phone', 'mobile', 'phoneNumber', 'tel', 'mobilePhone'];
let phoneValue = '';
for (const field of possiblePhoneFields) {
if (resData[field]) {
phoneValue = resData[field];
console.log(`从接口返回中找到手机号字段 "${field}": ${phoneValue}`);
break;
}
}
if (resData.code === 200 || resData.success) {
//
const params = {
phone: phoneValue || '', //
openid: resData.openid || '',
unionid: resData.unionid || '',
userType: userType.value
};
//
if (userType.value === 0) {
params.orgType = orgType.value;
}
uni.navigateTo({
url: '/pages/login/sms-verify?' + Object.keys(params)
.map(key => `${key}=${encodeURIComponent(params[key])}`)
.join('&')
});
} else {
$api.msg(resData.msg || '获取验证码失败');
}
}).catch((err) => {
uni.hideLoading();
$api.msg(err.msg || '获取验证码失败,请重试');
});
},
fail: (err) => {
uni.showToast({
title: '获取登录信息失败,请重试',
icon: 'none',
duration: 2000
uni.navigateTo({
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) {
console.error('获取验证码请求异常:', err);
$api.msg(err.message || err.msg || '获取验证码失败,请重试');
} finally {
uni.hideLoading();
}
} else if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
uni.showToast({
title: '您取消了授权',
@@ -344,7 +353,7 @@ const wxLogin = () => {
// #ifdef H5
// H5H5
uni.navigateTo({
url: '/pages/login/h5-login'
url: '/packageA/pages/login/h5-login'
});
return;
// #endif
@@ -494,7 +503,7 @@ const testLogin = () => {
});
};
//
// wx.login session
onLoad(() => {
getOrgTypeDict();
});

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

@@ -256,6 +256,7 @@ import dictLabel from '@/components/dict-Label/dict-Label.vue';
import RadarMap from './component/radarMap.vue';
import { storeToRefs } from 'pinia';
import useUserStore from '@/stores/useUserStore';
import { checkLoginAndNavigate } from '@/utils/loginHelper';
const { userInfo } = storeToRefs(useUserStore());
// 与首页一致的用户类型获取优先store兜底缓存
const currentUserType = computed(() => {
@@ -445,9 +446,7 @@ function getCompetivetuveness(encryptJobId) {
// 申请岗位
function jobApply() {
const tokenValue = uni.getStorageSync('token') || '';
if (!tokenValue) {
$api.msg('请您先登录');
if (!checkLoginAndNavigate({ content: '投递简历请先登录' })) {
return;
}
// 显示确认弹窗
@@ -502,6 +501,9 @@ function cancelApply() {
// 取消/收藏岗位
function jobCollection() {
if (!checkLoginAndNavigate({ content: '收藏请先登录' })) {
return;
}
const encryptJobId = jobIdRef.value;
if (jobInfo.value.isCollection) {
$api.createRequest(`/app/job/collection/${encryptJobId}`, {}, 'DELETE').then((resData) => {

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

@@ -78,7 +78,7 @@
<!-- <view class="h5-action-btn press-button" @click="handleH5SalaryClick">
<view class="btn-text">薪酬信息</view>
</view> -->
<view class="h5-action-btn press-button" @click="handelGoResumeGuide()">
<view class="h5-action-btn press-button" @click="handleServiceClick('resume-creation')">
<view class="btn-text">简历指导</view>
</view>
@@ -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;
});
@@ -937,18 +937,8 @@ const handleLoginSuccess = () => {
// onLoad 函数已移至下方,包含筛选参数处理
// 处理附近工作点击
const handleNearbyClick = (options ) => {
// #ifdef MP-WEIXIN
if (checkLogin()) {
navTo('/packageA/pages/nearby/nearby');
}
// #endif
// #ifdef H5
const token = options.token || uni.getStorageSync('zkr-token');
if (token) {
navTo('/packageA/pages/nearby/nearby');
}
// #endif
const handleNearbyClick = () => {
navTo('/packageA/pages/nearby/nearby');
};
const handleNoticeClick = () =>{
if (checkLogin()) {
@@ -976,20 +966,12 @@ function handleInstitutionClick(type){
}
// 处理服务功能点击
const handleServiceClick = (serviceType) => {
if (checkLogin()) {
const noLoginRequired = ['resume-creation'];
if (noLoginRequired.includes(serviceType) || checkLogin()) {
navToService(serviceType);
}
};
// H5的简历指导跳转
const handelGoResumeGuide = () => {
const token = uni.getStorageSync('zkr-token');
// myToken.value = token;
if (token) {
// navTo()
navTo('/pages/resume-guide/resume-guide');
}
}
// 处理直播按钮点击
const handleLiveClick = () => {
// #ifdef MP-WEIXIN
@@ -1021,7 +1003,7 @@ const handleLiveClick = () => {
// 处理薪酬信息点击
const handleSalaryInfoClick = () => {
navTo('/pages/service/salary-info');
navTo('/packageA/pages/service/salary-info');
};
const handleH5SalaryClick = () => {
@@ -1108,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

@@ -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