2025-08-14 15:04:24 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<view style="min-height: 100vh;position: relative;">
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 顶部图片 -->
|
|
|
|
|
|
<view class="top-img">
|
2026-07-28 13:35:23 +08:00
|
|
|
|
<image class="ui-img" :src="$image.original(resourceInfo.showImg)" mode="aspectFill"></image>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
<text @click="back()" class="cuIcon-back backbut"></text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="resource-box">
|
|
|
|
|
|
<view class="resource-view">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="resource-section-icon resource-section-icon-large resource-title-icon">
|
|
|
|
|
|
<uni-icons type="cloud-download" size="28" color="#6d52f5"></uni-icons>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
<view class="resource-font">
|
|
|
|
|
|
{{resourceInfo.resourceTitle}}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
<view class="resource-list">
|
|
|
|
|
|
<view v-if="type != 1" class="resource-view">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="resource-section-icon">
|
|
|
|
|
|
<uni-icons type="info" size="22" color="#6d52f5"></uni-icons>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
</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>
|
|
|
|
|
|
|
2026-07-29 14:35:13 +08:00
|
|
|
|
<!-- 付费资源规格 -->
|
|
|
|
|
|
<view v-if="isLookAd == 3" class="spec-section">
|
|
|
|
|
|
<view class="resource-view">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="resource-section-icon">
|
|
|
|
|
|
<uni-icons type="list" size="22" color="#6d52f5"></uni-icons>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</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)"
|
|
|
|
|
|
>
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<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>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
<view class="spec-price">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<text v-if="isUpgradeSpec(item)" class="upgrade-price-label">补差价</text>
|
|
|
|
|
|
<text class="spec-price-value">¥{{formatPrice(getPayablePriceFen(item))}}</text>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-else class="empty-spec">暂无可购买规格,请联系管理员</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
2025-08-14 15:04:24 +08:00
|
|
|
|
<!-- 资源列表 -->
|
|
|
|
|
|
<view>
|
|
|
|
|
|
<view class="resource-view">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="resource-section-icon">
|
|
|
|
|
|
<uni-icons type="download" size="22" color="#6d52f5"></uni-icons>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
<view class="resource-font2">
|
2026-07-29 14:35:13 +08:00
|
|
|
|
{{isLookAd == 3 ? '已购资源' : '资源列表'}}
|
2025-08-14 15:04:24 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
<template v-if="isLookAd == 3">
|
|
|
|
|
|
<view v-if="purchasedSpecs.length" id="purchased-resources">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="shuoming2">复制下方链接,在手机浏览器中打开即可下载</view>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
<view v-for="item in purchasedSpecs" :key="item.id" class="file-list purchased-file">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="file-header">
|
|
|
|
|
|
<view class="file-type-icon">
|
|
|
|
|
|
<uni-icons type="link" size="20" color="#6d52f5"></uni-icons>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</view>
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="file-heading">
|
|
|
|
|
|
<text class="file-title">{{item.listName}}</text>
|
|
|
|
|
|
<text class="file-password" v-if="item.password">提取码:{{item.password}}</text>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="file-url-box">
|
|
|
|
|
|
<text class="file-url">{{item.listUrl}}</text>
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view @click="copy(item.listUrl)" class="file-copy">复制</view>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</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>
|
2026-07-28 13:35:23 +08:00
|
|
|
|
<template v-if="isLookAd == 0">
|
|
|
|
|
|
<view v-for="(item,index) in resourceInfo.appResourceListList" :key="index" class="file-list">
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="file-header">
|
|
|
|
|
|
<view class="file-type-icon">
|
|
|
|
|
|
<uni-icons type="link" size="20" color="#6d52f5"></uni-icons>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</view>
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<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>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
</view>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
</view>
|
2026-07-30 09:11:38 +08:00
|
|
|
|
<view class="file-url-box">
|
|
|
|
|
|
<text class="file-url">{{item.listUrl}}</text>
|
|
|
|
|
|
<view @click="copy(item.listUrl)" class="file-copy">复制</view>
|
|
|
|
|
|
</view>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
</view>
|
2026-07-28 13:35:23 +08:00
|
|
|
|
</template>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
|
|
|
|
|
|
<view v-if="adUnitId" style="width: 100%; margin-top: 50rpx;">
|
|
|
|
|
|
<ad-custom :unit-id="adUnitId" ad-intervals="30" ></ad-custom>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2026-07-29 14:35:13 +08:00
|
|
|
|
<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>
|
2026-07-28 13:35:23 +08:00
|
|
|
|
</view>
|
2025-08-14 15:04:24 +08:00
|
|
|
|
<u-toast ref="uToast"></u-toast>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
import {
|
2026-07-28 13:35:23 +08:00
|
|
|
|
getResource,getResourceByUserId,resourceDownLoad,appGetUserById,exchangeResource,
|
|
|
|
|
|
createVirtualResourceOrder,getVirtualResourceOrder
|
2025-08-14 15:04:24 +08:00
|
|
|
|
} from "@/api/app/index.js"
|
|
|
|
|
|
import config from '@/config'
|
|
|
|
|
|
let videoAd = null;
|
|
|
|
|
|
export default {
|
|
|
|
|
|
data() {
|
|
|
|
|
|
return {
|
|
|
|
|
|
baseUrl: config.baseUrl,
|
|
|
|
|
|
adUnitId:"",
|
|
|
|
|
|
adUnitId2:"",
|
|
|
|
|
|
id:null,
|
2026-07-28 13:35:23 +08:00
|
|
|
|
resourceInfo:{
|
|
|
|
|
|
resourceTitle: '',
|
|
|
|
|
|
showImg: '',
|
|
|
|
|
|
appResourceListList: []
|
|
|
|
|
|
},
|
2025-08-14 15:04:24 +08:00
|
|
|
|
isLookAd:null,
|
2026-07-28 13:35:23 +08:00
|
|
|
|
paying: false,
|
2026-07-29 14:35:13 +08:00
|
|
|
|
selectedResourceListId: null,
|
2025-08-14 15:04:24 +08:00
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
2026-07-29 14:35:13 +08:00
|
|
|
|
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 ? '补差价升级' : '立即购买';
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
2025-08-14 15:04:24 +08:00
|
|
|
|
// 分享好友配置
|
|
|
|
|
|
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) {
|
2026-07-28 13:35:23 +08:00
|
|
|
|
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
|
2026-07-29 14:35:13 +08:00
|
|
|
|
if (option && /^\d+$/.test(String(option.resourceListId || ''))) {
|
|
|
|
|
|
this.selectedResourceListId = option.resourceListId
|
|
|
|
|
|
}
|
2025-08-14 15:04:24 +08:00
|
|
|
|
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
|
|
|
|
|
|
})
|
2026-07-28 13:35:23 +08:00
|
|
|
|
that.getInfo()
|
2025-08-14 15:04:24 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
lookAd(){
|
|
|
|
|
|
// 用户触发广告后,显示激励视频广告
|
|
|
|
|
|
if (videoAd) {
|
|
|
|
|
|
videoAd.show().catch(() => {
|
|
|
|
|
|
// 失败重试
|
|
|
|
|
|
videoAd.load()
|
|
|
|
|
|
.then(() => videoAd.show())
|
|
|
|
|
|
.catch(err => {
|
|
|
|
|
|
console.error('激励视频 广告显示失败', err)
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//下载次数+1
|
|
|
|
|
|
//添加广告记录
|
|
|
|
|
|
},
|
|
|
|
|
|
getInfo(){
|
|
|
|
|
|
var that = this;
|
2026-07-28 13:35:23 +08:00
|
|
|
|
getResourceByUserId(this.id).then(response => {
|
|
|
|
|
|
if (!response || !response.data) {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '资源信息不存在',
|
|
|
|
|
|
icon: 'none'
|
|
|
|
|
|
})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2025-08-14 15:04:24 +08:00
|
|
|
|
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 => {})
|
2026-07-28 13:35:23 +08:00
|
|
|
|
}else if(response.data.isAd == 2){
|
2025-08-14 15:04:24 +08:00
|
|
|
|
this.isLookAd = 2
|
2026-07-28 13:35:23 +08:00
|
|
|
|
}else if(response.data.isAd == 3){
|
|
|
|
|
|
this.isLookAd = 3
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
that.resourceInfo = response.data
|
2026-07-29 14:35:13 +08:00
|
|
|
|
if (response.data.isAd == 3) {
|
|
|
|
|
|
that.selectDefaultSpec()
|
|
|
|
|
|
}
|
2026-07-28 13:35:23 +08:00
|
|
|
|
var str = that.resourceInfo.explain || ''
|
2025-08-14 15:04:24 +08:00
|
|
|
|
if (str.includes("/dev-api")) {
|
|
|
|
|
|
that.resourceInfo.explain = str.replace("/dev-api", that.baseUrl)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
that.resourceInfo.explain = str.replace("/prod-api", that.baseUrl)
|
|
|
|
|
|
}
|
2026-07-28 13:35:23 +08:00
|
|
|
|
that.contentDate = that.resourceInfo.explain
|
2025-08-14 15:04:24 +08:00
|
|
|
|
.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){
|
2026-07-29 14:35:13 +08:00
|
|
|
|
if (!url) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2025-08-14 15:04:24 +08:00
|
|
|
|
uni.setClipboardData({
|
|
|
|
|
|
data: url,
|
|
|
|
|
|
showToast: false,
|
|
|
|
|
|
success: function () {
|
2026-07-30 09:11:38 +08:00
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '链接已复制',
|
|
|
|
|
|
icon: 'success',
|
|
|
|
|
|
duration: 1200
|
|
|
|
|
|
});
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
2026-07-29 14:35:13 +08:00
|
|
|
|
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();
|
|
|
|
|
|
},
|
2026-07-28 13:35:23 +08:00
|
|
|
|
payResource(){
|
|
|
|
|
|
var that = this;
|
|
|
|
|
|
if (this.paying) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!this.userId) {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '请先登录后购买',
|
|
|
|
|
|
icon: 'none'
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-07-29 14:35:13 +08:00
|
|
|
|
if (!this.selectedSpec || this.selectedSpec.status != 1) {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '请选择可购买的版本',
|
|
|
|
|
|
icon: 'none'
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!this.selectedPayPriceFen || this.selectedPayPriceFen <= 0) {
|
2026-07-28 13:35:23 +08:00
|
|
|
|
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({
|
2026-07-29 14:35:13 +08:00
|
|
|
|
resourceListId: that.selectedSpec.id,
|
2026-07-28 13:35:23 +08:00
|
|
|
|
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
|
|
|
|
|
|
});
|
2026-07-29 14:35:13 +08:00
|
|
|
|
resourceDownLoad({id: that.id}).then(function() {});
|
2026-07-28 13:35:23 +08:00
|
|
|
|
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);
|
|
|
|
|
|
},
|
2025-08-14 15:04:24 +08:00
|
|
|
|
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{
|
2026-07-29 14:35:13 +08:00
|
|
|
|
height: 88rpx;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
margin: 0;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
border-radius: 100rpx;
|
|
|
|
|
|
background: #7a60fd;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
line-height: 88rpx;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
text-align: center;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
font-size: 34rpx;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
color: white;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
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{
|
2026-07-30 09:11:38 +08:00
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
min-height: 104rpx;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
margin-bottom: 18rpx;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
padding: 16rpx 24rpx;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
2026-07-30 09:11:38 +08:00
|
|
|
|
.spec-content{
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
padding-right: 16rpx;
|
|
|
|
|
|
}
|
2026-07-29 14:35:13 +08:00
|
|
|
|
.spec-name{
|
|
|
|
|
|
font-size: 29rpx;
|
|
|
|
|
|
font-weight: 500;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
line-height: 42rpx;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
color: #2b2b2b;
|
|
|
|
|
|
}
|
2026-07-30 09:11:38 +08:00
|
|
|
|
.spec-name-text{
|
|
|
|
|
|
display: block;
|
|
|
|
|
|
word-break: keep-all;
|
|
|
|
|
|
overflow-wrap: break-word;
|
|
|
|
|
|
}
|
|
|
|
|
|
.spec-meta{
|
|
|
|
|
|
margin-top: 8rpx;
|
|
|
|
|
|
line-height: 1;
|
|
|
|
|
|
}
|
2026-07-29 14:35:13 +08:00
|
|
|
|
.spec-price{
|
2026-07-30 09:11:38 +08:00
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
min-width: 120rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
align-items: flex-end;
|
|
|
|
|
|
justify-content: center;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
.upgrade-price-label{
|
2026-07-30 09:11:38 +08:00
|
|
|
|
margin-bottom: 4rpx;
|
|
|
|
|
|
font-size: 20rpx;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
font-weight: 500;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
line-height: 28rpx;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
color: #7a60fd;
|
|
|
|
|
|
}
|
2026-07-30 09:11:38 +08:00
|
|
|
|
.spec-price-value{
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
text-align: right;
|
|
|
|
|
|
font-size: 31rpx;
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
line-height: 42rpx;
|
|
|
|
|
|
color: #e54d42;
|
|
|
|
|
|
}
|
2026-07-29 14:35:13 +08:00
|
|
|
|
.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;
|
|
|
|
|
|
}
|
2026-07-30 09:11:38 +08:00
|
|
|
|
.file-list{
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
margin: 24rpx 10rpx 0;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
padding: 24rpx;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
border: 1rpx solid #eeeeee;
|
2026-07-29 14:35:13 +08:00
|
|
|
|
border-radius: 20rpx;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
box-shadow: 0 8rpx 24rpx rgba(45, 45, 45, 0.05);
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
2026-07-30 09:11:38 +08:00
|
|
|
|
.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;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
.file-url-box{
|
2026-07-30 09:11:38 +08:00
|
|
|
|
box-sizing: border-box;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
width: 100%;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
min-height: 80rpx;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
margin-top: 20rpx;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
padding: 12rpx 12rpx 12rpx 20rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
border: 1rpx solid #e8e8ec;
|
|
|
|
|
|
border-radius: 16rpx;
|
|
|
|
|
|
background: #f6f6f8;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
.file-url{
|
2026-07-30 09:11:38 +08:00
|
|
|
|
flex: 1;
|
|
|
|
|
|
min-width: 0;
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
|
font-size: 25rpx;
|
|
|
|
|
|
line-height: 56rpx;
|
|
|
|
|
|
color: #3f3f46;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
.file-copy{
|
2026-07-30 09:11:38 +08:00
|
|
|
|
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;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
.shuoming{
|
|
|
|
|
|
margin: 25rpx 25rpx 30rpx 25rpx;
|
|
|
|
|
|
font-size: 25rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
.shuoming2{
|
2026-07-30 09:11:38 +08:00
|
|
|
|
margin: 25rpx 20rpx 30rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
min-height: 85rpx;
|
|
|
|
|
|
padding: 20rpx 16rpx;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
font-size: 26rpx;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
line-height: 1.6;
|
|
|
|
|
|
background-color: #fff7db;
|
|
|
|
|
|
border: 1rpx solid #f2d18a;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
text-align: center;
|
|
|
|
|
|
border-radius: 20rpx;
|
2026-07-30 09:11:38 +08:00
|
|
|
|
color: #8a4b00;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
.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;
|
|
|
|
|
|
}
|
2026-07-30 09:11:38 +08:00
|
|
|
|
.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;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
2026-07-30 09:11:38 +08:00
|
|
|
|
.resource-title-icon {
|
|
|
|
|
|
display: none;
|
2025-08-14 15:04:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
.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;
|
|
|
|
|
|
}
|
2026-07-28 13:35:23 +08:00
|
|
|
|
</style>
|