Files
ks-app-employment-service/pages/careerfair/careerfair.vue

789 lines
19 KiB
Vue
Raw Normal View History

2024-11-08 11:55:23 +08:00
<template>
2025-10-31 17:24:07 +08:00
<view class="app-custom-root">
<view class="app-container">
<!-- 顶部头部区域 -->
<view class="container-header">
<view class="header-top">
<view
class="header-btnLf button-click"
@click="seemsg(1)"
:class="{ active: state.current === 1 }"
>
线上招聘会
</view>
<view
class="header-btnLf button-click"
@click="seemsg(2)"
:class="{ active: state.current === 2 }"
>
线下招聘会
</view>
<view
class="header-btnLf button-click"
@click="seemsg(3)"
:class="{ active: state.current === 3 }"
>
我参与的
</view>
<view
class="header-btnLf button-click"
@click="navTo('/packageB/login')"
>
登录
</view>
</view>
<view class="header-input btn-feel">
<uni-icons
class="iconsearch"
color="#666666"
type="search"
size="18"
@click="getFair('refresh')"
></uni-icons>
<input
class="input"
placeholder="招聘会"
placeholder-class="inputplace"
v-model="pageState.jobFairTitle"
/>
</view>
</view>
<!-- 主体内容区域 -->
<view class="container-main">
<scroll-view
scroll-y
class="main-scroll"
@scrolltolower="handleScrollToLower"
>
<view class="cards" v-if="fairList.length">
<view
class="card press-button"
v-for="(item, index) in fairList"
:key="index"
@click="
navTo(
'/packageA/pages/exhibitors/exhibitors?jobFairId=' +
item.jobFairId
)
"
>
2025-11-03 15:08:39 +08:00
<view class="card-title">
{{ item.jobFairTitle }}
<view class="center-date" :style="{ color: getTimeStatus(item.jobFairStartTime, item.jobFairEndTime).color }">
{{ getTimeStatus(item.jobFairStartTime, item.jobFairEndTime).statusText }}
</view>
</view>
2025-10-31 17:24:07 +08:00
<view class="card-row">
<text class="">{{ item.jobFairAddress }}</text>
</view>
<view class="card-times">
<view class="time-left">
<view class="left-date">{{
parseDateTime(item.jobFairStartTime).time
}}</view>
<view class="left-dateDay">{{
parseDateTime(item.jobFairStartTime).date
}}</view>
2024-11-18 16:33:37 +08:00
</view>
2025-10-31 17:24:07 +08:00
<view class="line"></view>
<view class="time-center">
<view class="center-dateDay">
{{
getHoursBetween(
item.jobFairStartTime,
item.jobFairEndTime
)
}}小时
</view>
</view>
<view class="line"></view>
<view class="time-right">
<view class="left-date">{{
parseDateTime(item.jobFairEndTime).time
}}</view>
<view class="left-dateDay">{{
parseDateTime(item.jobFairEndTime).date
}}</view>
</view>
</view>
<view class="recommend-card-line"></view>
<view class="card-footer"
>内容简介{{ item.jobFairIntroduction || "暂无" }}</view
>
2024-11-18 16:33:37 +08:00
</view>
2025-10-31 17:24:07 +08:00
</view>
<empty v-else pdTop="200"></empty>
</scroll-view>
</view>
<!-- 自定义tabbar -->
<CustomTabBar :currentPage="1" />
<!-- 微信授权登录弹窗 -->
<WxAuthLogin
ref="wxAuthLoginRef"
@success="handleLoginSuccess"
></WxAuthLogin>
2024-11-08 11:55:23 +08:00
</view>
2025-10-31 17:24:07 +08:00
</view>
2024-11-08 11:55:23 +08:00
</template>
2024-11-18 16:33:37 +08:00
<script setup>
2025-10-31 17:24:07 +08:00
import { reactive, inject, watch, ref, onMounted, onUnmounted } from "vue";
import { onLoad, onShow } from "@dcloudio/uni-app";
import useLocationStore from "@/stores/useLocationStore";
import { storeToRefs } from "pinia";
import { tabbarManager } from "@/utils/tabbarManager";
import WxAuthLogin from "@/components/WxAuthLogin/WxAuthLogin.vue";
2025-11-03 15:08:39 +08:00
import config from "@/config.js";
2025-05-13 11:10:38 +08:00
const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore());
2025-10-24 16:54:52 +08:00
const wxAuthLoginRef = ref(null);
2025-10-31 17:24:07 +08:00
const { $api, navTo, cloneDeep } = inject("globalFunction");
const isLogin = ref(false);
2025-05-13 11:10:38 +08:00
const weekList = ref([]);
const fairList = ref([]);
const currentDay = ref({});
2025-10-31 17:24:07 +08:00
const userInfo = ref({});
2024-11-18 16:33:37 +08:00
const state = reactive({
2025-10-31 17:24:07 +08:00
current: 1,
all: [{}],
2025-05-13 11:10:38 +08:00
});
const pageState = reactive({
2025-10-31 17:24:07 +08:00
pageNum: 0,
total: 0,
maxPage: 2,
pageSize: 10,
jobFairTitle: "",
2024-11-18 16:33:37 +08:00
});
2025-11-03 15:08:39 +08:00
const baseUrl = config.imgBaseUrl;
2024-11-18 16:33:37 +08:00
onLoad(() => {
2025-10-31 17:24:07 +08:00
// const today = new Date();
// const year = today.getFullYear();
// const month = String(today.getMonth() + 1).padStart(2, '0');
// const day = String(today.getDate()).padStart(2, '0');
// const currentDate = `${year}-${month}-${day}`;
// const result = getNextDates({
// startDate: currentDate,
// });
// weekList.value = result;
getHeart();
2024-11-18 16:33:37 +08:00
});
2025-03-29 12:06:35 +08:00
2025-10-23 17:16:16 +08:00
onShow(() => {
2025-10-31 17:24:07 +08:00
// 更新自定义tabbar选中状态
tabbarManager.updateSelected(1);
2025-10-23 17:16:16 +08:00
});
2025-10-24 16:54:52 +08:00
onMounted(() => {
2025-10-31 17:24:07 +08:00
// 监听退出登录事件,显示微信登录弹窗
uni.$on("showLoginModal", () => {
wxAuthLoginRef.value?.open();
});
2025-10-24 16:54:52 +08:00
});
onUnmounted(() => {
2025-10-31 17:24:07 +08:00
uni.$off("showLoginModal");
2025-10-24 16:54:52 +08:00
});
// 登录成功回调
const handleLoginSuccess = () => {
2025-10-31 17:24:07 +08:00
console.log("登录成功");
// 可以在这里添加登录成功后的处理逻辑
2025-10-24 16:54:52 +08:00
};
2025-05-13 11:10:38 +08:00
function toSelectDate() {
2025-10-31 17:24:07 +08:00
navTo("/packageA/pages/selectDate/selectDate", {
query: {
date: currentDay.value.fullDate,
},
onBack: (res) => {
const result = getNextDates({
startDate: res.date,
});
const formattedDate = res.date.slice(5); // MM-DD
const dateFull = {
date: res.date.slice(5),
day: "周" + res.week,
fullDate: res.date,
};
currentDay.value = dateFull;
weekList.value = result;
getFair("refresh");
},
});
2025-05-13 11:10:38 +08:00
}
// 查看消息类型
function changeSwiperMsgType(e) {
2025-10-31 17:24:07 +08:00
const currented = e.detail.current;
state.current = currented;
2025-05-13 11:10:38 +08:00
}
function seemsg(index) {
2025-10-31 17:24:07 +08:00
state.current = index;
2025-11-03 15:08:39 +08:00
console.log(index, "index");
2025-10-31 17:24:07 +08:00
if (index != 3) {
getFair("refresh");
} else {
if (!isLogin.value) {
// 未登录则先触发心跳与登录流程
getHeart();
return;
}
// 确保获取到用户信息后再请求“我参与的”列表
if (!userInfo.value?.info?.userId) {
getUser().then(() => {
getMyFair("refresh");
});
} else {
getMyFair("refresh");
2025-05-13 11:10:38 +08:00
}
2025-10-31 17:24:07 +08:00
}
2025-05-13 11:10:38 +08:00
}
const handleScrollToLower = () => {
2025-10-31 17:24:07 +08:00
if (pageState.pageNum >= pageState.maxPage) {
return;
} else {
if (state.current != 3) {
getFair();
} else {
this.$nextTick(() => {
getMyFair();
2025-11-03 15:08:39 +08:00
});
2025-10-31 17:24:07 +08:00
}
}
2025-05-13 11:10:38 +08:00
};
2025-10-31 17:24:07 +08:00
function getHeart() {
const raw = uni.getStorageSync("Padmin-Token");
const token = typeof raw === "string" ? raw.trim() : "";
const headers = token
? { Authorization: raw.startsWith("Bearer ") ? raw : `Bearer ${token}` }
: {};
$api
.myRequest("/dashboard/auth/heart", {}, "POST", 10100, headers)
.then((resData) => {
if (resData.code == 200) {
isLogin.value = true;
getUser();
} else {
isLogin.value = false;
getFair("refresh");
}
});
}
function getUser() {
const raw = uni.getStorageSync("Padmin-Token");
const token = typeof raw === "string" ? raw.trim() : "";
const headers = token
? { Authorization: raw.startsWith("Bearer ") ? raw : `Bearer ${token}` }
: {};
return $api
.myRequest("/system/user/login/user/info", {}, "GET", 10100, headers)
.then((resData) => {
// 正确映射响应为用户信息(优先使用 data 字段)
const data = resData?.data ?? resData;
userInfo.value = data || {};
getFair("refresh");
return userInfo.value;
});
}
function getMyFair(type = "add") {
if (type === "refresh") {
pageState.pageNum = 1;
pageState.maxPage = 1;
}
if (type === "add" && pageState.pageNum < pageState.maxPage) {
pageState.pageNum += 1;
}
let params = {
pageNum: pageState.pageNum,
pageSize: pageState.pageSize,
jobFairTitle: pageState.jobFairTitle,
};
if (isLogin.value) {
if (userInfo.value.userType == "ent") {
params.enterpriseId = userInfo.value.info.userId;
} else {
params.personId = userInfo.value.info.userId;
2025-05-13 11:10:38 +08:00
}
2025-10-31 17:24:07 +08:00
}
2025-11-03 15:08:39 +08:00
$api
.myRequest("/jobfair/public/jobfair/enterprise/my-sign-up-job-fair", params)
.then((resData) => {
if (type === "add") {
const reslist = resData.data.list;
fairList.value = fairList.value.concat(reslist);
} else {
fairList.value = resData.data.list;
}
pageState.total = resData.data.total;
pageState.maxPage = resData.data.pages;
});
2025-10-31 17:24:07 +08:00
}
function getFair(type = "add") {
if (type === "refresh") {
pageState.pageNum = 1;
pageState.maxPage = 1;
}
if (type === "add" && pageState.pageNum < pageState.maxPage) {
pageState.pageNum += 1;
}
let params = {
pageNum: pageState.pageNum,
pageSize: pageState.pageSize,
jobFairTitle: pageState.jobFairTitle,
jobFairType: state.current,
};
if (isLogin.value) {
if (userInfo.value.userType == "ent") {
params.enterpriseId = userInfo.value.info.userId;
} else {
params.personId = userInfo.value.info.userId;
2025-05-13 11:10:38 +08:00
}
2025-10-31 17:24:07 +08:00
}
$api.myRequest("/jobfair/public/jobfair/page", params).then((resData) => {
if (type === "add") {
const reslist = resData.data.list;
fairList.value = fairList.value.concat(reslist);
} else {
fairList.value = resData.data.list;
}
pageState.total = resData.data.total;
pageState.maxPage = resData.data.pages;
});
2025-05-13 11:10:38 +08:00
}
2025-10-31 17:24:07 +08:00
function toIOSDate(input) {
if (!input) return null;
if (input instanceof Date) return isNaN(input.getTime()) ? null : input;
2025-11-03 15:08:39 +08:00
if (typeof input === "number") {
2025-10-31 17:24:07 +08:00
const d = new Date(input);
return isNaN(d.getTime()) ? null : d;
}
2025-11-03 15:08:39 +08:00
if (typeof input !== "string") return null;
2025-10-31 17:24:07 +08:00
let s = input.trim();
// "YYYY-MM-DD HH:mm[:ss]" -> "YYYY-MM-DDTHH:mm[:ss]"
if (/^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}(:\d{2})?$/.test(s)) {
2025-11-03 15:08:39 +08:00
s = s.replace(" ", "T");
2025-10-31 17:24:07 +08:00
// 仅到分钟则补秒
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(s)) {
2025-11-03 15:08:39 +08:00
s = s + ":00";
2025-10-31 17:24:07 +08:00
}
}
// 其余已是 iOS 可解析格式:"YYYY/MM/DD[ HH:mm:ss]"、"YYYY-MM-DD"、ISO 8601 等
const d = new Date(s);
return isNaN(d.getTime()) ? null : d;
}
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
function parseDateTime(datetimeStr) {
if (!datetimeStr)
return {
2025-11-03 15:08:39 +08:00
time: "",
date: "",
2025-10-31 17:24:07 +08:00
};
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
const dateObj = toIOSDate(datetimeStr);
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
if (!dateObj)
2025-05-13 11:10:38 +08:00
return {
2025-11-03 15:08:39 +08:00
time: "",
date: "",
2025-10-31 17:24:07 +08:00
}; // 无效时间
const year = dateObj.getFullYear();
2025-11-03 15:08:39 +08:00
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");
2025-10-31 17:24:07 +08:00
return {
time: `${hours}:${minutes}`,
date: `${year}${month}${day}`,
};
2025-03-29 11:51:48 +08:00
}
2024-11-18 16:33:37 +08:00
2025-05-13 11:10:38 +08:00
function getTimeStatus(startTimeStr, endTimeStr) {
2025-10-31 17:24:07 +08:00
const now = new Date();
const startTime = toIOSDate(startTimeStr);
const endTime = toIOSDate(endTimeStr);
if (!startTime || !endTime) {
2025-11-03 15:08:39 +08:00
return { status: 1, statusText: "时间异常", color: "#999999" };
2025-10-31 17:24:07 +08:00
}
2025-11-03 15:08:39 +08:00
// 判断状态0 开始中1 过期2 未开始
2025-10-31 17:24:07 +08:00
let status = 0;
2025-11-03 15:08:39 +08:00
let statusText = "开始中";
let color = "#13C57C"; // 进行中 - 绿色
2025-10-31 17:24:07 +08:00
if (now < startTime) {
2025-11-03 15:08:39 +08:00
status = 2; // 未开始
statusText = "未开始";
color = "#015EEA"; // 未开始 - 蓝色
2025-10-31 17:24:07 +08:00
} else if (now > endTime) {
status = 1; // 已过期
2025-11-03 15:08:39 +08:00
statusText = "已过期";
color = "#999999"; // 已过期 - 灰色
2025-10-31 17:24:07 +08:00
} else {
status = 0; // 进行中
2025-11-03 15:08:39 +08:00
statusText = "进行中";
color = "#13C57C"; // 进行中 - 绿色
2025-10-31 17:24:07 +08:00
}
return {
2025-11-03 15:08:39 +08:00
status, // 0: 进行中1: 已过期2: 未开始
2025-10-31 17:24:07 +08:00
statusText,
2025-11-03 15:08:39 +08:00
color
2025-10-31 17:24:07 +08:00
};
2025-05-13 11:10:38 +08:00
}
function getHoursBetween(startTimeStr, endTimeStr) {
2025-10-31 17:24:07 +08:00
const start = toIOSDate(startTimeStr);
const end = toIOSDate(endTimeStr);
if (!start || !end) return 0;
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
const diffMs = end - start;
const diffHours = diffMs / (1000 * 60 * 60);
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
return +diffHours.toFixed(2); // 保留 2 位小数
2025-05-13 11:10:38 +08:00
}
const selectDate = (item) => {
2025-10-31 17:24:07 +08:00
if (currentDay.value?.fullDate === item.fullDate) {
currentDay.value = {};
getFair("refresh");
return;
}
currentDay.value = item;
getFair("refresh");
2025-05-13 11:10:38 +08:00
};
2025-10-31 17:24:07 +08:00
function getNextDates({ startDate = "", count = 6 }) {
2025-11-03 15:08:39 +08:00
const baseDate = startDate ? toIOSDate(startDate) || new Date() : new Date(); // 指定起点或今天
2025-10-31 17:24:07 +08:00
const dates = [];
const dayNames = ["日", "一", "二", "三", "四", "五", "六"];
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
for (let i = 0; i < count; i++) {
const date = new Date(baseDate);
date.setDate(baseDate.getDate() + i);
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
const fullDate = date.toISOString().slice(0, 10); // YYYY-MM-DD
const formattedDate = fullDate.slice(5); // MM-DD
const dayOfWeek = dayNames[date.getDay()];
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
dates.push({
date: formattedDate,
fullDate,
day: "周" + dayOfWeek,
});
}
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
// 可选设置默认选中项
// currentDay.value = dates[0];
2025-05-13 11:10:38 +08:00
2025-10-31 17:24:07 +08:00
return dates;
2024-11-18 16:33:37 +08:00
}
2024-11-08 11:55:23 +08:00
</script>
2025-11-03 15:08:39 +08:00
<style scoped lang="stylus">
2025-05-13 11:10:38 +08:00
.app-custom-root {
2025-10-31 17:24:07 +08:00
position: fixed;
z-index: 10;
width: 100vw;
height: calc(100% - var(--window-bottom));
overflow: hidden;
2025-05-13 11:10:38 +08:00
}
2025-10-31 17:24:07 +08:00
2025-05-13 11:10:38 +08:00
.app-container {
2025-10-31 17:24:07 +08:00
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
}
.app-container .container-header {
background: url("@/static/icon/background2.png") 0 0 no-repeat;
background-size: 100% 400rpx;
}
.app-container .container-header .header-top {
display: flex;
line-height: calc(88rpx - 14rpx);
padding: 16rpx 44rpx 14rpx 44rpx;
}
.app-container .container-header .header-top .header-btnLf {
display: flex;
white-space: nowrap;
justify-content: flex-start;
align-items: center;
width: calc(60rpx * 3);
font-weight: 500;
font-size: 40rpx;
color: #696969;
margin-right: 44rpx;
position: relative;
}
.app-container .container-header .header-top .header-btnLf .btns-wd {
position: absolute;
top: 2rpx;
right: 2rpx;
width: 16rpx;
height: 16rpx;
background: #f73636;
border-radius: 50%;
border: 4rpx solid #eeeeff;
}
.app-container .container-header .header-top .active {
font-weight: 600;
font-size: 40rpx;
color: #000000;
}
.app-container .container-header .header-input {
padding: 0 24rpx;
width: calc(100% - 48rpx);
position: relative;
}
.app-container .container-header .header-input .iconsearch {
position: absolute;
left: 50rpx;
top: 50%;
transform: translate(0, -50%);
}
.app-container .container-header .header-input .input {
padding: 0 30rpx 0 80rpx;
height: 80rpx;
background: #ffffff;
border-radius: 75rpx;
font-size: 28rpx;
}
.app-container .container-header .header-input .inputplace {
font-weight: 400;
font-size: 28rpx;
color: #b5b5b5;
}
.app-container .container-header .header-date {
padding: 28rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.app-container .container-header .header-date .data-week {
flex: 1;
display: flex;
justify-content: space-between;
flex-wrap: nowrap;
overflow: hidden;
}
.app-container .container-header .header-date .data-week .weel-days {
font-family: "PingFangSC-Medium", "PingFang SC", "Helvetica Neue", Helvetica,
Arial, "Microsoft YaHei", sans-serif;
display: flex;
justify-content: center;
flex-direction: column;
text-align: center;
font-weight: 400;
font-size: 24rpx;
color: #333333;
width: 96rpx;
height: 88rpx;
}
.app-container .container-header .header-date .data-week .weel-days .day {
font-weight: 500;
}
.app-container .container-header .header-date .data-week .active {
background: rgba(37, 107, 250, 0.1);
border-radius: 12rpx;
color: #256bfa;
}
.app-container .container-header .header-date .data-all {
width: 66rpx;
height: 66rpx;
margin-left: 18rpx;
}
.app-container .container-header .header-date .data-all .allimg {
width: 100%;
height: 100%;
2025-05-13 11:10:38 +08:00
}
.container-main {
2025-10-31 17:24:07 +08:00
flex: 1;
overflow: hidden;
background-color: #f4f4f4;
2025-05-13 11:10:38 +08:00
}
2025-10-31 17:24:07 +08:00
2025-05-13 11:10:38 +08:00
.main-scroll {
2025-10-31 17:24:07 +08:00
width: 100%;
height: calc(100% - 150rpx);
}
.cards {
padding: 28rpx;
}
.cards .card {
margin-top: 28rpx;
padding: 32rpx;
2025-11-03 15:08:39 +08:00
background: linear-gradient(to bottom, #e3efff 0%, #fbfdff 100%);
2025-10-31 17:24:07 +08:00
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.04);
border-radius: 20rpx;
}
.cards .card-title {
font-family: "PingFangSC-Medium", "PingFang SC", "Helvetica Neue", Helvetica,
Arial, "Microsoft YaHei", sans-serif;
2025-11-03 15:08:39 +08:00
font-weight: 600;
font-size: 34rpx;
color: #005eb6;
text-align: center;
position relative
&::after {
content: "";
width: 120rpx;
height: 4rpx;
background: linear-gradient(to right, #015EEA 0%, #00C0FA 100%);
position: absolute;
left: 50%;
bottom: -14rpx;
transform: translate(-50%, -50%);
}
.center-date {
font-weight: 400;
font-size: 28rpx;
color: #ff881a;
position: absolute;
right: 0;
}
2025-10-31 17:24:07 +08:00
}
.cards .card-row {
display: flex;
2025-11-03 15:08:39 +08:00
justify-content: center;
font-size: 26rpx;
color: #3e8ff3;
margin-top: 23rpx;
2025-10-31 17:24:07 +08:00
}
.cards .card-times {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 24rpx;
}
.cards .card-times .time-left,
.cards .card-times .time-right {
text-align: center;
}
.cards .card-times .left-date {
2025-11-03 15:08:39 +08:00
font-weight: 600;
2025-10-31 17:24:07 +08:00
font-size: 48rpx;
font-family: "PingFangSC-Medium", "PingFang SC", "Helvetica Neue", Helvetica,
Arial, "Microsoft YaHei", sans-serif;
2025-11-03 15:08:39 +08:00
background: linear-gradient(180deg, #015EEA 0%, #00C0FA 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
2025-10-31 17:24:07 +08:00
}
.cards .card-times .left-dateDay {
font-weight: 400;
font-size: 24rpx;
color: #333333;
margin-top: 12rpx;
}
.cards .card-times .line {
width: 40rpx;
2025-11-03 15:08:39 +08:00
height: 2rpx;
background: #7BB6FF;
2025-10-31 17:24:07 +08:00
margin-top: 64rpx;
}
.cards .card-times .time-center {
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.cards .card-times .time-center .center-dateDay {
font-weight: 400;
font-size: 24rpx;
2025-11-03 15:08:39 +08:00
color: #fff;
2025-10-31 17:24:07 +08:00
margin-top: 6rpx;
line-height: 48rpx;
2025-11-03 15:08:39 +08:00
width: max-content;
2025-10-31 17:24:07 +08:00
height: 48rpx;
2025-11-03 15:08:39 +08:00
background: #71B1FF;
2025-10-31 17:24:07 +08:00
border-radius: 8rpx;
2025-11-03 15:08:39 +08:00
padding: 0 30rpx;
2025-10-31 17:24:07 +08:00
}
.cards .recommend-card-line {
width: 100%;
height: 0;
border-radius: 0;
2025-11-03 15:08:39 +08:00
border-bottom: 2rpx dashed rgba(0, 0, 0, 0.14);
2025-10-31 17:24:07 +08:00
margin-top: 32rpx;
position: relative;
}
.cards .recommend-card-line::before {
content: "";
position: absolute;
left: 0;
top: 0;
transform: translate(-50%, -50%);
width: 28rpx;
height: 28rpx;
background: #f4f4f4;
border-radius: 50%;
}
.cards .recommend-card-line::after {
content: "";
position: absolute;
right: 0;
top: 0;
transform: translate(50%, -50%);
width: 28rpx;
height: 28rpx;
background: #f4f4f4;
border-radius: 50%;
}
.cards .card-footer {
margin-top: 32rpx;
min-height: 50rpx;
font-weight: 400;
font-size: 28rpx;
color: #6c7282;
2025-11-03 15:08:39 +08:00
text-align: center;
2025-10-31 17:24:07 +08:00
}
.cards .card:first-child {
margin-top: 0;
2025-05-13 11:10:38 +08:00
}
2024-11-08 11:55:23 +08:00
</style>