mirror of
https://github.com/shuguangnet/uniapp.git
synced 2025-01-23 16:08:44 +08:00
557 lines
14 KiB
Vue
557 lines
14 KiB
Vue
|
<template>
|
|||
|
<view class="preview" v-if="currentInfo">
|
|||
|
<swiper circular :current="currentid" @change="swiperChange">
|
|||
|
<swiper-item v-for="(item,index) in classList" :key="item._id">
|
|||
|
<image @click="maskChange" :src="item.picurl" mode="aspectFill"></image>
|
|||
|
</swiper-item>
|
|||
|
</swiper>
|
|||
|
|
|||
|
<view class="mask" v-if="maskState">
|
|||
|
<view class="goBack" @click="goBack"
|
|||
|
:style="{top:getStatusBarHeight()+'px'}">
|
|||
|
<uni-icons type="back" color="#fff" size="20"></uni-icons>
|
|||
|
</view>
|
|||
|
<view class="count">{{currentid+1}} / {{classList.length}}</view>
|
|||
|
<view class="time">
|
|||
|
<uni-dateformat :date="new Date()" format="hh:mm"></uni-dateformat>
|
|||
|
</view>
|
|||
|
<view class="date">
|
|||
|
<uni-dateformat :date="new Date()" format="MM月dd日"></uni-dateformat>
|
|||
|
</view>
|
|||
|
<view class="footer" v-if="currentInfo">
|
|||
|
<view class="box" @click="clickInfo">
|
|||
|
<uni-icons type="info" size="28"></uni-icons>
|
|||
|
<view class="text">信息</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="box" @click="clickScore">
|
|||
|
<uni-icons type="star" size="28"></uni-icons>
|
|||
|
<view class="text">{{currentInfo.score}}</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="box" @click="clickDownload">
|
|||
|
<uni-icons type="download" size="23"></uni-icons>
|
|||
|
<view class="text">下载</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<uni-popup ref="infoPopup" type="bottom">
|
|||
|
<view class="infoPopup">
|
|||
|
<view class="popHeader">
|
|||
|
<view></view>
|
|||
|
<view class="title">壁纸信息</view>
|
|||
|
<view class="close" @click="clickInfoClose">
|
|||
|
<uni-icons type="closeempty" size="18" color="#999"></uni-icons>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<scroll-view scroll-y>
|
|||
|
<view class="content" v-if="currentInfo">
|
|||
|
<view class="row">
|
|||
|
<view class="label">壁纸ID:</view>
|
|||
|
<text selectable class="value">{{currentInfo._id}}</text>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="row">
|
|||
|
<view class="label">分类:</view>
|
|||
|
<text class="value class">明星美女</text>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="row">
|
|||
|
<view class="label">发布者:</view>
|
|||
|
<text class="value">{{currentInfo.nickname}}</text>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="row">
|
|||
|
<text class="label">评分:</text>
|
|||
|
<view class='value roteBox'>
|
|||
|
<uni-rate readonly touchable :value="currentInfo.score" size="16"/>
|
|||
|
<text class="score">{{currentInfo.score}}分</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="row">
|
|||
|
<text class="label">摘要:</text>
|
|||
|
<view class='value'>
|
|||
|
{{currentInfo.description}}
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="row">
|
|||
|
<text class="label">标签:</text>
|
|||
|
<view class='value tabs'>
|
|||
|
<view class="tab" v-for="item in currentInfo.tabs">{{item}}</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="copyright">声明:本图片来用户投稿,非商业使用,用于免费学习交流,如侵犯了您的权益,您可以拷贝壁纸ID举报至平台,邮箱513894357@qq.com,管理将删除侵权壁纸,维护您的权益。
|
|||
|
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</scroll-view>
|
|||
|
</view>
|
|||
|
</uni-popup>
|
|||
|
|
|||
|
|
|||
|
<uni-popup ref="scorePopup" :is-mask-click="false">
|
|||
|
<view class="scorePopup">
|
|||
|
<view class="popHeader">
|
|||
|
<view></view>
|
|||
|
<view class="title">{{isScore?"已经评分过了":"壁纸评分"}}</view>
|
|||
|
<view class="close" @click="clickScoreClose">
|
|||
|
<uni-icons type="closeempty" size="18" color="#999"></uni-icons>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="content">
|
|||
|
<uni-rate v-model="userScore" allowHalf :disabled="isScore"/>
|
|||
|
<text class="text">{{userScore}}分</text>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="footer">
|
|||
|
<button @click="submitScore" :disabled="!userScore ||isScore" type="default" size="mini" plain >确认评分</button>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</uni-popup>
|
|||
|
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script setup>
|
|||
|
import { ref } from 'vue';
|
|||
|
import {getStatusBarHeight} from "@/utils/system.js"
|
|||
|
import {onLoad,onShareAppMessage,onShareTimeline} from '@dcloudio/uni-app'
|
|||
|
import {apiScore,apiDownloadWall,apiDetailWall} from '@/api/apis.js'
|
|||
|
const maskState =ref(true);
|
|||
|
const infoPopup = ref(null);
|
|||
|
const scorePopup = ref(null);
|
|||
|
const userScore =ref(0)
|
|||
|
let classList=ref()
|
|||
|
const currentid=ref(0)
|
|||
|
const currentclassId=ref(null)
|
|||
|
const currentInfo=ref()
|
|||
|
// 是否评分
|
|||
|
const isScore=ref(false)
|
|||
|
|
|||
|
// 获取索引
|
|||
|
onLoad(async (e)=>{
|
|||
|
let {id}=e
|
|||
|
currentclassId.value=e.id
|
|||
|
let index=classList.value.findIndex(item=>item._id==id)
|
|||
|
if(e.type=='share'){
|
|||
|
// 如果方式为分享,则在数据中查询单张壁纸
|
|||
|
let res=await apiDetailWall({id:id})
|
|||
|
classList.value=res.data.map(item=>{
|
|||
|
return {
|
|||
|
...item,
|
|||
|
picurl:item.smallPicurl.replace("_small.webp",".jpg")
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
currentid.value=index
|
|||
|
currentInfo.value=classList.value[currentid.value]
|
|||
|
|
|||
|
})
|
|||
|
const swiperChange=(e)=>{
|
|||
|
currentid.value=e.detail.current
|
|||
|
currentInfo.value=classList.value[currentid.value]
|
|||
|
}
|
|||
|
// 获取缓存
|
|||
|
let storageClasslist=uni.getStorageSync("storageClasslist")||[]
|
|||
|
classList.value=storageClasslist.map(item=>{
|
|||
|
return {
|
|||
|
...item,
|
|||
|
picurl:item.smallPicurl.replace("_small.webp",".jpg")
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
console.log(classList.value)
|
|||
|
//点击info弹窗
|
|||
|
const clickInfo = ()=>{
|
|||
|
infoPopup.value.open();
|
|||
|
}
|
|||
|
|
|||
|
//点击关闭信息弹窗
|
|||
|
const clickInfoClose = ()=>{
|
|||
|
infoPopup.value.close();
|
|||
|
}
|
|||
|
|
|||
|
//评分弹窗
|
|||
|
const clickScore=()=>{
|
|||
|
if(currentInfo.value.userScore){
|
|||
|
isScore.value=true
|
|||
|
userScore.value=currentInfo.value.userScore
|
|||
|
}
|
|||
|
scorePopup.value.open();
|
|||
|
}
|
|||
|
//关闭评分框
|
|||
|
const clickScoreClose=()=>{
|
|||
|
scorePopup.value.close();
|
|||
|
isScore.value=false
|
|||
|
}
|
|||
|
|
|||
|
//确认评分
|
|||
|
const submitScore=async ()=>{
|
|||
|
uni.showLoading({
|
|||
|
title:"加载中..."
|
|||
|
})
|
|||
|
console.log(userScore);
|
|||
|
let res=await apiScore({
|
|||
|
classid:currentInfo.value.classid,
|
|||
|
wallId:currentInfo.value._id,
|
|||
|
userScore:userScore.value
|
|||
|
})
|
|||
|
uni.hideLoading()
|
|||
|
if(res.errCode===0){
|
|||
|
uni.showToast({
|
|||
|
title:"打分成功!",
|
|||
|
icon:'none'
|
|||
|
})
|
|||
|
// 追加数据
|
|||
|
classList.value[currentid.value].userScore = userScore.value;
|
|||
|
// 更新缓存
|
|||
|
uni.setStorageSync('storageClasslist','classList.value')
|
|||
|
// 重置分数
|
|||
|
userScore.value=0
|
|||
|
// 关闭弹窗
|
|||
|
clickScoreClose()
|
|||
|
}
|
|||
|
}
|
|||
|
// 下载
|
|||
|
// 点击下载
|
|||
|
const clickDownload = async () => {
|
|||
|
|
|||
|
// #ifdef H5
|
|||
|
// 如果当前运行在 H5 平台上(即浏览器环境)
|
|||
|
uni.showModal({
|
|||
|
content: "请长按保存壁纸", // 提示用户长按以保存图片
|
|||
|
showCancel: false // 只显示确定按钮,不显示取消按钮
|
|||
|
})
|
|||
|
// #endif
|
|||
|
|
|||
|
// #ifndef H5
|
|||
|
// 如果当前运行在非 H5 平台上(即移动端,如微信小程序、App等)
|
|||
|
try {
|
|||
|
// 显示加载框,提示用户正在下载
|
|||
|
uni.showLoading({
|
|||
|
title: "下载中...", // 提示文字
|
|||
|
mask: true // 开启遮罩层,防止用户点击其他操作
|
|||
|
})
|
|||
|
|
|||
|
// 从 currentInfo 中获取 classid 和 wallId
|
|||
|
let {
|
|||
|
classid,
|
|||
|
_id: wallId
|
|||
|
} = currentInfo.value;
|
|||
|
|
|||
|
// 调用 apiDownloadWall 接口,通知服务器进行下载操作
|
|||
|
let res = await apiDownloadWall({
|
|||
|
classid,
|
|||
|
wallId
|
|||
|
})
|
|||
|
|
|||
|
// 如果接口返回错误,抛出异常
|
|||
|
if (res.errCode != 0) throw res;
|
|||
|
|
|||
|
// 获取图片信息
|
|||
|
uni.getImageInfo({
|
|||
|
src: currentInfo.value.picurl, // 图片的URL
|
|||
|
success: (res) => {
|
|||
|
// 保存图片到相册
|
|||
|
uni.saveImageToPhotosAlbum({
|
|||
|
filePath: res.path, // 图片的本地路径
|
|||
|
success: (res) => {
|
|||
|
// 保存成功,提示用户
|
|||
|
uni.showToast({
|
|||
|
title: "保存成功,请到相册查看", // 提示文字
|
|||
|
icon: "none" // 不显示图标
|
|||
|
})
|
|||
|
},
|
|||
|
fail: err => {
|
|||
|
// 如果保存失败
|
|||
|
if (err.errMsg == 'saveImageToPhotosAlbum:fail cancel') {
|
|||
|
// 如果是用户取消了保存
|
|||
|
uni.showToast({
|
|||
|
title: '保存失败,请重新点击下载', // 提示重新下载
|
|||
|
icon: "none" // 不显示图标
|
|||
|
})
|
|||
|
return;
|
|||
|
}
|
|||
|
// 如果失败是由于没有权限,提示用户授权
|
|||
|
uni.showModal({
|
|||
|
title: "授权提示",
|
|||
|
content: "需要授权保存相册", // 提示需要授权
|
|||
|
success: res => {
|
|||
|
if (res.confirm) { // 如果用户点击确定
|
|||
|
uni.openSetting({
|
|||
|
success: (setting) => {
|
|||
|
// 打开设置界面,获取授权结果
|
|||
|
console.log(setting);
|
|||
|
if (setting.authSetting['scope.writePhotosAlbum']) {
|
|||
|
// 如果用户授权了
|
|||
|
uni.showToast({
|
|||
|
title: "获取授权成功", // 提示授权成功
|
|||
|
icon: "none" // 不显示图标
|
|||
|
})
|
|||
|
} else {
|
|||
|
// 用户拒绝授权
|
|||
|
uni.showToast({
|
|||
|
title: "获取权限失败", // 提示授权失败
|
|||
|
icon: "none" // 不显示图标
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
},
|
|||
|
complete: () => {
|
|||
|
// 隐藏加载框
|
|||
|
uni.hideLoading();
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
} catch (err) {
|
|||
|
// 捕获到错误时,打印错误信息
|
|||
|
console.log(err);
|
|||
|
uni.hideLoading(); // 隐藏加载框
|
|||
|
}
|
|||
|
// #endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//遮罩层状态
|
|||
|
const maskChange = ()=>{
|
|||
|
maskState.value = !maskState.value
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//返回上一页
|
|||
|
const goBack= ()=>{
|
|||
|
uni.navigateBack({
|
|||
|
success() {
|
|||
|
|
|||
|
},
|
|||
|
fail() {
|
|||
|
uni.reLaunch({
|
|||
|
url:'/pages/index/index'
|
|||
|
})
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// 分享好友
|
|||
|
onShareAppMessage((e)=>{
|
|||
|
console.log(1111)
|
|||
|
console.log(e)
|
|||
|
return{
|
|||
|
title:"壁纸",
|
|||
|
path:'/pages/preview/preview?id='+ currentclassId.value+"&type=share"
|
|||
|
}
|
|||
|
})
|
|||
|
// 分享朋友圈
|
|||
|
onShareTimeline((e)=>{
|
|||
|
console.log(111)
|
|||
|
return{
|
|||
|
title:"壁纸",
|
|||
|
// imageUrl:""
|
|||
|
query:"id="+ currentclassId.value +"&type=share"
|
|||
|
}
|
|||
|
})
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
.preview{
|
|||
|
width: 100%;
|
|||
|
height: 100vh;
|
|||
|
position: relative;
|
|||
|
swiper{
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
image{
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
}
|
|||
|
}
|
|||
|
.mask{
|
|||
|
&>view{
|
|||
|
position: absolute;
|
|||
|
left:0;
|
|||
|
margin:auto;
|
|||
|
color:#fff;
|
|||
|
right:0;
|
|||
|
width: fit-content;
|
|||
|
}
|
|||
|
|
|||
|
.goBack{
|
|||
|
width: 38px;
|
|||
|
height: 38px;
|
|||
|
background: rgba(0, 0, 0, 0.5);
|
|||
|
left: 30rpx;
|
|||
|
margin-left: 0;
|
|||
|
border-radius: 100px;
|
|||
|
top: 0;
|
|||
|
backdrop-filter: blur(10rpx);
|
|||
|
border:1rpx solid rgba(255,255,255,0.3);
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
}
|
|||
|
.count{
|
|||
|
top:10vh;
|
|||
|
background: rgba(0,0,0,0.3);
|
|||
|
font-size: 28rpx;
|
|||
|
border-radius: 40rpx;
|
|||
|
padding:8rpx 28rpx;
|
|||
|
backdrop-filter: blur(10rpx);
|
|||
|
}
|
|||
|
.time{
|
|||
|
font-size: 140rpx;
|
|||
|
top:calc(10vh + 80rpx);
|
|||
|
font-weight: 100;
|
|||
|
line-height: 1em;
|
|||
|
text-shadow: 0 4rpx rgba(0, 0, 0, 0.3);
|
|||
|
}
|
|||
|
.date{
|
|||
|
font-size: 34rpx;
|
|||
|
top: calc(10vh + 230rpx);
|
|||
|
text-shadow: 0 2rpx rgba(0, 0, 0, 0.3);
|
|||
|
}
|
|||
|
.footer{
|
|||
|
background: rgba(255,255,255,0.8);
|
|||
|
bottom:10vh;
|
|||
|
width: 65vw;
|
|||
|
height: 120rpx;
|
|||
|
border-radius: 120rpx;
|
|||
|
color:#000;
|
|||
|
display: flex;
|
|||
|
justify-content: space-around;
|
|||
|
align-items: center;
|
|||
|
box-shadow: 0 2rpx 0 rgba(0, 0, 0, 0.1);
|
|||
|
backdrop-filter: blur(20rpx);
|
|||
|
.box{
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
padding:2rpx 12rpx;
|
|||
|
.text{
|
|||
|
font-size: 26rpx;
|
|||
|
color:$text-font-color-2;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.popHeader{
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
align-items: center;
|
|||
|
.title{
|
|||
|
color:$text-font-color-2;
|
|||
|
font-size: 26rpx;
|
|||
|
}
|
|||
|
.close{
|
|||
|
padding:6rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
.infoPopup{
|
|||
|
background: #fff;
|
|||
|
padding:30rpx;
|
|||
|
border-radius: 30rpx 30rpx 0 0;
|
|||
|
overflow: hidden;
|
|||
|
scroll-view{
|
|||
|
max-height: 60vh;
|
|||
|
.content{
|
|||
|
.row{
|
|||
|
display: flex;
|
|||
|
padding:16rpx 0;
|
|||
|
font-size: 32rpx;
|
|||
|
line-height: 1.7em;
|
|||
|
.label{
|
|||
|
color:$text-font-color-3;
|
|||
|
width: 140rpx;
|
|||
|
text-align: right;
|
|||
|
font-size: 30rpx;
|
|||
|
}
|
|||
|
.value{
|
|||
|
flex:1;
|
|||
|
width:0;
|
|||
|
}
|
|||
|
.roteBox{
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
.score{
|
|||
|
font-size: 26rpx;
|
|||
|
color:$text-font-color-2;
|
|||
|
padding-left:10rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
.tabs{
|
|||
|
display: flex;
|
|||
|
flex-wrap: wrap;
|
|||
|
.tab{
|
|||
|
border: 1px solid $brand-theme-color;
|
|||
|
color: $brand-theme-color;
|
|||
|
font-size: 22rpx;
|
|||
|
padding: 10rpx 30rpx;
|
|||
|
border-radius: 40rpx;
|
|||
|
line-height: 1em;
|
|||
|
margin: 0 10rpx 10rpx 0;
|
|||
|
}
|
|||
|
}
|
|||
|
.class{
|
|||
|
color:$brand-theme-color;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
.copyright {
|
|||
|
font-size: 28rpx;
|
|||
|
padding: 20rpx;
|
|||
|
background: #F6F6F6;
|
|||
|
color: #666;
|
|||
|
border-radius: 10rpx;
|
|||
|
margin: 20rpx 0;
|
|||
|
line-height: 1.6em;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.scorePopup{
|
|||
|
background: #fff;
|
|||
|
padding:30rpx;
|
|||
|
width: 70vw;
|
|||
|
border-radius: 30rpx;
|
|||
|
.content{
|
|||
|
padding:30rpx 0;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
.text{
|
|||
|
color: #FFCA3E;
|
|||
|
padding-left: 10rpx;
|
|||
|
width: 80rpx;
|
|||
|
line-height: 1em;
|
|||
|
text-align: right;
|
|||
|
}
|
|||
|
}
|
|||
|
.footer{
|
|||
|
padding:10rpx 0;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
</style>
|