diff --git a/apiRc/jobRecommend.js b/apiRc/jobRecommend.js deleted file mode 100644 index 59f9282..0000000 --- a/apiRc/jobRecommend.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * @Date: 2025-11-12 - * @Description: 职业推荐相关接口 - */ -import request from '@/utilsRc/request' - -function createFormData(payload = {}) { - if (typeof FormData !== 'undefined') { - const formData = new FormData() - Object.keys(payload).forEach(key => { - const value = payload[key] - if (value !== undefined && value !== null && value !== '') { - formData.append(key, value) - } - }) - return formData - } - return payload -} - -export function recommendJob(data) { - const params = {}; - if (data?.jobName !== undefined && data?.jobName !== null && data?.jobName !== '') { - params.jobName = String(data.jobName); - } - - return request({ - url: '/job/recommendJobByJobName', - method: 'get', - params: params, - baseUrlType: 'zytp' - }) -} diff --git a/apiRc/jobSkill.js b/apiRc/jobSkill.js deleted file mode 100644 index 8741153..0000000 --- a/apiRc/jobSkill.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * @Date: 2025-11-12 - * @Description: 职业技能相关接口 - */ -import request from '@/utilsRc/request' - -export function getJobSkillDetail(params) { - return request({ - url: '/jobSkillDet/getJobSkillDet', - method: 'get', - params, - baseUrlType: 'zytp' - }) -} - -// 获取技能权重 -export function getJobSkillWeight(params) { - return request({ - url: '/jobSkillDet/getJobSkillWeight', - method: 'get', - params, - baseUrlType: 'zytp' - }) -} - -// 暂未使用 - 如果需要在 CareerPath.vue 中点击路径职位查看详细技能信息时使用 -// 使用场景:获取职业路径中某个职位的详细技能信息(包含技能分数、类型等) -// export function getJobPathSkill(data) { -// let formData -// if (typeof FormData !== 'undefined') { -// formData = new FormData() -// if (data?.pathId !== undefined && data?.pathId !== null) { -// formData.append('pathId', data.pathId) -// } -// if (data?.currentJobName !== undefined && data?.currentJobName !== null) { -// formData.append('currentJobName', data.currentJobName) -// } -// } else { -// formData = { -// pathId: data?.pathId ?? '', -// currentJobName: data?.currentJobName ?? '' -// } -// } - -// return request({ -// url: '/jobSkillDet/getJobPathSkill', -// method: 'post', -// data: formData, -// baseUrlType: 'zytp', -// header: { -// 'content-type': 'multipart/form-data' -// } -// }) -// } - diff --git a/apiRc/login.js b/apiRc/login.js index eb70902..53af344 100644 --- a/apiRc/login.js +++ b/apiRc/login.js @@ -83,3 +83,15 @@ export function getInfo() { method: 'get' }) } + +// 重新发送验证码 +export function sendSmsAgain(data) { + return request({ + method: 'post', + url: '/app/sendSmsAgain', + data, + headers: { + isToken: false + } + }) +} diff --git a/apiRc/service/careerPath.js b/apiRc/service/careerPath.js new file mode 100644 index 0000000..09bbf6c --- /dev/null +++ b/apiRc/service/careerPath.js @@ -0,0 +1,37 @@ +/* + * @Date: 2024-09-25 11:14:29 + * @LastEditors: shirlwang + * @LastEditTime: 2025-12-23 17:40:11 + * @Description: 职业路径相关接口 + */ +import request from '@/utilsRc/request' + +// 获取当前职位 +export function getCurrentPosition(query) { + return request({ + url: '/jobPath/getJob', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} + +// 获取路径列表 +export function getPath(query) { + return request({ + url: '/jobPath/getJobPathList', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} + +// 获取路径详情 +export function getPathDetail(query) { + return request({ + url: '/jobPath/getJobPathById', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} diff --git a/apiRc/service/careerRecommendation.js b/apiRc/service/careerRecommendation.js new file mode 100644 index 0000000..67e0247 --- /dev/null +++ b/apiRc/service/careerRecommendation.js @@ -0,0 +1,37 @@ +/* + * @Date: 2024-09-25 11:14:29 + * @LastEditors: shirlwang + * @LastEditTime: 2025-12-23 17:40:11 + * @Description: 职业推荐相关接口 + */ +import request from '@/utilsRc/request' + +// 获取职业列表 +export function getProfessions(query) { + return request({ + url: '/jobSimilarity/getJob', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} + +// 获取技能标签 +export function getSkillTags(query) { + return request({ + url: '/jobSkillDet/getJobSkill', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} + +// 获取推荐职业 +export function getRecommend(query) { + return request({ + url: '/jobSimilarity/recommendJobByJobName', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} diff --git a/apiRc/jobPath.js b/apiRc/service/jobPath.js similarity index 100% rename from apiRc/jobPath.js rename to apiRc/service/jobPath.js diff --git a/apiRc/service/jobRecommend.js b/apiRc/service/jobRecommend.js index 92c7170..e3654e3 100644 --- a/apiRc/service/jobRecommend.js +++ b/apiRc/service/jobRecommend.js @@ -76,11 +76,16 @@ export function getAddedJobs(params) { }) } -// // 获取推荐岗位 -// export function getAddedJobs(params) { -// return request({ -// url: '/personnel/personBaseInfo/postRecommend', -// method: 'get', -// params, -// }) -// } +export function recommendJob(data) { + const params = {}; + if (data?.jobName !== undefined && data?.jobName !== null && data?.jobName !== '') { + params.jobName = String(data.jobName); + } + + return request({ + url: '/job/recommendJobByJobName', + method: 'get', + params: params, + baseUrlType: 'zytp' + }) +} diff --git a/apiRc/service/jobSkill.js b/apiRc/service/jobSkill.js new file mode 100644 index 0000000..38583d2 --- /dev/null +++ b/apiRc/service/jobSkill.js @@ -0,0 +1,24 @@ +/* + * @Date: 2025-11-12 + * @Description: 职业技能相关接口 + */ +import request from '@/utilsRc/request' + +export function getJobSkillDetail(params) { + return request({ + url: '/jobSkillDet/getJobSkillDet', + method: 'get', + params, + baseUrlType: 'zytp' + }) +} + +// 获取技能权重 +export function getJobSkillWeight(params) { + return request({ + url: '/jobSkillDet/getJobSkillWeight', + method: 'get', + params, + baseUrlType: 'zytp' + }) +} diff --git a/apiRc/service/skillDevelopment.js b/apiRc/service/skillDevelopment.js new file mode 100644 index 0000000..a8d190d --- /dev/null +++ b/apiRc/service/skillDevelopment.js @@ -0,0 +1,27 @@ +/* + * @Date: 2024-09-25 11:14:29 + * @LastEditors: shirlwang + * @LastEditTime: 2025-12-23 17:40:11 + * @Description: 技能发展相关接口 + */ +import request from '@/utilsRc/request' + +// 获取技能信息 +export function getCareerPath(query) { + return request({ + url: '/jobPath/getJobPathJobList', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} + +// 获取技能信息 +export function getSkillResult(query) { + return request({ + url: '/jobDimScore/getJobDimScoreList', + method: 'get', + params: query, + baseUrlType: 'zytp' + }) +} diff --git a/common/common.css b/common/common.css index 4572eda..f4744f1 100644 --- a/common/common.css +++ b/common/common.css @@ -417,6 +417,136 @@ html { background-color: #ffffff !important; } +/* #ifdef H5 */ +/* H5端字体和边距调整 - 放大1.5倍 */ +html, body { + font-size: 150% !important; +} + +/* 调整页面基础字体大小 */ +page { + font-size: 42rpx !important; +} + +/* 调整特定类的字体大小 */ +.fs_10 { + font-size: 30rpx !important; +} + +.fs_12 { + font-size: 36rpx !important; +} + +.fs_14 { + font-size: 42rpx !important; +} + +.fs_16 { + font-size: 48rpx !important; +} + +.fs_18 { + font-size: 54rpx !important; +} + +.fs_20 { + font-size: 60rpx !important; +} + +.fs_22 { + font-size: 66rpx !important; +} + +.fs_24 { + font-size: 72rpx !important; +} + +.fs_26 { + font-size: 78rpx !important; +} + +.fs_28 { + font-size: 84rpx !important; +} + +.fs_30 { + font-size: 90rpx !important; +} + +.fs_32 { + font-size: 96rpx !important; +} + +/* 调整边距类 */ +.mar_le30 { + margin-left: 90rpx !important; +} + +.mar_le25 { + margin-left: 75rpx !important; +} + +.mar_le20 { + margin-left: 60rpx !important; +} + +.mar_le15 { + margin-left: 45rpx !important; +} + +.mar_le10 { + margin-left: 30rpx !important; +} + +.mar_le5 { + margin-left: 15rpx !important; +} + +.mar_ri5 { + margin-right: 15rpx !important; +} + +.mar_ri10 { + margin-right: 30rpx !important; +} + +.mar_ri15 { + margin-right: 45rpx !important; +} + +.mar_ri20 { + margin-right: 60rpx !important; +} + +.mar_ri25 { + margin-right: 75rpx !important; +} + +.mar_top0 { + margin-top: 0 !important; +} + +.mar_top5 { + margin-top: 15rpx !important; +} + +.mar_top10 { + margin-top: 30rpx !important; +} + +.mar_top15 { + margin-top: 45rpx !important; +} + +.mar_top20 { + margin-top: 60rpx !important; +} + +.mar_top25 { + margin-top: 75rpx !important; +} +/* #endif */ + /* 弹性布局 */ diff --git a/common/globalFunction.js b/common/globalFunction.js index 8a183eb..de59a3b 100644 --- a/common/globalFunction.js +++ b/common/globalFunction.js @@ -72,18 +72,18 @@ export const navTo = function(url, { const pages = getCurrentPages(); if (pages.length >= 10) { uni.redirectTo({ - url: '/pages/complete-info/complete-info', + url: '/packageA/pages/complete-info/complete-info', fail: (err) => { console.error('页面跳转失败:', err); } }); } else { uni.navigateTo({ - url: '/pages/complete-info/complete-info', + url: '/packageA/pages/complete-info/complete-info', fail: (err) => { console.error('页面跳转失败:', err); uni.redirectTo({ - url: '/pages/complete-info/complete-info', + url: '/packageA/pages/complete-info/complete-info', fail: (err2) => { console.error('redirectTo也失败:', err2); } @@ -584,6 +584,86 @@ function isInWechatMiniProgramWebview() { function isEmptyObject(obj) { return obj && typeof obj === 'object' && !Array.isArray(obj) && Object.keys(obj).length === 0; } + +/** + * 农历日期工具 + * 提供公历转农历日期的中文表示 + */ +export const LunarUtil = { + /** + * 获取农历日期的中文表示 + * @param {number} year - 公历年 + * @param {number} month - 公历月 (1-12) + * @param {number} day - 公历日 + * @returns {string} 农历日期的中文表示(初一、初二...三十) + */ + getLunarDayInChinese(year, month, day) { + // 这里使用简化的农历转换算法 + // 实际项目中可以根据需要扩展更完整的农历功能 + const lunarDays = this.solarToLunar(year, month, day); + return this.getDayInChinese(lunarDays.day); + }, + + /** + * 简化的公历转农历日期算法 + * 注意:这是一个简化版,实际农历计算更复杂 + * 仅用于生成初一到三十的日期表示 + */ + solarToLunar(year, month, day) { + // 这里使用简化算法,实际项目中可以使用更精确的算法 + // 对于本项目,我们只需要生成初一到三十的序列 + // 实际的农历计算需要考虑节气、闰月等因素 + const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + + // 处理闰年 + if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) { + daysInMonth[1] = 29; + } + + // 计算当年已过天数 + let dayOfYear = 0; + for (let i = 0; i < month - 1; i++) { + dayOfYear += daysInMonth[i]; + } + dayOfYear += day; + + // 简化的农历月份计算(实际农历月份计算更复杂) + const lunarMonth = Math.ceil(dayOfYear / 29.5); + const lunarDay = (dayOfYear % 29) || 29; + + return { + month: lunarMonth, + day: lunarDay + }; + }, + + /** + * 将农历日期转换为中文表示 + * @param {number} day - 农历日 + * @returns {string} 中文表示(初一、初二...三十) + */ + getDayInChinese(day) { + if (day === 1) { + return '初一'; + } else if (day === 15) { + return '十五'; + } else if (day === 30) { + return '三十'; + } else { + const digits = ['', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']; + if (day <= 10) { + return '初' + digits[day]; + } else if (day <= 19) { + return '十' + (day === 10 ? '' : digits[day - 10]); + } else if (day <= 29) { + return '廿' + (day === 20 ? '' : digits[day - 20]); + } else { + return '三十'; + } + } + } +}; + /** * 身份证号码校验工具 * 支持15位和18位身份证号码校验 @@ -941,6 +1021,7 @@ export default { cloneDeep, formatDate, IdCardValidator, + LunarUtil, getdeviceInfo, checkingPhoneRegExp, checkingEmailRegExp, diff --git a/components/CollapseTransition/CollapseTransition.vue b/components/CollapseTransition/CollapseTransition.vue index 9ea5df4..2407431 100644 --- a/components/CollapseTransition/CollapseTransition.vue +++ b/components/CollapseTransition/CollapseTransition.vue @@ -8,7 +8,7 @@ diff --git a/components/md-render/md-render.vue b/components/md-render/md-render.vue index 4cc4e90..7568564 100644 --- a/components/md-render/md-render.vue +++ b/components/md-render/md-render.vue @@ -1,13 +1,45 @@ diff --git a/components/new-filter-page/new-filter-page.vue b/components/new-filter-page/new-filter-page.vue new file mode 100644 index 0000000..2694d2f --- /dev/null +++ b/components/new-filter-page/new-filter-page.vue @@ -0,0 +1,426 @@ + + + + + \ No newline at end of file diff --git a/components/renderJobs/renderJobs.vue b/components/renderJobs/renderJobs.vue index 29ff2e8..3354ce2 100644 --- a/components/renderJobs/renderJobs.vue +++ b/components/renderJobs/renderJobs.vue @@ -77,7 +77,7 @@ function nextDetail(job) { const recordData = recommedIndexDb.JobParameter(job); recommedIndexDb.addRecord(recordData); } - navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}`); + navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}&encryptJobId=${encodeURIComponent(job.encryptJobId)}`); } diff --git a/components/renderJobs/renderJobsCheckBox.vue b/components/renderJobs/renderJobsCheckBox.vue index c45a053..f163442 100644 --- a/components/renderJobs/renderJobsCheckBox.vue +++ b/components/renderJobs/renderJobsCheckBox.vue @@ -103,7 +103,7 @@ function nextDetail(job) { const recordData = recommedIndexDb.JobParameter(job); recommedIndexDb.addRecord(recordData); } - navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}`); + navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}&encryptJobId=${encodeURIComponent(job.encryptJobId)}`); } function toggleSelect(jobId) { @@ -122,7 +122,7 @@ function handleCardClick(job, e) { const recordData = recommedIndexDb.JobParameter(job); recommedIndexDb.addRecord(recordData); } - navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}`); + navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}&encryptJobId=${encodeURIComponent(job.encryptJobId)}`); } // 新增:提供选中状态和切换方法给父组件 diff --git a/components/tabbar/midell-box.vue b/components/tabbar/midell-box.vue index 6df2aaa..fd18b2e 100644 --- a/components/tabbar/midell-box.vue +++ b/components/tabbar/midell-box.vue @@ -76,7 +76,7 @@ const generateTabbarList = () => { { id: 2, text: 'AI+', - path: '/pages/chat/chat', + path: '/packageA/pages/chat/chat', iconPath: '../../static/tabbar/logo3.png', selectedIconPath: '../../static/tabbar/logo3.png', centerItem: true, @@ -110,7 +110,7 @@ const generateTabbarList = () => { baseItems.splice(1, 0, { id: 1, text: '发布岗位', - path: '/pages/job/publishJob', + path: '/packageA/pages/job/publishJob', iconPath: '../../static/tabbar/post.png', selectedIconPath: '../../static/tabbar/posted.png', centerItem: false, @@ -148,7 +148,7 @@ const changeItem = (item) => { const tabBarPages = [ '/pages/index/index', '/pages/careerfair/careerfair', - '/pages/chat/chat', + '/packageA/pages/chat/chat', '/pages/msglog/msglog', '/pages/mine/mine' ]; diff --git a/components/wxAuthLogin/WxAuthLogin.vue b/components/wxAuthLogin/WxAuthLogin.vue index 0664095..283022c 100644 --- a/components/wxAuthLogin/WxAuthLogin.vue +++ b/components/wxAuthLogin/WxAuthLogin.vue @@ -40,6 +40,22 @@ + + + 请选择机构类型 + + + {{ option.label }} + + + + @@ -87,33 +103,74 @@ - + + + + 我已阅读并同意 + + 《隐私协议》 + + \ No newline at end of file diff --git a/packageA/pages/agreement/user.vue b/packageA/pages/agreement/user.vue new file mode 100644 index 0000000..7f5e211 --- /dev/null +++ b/packageA/pages/agreement/user.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/packageA/pages/browseJob/browseJob.vue b/packageA/pages/browseJob/browseJob.vue index a130eb8..744f31d 100644 --- a/packageA/pages/browseJob/browseJob.vue +++ b/packageA/pages/browseJob/browseJob.vue @@ -83,8 +83,8 @@ function toSelectDate() { }); } -function navToPost(jobId) { - navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(jobId)}`); +function navToPost(job) { + navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}&encryptJobId=${encodeURIComponent(job.encryptJobId)}`); } function searchCollection(e) { diff --git a/packageA/pages/cancelApplication/cancelApplication.vue b/packageA/pages/cancelApplication/cancelApplication.vue new file mode 100644 index 0000000..b590770 --- /dev/null +++ b/packageA/pages/cancelApplication/cancelApplication.vue @@ -0,0 +1,99 @@ + + + + + \ No newline at end of file diff --git a/pages/chat/chat.vue b/packageA/pages/chat/chat.vue similarity index 74% rename from pages/chat/chat.vue rename to packageA/pages/chat/chat.vue index e43c8fa..4cfffc6 100644 --- a/pages/chat/chat.vue +++ b/packageA/pages/chat/chat.vue @@ -3,8 +3,7 @@ - - + @@ -25,16 +24,20 @@ - - {{ item.title }} + + + {{ item.title }} + + + + {{ item.title }} @@ -60,7 +63,8 @@
- {{ config.appInfo.areaName }}岗位推荐 + +
@@ -84,7 +88,7 @@ import useUserStore from '@/stores/useUserStore'; import { tabbarManager } from '@/utils/tabbarManager'; import aiPaging from './components/ai-paging.vue'; import { storeToRefs } from 'pinia'; -import WxAuthLogin from '@/components/WxAuthLogin/WxAuthLogin.vue'; + const { isTyping, tabeList, chatSessionID } = storeToRefs(useChatGroupDBStore()); const { userInfo } = storeToRefs(useUserStore()); const isDrawerOpen = ref(false); @@ -92,7 +96,7 @@ const scrollIntoView = ref(false); const searchText = ref(''); const paging = ref(null); -const wxAuthLoginRef = ref(null); + // 实时过滤 const filteredList = computed(() => { @@ -118,7 +122,7 @@ onShow(() => { onMounted(() => { // 监听退出登录事件,显示微信登录弹窗 uni.$on('showLoginModal', () => { - wxAuthLoginRef.value?.open(); + uni.navigateTo({ url: '/pages/login/wx-login' }); }); }); @@ -165,6 +169,21 @@ const changeDialogue = (item) => { }); } }; + +const deleteDialogue = (item) => { + if (item.sessionId) { + uni.showModal({ + content: '确定删除该会话吗?', + success(res) { + if (res.confirm) { + useChatGroupDBStore().deleteDialogue(item.sessionId); + $api.msg('会话删除成功'); + } + } + }); + } +}; + function updateSetting() { $api.msg('该功能正在开发中,敬请期待后续更新!'); } @@ -270,33 +289,56 @@ footer-height = 98rpx flex: 1 overflow: hidden .drawer-rows - padding: 0 28rpx; - // border-bottom: 2rpx dashed #e8e8e8 - overflow:hidden; //超出的文本隐藏 - text-overflow:ellipsis; //溢出用省略号显示 - white-space:nowrap; //溢出不换行 - .drawer-row-title - color: #A6A6A6; - font-weight: 500; - font-weight: bold; - font-size: 28rpx - padding: 0 24rpx - margin-top: 50rpx - margin-bottom: 16rpx - .drawer-row-list - height: 66rpx; - line-height: 66rpx - font-size: 28rpx - overflow: hidden - text-overflow: ellipsis - font-weight: 500; - color: #595959; - padding: 0 24rpx - .drawer-row-active - .drawer-row-list:active - color: #333333; - background: #F6F6F6; - border-radius: 16rpx 16rpx 16rpx 16rpx; + padding: 0 28rpx; + // border-bottom: 2rpx dashed #e8e8e8 + overflow:hidden; //超出的文本隐藏 + text-overflow:ellipsis; //溢出用省略号显示 + white-space:nowrap; //溢出不换行 + .drawer-row-title + color: #A6A6A6; + font-weight: 500; + font-weight: bold; + font-size: 28rpx + padding: 0 24rpx + margin-top: 50rpx + margin-bottom: 16rpx + .drawer-row-container + display: flex + align-items: center + justify-content: space-between + padding: 0 24rpx + height: 66rpx + + .drawer-row-list + flex: 1 + height: 66rpx + line-height: 66rpx + font-size: 28rpx + overflow: hidden + text-overflow: ellipsis + font-weight: 500; + color: #595959; + + .drawer-row-delete + margin-left: 20rpx + display: flex + align-items: center + justify-content: center + padding: 10rpx + opacity: 0.6 + &:hover + &:active + opacity: 1 + + .drawer-row-active + color: #333333; + background: #F6F6F6; + border-radius: 16rpx 16rpx 16rpx 16rpx; + + .drawer-row-list:active + color: #333333; + background: #F6F6F6; + border-radius: 16rpx 16rpx 16rpx 16rpx; /* 主要内容区域 */ diff --git a/pages/chat/components/AudioWave.vue b/packageA/pages/chat/components/AudioWave.vue similarity index 100% rename from pages/chat/components/AudioWave.vue rename to packageA/pages/chat/components/AudioWave.vue diff --git a/pages/chat/components/WaveDisplay.vue b/packageA/pages/chat/components/WaveDisplay.vue similarity index 89% rename from pages/chat/components/WaveDisplay.vue rename to packageA/pages/chat/components/WaveDisplay.vue index b0d190c..30a1dd5 100644 --- a/pages/chat/components/WaveDisplay.vue +++ b/packageA/pages/chat/components/WaveDisplay.vue @@ -65,6 +65,26 @@ const centerIndex = ref(0); // 动画帧ID let animationId = null; +// 为小程序环境提供requestAnimationFrame兼容 +const requestAnimationFramePolyfill = (callback) => { + // #ifdef MP-WEIXIN + return setTimeout(callback, 16); // 约60fps + // #endif + // #ifdef H5 + return requestAnimationFrame(callback); + // #endif +}; + +// 为小程序环境提供cancelAnimationFrame兼容 +const cancelAnimationFramePolyfill = (id) => { + // #ifdef MP-WEIXIN + clearTimeout(id); + // #endif + // #ifdef H5 + cancelAnimationFrame(id); + // #endif +}; + // 格式化显示时间 const formattedTime = computed(() => { const mins = Math.floor(props.recordingTime / 60) @@ -125,7 +145,7 @@ const updateWaveform = () => { } } - animationId = requestAnimationFrame(updateWaveform); + animationId = requestAnimationFramePolyfill(updateWaveform); }; // 更新单个波形条 @@ -157,14 +177,14 @@ const updateWaveBar = (index, value) => { // 开始动画 const startAnimation = () => { if (!animationId) { - animationId = requestAnimationFrame(updateWaveform); + animationId = requestAnimationFramePolyfill(updateWaveform); } }; // 停止动画 const stopAnimation = () => { if (animationId) { - cancelAnimationFrame(animationId); + cancelAnimationFramePolyfill(animationId); animationId = null; } }; diff --git a/packageA/pages/chat/components/ai-paging.vue b/packageA/pages/chat/components/ai-paging.vue new file mode 100644 index 0000000..37766db --- /dev/null +++ b/packageA/pages/chat/components/ai-paging.vue @@ -0,0 +1,2314 @@ + + + + + diff --git a/pages/chat/components/fileIcon.vue b/packageA/pages/chat/components/fileIcon.vue similarity index 100% rename from pages/chat/components/fileIcon.vue rename to packageA/pages/chat/components/fileIcon.vue diff --git a/pages/chat/components/fileText.vue b/packageA/pages/chat/components/fileText.vue similarity index 100% rename from pages/chat/components/fileText.vue rename to packageA/pages/chat/components/fileText.vue diff --git a/pages/chat/components/popupbadFeeback.vue b/packageA/pages/chat/components/popupbadFeeback.vue similarity index 100% rename from pages/chat/components/popupbadFeeback.vue rename to packageA/pages/chat/components/popupbadFeeback.vue diff --git a/pages/complete-info/company-info.vue b/packageA/pages/complete-info/company-info.vue similarity index 92% rename from pages/complete-info/company-info.vue rename to packageA/pages/complete-info/company-info.vue index f9a1dc2..5112c96 100644 --- a/pages/complete-info/company-info.vue +++ b/packageA/pages/complete-info/company-info.vue @@ -23,13 +23,16 @@ 统一社会信用代码 - + + + + @@ -600,6 +603,42 @@ const cancel = () => { uni.navigateBack() } +// 根据社会信用代码查询企业信息 +const queryCompanyByCreditCode = async () => { + const creditCode = formData.socialCreditCode.trim() + if (!creditCode) { + $api.msg('请输入统一社会信用代码') + return + } + + uni.showLoading({ title: '查询中...' }) + + try { + const response = await $api.createRequest('/app/company/queryCodeCompany', { code: creditCode }, 'get') + uni.hideLoading() + + if (response.code === 200 && response.data) { + const companyData = response.data + // 回显企业信息到表单 + if (companyData.name) formData.companyName = companyData.name + if (companyData.location) formData.registeredAddress = companyData.location + if (companyData.description) formData.companyIntro = companyData.description + if (companyData.nature) formData.nature = companyData.nature + if (companyData.registeredAddress) formData.registeredAddress = companyData.registeredAddress + if (companyData.legalPerson) formData.legalPersonName = companyData.legalPerson + // 其他字段根据接口返回的数据结构进行映射 + updateCompletion() + $api.msg('企业信息查询成功') + } else { + $api.msg('未查询到企业信息') + } + } catch (error) { + uni.hideLoading() + $api.msg('查询失败,请重试') + console.error('查询企业信息失败:', error) + } +} + // 确认提交 const confirm = () => { // 验证必填字段 @@ -837,6 +876,25 @@ defineExpose({ font-size: 28rpx line-height: 1.4 + .input-with-button + flex: 1 + display: flex + align-items: center + gap: 16rpx + + .query-button + padding: 8rpx 16rpx + background: #256BFA + color: #fff + font-size: 20rpx + border-radius: 6rpx + border: none + min-width: 100rpx + text-align: center + + &:active + background: #1a5cd9 + .input-con flex: 1 font-size: 28rpx diff --git a/pages/complete-info/complete-info.vue b/packageA/pages/complete-info/complete-info.vue similarity index 99% rename from pages/complete-info/complete-info.vue rename to packageA/pages/complete-info/complete-info.vue index 88bcf8a..13fdd4c 100644 --- a/pages/complete-info/complete-info.vue +++ b/packageA/pages/complete-info/complete-info.vue @@ -364,7 +364,7 @@ const changeSkillName = (index) => { state.currentEditingSkillIndex = index; // 跳转到技能查询页面 uni.navigateTo({ - url: `/pages/complete-info/skill-search?selected=${encodeURIComponent(JSON.stringify([]))}` + url: `/packageA/pages/complete-info/skill-search?selected=${encodeURIComponent(JSON.stringify([]))}` }); }; diff --git a/pages/complete-info/components/map-location-picker.vue b/packageA/pages/complete-info/components/map-location-picker.vue similarity index 100% rename from pages/complete-info/components/map-location-picker.vue rename to packageA/pages/complete-info/components/map-location-picker.vue diff --git a/pages/complete-info/skill-search.vue b/packageA/pages/complete-info/skill-search.vue similarity index 100% rename from pages/complete-info/skill-search.vue rename to packageA/pages/complete-info/skill-search.vue diff --git a/packageA/pages/exhibitors/exhibitors.vue b/packageA/pages/exhibitors/exhibitors.vue index cedbc34..f8b2124 100644 --- a/packageA/pages/exhibitors/exhibitors.vue +++ b/packageA/pages/exhibitors/exhibitors.vue @@ -62,11 +62,12 @@
- - - + + + 参会单位({{ companyList.length }}) - + + @@ -100,8 +101,71 @@ - - +
+ + + + + + + {{ item1.companyName }} + + + + + + {{ job.jobTitle }} + + {{ job.minSalary }}-{{ job.maxSalary }}元 + + + + + {{ job.industry }} + {{ job.scale }} + + + + + + + {{ + getStatusText(job.jobFairPersonJob?.status).text + }} + + + + + + + + + +
+
@@ -180,7 +180,7 @@ defineExpose({ open }); justify-content: space-around; } -.controls text { +.controls .control-text { color: #fff; font-size: 24rpx; padding: 8rpx 16rpx; diff --git a/packageA/pages/post/post.vue b/packageA/pages/post/post.vue index 16514e1..62ee99b 100644 --- a/packageA/pages/post/post.vue +++ b/packageA/pages/post/post.vue @@ -60,6 +60,14 @@ 点击查看 + + + 工作地点 + + + {{ jobInfo.jobAddress || jobInfo.jobLocation || '暂无地址信息' }} + + 职位描述 @@ -90,7 +98,7 @@ 联系人: {{ contact.contactPerson }} - + 职位: {{ contact.position }} @@ -102,7 +110,7 @@ - + 公司信息   + 在招 {{ companyCount }} @@ -143,7 +152,7 @@ > - + 竞争力分析 @@ -218,10 +227,22 @@ + + + + + {{ jobInfo.isApply === 1 ? '确认取消投递' : '确认投递' }} + {{ jobInfo.isApply === 1 ? '确定要取消投递此职位吗?' : '确定要投递此职位吗?' }} + + 取消 + 确认 + + + @@ -229,7 +250,7 @@ import point from '@/static/icon/point.png'; import VideoPlayer from './component/videoPlayer.vue'; import { reactive, inject, watch, ref, onMounted, computed } from 'vue'; -import { onLoad, onShow, onHide } from '@dcloudio/uni-app'; +import { onLoad, onShow, onHide, onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'; import dictLabel from '@/components/dict-Label/dict-Label.vue'; import RadarMap from './component/radarMap.vue'; import { storeToRefs } from 'pinia'; @@ -250,6 +271,7 @@ const jobInfo = ref({}); const state = reactive({}); const mapCovers = ref([]); const jobIdRef = ref(); +const jobId = ref(); // 竞争力分析数据,初始化为包含默认值的完整结构,确保雷达图能正常渲染 const raderData = ref({ matchScore: 0, @@ -266,12 +288,13 @@ const raderData = ref({ }); const videoPalyerRef = ref(null); const explainUrlRef = ref(''); +const showConfirmDialog = ref(false); // 申请人列表直接使用接口返回的applyUsers数组 onLoad((option) => { console.log(option, 'option'); - if (option.jobId) { + if (option.encryptJobId) { initLoad(option); } }); @@ -281,7 +304,7 @@ onShow(() => { // #ifdef H5 try { const option = parseQueryParams(); // 兼容微信内置浏览器 - if (option.jobId) { + if (option.encryptJobId) { initLoad(option); } } catch (e) { @@ -290,10 +313,13 @@ onShow(() => { // #endif }); function initLoad(option) { - const jobId = decodeURIComponent(option.jobId); - if (jobId !== jobIdRef.value) { - jobIdRef.value = jobId; - getDetail(jobId); + const encryptJobId = decodeURIComponent(option.encryptJobId); + if (option.jobId) { + jobId.value = decodeURIComponent(option.jobId); + } + if (encryptJobId !== jobIdRef.value) { + jobIdRef.value = encryptJobId; + getDetail(encryptJobId); } } @@ -305,17 +331,17 @@ function seeExplain() { } } -function getDetail(jobId) { +function getDetail(encryptJobId) { return new Promise((reslove, reject) => { - $api.createRequest(`/app/job/${jobId}`).then((resData) => { + $api.createRequest(`/app/job/${encryptJobId}`).then((resData) => { const { latitude, longitude, companyName, companyId } = resData.data; jobInfo.value = resData.data; reslove(resData.data); getCompanyIsAJobs(companyId); if (currentUserType.value !== 0) { - getCompetivetuveness(jobId); + getCompetivetuveness(encryptJobId); } - // getCompetivetuveness(jobId); + // getCompetivetuveness(encryptJobId); if (latitude && longitude) { mapCovers.value = [ { @@ -351,14 +377,14 @@ function getCompanyIsAJobs(companyId) { } function getTextWidth(text, size = 12) { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); - context.font = `${12}px Arial`; - return -(context.measureText(text).width / 2) - 20; // 计算文字中心点 + // 在小程序环境中,document 对象不存在,使用估算方法 + // 简单估算:每个字符大约占 8px 宽度 + const estimatedWidth = text.length * 8; + return -(estimatedWidth / 2) - 20; // 计算文字中心点 } -function getCompetivetuveness(jobId) { - $api.createRequest(`/app/job/competitiveness/${jobId}`, {}, 'GET').then((resData) => { +function getCompetivetuveness(encryptJobId) { + $api.createRequest(`/app/job/competitiveness/${encryptJobId}`, {}, 'GET').then((resData) => { // 如果接口返回的数据为 null 或空,使用默认值0 if (resData && resData.data) { // 确保 radarChart 字段存在,如果不存在则使用默认值 @@ -422,37 +448,67 @@ function jobApply() { $api.msg('请您先登录'); return; } - const jobId = jobInfo.value.jobId; - $api.createRequest(`/app/job/apply/${jobId}`, {}, 'GET').then((resData) => { - getDetail(jobId); - $api.msg('申请成功'); - const jobUrl = jobInfo.value.jobUrl; - // return window.open(jobUrl); + // 显示确认弹窗 + showConfirmDialog.value = true; +} + +// 隐藏弹窗 +function hideDialog() { + showConfirmDialog.value = false; +} + +// 确认操作 +function confirmAction() { + const encryptJobId = jobIdRef.value; + if (jobInfo.value.isApply === 1) { + // 取消投递 + const cancelJobId = jobId.value || jobInfo.value.jobId; + $api.createRequest(`/app/job/applyJobCencal`, { jobId: cancelJobId }, 'DELETE').then((resData) => { + $api.msg('取消投递成功'); + getDetail(encryptJobId); // 刷新职位信息 + showConfirmDialog.value = false; }); - // if (jobInfo.value.isApply) { - // const jobUrl = jobInfo.value.jobUrl; - // return window.open(jobUrl); - // } else { - // $api.createRequest(`/app/job/apply/${jobId}`, {}, 'GET').then((resData) => { - // getDetail(jobId); - // $api.msg('申请成功'); - // const jobUrl = jobInfo.value.jobUrl; - // return window.open(jobUrl); - // }); - // } + } else { + // 确认投递 + $api.createRequest(`/app/job/apply/${encryptJobId}`, {}, 'GET').then((resData) => { + $api.msg('申请成功'); + getDetail(encryptJobId); // 刷新职位信息 + showConfirmDialog.value = false; + }); + } +} + +// 确认投递 +function confirmApply() { + const encryptJobId = jobIdRef.value; + $api.createRequest(`/app/job/apply/${encryptJobId}`, {}, 'GET').then((resData) => { + $api.msg('申请成功'); + const jobUrl = jobInfo.value.jobUrl; + // return window.open(jobUrl); + showConfirmDialog.value = false; + }); +} + +// 取消投递 +function cancelApply() { + const cancelJobId = jobId.value || jobInfo.value.jobId; + $api.createRequest(`/app/job/applyJobCencal`, { jobId: cancelJobId }, 'DELETE').then((resData) => { + $api.msg('取消投递成功'); + showConfirmDialog.value = false; + }); } // 取消/收藏岗位 function jobCollection() { - const jobId = jobInfo.value.jobId; + const encryptJobId = jobIdRef.value; if (jobInfo.value.isCollection) { - $api.createRequest(`/app/job/collection/${jobId}`, {}, 'DELETE').then((resData) => { - getDetail(jobId); + $api.createRequest(`/app/job/collection/${encryptJobId}`, {}, 'DELETE').then((resData) => { + getDetail(encryptJobId); $api.msg('取消收藏成功'); }); } else { - $api.createRequest(`/app/job/collection/${jobId}`, {}, 'POST').then((resData) => { - getDetail(jobId); + $api.createRequest(`/app/job/collection/${encryptJobId}`, {}, 'POST').then((resData) => { + getDetail(encryptJobId); $api.msg('收藏成功'); }); } @@ -524,6 +580,24 @@ function handleCompanyDetailClick() { $api.msg('没有企业信息'); } } + +// 分享给朋友 +onShareAppMessage(() => { + return { + title: '喀什智慧就业平台', + path: '/pages/index/index', + imageUrl: '' + }; +}); + +// 分享到朋友圈 +onShareTimeline(() => { + return { + title: '喀什智慧就业平台', + path: '/pages/index/index', + imageUrl: '' + }; +}); diff --git a/packageA/pages/selectDate/selectDate.vue b/packageA/pages/selectDate/selectDate.vue index ff13fc7..bb02342 100644 --- a/packageA/pages/selectDate/selectDate.vue +++ b/packageA/pages/selectDate/selectDate.vue @@ -46,12 +46,10 @@ + + + diff --git a/packageB/components/unieditor.vue b/packageB/components/unieditor.vue new file mode 100644 index 0000000..a65349f --- /dev/null +++ b/packageB/components/unieditor.vue @@ -0,0 +1,562 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/packageB/institution/evaluationAgencyMaintenance.vue b/packageB/institution/evaluationAgencyMaintenance.vue new file mode 100644 index 0000000..ff19952 --- /dev/null +++ b/packageB/institution/evaluationAgencyMaintenance.vue @@ -0,0 +1,941 @@ + @@ -70,6 +151,21 @@ import useUserStore from '@/stores/useUserStore'; const { $api, navTo } = inject('globalFunction'); const popup = ref(null); +const reminderPopup = ref(null); +const feedbackPopup = ref(null); + +// 提醒设置 +const reminderEnabled = ref(true); +const reminderFrequency = ref('realtime'); +const reminderOptions = ref([ + { label: '实时提醒', value: 'realtime' }, + { label: '每小时提醒', value: 'hourly' }, + { label: '每天提醒', value: 'daily' } +]); + +// 评论与反馈 +const feedbackContent = ref(''); +const rating = ref(0); // 企业信息数据 const companyInfo = reactive({ @@ -82,6 +178,21 @@ const companyInfo = reactive({ function goToCompanyInfo() { navTo('/pages/mine/company-info'); } +function handleInstitutionClick(i){ + if(i==1){ + navTo('/packageB/institution/trainingInstitutionMaintenance'); + }else if(i==2){ + navTo('/packageB/institution/evaluationAgencyMaintenance'); + }else if(i==3){ + navTo('/packageB/notice/trainingAnnouncement/postedList'); + }else if(i==4){ + navTo('/packageB/notice/evaluateAnnouncement/evaluateList'); + } +} +// 跳转到消息页面 +function goToMessage() { + navTo('/pages/msglog/msglog'); +} function logOut() { popup.value.open(); @@ -92,10 +203,7 @@ function close() { } function confirm() { - // 调用退出登录 - useUserStore().logOut(); - // 关闭弹窗 - popup.value.close(); + useUserStore().logOut(false); // 不显示登录弹窗 // 跳转到首页 uni.reLaunch({ url: '/pages/index/index' @@ -111,9 +219,9 @@ onShow(() => { onMounted(() => { uni.$on('showLoginModal', () => { // 这里可以显示微信登录弹窗 - // 由于这个页面没有 WxAuthLogin 组件,我们跳转到首页让首页处理 - uni.reLaunch({ - url: '/pages/index/index' + // 跳转到微信登录页面 + uni.navigateTo({ + url: '/pages/login/wx-login' }); }); }); @@ -147,6 +255,57 @@ function getCompanyInfo() { companyInfo.isVerified = false; } } + +// 切换提醒开启/关闭状态 +function toggleReminder(e) { + reminderEnabled.value = e.detail.value; +} + +// 打开提醒设置弹窗 +function openReminderSettings() { + reminderPopup.value.open(); +} + +// 关闭提醒设置弹窗 +function closeReminderPopup() { + reminderPopup.value.close(); +} + +// 处理提醒频率变化 +function handleFrequencyChange(e) { + reminderFrequency.value = e.detail.value; +} + +// 打开评论与反馈弹窗 +function openFeedbackPopup() { + feedbackPopup.value.open(); +} + +// 关闭评论与反馈弹窗 +function closeFeedbackPopup() { + feedbackPopup.value.close(); +} + +// 设置评分 +function setRating(score) { + rating.value = score; +} + +// 提交反馈 +function submitFeedback() { + // 模拟提交成功 + uni.showToast({ + title: '反馈提交成功', + icon: 'success' + }); + // 清空表单 + feedbackContent.value = ''; + rating.value = 0; + // 延迟关闭弹窗,确保用户能看到成功提示 + setTimeout(() => { + closeFeedbackPopup(); + }, 1000); +} diff --git a/pages/mine/mine.vue b/pages/mine/mine.vue index 9ad6cba..2c2c9ad 100644 --- a/pages/mine/mine.vue +++ b/pages/mine/mine.vue @@ -47,6 +47,10 @@ {{ counts.fairCollecitonCount }} 预约 + + {{ counts.applyCencalCount || 0 }} + 取消投递 + @@ -92,12 +96,32 @@ - + + + + 消息 + + + + + + 通知与提醒 - 已开启 + + + + + + + + 评论与反馈 + + + + 求职帮 @@ -113,6 +137,39 @@ @close="close" > + + + + 提醒设置 + + + {{ item.label }} + + + + + + + + + + + +