Compare commits
25 Commits
e290340b8c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2b0a0993c2 | |||
| 2de7ea4ac9 | |||
| e14be76ac8 | |||
|
|
949caf5589 | ||
|
|
844ff8c582 | ||
|
|
f5bd523985 | ||
|
|
be47e94196 | ||
|
|
99aea9e243 | ||
|
|
aa4b185aa2 | ||
|
|
92c6488d18 | ||
|
|
f1c8d0457b | ||
|
|
5378031a58 | ||
|
|
d2f61bcc45 | ||
|
|
d79d79f750 | ||
|
|
40127060b8 | ||
|
|
16d1e50c85 | ||
|
|
6006f5cd28 | ||
|
|
d78382ba08 | ||
|
|
a74cdcc850 | ||
| d89b566ad3 | |||
| 3c66e16e49 | |||
| ccbb5008bd | |||
|
|
bc48d7fff0 | ||
|
|
6baacfcf20 | ||
|
|
c4f7d6d998 |
@@ -114,15 +114,15 @@ const generateTabbarList = () => {
|
|||||||
// 求职者用户(包括未登录状态):显示招聘会
|
// 求职者用户(包括未登录状态):显示招聘会
|
||||||
// H5端隐藏招聘会
|
// H5端隐藏招聘会
|
||||||
// #ifndef H5
|
// #ifndef H5
|
||||||
baseItems.splice(1, 0, {
|
// baseItems.splice(1, 0, {
|
||||||
id: 1,
|
// id: 1,
|
||||||
text: '招聘会',
|
// text: '招聘会',
|
||||||
path: '/pages/careerfair/careerfair',
|
// path: '/pages/careerfair/careerfair',
|
||||||
iconPath: '/static/tabbar/post.png',
|
// iconPath: '/static/tabbar/post.png',
|
||||||
selectedIconPath: '/static/tabbar/posted.png',
|
// selectedIconPath: '/static/tabbar/posted.png',
|
||||||
centerItem: false,
|
// centerItem: false,
|
||||||
badge: readMsg.badges[1]?.count || 0,
|
// badge: readMsg.badges[1]?.count || 0,
|
||||||
});
|
// });
|
||||||
// #endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -139,13 +139,15 @@ const validateRole = () => {
|
|||||||
|
|
||||||
const getPhoneNumber = (e) => {
|
const getPhoneNumber = (e) => {
|
||||||
console.log('获取手机号:', e);
|
console.log('获取手机号:', e);
|
||||||
|
console.log('userType.value', userType.value)
|
||||||
// 验证角色是否已选择
|
// 验证角色是否已选择
|
||||||
if (!validateRole()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.detail.errMsg === 'getPhoneNumber:ok') {
|
if (e.detail.errMsg === 'getPhoneNumber:ok') {
|
||||||
|
if (userType.value === null) {
|
||||||
|
$api.msg('请先选择您的角色');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
uni.login({
|
uni.login({
|
||||||
provider: 'weixin',
|
provider: 'weixin',
|
||||||
success: (loginRes) => {
|
success: (loginRes) => {
|
||||||
|
|||||||
10
config.js
10
config.js
@@ -1,16 +1,16 @@
|
|||||||
export default {
|
export default {
|
||||||
// baseUrl: 'http://39.98.44.136:8080', // 测试
|
// baseUrl: 'http://39.98.44.136:8080', // 测试
|
||||||
baseUrl: 'http://222.80.110.161:11111/api/ks', // 测试
|
baseUrl: 'http://222.80.110.161:80/api/ks', // 测试
|
||||||
// baseUrl: 'http://ks.zhaopinzao8dian.com/api/ks', // 测试
|
// baseUrl: 'http://ks.zhaopinzao8dian.com/api/ks', // 测试
|
||||||
|
|
||||||
// LCBaseUrl:'http://10.110.145.145:9100',//内网端口
|
// LCBaseUrl:'http://10.110.145.145:9100',//内网端口
|
||||||
// LCBaseUrlInner:'http://10.110.145.145:10100',//招聘、培训、帮扶
|
// LCBaseUrlInner:'http://10.110.145.145:10100',//招聘、培训、帮扶
|
||||||
// imgBaseUrl:'http://10.110.145.145/images', //图片基础url
|
// imgBaseUrl:'http://10.110.145.145/images', //图片基础url
|
||||||
// trainVideoImgUrl:'http://10.110.145.145:9100/file/file/minio',
|
// trainVideoImgUrl:'http://10.110.145.145:9100/file/file/minio',
|
||||||
LCBaseUrl:'http://222.80.110.161:11111/prod-api',//内网端口
|
LCBaseUrl:'http://222.80.110.161:80/prod-api',//内网端口
|
||||||
LCBaseUrlInner:'http://222.80.110.161:11111/prod-psout-api',//招聘、培训、帮扶
|
LCBaseUrlInner:'http://222.80.110.161:80/prod-psout-api',//招聘、培训、帮扶
|
||||||
imgBaseUrl:'http://222.80.110.161:11111/images', //图片基础url
|
imgBaseUrl:'http://222.80.110.161:80/images', //图片基础url
|
||||||
trainVideoImgUrl:'http://222.80.110.161:11111/prod-api/file/file/minio',
|
trainVideoImgUrl:'http://222.80.110.161:80/prod-api/file/file/minio',
|
||||||
// sseAI+
|
// sseAI+
|
||||||
// StreamBaseURl: 'http://39.98.44.136:8000',
|
// StreamBaseURl: 'http://39.98.44.136:8000',
|
||||||
StreamBaseURl: 'https://qd.zhaopinzao8dian.com/ai',
|
StreamBaseURl: 'https://qd.zhaopinzao8dian.com/ai',
|
||||||
|
|||||||
@@ -33,9 +33,19 @@ export function useColumnCount(onChange = () => {}) {
|
|||||||
|
|
||||||
let count = 2
|
let count = 2
|
||||||
if (width >= 1000) {
|
if (width >= 1000) {
|
||||||
|
// #ifdef H5
|
||||||
|
count = 3 // H5端最多显示3列
|
||||||
|
// #endif
|
||||||
|
// #ifndef H5
|
||||||
count = 5
|
count = 5
|
||||||
|
// #endif
|
||||||
} else if (width >= 750) {
|
} else if (width >= 750) {
|
||||||
|
// #ifdef H5
|
||||||
|
count = 3 // H5端最多显示3列
|
||||||
|
// #endif
|
||||||
|
// #ifndef H5
|
||||||
count = 4
|
count = 4
|
||||||
|
// #endif
|
||||||
} else if (width >= 500) {
|
} else if (width >= 500) {
|
||||||
count = 3
|
count = 3
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
<view class="table-row table-header">
|
<view class="table-row table-header">
|
||||||
<view class="table-cell fixed-column"></view>
|
<view class="table-cell fixed-column"></view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell job-title-cell">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell job-title-cell">
|
||||||
<text>{{ job.jobTitle }}</text>
|
<text>{{ job?.jobTitle || '' }}</text>
|
||||||
<text class="company">{{ job.company }}</text>
|
<text class="company">{{ job?.company || '' }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>
|
<view>
|
||||||
<Salary-Expectation
|
<Salary-Expectation
|
||||||
|
v-if="job"
|
||||||
:max-salary="job.maxSalary"
|
:max-salary="job.maxSalary"
|
||||||
:min-salary="job.minSalary"
|
:min-salary="job.minSalary"
|
||||||
:is-month="true"
|
:is-month="true"
|
||||||
@@ -30,7 +31,7 @@
|
|||||||
<text>公司名称</text>
|
<text>公司名称</text>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>{{ job.companyName }}</view>
|
<view>{{ job?.companyName || '' }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -39,7 +40,7 @@
|
|||||||
<text>学历</text>
|
<text>学历</text>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view><dict-Label dictType="education" :value="job.education"></dict-Label></view>
|
<view><dict-Label dictType="education" :value="job?.education"></dict-Label></view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -48,7 +49,7 @@
|
|||||||
<text>经验</text>
|
<text>经验</text>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view><dict-Label dictType="experience" :value="job.experience"></dict-Label></view>
|
<view><dict-Label dictType="experience" :value="job?.experience"></dict-Label></view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@
|
|||||||
<text>工作地点</text>
|
<text>工作地点</text>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>{{ job.jobLocation }}</view>
|
<view>{{ job?.jobLocation || '' }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -66,7 +67,7 @@
|
|||||||
<text>来源</text>
|
<text>来源</text>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>{{ job.dataSource }}</view>
|
<view>{{ job?.dataSource || '' }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -75,7 +76,7 @@
|
|||||||
<text>职位描述</text>
|
<text>职位描述</text>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>{{ job.description }}</view>
|
<view>{{ job?.description || '' }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="table-row">
|
<view class="table-row">
|
||||||
@@ -85,9 +86,9 @@
|
|||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>
|
<view>
|
||||||
<dict-tree-Label
|
<dict-tree-Label
|
||||||
v-if="jobInfo.company && jobInfo.company.industry"
|
v-if="job.company && job.company.industry"
|
||||||
dictType="industry"
|
dictType="industry"
|
||||||
:value="jobInfo.company.industry"
|
:value="job.company.industry"
|
||||||
></dict-tree-Label>
|
></dict-tree-Label>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -98,7 +99,7 @@
|
|||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>
|
<view>
|
||||||
<dict-Label dictType="scale" :value="jobInfo.company?.scale"></dict-Label>
|
<dict-Label dictType="scale" :value="job.company?.scale"></dict-Label>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -108,7 +109,7 @@
|
|||||||
</view>
|
</view>
|
||||||
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
<view v-for="(job, index) in jobs" :key="index" class="table-cell detail-content">
|
||||||
<view>
|
<view>
|
||||||
{{ job.isHot ? '是' : '否' }}
|
{{ job?.isHot ? '是' : '否' }}
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -125,7 +126,7 @@ const jobs = ref([]);
|
|||||||
|
|
||||||
onLoad(() => {
|
onLoad(() => {
|
||||||
let compareData = uni.getStorageSync('compare');
|
let compareData = uni.getStorageSync('compare');
|
||||||
jobs.value = compareData;
|
jobs.value = Array.isArray(compareData) ? compareData : [];
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -81,10 +81,16 @@ const fromValue = reactive({
|
|||||||
area: '',
|
area: '',
|
||||||
jobTitleId: [],
|
jobTitleId: [],
|
||||||
});
|
});
|
||||||
onLoad(async () => {
|
const needSkill = ref(false);
|
||||||
|
|
||||||
|
onLoad(async (options) => {
|
||||||
// 初始化字典数据
|
// 初始化字典数据
|
||||||
await getDictData();
|
await getDictData();
|
||||||
initLoad();
|
initLoad();
|
||||||
|
// 检查是否需要继续跳转到技能页面
|
||||||
|
if (options && options.needSkill === 'true') {
|
||||||
|
needSkill.value = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
const confirm = () => {
|
const confirm = () => {
|
||||||
if (!fromValue.jobTitleId) {
|
if (!fromValue.jobTitleId) {
|
||||||
@@ -94,7 +100,12 @@ const confirm = () => {
|
|||||||
$api.msg('完成');
|
$api.msg('完成');
|
||||||
state.disbleDate = true;
|
state.disbleDate = true;
|
||||||
getUserResume().then(() => {
|
getUserResume().then(() => {
|
||||||
|
// 如果需要继续跳转到技能页面,则跳转到个人信息页面(携带 needSkill 标记,便于返回两级)
|
||||||
|
if (needSkill.value) {
|
||||||
|
navTo('/packageA/pages/personalInfo/personalInfo?needSkill=true');
|
||||||
|
} else {
|
||||||
navBack();
|
navBack();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,6 +17,19 @@
|
|||||||
<view class="input-titile">姓名</view>
|
<view class="input-titile">姓名</view>
|
||||||
<input class="input-con" v-model="fromValue.name" placeholder="请输入您的姓名" />
|
<input class="input-con" v-model="fromValue.name" placeholder="请输入您的姓名" />
|
||||||
</view>
|
</view>
|
||||||
|
<view class="content-input" :class="{ 'input-error': passwordError }">
|
||||||
|
<view class="input-titile">设置密码</view>
|
||||||
|
<input
|
||||||
|
class="input-con"
|
||||||
|
v-model="fromValue.ytjPassword"
|
||||||
|
placeholder="请输入密码"
|
||||||
|
type="password"
|
||||||
|
maxlength="8"
|
||||||
|
@input="validatePassword"
|
||||||
|
/>
|
||||||
|
<view v-if="passwordError" class="error-message">{{ passwordError }}</view>
|
||||||
|
<view v-if="fromValue.ytjPassword && !passwordError" class="success-message">✓ 密码格式正确</view>
|
||||||
|
</view>
|
||||||
<view class="content-sex">
|
<view class="content-sex">
|
||||||
<view class="sex-titile">性别</view>
|
<view class="sex-titile">性别</view>
|
||||||
<view class="sext-ri">
|
<view class="sext-ri">
|
||||||
@@ -150,6 +163,8 @@ const openSelectPopup = (config) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const percent = ref('0%');
|
const percent = ref('0%');
|
||||||
|
// 当从“先职位后技能”链路进入时,提交后需直接返回职业规划页
|
||||||
|
const needGoBackTwoStep = ref(false);
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
educationText: '',
|
educationText: '',
|
||||||
politicalAffiliationText: '',
|
politicalAffiliationText: '',
|
||||||
@@ -158,6 +173,7 @@ const state = reactive({
|
|||||||
});
|
});
|
||||||
const fromValue = reactive({
|
const fromValue = reactive({
|
||||||
name: '',
|
name: '',
|
||||||
|
ytjPassword: '', // 新增密码字段
|
||||||
sex: 0,
|
sex: 0,
|
||||||
birthDate: '',
|
birthDate: '',
|
||||||
education: '',
|
education: '',
|
||||||
@@ -165,10 +181,16 @@ const fromValue = reactive({
|
|||||||
idCard: '',
|
idCard: '',
|
||||||
phone: ''
|
phone: ''
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 输入校验相关
|
||||||
|
const passwordError = ref('');
|
||||||
// 移除重复的onLoad定义,已在上方实现
|
// 移除重复的onLoad定义,已在上方实现
|
||||||
|
|
||||||
// 在onLoad中初始化数据,确保页面加载时就能获取技能信息
|
// 在onLoad中初始化数据,确保页面加载时就能获取技能信息
|
||||||
onLoad(() => {
|
onLoad((options = {}) => {
|
||||||
|
if (options.needSkill === 'true') {
|
||||||
|
needGoBackTwoStep.value = true;
|
||||||
|
}
|
||||||
// 初始化页面数据
|
// 初始化页面数据
|
||||||
initLoad();
|
initLoad();
|
||||||
});
|
});
|
||||||
@@ -235,6 +257,7 @@ function initLoad() {
|
|||||||
const currentUserInfo = userInfo.value && Object.keys(userInfo.value).length > 0 ? userInfo.value : cachedUserInfo;
|
const currentUserInfo = userInfo.value && Object.keys(userInfo.value).length > 0 ? userInfo.value : cachedUserInfo;
|
||||||
|
|
||||||
fromValue.name = currentUserInfo.name || '';
|
fromValue.name = currentUserInfo.name || '';
|
||||||
|
fromValue.ytjPassword = ''; // 密码输入框默认为空,不加载已有密码
|
||||||
fromValue.sex = currentUserInfo.sex !== undefined ? Number(currentUserInfo.sex) : 0;
|
fromValue.sex = currentUserInfo.sex !== undefined ? Number(currentUserInfo.sex) : 0;
|
||||||
fromValue.phone = currentUserInfo.phone || '';
|
fromValue.phone = currentUserInfo.phone || '';
|
||||||
fromValue.birthDate = currentUserInfo.birthDate || '';
|
fromValue.birthDate = currentUserInfo.birthDate || '';
|
||||||
@@ -351,6 +374,12 @@ const confirm = () => {
|
|||||||
return $api.msg('请输入正确手机号');
|
return $api.msg('请输入正确手机号');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 密码校验
|
||||||
|
validatePassword();
|
||||||
|
if (fromValue.ytjPassword && passwordError.value) {
|
||||||
|
return $api.msg(passwordError.value);
|
||||||
|
}
|
||||||
|
|
||||||
// 构建appSkillsList数据结构 - 使用新的技能数据结构,包含id字段
|
// 构建appSkillsList数据结构 - 使用新的技能数据结构,包含id字段
|
||||||
const appSkillsList = state.skills
|
const appSkillsList = state.skills
|
||||||
.filter(skill => skill.name && skill.name.trim() !== '')
|
.filter(skill => skill.name && skill.name.trim() !== '')
|
||||||
@@ -369,7 +398,12 @@ const confirm = () => {
|
|||||||
$api.createRequest('/app/user/resume', params, 'post').then((resData) => {
|
$api.createRequest('/app/user/resume', params, 'post').then((resData) => {
|
||||||
$api.msg('完成');
|
$api.msg('完成');
|
||||||
getUserResume().then(() => {
|
getUserResume().then(() => {
|
||||||
|
// 如果从“缺职位+技能”链路进入,回退两层直接返回职业规划页
|
||||||
|
if (needGoBackTwoStep.value) {
|
||||||
|
navBack({ delta: 2 });
|
||||||
|
} else {
|
||||||
navBack();
|
navBack();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -603,6 +637,54 @@ const changeSex = (sex) => {
|
|||||||
fromValue.sex = sex;
|
fromValue.sex = sex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 密码实时校验
|
||||||
|
const validatePassword = () => {
|
||||||
|
const password = (fromValue.ytjPassword || '').trim();
|
||||||
|
|
||||||
|
// 如果为空,清除错误信息
|
||||||
|
if (!password) {
|
||||||
|
passwordError.value = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验规则:长度8位,包含大小写字母和数字,至少各有一个
|
||||||
|
if (password.length !== 8) {
|
||||||
|
passwordError.value = '密码长度必须为8位';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否包含大写字母
|
||||||
|
const hasUpperCase = /[A-Z]/.test(password);
|
||||||
|
// 检查是否包含小写字母
|
||||||
|
const hasLowerCase = /[a-z]/.test(password);
|
||||||
|
// 检查是否包含数字
|
||||||
|
const hasNumber = /[0-9]/.test(password);
|
||||||
|
|
||||||
|
if (!hasUpperCase) {
|
||||||
|
passwordError.value = '密码必须包含至少一个大写字母';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasLowerCase) {
|
||||||
|
passwordError.value = '密码必须包含至少一个小写字母';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasNumber) {
|
||||||
|
passwordError.value = '密码必须包含至少一个数字';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否只包含字母和数字
|
||||||
|
if (!/^[A-Za-z0-9]+$/.test(password)) {
|
||||||
|
passwordError.value = '密码只能包含大小写字母和数字';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验通过
|
||||||
|
passwordError.value = '';
|
||||||
|
};
|
||||||
|
|
||||||
const changePoliticalAffiliation = () => {
|
const changePoliticalAffiliation = () => {
|
||||||
openSelectPopup({
|
openSelectPopup({
|
||||||
title: '政治面貌',
|
title: '政治面貌',
|
||||||
@@ -760,6 +842,19 @@ function getDatePickerIndexes(dateStr) {
|
|||||||
height: 80rpx;
|
height: 80rpx;
|
||||||
border-bottom: 2rpx solid #EBEBEB
|
border-bottom: 2rpx solid #EBEBEB
|
||||||
position: relative;
|
position: relative;
|
||||||
|
.error-message
|
||||||
|
color: #ff4757;
|
||||||
|
font-size: 24rpx;
|
||||||
|
margin-top: 10rpx;
|
||||||
|
line-height: 1.4;
|
||||||
|
.success-message
|
||||||
|
color: #2ed573;
|
||||||
|
font-size: 24rpx;
|
||||||
|
margin-top: 10rpx;
|
||||||
|
line-height: 1.4;
|
||||||
|
.input-error
|
||||||
|
.input-con
|
||||||
|
border-bottom-color: #ff4757;
|
||||||
.triangle::before
|
.triangle::before
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 20rpx;
|
right: 20rpx;
|
||||||
|
|||||||
@@ -171,7 +171,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="content-card" v-else>
|
<!-- <view class="content-card" v-if="false">
|
||||||
<view class="card-title">
|
<view class="card-title">
|
||||||
<view class="title">申请人列表</view>
|
<view class="title">申请人列表</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -214,7 +214,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view> -->
|
||||||
</view>
|
</view>
|
||||||
<view style="height: 34px"></view>
|
<view style="height: 34px"></view>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
@@ -525,6 +525,11 @@ function previewImage(url, index) {
|
|||||||
current: index
|
current: index
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查看简历
|
||||||
|
function viewResume(userId) {
|
||||||
|
navTo(`/packageA/pages/myResume/myResume?userId=${userId}`);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
|
|||||||
@@ -58,8 +58,57 @@ const { $api, navTo, vacanciesTo, formatTotal, config } = inject('globalFunction
|
|||||||
import useUserStore from '@/stores/useUserStore';
|
import useUserStore from '@/stores/useUserStore';
|
||||||
import useDictStore from '@/stores/useDictStore';
|
import useDictStore from '@/stores/useDictStore';
|
||||||
|
|
||||||
function jumps(url){
|
onLoad(() => {
|
||||||
|
thirdLogin()
|
||||||
|
});
|
||||||
|
|
||||||
|
async function jumps(url){
|
||||||
|
if(await thirdLogin()){
|
||||||
navTo(url);
|
navTo(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function thirdLogin(){
|
||||||
|
let form={}
|
||||||
|
if (uni.getStorageSync('userInfo').isCompanyUser=='1') {
|
||||||
|
form={
|
||||||
|
usertype: '1',
|
||||||
|
idno: uni.getStorageSync('userInfo').idCard,
|
||||||
|
name: uni.getStorageSync('userInfo').name,
|
||||||
|
enterprisecode:"",
|
||||||
|
enterprisename: "",
|
||||||
|
contactperson: "",
|
||||||
|
contactphone: "",
|
||||||
|
}
|
||||||
|
}else if (uni.getStorageSync('userInfo').isCompanyUser=='0') {
|
||||||
|
form={
|
||||||
|
usertype: "2",
|
||||||
|
enterprisecode: uni.getStorageSync('userInfo').idCard,
|
||||||
|
enterprisename: uni.getStorageSync('userInfo').name,
|
||||||
|
contactperson: "",
|
||||||
|
contactphone: "",
|
||||||
|
idno: "",
|
||||||
|
name: ""
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '请先登录'
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var resLogin = await $api.myRequest('/auth/login2/ks',form,'post',10100);
|
||||||
|
if (resLogin.code=='200') {
|
||||||
|
uni.setStorageSync('Padmin-Token', resLogin.data.access_token)
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '单点异常'
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,20 @@
|
|||||||
<view class="video-detail-container">
|
<view class="video-detail-container">
|
||||||
<!-- 视频播放组件 -->
|
<!-- 视频播放组件 -->
|
||||||
<view class="video-wrapper">
|
<view class="video-wrapper">
|
||||||
<video v-if="videoInfo && videoInfo.cover" id="myVideo" :src="videoInfo.currentUrl" :poster="trainVideoImgUrl+ videoInfo.cover" @seeked="onSeeked"
|
<video
|
||||||
|
v-if="videoInfo && videoInfo.cover && isVideoReady"
|
||||||
preload="metadata"
|
id="myVideo"
|
||||||
enable-danmu controls style="width: 100%;" @pause="onPause" @timeupdate="onTimeupdate" @ended="onEnded"></video>
|
:src="videoInfo.currentUrl"
|
||||||
|
:poster="trainVideoImgUrl+ videoInfo.cover"
|
||||||
|
:initial-time="initialTime"
|
||||||
|
:autoplay="shouldAutoPlay"
|
||||||
|
enable-danmu
|
||||||
|
controls
|
||||||
|
style="width: 100%;"
|
||||||
|
@pause="onPause"
|
||||||
|
@timeupdate="onTimeupdate"
|
||||||
|
@ended="onEnded">
|
||||||
|
</video>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="video-info" :style="getItemBackgroundStyle('video-bj2.png')">
|
<view class="video-info" :style="getItemBackgroundStyle('video-bj2.png')">
|
||||||
@@ -134,7 +144,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { inject, reactive,ref, onMounted, onUnmounted, nextTick } from 'vue';
|
import { inject, reactive,ref, onMounted, onUnmounted, nextTick ,watch} from 'vue';
|
||||||
import { onLoad,onHide,onUnload } from '@dcloudio/uni-app';
|
import { onLoad,onHide,onUnload } from '@dcloudio/uni-app';
|
||||||
const { $api, navTo, navBack } = inject('globalFunction');
|
const { $api, navTo, navBack } = inject('globalFunction');
|
||||||
import config from "@/config.js"
|
import config from "@/config.js"
|
||||||
@@ -148,10 +158,13 @@ const trainVideoImgUrl=config.trainVideoImgUrl
|
|||||||
const categories=ref([])
|
const categories=ref([])
|
||||||
const levalLabels=ref([])
|
const levalLabels=ref([])
|
||||||
const latestTime = ref(0)
|
const latestTime = ref(0)
|
||||||
|
const initialTime = ref(0)
|
||||||
const totalTime=ref(0)
|
const totalTime=ref(0)
|
||||||
const baseUrl = config.imgBaseUrl
|
const baseUrl = config.imgBaseUrl
|
||||||
const pageEnterTime = ref(0)
|
const pageEnterTime = ref(0)
|
||||||
const currentChapter = ref(0)
|
const currentChapter = ref(0)
|
||||||
|
const isVideoReady = ref(false)
|
||||||
|
const shouldAutoPlay = ref(false)
|
||||||
const getItemBackgroundStyle = (imageName) => ({
|
const getItemBackgroundStyle = (imageName) => ({
|
||||||
backgroundImage: `url(${baseUrl}/train/${imageName})`,
|
backgroundImage: `url(${baseUrl}/train/${imageName})`,
|
||||||
backgroundSize: '100% 100%', // 覆盖整个容器
|
backgroundSize: '100% 100%', // 覆盖整个容器
|
||||||
@@ -168,18 +181,38 @@ const params = reactive({
|
|||||||
videoId: '',
|
videoId: '',
|
||||||
userId: ''
|
userId: ''
|
||||||
})
|
})
|
||||||
|
// 监听 initialTime 变化,确保设置完成后再渲染
|
||||||
|
watch(initialTime, (newVal) => {
|
||||||
|
if (newVal >= 0 && videoInfo.value && videoInfo.value.cover) {
|
||||||
|
// 延迟渲染,确保初始时间设置生效
|
||||||
|
nextTick(() => {
|
||||||
|
isVideoReady.value = true
|
||||||
|
shouldAutoPlay.value = newVal > 0
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 监听 videoInfo 变化
|
||||||
|
watch([videoInfo, initialTime], ([newVideoInfo, newInitialTime]) => {
|
||||||
|
if (newVideoInfo && newVideoInfo.cover && newInitialTime >= 0) {
|
||||||
|
nextTick(() => {
|
||||||
|
isVideoReady.value = true
|
||||||
|
shouldAutoPlay.value = newInitialTime > 0
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, { deep: true })
|
||||||
onLoad((options) => {
|
onLoad((options) => {
|
||||||
getHeart()
|
getHeart()
|
||||||
pageEnterTime.value = Date.now() // 记录毫秒时间戳
|
pageEnterTime.value = Date.now() // 记录毫秒时间戳
|
||||||
videoId.value=options.id
|
videoId.value=options.id
|
||||||
getDictionary()
|
getDictionary()
|
||||||
});
|
});
|
||||||
onHide(() => {
|
// onHide(() => {
|
||||||
updateVideoInfo() // 用缓存值,不要调 getCurrentTime
|
// updateVideoInfo() // 用缓存值,不要调 getCurrentTime
|
||||||
reportPageDuration()
|
// reportPageDuration()
|
||||||
})
|
// })
|
||||||
onUnload(() => {
|
onUnload(() => {
|
||||||
updateVideoInfo()
|
//updateVideoInfo()
|
||||||
|
saveCurrentChapterProgress()
|
||||||
reportPageDuration()
|
reportPageDuration()
|
||||||
})
|
})
|
||||||
function getData() {
|
function getData() {
|
||||||
@@ -197,17 +230,22 @@ function getData() {
|
|||||||
videoInfo.value.currentUrl=trainVideoImgUrl+videoInfo.value.trainClassList[0].url
|
videoInfo.value.currentUrl=trainVideoImgUrl+videoInfo.value.trainClassList[0].url
|
||||||
videoInfo.value.percentage=((videoInfo.value.process/(videoInfo.value.hour*60))*100).toFixed(2)
|
videoInfo.value.percentage=((videoInfo.value.process/(videoInfo.value.hour*60))*100).toFixed(2)
|
||||||
videoInfo.value.uploadTime=videoInfo.value.uploadTime.split(' ')[0]
|
videoInfo.value.uploadTime=videoInfo.value.uploadTime.split(' ')[0]
|
||||||
|
if(videoInfo.value.process !=null){
|
||||||
|
queryModelUserPlay(videoInfo.value.trainClassList[0].classId)
|
||||||
|
} else {
|
||||||
|
// 如果没有历史进度,直接准备渲染
|
||||||
|
initialTime.value = 0
|
||||||
|
}
|
||||||
|
updateVideoInfo()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function getHeart() {
|
function getHeart() {
|
||||||
const raw = uni.getStorageSync("Padmin-Token");
|
const raw = uni.getStorageSync("Padmin-Token");
|
||||||
const token = typeof raw === "string" ? raw.trim() : "";
|
const token = typeof raw === "string" ? raw.trim() : "";
|
||||||
const headers = token ? { Authorization: raw.startsWith("Bearer ") ? raw : `Bearer ${token}` }: {}
|
const headers = token ? { Authorization: raw.startsWith("Bearer ") ? raw : `Bearer ${token}` }: {};
|
||||||
$api.myRequest("/dashboard/auth/heart", {}, "POST", 10100, headers).then((resData) => {
|
$api.myRequest("/dashboard/auth/heart", {}, "POST", 10100, headers).then((resData) => {
|
||||||
if (resData.code == 200) {
|
if (resData.code == 200) {
|
||||||
getUserInfo();
|
getUserInfo();
|
||||||
} else {
|
|
||||||
navTo('/packageB/login')
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -246,16 +284,18 @@ function getLevelLabelByValue(value) {
|
|||||||
}
|
}
|
||||||
function onPause(e){
|
function onPause(e){
|
||||||
updateVideoInfo()
|
updateVideoInfo()
|
||||||
|
saveCurrentChapterProgress()
|
||||||
}
|
}
|
||||||
function onEnded(e){
|
function onEnded(e){
|
||||||
updateVideoInfo()
|
updateVideoInfo()
|
||||||
|
saveCurrentChapterProgress()
|
||||||
}
|
}
|
||||||
function onTimeupdate(e){
|
function onTimeupdate(e){
|
||||||
latestTime.value = e.detail.currentTime
|
latestTime.value = e.detail.currentTime
|
||||||
}
|
}
|
||||||
function onSeeked(){
|
// function onSeeked(){
|
||||||
updateVideoInfo()
|
// updateVideoInfo()
|
||||||
}
|
// }
|
||||||
// 更新播放时长
|
// 更新播放时长
|
||||||
function updateVideoInfo(){
|
function updateVideoInfo(){
|
||||||
totalTime.value=0
|
totalTime.value=0
|
||||||
@@ -277,7 +317,10 @@ function updateVideoInfo(){
|
|||||||
'Authorization':uni.getStorageSync('Padmin-Token'),
|
'Authorization':uni.getStorageSync('Padmin-Token'),
|
||||||
'Content-Type': "application/x-www-form-urlencoded"
|
'Content-Type': "application/x-www-form-urlencoded"
|
||||||
}
|
}
|
||||||
if(videoInfo.value.isCollect===null && videoInfo.value.process ===null){
|
|
||||||
|
$api.myRequest("/dashboard/auth/heart", {}, "POST", 10100, header).then((resData) => {
|
||||||
|
if (resData.code == 200) {
|
||||||
|
if(videoInfo.value.isCollect===null && videoInfo.value.process ===null && paramsData.process ==0 ){
|
||||||
$api.myRequest('/train/public/videoUser/add', paramsData,'post',9100,header).then((resData) => {
|
$api.myRequest('/train/public/videoUser/add', paramsData,'post',9100,header).then((resData) => {
|
||||||
console.log("视频播放时长更新成功")
|
console.log("视频播放时长更新成功")
|
||||||
});
|
});
|
||||||
@@ -286,6 +329,8 @@ function updateVideoInfo(){
|
|||||||
console.log("视频播放时长更新成功")
|
console.log("视频播放时长更新成功")
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
// 计算并上报停留时长
|
// 计算并上报停留时长
|
||||||
function reportPageDuration() {
|
function reportPageDuration() {
|
||||||
@@ -309,8 +354,58 @@ function reportPageDuration() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
function chapterChange(video,index){
|
function chapterChange(video,index){
|
||||||
|
saveCurrentChapterProgress()
|
||||||
currentChapter.value=index
|
currentChapter.value=index
|
||||||
videoInfo.value.currentUrl=trainVideoImgUrl+video.url
|
videoInfo.value.currentUrl=trainVideoImgUrl+video.url
|
||||||
|
isVideoReady.value = false
|
||||||
|
shouldAutoPlay.value = false
|
||||||
|
queryModelUserPlay(video.classId)
|
||||||
|
}
|
||||||
|
const updateUserPlayClassHousr = (classId,hour) => {
|
||||||
|
let paramsData={
|
||||||
|
userId:userId.value,
|
||||||
|
classId:classId,
|
||||||
|
hour:hour,
|
||||||
|
dqHour:latestTime.value
|
||||||
|
}
|
||||||
|
let header={
|
||||||
|
'Authorization':uni.getStorageSync('Padmin-Token'),
|
||||||
|
'Content-Type': "application/x-www-form-urlencoded"
|
||||||
|
}
|
||||||
|
$api.myRequest('/train/public/videoUser/updateUserPlayClassHousr', paramsData,'post',9100,header).then((resData) => {
|
||||||
|
if(resData.code == 200){
|
||||||
|
console.log("学习时长更新成功")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const queryModelUserPlay = (classId) => {
|
||||||
|
let queryParams = {
|
||||||
|
classId: classId,
|
||||||
|
userId: userId.value,
|
||||||
|
};
|
||||||
|
let header = {
|
||||||
|
Authorization: uni.getStorageSync("Padmin-Token"),
|
||||||
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
};
|
||||||
|
$api.myRequest("/train/public/videoUser/modelUserPlay", queryParams, "post", 9100, header).then((resData) => {
|
||||||
|
if(resData.code == 200){
|
||||||
|
initialTime.value=Number(resData?.data?.dqHour ?? 0)
|
||||||
|
}else {
|
||||||
|
initialTime.value = 0
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
initialTime.value = 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存当前章节进度
|
||||||
|
function saveCurrentChapterProgress() {
|
||||||
|
if (videoInfo.value.trainClassList && videoInfo.value.trainClassList.length > 0) {
|
||||||
|
const currentVideo = videoInfo.value.trainClassList[currentChapter.value];
|
||||||
|
if (currentVideo) {
|
||||||
|
updateUserPlayClassHousr(currentVideo.classId, currentVideo.hour);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,8 @@ const getItemBackgroundStyle = (imageName) => ({
|
|||||||
});
|
});
|
||||||
const trainVideoImgUrl=config.trainVideoImgUrl
|
const trainVideoImgUrl=config.trainVideoImgUrl
|
||||||
|
|
||||||
onLoad(() => {
|
onLoad(async () => {
|
||||||
|
await thirdLogin()
|
||||||
getDataList('refresh');
|
getDataList('refresh');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -135,8 +136,53 @@ function getDataList(type = 'add') {
|
|||||||
|
|
||||||
|
|
||||||
// 播放视频
|
// 播放视频
|
||||||
function playVideo(video) {
|
async function playVideo(video) {
|
||||||
|
if(await thirdLogin()){
|
||||||
navTo(`/packageB/train/video/videoDetail?id=${video.videoId}`);
|
navTo(`/packageB/train/video/videoDetail?id=${video.videoId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function thirdLogin(){
|
||||||
|
let form={}
|
||||||
|
if (uni.getStorageSync('userInfo').isCompanyUser=='1') {
|
||||||
|
form={
|
||||||
|
usertype: '1',
|
||||||
|
idno: uni.getStorageSync('userInfo').idCard,
|
||||||
|
name: uni.getStorageSync('userInfo').name,
|
||||||
|
enterprisecode:"",
|
||||||
|
enterprisename: "",
|
||||||
|
contactperson: "",
|
||||||
|
contactphone: "",
|
||||||
|
}
|
||||||
|
}else if (uni.getStorageSync('userInfo').isCompanyUser=='0') {
|
||||||
|
form={
|
||||||
|
usertype: "2",
|
||||||
|
enterprisecode: uni.getStorageSync('userInfo').idCard,
|
||||||
|
enterprisename: uni.getStorageSync('userInfo').name,
|
||||||
|
contactperson: "",
|
||||||
|
contactphone: "",
|
||||||
|
idno: "",
|
||||||
|
name: ""
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '请先登录'
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var resLogin = await $api.myRequest('/auth/login2/ks',form,'post',10100);
|
||||||
|
if (resLogin.code=='200') {
|
||||||
|
uni.setStorageSync('Padmin-Token', resLogin.data.access_token)
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '单点异常'
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
* @Date: 2025-10-16 15:15:47
|
* @Date: 2025-10-16 15:15:47
|
||||||
* @LastEditors: lip
|
* @LastEditors: shirlwang
|
||||||
* @LastEditTime: 2025-11-19 18:22:34
|
* @LastEditTime: 2025-12-08 16:10:47
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
<!-- @scroll="handleScroll" @scrolltolower="scrollBottom" -->
|
<!-- @scroll="handleScroll" @scrolltolower="scrollBottom" -->
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
<view class="title-item active"><view>政策专区</view></view>
|
<view class="title-item active"><view>政策专区</view></view>
|
||||||
<view @click="toPolicyList">{{'查看更多 >'}}</view>
|
<view @click="toPolicyList">{{'查看更多 >'}}</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(item, index) in policyList" :key="index" class="job-list" @click="toPolicyDetail">
|
<view v-for="(item, index) in policyList" :key="index" class="job-list" @click="toPolicyDetail(item)">
|
||||||
<view class="sign">推荐</view>
|
<view class="sign">推荐</view>
|
||||||
<view class="title">
|
<view class="title">
|
||||||
<image src="../../../packageRc/static/zcLeft.png"/>
|
<image src="../../../packageRc/static/zcLeft.png"/>
|
||||||
@@ -100,7 +100,7 @@ function getPolicy() {
|
|||||||
function toPolicyList() {
|
function toPolicyList() {
|
||||||
navTo(`/packageRc/pages/policy/policyList`)
|
navTo(`/packageRc/pages/policy/policyList`)
|
||||||
}
|
}
|
||||||
function toPolicyDetail() {
|
function toPolicyDetail(item) {
|
||||||
navTo(`/packageRc/pages/policy/policyDetail?id=${item.id}`)
|
navTo(`/packageRc/pages/policy/policyDetail?id=${item.id}`)
|
||||||
}
|
}
|
||||||
let activeTab = ref(1)
|
let activeTab = ref(1)
|
||||||
|
|||||||
@@ -132,7 +132,7 @@
|
|||||||
});
|
});
|
||||||
const baseUrl = config.imgBaseUrl;
|
const baseUrl = config.imgBaseUrl;
|
||||||
|
|
||||||
onLoad(() => {
|
onLoad(async () => {
|
||||||
// const today = new Date();
|
// const today = new Date();
|
||||||
// const year = today.getFullYear();
|
// const year = today.getFullYear();
|
||||||
// const month = String(today.getMonth() + 1).padStart(2, '0');
|
// const month = String(today.getMonth() + 1).padStart(2, '0');
|
||||||
@@ -149,7 +149,51 @@
|
|||||||
onShow(() => {
|
onShow(() => {
|
||||||
// 更新自定义tabbar选中状态
|
// 更新自定义tabbar选中状态
|
||||||
tabbarManager.updateSelected(1);
|
tabbarManager.updateSelected(1);
|
||||||
});
|
});//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async function thirdLogin(){
|
||||||
|
let form={}
|
||||||
|
if (uni.getStorageSync('userInfo').isCompanyUser=='1') {
|
||||||
|
form={
|
||||||
|
usertype: '1',
|
||||||
|
idno: uni.getStorageSync('userInfo').idCard,
|
||||||
|
name: uni.getStorageSync('userInfo').name,
|
||||||
|
enterprisecode:"",
|
||||||
|
enterprisename: "",
|
||||||
|
contactperson: "",
|
||||||
|
contactphone: "",
|
||||||
|
}
|
||||||
|
}else if (uni.getStorageSync('userInfo').isCompanyUser=='0') {
|
||||||
|
form={
|
||||||
|
usertype: "2",
|
||||||
|
enterprisecode: uni.getStorageSync('userInfo').idCard,
|
||||||
|
enterprisename: uni.getStorageSync('userInfo').name,
|
||||||
|
contactperson: "",
|
||||||
|
contactphone: "",
|
||||||
|
idno: "",
|
||||||
|
name: ""
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '请先登录'
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var resLogin = await $api.myRequest('/auth/login2/ks',form,'post',10100);
|
||||||
|
if (resLogin.code=='200') {
|
||||||
|
uni.setStorageSync('Padmin-Token', resLogin.data.access_token)
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '单点异常'
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 监听退出登录事件,显示微信登录弹窗
|
// 监听退出登录事件,显示微信登录弹窗
|
||||||
@@ -168,7 +212,8 @@
|
|||||||
// 可以在这里添加登录成功后的处理逻辑
|
// 可以在这里添加登录成功后的处理逻辑
|
||||||
};
|
};
|
||||||
|
|
||||||
function goDetail(jobFairId){
|
async function goDetail(jobFairId){
|
||||||
|
if(await thirdLogin()){
|
||||||
if(state.current != 3){
|
if(state.current != 3){
|
||||||
navTo('/packageA/pages/exhibitors/exhibitors?jobFairId=' + jobFairId)
|
navTo('/packageA/pages/exhibitors/exhibitors?jobFairId=' + jobFairId)
|
||||||
}else{
|
}else{
|
||||||
@@ -182,6 +227,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function toSelectDate() {
|
function toSelectDate() {
|
||||||
navTo("/packageA/pages/selectDate/selectDate", {
|
navTo("/packageA/pages/selectDate/selectDate", {
|
||||||
@@ -257,7 +303,6 @@
|
|||||||
getUser();
|
getUser();
|
||||||
} else {
|
} else {
|
||||||
isLogin.value = false;
|
isLogin.value = false;
|
||||||
$api.msg('请先登录')
|
|
||||||
getFair("refresh");
|
getFair("refresh");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,9 +25,7 @@
|
|||||||
<view class="company-info">
|
<view class="company-info">
|
||||||
<view class="company-name">{{ companyInfo.name || '企业名称' }}</view>
|
<view class="company-name">{{ companyInfo.name || '企业名称' }}</view>
|
||||||
<view class="company-details">
|
<view class="company-details">
|
||||||
<text class="industry">{{ companyInfo.industry || '互联网' }}</text>
|
<text class="size">企业规模: {{ getDictLabel('scale', companyInfo.scale) || '暂无规模数据' }}</text>
|
||||||
<text class="separator">·</text>
|
|
||||||
<text class="size">{{ companyInfo.scale || '100-999人' }}</text>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -95,12 +93,7 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="service-title">服务指导</view>
|
<view class="service-title">服务指导</view>
|
||||||
</view>
|
</view>
|
||||||
// <view class="service-item press-button" @click="handleServiceClick('public-recruitment')">
|
|
||||||
// <view class="service-icon service-icon-2">
|
|
||||||
// <IconfontIcon name="zhengfulou" :size="48" color="#FFFFFF" />
|
|
||||||
// </view>
|
|
||||||
// <view class="service-title">事业单位招录</view>
|
|
||||||
// </view>
|
|
||||||
<view class="service-item press-button" @click="handleServiceClick('resume-creation')">
|
<view class="service-item press-button" @click="handleServiceClick('resume-creation')">
|
||||||
<view class="service-icon service-icon-3">
|
<view class="service-icon service-icon-3">
|
||||||
<IconfontIcon name="jianli" :size="48" color="#FFFFFF" />
|
<IconfontIcon name="jianli" :size="48" color="#FFFFFF" />
|
||||||
@@ -111,7 +104,7 @@
|
|||||||
<view class="service-icon service-icon-4">
|
<view class="service-icon service-icon-4">
|
||||||
<IconfontIcon name="zhengce" :size="48" color="#FFFFFF" />
|
<IconfontIcon name="zhengce" :size="48" color="#FFFFFF" />
|
||||||
</view>
|
</view>
|
||||||
<view class="service-title">劳动政策指引</view>
|
<view class="service-title">政策指引</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="service-item press-button" @click="handleServiceClick('skill-training')">
|
<view class="service-item press-button" @click="handleServiceClick('skill-training')">
|
||||||
<view class="service-icon service-icon-5">
|
<view class="service-icon service-icon-5">
|
||||||
@@ -161,6 +154,12 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="service-title">薪酬信息</view>
|
<view class="service-title">薪酬信息</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="service-item press-button" @click="handleJobFairClick">
|
||||||
|
<view class="service-icon service-icon-1">
|
||||||
|
<uni-icons type="shop" size="32" color="#FFFFFF"></uni-icons>
|
||||||
|
</view>
|
||||||
|
<view class="service-title">招聘会</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- #endif -->
|
<!-- #endif -->
|
||||||
</view>
|
</view>
|
||||||
@@ -521,7 +520,7 @@ const shouldShowCompanyContent = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
import useDictStore from '@/stores/useDictStore';
|
import useDictStore from '@/stores/useDictStore';
|
||||||
const { getTransformChildren, oneDictData } = useDictStore();
|
const { getTransformChildren, oneDictData, dictLabel: getDictLabel, industryLabel } = useDictStore();
|
||||||
import useLocationStore from '@/stores/useLocationStore';
|
import useLocationStore from '@/stores/useLocationStore';
|
||||||
import selectFilter from '@/components/selectFilter/selectFilter.vue';
|
import selectFilter from '@/components/selectFilter/selectFilter.vue';
|
||||||
import { useRecommedIndexedDBStore, jobRecommender } from '@/stores/useRecommedIndexedDBStore.js';
|
import { useRecommedIndexedDBStore, jobRecommender } from '@/stores/useRecommedIndexedDBStore.js';
|
||||||
@@ -767,6 +766,9 @@ const handleLiveClick = () => {
|
|||||||
const handleSalaryInfoClick = () => {
|
const handleSalaryInfoClick = () => {
|
||||||
navTo('/pages/service/salary-info');
|
navTo('/pages/service/salary-info');
|
||||||
};
|
};
|
||||||
|
const handleJobFairClick = () => {
|
||||||
|
navTo('/pages/careerfair/careerfair');
|
||||||
|
};
|
||||||
const handleH5SalaryClick = () => {
|
const handleH5SalaryClick = () => {
|
||||||
const salaryUrl = "https://www.mohrss.gov.cn/SYrlzyhshbzb/laodongguanxi_/fwyd/202506/t20250627_544623.html";
|
const salaryUrl = "https://www.mohrss.gov.cn/SYrlzyhshbzb/laodongguanxi_/fwyd/202506/t20250627_544623.html";
|
||||||
window.location.assign(salaryUrl);
|
window.location.assign(salaryUrl);
|
||||||
@@ -861,7 +863,7 @@ function navToService(serviceType) {
|
|||||||
'service-guidance': '/pages/service/guidance',
|
'service-guidance': '/pages/service/guidance',
|
||||||
'public-recruitment': '/pages/service/public-recruitment',
|
'public-recruitment': '/pages/service/public-recruitment',
|
||||||
'resume-creation': '/pages/resume-guide/resume-guide',
|
'resume-creation': '/pages/resume-guide/resume-guide',
|
||||||
'labor-policy': '/pages/service/labor-policy',
|
'labor-policy': '/packageRc/pages/policy/policyList',
|
||||||
'skill-training': '/packageB/train/video/videoList',
|
'skill-training': '/packageB/train/video/videoList',
|
||||||
'skill-evaluation': '/packageB/train/index',
|
'skill-evaluation': '/packageB/train/index',
|
||||||
// 'skill-evaluation': '/pages/service/skill-evaluation',
|
// 'skill-evaluation': '/pages/service/skill-evaluation',
|
||||||
@@ -1070,7 +1072,6 @@ import storeRc from '@/utilsRc/store/index.js';
|
|||||||
function goRc(){
|
function goRc(){
|
||||||
if (checkLogin()) {
|
if (checkLogin()) {
|
||||||
let userInfo = uni.getStorageSync('userInfo')
|
let userInfo = uni.getStorageSync('userInfo')
|
||||||
console.log(uni.getStorageSync('userInfo'), "uni.getStorageSync('userInfo')");
|
|
||||||
storeRc.dispatch('LoginByUserInfo', userInfo).then(res => {
|
storeRc.dispatch('LoginByUserInfo', userInfo).then(res => {
|
||||||
// console.log(res, "'res");
|
// console.log(res, "'res");
|
||||||
navTo('/packageRc/pages/index/index');
|
navTo('/packageRc/pages/index/index');
|
||||||
|
|||||||
@@ -216,6 +216,14 @@
|
|||||||
v-model="contact.name"
|
v-model="contact.name"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="form-group">
|
||||||
|
<view class="label">职位</view>
|
||||||
|
<input
|
||||||
|
class="input"
|
||||||
|
placeholder="请输入职位"
|
||||||
|
v-model="contact.position"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
<view class="form-group">
|
<view class="form-group">
|
||||||
<view class="label">联系电话</view>
|
<view class="label">联系电话</view>
|
||||||
<input
|
<input
|
||||||
@@ -280,6 +288,7 @@ const formData = reactive({
|
|||||||
contacts: [
|
contacts: [
|
||||||
{
|
{
|
||||||
name: '',
|
name: '',
|
||||||
|
position: '',
|
||||||
phone: ''
|
phone: ''
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -504,6 +513,7 @@ const addContact = () => {
|
|||||||
if (formData.contacts.length < 3) {
|
if (formData.contacts.length < 3) {
|
||||||
formData.contacts.push({
|
formData.contacts.push({
|
||||||
name: '',
|
name: '',
|
||||||
|
position: '',
|
||||||
phone: ''
|
phone: ''
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -653,7 +663,11 @@ const publishJob = async () => {
|
|||||||
jobCategory: formData.jobCategory,
|
jobCategory: formData.jobCategory,
|
||||||
companyId: formData.companyId,
|
companyId: formData.companyId,
|
||||||
companyName: formData.companyName,
|
companyName: formData.companyName,
|
||||||
jobContactList: formData.contacts.filter(contact => contact.name.trim() && contact.phone.trim()),
|
jobContactList: formData.contacts.filter(contact => contact.name.trim() && contact.phone.trim()).map(contact => ({
|
||||||
|
contactPerson: contact.name,
|
||||||
|
contactPersonPhone: contact.phone,
|
||||||
|
position: contact.position
|
||||||
|
})),
|
||||||
filesList: formData.images.map(image => ({ bussinessid: image.bussinessid })) // 新增:岗位图片列表,使用bussinessid
|
filesList: formData.images.map(image => ({ bussinessid: image.bussinessid })) // 新增:岗位图片列表,使用bussinessid
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -193,7 +193,8 @@ const handleLogin = async () => {
|
|||||||
title: '登录成功',
|
title: '登录成功',
|
||||||
icon: 'success'
|
icon: 'success'
|
||||||
})
|
})
|
||||||
window.location.assign('http://222.80.110.161:11111/mechine-dual-vue/login')
|
// window.location.assign('http://222.80.110.161:11111/mechine-dual-vue/login')
|
||||||
|
window.location.assign('http://222.80.110.161:11111/mechine-single-vue/login')
|
||||||
// // 跳转到首页
|
// // 跳转到首页
|
||||||
// uni.reLaunch({
|
// uni.reLaunch({
|
||||||
// url: '/pages/index/index'
|
// url: '/pages/index/index'
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, inject, nextTick, onMounted } from 'vue';
|
import { ref, inject, nextTick, onMounted } from 'vue';
|
||||||
import { onLoad } from '@dcloudio/uni-app';
|
import { onLoad, onShow } from '@dcloudio/uni-app';
|
||||||
import { appUserInfo } from '@/apiRc/user/user.js';
|
import { appUserInfo } from '@/apiRc/user/user.js';
|
||||||
import RemindPopup from './components/RemindPopup.vue';
|
import RemindPopup from './components/RemindPopup.vue';
|
||||||
import PageHeader from './components/PageHeader.vue';
|
import PageHeader from './components/PageHeader.vue';
|
||||||
@@ -143,6 +143,11 @@ function openRemindPopup() {
|
|||||||
|
|
||||||
// 检查用户是否完善了个人信息(调用接口获取)
|
// 检查用户是否完善了个人信息(调用接口获取)
|
||||||
let hasCheckedRemindInfo = false;
|
let hasCheckedRemindInfo = false;
|
||||||
|
// 保存缺失信息的标识
|
||||||
|
const missingInfo = ref({
|
||||||
|
hasJobInfo: false,
|
||||||
|
hasSkills: false
|
||||||
|
});
|
||||||
|
|
||||||
async function getRemindInfo() {
|
async function getRemindInfo() {
|
||||||
if (hasCheckedRemindInfo) {
|
if (hasCheckedRemindInfo) {
|
||||||
@@ -186,6 +191,10 @@ async function getRemindInfo() {
|
|||||||
return skillName && skillName.trim() !== '';
|
return skillName && skillName.trim() !== '';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 保存缺失信息标识(只保存职位信息和技能标签,身份证信息跳转到个人信息页面)
|
||||||
|
missingInfo.value.hasJobInfo = hasJobInfo;
|
||||||
|
missingInfo.value.hasSkills = hasSkills;
|
||||||
|
|
||||||
// 判断信息是否完整(idCard、职位信息、技能标签都必须有)
|
// 判断信息是否完整(idCard、职位信息、技能标签都必须有)
|
||||||
const isComplete = hasIdCard && hasJobInfo && hasSkills;
|
const isComplete = hasIdCard && hasJobInfo && hasSkills;
|
||||||
|
|
||||||
@@ -250,6 +259,10 @@ async function getRemindInfo() {
|
|||||||
return skillName && skillName.trim() !== '';
|
return skillName && skillName.trim() !== '';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 保存缺失信息标识
|
||||||
|
missingInfo.value.hasJobInfo = hasJobInfo;
|
||||||
|
missingInfo.value.hasSkills = hasSkills;
|
||||||
|
|
||||||
// 判断信息是否完整(idCard、职位信息、技能标签都必须有)
|
// 判断信息是否完整(idCard、职位信息、技能标签都必须有)
|
||||||
const isComplete = hasIdCard && hasJobInfo && hasSkills;
|
const isComplete = hasIdCard && hasJobInfo && hasSkills;
|
||||||
|
|
||||||
@@ -299,8 +312,25 @@ function handleCancel() {
|
|||||||
async function handleConfirm() {
|
async function handleConfirm() {
|
||||||
remindPopup.value?.close();
|
remindPopup.value?.close();
|
||||||
|
|
||||||
// 跳转到完善信息页面
|
const { hasJobInfo, hasSkills } = missingInfo.value;
|
||||||
navTo('/pages/complete-info/complete-info');
|
|
||||||
|
// 如果同时缺少职位信息和技能标签:先跳转到职位信息页面,并传递参数表示完成后需要继续跳转到技能页面
|
||||||
|
if (!hasJobInfo && !hasSkills) {
|
||||||
|
// 跳转到职位信息页面,传递参数表示完成后需要继续跳转到技能页面
|
||||||
|
navTo('/packageA/pages/jobExpect/jobExpect?needSkill=true');
|
||||||
|
}
|
||||||
|
// 如果只缺少技能标签:直接跳转到技能页面(个人信息页面的技能部分)
|
||||||
|
else if (!hasSkills) {
|
||||||
|
navTo('/packageA/pages/personalInfo/personalInfo');
|
||||||
|
}
|
||||||
|
// 如果只缺少职位信息:直接跳转到职位信息页面
|
||||||
|
else if (!hasJobInfo) {
|
||||||
|
navTo('/packageA/pages/jobExpect/jobExpect');
|
||||||
|
}
|
||||||
|
// 如果只缺少身份证信息:跳转到个人信息页面
|
||||||
|
else {
|
||||||
|
navTo('/packageA/pages/personalInfo/personalInfo');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 切换tab
|
// 切换tab
|
||||||
@@ -483,6 +513,14 @@ onLoad(() => {
|
|||||||
getRemindInfo();
|
getRemindInfo();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onShow(() => {
|
||||||
|
// 返回本页后,如果之前因为信息缺失未展示内容,则重新检查
|
||||||
|
if (!showContent.value) {
|
||||||
|
hasCheckedRemindInfo = false;
|
||||||
|
getRemindInfo();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (remindList.value.length > 0 && !showContent.value) {
|
if (remindList.value.length > 0 && !showContent.value) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
|||||||
@@ -157,7 +157,7 @@
|
|||||||
<text>在职位详情页面点击右上角的收藏按钮,即可将职位添加到收藏夹。</text>
|
<text>在职位详情页面点击右上角的收藏按钮,即可将职位添加到收藏夹。</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="faq-item">
|
<!-- <view class="faq-item">
|
||||||
<view class="faq-question">
|
<view class="faq-question">
|
||||||
<uni-icons type="right" size="18" color="#256BFA"></uni-icons>
|
<uni-icons type="right" size="18" color="#256BFA"></uni-icons>
|
||||||
<text>如何联系客服?</text>
|
<text>如何联系客服?</text>
|
||||||
@@ -165,7 +165,7 @@
|
|||||||
<view class="faq-answer">
|
<view class="faq-answer">
|
||||||
<text>如果您在使用过程中遇到问题,可以在"我的"页面找到"联系客服"入口,或拨打客服热线。</text>
|
<text>如果您在使用过程中遇到问题,可以在"我的"页面找到"联系客服"入口,或拨打客服热线。</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view> -->
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|||||||
@@ -246,10 +246,10 @@ export function myRequest(url, data = {}, method = 'GET', port = 9100, headers =
|
|||||||
}
|
}
|
||||||
// 显示具体的错误信息
|
// 显示具体的错误信息
|
||||||
const errorMsg = msg || '请求出现异常,请联系工作人员'
|
const errorMsg = msg || '请求出现异常,请联系工作人员'
|
||||||
uni.showToast({
|
// uni.showToast({
|
||||||
title: errorMsg,
|
// title: errorMsg,
|
||||||
icon: 'none'
|
// icon: 'none'
|
||||||
})
|
// })
|
||||||
const err = new Error(errorMsg)
|
const err = new Error(errorMsg)
|
||||||
err.error = resData
|
err.error = resData
|
||||||
reject(err)
|
reject(err)
|
||||||
|
|||||||
Reference in New Issue
Block a user