修改
@@ -2,7 +2,8 @@ import useUserStore from "../stores/useUserStore";
|
|||||||
import {
|
import {
|
||||||
request,
|
request,
|
||||||
createRequest,
|
createRequest,
|
||||||
uploadFile
|
uploadFile,
|
||||||
|
myRequest
|
||||||
} from "../utils/request";
|
} from "../utils/request";
|
||||||
import streamRequest, {
|
import streamRequest, {
|
||||||
chatRequest
|
chatRequest
|
||||||
@@ -885,7 +886,8 @@ export const $api = {
|
|||||||
uploadFile,
|
uploadFile,
|
||||||
formatFileSize,
|
formatFileSize,
|
||||||
sendingMiniProgramMessage,
|
sendingMiniProgramMessage,
|
||||||
copyText
|
copyText,
|
||||||
|
myRequest
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -916,4 +918,4 @@ export default {
|
|||||||
insertSortData,
|
insertSortData,
|
||||||
isInWechatMiniProgramWebview,
|
isInWechatMiniProgramWebview,
|
||||||
isEmptyObject,
|
isEmptyObject,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
export default {
|
export default {
|
||||||
// baseUrl: 'http://39.98.44.136:8080', // 测试
|
// baseUrl: 'http://39.98.44.136:8080', // 测试
|
||||||
baseUrl: 'http://ks.zhaopinzao8dian.com/api/ks', // 测试
|
baseUrl: 'http://ks.zhaopinzao8dian.com/api/ks', // 测试
|
||||||
|
|
||||||
|
LCBaseUrl:'http://10.110.145.145:9100',//招聘、培训、帮扶
|
||||||
|
LCBaseUrlInner:'http://10.110.145.145:10100',//内网端口
|
||||||
// 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',
|
||||||
@@ -70,4 +73,4 @@ export default {
|
|||||||
desc: '融合海量岗位、智能简历匹配、竞争力分析,助你精准锁定理想职位!',
|
desc: '融合海量岗位、智能简历匹配、竞争力分析,助你精准锁定理想职位!',
|
||||||
imgUrl: 'https://qd.zhaopinzao8dian.com/file/csn/qd_shareLogo.jpg',
|
imgUrl: 'https://qd.zhaopinzao8dian.com/file/csn/qd_shareLogo.jpg',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,320 +1,329 @@
|
|||||||
<template>
|
<template>
|
||||||
<AppLayout title="" :use-scroll-view="false">
|
<AppLayout title="" :use-scroll-view="false">
|
||||||
<template #headerleft>
|
<template #headerleft>
|
||||||
<view class="btnback">
|
<view class="btnback">
|
||||||
<image src="@/static/icon/back.png" @click="navBack"></image>
|
<image src="@/static/icon/back.png" @click="navBack"></image>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<template #headerright>
|
<template #headerright>
|
||||||
<view class="btn mar_ri10">
|
<view class="btn mar_ri10">
|
||||||
<image
|
<image
|
||||||
src="@/static/icon/collect3.png"
|
src="@/static/icon/collect3.png"
|
||||||
v-if="!companyInfo.isCollection"
|
v-if="!companyInfo.isCollection"
|
||||||
@click="companyCollection"
|
></image>
|
||||||
></image>
|
<image src="@/static/icon/collect2.png" v-else></image>
|
||||||
<image src="@/static/icon/collect2.png" v-else @click="companyCollection"></image>
|
</view>
|
||||||
</view>
|
</template>
|
||||||
</template>
|
<view class="content">
|
||||||
<view class="content">
|
<view class="content-top">
|
||||||
<view class="content-top">
|
<view class="companyinfo-left">
|
||||||
<view class="companyinfo-left">
|
<image src="@/static/icon/companyIcon.png" mode=""></image>
|
||||||
<image src="@/static/icon/companyIcon.png" mode=""></image>
|
|
||||||
</view>
|
|
||||||
<view class="companyinfo-right">
|
|
||||||
<view class="row1">{{ companyInfo?.name }}</view>
|
|
||||||
<view class="row2">
|
|
||||||
<dict-tree-Label
|
|
||||||
v-if="companyInfo?.industry"
|
|
||||||
dictType="industry"
|
|
||||||
:value="companyInfo?.industry"
|
|
||||||
></dict-tree-Label>
|
|
||||||
<span v-if="companyInfo?.industry"> </span>
|
|
||||||
<dict-Label dictType="scale" :value="companyInfo?.scale"></dict-Label>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="conetent-info" :class="{ expanded: isExpanded }">
|
|
||||||
<view class="info-title">公司介绍</view>
|
|
||||||
<view class="info-desirption">{{ companyInfo.description }}</view>
|
|
||||||
<!-- <view class="info-title title2">公司地址</view>
|
|
||||||
<view class="locationCompany"></view> -->
|
|
||||||
</view>
|
|
||||||
<view class="expand" @click="expand">
|
|
||||||
<text>{{ isExpanded ? '收起' : '展开' }}</text>
|
|
||||||
<image
|
|
||||||
class="expand-img"
|
|
||||||
:class="{ 'expand-img-active': !isExpanded }"
|
|
||||||
src="@/static/icon/downs.png"
|
|
||||||
></image>
|
|
||||||
</view>
|
|
||||||
<scroll-view scroll-y class="Detailscroll-view" @scrolltolower="getJobsList('add')">
|
|
||||||
<view class="views">
|
|
||||||
<view class="Detail-title"><text class="title">在招职位</text></view>
|
|
||||||
<renderJobs
|
|
||||||
v-if="pageState.list.length"
|
|
||||||
:list="pageState.list"
|
|
||||||
:longitude="longitudeVal"
|
|
||||||
:latitude="latitudeVal"
|
|
||||||
></renderJobs>
|
|
||||||
<empty v-else pdTop="200"></empty>
|
|
||||||
</view>
|
|
||||||
</scroll-view>
|
|
||||||
</view>
|
</view>
|
||||||
</AppLayout>
|
<view class="companyinfo-right">
|
||||||
|
<view class="row1">{{ companyInfo?.companyName }}</view>
|
||||||
|
<view class="row2">
|
||||||
|
{{ companyInfo?.scale }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="conetent-info" :class="{ expanded: isExpanded }">
|
||||||
|
<view class="info-title">公司介绍</view>
|
||||||
|
<view class="info-desirption">{{
|
||||||
|
companyInfo.companyIntroduction
|
||||||
|
}}</view>
|
||||||
|
<!-- <view class="info-title title2">公司地址</view>
|
||||||
|
<view class="locationCompany"></view> -->
|
||||||
|
</view>
|
||||||
|
<view class="expand" @click="expand">
|
||||||
|
<text>{{ isExpanded ? "收起" : "展开" }}</text>
|
||||||
|
<image
|
||||||
|
class="expand-img"
|
||||||
|
:class="{ 'expand-img-active': !isExpanded }"
|
||||||
|
src="@/static/icon/downs.png"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
<scroll-view scroll-y class="Detailscroll-view">
|
||||||
|
<view class="views">
|
||||||
|
<view class="Detail-title"><text class="title">在招职位</text></view>
|
||||||
|
<template v-if="companyInfo.jobInfoList.length != 0">
|
||||||
|
<view v-for="job in companyInfo.jobInfoList" :key="job.id">
|
||||||
|
<view class="cards" @click="navTo(`/packageA/pages/post/post?jobId=${JSON.stringify(job)}`)">
|
||||||
|
<view class="card-company">
|
||||||
|
<text class="company">{{ job.jobTitle }}</text>
|
||||||
|
<view class="salary"> {{ job.salaryRange }}元 </view>
|
||||||
|
</view>
|
||||||
|
<view class="card-companyName">{{ job.companyName }}</view>
|
||||||
|
<view class="card-companyName">{{ job.jobDescription }}</view>
|
||||||
|
<view class="card-tags">
|
||||||
|
<view class="tag">
|
||||||
|
{{ job.educationRequirement }}
|
||||||
|
</view>
|
||||||
|
<view class="tag">
|
||||||
|
{{ job.experienceRequirement }}
|
||||||
|
</view>
|
||||||
|
<!-- <view class="tag">
|
||||||
|
{{ vacanciesTo(job.vacancies) }}
|
||||||
|
</view> -->
|
||||||
|
<view class="tag" v-if="job.jobRequirement">
|
||||||
|
{{ job.jobRequirement }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="card-bottom">
|
||||||
|
<view>{{ job.postingDate }}</view>
|
||||||
|
<view>
|
||||||
|
<convert-distance
|
||||||
|
:alat="job.latitude"
|
||||||
|
:along="job.longitude"
|
||||||
|
:blat="latitude"
|
||||||
|
:blong="longitude"
|
||||||
|
></convert-distance>
|
||||||
|
<dict-Label
|
||||||
|
class="mar_le10"
|
||||||
|
dictType="area"
|
||||||
|
:value="job.jobLocationAreaCode"
|
||||||
|
></dict-Label>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<empty v-else pdTop="200"></empty>
|
||||||
|
</view>
|
||||||
|
</scroll-view>
|
||||||
|
</view>
|
||||||
|
</AppLayout>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import point from '@/static/icon/point.png';
|
import point from "@/static/icon/point.png";
|
||||||
import { reactive, inject, watch, ref, onMounted, computed } from 'vue';
|
import { reactive, inject, watch, ref, onMounted, computed } from "vue";
|
||||||
import { onLoad, onShow } from '@dcloudio/uni-app';
|
import { onLoad, onShow } from "@dcloudio/uni-app";
|
||||||
import dictLabel from '@/components/dict-Label/dict-Label.vue';
|
import dictLabel from "@/components/dict-Label/dict-Label.vue";
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from "pinia";
|
||||||
import useLocationStore from '@/stores/useLocationStore';
|
import useLocationStore from "@/stores/useLocationStore";
|
||||||
const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore());
|
const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore());
|
||||||
const { $api, navTo, vacanciesTo, navBack } = inject('globalFunction');
|
const { $api, navTo, vacanciesTo, navBack } = inject("globalFunction");
|
||||||
|
|
||||||
const isExpanded = ref(false);
|
const isExpanded = ref(false);
|
||||||
const pageState = reactive({
|
const pageState = reactive({
|
||||||
page: 0,
|
page: 0,
|
||||||
list: [],
|
list: [],
|
||||||
total: 0,
|
total: 0,
|
||||||
maxPage: 1,
|
maxPage: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
});
|
});
|
||||||
const companyInfo = ref({});
|
const companyInfo = ref({});
|
||||||
|
|
||||||
onLoad((options) => {
|
onLoad((options) => {
|
||||||
console.log(options);
|
companyInfo.value = JSON.parse(options.job);
|
||||||
getCompanyInfo(options.companyId || options.bussinessId);
|
console.log(companyInfo.value, "companyInfo.value");
|
||||||
});
|
});
|
||||||
|
|
||||||
function companyCollection() {
|
|
||||||
const companyId = companyInfo.value.companyId;
|
|
||||||
if (companyInfo.value.isCollection) {
|
|
||||||
$api.createRequest(`/app/company/collection/${companyId}`, {}, 'DELETE').then((resData) => {
|
|
||||||
getCompanyInfo(companyId);
|
|
||||||
$api.msg('取消收藏成功');
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
$api.createRequest(`/app/company/collection/${companyId}`, {}, 'POST').then((resData) => {
|
|
||||||
getCompanyInfo(companyId);
|
|
||||||
$api.msg('收藏成功');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCompanyInfo(id) {
|
|
||||||
$api.createRequest(`/app/company/${id}`).then((resData) => {
|
|
||||||
companyInfo.value = resData.data;
|
|
||||||
getJobsList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getJobsList(type = 'add') {
|
|
||||||
if (type === 'refresh') {
|
|
||||||
pageState.page = 1;
|
|
||||||
pageState.maxPage = 1;
|
|
||||||
}
|
|
||||||
if (type === 'add' && pageState.page < pageState.maxPage) {
|
|
||||||
pageState.page += 1;
|
|
||||||
}
|
|
||||||
let params = {
|
|
||||||
current: pageState.page,
|
|
||||||
pageSize: pageState.pageSize,
|
|
||||||
};
|
|
||||||
$api.createRequest(`/app/company/job/${companyInfo.value.companyId}`, params).then((resData) => {
|
|
||||||
const { rows, total } = resData;
|
|
||||||
if (type === 'add') {
|
|
||||||
const str = pageState.pageSize * (pageState.page - 1);
|
|
||||||
const end = pageState.list.length;
|
|
||||||
const reslist = rows;
|
|
||||||
pageState.list.splice(str, end, ...reslist);
|
|
||||||
} else {
|
|
||||||
pageState.list = rows;
|
|
||||||
}
|
|
||||||
pageState.total = resData.total;
|
|
||||||
pageState.maxPage = Math.ceil(pageState.total / pageState.pageSize);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function expand() {
|
function expand() {
|
||||||
isExpanded.value = !isExpanded.value;
|
isExpanded.value = !isExpanded.value;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.btnback{
|
.btnback {
|
||||||
width: 64rpx;
|
width: 64rpx;
|
||||||
height: 64rpx;
|
height: 64rpx;
|
||||||
}
|
}
|
||||||
.btn {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
width: 52rpx;
|
|
||||||
height: 52rpx;
|
|
||||||
}
|
|
||||||
image {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.content{
|
|
||||||
height: 100%
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column
|
|
||||||
.content-top{
|
|
||||||
padding: 28rpx
|
|
||||||
padding-top: 50rpx
|
|
||||||
display: flex
|
|
||||||
flex-direction: row
|
|
||||||
flex-wrap: nowrap
|
|
||||||
.companyinfo-left{
|
|
||||||
width: 96rpx;
|
|
||||||
height: 96rpx;
|
|
||||||
margin-right: 24rpx
|
|
||||||
}
|
|
||||||
.companyinfo-right{
|
|
||||||
|
|
||||||
.row1{
|
.btn {
|
||||||
font-weight: 500;
|
display: flex;
|
||||||
font-size: 32rpx;
|
justify-content: space-between;
|
||||||
color: #333333;
|
align-items: center;
|
||||||
}
|
width: 52rpx;
|
||||||
.row2{
|
height: 52rpx;
|
||||||
font-weight: 400;
|
}
|
||||||
font-size: 28rpx;
|
|
||||||
color: #6C7282;
|
image {
|
||||||
line-height: 45rpx;
|
height: 100%;
|
||||||
}
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.content-top {
|
||||||
|
padding: 28rpx;
|
||||||
|
padding-top: 50rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
|
||||||
|
.companyinfo-left {
|
||||||
|
width: 96rpx;
|
||||||
|
height: 96rpx;
|
||||||
|
margin-right: 24rpx;
|
||||||
}
|
}
|
||||||
.conetent-info{
|
|
||||||
padding: 0 28rpx
|
.companyinfo-right {
|
||||||
overflow: hidden;
|
.row1 {
|
||||||
max-height: 0rpx;
|
font-weight: 500;
|
||||||
transition: max-height 0.3s ease;
|
font-size: 32rpx;
|
||||||
.info-title{
|
color: #333333;
|
||||||
font-weight: 600;
|
}
|
||||||
font-size: 28rpx;
|
|
||||||
color: #000000;
|
.row2 {
|
||||||
}
|
|
||||||
.info-desirption{
|
|
||||||
margin-top: 12rpx
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 28rpx;
|
|
||||||
color: #495265;
|
|
||||||
text-align: justified;
|
|
||||||
}
|
|
||||||
.title2{
|
|
||||||
margin-top: 48rpx
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.expanded {
|
|
||||||
max-height: 1000rpx; // 足够显示完整内容
|
|
||||||
}
|
|
||||||
.expand{
|
|
||||||
display: flex
|
|
||||||
flex-wrap: nowrap
|
|
||||||
white-space: nowrap
|
|
||||||
justify-content: center
|
|
||||||
margin-top: 20rpx
|
|
||||||
margin-bottom: 28rpx
|
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #256BFA;
|
color: #6C7282;
|
||||||
.expand-img{
|
line-height: 45rpx;
|
||||||
width: 40rpx;
|
}
|
||||||
height: 40rpx;
|
|
||||||
}
|
|
||||||
.expand-img-active{
|
|
||||||
transform: rotate(180deg)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.Detailscroll-view{
|
|
||||||
flex: 1;
|
.conetent-info {
|
||||||
|
padding: 0 28rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: #F4F4F4;
|
max-height: 0rpx;
|
||||||
.views{
|
transition: max-height 0.3s ease;
|
||||||
padding: 28rpx
|
|
||||||
.Detail-title{
|
.info-title {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 32rpx;
|
font-size: 28rpx;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
position: relative;
|
|
||||||
display: flex
|
|
||||||
justify-content: space-between
|
|
||||||
.title{
|
|
||||||
position: relative;
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.Detail-title::before{
|
|
||||||
position: absolute
|
|
||||||
content: '';
|
|
||||||
left: -14rpx
|
|
||||||
bottom: 0
|
|
||||||
height: 16rpx;
|
|
||||||
width: 108rpx;
|
|
||||||
background: linear-gradient(to right, #CBDEFF, #FFFFFF);
|
|
||||||
border-radius: 8rpx;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
.cards{
|
|
||||||
padding: 32rpx;
|
|
||||||
background: #FFFFFF;
|
|
||||||
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0,0,0,0.04);
|
|
||||||
border-radius: 20rpx 20rpx 20rpx 20rpx;
|
|
||||||
margin-top: 22rpx;
|
|
||||||
.card-company{
|
|
||||||
display: flex
|
|
||||||
justify-content: space-between
|
|
||||||
align-items: flex-start
|
|
||||||
.company{
|
|
||||||
font-weight: 500;
|
|
||||||
font-size: 32rpx;
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
.salary{
|
|
||||||
font-weight: 500;
|
|
||||||
font-size: 28rpx;
|
|
||||||
color: #4C6EFB;
|
|
||||||
white-space: nowrap
|
|
||||||
line-height: 48rpx
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.card-companyName{
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 28rpx;
|
|
||||||
color: #6C7282;
|
|
||||||
}
|
|
||||||
.card-tags{
|
|
||||||
display: flex
|
|
||||||
flex-wrap: wrap
|
|
||||||
.tag{
|
|
||||||
width: fit-content;
|
|
||||||
height: 30rpx;
|
|
||||||
background: #F4F4F4;
|
|
||||||
border-radius: 4rpx;
|
|
||||||
padding: 6rpx 20rpx;
|
|
||||||
line-height: 30rpx;
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: #6C7282;
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 14rpx;
|
|
||||||
white-space: nowrap
|
|
||||||
margin-right: 20rpx
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.card-bottom{
|
|
||||||
margin-top: 32rpx
|
|
||||||
display: flex
|
|
||||||
justify-content: space-between
|
|
||||||
font-size: 28rpx;
|
|
||||||
color: #6C7282;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.info-desirption {
|
||||||
|
margin-top: 12rpx;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #495265;
|
||||||
|
text-align: justified;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title2 {
|
||||||
|
margin-top: 48rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.expanded {
|
||||||
|
max-height: 1000rpx; // 足够显示完整内容
|
||||||
|
}
|
||||||
|
|
||||||
|
.expand {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
white-space: nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 20rpx;
|
||||||
|
margin-bottom: 28rpx;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #256BFA;
|
||||||
|
|
||||||
|
.expand-img {
|
||||||
|
width: 40rpx;
|
||||||
|
height: 40rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.expand-img-active {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.Detailscroll-view {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #F4F4F4;
|
||||||
|
|
||||||
|
.views {
|
||||||
|
padding: 28rpx;
|
||||||
|
|
||||||
|
.Detail-title {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #000000;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.Detail-title::before {
|
||||||
|
position: absolute;
|
||||||
|
content: '';
|
||||||
|
left: -14rpx;
|
||||||
|
bottom: 0;
|
||||||
|
height: 16rpx;
|
||||||
|
width: 108rpx;
|
||||||
|
background: linear-gradient(to right, #CBDEFF, #FFFFFF);
|
||||||
|
border-radius: 8rpx;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards {
|
||||||
|
padding: 32rpx;
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.04);
|
||||||
|
border-radius: 20rpx 20rpx 20rpx 20rpx;
|
||||||
|
margin-top: 22rpx;
|
||||||
|
|
||||||
|
.card-company {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
.company {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.salary {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #4C6EFB;
|
||||||
|
white-space: nowrap;
|
||||||
|
line-height: 48rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-companyName {
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #6C7282;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-tags {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.tag {
|
||||||
|
width: fit-content;
|
||||||
|
height: 30rpx;
|
||||||
|
background: #F4F4F4;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
padding: 6rpx 20rpx;
|
||||||
|
line-height: 30rpx;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #6C7282;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 14rpx;
|
||||||
|
white-space: nowrap;
|
||||||
|
margin-right: 20rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-bottom {
|
||||||
|
margin-top: 32rpx;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #6C7282;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,11 +1,559 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<AppLayout title="" :use-scroll-view="false">
|
||||||
招聘会详情
|
<template #headerleft>
|
||||||
</view>
|
<view class="btnback">
|
||||||
|
<image src="@/static/icon/back.png" @click="navBack"></image>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<view class="content">
|
||||||
|
<view class="content-top">
|
||||||
|
<view class="companyinfo-left">
|
||||||
|
<image src="@/static/icon/companyIcon.png" mode=""></image>
|
||||||
|
</view>
|
||||||
|
<view class="companyinfo-right">
|
||||||
|
<view class="row1 line_2">{{ fairInfo?.name }}</view>
|
||||||
|
<view class="row2">
|
||||||
|
<text>{{ fairInfo.location }}</text>
|
||||||
|
<convert-distance
|
||||||
|
:alat="fairInfo.latitude"
|
||||||
|
:along="fairInfo.longitude"
|
||||||
|
:blat="latitudeVal"
|
||||||
|
:blong="longitudeVal"
|
||||||
|
></convert-distance>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="locations">
|
||||||
|
<image class="location-img" src="/static/icon/mapLine.png"></image>
|
||||||
|
<view class="location-info">
|
||||||
|
<view class="info">
|
||||||
|
<text class="info-title">{{ fairInfo.address }}</text>
|
||||||
|
<text class="info-text">位置</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="conetent-info" :class="{ expanded: isExpanded }">
|
||||||
|
<view class="info-title">内容描述</view>
|
||||||
|
<view class="info-desirption">{{ fairInfo.description }}</view>
|
||||||
|
<!-- <view class="info-title title2">公司地址</view>
|
||||||
|
<view class="locationCompany"></view> -->
|
||||||
|
<view class="company-times">
|
||||||
|
<view class="info-title">内容描述</view>
|
||||||
|
<view class="card-times">
|
||||||
|
<view class="time-left">
|
||||||
|
<view class="left-date">{{ parseDateTime(fairInfo.startTime).time }}</view>
|
||||||
|
<view class="left-dateDay">{{ parseDateTime(fairInfo.startTime).date }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="line"></view>
|
||||||
|
<view class="time-center">
|
||||||
|
<view class="center-date">
|
||||||
|
{{ getTimeStatus(fairInfo.startTime, fairInfo.endTime).statusText }}
|
||||||
|
</view>
|
||||||
|
<view class="center-dateDay">
|
||||||
|
{{ getHoursBetween(fairInfo.startTime, fairInfo.endTime) }}小时
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="line"></view>
|
||||||
|
<view class="time-right">
|
||||||
|
<view class="left-date">{{ parseDateTime(fairInfo.endTime).time }}</view>
|
||||||
|
<view class="left-dateDay">{{ parseDateTime(fairInfo.endTime).date }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="expand" @click="expand">
|
||||||
|
<text>{{ isExpanded ? '收起' : '展开' }}</text>
|
||||||
|
<image
|
||||||
|
class="expand-img"
|
||||||
|
:class="{ 'expand-img-active': !isExpanded }"
|
||||||
|
src="@/static/icon/downs.png"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
<scroll-view scroll-y class="Detailscroll-view">
|
||||||
|
<view class="views">
|
||||||
|
<view class="Detail-title">
|
||||||
|
<text class="title">参会单位({{ companyList.length }})</text>
|
||||||
|
</view>
|
||||||
|
<renderCompanys
|
||||||
|
v-if="companyList.length"
|
||||||
|
:list="companyList"
|
||||||
|
:longitude="longitudeVal"
|
||||||
|
:latitude="latitudeVal"
|
||||||
|
></renderCompanys>
|
||||||
|
<empty v-else pdTop="200"></empty>
|
||||||
|
</view>
|
||||||
|
</scroll-view>
|
||||||
|
</view>
|
||||||
|
<template #footer>
|
||||||
|
<view class="footer" v-if="hasnext">
|
||||||
|
<view
|
||||||
|
class="btn-wq button-click"
|
||||||
|
:class="{ 'btn-desbel': fairInfo.isCollection }"
|
||||||
|
@click="applyExhibitors"
|
||||||
|
>
|
||||||
|
{{ fairInfo.isCollection ? '已预约招聘会' : '预约招聘会' }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
</AppLayout>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
|
import point from '@/static/icon/point.png';
|
||||||
|
import { reactive, inject, watch, ref, onMounted, computed } from 'vue';
|
||||||
|
import { onLoad, onShow } from '@dcloudio/uni-app';
|
||||||
|
import dictLabel from '@/components/dict-Label/dict-Label.vue';
|
||||||
|
import useLocationStore from '@/stores/useLocationStore';
|
||||||
|
const { $api, navTo, vacanciesTo, navBack } = inject('globalFunction');
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore());
|
||||||
|
|
||||||
|
const isExpanded = ref(false);
|
||||||
|
const fairInfo = ref({});
|
||||||
|
const companyList = ref([]);
|
||||||
|
const hasnext = ref(true);
|
||||||
|
onLoad((options) => {
|
||||||
|
getCompanyInfo(options.jobFairId);
|
||||||
|
});
|
||||||
|
|
||||||
|
function getCompanyInfo(id) {
|
||||||
|
$api.createRequest(`/app/fair/${id}`).then((resData) => {
|
||||||
|
fairInfo.value = resData.data;
|
||||||
|
companyList.value = resData.data.companyList;
|
||||||
|
hasAppointment();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasAppointment = () => {
|
||||||
|
const isTimePassed = (timeStr) => {
|
||||||
|
const targetTime = new Date(timeStr.replace(/-/g, '/')).getTime(); // 兼容格式
|
||||||
|
const now = Date.now();
|
||||||
|
return now < targetTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
hasnext.value = isTimePassed(fairInfo.value.startTime);
|
||||||
|
};
|
||||||
|
|
||||||
|
function openMap(lat, lng, name = '位置') {
|
||||||
|
const isConfirmed = window.confirm('是否打开地图查看位置?');
|
||||||
|
if (!isConfirmed) return;
|
||||||
|
|
||||||
|
// 使用高德地图或百度地图的 H5 链接打开
|
||||||
|
const url = `https://uri.amap.com/marker?position=${lng},${lat}&name=${encodeURIComponent(name)}`;
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expand() {
|
||||||
|
isExpanded.value = !isExpanded.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取消/收藏岗位
|
||||||
|
function applyExhibitors() {
|
||||||
|
const fairId = fairInfo.value.jobFairId;
|
||||||
|
if (fairInfo.value.isCollection) {
|
||||||
|
// $api.createRequest(`/app/fair/collection/${fairId}`, {}, 'DELETE').then((resData) => {
|
||||||
|
// getCompanyInfo(fairId);
|
||||||
|
// $api.msg('取消预约成功');
|
||||||
|
// });
|
||||||
|
$api.msg('已预约成功');
|
||||||
|
} else {
|
||||||
|
$api.createRequest(`/app/fair/collection/${fairId}`, {}, 'POST').then((resData) => {
|
||||||
|
getCompanyInfo(fairId);
|
||||||
|
$api.msg('预约成功');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toIOSDate(input) {
|
||||||
|
if (!input) return null;
|
||||||
|
if (input instanceof Date) return isNaN(input.getTime()) ? null : input;
|
||||||
|
if (typeof input === 'number') {
|
||||||
|
const d = new Date(input);
|
||||||
|
return isNaN(d.getTime()) ? null : d;
|
||||||
|
}
|
||||||
|
if (typeof input !== 'string') return null;
|
||||||
|
let s = input.trim();
|
||||||
|
if (/^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}(:\d{2})?$/.test(s)) {
|
||||||
|
s = s.replace(' ', 'T');
|
||||||
|
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(s)) {
|
||||||
|
s = s + ':00';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const d = new Date(s);
|
||||||
|
return isNaN(d.getTime()) ? null : d;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseDateTime(datetimeStr) {
|
||||||
|
if (!datetimeStr) return { time: '', date: '' };
|
||||||
|
|
||||||
|
const dateObj = toIOSDate(datetimeStr);
|
||||||
|
|
||||||
|
if (isNaN(dateObj.getTime())) return { time: '', date: '' }; // 无效时间
|
||||||
|
|
||||||
|
const year = dateObj.getFullYear();
|
||||||
|
const month = String(dateObj.getMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(dateObj.getDate()).padStart(2, '0');
|
||||||
|
const hours = String(dateObj.getHours()).padStart(2, '0');
|
||||||
|
const minutes = String(dateObj.getMinutes()).padStart(2, '0');
|
||||||
|
|
||||||
|
return {
|
||||||
|
time: `${hours}:${minutes}`,
|
||||||
|
date: `${year}年${month}月${day}日`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTimeStatus(startTimeStr, endTimeStr) {
|
||||||
|
const now = new Date();
|
||||||
|
const startTime = toIOSDate(startTimeStr);
|
||||||
|
const endTime = toIOSDate(endTimeStr);
|
||||||
|
|
||||||
|
if (!startTime || !endTime) {
|
||||||
|
return { status: 1, statusText: '时间异常' };
|
||||||
|
}
|
||||||
|
|
||||||
|
let status = 0;
|
||||||
|
let statusText = '开始中';
|
||||||
|
if (now < startTime) {
|
||||||
|
status = 2;
|
||||||
|
statusText = '待开始';
|
||||||
|
} else if (now > endTime) {
|
||||||
|
status = 1;
|
||||||
|
statusText = '已过期';
|
||||||
|
} else {
|
||||||
|
status = 0;
|
||||||
|
statusText = '进行中';
|
||||||
|
}
|
||||||
|
return { status, statusText };
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHoursBetween(startTimeStr, endTimeStr) {
|
||||||
|
const start = toIOSDate(startTimeStr);
|
||||||
|
const end = toIOSDate(endTimeStr);
|
||||||
|
if (!start || !end) return 0;
|
||||||
|
const diffMs = end - start;
|
||||||
|
const diffHours = diffMs / (1000 * 60 * 60);
|
||||||
|
return +diffHours.toFixed(2);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style lang="stylus" scoped>
|
||||||
</style>
|
.btnback{
|
||||||
|
width: 64rpx;
|
||||||
|
height: 64rpx;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
width: 52rpx;
|
||||||
|
height: 52rpx;
|
||||||
|
}
|
||||||
|
image {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.content{
|
||||||
|
height: 100%
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column
|
||||||
|
.content-top{
|
||||||
|
padding: 28rpx
|
||||||
|
padding-top: 50rpx
|
||||||
|
display: flex
|
||||||
|
flex-direction: row
|
||||||
|
flex-wrap: nowrap
|
||||||
|
.companyinfo-left{
|
||||||
|
width: 96rpx;
|
||||||
|
height: 96rpx;
|
||||||
|
margin-right: 24rpx
|
||||||
|
}
|
||||||
|
.companyinfo-right{
|
||||||
|
flex: 1
|
||||||
|
.row1{
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #333333;
|
||||||
|
font-family: 'PingFangSC-Medium', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif;
|
||||||
|
}
|
||||||
|
.row2{
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #6C7282;
|
||||||
|
line-height: 45rpx;
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.locations{
|
||||||
|
padding: 0 28rpx
|
||||||
|
height: 86rpx;
|
||||||
|
position: relative
|
||||||
|
margin-bottom: 36rpx
|
||||||
|
.location-img{
|
||||||
|
border-radius: 8rpx 8rpx 8rpx 8rpx;
|
||||||
|
border: 2rpx solid #EFEFEF;
|
||||||
|
}
|
||||||
|
.location-info{
|
||||||
|
position: absolute
|
||||||
|
top: 0
|
||||||
|
left: 0
|
||||||
|
width: 100%
|
||||||
|
height: 100%
|
||||||
|
|
||||||
|
.info{
|
||||||
|
padding: 0 60rpx
|
||||||
|
height: 100%
|
||||||
|
display: flex
|
||||||
|
align-items: center
|
||||||
|
justify-content: space-between
|
||||||
|
white-space: nowrap
|
||||||
|
padding-top: rpx
|
||||||
|
.info-title{
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.info-text{
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #9B9B9B;
|
||||||
|
position: relative;
|
||||||
|
padding-right: 20rpx
|
||||||
|
|
||||||
|
}
|
||||||
|
.info-text::before{
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 50%;
|
||||||
|
content: '';
|
||||||
|
width: 4rpx;
|
||||||
|
height: 16rpx;
|
||||||
|
border-radius: 2rpx
|
||||||
|
background: #9B9B9B;
|
||||||
|
transform: translate(0, -75%) rotate(-45deg)
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-text::after {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 50%;
|
||||||
|
content: '';
|
||||||
|
width: 4rpx;
|
||||||
|
height: 16rpx;
|
||||||
|
border-radius: 2rpx
|
||||||
|
background: #9B9B9B;
|
||||||
|
transform: translate(0, -25%) rotate(45deg)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.conetent-info{
|
||||||
|
padding: 0 28rpx
|
||||||
|
overflow: hidden;
|
||||||
|
max-height: 0rpx;
|
||||||
|
transition: max-height 0.3s ease;
|
||||||
|
.info-title{
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.info-desirption{
|
||||||
|
margin-top: 12rpx
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #495265;
|
||||||
|
text-align: justified;
|
||||||
|
}
|
||||||
|
.title2{
|
||||||
|
margin-top: 48rpx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.company-times{
|
||||||
|
padding-top: 40rpx
|
||||||
|
.info-title{
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.expanded {
|
||||||
|
max-height: 1000rpx; // 足够显示完整内容
|
||||||
|
}
|
||||||
|
.expand{
|
||||||
|
display: flex
|
||||||
|
flex-wrap: nowrap
|
||||||
|
white-space: nowrap
|
||||||
|
justify-content: center
|
||||||
|
margin-bottom: 46rpx
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #256BFA;
|
||||||
|
.expand-img{
|
||||||
|
width: 40rpx;
|
||||||
|
height: 40rpx;
|
||||||
|
}
|
||||||
|
.expand-img-active{
|
||||||
|
transform: rotate(180deg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.Detailscroll-view{
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #F4F4F4;
|
||||||
|
.views{
|
||||||
|
padding: 28rpx
|
||||||
|
.Detail-title{
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #000000;
|
||||||
|
position: relative;
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
.title{
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.Detail-title::before{
|
||||||
|
position: absolute
|
||||||
|
content: '';
|
||||||
|
left: -14rpx
|
||||||
|
bottom: 0
|
||||||
|
height: 16rpx;
|
||||||
|
width: 108rpx;
|
||||||
|
background: linear-gradient(to right, #CBDEFF, #FFFFFF);
|
||||||
|
border-radius: 8rpx;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.cards{
|
||||||
|
padding: 32rpx;
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0,0,0,0.04);
|
||||||
|
border-radius: 20rpx 20rpx 20rpx 20rpx;
|
||||||
|
margin-top: 22rpx;
|
||||||
|
.card-company{
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
align-items: flex-start
|
||||||
|
.company{
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.salary{
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #4C6EFB;
|
||||||
|
white-space: nowrap
|
||||||
|
line-height: 48rpx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.card-companyName{
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #6C7282;
|
||||||
|
}
|
||||||
|
.card-tags{
|
||||||
|
display: flex
|
||||||
|
flex-wrap: wrap
|
||||||
|
.tag{
|
||||||
|
width: fit-content;
|
||||||
|
height: 30rpx;
|
||||||
|
background: #F4F4F4;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
padding: 6rpx 20rpx;
|
||||||
|
line-height: 30rpx;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #6C7282;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 14rpx;
|
||||||
|
white-space: nowrap
|
||||||
|
margin-right: 20rpx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.card-bottom{
|
||||||
|
margin-top: 32rpx
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #6C7282;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.card-times{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between
|
||||||
|
align-items: center
|
||||||
|
padding: 24rpx 30rpx 10rpx 30rpx
|
||||||
|
.time-left,
|
||||||
|
.time-right{
|
||||||
|
text-align: center
|
||||||
|
.left-date{
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 48rpx;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.left-dateDay{
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #333333;
|
||||||
|
margin-top: 12rpx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.line{
|
||||||
|
width: 40rpx;
|
||||||
|
height: 0rpx;
|
||||||
|
border: 2rpx solid #D4D4D4;
|
||||||
|
margin-top: 64rpx
|
||||||
|
}
|
||||||
|
.time-center{
|
||||||
|
text-align: center;
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: center
|
||||||
|
align-items: center
|
||||||
|
.center-date{
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #FF881A;
|
||||||
|
padding-top: 10rpx
|
||||||
|
}
|
||||||
|
.center-dateDay{
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #333333;
|
||||||
|
margin-top: 6rpx
|
||||||
|
line-height: 48rpx;
|
||||||
|
width: 104rpx;
|
||||||
|
height: 48rpx;
|
||||||
|
background: #F9F9F9;
|
||||||
|
border-radius: 8rpx 8rpx 8rpx 8rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.footer{
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0rpx -4rpx 24rpx 0rpx rgba(11,44,112,0.12);
|
||||||
|
border-radius: 0rpx 0rpx 0rpx 0rpx;
|
||||||
|
padding: 40rpx 28rpx 20rpx 28rpx
|
||||||
|
.btn-wq{
|
||||||
|
height: 90rpx;
|
||||||
|
background: #256BFA;
|
||||||
|
border-radius: 12rpx 12rpx 12rpx 12rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 90rpx
|
||||||
|
}
|
||||||
|
.btn-desbel{
|
||||||
|
background: #6697FB;
|
||||||
|
box-shadow: 0rpx -4rpx 24rpx 0rpx rgba(11,44,112,0.12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
237
packageB/login.vue
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
<template>
|
||||||
|
<AppLayout title="" :use-scroll-view="false">
|
||||||
|
<view class="wrap">
|
||||||
|
<view class="login_index">
|
||||||
|
<input class="input" placeholder="请输入账号" placeholder-class="inputplace" v-model="form.username" />
|
||||||
|
<view class="login_yzm">
|
||||||
|
<input class="input" type="password" placeholder="请输入密码" placeholder-class="inputplace"
|
||||||
|
v-model="form.password" />
|
||||||
|
</view>
|
||||||
|
<view class="login_yzm">
|
||||||
|
<input class="input" placeholder="请输入验证码" placeholder-class="inputplace" v-model="form.code" />
|
||||||
|
<image class="yzm" :src="codeUrl" @click="getCodeImg"></image>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<button class="com-btn" @click="register">登 录</button>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</AppLayout>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import {
|
||||||
|
reactive,
|
||||||
|
inject,
|
||||||
|
watch,
|
||||||
|
ref,
|
||||||
|
onMounted,
|
||||||
|
onUnmounted
|
||||||
|
} from 'vue'
|
||||||
|
import {
|
||||||
|
onLoad,
|
||||||
|
onShow
|
||||||
|
} from '@dcloudio/uni-app';
|
||||||
|
const {
|
||||||
|
$api,
|
||||||
|
navTo,
|
||||||
|
vacanciesTo,
|
||||||
|
navBack
|
||||||
|
} = inject("globalFunction");
|
||||||
|
const placeholderStyle = 'font-size:30rpx'
|
||||||
|
const checked = ref(true)
|
||||||
|
const codeUrl = ref('')
|
||||||
|
|
||||||
|
const form = reactive({
|
||||||
|
username: 'langchaojituan',
|
||||||
|
password: 'Aa123456?',
|
||||||
|
rememberMe: false,
|
||||||
|
code: '',
|
||||||
|
uuid: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
onLoad(() => {
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getCodeImg()
|
||||||
|
})
|
||||||
|
|
||||||
|
function register() {
|
||||||
|
if (!form.username) {
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '请输入用户名'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!form.password) {
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '请输入密码'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!form.uuid) {
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '请输入验证码'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uni.showLoading({
|
||||||
|
title: '登录中...',
|
||||||
|
mask: true
|
||||||
|
})
|
||||||
|
$api.myRequest('/auth/login',form,'post',10100).then((res) => {
|
||||||
|
console.log(res, 'res')
|
||||||
|
uni.setStorageSync('Padmin-Token', res.data.access_token)
|
||||||
|
uni.reLaunch({
|
||||||
|
url: '/pages/index/index'
|
||||||
|
})
|
||||||
|
codeUrl.value = 'data:image/gif;base64,' + res.img
|
||||||
|
}).catch(() => {
|
||||||
|
uni.hideLoading()
|
||||||
|
uni.showToast({
|
||||||
|
icon: 'none',
|
||||||
|
title: '登录失败,请重试'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCodeImg() {
|
||||||
|
$api.myRequest('/code',{},'get',10100).then((resData) => {
|
||||||
|
codeUrl.value = 'data:image/gif;base64,' + resData.img
|
||||||
|
form.uuid = resData.uuid
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="stylus">
|
||||||
|
.wrap {
|
||||||
|
background-color: #ffffff;
|
||||||
|
height: 100vh;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.lg-head {
|
||||||
|
height: 480rpx;
|
||||||
|
background: #46ca98;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.view_logo {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.login_logo {
|
||||||
|
width: 300rpx;
|
||||||
|
height: 300rpx;
|
||||||
|
margin-top: 100rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-cover {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -4rpx;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 30rpx;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.login_index {
|
||||||
|
font-size: 36rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
width: 596rpx;
|
||||||
|
margin: 0 auto;
|
||||||
|
|
||||||
|
::v-deep .is-input-border {
|
||||||
|
border: 0;
|
||||||
|
border-bottom: 1px solid #dcdfe6 !important;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .uni-input-input {
|
||||||
|
font-size: 32rpx;
|
||||||
|
padding-left: 10rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .uniui-contact-filled:before {
|
||||||
|
color: #46ca98;
|
||||||
|
font-size: 50rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .uniui-locked-filled:before {
|
||||||
|
color: #46ca98;
|
||||||
|
font-size: 50rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login_yzm {
|
||||||
|
margin-top: 40rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.yzm {
|
||||||
|
width: 200rpx;
|
||||||
|
height: 80rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.com-btn {
|
||||||
|
height: 100rpx;
|
||||||
|
background: #46ca98;
|
||||||
|
border-radius: 50rpx;
|
||||||
|
color: #fff;
|
||||||
|
margin-top: 100rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login_wt {
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: rgba(134, 134, 136, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-bottom {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -3px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.bottom-svg {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -3px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.login_tongyi {
|
||||||
|
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: rgba(196, 196, 196, 1);
|
||||||
|
width: 620rpx;
|
||||||
|
margin: 32rpx auto;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
text {
|
||||||
|
color: rgba(86, 176, 236, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.input {
|
||||||
|
padding: 0 30rpx 0 80rpx;
|
||||||
|
height: 80rpx;
|
||||||
|
background: #FFFFFF;
|
||||||
|
border-radius: 75rpx 75rpx 75rpx 75rpx;
|
||||||
|
font-size: 28rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inputplace {
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #B5B5B5;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<view class="tab-container">
|
<view class="tab-container">
|
||||||
<image src="../../static/images/train/bj.jpg" mode=""></image>
|
<image src="../../static/images/train/bj.jpg" mode=""></image>
|
||||||
<view>
|
<view>
|
||||||
<view class="btns" @click="jumps('')">
|
<view class="btns" @click="jumps('/packageB/train/video/videoList')">
|
||||||
<image src="/static/images/train/spxx-k.png" mode=""></image>
|
<image src="/static/images/train/spxx-k.png" mode=""></image>
|
||||||
<view>
|
<view>
|
||||||
<text>培训视频</text>
|
<text>培训视频</text>
|
||||||
|
|||||||
316
packageB/train/video/videoList.vue
Normal file
@@ -0,0 +1,316 @@
|
|||||||
|
<template>
|
||||||
|
<AppLayout :title="title" :show-bg-image="false" @onScrollBottom="getDataList('add')">
|
||||||
|
<!-- <template #headerleft>
|
||||||
|
<view class="btnback">
|
||||||
|
<image src="@/static/icon/back.png" @click="navBack"></image>
|
||||||
|
</view>
|
||||||
|
</template> -->
|
||||||
|
<template #headContent>
|
||||||
|
<view class="collection-search">
|
||||||
|
<view class="search-content">
|
||||||
|
<view class="header-input button-click">
|
||||||
|
<uni-icons class="iconsearch" color="#6A6A6A" type="search" size="22"></uni-icons>
|
||||||
|
<input
|
||||||
|
class="input"
|
||||||
|
v-model="searchKeyword"
|
||||||
|
@confirm="searchVideo"
|
||||||
|
placeholder="输入视频名称"
|
||||||
|
placeholder-class="inputplace"
|
||||||
|
/>
|
||||||
|
<uni-icons
|
||||||
|
v-if="searchKeyword"
|
||||||
|
class="clear-icon"
|
||||||
|
type="clear"
|
||||||
|
size="24"
|
||||||
|
color="#999"
|
||||||
|
@click="clearSearch"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<view class="main-list">
|
||||||
|
<view class="list-title">
|
||||||
|
<text>视频列表</text>
|
||||||
|
<view class="title-line"></view>
|
||||||
|
</view>
|
||||||
|
<view class="video-grid" v-if="pageState.list.length">
|
||||||
|
<view
|
||||||
|
v-for="video in pageState.list"
|
||||||
|
:key="video.id || video.videoId"
|
||||||
|
class="video-item"
|
||||||
|
:style="getItemBackgroundStyle('video-bg.png')"
|
||||||
|
@click="playVideo(video)"
|
||||||
|
>
|
||||||
|
<view class="video-cover">
|
||||||
|
<image
|
||||||
|
:src="video.coverImage || video.videoCover || '/static/icon/video.png'"
|
||||||
|
mode="aspectFill"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
<view class="video-info">
|
||||||
|
{{ video.title || video.videoName || '未命名视频' }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<empty v-else pdTop="200"></empty>
|
||||||
|
</view>
|
||||||
|
</AppLayout>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { inject, ref, reactive } from 'vue';
|
||||||
|
import { onLoad } from '@dcloudio/uni-app';
|
||||||
|
const { $api, navTo, navBack } = inject('globalFunction');
|
||||||
|
|
||||||
|
// state
|
||||||
|
const title = ref('');
|
||||||
|
const searchKeyword = ref('');
|
||||||
|
const pageState = reactive({
|
||||||
|
page: 0,
|
||||||
|
list: [],
|
||||||
|
total: 0,
|
||||||
|
maxPage: 1,
|
||||||
|
pageSize: 12,
|
||||||
|
search: {},
|
||||||
|
});
|
||||||
|
const baseUrl = 'http://10.110.145.145/images/train/';
|
||||||
|
const getItemBackgroundStyle = (imageName) => ({
|
||||||
|
backgroundImage: `url(${baseUrl + imageName})`,
|
||||||
|
backgroundSize: 'cover', // 覆盖整个容器
|
||||||
|
backgroundPosition: 'center', // 居中
|
||||||
|
backgroundRepeat: 'no-repeat'
|
||||||
|
});
|
||||||
|
// 模拟视频数据
|
||||||
|
const mockVideoData = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
title: '职业技能培训基础课程',
|
||||||
|
coverImage: '/static/icon/server1.png',
|
||||||
|
videoUrl: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
title: '面试技巧分享',
|
||||||
|
coverImage: '/static/icon/server2.png',
|
||||||
|
videoUrl: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '3',
|
||||||
|
title: '简历制作指南',
|
||||||
|
coverImage: '/static/icon/server3.png',
|
||||||
|
videoUrl: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '4',
|
||||||
|
title: '职场沟通技巧',
|
||||||
|
coverImage: '/static/icon/server4.png',
|
||||||
|
videoUrl: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '5',
|
||||||
|
title: '职业规划讲座',
|
||||||
|
coverImage: '/static/icon/flame.png',
|
||||||
|
videoUrl: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '6',
|
||||||
|
title: '行业趋势分析',
|
||||||
|
coverImage: '/static/icon/flame2.png',
|
||||||
|
videoUrl: ''
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
onLoad(() => {
|
||||||
|
getDataList('refresh');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 搜索视频
|
||||||
|
function searchVideo() {
|
||||||
|
getDataList('refresh');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清除搜索内容
|
||||||
|
function clearSearch() {
|
||||||
|
searchKeyword.value = '';
|
||||||
|
getDataList('refresh');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取视频列表
|
||||||
|
function getDataList(type = 'add') {
|
||||||
|
if (type === 'refresh') {
|
||||||
|
pageState.page = 1;
|
||||||
|
pageState.maxPage = 1;
|
||||||
|
}
|
||||||
|
if (type === 'add' && pageState.page < pageState.maxPage) {
|
||||||
|
pageState.page += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 模拟API请求延迟
|
||||||
|
setTimeout(() => {
|
||||||
|
// 在实际项目中,这里应该调用真实的API接口
|
||||||
|
// 目前使用模拟数据
|
||||||
|
let filteredList = [...mockVideoData];
|
||||||
|
|
||||||
|
// 如果有搜索关键词,进行过滤
|
||||||
|
if (searchKeyword.value.trim()) {
|
||||||
|
filteredList = filteredList.filter(video =>
|
||||||
|
video.title.toLowerCase().includes(searchKeyword.value.toLowerCase())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const start = 0;
|
||||||
|
const end = pageState.pageSize;
|
||||||
|
const pageData = filteredList.slice(start, end);
|
||||||
|
|
||||||
|
if (type === 'add') {
|
||||||
|
pageState.list = [...pageState.list, ...pageData];
|
||||||
|
} else {
|
||||||
|
pageState.list = pageData;
|
||||||
|
}
|
||||||
|
|
||||||
|
pageState.total = filteredList.length;
|
||||||
|
pageState.maxPage = Math.ceil(pageState.total / pageState.pageSize);
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 播放视频
|
||||||
|
function playVideo(video) {
|
||||||
|
// 在实际项目中,这里应该导航到视频播放页面
|
||||||
|
// 或者调用视频播放组件
|
||||||
|
console.log('播放视频:', video.title);
|
||||||
|
// 示例:navTo(`/pages/videoPlayer/videoPlayer?id=${video.id}`);
|
||||||
|
$api.msg(`准备播放: ${video.title}`);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.btnback{
|
||||||
|
width: 64rpx;
|
||||||
|
height: 64rpx;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
width: 52rpx;
|
||||||
|
height: 52rpx;
|
||||||
|
}
|
||||||
|
image {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.collection-search{
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
.search-content{
|
||||||
|
position: relative
|
||||||
|
display: flex
|
||||||
|
align-items: center
|
||||||
|
padding: 14rpx 0
|
||||||
|
.header-input{
|
||||||
|
padding: 0
|
||||||
|
width: calc(100%);
|
||||||
|
position: relative
|
||||||
|
.iconsearch{
|
||||||
|
position: absolute
|
||||||
|
left: 30rpx;
|
||||||
|
top: 50%
|
||||||
|
transform: translate(0, -50%)
|
||||||
|
z-index: 1
|
||||||
|
}
|
||||||
|
.input{
|
||||||
|
padding: 0 80rpx 0 80rpx
|
||||||
|
height: 80rpx;
|
||||||
|
background: #FFFFFF;
|
||||||
|
border-radius: 75rpx 75rpx 75rpx 75rpx;
|
||||||
|
border: 2rpx solid #ECECEC
|
||||||
|
font-size: 28rpx;
|
||||||
|
}
|
||||||
|
.clear-icon{
|
||||||
|
position: absolute
|
||||||
|
right: 30rpx;
|
||||||
|
top: 50%
|
||||||
|
transform: translate(0, -50%)
|
||||||
|
z-index: 1
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
.inputplace{
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #B5B5B5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-list{
|
||||||
|
background-color: #ffffff;
|
||||||
|
padding: 20rpx 20rpx 28rpx 20rpx;
|
||||||
|
margin:10rpx 30rpx ;
|
||||||
|
box-shadow: 0px 3px 20px 0px rgba(0,105,234,0.1);
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
.list-title{
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 36rpx;
|
||||||
|
color: #404040;
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.title-line{
|
||||||
|
position: absolute;
|
||||||
|
bottom: -10rpx;
|
||||||
|
left: 36rpx;
|
||||||
|
width: 70rpx;
|
||||||
|
height: 8rpx;
|
||||||
|
background: linear-gradient(90deg, #FFAD58 0%, #FF7A5B 100%);
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
.video-grid{
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 20rpx;
|
||||||
|
}
|
||||||
|
.video-item{
|
||||||
|
border-radius: 12rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
|
||||||
|
transition: transform 0.2s;
|
||||||
|
padding: 20rpx
|
||||||
|
}
|
||||||
|
.video-item:active{
|
||||||
|
transform: scale(0.98);
|
||||||
|
}
|
||||||
|
.video-cover{
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
padding-top: 56.25%; /* 16:9 比例 */
|
||||||
|
background: #f0f0f0;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
}
|
||||||
|
.video-cover image{
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.video-info{
|
||||||
|
padding: 16rpx 16rpx 0 16rpx;
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: #333;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.video-title{
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #333;
|
||||||
|
line-height: 40rpx;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
51
pages.json
@@ -5,9 +5,9 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "喀什智慧就业平台",
|
"navigationBarTitleText": "喀什智慧就业平台",
|
||||||
"navigationBarTitleTextSize": "30rpx",
|
"navigationBarTitleTextSize": "30rpx",
|
||||||
// #ifdef H5
|
// #ifdef H5
|
||||||
"navigationStyle": "custom"
|
"navigationStyle": "custom"
|
||||||
// #endif
|
// #endif
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "首页内容测试",
|
"navigationBarTitleText": "首页内容测试",
|
||||||
"navigationStyle": "custom"
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/test/tabbar-user-type-test",
|
"path": "pages/test/tabbar-user-type-test",
|
||||||
@@ -179,7 +179,7 @@
|
|||||||
"pages": [
|
"pages": [
|
||||||
{
|
{
|
||||||
"path" : "pages/addWorkExperience/addWorkExperience",
|
"path" : "pages/addWorkExperience/addWorkExperience",
|
||||||
"style" :
|
"style" :
|
||||||
{
|
{
|
||||||
"navigationBarTitleText" : "添加工作经历",
|
"navigationBarTitleText" : "添加工作经历",
|
||||||
"navigationBarTitleTextSize": "30rpx"
|
"navigationBarTitleTextSize": "30rpx"
|
||||||
@@ -212,9 +212,9 @@
|
|||||||
"path": "pages/exhibitors/exhibitors",
|
"path": "pages/exhibitors/exhibitors",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "参展单位",
|
"navigationBarTitleText": "参展单位",
|
||||||
"navigationBarBackgroundColor": "#4778EC",
|
"navigationBarBackgroundColor": "#FFFFFF",
|
||||||
"navigationBarTextStyle": "white",
|
"navigationBarTextStyle": "black"
|
||||||
"navigationStyle": "custom"
|
// "navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
"path": "pages/myResume/myResume",
|
"path": "pages/myResume/myResume",
|
||||||
@@ -351,16 +351,25 @@
|
|||||||
"pages": [
|
"pages": [
|
||||||
{
|
{
|
||||||
"path" : "jobFair/detail",
|
"path" : "jobFair/detail",
|
||||||
"style" :
|
"style" :
|
||||||
{
|
{
|
||||||
"navigationBarTitleText" : "招聘会详情",
|
"navigationBarTitleText" : "招聘会详情",
|
||||||
"navigationBarTitleTextSize": "30rpx"
|
"navigationBarTitleTextSize": "30rpx"
|
||||||
// "navigationStyle": "custom"
|
// "navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path" : "login",
|
||||||
|
"style" :
|
||||||
|
{
|
||||||
|
"navigationBarTitleText" : "登录",
|
||||||
|
"navigationBarTitleTextSize": "30rpx"
|
||||||
|
// "navigationStyle": "custom"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path" : "train/index",
|
"path" : "train/index",
|
||||||
"style" :
|
"style" :
|
||||||
{
|
{
|
||||||
"navigationBarTitleText" : "技能评价",
|
"navigationBarTitleText" : "技能评价",
|
||||||
"navigationBarTitleTextSize": "30rpx"
|
"navigationBarTitleTextSize": "30rpx"
|
||||||
@@ -369,13 +378,31 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path" : "train/practice/startPracticing",
|
"path" : "train/practice/startPracticing",
|
||||||
"style" :
|
"style" :
|
||||||
{
|
{
|
||||||
"navigationBarTitleText" : "专项训练",
|
"navigationBarTitleText" : "专项训练",
|
||||||
"navigationBarTitleTextSize": "30rpx"
|
"navigationBarTitleTextSize": "30rpx"
|
||||||
// "navigationStyle": "custom"
|
// "navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
"path" : "train/video/videoList",
|
||||||
|
"style" :
|
||||||
|
{
|
||||||
|
"navigationBarTitleText" : "视频学习",
|
||||||
|
"navigationBarTitleTextSize": "30rpx"
|
||||||
|
// "navigationStyle": "custom"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path" : "train/video/videoDetail",
|
||||||
|
"style" :
|
||||||
|
{
|
||||||
|
"navigationBarTitleText" : "视频详情",
|
||||||
|
"navigationBarTitleTextSize": "30rpx"
|
||||||
|
// "navigationStyle": "custom"
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}],
|
}],
|
||||||
// "tabBar": {
|
// "tabBar": {
|
||||||
@@ -436,4 +463,4 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"uniIdRouter": {}
|
"uniIdRouter": {}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
static/images/train/video-bg.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
static/images/train/video-bj.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
static/images/train/video-bj2.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
static/images/train/video-gd.png
Normal file
|
After Width: | Height: | Size: 309 B |
BIN
static/images/train/video-jt.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
static/images/train/video-kc.png
Normal file
|
After Width: | Height: | Size: 464 B |
BIN
static/images/train/video-sc.png
Normal file
|
After Width: | Height: | Size: 455 B |
BIN
static/images/train/wsc.png
Normal file
|
After Width: | Height: | Size: 632 B |
BIN
static/images/train/xl.png
Normal file
|
After Width: | Height: | Size: 242 B |
BIN
static/images/train/zs.png
Normal file
|
After Width: | Height: | Size: 297 B |
374
utils/request.js
@@ -1,67 +1,67 @@
|
|||||||
import config from "@/config.js"
|
import config from "@/config.js"
|
||||||
import useUserStore from '@/stores/useUserStore';
|
import useUserStore from '@/stores/useUserStore';
|
||||||
export function request({
|
export function request({
|
||||||
url,
|
url,
|
||||||
method = 'GET',
|
method = 'GET',
|
||||||
data = {},
|
data = {},
|
||||||
load = false,
|
load = false,
|
||||||
header = {}
|
header = {}
|
||||||
} = {}) {
|
} = {}) {
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (load) {
|
if (load) {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: '请稍候',
|
title: '请稍候',
|
||||||
mask: true
|
mask: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
let Authorization = ''
|
let Authorization = ''
|
||||||
if (useUserStore().token) {
|
if (useUserStore().token) {
|
||||||
Authorization = `${useUserStore().userInfo.token}${useUserStore().token}`
|
Authorization = `${useUserStore().userInfo.token}${useUserStore().token}`
|
||||||
}
|
}
|
||||||
uni.request({
|
uni.request({
|
||||||
url: config.baseUrl + url,
|
url: config.baseUrl + url,
|
||||||
method,
|
method,
|
||||||
data: data,
|
data: data,
|
||||||
header: {
|
header: {
|
||||||
'Authorization': Authorization || '',
|
'Authorization': Authorization || '',
|
||||||
},
|
},
|
||||||
success: resData => {
|
success: resData => {
|
||||||
// 响应拦截
|
// 响应拦截
|
||||||
if (resData.statusCode === 200) {
|
if (resData.statusCode === 200) {
|
||||||
const {
|
const {
|
||||||
code,
|
code,
|
||||||
msg
|
msg
|
||||||
} = resData.data
|
} = resData.data
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
resolve(resData.data)
|
resolve(resData.data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: msg,
|
title: msg,
|
||||||
icon: 'none'
|
icon: 'none'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if (resData.data?.code === 401 || resData.data?.code === 402) {
|
if (resData.data?.code === 401 || resData.data?.code === 402) {
|
||||||
useUserStore().logOut()
|
useUserStore().logOut()
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '登录过期,请重新登录',
|
title: '登录过期,请重新登录',
|
||||||
icon: 'none'
|
icon: 'none'
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const err = new Error('请求出现异常,请联系工作人员')
|
const err = new Error('请求出现异常,请联系工作人员')
|
||||||
err.error = resData
|
err.error = resData
|
||||||
reject(err)
|
reject(err)
|
||||||
},
|
},
|
||||||
fail: err => reject(err),
|
fail: err => reject(err),
|
||||||
complete() {
|
complete() {
|
||||||
if (load) {
|
if (load) {
|
||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -74,102 +74,172 @@ export function request({
|
|||||||
* @returns promise
|
* @returns promise
|
||||||
**/
|
**/
|
||||||
export function createRequest(url, data = {}, method = 'GET', loading = false, headers = {}) {
|
export function createRequest(url, data = {}, method = 'GET', loading = false, headers = {}) {
|
||||||
if (loading) {
|
if (loading) {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: '请稍后',
|
title: '请稍后',
|
||||||
mask: true
|
mask: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
let Authorization = ''
|
let Authorization = ''
|
||||||
if (useUserStore().token) {
|
if (useUserStore().token) {
|
||||||
Authorization = `${useUserStore().token}`
|
Authorization = `${useUserStore().token}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const header = headers || {};
|
const header = headers || {};
|
||||||
header["Authorization"] = encodeURIComponent(Authorization);
|
header["Authorization"] = encodeURIComponent(Authorization);
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
uni.request({
|
uni.request({
|
||||||
url: config.baseUrl + url,
|
url: config.baseUrl + url,
|
||||||
method: method,
|
method: method,
|
||||||
data: data,
|
data: data,
|
||||||
header,
|
header,
|
||||||
success: resData => {
|
success: resData => {
|
||||||
// 响应拦截
|
// 响应拦截
|
||||||
if (resData.statusCode === 200) {
|
if (resData.statusCode === 200) {
|
||||||
const {
|
const {
|
||||||
code,
|
code,
|
||||||
msg
|
msg
|
||||||
} = resData.data
|
} = resData.data
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
resolve(resData.data)
|
resolve(resData.data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 处理业务错误
|
// 处理业务错误
|
||||||
if (resData.data?.code === 401 || resData.data?.code === 402) {
|
if (resData.data?.code === 401 || resData.data?.code === 402) {
|
||||||
useUserStore().logOut()
|
useUserStore().logOut()
|
||||||
}
|
}
|
||||||
// 显示具体的错误信息
|
// 显示具体的错误信息
|
||||||
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)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// HTTP状态码不是200的情况
|
// HTTP状态码不是200的情况
|
||||||
const err = new Error('网络请求失败,请检查网络连接')
|
const err = new Error('网络请求失败,请检查网络连接')
|
||||||
err.error = resData
|
err.error = resData
|
||||||
reject(err)
|
reject(err)
|
||||||
},
|
},
|
||||||
fail: (err) => {
|
fail: (err) => {
|
||||||
reject(err)
|
reject(err)
|
||||||
},
|
},
|
||||||
complete: () => {
|
complete: () => {
|
||||||
if (loading) {
|
if (loading) {
|
||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function uploadFile(tempFilePaths, loading = false) {
|
export function uploadFile(tempFilePaths, loading = false) {
|
||||||
if (loading) {
|
if (loading) {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
title: '请稍后',
|
title: '请稍后',
|
||||||
mask: true
|
mask: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
let Authorization = ''
|
let Authorization = ''
|
||||||
if (useUserStore().token) {
|
if (useUserStore().token) {
|
||||||
Authorization = `${useUserStore().token}`
|
Authorization = `${useUserStore().token}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const header = {};
|
const header = {};
|
||||||
header["Authorization"] = encodeURIComponent(Authorization);
|
header["Authorization"] = encodeURIComponent(Authorization);
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
uni.uploadFile({
|
uni.uploadFile({
|
||||||
url: config.baseUrl + '/app/file/upload',
|
url: config.baseUrl + '/app/file/upload',
|
||||||
filePath: tempFilePaths,
|
filePath: tempFilePaths,
|
||||||
name: 'file',
|
name: 'file',
|
||||||
header,
|
header,
|
||||||
success: (uploadFileRes) => {
|
success: (uploadFileRes) => {
|
||||||
if (uploadFileRes.statusCode === 200) {
|
if (uploadFileRes.statusCode === 200) {
|
||||||
return resolve(uploadFileRes.data)
|
return resolve(uploadFileRes.data)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fail: (err) => {
|
fail: (err) => {
|
||||||
reject(err)
|
reject(err)
|
||||||
},
|
},
|
||||||
complete: () => {
|
complete: () => {
|
||||||
if (loading) {
|
if (loading) {
|
||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function myRequest(url, data = {}, method = 'GET', port = 9100, headers = {}, loading = false) {
|
||||||
|
let LCBaseUrl = config.LCBaseUrl
|
||||||
|
if (port != 9100) {
|
||||||
|
LCBaseUrl = config.LCBaseUrlInner
|
||||||
|
}
|
||||||
|
const header = headers || {};
|
||||||
|
// 上下文
|
||||||
|
// /jobfair-api/jobfair/public 招聘会
|
||||||
|
// /dashboard-api/dashboard 用户登录相关
|
||||||
|
// /dashboard-api 获取验证码、登录
|
||||||
|
if (loading) {
|
||||||
|
uni.showLoading({
|
||||||
|
title: '请稍后',
|
||||||
|
mask: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
uni.request({
|
||||||
|
url: LCBaseUrl + url,
|
||||||
|
method: method,
|
||||||
|
data: data,
|
||||||
|
header,
|
||||||
|
success: resData => {
|
||||||
|
if(url=='/dashboard/auth/heart'){
|
||||||
|
resolve(resData.data)
|
||||||
|
return
|
||||||
|
}else{
|
||||||
|
// 响应拦截
|
||||||
|
if (resData.statusCode === 200) {
|
||||||
|
const {
|
||||||
|
code,
|
||||||
|
msg
|
||||||
|
} = resData.data
|
||||||
|
if (code === 200) {
|
||||||
|
resolve(resData.data)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 处理业务错误
|
||||||
|
if (resData.data?.code === 401 || resData.data?.code === 402) {
|
||||||
|
useUserStore().logOut()
|
||||||
|
}
|
||||||
|
// 显示具体的错误信息
|
||||||
|
const errorMsg = msg || '请求出现异常,请联系工作人员'
|
||||||
|
uni.showToast({
|
||||||
|
title: errorMsg,
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
const err = new Error(errorMsg)
|
||||||
|
err.error = resData
|
||||||
|
reject(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// HTTP状态码不是200的情况
|
||||||
|
const err = new Error('网络请求失败,请检查网络连接')
|
||||||
|
err.error = resData
|
||||||
|
reject(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fail: (err) => {
|
||||||
|
reject(err)
|
||||||
|
},
|
||||||
|
complete: () => {
|
||||||
|
if (loading) {
|
||||||
|
uni.hideLoading();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||