ts_aimz_uni/pages/index/home.vue

1121 lines
132 KiB
Vue
Raw Normal View History

2025-04-16 16:15:41 +08:00
<template>
<view id="title-box" class="title-container" style="padding-bottom: 60rpx;">
<view class="bg-title"></view>
<!-- 自定义title -->
<view class="title-content">
<!-- 上半部分 -->
<view id="up-box">
<view class="custom-navbar"
:style="{'height':totalHeight+'px','padding-top':statusBarHeight+'px','justify-content':'flex-start','color':'white'}">
<view class="navbar-title">AI喵著</view>
</view>
<!-- 充值/创建 -->
<view class="title-func">
<view class="create-btn" @click="createCopy">
<view class="icon-add" style="width: 40rpx;height: 40rpx;"></view>
<text style="margin-left: 20rpx;text-align: center;font-size: 40rpx;">创建软著</text>
</view>
<view class="buy-btn" @click="goPayment">充值</view>
</view>
<!-- 通知信息 -->
<view class="notice-box">
<view class="icon icon-horn-ind"></view>
<view class="marquee-container">
<view class="marquee-text">{{noticeContent}}</view>
</view>
</view>
<!-- 内容tab -->
<view class="content-up">
<view class="list-title-box">
<view class="list-title">
<view class="list-title-line"></view>
<view class="list-title-txt">软著列表</view>
</view>
<view class="list-title-btns">
<view @click="doChangeStatus('PROCESSING')"
:class="currentStatus=='PROCESSING'? 'btn-select':'btn-normal'" class="border-left">进行中的
</view>
<view @click="doChangeStatus('COMPLETE')" data-value="COMPLETE"
:class="currentStatus=='COMPLETE'? 'btn-select':'btn-normal'" class="border-right">已完成的
</view>
</view>
</view>
<scroll-view scroll-x="true" class="mt-20 scroll-view_H" show-scrollbar="false">
<view class="list-tabs">
<block v-for="(item,index) in typeList" :key="index">
<view :class="currentType==item.value? 'tab-select' :'tab-normal'" class="item-margin"
@click="doChangeType(item.value)">
<view>{{item.label}}</view>
</view>
</block>
<view class="divider-h"></view>
<block v-for="(item,index) in expandList" :key="index">
<view :class="currentExpand==item.value? 'tab-select' :'tab-normal'" class="item-margin"
@click="doChangeExpand(item.value)">
<view>{{item.label}}</view>
</view>
</block>
<view class="divider-h"></view>
<block v-for="(item,index) in tagList" :key="index">
<view :class="currentTag==item.key? 'tab-select' :'tab-normal'" class="item-margin"
@click="doChangeTag(item.key)">
<view>{{item.value}}</view>
</view>
</block>
</view>
</scroll-view>
</view>
</view>
<!-- 列表 -->
<view class="content-box">
<ContainerLoading :loadingVisible="listLoading" :style="{'height':contentHeight+'px'}"
@doRefresh="doRefreshList">
<scroll-view scroll-y="true" :style="{'height':contentHeight+'px'}" refresher-enabled="true"
:refresher-triggered="listRefreshTrig" :refresher-threshold="100" :lower-threshold="100"
@refresherrefresh="doRefreshList" @scrolltolower="doLoadMore">
<view class="list-content">
<block v-for="(item,index) in projectList" :key="index">
<view class="list-item">
<view class="item-img">
<swiper class="cover" autoplay>
<block v-for="(imgItem,imgIndex) in item.codeTypePage.previewImgs"
:key="imgIndex">
<swiper-item class="cover">
<image class="cover" :src="imgItem"></image>
</swiper-item>
</block>
</swiper>
<view class="item-img-status">
<text>{{status(item.generate.generateStatus)}}</text>
</view>
</view>
<view class="item-content">
<view class="item-content-title">
<view class="project-name single-line">{{item.projName}}</view>
<view class="project-status">
{{item.pay.servicePackageId != '' ? '套餐包':item.pay.charge}}
</view>
</view>
<view class="project-aff">
<view class="icon icon-user-ind"></view>
<text class="txt">{{item.apply.applyContactName}}</text>
</view>
<view class="project-btns">
<view class="project-create-time">{{item.gmtCreate}}</view>
<view v-if="item.generate.generateStatus=='SUCCESS'" class="project-btn"
@click="doShowDownload(item)">下载</view>
<view v-if="item.generate.generateStatus=='FAILED'" class="project-re-btn"
@click="doReCreate(item)">重新生成</view>
</view>
</view>
</view>
</block>
<uni-load-more :status="loadMore"></uni-load-more>
</view>
</scroll-view>
</ContainerLoading>
</view>
</view>
</view>
<uni-popup ref="downloadPopup" type="bottom" background-color="#fff" border-radius="15rpx 15rpx 0rpx 0rpx">
<view class="bottom-dialog-box">
<view style="font-size: 16px;font-weight: bold;align-self: center;">资料下载</view>
<view style="margin-top: 10px;padding-bottom: 80rpx;">
<view class="download-desc">
<view class="link-title">项目预览链接</view>
<text class="link" @click="copyLink">{{sysPreviewUrl}}</text>
</view>
<view class="download-item">
<view class="download-title">
<view class="icon-table"></view>
<view class="download-title-txt">申请表</view>
</view>
<view class="download-btn-box">
<view class="download-btn" @click="download" data-path="/route/proj/download/apply/">
<view class="ic-doc" style="width: 20px;height: 20px;"></view>
<view class="download-btn-txt">Word格式下载</view>
</view>
<view class="download-btn" @click="download" data-path="/route/proj/download/apply-txt/">
<view class="ic-txt" style="width: 20px;height: 20px;"></view>
<view class="download-btn-txt">TXT格式下载</view>
</view>
</view>
</view>
<view class="download-item">
<view class="download-title">
<view class="icon-source"></view>
<view class="download-title-txt">操作手册</view>
</view>
<view class="download-btn-box">
<view class="download-btn" @click="download" data-path="/route/proj/download/manual/">
<view class="ic-doc" style="width: 20px;height: 20px;"></view>
<view class="download-btn-txt">Word格式下载</view>
</view>
<view class="download-btn" @click="download" data-path="/route/proj/download/manual/pdf/">
<view class="ic-pdf" style="width: 20px;height: 20px;"></view>
<view class="download-btn-txt">PDF格式下载</view>
</view>
</view>
</view>
<view class="download-item">
<view class="download-title">
<view class="icon-tool"></view>
<view class="download-title-txt">源代码</view>
</view>
<view class="download-btn-box">
<view class="download-btn" @click="download" data-path="/route/proj/download/code/">
<view class="ic-doc" style="width: 20px;height: 20px;"></view>
<view class="download-btn-txt">Word格式下载</view>
</view>
<view class="download-btn" @click="download" data-path="/route/proj/download/code/pdf/">
<view class="ic-pdf" style="width: 20px;height: 20px;"></view>
<view class="download-btn-txt">PDF格式下载</view>
</view>
</view>
</view>
<view class="hint mt-10">温馨提示:若您想把下载的文件留存到本地打开预览页面后在界面右上角操作栏内选择使用其他软件打开或者保存文件功能就能实现</view>
</view>
</view>
</uni-popup>
<DownloadProgress :isShow="downloading" :progress="downloadProgress"></DownloadProgress>
<!-- 通知消息 -->
<uni-popup ref="msg" type="message">
<uni-popup-message :type="msgType" :message="msgTxt" :duration="2000"></uni-popup-message>
</uni-popup>
</template>
<script>
import ContainerLoading from '@/components/container-loading.vue'
import DownloadProgress from '@/components/download-progress.vue'
import ProApi from '../../static/utils/net/projectApi.js'
import {
previewUrl,
copyrightUrl
} from '../../static/utils/net/http.js'
import {
status
} from '../../static/utils/conver.js'
import {
get
} from '../../static/utils/cache/storage.js';
export default {
components: {
ContainerLoading,
DownloadProgress
},
data() {
return {
contentHeight: 100,
totalHeight: 50,
statusBarHeight: 24,
defaultNotice: '用AI创造用平台保护——欢迎来到您的著作权守护站!',
noticeContent: this.defaultNotice,
currentStatus: 'PROCESSING', //默认状态 PROCESSING进行中 COMPLETE完成
listLoading: 'loading', //loading 状态
listRefreshTrig: false, //是否正在刷新
imgUrl: previewUrl,
cUrl: copyrightUrl,
sysPreviewUrl: '', //系统预览地址
pageData: {
page: 1,
rows: 10
},
typeList: [{
value: 'FREE',
label: '免费试用'
},
{
value: 'MATERIAL',
label: '写材料'
},
{
value: 'ALL',
label: '全托管'
},
],
currentType: '',
expandList: [{
value: 'PKG',
label: '安装包'
},
{
value: 'VIDEO_DEMO',
label: '演示视频'
},
{
value: 'URGENT',
label: '加急'
},
],
currentExpand: '',
tagList: [],
currentTag: '',
projectList: [], //项目列表
hasMore: true, //是否存在更多数据
isLoadMore: false, //是否正在加载更多
loadMore: 'more', //加载更多的状态 more/loading/noMore
tempItem: null, //点击下载的临时条目
downloadProgress: 0, //下载文件进度
downloading: false, //下载文件中
msgType: 'success', //消息类型 success error warn info
msgTxt: '', //消息内容
}
},
onLoad() {
const _self = this
_self.doGetNotice() //获取通知信息
_self.doGetTagList() //获取Tag
const params = _self.buildParams(1, true)
_self.doGetSelfList(params, true)
},
onReady() {
this.calculateRemainingHeight()
},
methods: {
status,
// 获取通知信息
doGetNotice() {
const _self = this
console.log(_self.defaultNotice);
ProApi.doGetNotice()
.then(res => {
console.log(res)
_self.noticeContent = res.data && res.data != '' ? res.data : _self.defaultNotice
})
.catch(err => {
console.log(err);
})
},
//去创建项目
createCopy() {
},
//去充值
goPayment() {
},
//切换状态
doChangeStatus(e) {
this.currentStatus = e
const params = this.buildParams(1, true)
this.doGetSelfList(params, true)
},
//获取标签
doGetTagList() {
const _self = this
ProApi.doGetTagList()
.then(res => {
_self.tagList = res
})
.catch(err => {
console.log(err)
})
},
//切换type
doChangeType(type) {
const _self = this
_self.currentType = type == _self.currentType ? '' : type
const params = _self.buildParams(1, true)
_self.doGetSelfList(params, true)
},
//切换expand
doChangeExpand(expand) {
const _self = this
_self.currentExpand = expand == _self.currentExpand ? '' : expand
const params = _self.buildParams(1, true)
_self.doGetSelfList(params, true)
},
//切换tag
doChangeTag(tag) {
const _self = this
_self.currentTag = tag == _self.currentTag ? '' : tag
const params = _self.buildParams(1, true)
_self.doGetSelfList(params, true)
},
//构建请求参数
buildParams(page, isRefresh) {
const _self = this
_self.projectList = isRefresh ? [] : _self.projectList
_self.pageData.page = page
const [part1, part2] = _self.currentTag.split(':')
const params = {
page: _self.pageData.page,
rows: _self.pageData.rows,
tagNot: part2 ? part2 : '',
tagDataId: part1,
chargeType: _self.currentType, //
chargeAdditionals: _self.currentExpand, //额外附加
status: _self.currentStatus, //当前项目状态
}
return params
},
//获取项目列表
doGetSelfList(params, isRefresh) {
const _self = this
_self.listLoading = isRefresh ? 'loading' : ''
ProApi.doGetSelfProjectList(params)
.then(res => {
console.log(res)
var status = 'success'
status = res.rows && res.rows.length > 0 ? 'success' : 'empty'
const list = _self.addPrefixToPreviewImgs(res.rows)
_self.listLoading = isRefresh ? status : ''
_self.projectList = _self.projectList.concat(list)
_self.listRefreshTrig = false
_self.isLoadMore = false
_self.hasMore = _self.projectList.length < res.total
if (_self.hasMore) {
_self.loadMore = 'more'
} else {
_self.loadMore = 'noMore'
}
})
.catch(err => {
_self.listLoading = 'error'
_self.listRefreshTrig = false
_self.isLoadMore = false
_self.hasMore = true
_self.loadMore = 'more'
})
},
//刷新列表
doRefreshList() {
console.log('正在刷新...')
const _self = this
_self.listRefreshTrig = true
_self.listLoading = 'loading'
const params = _self.buildParams(1, true)
_self.doGetSelfList(params, true)
},
//加载更多
doLoadMore() {
//判断是否正在加载中
const _self = this
console.log(_self.isLoadMore)
console.log(_self.hasMore)
if (_self.isLoadMore || !_self.hasMore) {
return
}
_self.isLoadMore = true
_self.loadMore = 'loading'
_self.pageData.page = ++_self.pageData.page
const params = _self.buildParams(_self.pageData.page, false)
_self.doGetSelfList(params, false)
},
//计算剩余高度
calculateRemainingHeight() {
// 获取窗口高度
const systemInfo = uni.getSystemInfoSync();
const windowHeight = systemInfo.windowHeight;
console.log(windowHeight);
// bg-title container-title
// 获取已占用元素的高度
const query = uni.createSelectorQuery().in(this);
query.select('#up-box').boundingClientRect(data => {
if (data) {
const occupiedHeight = data.height;
console.log(occupiedHeight);
// 计算剩余高度
this.contentHeight = windowHeight - occupiedHeight - 50;
}
}).exec();
},
//为列表图片添加前缀
addPrefixToPreviewImgs(data) {
const prefix = this.imgUrl;
return data.map(item => {
if (item.codeTypePage && item.codeTypePage.previewImgs) {
const imgIds = item.codeTypePage.previewImgs.split(',');
item.codeTypePage.previewImgs = imgIds.map(id => prefix + id);
}
return item;
});
},
//显示下载弹窗
doShowDownload(item) {
console.log('点击了下载')
this.$refs.downloadPopup.open()
this.sysPreviewUrl = `${this.cUrl}/${item.previewUrl}`,
this.tempItem = item
},
//复制链接到剪贴板
copyLink() {
uni.setClipboardData({
data: this.sysPreviewUrl,
success: function() {
console.log('success');
}
});
},
//获取下载文件的响应头
getFileHeader(url, header) {
return new Promise((resolve, reject) => {
uni.request({
url: url,
method: 'HEAD',
header: header,
success: resolve,
fail: reject
})
})
},
//点击下载
async download(e) {
const _self = this
_self.downloadProgress = 0 //重置下载进度
_self.downloading = true //显示进度
this.$refs.downloadPopup.close() //关闭资料下载弹窗
const path = e.currentTarget.dataset.path
const url = this.cUrl + path + _self.tempItem.projId
const token = get('token')
const header = {}
if (token) {
header.Auth = `Bearer ${token}`;
}
const downloadRes = await _self.doDownload(url, header)
if (downloadRes && downloadRes.statusCode == 200) {
const fileHeader = await _self.getFileHeader(url, header)
console.log('请求头:', fileHeader)
if (fileHeader && fileHeader.header) {
const contentDisposition = fileHeader.header['content-disposition'];
console.log('文件头:', contentDisposition);
let fileName = ''
if (contentDisposition) {
const match = contentDisposition.match(/filename=(.*)/)
if (match && match[1]) {
fileName = match[1].replace(/['"]/g, '');
}
}
if (fileName) {
console.log('下载的文件路径:', downloadRes.tempFilePath + fileName);
uni.getFileSystemManager().saveFile({
tempFilePath: downloadRes.tempFilePath + fileName,
success: saveRes => {
//打开文件
console.log('打开文件', saveRes.savedFilePath);
if (saveRes.savedFilePath.endsWith('.txt')) {
uni.navigateTo({
url: '/pages/common/readTxt/readTxt?filePath=' +
saveRes.savedFilePath
})
} else {
uni.openDocument({
filePath: saveRes.savedFilePath,
success: openRes => {
console.log('打开成功')
},
fail: openErr => {
console.log(openErr)
}
})
}
},
fail: saveErr => {
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
}
})
} else {
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
}
} else {
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
}
} else {
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
}
},
//下载文件
doDownload(url, header) {
const _self = this
return new Promise((resolve, reject) => {
const downloadTask = uni.downloadFile({
url: url,
header: header,
success: resolve,
fail: reject
})
downloadTask.onProgressUpdate(res => {
_self.downloadProgress = res.progress
})
})
},
showErr(msg) {
const _self = this
_self.msgTxt = msg
_self.msgType = 'error'
_self.showDownload = false
_self.downloading = false
_self.downloadProgress = 0
}
}
}
</script>
<style>
scroll-view ::-webkit-scrollbar {
display: none;
width: 0 !important;
height: 0 !important;
-webkit-appearance: none;
background: transparent;
}
.scroll-view_H {
white-space: nowrap;
width: 100%;
}
.title-container {
display: flex;
flex-direction: column;
position: absolute;
align-items: center;
}
.title-content {
display: flex;
flex-direction: column;
position: absolute;
top: 0rpx;
left: 0rpx;
padding: 30rpx;
width: 100vw;
box-sizing: border-box;
}
.bg-title {
background-image: url('data:image/png;base64,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
background-size: cover;
background-repeat: no-repeat;
background-position: center;
width: 100vw;
height: 480rpx;
}
.content-up {
display: flex;
flex-direction: column;
padding: 20rpx;
border-top-left-radius: 10rpx;
border-top-right-radius: 10rpx;
background-color: rgba(255, 255, 255, 1);
margin-top: 30rpx;
box-shadow: 0rpx 2rpx 6rpx 0rpx rgba(206, 206, 206, 0.4);
}
.content-box {
display: flex;
flex-direction: column;
padding: 20rpx;
border-bottom-left-radius: 10rpx;
border-bottom-right-radius: 10rpx;
background-color: rgba(255, 255, 255, 1);
box-shadow: 0rpx 2rpx 6rpx 0rpx rgba(206, 206, 206, 0.4);
}
.container-title {
display: flex;
flex-direction: column;
height: 80px;
}
.title-func {
display: flex;
flex-direction: row;
}
.create-btn {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
flex: 2.5;
background-color: #FFE5BC;
color: #550101;
border-radius: 10rpx;
text-align: center;
}
.create-btn:active {
background-color: #ffe5bc79;
}
.buy-btn {
margin-left: 20rpx;
line-height: 78px;
width: 80px;
height: 78px;
border-radius: 4px;
background-color: rgba(78, 175, 121, 1);
color: rgba(255, 255, 255, 1);
font-size: 18px;
text-align: center;
font-family: PingFangSC-regular;
}
.buy-btn:active {
background-color: rgba(78, 175, 121, .3);
}
.notice-box {
background-color: #FFE5BC;
margin-top: 20rpx;
border-radius: 3px;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
padding: 5px 10px;
}
.notice-box .icon {
width: 20px;
height: 20px;
}
.notice-box .txt {
height: 20px;
line-height: 17px;
color: rgba(85, 0, 0, 1);
font-size: 12px;
text-align: left;
line-height: 20px;
font-family: PingFangSC-light;
margin-left: 15px;
}
.container-box {
display: flex;
flex-direction: column;
margin-top: 20rpx;
}
.list-title-box {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.list-title-txt {
line-height: 23px;
color: rgba(16, 16, 16, 1);
font-size: 16px;
font-family: TaipeiHei-bold;
font-weight: bold;
margin-left: 10rpx;
}
.list-title {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
}
.list-title-line {
width: 10rpx;
background-color: #FE9944;
border-radius: 5rpx;
height: 30rpx;
}
.list-title-btns {
display: flex;
flex-direction: row;
justify-content: space-between;
font-size: 28rpx;
text-align: center;
}
.btn-select {
line-height: 20px;
background-color: rgba(244, 206, 152, 0.18);
color: rgba(233, 157, 66, 1);
font-size: 14px;
text-align: center;
padding: 5px;
border: 1px solid rgba(244, 206, 152, 0.18);
}
.btn-normal {
line-height: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
font-size: 14px;
text-align: center;
border: 1px solid rgba(248, 248, 248, 1);
padding: 5px;
}
.list-tabs {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
width: 100vw;
}
.tab-select {
white-space: nowrap;
line-height: 17px;
border-radius: 2px;
background-color: rgba(255, 226, 168, 0.57);
color: rgba(93, 57, 0, 1);
font-size: 12px;
text-align: center;
padding: 2px 5px;
}
.tab-normal {
line-height: 17px;
border-radius: 2px;
background-color: rgba(248, 248, 248, 1);
color: rgba(154, 154, 154, 1);
font-size: 12px;
text-align: center;
white-space: nowrap;
padding: 2px 5px;
}
.item-margin {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.item-margin:nth-of-type(n+2) {
margin-left: 20rpx;
}
/* list */
.list-content {
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.list-item {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
background-color: #F7F7F7;
border-radius: 2px;
padding: 5px;
}
.list-item:nth-of-type(n+2) {
margin-top: 20rpx;
}
.item-img {
display: flex;
flex-direction: column;
justify-content: center;
position: relative;
}
.item-img .cover {
width: 200rpx;
height: 132rpx;
border-radius: 2px;
}
.item-img-status {
background-color: #AFE5C7;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
width: 200rpx;
font-size: 24rpx;
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
.item-content {
display: flex;
flex-direction: column;
justify-content: space-between;
flex: 1;
height: 72px;
padding-left: 16px;
}
.item-content-title {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.project-name {
color: rgba(16, 16, 16, 1);
font-size: 14px;
text-align: left;
font-weight: bold;
flex: 1;
}
.project-status {
font-size: 12px;
color: rgba(16, 16, 16, 1);
font-weight: 400;
flex: .3;
text-align: right;
}
.item-content-title {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.project-aff {
color: #4f4f4f;
margin-top: 2px;
font-size: 13px;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.project-aff .icon {
width: 14px;
height: 14px;
}
.project-aff .txt {
text-align: left;
margin-left: 3px;
}
.project-btns {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: flex-end;
}
.project-create-time {
font-size: 26rpx;
color: #4f4f4f;
}
.project-btn {
font-size: 20rpx;
background-color: #FE9944;
color: white;
padding: 2rpx 15rpx;
border-radius: 3rpx;
}
.project-btn:active {
background-color: #fe9844d5;
}
.project-re-btn {
font-size: 12px;
background-color: rgba(255, 0, 0, 0.486);
color: white;
padding: 2px 5px;
border-radius: 5px;
}
.project-re-btn:active {
background-color: rgba(255, 0, 0, 0.301);
}
.project-btn-no {
font-size: 28rpx;
background-color: rgba(239, 239, 239, 1);
color: white;
padding: 8rpx 30rpx 8rpx 30rpx;
border-radius: 10rpx;
}
.marquee-container {
width: 100%;
overflow: hidden;
white-space: nowrap;
margin-left: 5px;
}
.marquee-text {
display: inline-block;
animation: marquee 9s linear infinite;
color: rgba(85, 0, 0, 1);
font-size: 14px;
margin-left: 15px;
}
@keyframes marquee {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-100%);
}
}
.custom-dialog {
background-color: #F1F1F1;
}
.download-item {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
padding: 10px;
background-color: white;
border-radius: 5px;
height: 80px;
}
.download-item:nth-of-type(n+2) {
margin-top: 10px;
}
.download-item:last-child {
margin-bottom: 80px;
}
.download-title {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 10px;
width: 75px;
}
.download-title-txt {
font-size: 16px;
font-weight: bold;
margin-top: 10px;
}
.download-btn-box {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
height: 70px;
flex: .6;
}
.download-btn {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
color: black;
padding: 5px 10px;
border-radius: 5px;
border: 1px solid #CECECE;
width: 105px;
}
.download-btn-txt {
font-size: 12px;
text-align: center;
}
.download-btn:active {
background-color: #d1d1d0;
}
.icon-table {
content: "";
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzIgMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgc3R5bGU9IiIgZmlsdGVyPSJub25lIj4KICAgIAogICAgPGc+CiAgICA8cGF0aCBkPSJNMTYgMjFoLTR2Mmg0di0yek0xNyAyMWg0djJoLTR2LTJ6TTE2IDI2aC00di0yaDR2MnpNMTcgMjZoNHYtMmgtNHYyek0xNiAxOGgtNHYyaDR2LTJ6TTE3IDE4aDR2MmgtNHYtMnpNMTYgMTVoLTR2Mmg0di0yek0xNyAxNWg0djJoLTR2LTJ6TTE5IDN2Ni4wMDJjMCAxLjExMSAwLjg5OCAxLjk5OCAyLjAwNiAxLjk5OGg0Ljk5NHYxNy4wMDNjMCAxLjEwNy0wLjg5NCAxLjk5Ny0xLjk5NyAxLjk5N2gtMTUuMDA1Yy0xLjEwNyAwLTEuOTk3LTAuODk5LTEuOTk3LTIuMDA3di0yMi45ODVjMC0xLjEwOSAwLjg5OS0yLjAwNyAyLjAwOS0yLjAwN2g5Ljk5MXpNMjAgM3Y1Ljk5N2MwIDAuNTU0IDAuNDUxIDEuMDAzIDAuOTkxIDEuMDAzaDUuMDA5bC02LTd6TTExIDEzdjE0aDExdi0xNGgtMTF6IiBmaWxsPSJyZ2JhKDI1NSwxNjksMCwxKSI+PC9wYXRoPgogICAgPC9nPgogIDwvc3ZnPg==');
background-size: cover;
background-repeat: no-repeat;
width: 48px;
height: 48px;
}
.icon-tool {
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSI2NCA2NCA4OTYgODk2IiB3aWR0aD0iNTIiIGhlaWdodD0iNTIiIHN0eWxlPSIiIGZpbHRlcj0ibm9uZSI+CiAgICAKICAgIDxnPgogICAgPHBhdGggZD0iTTg4MCAxMTJIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY3MzZjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjE0NGMwLTE3LjctMTQuMy0zMi0zMi0zMnpNNTEzLjEgNTE4LjFsLTE5MiAxNjFjLTUuMiA0LjQtMTMuMS43LTEzLjEtNi4xdi02Mi43YzAtMi4zIDEuMS00LjYgMi45LTYuMUw0MjAuNyA1MTJsLTEwOS44LTkyLjJhNy42MyA3LjYzIDAgMCAxLTIuOS02LjFWMzUxYzAtNi44IDcuOS0xMC41IDEzLjEtNi4xbDE5MiAxNjAuOWMzLjkgMy4yIDMuOSA5LjEgMCAxMi4zek03MTYgNjczYzAgNC40LTMuNCA4LTcuNSA4aC0xODVjLTQuMSAwLTcuNS0zLjYtNy41LTh2LTQ4YzAtNC40IDMuNC04IDcuNS04aDE4NWM0LjEgMCA3LjUgMy42IDcuNSA4djQ4eiIgZmlsbD0icmdiYSg1MiwxMjQsMTc1LDEpIj48L3BhdGg+CiAgICA8L2c+CiAgPC9zdmc+');
background-size: cover;
background-repeat: no-repeat;
width: 42px;
height: 42px;
}
.icon-source {
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSI2NCA2NCA4OTYgODk2IiB3aWR0aD0iNTIiIGhlaWdodD0iNTIiIHN0eWxlPSIiIGZpbHRlcj0ibm9uZSI+CiAgICAKICAgIDxnPgogICAgPHBhdGggZD0iTTkyOCAxNjFINjk5LjJjLTQ5LjEgMC05Ny4xIDE0LjEtMTM4LjQgNDAuN0w1MTIgMjMzbC00OC44LTMxLjNBMjU1LjIgMjU1LjIgMCAwIDAgMzI0LjggMTYxSDk2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY1NjhjMCAxNy43IDE0LjMgMzIgMzIgMzJoMjI4LjhjNDkuMSAwIDk3LjEgMTQuMSAxMzguNCA0MC43bDQ0LjQgMjguNmMxLjMuOCAyLjggMS4zIDQuMyAxLjNzMy0uNCA0LjMtMS4zbDQ0LjQtMjguNkM2MDIgODA3LjEgNjUwLjEgNzkzIDY5OS4yIDc5M0g5MjhjMTcuNyAwIDMyLTE0LjMgMzItMzJWMTkzYzAtMTcuNy0xNC4zLTMyLTMyLTMyek00MDQgNTUzLjVjMCA0LjEtMy4yIDcuNS03LjEgNy41SDIxMS4xYy0zLjkgMC03LjEtMy40LTcuMS03LjV2LTQ1YzAtNC4xIDMuMi03LjUgNy4xLTcuNWgxODUuN2MzLjkgMCA3LjEgMy40IDcuMSA3LjV2NDV6bTAtMTQwYzAgNC4xLTMuMiA3LjUtNy4xIDcuNUgyMTEuMWMtMy45IDAtNy4xLTMuNC03LjEtNy41di00NWMwLTQuMSAzLjItNy41IDcuMS03LjVoMTg1LjdjMy45IDAgNy4xIDMuNCA3LjEgNy41djQ1em00MTYgMTQwYzAgNC4xLTMuMiA3LjUtNy4xIDcuNUg2MjcuMWMtMy45IDAtNy4xLTMuNC03LjEtNy41di00NWMwLTQuMSAzLjItNy41IDcuMS03LjVoMTg1LjdjMy45IDAgNy4xIDMuNCA3LjEgNy41djQ1em0wLTE0MGMwIDQuMS0zLjIgNy41LTcuMSA3LjVINjI3LjFjLTMuOSAwLTcuMS0zLjQtNy4xLTcuNXYtNDVjMC00LjEgMy4yLTcuNSA3LjEtNy41aDE4NS43YzMuOSAwIDcuMSAzLjQgNy4xIDcuNXY0NXoiIGZpbGw9InJnYmEoMTI5LDE3OSw1NSwxKSI+PC9wYXRoPgogICAgPC9nPgogIDwvc3ZnPg==');
background-size: cover;
background-repeat: no-repeat;
width: 42px;
height: 42px;
}
.download-all {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
width: 100vw;
background-color: #fe9844c9;
color: white;
padding: 5px 0px;
border-radius: 5px;
}
.download-all:active {
background-color: #fe9844;
}
.download-desc {
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
width: 100vw;
}
.link-title {
font-size: 14px;
font-weight: bold;
}
.link {
margin-top: 5px;
word-wrap: break-word;
word-break: break-all;
width: 85vw;
font-size: 14px;
color: rgba(114, 197, 245, 0.692);
}
.custom-tips {
margin-top: 80px;
}
.hint {
font-size: 14px;
text-align: center;
color: rgb(248, 185, 50);
font-weight: bold;
}
.weui-half-screen-dialog__ft {
height: 0;
padding: 0;
}
</style>