开发了很多页面

This commit is contained in:
田岩
2025-08-06 22:10:55 +08:00
parent 3d5285ed89
commit 401c2cfa1a
51 changed files with 3052 additions and 253 deletions
+9
View File
@@ -93,6 +93,11 @@ view {
display: flex;
justify-content: space-between;
}
.flex-c-c {
display: flex;
justify-content: center;
align-items: center;
}
.tar{
text-align: right;
}
@@ -132,4 +137,8 @@ view {
/* 显示的行数 */
overflow: hidden;
}
.no-overflow{
overflow: hidden;
}
</style>
+12
View File
@@ -0,0 +1,12 @@
import request from '@/api/request'
const module_url = '/traexam'
// 1.查询考试列表分页
export const queryTraExamPapersPage = (data) => {
return request({
url: module_url + '/traExamPapers/queryTraExamPapersPage',
method: 'post',
data
});
};
@@ -0,0 +1,12 @@
<template>
<view style="width: 100%;" class="flex-c-c">
<image src="@/static/images/common/default_img.png" mode="aspectFit" style="width:400rpx"></image>
</view>
</template>
<script>
</script>
<style>
</style>
+3
View File
@@ -1,6 +1,9 @@
export const MAX_UPLOAD_PICTURE_SIZE = 2048 // 最大图片上传限制
export const Max_Upload_Document_Size = 102400 // 最大文档上传限制
export const TextareaInputLimitCharacter = 160 // 全局多行文本输入框限制字数
// 公共tab页的图片
export const LineBg =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAABL0lEQVQ4T6XSv0uCURTG8e9jgpRNDS1BU1sELUFLQVM1tgQFtcR7A8m1LQqaLGhOkQKH/o5aKiiHlgiE0K1oCYLAMk9ov/RF8e313u2ew4dzzzmi2+NsA9gH3hCr6srzbAJxDkS/nbvwYNJilMkDow1FXYUHneWAlV/MqN3ZcKCzHWDb164MGa3/H/Qshdj0YbdUmORIL8HBNRsgShZjoQkznvioY/e19wCgCccSsAcM+bBnjHmyuvx5bw8mrJ93FoEkYrzFej0g5kjrpjH2BTrro8oIYhgYQ0xhTCPibfb0ggjLHKrojwvPEogDIBZgycsYKQrscqpKq3zh7BXo7YBVgRMibLWqqvnLzh6BwTZgESNHD8edoL+hOJupT9CII0oYJcQ14oy0CgHa0JTyCeBLVNeWygE5AAAAAElFTkSuQmCC";
export const GENDER = [{
value: "m",
label: "男性",
+56 -1
View File
@@ -136,6 +136,60 @@
}
}
},
{
"path": "pages/preview/index",
"style": {
"navigationBarTitleText": "",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/favorites/index",
"style": {
"navigationBarTitleText": "",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/messageNotification/index",
"style": {
"navigationBarTitleText": "消息",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/testingHall/index",
"style": {
"navigationBarTitleText": "考试中心",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/testingHall/details",
"style": {
"navigationBarTitleText": "考试详情",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/wrong_question_record/index",
"style": {
"navigationBarTitleText": "错题本",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/course/index",
"style": {
@@ -196,7 +250,8 @@
"navigationStyle": "custom",
"app-plus": {
"titleView": false,
"bounce": "none"
"bounce": "none",
"softinputNavBar": "none"
}
},
"uniIdRouter": {}
@@ -107,7 +107,7 @@
const popup = ref(null)
const popup_input_bottom = ref('0px')
const inputValue = ref('')
const placeholder = ref('')
const message_list = reactive([])
+54 -7
View File
@@ -16,16 +16,30 @@
<view class="title-num">
<view class="num-item">
<image class="title-icon" src="/src/static/images/courseDetail/zhishidian.png"
mode="widthFix"></image>
mode="heightFix"></image>
<view class="mr-10">知识点</view>
<view class="c-000">{{ form.pgrphNum || 0 }}</view>
</view>
<view class="num-item">
<image class="title-icon" src="/src/static/images/courseDetail/yixue.png" mode="widthFix">
<image class="title-icon" src="/src/static/images/courseDetail/yixue.png" mode="heightFix">
</image>
<view class="mr-10">已学</view>
<view class="c-000">{{ form.styParaGraphNum || 0 }}</view>
</view>
<view class="num-item examination">
<image class="title-icon" src="/src/static/images/courseDetail/charts.png" mode="heightFix">
</image>
<view>考试排行榜</view>
<view class="back-icon"></view>
</view>
<view class="fl1">
</view>
<view class="num-item" @click="test=!test">
<image v-show="test" class="collect-icon"
src="/src/static/images/courseDetail/in_collect.png" mode="widthFix"></image>
<image v-show="!test" class="collect-icon"
src="/src/static/images/courseDetail/out_collect.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="body-box">
@@ -66,7 +80,7 @@
@click="common.navigateTo('/pages/courseDetail/submit?crsNum='+crsNum+'&imgId='+form.imgId)">发布评价</uv-button>
</template>
</view>
</view>
</template>
@@ -101,6 +115,7 @@
name: '评价'
}]);
const test = ref(false);
const commentRef = ref(null);
const tabsDiv = ref(null);
const form = ref({});
@@ -110,7 +125,6 @@
const tabSwitch = (item) => {
tabAct.value = item.index;
};
// 滚动到底部/右边,会触发 scrolltolower 事件
const scrolltolower = (item) => {
if (tabAct.value == 2) {
commentRef.value?.getData();
@@ -183,7 +197,7 @@
margin-right: 10rpx;
position: fixed;
left: 25rpx;
top: var(--status-bar-height) ;
top: var(--status-bar-height);
// background-color: red;
// width: 60rpx;
// height: 60rpx;
@@ -250,7 +264,6 @@
left: -4rpx;
.back-image {
width: 100%;
}
}
@@ -275,13 +288,46 @@
}
.title-icon {
width: 22rpx;
height: 30rpx;
margin-right: 10rpx;
}
.collect-icon {
width: 40rpx;
height: 40rpx;
margin-right: 10rpx;
}
.title-num {
display: flex;
.examination {
color: #0066FF;
.back-icon {
position: relative;
width: 40rpx;
height: 40rpx;
cursor: pointer;
}
.back-icon::before,
.back-icon::after {
content: '';
position: absolute;
transition: all 0.3s ease;
}
.back-icon::after {
top: 25%;
left: 25%;
width: 40%;
height: 40%;
border-top: 4rpx solid #0066FF;
border-left: 4rpx solid #0066FF;
transform: rotate(135deg);
}
}
}
.body-box {
@@ -348,6 +394,7 @@
font-size: 30rpx;
margin-right: 30rpx;
color: #666666;
height: 30rpx;
}
@@ -0,0 +1,202 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower">
<view class="item" v-for="item in data_list">
<view class="img_div">
<image class="img" src="@/static/images/test/4.png" mode="scaleToFill"></image>
<view class="subscript">
7.9
</view>
</view>
<view class="right_div">
<view class="title ellipsis-text">
对公小程序开户操作流对公小程序开户操作流程
</view>
<view class="tag_div">
<view class="tag">
公金业务
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
</view>
<view class="time_and_num">
<view class="mr-10">
发布2025-05-13
</view>
<view>
已学22345
</view>
</view>
</view>
</view>
<uv-load-more v-if="total != 0" :status="status" loadmore-text="轻轻上拉加载" :height="30"></uv-load-more>
</scroll-view>
</view>
</template>
<script setup>
const status = ref('loading') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
import {
ref,
reactive,
onMounted,
nextTick
} from 'vue'
import {
queryTraCrsBbsInfoByCrsId
} from '@/api/courseDetail.js';
const getData = (from = '') => {
if (from == 'first') {
if (total.value !== -1) {
return
}
status.value = 'loading'
total.value = -1
page.value = 1
data_list.length = 0
} else {
if (status.value !== 'loadmore' && status.value !== '') return
status.value = 'loading'
page.value++
}
console.log(status.value, '阿斯顿撒');
setTimeout(() => {
queryTraCrsBbsInfoByCrsId({
crsId: 'CRS0250181220722025070408313900000018729',
page: page.value,
limit: limit
}).then(res => {
total.value = res.total
data_list.push(...res.body)
}).finally(() => {
if (data_list.length >= total.value) {
status.value = 'nomore'
} else {
status.value = 'loadmore'
}
})
}, 200)
}
const scrolltolower = (item) => {
getData()
};
defineExpose({
getData
})
</script>
<style scoped lang="scss">
.scroll_div {
background-color: #F1F5FA;
padding: 22rpx;
}
.scroll-Y {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 44rpx);
background-color: #fff;
border-radius: 16rpx;
}
.scroll-Y .item {
height: 170rpx;
margin: 32rpx 22rpx;
display: flex;
.img_div {
position: relative;
width: 224rpx;
height: 168rpx;
overflow: hidden;
border-radius: 22rpx;
.img {
width: 224rpx;
height: 168rpx;
}
.subscript {
position: absolute;
right: 0;
top: 0;
width: 78rpx;
height: 46rpx;
border-radius: 0px 0px 0px 22rpx;
font-family: PingFangSC;
font-weight: 400;
font-size: 22rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #EF5705;
color: #FFFFFF ;
}
}
.right_div {
flex: 1;
overflow: hidden;
margin-left: 24rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
.title {
font-family: PingFangSC;
font-weight: 500;
font-size: 30rpx;
font-weight: 600;
color: #333333;
}
.tag_div {
display: flex;
flex-wrap: wrap;
height: 38rpx;
overflow: hidden;
.tag {
height: 38rpx;
padding: 0 10rpx;
margin-right: 14rpx;
border-radius: 8rpx;
border: 2rpx solid #FFA150;
font-family: PingFangSC;
font-weight: 500;
font-size: 23rpx;
color: #FFA150;
display: flex;
justify-content: center;
align-items: center;
}
}
.time_and_num {
display: flex;
font-family: PingFangSC;
font-weight: 400;
font-size: 24rpx;
color: #666;
margin-bottom: 16rpx;
line-height: 23rpx;
flex-wrap: nowrap;
height: 23rpx;
overflow: hidden;
}
}
}
</style>
@@ -0,0 +1,229 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower">
<view class="item" :class="getStatusClass(index)" v-for="(item,index) in data_list">
<view class="img_div">
<image class="img" src="@/static/images/test/4.png" mode="scaleToFill"></image>
<view class="subscript" v-if="index % 3==0">
进行中
</view>
<view class="subscript" v-if="index % 3==1">
已完成
</view>
<view class="subscript" v-if="index % 3==2">
已超时
</view>
</view>
<view class="right_div">
<view class="title ellipsis-text">
对公小程序开户操作流对公小程序开户操作流程
</view>
<view class="time_div">
起止时间<text class="blod_color">2025-05-13至2025-08-13</text>
</view>
<view class="people_progress_div">
<view class="mr-10">
完成人数<text class="blod_color">34/125</text>
</view>
<view>
我的进度<text class="blod_color">25%</text>
</view>
</view>
</view>
</view>
<uv-load-more v-if="total != 0" :status="status" loadmore-text="轻轻上拉加载" :height="30"></uv-load-more>
</scroll-view>
</view>
</template>
<script setup>
const status = ref('loading') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
import {
ref,
reactive,
onMounted,
nextTick
} from 'vue'
import {
queryTraCrsBbsInfoByCrsId
} from '@/api/courseDetail.js';
const getData = (from = '') => {
if (from == 'first') {
if (total.value !== -1) {
return
}
status.value = 'loading'
total.value = -1
page.value = 1
data_list.length = 0
} else {
if (status.value !== 'loadmore' && status.value !== '') return
status.value = 'loading'
page.value++
}
console.log(status.value, '阿斯顿撒');
setTimeout(() => {
queryTraCrsBbsInfoByCrsId({
crsId: 'CRS0250181220722025070408313900000018729',
page: page.value,
limit: limit
}).then(res => {
total.value = res.total
data_list.push(...res.body)
}).finally(() => {
if (data_list.length >= total.value) {
status.value = 'nomore'
} else {
status.value = 'loadmore'
}
})
}, 200)
}
const getStatusClass = (index) => {
const remainder = index % 3;
if (remainder === 0) return 'in_progress';
if (remainder === 1) return 'completed';
return 'expired';
};
const scrolltolower = (item) => {
getData()
};
defineExpose({
getData
})
</script>
<style scoped lang="scss">
.scroll_div {
background-color: #F1F5FA;
padding: 22rpx;
}
.scroll-Y {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 44rpx);
background-color: #fff;
border-radius: 16rpx;
}
.scroll-Y .item.in_progress {
// 进行中
.subscript {
color: #0066FF;
background-color: #DAF0FF;
}
.blod_color {
color: #333333;
}
}
.scroll-Y .item.completed {
// 已完成
.subscript {
color: #FFFFFF;
background-color: #33C583;
}
.blod_color {
color: #333333;
}
}
.scroll-Y .item.expired {
// 已超时
.subscript {
color: #FFFFFF;
background-color: #EF5705;
}
.blod_color {
color: #D70C18;
}
}
.scroll-Y .item {
height: 170rpx;
margin: 32rpx 22rpx;
display: flex;
.img_div {
position: relative;
width: 224rpx;
height: 168rpx;
overflow: hidden;
border-radius: 22rpx;
.img {
width: 226rpx;
height: 168rpx;
}
.subscript {
position: absolute;
right: 0;
top: 0;
width: 92rpx;
height: 46rpx;
border-radius: 0px 0px 0px 22rpx;
font-family: PingFangSC;
font-weight: 400;
font-size: 22rpx;
line-height: 32px;
display: flex;
align-items: center;
justify-content: center;
}
}
.right_div {
flex: 1;
overflow: hidden;
margin-left: 24rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
.title {
font-family: PingFangSC;
font-size: 30rpx;
font-weight: 600;
color: #333333;
line-height: 44rpx;
}
.time_div {
font-family: PingFangSC;
font-weight: 400;
font-size: 23rpx;
color: #666;
line-height: 23rpx;
flex-wrap: nowrap;
height: 23rpx;
overflow: hidden;
}
.people_progress_div {
display: flex;
font-family: PingFangSC;
font-weight: 400;
font-size: 23rpx;
color: #666;
margin-bottom: 23rpx;
line-height: 23rpx;
flex-wrap: nowrap;
height: 23rpx;
overflow: hidden;
}
}
}
</style>
+167
View File
@@ -0,0 +1,167 @@
<template>
<view class="max_page detail-main">
<nav-bar :is_seat="false"></nav-bar>
<view class="fixed_search_div">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
</view>
<view class="title font_pf">我的收藏</view>
</view>
<view class="detail-body">
<view class="body-tab">
<uv-tabs class="font_pf my_tabs" :current="tabAct" :list="tabList" @change="tabChange"
:scrollable="false" line-color="#0066FF"
:inactive-style="{ color: '#333333', fontSize: '30rpx', fontWeight:'600'}"
:activeStyle="{color:'#0066FF',fontSize:'30rpx', fontWeight:'600'}"
:lineColor="`url(${lineBg}) 10% 10%`"></uv-tabs>
</view>
<view class="uni-margin-wrap no-overflow">
<swiper class="swiper" :current="tabAct" :indicator-dots="false" @change="swiperChange">
<swiper-item>
<FavoritesCourse ref="courseRef"></FavoritesCourse>
</swiper-item>
<swiper-item>
<FavoritesTask ref="taskRef"></FavoritesTask>
</swiper-item>
</swiper>
</view>
</view>
</view>
</template>
<script setup>
import FavoritesTask from './components/favorites-task.vue'
import FavoritesCourse from './components/favorites-course.vue'
// 我的收藏
import {
reactive,
ref,
computed,
nextTick,
onMounted,
watch
} from 'vue';
import {
queryTraCrsBbsInfoByCrsId,
replyTraCrsBbsInfo,
qryChildTraCrsBbsInfo
} from '@/api/courseDetail.js';
import common from '@/common/common';
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
const lineBg =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAABL0lEQVQ4T6XSv0uCURTG8e9jgpRNDS1BU1sELUFLQVM1tgQFtcR7A8m1LQqaLGhOkQKH/o5aKiiHlgiE0K1oCYLAMk9ov/RF8e313u2ew4dzzzmi2+NsA9gH3hCr6srzbAJxDkS/nbvwYNJilMkDow1FXYUHneWAlV/MqN3ZcKCzHWDb164MGa3/H/Qshdj0YbdUmORIL8HBNRsgShZjoQkznvioY/e19wCgCccSsAcM+bBnjHmyuvx5bw8mrJ93FoEkYrzFej0g5kjrpjH2BTrro8oIYhgYQ0xhTCPibfb0ggjLHKrojwvPEogDIBZgycsYKQrscqpKq3zh7BXo7YBVgRMibLWqqvnLzh6BwTZgESNHD8edoL+hOJupT9CII0oYJcQ14oy0CgHa0JTyCeBLVNeWygE5AAAAAElFTkSuQmCC";
const courseRef = ref(null);
const taskRef = ref(null);
const tabAct = ref(0);
const tabList = ref([{
name: '课程收藏'
}, {
name: '任务收藏'
}]);
const tabChange = (item) => {
tabAct.value = item.index;
};
const swiperChange = (item) => {
tabAct.value = item.detail.current;
};
onMounted(() => {
watch(tabAct, (newValue, oldValue) => {
if(newValue === 0) {
courseRef.value?.getData('first')
} else if(newValue === 1) {
taskRef.value?.getData('first')
}
}, { immediate: true }) // 这里的immediate会在onMounted之后执行
})
</script>
<style lang="scss" scoped>
$bg-margin-left: 50rpx;
.my_tabs {
// 解决这个圆角的图片,开穿透
:deep(.uv-tabs__wrapper__nav__line) {
height: 26rpx !important;
left: 70rpx;
background-size: 28rpx !important;
background-repeat: no-repeat !important;
}
}
.swiper {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 10rpx);
}
.swiper-item {
display: block;
height: 100%;
line-height: 300rpx;
text-align: center;
}
.detail-body {
background: #ffffff;
border-radius: 15rpx;
z-index: 101;
overflow: hidden;
.body-tab {
height: 88rpx;
}
}
.detail-main {
background-color: #F6F8FF;
overflow: hidden;
}
.title {
color: #000000;
font-size: 34rpx;
height: 34rpx;
font-weight: 600;
line-height: 34rpx;
}
.fixed_search_div {
padding: calc(20rpx + var(--status-bar-height)) 15rpx 24rpx 30rpx;
display: flex;
align-items: center;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
.back_div {
position: absolute;
left: 20rpx;
padding: 10rpx;
.back-icon {
position: relative;
width: 50rpx;
height: 50rpx;
cursor: pointer;
display: flex;
align-items: center;
}
.back-icon::before,
.back-icon::after {
content: '';
position: absolute;
transition: all 0.3s ease;
}
.back-icon::after {
top: 25%;
left: 25%;
width: 40%;
height: 40%;
border-top: 4rpx solid #000000;
border-left: 4rpx solid #000000;
transform: rotate(-45deg);
}
}
}
</style>
+2 -2
View File
@@ -98,7 +98,7 @@
</view>
</view>
<view class="group">
<view class="item">
<view class="item" @click="common.navigateTo('/pages/testingHall/index')">
<image class="icon" src="@/static/images/index/navigation_examination.png"></image>
<view class="title">考试中心</view>
</view>
@@ -106,7 +106,7 @@
<image class="icon" src="@/static/images/index/navigation_practice.png"></image>
<view class="title">竞赛练习</view>
</view>
<view class="item">
<view class="item" @click="common.navigateTo('/pages/wrong_question_record/index')">
<image class="icon" src="@/static/images/index/navigation_wrong_question.png"></image>
<view class="title">错题本</view>
</view>
-8
View File
@@ -1,8 +0,0 @@
<template>
</template>
<script>
</script>
<style>
</style>
+33 -22
View File
@@ -29,40 +29,34 @@
<view class="fl1"></view>
</view>
<!-- 显示当前选中的徽章 -->
<!-- <view class="dan" @click="changeBadge">
<view class="dan" @click="changeBadge">
<view class="dan_img">
<image class="img_100" :src="`/static/images/me/${badgeList[currentIndex].png}`"
mode="heightFix" alt="当前徽章"></image>
</view>
<view class="dan_text">{{ badgeList[currentIndex].name }}</view>
</view> -->
</view>
</view>
<!-- 用户学习时间信息 -->
<view class="study_information">
<view class="item">
<view class="top">累计学习时长</view>
<view class="bottom">
<uv-count-to :startVal="statistics_data['startStdtTmLen']"
:endVal="statistics_data['stdtTmLen']" :useEasing="true" :decimals="1"
ref="stdtTmLenRef"></uv-count-to>h
</view>
</view>
<view class="item">
<view class="top">累计完成任务</view>
<view class="top">我的积分</view>
<view class="bottom">
<uv-count-to :startVal="statistics_data['startAccmTaskCnt']"
:endVal="statistics_data['accmTaskCnt']" :useEasing="true"
ref="accmTaskCntRef"></uv-count-to>
</view>
</view>
<view class="item-interval">
</view>
<view class="item">
<view class="top">累计获得积分</view>
<view class="top">徽章墙</view>
<view class="bottom">
<uv-count-to :startVal="statistics_data['startAccmPoint']"
:endVal="statistics_data['accmPoint']" :useEasing="true"
ref="accmPointRef"></uv-count-to>
<uv-count-to :startVal="statistics_data['startAccmTaskCnt']"
:endVal="statistics_data['accmTaskCnt']" :useEasing="true"
ref="accmTaskCntRef"></uv-count-to>
</view>
</view>
</view>
@@ -70,8 +64,6 @@
</view>
<!-- 4个导航 -->
<view class="navigation_div">
<!-- <scroll-view class="scroll-view" :scroll-x="true" :show-scrollbar="false"> -->
<scroll-view class="scroll-view" scroll-x="true" :show-scrollbar="false">
<view class="scroll-view-item">
<view class="item">
@@ -117,9 +109,12 @@
</view>
<view class="cell_div">
<uv-cell-group :border="false">
<uv-cell title="消息通知" :isLink="true" @click="goTest()"></uv-cell>
<uv-cell title="我的收藏" :isLink="true"></uv-cell>
<uv-cell title="排行榜" :isLink="true" :clickable="false" :border="false"></uv-cell>
<uv-cell title="消息通知" :isLink="true" @click="common.navigateTo('/pages/messageNotification/index')"></uv-cell>
<uv-cell title="我的收藏" :isLink="true" @click="common.navigateTo('/pages/favorites/index')"></uv-cell>
<uv-cell title="排行榜" :isLink="true" :clickable="false" :border="false"
@click="common.navigateTo('/pages/me/preview')"></uv-cell>
<uv-cell title="我的预览" :isLink="true" :clickable="false" :border="false"
@click="common.navigateTo('/pages/preview/index')"></uv-cell>
</uv-cell-group>
</view>
<view class="cell_div">
@@ -543,6 +538,22 @@
z-index: 20;
margin: 30rpx 50rpx;
.item-interval {
position: relative;
&:before {
content: "";
position: absolute;
left: 50%;
top: 20%;
transform: translateX(-50%);
width: 1rpx;
height: 60%;
background-color: #444;
}
}
.item {
flex: 1;
display: flex;
@@ -552,7 +563,7 @@
.top {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 25rpx;
font-size: 28rpx;
color: #666666;
line-height: 35rpx;
text-align: center;
-8
View File
@@ -1,8 +0,0 @@
<template>
</template>
<script>
</script>
<style>
</style>
+335
View File
@@ -0,0 +1,335 @@
<template>
<view class="main_div max_page">
<view class="body-title">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
</view>
<view>消息</view>
<view class="delete_div" @click="common.navigateBack()">
<image class="img" src="@/static/images/message_notification/delete_icon.png" mode="aspectFit">
</image>
</view>
</view>
<view class="input-view">
<uv-input shape="circle" placeholderStyle='color:#999999;font-size:28rpx' placeholder="请输入关键词"
suffixIcon="search" :customStyle="customStyle" :suffixIconStyle="suffixIconStyle">
</uv-input>
</view>
<scroll-view ref="scrollRef" scroll-y="true" class="scroll-Y" :refresher-enabled="true"
@refresherrefresh="onRefresh" @refresherrestore="triggered = 'restore'" :refresher-triggered="triggered"
refresher-default-style="none">
<!-- 主体 -->
<view class="content">
<view style="position: absolute;top: -90rpx;width: 100%;height: 90rpx;background-color: red;"> 下拉显示</view>
<uv-swipe-action>
<uv-swipe-action-item :options="options" :threshold="40" :index="index"
v-for="(index,item) in data_list">
<view class="item">
<view class="icon">
<image class="img_100" :src="'/static/images/message_notification/type_1.png'"
mode="widthFix"></image>
</view>
<view class="right">
<view class="top">
<view class="title">
新任务提醒
</view>
<view class="time">
2025-05-05
</view>
</view>
<view class="bottom">
<view class="note">
您的学习任务
</view>
<view class="num_div">
{{item}}
</view>
</view>
</view>
</view>
</uv-swipe-action-item>
</uv-swipe-action>
<uv-load-more v-if="total != 0" :status="status" loadmore-text="轻轻上拉加载" :height="30"></uv-load-more>
</view>
</scroll-view>
</view>
</template>
<script setup>
import {
ref,
reactive,
nextTick,
onMounted
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import {
queryTraCrsBbsInfoByCrsId
} from '@/api/courseDetail.js';
const customStyle = {
backgroundColor: "#ffffff",
paddingLeft: "40rpx",
height: '78rpx',
paddingTop: "5px",
paddingBottom: "5px",
border: "none"
}
const suffixIconStyle = {
color: "#2c8ef2",
fontSize: "50rpx"
}
const options = [{
text: '删除',
style: {
backgroundColor: '#f56c6c'
}
}]
const status = ref('loadmore') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
const triggered = ref(false)
const _freshing = ref(false)
const offset = ref(0)
const scrollRef = ref(null)
// 下拉过程中触发
const onPulling = (e) => {
console.log("onpulling", e)
}
// 刷新处理函数
const onRefresh = () => {
if (_freshing.value) return
_freshing.value = true
setTimeout(() => {
triggered.value = false
_freshing.value = false
}, 1000)
}
const getData = (from = '') => {
if (from == 'first') {
if (total.value !== -1) {
return
}
status.value = 'loading'
total.value = -1
page.value = 1
data_list.length = 0
} else {
if (status.value !== 'loadmore' && status.value !== '') return
status.value = 'loading'
page.value++
}
console.log(status.value, '阿斯顿撒');
setTimeout(() => {
queryTraCrsBbsInfoByCrsId({
crsId: 'CRS0250181220722025070408313900000018729',
page: page.value,
limit: limit
}).then(res => {
total.value = res.total
data_list.push(...res.body)
}).finally(() => {
if (data_list.length >= total.value) {
status.value = 'nomore'
} else {
status.value = 'loadmore'
}
})
}, 200)
}
onMounted(() => {
triggered.value = true
getData()
// setTimeout(() => {
// triggered.value = true
// message_list.value.push(...[1, 2, 3, 4, 5])
// }, 1000)
console.log(scrollRef.value);
})
</script>
<style scoped lang="scss">
.pulldown-loading-box {
position: fixed;
left: 0;
right: 0;
z-index: 3;
transform: translateY(-100%);
transition: transform .3s;
z-index: 1;
}
.scroll-Y {
height: calc(100vh - 70rpx - var(--status-bar-height) - 78rpx - 40rpx);
position: relative;
overflow: hidden;
.content {
width: 100%;
height: 100%;
border-radius: 20rpx 20rpx 0 0;
background-color: #fff;
box-shadow: 0 0 6rpx #B3D6FF;
position: relative;
.item {
width: 100%;
height: 154rpx;
padding: 38rpx 38rpx 38rpx 38rpx;
display: flex;
justify-content: space-between;
align-items: center;
.icon {
width: 78rpx;
height: 78rpx;
}
.right {
margin-left: 16rpx;
flex: 1;
.top {
display: flex;
justify-content: space-between;
.title {
font-family: PingFangSC;
font-weight: 600;
font-size: 30rpx;
color: #000000;
line-height: 46rpx;
text-align: left;
font-style: normal;
}
.time {
font-size: 23rpx;
color: #999999;
line-height: 30rpx;
text-align: right;
font-style: normal;
}
}
.bottom {
display: flex;
justify-content: space-between;
.note {
font-family: PingFangSC;
font-weight: 400;
font-size: 26rpx;
color: #999999;
line-height: 34rpx;
text-align: left;
font-style: normal;
}
.num_div {
padding: 0 8rpx;
height: 31rpx;
background: #FF6C75;
border-radius: 15rpx;
display: flex;
align-items: center;
justify-content: center;
font-family: ArialMT;
font-size: 22rpx;
color: #FFFFFF;
line-height: 26px;
min-width: 40rpx;
}
}
}
}
}
}
.main_div {
display: flex;
flex-direction: column;
align-items: center;
background: linear-gradient(0deg, rgba(234, 246, 255, 0) 0%, #C3E6FF 100%);
// background-size: 100% 300px;
// background-repeat: no-repeat; /* 防止渐变重复平铺 */
padding-top: var(--status-bar-height);
}
.body-title {
width: 100%;
height: 70rpx;
font-size: 33rpx;
padding-top: 10rpx;
font-weight: 500;
color: #000;
position: relative;
text-align: center;
.delete_div {
position: absolute;
right: 20rpx;
top: 17rpx;
width: 50rpx;
height: 50rpx;
.img {
width: 34rpx;
height: 34rpx;
}
}
.back_div {
position: absolute;
left: 26rpx;
height: 34rpx;
top: 17rpx;
.back-icon {
position: relative;
width: 50rpx;
height: 50rpx;
cursor: pointer;
display: flex;
align-items: center;
}
.back-icon::before,
.back-icon::after {
content: '';
position: absolute;
transition: all 0.3s ease;
}
.back-icon::after {
top: 25%;
left: 25%;
width: 40%;
height: 40%;
border-top: 4rpx solid #2b2c2e;
border-left: 4rpx solid #2b2c2e;
transform: rotate(-45deg);
}
}
}
.input-view {
width: 90%;
margin: 20rpx auto;
height: 78rpx;
}
</style>
@@ -0,0 +1,42 @@
<template>
<view class="scroll_div">
<scroll-view class="scroll-Y" @scrolltolower="scrolltolower">
<view class="item">
<image src="/src/static/images/common/default_img_2.png" mode="aspectFit"></image>
</view>
</scroll-view>
</view>
</template>
<script setup>
</script>
<style scoped lang="scss">
.scroll_div {
/* 圆形渐变,颜色顺序已反转(原1和3交换) */
background: radial-gradient(circle,
#C3B9FF 0%,
/* 原第三种颜色,现在作为起始颜色 */
#DFF3FF 46%,
/* 中间过渡色保持不变 */
#BFEBFF 100%
/* 原第一种颜色,现在作为结束颜色 */
);
/* 渐变中心点仍在左下角,向右侧和上方扩散 */
background-position: 0% 100%;
background-size: 200% 200%;
}
.scroll-Y {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx);
}
.scroll-Y .item {
// background-color: red;
display: flex;
flex-direction: column;
align-items: center;
margin-top: 300rpx;
}
</style>
@@ -0,0 +1,195 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower">
<view class="item" v-for="item in data_list">
<view class="img_div">
<image class="img" src="@/static/images/test/4.png" mode="scaleToFill"></image>
</view>
<view class="right_div">
<view class="title ellipsis-text">
对公小程序开户操作流对公小程序开户操作流程
</view>
<view class="tag_div">
<view class="tag">
公金业务
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
<view class="tag">
中级
</view>
</view>
<view class="time_and_num"></view>
</view>
</view>
<uv-load-more v-if="total != 0" :status="status" loadmore-text="轻轻上拉加载" :height="30"></uv-load-more>
</scroll-view>
</view>
</template>
<script setup>
const status = ref('loading') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
import {
ref,
reactive,
onMounted,
nextTick
} from 'vue'
import {
queryTraCrsBbsInfoByCrsId
} from '@/api/courseDetail.js';
const getData = (from = '') => {
if (from == 'first') {
if (total.value !== -1) {
return
}
status.value = 'loading'
total.value = -1
page.value = 1
data_list.length = 0
} else {
if (status.value !== 'loadmore' && status.value !== '') return
status.value = 'loading'
page.value++
}
console.log(status.value, '阿斯顿撒');
setTimeout(() => {
queryTraCrsBbsInfoByCrsId({
crsId: 'CRS0250181220722025070408313900000018729',
page: page.value,
limit: limit
}).then(res => {
total.value = res.total
data_list.push(...res.body)
}).finally(() => {
if (data_list.length >= total.value) {
status.value = 'nomore'
} else {
status.value = 'loadmore'
}
})
}, 200)
}
const scrolltolower = (item) => {
getData()
};
defineExpose({
getData
})
</script>
<style scoped lang="scss">
.scroll_div {
background-color: #F1F5FA;
padding: 22rpx;
}
.scroll-Y {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 44rpx);
background-color: #fff;
border-radius: 16rpx;
}
.scroll-Y .item {
height: 170rpx;
margin: 32rpx 22rpx;
display: flex;
.img_div {
position: relative;
width: 224rpx;
height: 168rpx;
overflow: hidden;
border-radius: 22rpx;
.img {
width: 224rpx;
height: 168rpx;
}
.subscript {
position: absolute;
right: 0;
top: 0;
width: 78rpx;
height: 46rpx;
border-radius: 0px 0px 0px 22rpx;
font-family: PingFangSC;
font-weight: 400;
font-size: 22rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #EF5705;
color: #FFFFFF;
}
}
.right_div {
flex: 1;
overflow: hidden;
margin-left: 24rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
.title {
font-family: PingFangSC;
font-size: 30rpx;
font-weight: 600;
color: #333333;
}
.tag_div {
display: flex;
flex-wrap: wrap;
height: 38rpx;
overflow: hidden;
.tag {
height: 38rpx;
padding: 0 10rpx;
margin-right: 14rpx;
border-radius: 8rpx;
border: 2rpx solid #FFA150;
font-family: PingFangSC;
font-weight: 500;
font-size: 23rpx;
color: #FFA150;
display: flex;
justify-content: center;
align-items: center;
}
}
.time_and_num {
display: flex;
font-family: PingFangSC;
font-weight: 400;
font-size: 23rpx;
color: #999999;
margin-bottom: 16rpx;
line-height: 23rpx;
flex-wrap: nowrap;
height: 23rpx;
overflow: hidden;
}
}
}
</style>
+174
View File
@@ -0,0 +1,174 @@
<template>
<view class="max_page detail-main">
<nav-bar :is_seat="false"></nav-bar>
<view class="fixed_search_div">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
</view>
<view class="title font_pf">我的预览</view>
</view>
<view class="detail-body">
<view class="body-tab">
<uv-tabs class="font_pf my_tabs" :current="tabAct" :list="tabList" @change="tabChange"
:scrollable="false" line-color="#0066FF"
:inactive-style="{ color: '#333333', fontSize: '30rpx', fontWeight:'600'}"
:activeStyle="{color:'#0066FF',fontSize:'30rpx', fontWeight:'600'}"
:lineColor="`url(${lineBg}) 10% 10%`"></uv-tabs>
</view>
<view class="uni-margin-wrap">
<swiper class="swiper" :current="tabAct" :indicator-dots="false" @change="swiperChange">
<swiper-item>
<PreviewCourse ref="courseRef"></PreviewCourse>
</swiper-item>
<swiper-item>
<PreviewAiSparring ref="aiSparringRef"></PreviewAiSparring>
</swiper-item>
</swiper>
</view>
</view>
</view>
</template>
<script setup>
// 我的预览
import PreviewAiSparring from './components/preview-ai-sparring.vue'
import PreviewCourse from './components/preview-course.vue'
import {
reactive,
ref,
computed,
nextTick,
onMounted,
watch
} from 'vue';
import {
queryTraCrsBbsInfoByCrsId,
replyTraCrsBbsInfo,
qryChildTraCrsBbsInfo
} from '@/api/courseDetail.js';
import common from '@/common/common';
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
const lineBg =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAABL0lEQVQ4T6XSv0uCURTG8e9jgpRNDS1BU1sELUFLQVM1tgQFtcR7A8m1LQqaLGhOkQKH/o5aKiiHlgiE0K1oCYLAMk9ov/RF8e313u2ew4dzzzmi2+NsA9gH3hCr6srzbAJxDkS/nbvwYNJilMkDow1FXYUHneWAlV/MqN3ZcKCzHWDb164MGa3/H/Qshdj0YbdUmORIL8HBNRsgShZjoQkznvioY/e19wCgCccSsAcM+bBnjHmyuvx5bw8mrJ93FoEkYrzFej0g5kjrpjH2BTrro8oIYhgYQ0xhTCPibfb0ggjLHKrojwvPEogDIBZgycsYKQrscqpKq3zh7BXo7YBVgRMibLWqqvnLzh6BwTZgESNHD8edoL+hOJupT9CII0oYJcQ14oy0CgHa0JTyCeBLVNeWygE5AAAAAElFTkSuQmCC";
const courseRef = ref(null);
const aiSparringRef = ref(null);
const tabAct = ref(0);
const tabList = ref([{
name: '预览课程'
}, {
name: '预览AI陪练'
}]);
const tabChange = (item) => {
tabAct.value = item.index;
};
const swiperChange = (item) => {
tabAct.value = item.detail.current;
};
onMounted(() => {
watch(tabAct, (newValue, oldValue) => {
if (newValue === 0) {
courseRef.value?.getData('first')
} else if (newValue === 1) {
}
}, {
immediate: true
})
})
</script>
<style lang="scss" scoped>
$bg-margin-left: 50rpx;
.my_tabs {
// 解决这个圆角的图片,开穿透
:deep(.uv-tabs__wrapper__nav__line) {
height: 26rpx !important;
left: 70rpx;
background-size: 28rpx !important;
background-repeat: no-repeat !important;
}
}
.swiper {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 10rpx);
}
.swiper-item {
display: block;
height: 100%;
line-height: 300rpx;
text-align: center;
}
.detail-body {
background: #ffffff;
border-radius: 15rpx;
z-index: 101;
overflow: hidden;
.body-tab {
height: 88rpx;
}
}
.detail-main {
background-color: #F6F8FF;
overflow: hidden;
}
.title {
color: #000000;
font-size: 34rpx;
height: 34rpx;
font-weight: 600;
// margin-bottom: 30rpx;
line-height: 34rpx;
}
.swiper {}
.fixed_search_div {
padding: calc(20rpx + var(--status-bar-height)) 15rpx 24rpx 30rpx;
display: flex;
align-items: center;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
.back_div {
position: absolute;
left: 20rpx;
padding: 10rpx;
.back-icon {
position: relative;
width: 50rpx;
height: 50rpx;
cursor: pointer;
display: flex;
align-items: center;
}
.back-icon::before,
.back-icon::after {
content: '';
position: absolute;
transition: all 0.3s ease;
}
.back-icon::after {
top: 25%;
left: 25%;
width: 40%;
height: 40%;
border-top: 4rpx solid #000000;
border-left: 4rpx solid #000000;
transform: rotate(-45deg);
}
}
}
</style>
+60 -16
View File
@@ -31,7 +31,18 @@
</picker>
</template>
</uv-cell>
<uv-cell title="形象" @click="gotoMascot()" :isLink="true" :border="false"></uv-cell>
<uv-cell title="百禄形象" @click="gotoMascot()" :isLink="true"></uv-cell>
<uv-cell :isLink="true" :border="false">
<template #title>
<text class="font_pf">竞赛是否匿名</text>
</template>
<template #value>
<picker mode="selector" :value="index" range-key="label" style="width: 100%"
:range="anonymousOptions" @change="anonymousChange">
<view style="text-align: right">{{showAnonymousText}}</view>
</picker>
</template>
</uv-cell>
</uv-cell-group>
</view>
<avatar-cropper v-if="avatarCropperStatus" mode="ratio" :imageUrl="avatarCropperUrl" :width="500" :height="500"
@@ -52,9 +63,13 @@
import {
uploadFile
} from '@/api/common'
import { queryCurrentUser} from '@/api/login.js';
import {
queryCurrentUser
} from '@/api/login.js';
import common from '@/common/common';
import {getUserInfo} from '@/common/common';
import {
getUserInfo
} from '@/common/common';
import {
GENDER
} from '@/enum.js';
@@ -62,7 +77,9 @@
updateDfSysUserExtandInfoGender,
updateDfSysUserExtandInfoImageAddr
} from "@/api/user.js"
import {queryValidTraMascotInfo} from "@/api/mascot.js"
import {
queryValidTraMascotInfo
} from "@/api/mascot.js"
import {
get_base_url
} from '@/api/request.js'
@@ -76,13 +93,22 @@
});
const avatarCropperStatus = ref(true)
const sexOptions = GENDER
const anonymousOptions = [{
value: "y",
label: "是",
},
{
value: "n",
label: "否",
}
] // 性别
const base_url = get_base_url()
// 去选择百禄
const gotoMascot = () => {
common.navigateTo('/pages/mascot/mascot_select_list')
// common.loading()
// queryValidTraMascotInfo().then(({body}) => {
// console.log(body);
@@ -95,21 +121,21 @@
// console.log(`图片缓存成功: ${url}`);
// // resolve(img);
// };
// img.onerror = () => {
// console.error(`图片缓存失败: ${url}`);
// // reject(new Error(`Failed to load image: ${url}`));
// };
// img.src = base_url + url;
// }
// })
// common.hideLoading()
// common.navigateTo('/pages/mascot/mascot_select_list')
// })
}
// 显示性别的计算属性
const showGenderText = computed(() => {
const item = sexOptions.find((item) => item.value == userInfo.value.gender)
if (item) {
@@ -118,6 +144,16 @@
return '未填写'
}
})
// 显示是否匿名的计算属性
const showAnonymousText = computed(() => {
const item = anonymousOptions.find((item) => item.value == userInfo.value?.anonymous)
if (item) {
return item.label
} else {
return '否'
}
})
// 点击修改头像
const click_update_avatar = (value) => {
uni.chooseImage({
@@ -136,18 +172,20 @@
// 选择头像确定
const onConfirm = (file) => {
avatarCropperStatus.value = false
nextTick(async() => {
nextTick(async () => {
common.loading('更新头像中')
try{
try {
const data = {
bizScen: 'S3007',
thumbnailFlag: true,
thumbImgSize:100
thumbImgSize: 100
}
// 上传图片
const res = await uploadFile(file.tempFilePath, data)
// 更新个人信息
await updateDfSysUserExtandInfoImageAddr({imageAddr : res.thumbFileId})
await updateDfSysUserExtandInfoImageAddr({
imageAddr: res.thumbFileId
})
// 更新个人信息
const userData = await queryCurrentUser()
common.msg('修改成功')
@@ -165,13 +203,19 @@
common.loading("修改中")
updateDfSysUserExtandInfoGender({
gender: userInfo.value.gender
}).then(async() => {
}).then(async () => {
await queryCurrentUser()
common.msg('修改成功')
}).finally(() => {
common.hideLoading()
})
};
const anonymousChange = (e) => {
userInfo.value.anonymous = anonymousOptions[e.detail.value].value;
// common.loading("修改中")
common.msg('修改成功')
};
onLoad((params) => {
userInfo.value = getUserInfo()
});
-169
View File
@@ -1,169 +0,0 @@
<template>
<view class="max_page detail-main">
<nav-bar :is_seat="false"></nav-bar>
<view class="fixed_search_div">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
</view>
<view class="title font_pf">系统参数</view>
</view>
<view class="detail-body">
<uv-cell-group :border="false">
<uv-cell title="根域名" :value="url"></uv-cell>
<uv-cell title="当前环境:" :value="ENV.MODE"></uv-cell>
<uv-cell title="版本名称" :value="appBaseInfo.appVersion"></uv-cell>
<uv-cell title="版本号" :value="appBaseInfo.appVersionCode"></uv-cell>
<uv-cell title="点击1:" @click="aaaa"></uv-cell>
<uv-cell title="点击2:" :border="false" @click="bbbb"></uv-cell>
</uv-cell-group>
</view>
</view>
</template>
<script setup>
import common from '@/common/common';
import {
get_base_url
} from '../../api/request';
const url = get_base_url();
const ENV = import.meta.env
const appBaseInfo = uni.getAppBaseInfo()
console.log('appBaseInfo', appBaseInfo);
import showDialog from '@/common/dialogMessage'
const bbbb = () => {
// showDialog({
// title: '提示信息',
// content: '检测到您已离开,即将退出学习页面。',
// confirmText: '确认',
// showCancel: false,
// cancelText: '再想想',
// success: (res) => {
// if (res.confirm) {
// console.log('用户点击确定');
// }
// },
// cancel: () => {
// console.log('用户点击取消');
// }
// });
showDialog({
title: '提示',
content: '检测到您已存在学习记录,要继续学习吗?',
confirmText: '重新学习',
showCancel: true,
cancelText: '继续学习',
success: (res) => {
if (res.confirm) {
console.log('用户点击确定');
}
},
cancel: () => {
console.log('用户点击取消');
}
});
}
const aaaa = () => {
common.show('提示','检测到您已存在学习记录,要继续学习吗?','继续学习', '重新学习').then(res => {
})
// function show(title, msg, showCancel = true, cancelText = '取消', confirmText = '确定') {
// showDialog({
// title: '提示',
// content: '检测到您已存在学习记录,要继续学习吗?',
// confirmText: '重新学习',
// showCancel: true,
// cancelText: '继续学习',
// success: (res) => {
// if (res.confirm) {
// console.log('用户点击确定');
// }
// },
// cancel: () => {
// console.log('用户点击取消');
// }
// });
}
</script>
<style lang="scss" scoped>
$bg-margin-left: 50rpx;
.detail-body {
margin: 30rpx $bg-margin-left 0 $bg-margin-left;
background: #ffffff;
border-radius: 15rpx;
z-index: 101;
overflow: hidden;
// 为了让线缩进来24单位
:deep(.uv-line) {
width: calc(100% - 48rpx) !important;
margin: 0 24rpx !important;
}
:deep(.uv-cell__body) {
padding: 12px 15px;
}
:deep(.uv-cell__title) {
flex: none !important;
}
}
.detail-main {
background-color: #F6F8FF;
}
.title {
color: #000000;
font-size: 34rpx;
height: 34rpx;
font-weight: 600;
// margin-bottom: 30rpx;
line-height: 34rpx;
}
.fixed_search_div {
padding: calc(10rpx + var(--status-bar-height)) 15rpx 24rpx 30rpx;
display: flex;
align-items: center;
background-color: #f6f7f8;
.back_div {
margin-right: 10rpx;
.back-icon {
position: relative;
width: 40rpx;
height: 40rpx;
cursor: pointer;
display: flex;
align-items: center;
}
.back-icon::before,
.back-icon::after {
content: '';
position: absolute;
transition: all 0.3s ease;
}
.back-icon::after {
top: 25%;
left: 25%;
width: 40%;
height: 40%;
border-top: 4rpx solid #2b2c2e;
border-left: 4rpx solid #2b2c2e;
transform: rotate(-45deg);
}
}
}
</style>
@@ -0,0 +1,242 @@
<template>
<scroll-view ref="scrollRef" scroll-y="true" class="scroll-Y" :refresher-enabled="false"
@refresherrefresh="onRefresh" @refresherrestore="triggered = 'restore'" :refresher-triggered="triggered"
refresher-default-style="none" @scrolltolower="scrolltolower">
<!-- 主体 -->
<view class="content">
<view class="drop-down-div"> 下拉显示</view>
<view class="item" v-for="(item,index) in data_list" :class="index % 2?'completed':'incomplete'"
@click="gotoDetails(item)">
<view class="subscript" v-if="item.examStatText==='N'">未完成</view>
<view class="subscript" v-if="item.examStatText==='Y'">已完成</view>
<view class="title ellipsis-text">
{{item.papersName}}
</view>
<view class="time">
<text class="color_3">起止时间</text><text
class="color_class">{{item.examStartTm}}{{item.examEndTm}}</text>
</view>
<view class="num_div">
<text class="color_3">完成人数</text><text
class="color_2">{{item.execPersionNumer}}/{{item.planPersionNumber}}</text>
</view>
</view>
<list-no-data v-if="total == 0 && status=='nomore'"></list-no-data>
<uv-load-more v-if="total != 0" :status="status" loadmore-text="轻轻上拉加载" :height="30"></uv-load-more>
</view>
</scroll-view>
</template>
<script setup>
import {
ref,
reactive,
nextTick,
onMounted
} from 'vue'
import {
queryTraExamPapersPage
} from '@/api/testingHall.js'
import {
queryTraCrsBbsInfoByCrsId
} from '@/api/courseDetail.js';
const status = ref('loadmore') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
const triggered = ref(false)
const _freshing = ref(false)
const offset = ref(0)
const scrollRef = ref(null)
const props = defineProps({
searchText: {
type: String,
default: ''
},
index: {
type: Number,
default: 0
},
})
const emit = defineEmits(['gotoDetails'])
// 刷新处理函数
const gotoDetails = (item) => emit('gotoDetails', item)
const onRefresh = () => {
if (_freshing.value) return
_freshing.value = true
setTimeout(() => {
triggered.value = false
_freshing.value = false
}, 1000)
}
const getData = (from = '') => {
if (from == 'first') {
if (total.value !== -1) return;
status.value = 'loading'
total.value = -1
page.value = 1
data_list.length = 0
} else {
if (status.value !== 'loadmore' && status.value !== '') return
status.value = 'loading'
page.value++
}
setTimeout(() => {
let params = {
papersName: props.searchText,
page: page.value,
limit: limit,
}
if (props.index == 1) {
params.examStat = 'Y'
} else if (props.index == 2) {
params.examStat = 'N'
}
queryTraExamPapersPage(params).then(res => {
total.value = res.total
data_list.push(...res.body)
}).finally(() => {
if (data_list.length >= total.value) {
status.value = 'nomore'
} else {
status.value = 'loadmore'
}
console.log(status.value);
})
}, 200)
}
const scrolltolower = () => {
getData()
};
defineExpose({
getData
})
</script>
<style scoped lang="scss">
.incomplete {
// 进行中
.subscript {
color: #FFFFFF;
background-color: #EF5705;
}
.color_class {
color: #D70C18;
}
}
.completed {
// 已完成
.subscript {
color: #FFFFFF;
background-color: #33C583;
}
.color_class {
color: #0066FF;
}
}
.subscript {
position: absolute;
right: 0;
top: 0;
width: 92rpx;
height: 46rpx;
border-radius: 0px 0px 0px 22rpx;
font-family: PingFangSC;
font-weight: 400;
font-size: 22rpx;
line-height: 32px;
display: flex;
align-items: center;
justify-content: center;
}
.scroll-Y {
height: calc(100vh - var(--status-bar-height) - 70rpx - 78rpx - 40rpx - 88rpx);
position: relative;
overflow: hidden;
background-color: #F1F5FA;
.content {
width: 100%;
height: 100%;
border-radius: 20rpx 20rpx 0 0;
position: relative;
padding-top: 22rpx;
.drop-down-div {
position: absolute;
top: -90rpx;
width: 100%;
height: 90rpx;
background-color: #e1eeff;
}
.item {
padding: 30rpx 44rpx 20rpx 38rpx;
margin: 0rpx 22rpx 22rpx 22rpx;
display: flex;
flex-direction: column;
background-color: #FFFFFF;
border-radius: 16rpx;
position: relative;
overflow: hidden;
.title {
font-family: PingFangSC;
font-weight: 600;
font-size: 30rpx;
color: #000000;
line-height: 46rpx;
text-align: left;
font-style: normal;
}
.time {
font-size: 24rpx;
color: #999999;
line-height: 30rpx;
font-family: PingFangSC;
font-weight: 400;
color: #666666;
margin-top: 28rpx;
margin-bottom: 16rpx;
}
.num_div {
font-family: PingFangSC;
font-weight: 400;
font-size: 24rpx;
}
.color_1 {
color: #D70C18;
}
.color_2 {
color: #333333;
}
.color_3 {
color: #666666;
}
}
}
}
</style>
+311
View File
@@ -0,0 +1,311 @@
<template>
<view class="main_div max_page">
<view class="body-title">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
</view>
<view>考试详情</view>
</view>
<view class="detail_div completed incomplete">
<view class="title_div">
<view class="title ellipsis-text">{{detailData.papersName}}萨达萨达萨达萨达萨达阿斯顿萨达萨达萨达</view>
<!-- <view class="subscript" >未完成</view> -->
<view class="subscript" >已完成</view>
</view>
<view class="time">
<text class="color_3">起止时间</text><text
class="color_class">{{detailData.examStartTm}}{{detailData.examEndTm}}</text>
</view>
<view class="num_div">
<text class="color_3">完成人数</text><text
class="color_2">{{detailData.execPersionNumer}}/{{detailData.planPersionNumber}}</text>
</view>
</view>
<view class="paper_div">
<view class="paper">
<!-- 试卷信息 -->
<view class="title">
试卷信息
</view>
<view class="title-note">
试卷总分{{detailData.totalGrade}}
</view>
<view class="title-note">
通过分数{{detailData.passGrade}}
</view>
<view class="title-note">
考试次数不限制
</view>
<view class="title-note">
试卷类型随机试卷
</view>
<!-- 试卷结构 -->
<view class="title">
试卷结构
</view>
<view class="table">
<view class="table_tr">
<view class="table_td">
类型
</view>
<view class="table_td">
数量
</view>
<view class="table_td">
分值
</view>
</view>
<view class="table_tr">
<view class="table_td">
判断题
</view>
<view class="table_td">
{{detailData.judgeNumber}}
</view>
<view class="table_td">
{{detailData.judgeGrade}}
</view>
</view>
<view class="table_tr">
<view class="table_td">
单选题
</view>
<view class="table_td">
{{detailData.singleNumber}}
</view>
<view class="table_td">
{{detailData.singleGrade}}
</view>
</view>
<view class="table_tr">
<view class="table_td">
多选题
</view>
<view class="table_td">
{{detailData.multiNumber}}
</view>
<view class="table_td">
{{detailData.multiGrade}}
</view>
</view>
<view class="table_tr">
<view class="table_td">
问答题
</view>
<view class="table_td">
{{detailData.essayNumber}}
</view>
<view class="table_td">
{{detailData.essayGrade}}
</view>
</view>
<view class="table_tr">
<view class="table_td">
总计
</view>
<view class="table_td">
20
</view>
<view class="table_td">
100
</view>
</view>
</view>
</view>
</view>
<view class="fixed_button_div">
<uv-button type="primary" class="send_evaluate" :custom-style="customStyle" :throttleTime="300"
:hairline="false"
@click="common.navigateTo('/pages/courseDetail/submit?crsNum='+crsNum+'&imgId='+form.imgId)">发布评价</uv-button>
</view>
</view>
</template>
<script setup>
import {
onLoad
} from '@dcloudio/uni-app';
import {
reactive
} from 'vue'
const detailData = reactive({
papersId: '',
papersName: '',
examStartTm: '',
examEndTm: '',
execPersionNumer: '',
planPersionNumber: '',
})
const customStyle = {
borderRadius: '40rpx', //圆角
backgroundColor: 'rgb(12, 123, 245)',
border: '1px solid rgb(12, 123, 245)',
}
onLoad((e) => {
console.log(e);
Object.assign(detailData, {
...e
})
})
</script>
<style scoped lang="scss">
.fixed_button_div {
position: fixed;
bottom: 30rpx;
width: 80vw;
}
.paper_div {
width: 100%;
min-height: 100%;
background-color: rgb(130, 142, 244);
flex: 1;
.paper {
// width: 100%;
height: 100%;
margin: 24rpx 24rpx 0 24rpx;
background-color: #fff;
border-radius: 20rpx;
padding: 16rpx;
}
.title {
font-size: 30rpx;
color: rgb(0, 0, 0);
font-weight: 600;
height: 70rpx;
line-height: 70rpx;
}
.title-note {
font-size: 28rpx;
color: rgb(16, 16, 16);
height: 60rpx;
line-height: 60rpx;
}
.table {
width: 100%;
display: flex;
flex-direction: column;
/* 设置主轴为垂直方向 */
justify-content: space-between;
padding: 20rpx 0 80rpx 0;
.table_tr {
flex: 1;
display: flex;
}
.table_td {
padding: 14rpx 0;
flex: 1;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.main_div {
display: flex;
flex-direction: column;
align-items: center;
padding-top: var(--status-bar-height);
overflow: hidden;
}
.detail_div {
width: 100%;
padding: 48rpx 40rpx 20rpx 40rpx;
.title_div{
display: flex;
justify-content: space-between;
flex: 1;
.title {
font-family: PingFangSC;
font-weight: 600;
font-size: 30rpx;
color: #000000;
line-height: 46rpx;
text-align: left;
font-style: normal;
}
.subscript {
width: 102rpx;
height: 42rpx;
border-radius: 10rpx;
font-family: PingFangSC;
font-weight: 400;
font-size: 24rpx;
line-height: 42rpx;
display: flex;
align-items: center;
justify-content: center;
}
}
.time {
font-size: 24rpx;
color: #999999;
line-height: 30rpx;
font-family: PingFangSC;
font-weight: 400;
color: #666666;
margin-top: 28rpx;
margin-bottom: 16rpx;
}
.num_div {
font-family: PingFangSC;
font-weight: 400;
font-size: 24rpx;
}
.color_1 {
color: #D70C18;
}
.color_2 {
color: #333333;
}
.color_3 {
color: #666666;
}
}
.incomplete {
// 进行中
.subscript {
color: #FFFFFF;
background-color: #EF5705;
}
.color_class {
color: #D70C18;
}
}
.completed {
// 已完成
.subscript {
color: #FFFFFF;
background-color: #33C583;
}
.color_class {
color: #0066FF;
}
}
</style>
+228
View File
@@ -0,0 +1,228 @@
<template>
<view class="main_div max_page">
<view class="body-title">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
</view>
<view>考试中心</view>
</view>
<view class="input-view">
<uv-input shape="circle" placeholderStyle='color:#999999;font-size:28rpx' placeholder="请输入关键词"
suffixIcon="search" :customStyle="customStyle" :suffixIconStyle="suffixIconStyle" confirmType="search"
v-model="searchText"
@confirm="search">
</uv-input>
<view class="search_div" @click="search"></view>
</view>
<view class="body-tab">
<uv-tabs class="font_pf my_tabs" :current="tabAct" :list="tabList" @change="tabChange" :scrollable="false"
line-color="#0066FF" :inactive-style="{ color: '#333333', fontSize: '30rpx', fontWeight:'600'}"
:activeStyle="{color:'#0066FF',fontSize:'30rpx', fontWeight:'600'}"
:lineColor="`url(${lineBg}) 10% 10%`"></uv-tabs>
</view>
<swiper class="swiper" :current="tabAct" :indicator-dots="false" @change="swiperChange">
<swiper-item>
<Content :ref="el => contentRefs[0] = el" :index="tabAct" :searchText="searchText" @gotoDetails="gotoDetails"></Content>
</swiper-item>
<swiper-item>
<Content :ref="el => contentRefs[1] = el" :index="tabAct" :searchText="searchText" @gotoDetails="gotoDetails"></Content>
</swiper-item>
<swiper-item>
<Content :ref="el => contentRefs[2] = el" :index="tabAct" :searchText="searchText" @gotoDetails="gotoDetails"></Content>
</swiper-item>
</swiper>
</view>
</template>
<script setup>
// 考试中心
import Content from './components/content.vue'
import {
ref,
reactive,
watch,
onMounted
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import common from '@/common/common';
const customStyle = {
backgroundColor: "#F1F5FA",
paddingLeft: "40rpx",
height: '78rpx',
paddingTop: "5px",
paddingBottom: "5px",
border: "none"
}
const suffixIconStyle = {
color: "#2c8ef2",
fontSize: "50rpx"
}
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
const lineBg =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAABL0lEQVQ4T6XSv0uCURTG8e9jgpRNDS1BU1sELUFLQVM1tgQFtcR7A8m1LQqaLGhOkQKH/o5aKiiHlgiE0K1oCYLAMk9ov/RF8e313u2ew4dzzzmi2+NsA9gH3hCr6srzbAJxDkS/nbvwYNJilMkDow1FXYUHneWAlV/MqN3ZcKCzHWDb164MGa3/H/Qshdj0YbdUmORIL8HBNRsgShZjoQkznvioY/e19wCgCccSsAcM+bBnjHmyuvx5bw8mrJ93FoEkYrzFej0g5kjrpjH2BTrro8oIYhgYQ0xhTCPibfb0ggjLHKrojwvPEogDIBZgycsYKQrscqpKq3zh7BXo7YBVgRMibLWqqvnLzh6BwTZgESNHD8edoL+hOJupT9CII0oYJcQ14oy0CgHa0JTyCeBLVNeWygE5AAAAAElFTkSuQmCC";
const contentRef = ref(null);
const tabAct = ref(0);
const searchText = ref('');
const tabList = ref([{
name: '全 部'
}, {
name: '已完成'
}, {
name: '未完成'
}]);
const contentRefs = ref([])
const status = ref('loadmore') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
const triggered = ref(false)
const tabChange = (item) => {
tabAct.value = item.index;
};
const swiperChange = (item) => {
tabAct.value = item.detail.current;
};
const search = () => {
if (searchText.value === '') return;
console.log('搜索', searchText.value);
}
const gotoDetails = (item) => {
const detailData = {
...item
};
const params = new URLSearchParams();
for (const key in detailData) {
params.append(key, detailData[key]);
}
const urlParams = params.toString();
common.navigateTo(`/pages/testingHall/details?${urlParams}`);
}
onMounted(() => {
triggered.value = true
watch(tabAct, (newValue, oldValue) => {
typeof contentRefs.value[newValue]?.getData === 'function' && contentRefs.value[newValue]
?.getData('first')
}, {
immediate: true
}) // 这里的immediate会在onMounted之后执行
})
</script>
<style scoped lang="scss">
.swiper {
height: calc(100vh - var(--status-bar-height) - 70rpx - 78rpx - 40rpx - 88rpx);
width: 100%;
}
.body-tab {
height: 88rpx;
// background-color: red;
width: 100%;
}
.my_tabs {
// 解决这个圆角的图片,开穿透
:deep(.uv-tabs__wrapper__nav__line) {
height: 30rpx !important;
left: 50rpx;
background-size: 24rpx !important;
background-repeat: no-repeat !important;
}
}
.main_div {
display: flex;
flex-direction: column;
align-items: center;
padding-top: var(--status-bar-height);
overflow: hidden;
}
.body-title {
width: 100%;
height: 70rpx;
font-size: 33rpx;
padding-top: 10rpx;
font-weight: 500;
color: #000;
position: relative;
text-align: center;
.delete_div {
position: absolute;
right: 20rpx;
top: 17rpx;
width: 50rpx;
height: 50rpx;
.img {
width: 34rpx;
height: 34rpx;
}
}
.back_div {
position: absolute;
left: 26rpx;
height: 34rpx;
top: 17rpx;
.back-icon {
position: relative;
width: 50rpx;
height: 50rpx;
cursor: pointer;
display: flex;
align-items: center;
}
.back-icon::before,
.back-icon::after {
content: '';
position: absolute;
transition: all 0.3s ease;
}
.back-icon::after {
top: 25%;
left: 25%;
width: 40%;
height: 40%;
border-top: 4rpx solid #2b2c2e;
border-left: 4rpx solid #2b2c2e;
transform: rotate(-45deg);
}
}
}
.input-view {
width: 90%;
margin: 20rpx auto;
height: 78rpx;
position: relative;
.search_div {
position: absolute;
top: 0%;
right: 0;
height: 100%;
width: 70rpx;
// background-color: red;
}
}
</style>
@@ -0,0 +1,167 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower">
<view class="item" :class="getStatusClass(index)" v-for="(item,index) in data_list">
<view class="top">
<view class="type">
单选题
</view>
<view class="score">
5
</view>
<view class="fl1">
</view>
<view class="right">
<view class="right_text">
展开
</view>
<uv-icon class="arrow-icon" name="arrow-right"></uv-icon>
</view>
</view>
<view class="text">
属于商业银行风险管理三道防线的哪些风险管理部门为什么
</view>
</view>
<uv-load-more v-if="total != 0" :status="status" loadmore-text="轻轻上拉加载" :height="30"></uv-load-more>
</scroll-view>
</view>
</template>
<script setup>
const status = ref('loading') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
import {
ref,
reactive,
onMounted,
nextTick
} from 'vue'
import {
queryTraCrsBbsInfoByCrsId
} from '@/api/courseDetail.js';
const getData = (from = '') => {
if (from == 'first') {
if (total.value !== -1) {
return
}
status.value = 'loading'
total.value = -1
page.value = 1
data_list.length = 0
} else {
if (status.value !== 'loadmore' && status.value !== '') return
status.value = 'loading'
page.value++
}
console.log(status.value, '阿斯顿撒');
setTimeout(() => {
queryTraCrsBbsInfoByCrsId({
crsId: 'CRS0250181220722025070408313900000018729',
page: page.value,
limit: limit
}).then(res => {
total.value = res.total
data_list.push(...res.body)
}).finally(() => {
if (data_list.length >= total.value) {
status.value = 'nomore'
} else {
status.value = 'loadmore'
}
})
}, 200)
}
const getStatusClass = (index) => {
const remainder = index % 3;
if (remainder === 0) return 'in_progress';
if (remainder === 1) return 'completed';
return 'expired';
};
const scrolltolower = (item) => {
getData()
};
defineExpose({
getData
})
</script>
<style scoped lang="scss">
.scroll_div {
background-color: #F1F5FA;
padding: 22rpx;
}
.scroll-Y {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 44rpx);
// background-color: #fff;
}
.scroll-Y .item {
// height: 170rpx;
border-radius: 16rpx;
margin: 32rpx 0;
padding: 34rpx 30rpx 34rpx 36rpx;
background-color: #fff;
display: flex;
flex-direction: column;
.top {
display: flex;
align-items: center;
.type {
width: 108rpx;
height: 46rpx;
background: #267EFF;
border-radius: 8rpx;
font-family: PingFangSC;
font-weight: 500;
font-size: 25rpx;
color: #FFFFFF;
text-align: center;
line-height: 46rpx;
}
.score {
margin-left: 24rpx;
font-family: ArialMT;
font-size: 30rpx;
color: #333333;
text-align: left;
}
.right {
display: flex;
align-items: center;
.right_text {
font-family: PingFangSC;
font-weight: 600;
font-size: 28rpx;
color: #333;
line-height: 40rpx;
text-align: left;
font-style: normal;
}
}
}
.text {
font-family: PingFangSC;
font-weight: 500;
font-size: 30rpx;
color: #333333;
line-height: 48rpx;
text-align: left;
font-style: normal;
margin-top: 20rpx;
}
}
</style>
@@ -0,0 +1,172 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower">
<view class="item" :class="getStatusClass(index)" v-for="(item,index) in data_list">
<view class="top">
<view class="type">
单选题
</view>
<view class="score">
5
</view>
<view class="fl1">
</view>
<view class="right">
<view class="right_text">
展开
</view>
<uv-icon class="arrow-icon" name="arrow-right"></uv-icon>
</view>
</view>
<view class="text">
属于商业银行风险管理三道防线的哪些风险管理部门为什么
</view>
<view class="additional_div">
<RadioSubject></RadioSubject>
</view>
</view>
<uv-load-more v-if="total != 0" :status="status" loadmore-text="轻轻上拉加载" :height="30"></uv-load-more>
</scroll-view>
</view>
</template>
<script setup>
import RadioSubject from './radio-subject.vue'
const status = ref('loading') // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const limit = 15
const total = ref(-1)
const page = ref(0)
const data_list = reactive([])
import {
ref,
reactive,
onMounted,
nextTick
} from 'vue'
import {
queryTraCrsBbsInfoByCrsId
} from '@/api/courseDetail.js';
const getData = (from = '') => {
if (from == 'first') {
if (total.value !== -1) {
return
}
status.value = 'loading'
total.value = -1
page.value = 1
data_list.length = 0
} else {
if (status.value !== 'loadmore' && status.value !== '') return
status.value = 'loading'
page.value++
}
console.log(status.value, '阿斯顿撒');
setTimeout(() => {
queryTraCrsBbsInfoByCrsId({
crsId: 'CRS0250181220722025070408313900000018729',
page: page.value,
limit: limit
}).then(res => {
total.value = res.total
data_list.push(...res.body)
}).finally(() => {
if (data_list.length >= total.value) {
status.value = 'nomore'
} else {
status.value = 'loadmore'
}
})
}, 200)
}
const getStatusClass = (index) => {
const remainder = index % 3;
if (remainder === 0) return 'in_progress';
if (remainder === 1) return 'completed';
return 'expired';
};
const scrolltolower = (item) => {
getData()
};
defineExpose({
getData
})
</script>
<style scoped lang="scss">
.scroll_div {
background-color: #F1F5FA;
padding: 22rpx;
}
.scroll-Y {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 44rpx);
// background-color: #fff;
}
.scroll-Y .item {
// height: 170rpx;
border-radius: 16rpx;
margin: 32rpx 0;
padding: 34rpx 30rpx 34rpx 36rpx;
background-color: #fff;
display: flex;
flex-direction: column;
.top {
display: flex;
align-items: center;
.type {
width: 108rpx;
height: 46rpx;
background: #267EFF;
border-radius: 8rpx;
font-family: PingFangSC;
font-weight: 500;
font-size: 25rpx;
color: #FFFFFF;
text-align: center;
line-height: 46rpx;
}
.score {
margin-left: 24rpx;
font-family: ArialMT;
font-size: 30rpx;
color: #333333;
text-align: left;
}
.right {
display: flex;
align-items: center;
.right_text {
font-family: PingFangSC;
font-weight: 600;
font-size: 28rpx;
color: #333;
line-height: 40rpx;
text-align: left;
font-style: normal;
}
}
}
.text {
font-family: PingFangSC;
font-weight: 500;
font-size: 30rpx;
color: #333333;
line-height: 48rpx;
text-align: left;
font-style: normal;
margin-top: 20rpx;
}
}
</style>
@@ -0,0 +1,117 @@
<template>
<view class="">
<view class="option_div">
<view class="option_item success">
<view class="text">
A.这里是选项 A 的内容
</view>
<image class="img" src="@/static/images/common/success.png" mode="heightFix"></image>
</view>
<view class="option_item success">
<view class="text">
B.这里是选项 B 的内容
</view>
<image class="img" src="@/static/images/common/success.png" mode="heightFix"></image>
</view>
<view class="option_item error">
<view class="text">
C.这里是选项 C 的内容
</view>
<image class="img" src="@/static/images/common/success.png" mode="heightFix"></image>
</view>
<view class="option_item info">
D.这里是选项D的内容
</view>
</view>
<view class="analysis_div">
<view class="analysis_title">
<view class="success_answer">
正确答案ABC
</view>
<view class="your_answer">
你的答案<text class="red_color">AB</text>
</view>
</view>
<view class="analysis_note">
题目解析属于商业银行风险管理三道防线的是A部门B部门和C部门银行风险管理三道防线的是A部门B部银行风险管理三道防线的是A部门B部银行风险管理三道防线的是A部门B部
</view>
</view>
</view>
</template>
<script>
</script>
<style scoped lang="scss">
.success {
color: #15B859;
background: #E7F8ED;
}
.info {
color: #333333;
background: #F9F9F9 ;
}
.error {
color: #F5212D;
background: #FCE8E9;
}
.option_item {
width: 100%;
height: 108rpx;
border-radius: 15rpx;
margin-top: 32rpx;
font-family: PingFangSC;
font-weight: 500;
font-size: 30rpx;
line-height: 108rpx;
text-align: left;
font-style: normal;
padding-left: 52rpx;
display: flex;
align-items: center;
.text {
flex: 1;
white-space: nowrap;
/* 强制不换行 */
overflow: hidden;
/* 超出部分隐藏 */
text-overflow: ellipsis;
}
.img {
height: 30rpx;
padding-right: 30rpx;
}
}
.analysis_div{
.analysis_title{
display: flex;
justify-content: space-between;
align-items: center;
margin: 32rpx 0 28rpx 0;
.success_answer{
}
.your_answer{
}
.red_color{
color: #F5212D;
}
}
.analysis_note{
font-family: PingFangSC;
font-weight: 500;
font-size: 30rpx;
color: #666666;
line-height: 48rpx;
text-align: left;
font-style: normal;
}
}
</style>
+169
View File
@@ -0,0 +1,169 @@
<template>
<view class="max_page detail-main">
<nav-bar :is_seat="false"></nav-bar>
<view class="fixed_search_div">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
</view>
<view class="title font_pf">错题本</view>
</view>
<view class="detail-body">
<view class="body-tab">
<uv-tabs class="font_pf my_tabs" :current="tabAct" :list="tabList" @change="tabChange"
:scrollable="false" line-color="#0066FF"
:inactive-style="{ color: '#333333', fontSize: '30rpx', fontWeight:'600'}"
:activeStyle="{color:'#0066FF',fontSize:'30rpx', fontWeight:'600'}"
:lineColor="`url(${LineBg}) 10% 10%`"></uv-tabs>
</view>
<view class="uni-margin-wrap no-overflow">
<swiper class="swiper" :current="tabAct" :indicator-dots="false" @change="swiperChange">
<swiper-item>
<FavoritesCourse ref="courseRef"></FavoritesCourse>
</swiper-item>
<swiper-item>
<Correct ref="correctRef"></Correct>
</swiper-item>
</swiper>
</view>
</view>
</view>
</template>
<script setup>
import Correct from './components/correct.vue'
import FavoritesCourse from './components/favorites-course.vue'
// 我的收藏
import {
reactive,
ref,
computed,
nextTick,
onMounted,
watch
} from 'vue';
import {
LineBg
} from '@/enum.js';
import {
queryTraCrsBbsInfoByCrsId,
replyTraCrsBbsInfo,
qryChildTraCrsBbsInfo
} from '@/api/courseDetail.js';
import common from '@/common/common';
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
const courseRef = ref(null);
const correctRef = ref(null);
const tabAct = ref(0);
const tabList = ref([{
name: '当前错题'
}, {
name: '已订正'
}]);
const tabChange = (item) => {
tabAct.value = item.index;
};
const swiperChange = (item) => {
tabAct.value = item.detail.current;
};
onMounted(() => {
watch(tabAct, (newValue, oldValue) => {
if(newValue === 0) {
courseRef.value?.getData('first')
} else if(newValue === 1) {
correctRef.value?.getData('first')
}
}, { immediate: true }) // 这里的immediate会在onMounted之后执行
})
</script>
<style lang="scss" scoped>
$bg-margin-left: 50rpx;
.my_tabs {
// 解决这个圆角的图片,开穿透
:deep(.uv-tabs__wrapper__nav__line) {
height: 26rpx !important;
left: 70rpx;
background-size: 28rpx !important;
background-repeat: no-repeat !important;
}
}
.swiper {
height: calc(100vh - var(--status-bar-height) - 54rpx - 88rpx - 20rpx - 10rpx);
}
.swiper-item {
display: block;
height: 100%;
line-height: 300rpx;
text-align: center;
}
.detail-body {
background: #ffffff;
border-radius: 15rpx;
z-index: 101;
overflow: hidden;
.body-tab {
height: 88rpx;
}
}
.detail-main {
background-color: #F6F8FF;
overflow: hidden;
}
.title {
color: #000000;
font-size: 34rpx;
height: 34rpx;
font-weight: 600;
line-height: 34rpx;
}
.fixed_search_div {
padding: calc(20rpx + var(--status-bar-height)) 15rpx 24rpx 30rpx;
display: flex;
align-items: center;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
.back_div {
position: absolute;
left: 20rpx;
padding: 10rpx;
.back-icon {
position: relative;
width: 50rpx;
height: 50rpx;
cursor: pointer;
display: flex;
align-items: center;
}
.back-icon::before,
.back-icon::after {
content: '';
position: absolute;
transition: all 0.3s ease;
}
.back-icon::after {
top: 25%;
left: 25%;
width: 40%;
height: 40%;
border-top: 4rpx solid #000000;
border-left: 4rpx solid #000000;
transform: rotate(-45deg);
}
}
}
</style>
+54
View File
@@ -71,6 +71,60 @@
"titleNView": false
}
}
},
{
"path": "pages/preview/index",
"style": {
"navigationBarTitleText": "",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/favorites/index",
"style": {
"navigationBarTitleText": "",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/messageNotification/index",
"style": {
"navigationBarTitleText": "消息",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/testingHall/index",
"style": {
"navigationBarTitleText": "考试中心",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/testingHall/details",
"style": {
"navigationBarTitleText": "考试详情",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/wrong_question_record/index",
"style": {
"navigationBarTitleText": "错题本",
"app-plus": {
"titleNView": false
}
}
}
]
}
+2 -1
View File
@@ -105,7 +105,8 @@
"navigationStyle": "custom",
"app-plus": {
"titleView": false,
"bounce": "none"
"bounce": "none",
"softinputNavBar": "none"
}
},
"uniIdRouter": {}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 856 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

-12
View File
@@ -1,12 +0,0 @@
{
"userId": "USER001",
"userName": "ADMIN",
"loginName": "ADMIN",
"orgId": "00E200",
"orgName": "吉林银行-总行-金融科技部(下辖二级部研发部、运维部)",
"deptId": "",
"deptName": null,
"userStatus": "01",
"imageAddr": "/traoss/tras3/show/S3T0250181221042025072319404600000427552",
"gender": "f"
}