Files
yimo-resource-blog/pages/blog/resource.vue
2026-07-30 09:11:38 +08:00

1006 lines
26 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view style="min-height: 100vh;position: relative;">
<!-- 顶部图片 -->
<view class="top-img">
<image class="ui-img" :src="$image.original(resourceInfo.showImg)" mode="aspectFill"></image>
<text @click="back()" class="cuIcon-back backbut"></text>
</view>
<view class="resource-box">
<view class="resource-view">
<view class="resource-section-icon resource-section-icon-large resource-title-icon">
<uni-icons type="cloud-download" size="28" color="#6d52f5"></uni-icons>
</view>
<view class="resource-font">
{{resourceInfo.resourceTitle}}
</view>
</view>
<view class="resource-list">
<view v-if="type != 1" class="resource-view">
<view class="resource-section-icon">
<uni-icons type="info" size="22" color="#6d52f5"></uni-icons>
</view>
<view class="resource-font2">
下载说明
</view>
</view>
<view v-if="type != 1" class="data-view">
<view style="border: 1px solid #ffffff" class="ql-container ql-snow">
<rich-text :nodes="contentDate" class="ql-editor"></rich-text>
</view>
<!-- <mp-html class="ql-editor" :tag-style="tag_style" :content="contentDate" :container-style="container_style"
selectable="true"> </mp-html> -->
</view>
<!-- 付费资源规格 -->
<view v-if="isLookAd == 3" class="spec-section">
<view class="resource-view">
<view class="resource-section-icon">
<uni-icons type="list" size="22" color="#6d52f5"></uni-icons>
</view>
<view class="resource-font2">选择版本</view>
</view>
<view v-if="paySpecs.length" class="spec-list">
<view
v-for="item in paySpecs"
:key="item.id"
class="spec-item"
:class="{'spec-item-selected': selectedResourceListId == item.id}"
@click="selectSpec(item)"
>
<view class="spec-content">
<view class="spec-name">
<text class="spec-name-text">{{item.listName}}</text>
</view>
<view v-if="item.purchased || item.status == 0" class="spec-meta">
<text v-if="item.purchased" class="purchased-tag">已拥有</text>
<text v-else class="disabled-tag">已停用</text>
</view>
</view>
<view class="spec-price">
<text v-if="isUpgradeSpec(item)" class="upgrade-price-label">补差价</text>
<text class="spec-price-value">¥{{formatPrice(getPayablePriceFen(item))}}</text>
</view>
</view>
</view>
<view v-else class="empty-spec">暂无可购买规格请联系管理员</view>
</view>
<!-- 资源列表 -->
<view>
<view class="resource-view">
<view class="resource-section-icon">
<uni-icons type="download" size="22" color="#6d52f5"></uni-icons>
</view>
<view class="resource-font2">
{{isLookAd == 3 ? '已购资源' : '资源列表'}}
</view>
</view>
<template v-if="isLookAd == 3">
<view v-if="purchasedSpecs.length" id="purchased-resources">
<view class="shuoming2">复制下方链接在手机浏览器中打开即可下载</view>
<view v-for="item in purchasedSpecs" :key="item.id" class="file-list purchased-file">
<view class="file-header">
<view class="file-type-icon">
<uni-icons type="link" size="20" color="#6d52f5"></uni-icons>
</view>
<view class="file-heading">
<text class="file-title">{{item.listName}}</text>
<text class="file-password" v-if="item.password">提取码{{item.password}}</text>
</view>
</view>
<view class="file-url-box">
<text class="file-url">{{item.listUrl}}</text>
<view @click="copy(item.listUrl)" class="file-copy">复制</view>
</view>
</view>
</view>
<view v-else class="shuoming2">选择上方版本并完成付款后即可查看下载地址</view>
</template>
<template v-else>
<view v-if="isLookAd == 0" class="shuoming2">复制下方链接打开手机浏览器进行下载</view>
<view v-else class="shuoming2">请先点击下方按钮即可获取资源下载列表</view>
</template>
<template v-if="isLookAd == 0">
<view v-for="(item,index) in resourceInfo.appResourceListList" :key="index" class="file-list">
<view class="file-header">
<view class="file-type-icon">
<uni-icons type="link" size="20" color="#6d52f5"></uni-icons>
</view>
<view class="file-heading">
<text class="file-title">{{item.listName}}</text>
<text class="file-password" v-if="item.password != '' && item.password != null">提取码{{item.password}}</text>
</view>
</view>
<view class="file-url-box">
<text class="file-url">{{item.listUrl}}</text>
<view @click="copy(item.listUrl)" class="file-copy">复制</view>
</view>
</view>
</template>
<view v-if="adUnitId" style="width: 100%; margin-top: 50rpx;">
<ad-custom :unit-id="adUnitId" ad-intervals="30" ></ad-custom>
</view>
</view>
</view>
</view>
<view
v-if="(isLookAd == 1 || isLookAd == 2 || isLookAd == 3) && (isLookAd != 3 || selectedSpec)"
class="action-placeholder"
:class="{'action-placeholder-paid': isLookAd == 3}"
></view>
<view
v-if="(isLookAd == 1 || isLookAd == 2 || isLookAd == 3) && (isLookAd != 3 || selectedSpec)"
class="bottom-action-bar"
>
<view v-if="isLookAd == 3 && selectedSpec" class="action-summary">
<view class="action-summary-name">
<text class="action-summary-label">{{selectedIsUpgrade ? '升级补差' : '已选'}}</text>
<text class="action-summary-value">{{selectedSpec.listName}}</text>
</view>
<view class="action-summary-price">¥{{formatPrice(selectedPayPriceFen)}}</view>
</view>
<view v-if="isLookAd ==1" @click="lookAd()" class="resource-ad">
广告查看
</view>
<view v-if="isLookAd ==2" @click="jfAd()" class="resource-ad">
积分获取 {{resourceInfo.adNumber}} 积分
</view>
<view v-if="isLookAd ==3 && selectedSpec" @click="handlePaidAction()" class="resource-ad" :class="{'resource-owned': selectedSpec.purchased}">
{{paidButtonText}}
</view>
</view>
<u-toast ref="uToast"></u-toast>
</view>
</template>
<script>
import {
getResource,getResourceByUserId,resourceDownLoad,appGetUserById,exchangeResource,
createVirtualResourceOrder,getVirtualResourceOrder
} from "@/api/app/index.js"
import config from '@/config'
let videoAd = null;
export default {
data() {
return {
baseUrl: config.baseUrl,
adUnitId:"",
adUnitId2:"",
id:null,
resourceInfo:{
resourceTitle: '',
showImg: '',
appResourceListList: []
},
isLookAd:null,
paying: false,
selectedResourceListId: null,
tag_style: {
h1: 'line-height: 50px;font-size:16px;',
h2: 'line-height: 50px;font-size:16px',
h3: 'line-height: 50px;font-size:16px',
h4: 'line-height: 50px;font-size:16px',
},
container_style: 'font-size:15px;overflow-x: hidden;line-height:30px;letter-spacing:1px',
contentDate: "",
userId: null,
type:0
}
},
computed: {
paySpecs() {
var list = this.resourceInfo.appResourceListList || [];
return list.filter(function(item) {
return item.status == 1 || item.purchased;
});
},
purchasedSpecs() {
return this.paySpecs.filter(function(item) {
return !!item.purchased && !!item.listUrl;
});
},
highestPurchasedSpec() {
var purchased = this.paySpecs.filter(function(item) {
return !!item.purchased;
});
purchased.sort(function(left, right) {
var sortDiff = Number(right.sortOrder || 0) - Number(left.sortOrder || 0);
return sortDiff || Number(right.id || 0) - Number(left.id || 0);
});
return purchased.length ? purchased[0] : null;
},
selectedSpec() {
var selectedId = this.selectedResourceListId;
return this.paySpecs.find(function(item) {
return String(item.id) === String(selectedId);
}) || null;
},
selectedPayPriceFen() {
return this.getPayablePriceFen(this.selectedSpec);
},
selectedIsUpgrade() {
return this.isUpgradeSpec(this.selectedSpec);
},
paidButtonText() {
if (!this.selectedSpec) {
return '暂无可购买规格';
}
if (this.selectedSpec.purchased) {
return '已购买,查看资源';
}
if (this.paying) {
return '支付结果确认中...';
}
return this.selectedIsUpgrade ? '补差价升级' : '立即购买';
}
},
// 分享好友配置
onShareAppMessage(res) {
var that = this;
return {
title: that.resourceInfo.resourceTitle,
imageUrl: that.resourceInfo.showImg,
path: 'pages/blog/resource?id='+that.resourceInfo.id+"&share=1",
}
},
onShareTimeline(){
var that = this;
return {
title:that.resourceInfo.resourceTitle,
query:{
id: that.resourceInfo.id,
share: 1
},
imageUrl:that.resourceInfo.showImg
}
},
onLoad(option) {
const sysSet = uni.getStorageSync("sysSet") || {}
const userInfo = uni.getStorageSync("userInfo") || {}
this.adUnitId = sysSet.zyinfoAd || ""
this.adUnitId2 = sysSet.downVideoAd || ""
this.userId = userInfo.userId || null
const id = option && option.id
if (!/^\d+$/.test(String(id || ''))) {
uni.showToast({
title: '资源参数错误,请重新进入',
icon: 'none'
})
return
}
this.id = id
if (option && /^\d+$/.test(String(option.resourceListId || ''))) {
this.selectedResourceListId = option.resourceListId
}
if(option.type){
this.type = option.type
}
// 请求详情
this.getInfo()
//初始化激励广告
this.CreateAd()
},
methods: {
CreateAd(){
var that = this;
if (this.adUnitId2 != '') {
if (wx.createRewardedVideoAd) {
videoAd = wx.createRewardedVideoAd({
adUnitId: this.adUnitId2
})
videoAd.onLoad(() => {})
videoAd.onError((err) => {
that.$refs.uToast.show({
type: 'error',
title: '',
message: "请使用移动端设备访问",
icon: false
})
})
videoAd.onClose((res) => {
if (res && res.isEnded) {
// that.$refs.uToast.show({
// type: 'success',
// title: '',
// message: "╮(๑•́ ₃•̀๑)╭ 谢谢您的支持 ",
// icon: false
// })
that.isLookAd = 0
resourceDownLoad({id: that.id}).then(response => {})
} else {
}
})
}
}
},
jfAd(){
var that = this;
appGetUserById(that.userId).then(response => {
if (that.resourceInfo.adNumber > response.user.integral) {
uni.showModal({
title: '积分不足',
content: '您的积分为 '+response.user.integral+' ,签到做任务可获得积分',
cancelText: "取消",
confirmText: "获取积分",
confirmColor:'#ff0000',
cancelColor:'#000000',
success: function(res) {
if (res.confirm) {
// 执行确认后的操作
uni.switchTab({
url: '/pages/mine/index'
});
}
else {
// 执行取消后的操作
}
}
})
} else {
var data = {
source: '资源兑换',
isAdd: 1,
integralNumber: that.resourceInfo.adNumber,
userId: that.userId,
resourceId: that.id
}
exchangeResource(data).then(response => {
that.$refs.uToast.show({
type: 'success',
title: '',
message: "兑换成功",
icon: false
})
that.getInfo()
})
}
})
},
lookAd(){
// 用户触发广告后,显示激励视频广告
if (videoAd) {
videoAd.show().catch(() => {
// 失败重试
videoAd.load()
.then(() => videoAd.show())
.catch(err => {
console.error('激励视频 广告显示失败', err)
})
})
}
//下载次数+1
//添加广告记录
},
getInfo(){
var that = this;
getResourceByUserId(this.id).then(response => {
if (!response || !response.data) {
uni.showToast({
title: '资源信息不存在',
icon: 'none'
})
return
}
if(response.data.isAd == 0){
this.isLookAd = 0
resourceDownLoad({id: this.id}).then(response => {})
}else if(response.data.isAd == 1){
this.isLookAd = 1
//resourceDownLoad({id: this.id}).then(response => {})
}else if(response.data.isAd == 2){
this.isLookAd = 2
}else if(response.data.isAd == 3){
this.isLookAd = 3
}
that.resourceInfo = response.data
if (response.data.isAd == 3) {
that.selectDefaultSpec()
}
var str = that.resourceInfo.explain || ''
if (str.includes("/dev-api")) {
that.resourceInfo.explain = str.replace("/dev-api", that.baseUrl)
} else {
that.resourceInfo.explain = str.replace("/prod-api", that.baseUrl)
}
that.contentDate = that.resourceInfo.explain
.replace(/<h1([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<h1')
.replace(/<h1([\s\w"=\/\.:;]+)((?:(class="[^"]+")))/ig, '<h1')
.replace(/<h1>/ig, '<h1 class="h1">')
.replace(/<h2([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<h2')
.replace(/<h2([\s\w"=\/\.:;]+)((?:(class="[^"]+")))/ig, '<h2')
.replace(/<h2>/ig, '<h2 class="h2">')
.replace(/<h3([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<h3')
.replace(/<h3([\s\w"=\/\.:;]+)((?:(class="[^"]+")))/ig, '<h3')
.replace(/<h3>/ig, '<h3 class="h3">')
.replace(/<h4([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<h4')
.replace(/<h4([\s\w"=\/\.:;]+)((?:(class="[^"]+")))/ig, '<h4')
.replace(/<h4>/ig, '<h4 class="h4">')
.replace(/<h5([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<h5')
.replace(/<h5([\s\w"=\/\.:;]+)((?:(class="[^"]+")))/ig, '<h5')
.replace(/<h5>/ig, '<h5 class="h4">')
.replace(/<h6([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<h6')
.replace(/<h6([\s\w"=\/\.:;]+)((?:(class="[^"]+")))/ig, '<h6')
.replace(/<h6>/ig, '<h6 class="h6">')
.replace(/<code([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<code')
.replace(/<code([\s\w"=\/\.:;]+)((?:(class="[^"]+")))/ig, '<code')
.replace(/<code>/ig, '<code class="language-css">')
})
},
copy(url){
if (!url) {
return;
}
uni.setClipboardData({
data: url,
showToast: false,
success: function () {
uni.showToast({
title: '链接已复制',
icon: 'success',
duration: 1200
});
}
});
},
isUpgradeSpec(item){
if (!item || item.purchased || !this.highestPurchasedSpec) {
return false;
}
return Number(item.sortOrder || 0) > Number(this.highestPurchasedSpec.sortOrder || 0);
},
getPayablePriceFen(item){
if (!item) {
return 0;
}
var targetPrice = Number(item.priceFen || 0);
if (!this.isUpgradeSpec(item)) {
return targetPrice;
}
var ownedPrice = Number(this.highestPurchasedSpec.priceFen || 0);
return Math.max(targetPrice - ownedPrice, 0);
},
selectDefaultSpec(){
var currentId = this.selectedResourceListId;
var currentExists = this.paySpecs.some(function(item) {
return String(item.id) === String(currentId);
});
if (currentExists) {
return;
}
var firstUnpurchased = this.paySpecs.find(function(item) {
return item.status == 1 && !item.purchased;
});
this.selectedResourceListId = firstUnpurchased
? firstUnpurchased.id
: (this.paySpecs.length ? this.paySpecs[0].id : null);
},
selectSpec(item){
if (this.paying) {
return;
}
this.selectedResourceListId = item.id;
},
handlePaidAction(){
if (!this.selectedSpec) {
return;
}
if (this.selectedSpec.purchased) {
uni.pageScrollTo({
selector: '#purchased-resources',
duration: 250
});
return;
}
this.payResource();
},
payResource(){
var that = this;
if (this.paying) {
return;
}
if (!this.userId) {
uni.showToast({
title: '请先登录后购买',
icon: 'none'
});
return;
}
if (!this.selectedSpec || this.selectedSpec.status != 1) {
uni.showToast({
title: '请选择可购买的版本',
icon: 'none'
});
return;
}
if (!this.selectedPayPriceFen || this.selectedPayPriceFen <= 0) {
uni.showToast({
title: '价格信息错误',
icon: 'none'
});
return;
}
if (typeof wx === 'undefined' || typeof wx.requestVirtualPayment !== 'function') {
uni.showToast({
title: '当前微信版本不支持虚拟支付,请升级微信',
icon: 'none'
});
return;
}
this.paying = true;
uni.login({
provider: 'weixin',
success: loginRes => {
createVirtualResourceOrder({
resourceListId: that.selectedSpec.id,
code: loginRes.code
}).then(response => {
var payParams = response.data;
wx.requestVirtualPayment({
signData: payParams.signData,
paySig: payParams.paySig,
signature: payParams.signature,
mode: payParams.mode,
success: () => {
that.confirmVirtualOrder(payParams.orderNo, 0);
},
fail: err => {
that.paying = false;
var cancelled = err && err.errCode === -2;
uni.showToast({
title: cancelled ? '已取消支付' : '支付未完成,请重试',
icon: 'none'
});
}
});
}).catch(() => {
that.paying = false;
});
},
fail: () => {
that.paying = false;
uni.showToast({
title: '获取微信登录凭证失败',
icon: 'none'
});
}
});
},
confirmVirtualOrder(orderNo, attempt){
var that = this;
var shouldSync = attempt === 1 || attempt === 6;
getVirtualResourceOrder(orderNo, shouldSync).then(response => {
var order = response.data;
if (order.unlocked) {
that.paying = false;
that.$refs.uToast.show({
type: 'success',
title: '',
message: '购买成功',
icon: false
});
resourceDownLoad({id: that.id}).then(function() {});
that.getInfo();
return;
}
if (order.status === 2 || order.status === 3) {
that.paying = false;
uni.showToast({
title: order.status === 2 ? '订单已退款' : '订单已关闭',
icon: 'none'
});
return;
}
if (attempt < 10) {
setTimeout(function() {
that.confirmVirtualOrder(orderNo, attempt + 1);
}, 1200);
} else {
that.paying = false;
uni.showToast({
title: '支付结果确认中,请稍后重新进入页面',
icon: 'none',
duration: 3000
});
}
}).catch(() => {
if (attempt < 10) {
setTimeout(function() {
that.confirmVirtualOrder(orderNo, attempt + 1);
}, 1200);
} else {
that.paying = false;
}
});
},
formatPrice(priceFen){
var value = Number(priceFen || 0) / 100;
return value.toFixed(2);
},
back(val) {
const pages = getCurrentPages();
if (pages.length > 1) {
uni.navigateBack()
} else {
uni.switchTab({
url: '/pages/index'
});
}
}
}
}
</script>
<style>
page {
background-color: #ffffff;
min-height: 100%;
}
.data-view {
margin: 0upx 20upx;
font-size: 34upx;
color: #333232;
line-height: 60upx;
word-wrap: break-word;
}
.jiesao{
padding: 20rpx 30rpx;
}
.resource-ad{
height: 88rpx;
width: 100%;
margin: 0;
border-radius: 100rpx;
background: #7a60fd;
line-height: 88rpx;
text-align: center;
font-size: 34rpx;
color: white;
box-shadow: 0 8rpx 22rpx rgba(122, 96, 253, 0.22);
}
.bottom-action-bar{
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 99;
box-sizing: border-box;
width: 100%;
padding: 18rpx 5% calc(18rpx + constant(safe-area-inset-bottom));
padding: 18rpx 5% calc(18rpx + env(safe-area-inset-bottom));
background: rgba(255, 255, 255, 0.98);
border-top: 1rpx solid #eeeeee;
box-shadow: 0 -10rpx 30rpx rgba(45, 45, 45, 0.1);
}
.action-summary{
height: 54rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 12rpx 12rpx;
}
.action-summary-name{
display: flex;
align-items: center;
min-width: 0;
}
.action-summary-label{
flex-shrink: 0;
margin-right: 14rpx;
padding: 3rpx 12rpx;
border-radius: 999rpx;
font-size: 21rpx;
color: #6d52f5;
background: #f0ecff;
}
.action-summary-value{
max-width: 420rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 27rpx;
color: #333333;
}
.action-summary-price{
flex-shrink: 0;
font-size: 31rpx;
font-weight: 600;
color: #e54d42;
}
.action-placeholder{
width: 100%;
height: calc(142rpx + constant(safe-area-inset-bottom));
height: calc(142rpx + env(safe-area-inset-bottom));
}
.action-placeholder-paid{
height: calc(208rpx + constant(safe-area-inset-bottom));
height: calc(208rpx + env(safe-area-inset-bottom));
}
.resource-owned{
background: #39b54a;
}
.spec-section{
margin-bottom: 45rpx;
}
.spec-list{
margin: 24rpx 10rpx 0;
}
.spec-item{
box-sizing: border-box;
min-height: 104rpx;
margin-bottom: 18rpx;
padding: 16rpx 24rpx;
border: 2rpx solid #e5e5e5;
border-radius: 18rpx;
display: flex;
align-items: center;
justify-content: space-between;
background: #ffffff;
}
.spec-item-selected{
border-color: #7a60fd;
background: #f5f2ff;
box-shadow: 0 8rpx 20rpx rgba(122, 96, 253, 0.12);
}
.spec-content{
flex: 1;
min-width: 0;
padding-right: 16rpx;
}
.spec-name{
font-size: 29rpx;
font-weight: 500;
line-height: 42rpx;
color: #2b2b2b;
}
.spec-name-text{
display: block;
word-break: keep-all;
overflow-wrap: break-word;
}
.spec-meta{
margin-top: 8rpx;
line-height: 1;
}
.spec-price{
flex-shrink: 0;
min-width: 120rpx;
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: center;
}
.upgrade-price-label{
margin-bottom: 4rpx;
font-size: 20rpx;
font-weight: 500;
line-height: 28rpx;
color: #7a60fd;
}
.spec-price-value{
white-space: nowrap;
text-align: right;
font-size: 31rpx;
font-weight: 600;
line-height: 42rpx;
color: #e54d42;
}
.purchased-tag,
.disabled-tag{
display: inline-block;
padding: 4rpx 12rpx;
border-radius: 999rpx;
font-size: 21rpx;
font-weight: 400;
}
.purchased-tag{
color: #248b3e;
background: #e8f7ec;
}
.disabled-tag{
color: #8799a3;
background: #f1f1f1;
}
.empty-spec{
margin: 24rpx 10rpx;
padding: 28rpx;
text-align: center;
border-radius: 18rpx;
color: #8799a3;
background: #f7f7f7;
}
.file-list{
box-sizing: border-box;
margin: 24rpx 10rpx 0;
padding: 24rpx;
border: 1rpx solid #eeeeee;
border-radius: 20rpx;
background: #ffffff;
box-shadow: 0 8rpx 24rpx rgba(45, 45, 45, 0.05);
}
.file-header{
display: flex;
align-items: flex-start;
}
.file-type-icon{
box-sizing: border-box;
width: 44rpx;
height: 44rpx;
flex: 0 0 44rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 12rpx;
background: #f3f0ff;
}
.file-heading{
min-width: 0;
margin-left: 16rpx;
display: flex;
flex: 1;
flex-direction: column;
}
.file-title{
font-size: 27rpx;
font-weight: 500;
line-height: 42rpx;
color: #2b2b2b;
}
.file-password{
align-self: flex-start;
margin-top: 8rpx;
padding: 4rpx 12rpx;
border-radius: 999rpx;
font-size: 22rpx;
line-height: 30rpx;
color: #8a4b00;
background: #fff7db;
}
.file-url-box{
box-sizing: border-box;
width: 100%;
min-height: 80rpx;
margin-top: 20rpx;
padding: 12rpx 12rpx 12rpx 20rpx;
display: flex;
align-items: center;
border: 1rpx solid #e8e8ec;
border-radius: 16rpx;
background: #f6f6f8;
}
.file-url{
flex: 1;
min-width: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 25rpx;
line-height: 56rpx;
color: #3f3f46;
}
.file-copy{
min-width: 96rpx;
height: 56rpx;
margin-left: 16rpx;
padding: 0 16rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 14rpx;
font-size: 24rpx;
font-weight: 500;
color: #6d52f5;
background: #ebe7ff;
}
.shuoming{
margin: 25rpx 25rpx 30rpx 25rpx;
font-size: 25rpx;
}
.shuoming2{
margin: 25rpx 20rpx 30rpx;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
min-height: 85rpx;
padding: 20rpx 16rpx;
font-size: 26rpx;
line-height: 1.6;
background-color: #fff7db;
border: 1rpx solid #f2d18a;
text-align: center;
border-radius: 20rpx;
color: #8a4b00;
}
.resource-list{
margin: 40rpx 20rpx;
}
.resource-font {
font-weight: 600;
font-size: 35rpx;
margin-left: 20rpx;
}
.resource-view {
display: flex;
align-items: center;
justify-content: flex-start;
}
.resource-section-icon {
box-sizing: border-box;
width: 48rpx;
height: 48rpx;
flex: 0 0 48rpx;
display: flex;
align-items: center;
justify-content: center;
border: 1rpx solid #ddd6ff;
border-radius: 14rpx;
background: #f3f0ff;
}
.resource-section-icon-large {
width: 64rpx;
height: 64rpx;
flex-basis: 64rpx;
border-radius: 18rpx;
}
.resource-title-icon {
display: none;
}
.resource-font2 {
font-weight: 600;
font-size: 30rpx;
margin-left: 20rpx;
}
.resource-box{
min-height: 350rpx;
width: 100%;
background-color: white;
border-radius: 50rpx;
margin-top: -60rpx;
position: relative;
z-index: 2;
padding: 50rpx 30rpx;
}
.top-img {
height: 500upx;
width: 100%;
position: relative;
z-index: 1;
}
.ui-img {
height: 100%;
width: 100%;
position: relative;
}
.backbut {
position: absolute;
left: 20rpx;
top: 100rpx;
font-size: 50rpx;
}
</style>