main
scout 5 months ago
commit e0efddabf3

2
.gitignore vendored

@ -0,0 +1,2 @@
/node_modules
/unpackage

@ -0,0 +1,24 @@
{
// launch.json configurations app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtypelocalremote, localremote
"version" : "0.0",
"configurations" : [
{
"app-plus" : {
"launchtype" : "local"
},
"default" : {
"launchtype" : "local"
},
"type" : "uniCloud"
},
{
"playground" : "custom",
"type" : "uni-app:app-ios"
},
{
"playground" : "standard",
"type" : "uni-app:app-android"
}
]
}

@ -0,0 +1,27 @@
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style lang="scss">
/* 引入的uview-ui的index.scss放第一行引入 */
@import "uview-ui/index.scss";
/*每个页面公共css */
page{
color: #fff;
font-size: 28rpx;
// background: url('@/static/image/home/bg.png') no-repeat;
// background-size: 100% 100%;
// background-attachment:fixed;
// height: 100vh;
}
</style>

@ -0,0 +1,98 @@
/**
* 通用消息框
* @param content string 消息内容
* @param fn function 回调
*
*/
const msgToast = (content,fn,type='none') => {
uni.showToast({
title: content,
duration: 2000,
icon: type,
success: fn ? ()=>{
setTimeout(() => {
fn()
},1500)
} : function() {}
});
}
/* 手机号验证 */
const vefTel = (key) => {
let reg_tel = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/
///^(((13[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(17[3-8]{1})|(18[0-9]{1})|(19[0-9]{1})|(14[5-7]{1}))+\d{8})$/; // 11位手机号
if (key === '' || key === undefined || key === null) {
uni.showToast({
title: '请输入手机号',
duration: 2000,
icon: 'none'
});
return false
} else if (!reg_tel.test(key)) {
uni.showToast({
title: '手机号码格式不正确',
duration: 2000,
icon: 'none'
});
return false
} else {
return true
}
}
/* 非空验证 */
const vefEmpty = (key,msg) => {
if (key === '' || key === undefined || key === null) {
uni.showToast({
title: msg,
duration: 2000,
icon: 'none'
});
return false
} else {
return true
}
}
const logout = () => {
msgToast('登录已过期,请重新登录',()=> {
uni.removeStorageSync('userInfo');
uni.reLaunch({
url: '../login/login'
})
})
}
/**
* @description: H5 App通用方案 解决H5刷新返回失败问题
* @param {*} params
*/
const navigateBack = (params) => {
const pages = getCurrentPages()
if (pages.length === 1) {
if (typeof params === 'number') {
history.go(-params)
} else {
history.back()
}
} else {
uni.navigateBack()
}
}
/**
* @description: 获取url参数
* @param {*} params
*/
const getLocationParams = (name) => {
const pages = getCurrentPages()
const curPage = pages[pages.length-1];
return name? curPage.options[name]:curPage.options;
}
export default {
msgToast,
vefTel,
vefEmpty,
logout,
navigateBack,
getLocationParams
}

@ -0,0 +1,167 @@
<template>
<view>
<view class="status_bar">
<!-- 这里是状态栏 -->
</view>
<view style="height: 110upx">
<u-sticky offset-top="0" v-if="stickyShow">
<u-navbar
:is-back="false"
:title="navTitle"
:bgColor="background"
:titleStyle="titleStyle"
:color="color"
>
<view slot="left">
<text
v-if="isBack"
@click="navigateBack"
class="back"
:style="{ backgroundColor: `${this._props.backBackGroundColor}` }"
>{{ $t("navbar.back") }}</text
>
<text v-else></text>
</view>
</u-navbar>
</u-sticky>
<u-navbar
:is-back="false"
:title="navTitle"
:bgColor="background1"
:titleStyle="titleStyle"
>
<view slot="left">
<text
v-if="isBack"
@click="navigateBack"
class="back"
:style="{ backgroundColor: `${this._props.backBackGroundColor}` }"
>{{ $t("navbar.back") }}</text
>
<text v-else></text>
</view>
<view slot="center" v-if="hasLogo">
<image
style="width: 202upx; height: 60upx"
src="../../static/image/home/fontree.png"
></image>
</view>
<view slot="right" v-if="hasRight" @click="clickRight">
<image
style="width: 80upx; height: 34upx"
src="../../static/image/mine/feedback.png"
></image>
</view>
</u-navbar>
</view>
</view>
</template>
<script>
export default {
name: "navBar",
props: {
isBack: {
type: Boolean,
default: true,
},
navTitle: {
type: String,
required: true,
default: "",
},
stickyShow: {
type: Boolean,
default: false,
},
backToUrl: {
type: String,
default: "",
},
isSwitchTab: {
type: Boolean,
default: false,
},
hasLogo: {
type: Boolean,
default: false,
},
hasRight: {
type: Boolean,
default: false,
},
color: {
type: String,
default: "",
},
backBackGroundColor: {
type: String,
default: "rgba(255, 255, 255)",
},
sfBack: {
type: Boolean,
default: false,
},
},
data() {
return {
background: "rgba(255, 255, 255)",
background1: "transparent",
};
},
computed: {
titleStyle() {
return {
color: this._props.color ?? "#fff",
fontSize: "36upx",
};
},
},
methods: {
navigateBack(params) {
const pages = getCurrentPages();
if (this.sfBack) {
return this.$emit("triggerSfBack");
}
if (this.backToUrl.length > 0) {
if (this.isSwitchTab) {
uni.switchTab({
url: this.backToUrl,
});
} else {
console.log("navigateTo");
uni.navigateTo({
url: this.backToUrl,
});
}
} else {
if (pages.length === 1) {
if (typeof params === "number") {
history.go(-params);
} else {
history.back();
}
} else {
uni.navigateBack();
}
}
},
clickRight() {
this.$emit("clickRight");
},
},
};
</script>
<style lang="scss">
.back {
font-size: 28upx;
color: #ffffff;
padding: 10rpx 32rpx;
border-radius: 40rpx;
}
.status_bar {
height: var(--status-bar-height);
width: 100%;
}
</style>

@ -0,0 +1,288 @@
<template>
<view class="slider-verify-box" v-if="isShow">
<view class="verifyBox">
<view class="slider-title">{{$t('authentication.title')}}</view>
<view class="slide-content">
<!-- <view class="slide-tips">拖动下方滑块完成拼图</view> -->
<view class="slider-pintu">
<u-icon name="reload" size="32" color="#fff" class="reload" @tap="refreshVerify"></u-icon>
<image id="pintuImg" :src="'/static/image/slider-verify/' + img + '.jpg'" class="pintu"></image>
<view class="pintukuai" :style="{ top: top + 'px', left: oldx + 'px' }">
<image :src="'/static/image/slider-verify/' + img + '.jpg'"
:style="{ top: '-' + top + 'px', left: '-' + left + 'px'}"></image>
</view>
<view class="yinying" :style="{ top: top + 'px', left: left + 'px' }"></view>
</view>
<view class="slider-movearea" @touchend="endTouchMove">
<movable-area :animation="true"><movable-view :x="x" direction="horizontal"
@change="startMove"></movable-view></movable-area>
<view class="huadao">{{$t('authentication.content')}}</view>
</view>
</view>
<!-- <view class="slider-btn-group">
<view class="slider-btn" @tap="closeSlider"></view>
<view class="slider-btn slide-btn-refresh" @tap="refreshVerify"></view>
</view> -->
</view>
</view>
</template>
<script>
export default {
name: 'slider-verify',
props: {
isShow: true
},
data() {
return {
x: 0, //
oldx: 0, //
img: '1', //
left: 0, //X
top: 0, //top
};
},
watch: {
//
isShow(newValue, oldValue) {
if (newValue) {
this.refreshVerify(); //
}
}
},
mounted() {
var that = this;
that.refreshVerify();
},
methods: {
//
refreshVerify() {
var gl = Math.random().toFixed(2);
this.left = uni.upx2px(560) * gl > uni.upx2px(280) ? uni.upx2px(280) : uni.upx2px(560) * gl + uni.upx2px(
150); //X
this.top = uni.upx2px(190) * gl; //Y
if (gl <= 0.2) {
this.img = 1;
}
if (gl > 0.2 && gl <= 0.4) {
this.img = 2;
}
if (gl > 0.4 && gl <= 0.6) {
this.img = 3;
}
if (gl > 0.6 && gl <= 0.8) {
this.img = 4;
}
if (gl > 0.8 && gl <= 1) {
this.img = 5;
}
this.resetMove(); //
},
/* 滑动中 */
startMove(e) {
this.oldx = e.detail.x;
},
/* 滑动结束 */
endTouchMove() {
var that = this;
if (Math.abs(that.oldx - that.left) <= 5) {
that.$emit('touchSliderResult', true);
// uni.showToast({
// title: '',
// duration: 2500,
// icon: 'none',
// success() {
//
// }
// });
} else {
that.refreshVerify();
}
},
/* 重置阴影位置 */
resetMove() {
this.x = 1;
this.oldx = 1;
setTimeout(() => {
this.x = 0;
this.oldx = 0;
}, 300);
},
//
closeSlider() {
this.$emit('touchSliderResult', false);
}
}
};
</script>
<style lang="scss">
.slider-verify-box {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 999;
}
.verifyBox {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
// width: 85%;
background-color: #fff;
border-radius: 20upx;
box-shadow: 0 0 5upx rgba(0, 0, 0, 1);
.slider-title {
font-size: 36upx;
text-align: center;
padding: 12rpx 0;
color: #000000;
}
.slide-content {
width: 560rpx;
padding: 0 1em;
margin: 0 auto;
.slide-tips {
font-size: 28rpx;
color: rgba(2, 20, 33, 0.45);
padding: 0.5em 0;
}
.slider-pintu {
position: relative;
width: 100%;
border-radius: 10rpx;
overflow: hidden;
.reload {
position: absolute;
right: 10rpx;
top: 10rpx;
z-index: 101;
}
.pintu {
width: 560rpx;
height: 315rpx;
display: block;
margin: 0 auto;
}
.pintukuai {
position: absolute;
top: 0;
left: 0;
width: 120rpx;
height: 120rpx;
z-index: 100;
box-shadow: 0 0 5upx rgba(0, 0, 0, 0.3);
overflow: hidden;
image {
display: block;
position: absolute;
top: 0;
left: 0;
width: 560rpx;
height: 315rpx;
}
}
}
.yinying {
position: absolute;
width: 120rpx;
height: 120rpx;
background-color: rgba(0, 0, 0, 0.5);
}
}
}
.slider-movearea {
position: relative;
height: 80upx;
width: 100%;
margin: 25upx auto;
movable-area {
height: 80upx;
width: 100%;
movable-view {
width: 80upx;
height: 80upx;
border-radius: 50%;
// @include slider-movearea-bg();
background-color: #37ABEF;
background-image: url(../../static/image/slider-verify/icon-button-normal.png);
background-repeat: no-repeat;
background-size: auto 30upx;
background-position: center;
position: relative;
z-index: 100;
}
}
}
.huadao {
width: 100%;
height: 66upx;
line-height: 66upx;
background: #eee;
box-shadow: inset 0 0 5upx #ccc;
border-radius: 40rpx;
color: #999;
text-align: center;
box-sizing: border-box;
position: absolute;
top: 7rpx;
left: 0;
font-size: 28rpx;
z-index: 99;
}
.slider-btn-group {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid rgba(2, 20, 33, 0.15);
.slider-btn {
flex: 1;
height: 100rpx;
line-height: 100rpx;
text-align: center;
font-size: 36rpx;
color: rgba(2, 20, 33, 0.85);
&:active {
opacity: 0.8;
}
}
.slide-btn-refresh {
color: rgba(14, 107, 176, 1);
border-left: 1px solid rgba(2, 20, 33, 0.15);
}
}
</style>

@ -0,0 +1,102 @@
<template>
<view>
<view class="status_bar">
<!-- 这里是状态栏 -->
</view>
<u-tabbar :value="current" @change="changeTab" :fixed="true" :placeholder="false" :safeAreaInsetBottom="true"
:border="false" activeColor="#FFC748" inactiveColor="#1D1D1D">
<u-tabbar-item v-for="(item,index) in tabBarList" :key="index" :text="item.text">
<image class="u-page__item__slot-icon" slot="inactive-icon" :src="item.iconPath" ></image>
<image class="u-page__item__slot-icon" slot="active-icon" :src="item.selectedIconPath"></image>
</u-tabbar-item>
</u-tabbar>
</view>
</template>
<script>
export default {
name: "tabBar",
props: {
currentPage: String
},
data() {
return {
current: 0,
tabBarList: [{
pagePath: "pages/index/index",
iconPath: "../../static/image/tabbar/new_home.png",
selectedIconPath: "../../static/image/tabbar/new_home_check.png",
text: this.$t('tabbar.home'),
customIcon: false,
},
{
pagePath: "pages/mine/index",
iconPath: "../../static/image/tabbar/new_mine.png",
selectedIconPath: "../../static/image/tabbar/new_mine_check.png",
text: this.$t('tabbar.mine'),
customIcon: false,
}
]
};
},
methods: {
changeTab(e) {
let page = '/' + this.tabBarList[e].pagePath
console.log(page);
uni.switchTab({
url: page,
success: (res) => {
console.log(res);
},
fail: (e) => {
console.log(e);
}
})
}
},
created() {
//tabbar
uni.hideTabBar();
/* this.tabBarList = [{
pagePath: "pages/index/index",
iconPath: "../../static/image/tabbar/home.png",
selectedIconPath: "../../static/image/tabbar/home_check.png",
text: this.$t('tabbar.home'),
customIcon: false,
},{
pagePath: "pages/mine/index",
iconPath: "../../static/image/tabbar/mine.png",
selectedIconPath: "../../static/image/tabbar/mine_check.png",
text: this.$t('tabbar.mine'),
customIcon: false,
}]; */
//
this.tabBarList.forEach((i, index) => {
if (i.pagePath == this.currentPage) {
this.current = index
}
})
},
}
</script>
<style lang="scss" scoped>
.status_bar {
height: var(--status-bar-height);
width: 100%;
}
.u-page__item__slot-icon {
width: 76rpx;
height: 76rpx;
}
.u-tabbar /deep/ .u-tabbar--fixed {
width: 100%;
height: 88rpx;
padding: 20px 0;
background: #FFFFFF;
}
</style>

@ -0,0 +1,103 @@
<template>
<view>
<u-transition :show="show" mode="fade-down">
<view>
<image src="@/static/image/home/line.png" mode="" class="line"></image>
<image src="@/static/image/home/flower.png" mode="" class="flower"></image>
</view>
<view class="text">正在跳转至首页</view>
</u-transition>
<u-transition :show="showTxt" mode="fade-down">
<view class="title-one">- - -验证成功欢迎来到- - -</view>
<image class="img" src="@/static/image/home/fonchain.png"></image>
<image class="logo" src="@/static/image/home/logo.png"></image>
</u-transition>
</view>
</template>
<script>
export default {
data() {
return {
show: false,
showTxt:false
};
},
onShow() {
setTimeout(() => {
this.show = true;
}, 400);
setTimeout(() => {
this.showTxt = true;
}, 500);
setTimeout(() => {
uni.switchTab({
url: '/pages/index/index'
})
}, 2000);
},
methods: {
}
};
</script>
<style lang="scss">
page {
background: url('@/static/image/home/welcomeBg.png') no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
// border: 1px solid red;
}
.line {
width: 2rpx;
height: 164rpx;
position: absolute;
left: 50%;
top: 0;
transform: translateX(-50%);
}
.flower {
width: 43rpx;
height: 43rpx;
position: absolute;
left: 47%;
top: 167rpx;
// transform: translateX(-50%);
animation: fadenum 1s infinite;
}
.text {
position: absolute;
left: 37%;
top: 227rpx;
}
.title-one{
color: #558BF2;
position: absolute;
font-size: 33upx;
left: 26%;
top: 600rpx;
}
.img{
width: 500upx;
height: 80upx;
position: absolute;
left: 16%;
top: 650rpx;
}
.logo{
width: 200upx;
height: 55upx;
position: absolute;
left: 36%;
bottom: 20rpx;
}
@keyframes fadenum {
100% {
transform: rotate(360deg);
}
}
</style>

@ -0,0 +1,67 @@
import http from './interface'
// 个人空投列表
export const collectionList = (data) => {
return http.request({
url: '/mall/push/msgList',
method: 'POST',
data
})
}
// 个人领取空投
export const getCollection = (data) => {
return http.request({
url: '/mall/push/getCollection',
method: 'POST',
data
})
}
// 个人具体空投展示
export const collectionSepcific = (data) => {
return http.request({
url: '/mall/push/collectionSepcific',
method: 'POST',
data
})
}
// 个人领取空投2
export const getCollectionStepTwo = (data) => {
return http.request({
url: '/mall/payment/give',
method: 'POST',
data
})
}
// 个人未点击空投和公告数量
export const checkPoint = (data) => {
return http.request({
url: '/mall/push/unreadNum',
method: 'POST',
data
})
}
// 个人阅读公告
export const readMsg = (data) => {
return http.request({
url: '/mall/push/announcementSepcific',
method: 'POST',
data
})
}
// 直接领取
export const directGet = (data) => {
return http.request({
url: '/mall/collections/redirect/receive',
method: 'POST',
data
})
}
export default {
collectionList,
getCollection,
collectionSepcific,
getCollectionStepTwo,
readMsg,
checkPoint,
directGet
}

@ -0,0 +1,13 @@
import http from './interface'
import login from './login'
import mine from './mine'
import series from './series'
import airdrop from './airdrop'
export default {
login,
mine,
series,
airdrop
}

@ -0,0 +1,176 @@
/**
* 通用uni-app网络请求
* 基于 Promise 对象实现更简单的 request 使用方式支持请求和响应拦截
*/
export default {
config: {
baseUrl: "https://shop.szjixun.cn",
// baseUrl: "http://114.218.158.24:9022",
header: {
"Content-Type": "application/json;charset=UTF-8",
// 'Content-Type':'application/x-www-form-urlencoded'
"Accept-Language":
navigator.language === "en"
? "en"
: navigator.language === "zh-Hans"
? "zh-CN"
: navigator.language === "zh-Hant"
? "zh-TW"
: "zh-CN",
},
data: {},
method: "GET",
dataType: "json" /* 如设为json会对返回的数据做一次 JSON.parse */,
responseType: "text",
success () { },
fail () { },
complete () { },
},
interceptor: {
request: null,
response: null,
},
request (options) {
if (!options) {
options = {};
}
options.baseUrl = options.baseUrl || this.config.baseUrl;
options.dataType = options.dataType || this.config.dataType;
options.url = options.baseUrl + options.url;
options.data = options.data || {};
options.method = options.method || this.config.method;
//TODO 加密数据
options.header = options.header || this.config.header;
//TODO 数据签名
let _token = {
Authorization: uni.getStorageSync("mall_token") || "undefined",
};
options.header = Object.assign({}, options.header, _token);
console.log(navigator.language, 2222);
/*
_sign = {'sign': sign(JSON.stringify(options.data))}
options.header = Object.assign({}, options.header, _token,_sign)
*/
return new Promise((resolve, reject) => {
let _config = null;
options.complete = (response) => {
let statusCode = response.statusCode;
response.config = _config;
if (process.env.NODE_ENV === "development") {
if (statusCode === 200) {
// console.log("【" + _config.requestId + "】 结果:" + JSON.stringify(response.data))
}
}
if (this.interceptor.response) {
let newResponse = this.interceptor.response(response);
if (newResponse) {
response = newResponse;
}
}
if (response.data.status === 401) {
uni.navigateTo({
url: "/pages/login/login",
});
}
// 统一的响应日志记录
_reslog(response);
if (statusCode === 200) {
//成功
resolve(response.data);
} else {
reject(response);
}
};
_config = Object.assign({}, this.config, options);
_config.requestId = new Date().getTime();
if (this.interceptor.request) {
this.interceptor.request(_config);
}
// 统一的请求日志记录
_reqlog(_config);
uni.request(_config);
});
},
get (url, data, options) {
if (!options) {
options = {};
}
options.url = url;
options.data = data;
options.method = "GET";
return this.request(options);
},
post (url, data, options, header) {
if (!options) {
options = {};
}
options.url = url;
options.data = data;
options.header = header;
options.method = "POST";
return this.request(options);
},
put (url, data, options) {
if (!options) {
options = {};
}
options.url = url;
options.data = data;
options.method = "PUT";
return this.request(options);
},
delete (url, data, options) {
if (!options) {
options = {};
}
options.url = url;
options.data = data;
options.method = "DELETE";
return this.request(options);
},
};
/**
* 请求接口日志记录
*/
function _reqlog (req) {
if (process.env.NODE_ENV === "development") {
// console.log("【" + req.requestId + "】 地址:" + req.url)
if (req.data) {
// console.log("【" + req.requestId + "】 请求参数:" + JSON.stringify(req.data))
}
}
//TODO 调接口异步写入日志数据库
}
/**
* 响应接口日志记录
*/
function _reslog (res) {
let _statusCode = res.statusCode;
if (process.env.NODE_ENV === "development") {
// console.log("【" + res.config.requestId + "】 地址:" + res.config.url)
if (res.config.data) {
// console.log("【" + res.config.requestId + "】 请求参数:" + JSON.stringify(res.config.data))
}
// console.log("【" + res.config.requestId + "】 响应结果:" + JSON.stringify(res))
}
//TODO 除了接口服务错误外,其他日志调接口异步写入日志数据库
switch (_statusCode) {
case 200:
break;
case 401:
break;
case 404:
break;
default:
break;
}
}

@ -0,0 +1,51 @@
import http from './interface'
// 登录
export const login = (data) => {
return http.request({
url: '/mall/user/login',
method: 'POST',
data
})
}
// 验证码
export const sendCode = (data) => {
return http.request({
url: '/mall/user/login/send',
method: 'POST',
data
})
}
// 再次发送新号码验证码
export const sendNewCode = (data) => {
return http.request({
url: '/mall/user/phone/send/token',
method: 'POST',
data
})
}
// 确认新手机号
export const confirmNew = (data) => {
return http.request({
url: '/mall/user/phone/update',
method: 'POST',
data
})
}
export const getOpenId = (data) => {
return http.request({
url: '/mall/user/openid',
method: 'POST',
data
})
}
export default {
login,
sendCode,
sendNewCode,
confirmNew,
getOpenId
}

@ -0,0 +1,109 @@
import http from './interface'
// 更改信息
export const update = (data) => {
return http.request({
url: '/mall/user/my/update',
method: 'POST',
data
})
}
// 获取信息
export const getInfo = (data) => {
return http.request({
url: '/mall/user/my/info',
method: 'GET',
data
})
}
// 发送老手机号验证码
export const mineCode = (data) => {
return http.request({
url: '/mall/user/send',
method: 'GET',
data
})
}
// 验证老手机号验证码
export const verifyCode = (data) => {
return http.request({
url: '/mall/user/phone/send',
method: 'POST',
data
})
}
// 验证操作密码
export const verifyPwd = (data) => {
return http.request({
url: '/mall/user/my/pwd/check',
method: 'POST',
data
})
}
// 反馈
export const feedBack = (data) => {
return http.request({
url: '/mall/feedback/create',
method: 'POST',
data
})
}
// 我的艺术品列表
export const paymentList= (data) => {
return http.request({
url: '/mall/payment/list',
method: 'POST',
data
})
}
// 艺术品详情
export const paymentDetail= (data) => {
return http.request({
url: '/mall/payment/detail',
method: 'POST',
data
})
}
// 申请快递
export const paymentApproval= (data) => {
return http.request({
url: '/mall/payment/material/approval',
method: 'POST',
data
})
}
// 获取证书
export const certDetail= (data) => {
return http.request({
url: '/mall/cert/detail',
method: 'POST',
data
})
}
export const logout =(data) => {
return http.request({
url:'/mall/user/my/delete',
method:'POST',
data
})
}
export default {
update,
getInfo,
mineCode,
verifyCode,
verifyPwd,
feedBack,
paymentList,
paymentDetail,
paymentApproval,
certDetail,
logout
}

@ -0,0 +1,198 @@
**插件使用说明**
- 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截
- 下载后把 vmeitime-http 文件夹 copy 到项目 common/ 目录下
## 1. 配置
### 1.1 全局配置修改修改vmeitime-http/interface.js中config和interceptor
``` javascript
config: {
baseUrl: "https://api.com/api/",
header: {
'Content-Type':'application/json;charset=UTF-8',
'Content-Type':'application/x-www-form-urlencoded'
},
dataType: "json",
responseType: "text"
},
interceptor: {
request: null,
response: null
}
```
### 1.2 具体接口调用时修改在vmeitime-http/index.js文件中具体业务接口中配置)
``` javascript
//设置baseUrl
http.config.baseUrl = "http://localhost:8080/api/"
//设置请求前拦截器
http.interceptor.request = (config) => {
//添加通用参数
config.header = {
"token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
//设置请求结束后拦截器
http.interceptor.response = (response) => {
//判断返回状态 执行相应操作
return response;
}
```
## 2. 使用
### 2.1 全局使用(在main.js注册)
``` // main.js
import api from '@/common/vmeitime-http/'
// 全局挂载后使用
Vue.prototype.$api = api
```
``` // pages/index/index.vue
<template>
<view class="content">
<view class="uni-padding-wrap uni-common-mt">
<view class="uni-textarea uni-common-mt">
<textarea :value="res"></textarea>
</view>
<view class="uni-btn-v uni-common-mt">
<button type="primary" @click="sendRequest" :loading="loading">发起请求</button>
<button type="default" @click="sendRequest1" :loading="loading">发起请求(async/await)</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
loading: false,
res: ''
}
},
onLoad(option) {
//this.sendRequest();
//this.sendRequest1();
},
methods: {
// 方式一
sendRequest: function() {
this.loading = true
this.$api.test({noncestr: Date.now()}).then((res)=>{
this.loading = false;
console.log('request success', res)
uni.showToast({
title: '请求成功',
icon: 'success',
mask: true
});
this.res = '请求结果 : ' + JSON.stringify(res);
}).catch((err)=>{
this.loading = false;
console.log('request fail', err);
})
},
//方式二 https://segmentfault.com/a/1190000013292562?utm_source=channel-newest
async sendRequest1() {
this.loading = true
let res = await this.$api.test({noncestr: Date.now()});
this.loading = false;
this.res = '请求结果 : ' + JSON.stringify(res);
}
}
}
</script>
```
### 2.2 局部使用(局部使用,不需要在 main.js 中注册)
``` // pages/index/index.vue
<template>
<view class="content">
<view class="uni-padding-wrap uni-common-mt">
<view class="uni-textarea uni-common-mt">
<textarea :value="res"></textarea>
</view>
<view class="uni-btn-v uni-common-mt">
<button type="primary" @click="sendRequest" :loading="loading">发起请求</button>
<button type="default" @click="sendRequest1" :loading="loading">发起请求(async/await)</button>
</view>
</view>
</view>
</template>
<script>
import api from '@/common/vmeitime-http/'
export default {
data() {
return {
loading: false,
res: ''
}
},
onLoad(option) {
//this.sendRequest();
//this.sendRequest1();
},
methods: {
// 方式一
sendRequest: function() {
this.loading = true
api.test({noncestr: Date.now()}).then((res)=>{
this.loading = false;
console.log('request success', res)
uni.showToast({
title: '请求成功',
icon: 'success',
mask: true
});
this.res = '请求结果 : ' + JSON.stringify(res);
}).catch((err)=>{
this.loading = false;
console.log('request fail', err);
})
},
//方式二
async sendRequest1() {
this.loading = true
let res = await this.api.test({noncestr: Date.now()});
this.loading = false;
this.res = '请求结果 : ' + JSON.stringify(res);
}
}
}
</script>
```
## 3. 接口数据加密、接口签名核验
在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码
## 4. 接口请求/响应日志记录
在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码
## 5. 业务相关接口编写
在vmeitime-http/index.js文件中的编写具体业务相关的接口,参考test()方法

@ -0,0 +1,118 @@
import http from "./interface";
// 系列列表
export const list = (data) => {
return http.request({
url: "/mall/series/series-list",
method: "POST",
data,
});
};
// 藏品列表
export const collectionsList = (data) => {
return http.request({
url: "/mall/collections/list",
method: "POST",
data,
});
};
// 藏品详情
export const collectionsInfo = (data) => {
return http.request({
url: "/mall/collections/detail",
method: "POST",
data,
});
};
// 购买
export const buy = (data) => {
return http.request({
url: "/mall/payment/create",
method: "POST",
data,
});
};
// 生成二维码
export const createQrcode = (data) => {
return http.request({
url: "/mall/payment/offline/create",
method: "POST",
data,
});
};
// 获取二维码信息
export const getQrcodeInfo = (data) => {
return http.request({
url: "/mall/payment/info",
method: "POST",
data,
});
};
// 确认支付
export const confirmPay = (data) => {
return http.request({
url: "/mall/payment/seller/sure",
method: "POST",
data,
});
};
// 取消支付
export const cancelPay = (data) => {
return http.request({
url: "/mall/payment/seller/cancel",
method: "POST",
data,
});
};
//判断是否领取该藏品
export const userHaveDropNo = (data) => {
return http.request({
url: "/mall/push/userHaveDropNo",
method: "POST",
data,
});
};
export const collectionsDetail = (data) => {
return http.request({
url: "/mall/collections/receive/info",
method: "POST",
data,
});
};
export const collectionsReceive = (data) => {
return http.request({
url: "/mall/collections/receive",
method: "POST",
data,
});
};
export const collectionsBuy = (data) => {
return http.request({
url: "/mall/collections/wx/buy",
method: "POST",
data,
});
};
export const getSeriesData = (data) => {
return http.request({
url: "/mall/series/series-detail",
method: "POST",
data,
});
};
export default {
list,
collectionsList,
collectionsInfo,
buy,
createQrcode,
getQrcodeInfo,
confirmPay,
cancelPay,
userHaveDropNo,
collectionsDetail,
collectionsReceive,
collectionsBuy,
getSeriesData
};

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>

@ -0,0 +1,190 @@
{
"app.name": "fontree",
"tabbar.home": "Home",
"tabbar.mine": "Mine",
"index.title": "Home",
"locale.auto": "System",
"locale.en": "English",
"locale.zh-hans": "简体中文",
"locale.zh-hant": "繁体中文",
"api-header": "en",
"index.language-change-confirm": "Applying this setting will restart the app",
"navbar.back": "Back",
"login.title": "Login Registration",
"login.input": "Enter your phone number",
"login.agree": "Have read and agreed",
"login.service": "《Service Agreements》",
"login.privacy": "《Privacy Policy》",
"login.registration": "《Registration Protocol》",
"login.btn": "Send Verification Code",
"login.mess": "Please read and tick the agreement",
"authentication.title": "Security Verification",
"authentication.content": "Drag the slider to fill the puzzle",
"sendCode.title": "Enter Verification Code",
"sendCode.send": "Already sent to",
"sendCode.login": "Login",
"sendCode.update": "Update",
"sendCode.loading": "Getting verification code",
"sendCode.toast": "Send after the countdown",
"login.success": "Login successful",
"login.error": "Login failed",
"sendCode.updateSuccess": "Update successfully,please login again",
"sendCode.updateError": "Update failed",
"sendCode": "Verification code has been sent",
"welcome.toHome": "Jumping to Home",
"welcome.title": "Verification success Welcome to",
"collection.info": "Colletion Information",
"collection.buy": "Buy",
"collection.name": "Collection Name",
"collection.type": "Collection Type",
"collection.size": "Collection Size ",
"collection.specs": "Collection Specification",
"collection.address": "Collection Origin",
"collection.intro": "Collection Introduction",
"collection.detail": "Collection Details",
"collection.sell": "Collection Selling Point",
"collection.sellDec": "Collection Details",
"collection.company": "Technology Introduction ",
"collection.copyight": "Copyright Notice",
"collection.blockchain": "Blockchain Description",
"buyVerfy.title": "Real name verification is required to purchase goods",
"buyVerfy.username": "Real Name",
"buyVerfy.idNum": "ID Number",
"buyVerfy.suss": "Authenticates effectively",
"buyVerfy.error": "Invalid authentication",
"buyVerfy.done": "Complete",
"buyVerfy.noGift": "Sell Out",
"buyVerfy.cancel": "Cancel",
"login.pls": "Please login first",
"alipay.payment": "Alipay Payment",
"comfirm.num1": "",
"comfirm.num2": "piece",
"comfirm.total": "Total",
"comfirm.pay": "Confirm Payment",
"comfirm.copy": "Copy order verification code",
"payment.back": "Back to home",
"payment.cancel": "Cancel Payment",
"payment.check": "View Details",
"payment.success": "Payment Successful",
"payment.cancelSuccess": "Payment Cancelled",
"payment.failed": "Payment Failed",
"payInfo.title": "Check order",
"payInfo.subtxt1": "Verifying the user",
"payInfo.subtxt2": "order information",
"payInfo.confirmDate": "verification date",
"payInfo.buyerName": "Buyer Nickname",
"payInfo.artworkName": "product name",
"payInfo.orderPrice": "order amount",
"payInfo.payTypeName": "payment method",
"payInfo.payImages": "payment voucher",
"payInfo.typePrice": "enter payment method",
"payInfo.salesperson": "Please contact the salesperson to verify the consumption information offline",
"payInfo.waitConfirm": "Wait for the salesperson to confirm",
"payInfo.copyCode": "Enter order verification code",
"mine.language": "language",
"mine.message": "news",
"mine.setting": "seting",
"mine.scan": "Scanning code",
"mine.blockchain": "blockchain",
"mine.artwork": "My Collection",
"mine.noData": "No collection",
"mine.updateLang": "Change Language",
"updateLang.done": "Used",
"updateLang.change": "Change",
"password.title": "Unlock more functions with operation password",
"password.set": "set operation password ",
"password.name": "user",
"password.input": "Enter the password",
"password.com": "Confirm the password",
"password.get": "Use the password",
"password.step": "Next",
"password": "Operation Password",
"password.vername": "Information on user",
"password.username": "'s identity being verified",
"comfrim": "Confirm",
"password.inputPass": "Please enter the password",
"password.messError": "Please confirm two passwords are consistent",
"password.setSucc": "Set successfully",
"password.setError": "Set failed",
"password.verSucc": "Validation successful",
"password.verError": "Validation failed",
"avatar.def": "Restore default avatar",
"avatar.update": "Change the avator",
"userInfo.name": "Nickname",
"userInfo.updateName": "Change",
"userInfo.createTime": "Registration Date",
"userInfo.idNum": "ID Number",
"userInfo.phone": "Contact Number",
"phone.update": "Change",
"phone.verInfo": "After certification you can change binding",
"user.realName": "Real Name",
"user.verfy": "Real Name Authentication",
"user.username": "Name",
"user.verDone": "Authenticated",
"user.idNum": "ID card",
"account.logout": "Account Cancellation",
"account.signOut": "Log Out",
"set.name": "Set Nickname",
"set.input": "Please enter content",
"problem.feedback": "Problem Feedback",
"logout.info": "Are you sure you want to cancel the account?",
"logout.btn": "deregister",
"signout.info": "Are you sure to log out?",
"realname.conduct": "Carry On The Certification",
"save.update": "Save Change",
"airdrop": "Airdrop",
"announcement": "Announcement",
"read": "Read",
"to.accept": "Accept",
"close": "Close",
"basic.info": "Basic Information",
"series.name": "Series Name",
"series.issuer": "Issuer",
"series.time": "Transaction Date",
"series.price": "Transaction Price",
"series.hash": "HASH",
"series.No": "Number",
"phone.old": "Original phone number",
"phone.code": "Verification code",
"update.phone.title": "Change of mobile number requires verification of original mobile number",
"phone.new": "New phone number",
"input.phoneCode": "Please fill in the verification code and new phone number",
"apply.logistics": "Apply For Logistics",
"logistics.info": "Logistics Information ",
"telephone": "Enquiries",
"consignee.name": "Consignee Name",
"consignee.address": "Consignee Address",
"consignee.phone": "Contact Number",
"release.info": "Release Information",
"release.time": "Release Date",
"brand.side": "Brand Side",
"circulation.info": "Circulation Information",
"possessor": "Holder",
"collection.status": "Collection Status",
"in.library": "In our warehouse",
"been.applied": "Logistics has been applied",
"circulation.type": "Circulation Type",
"on.line": "On line",
"circulation.time": "Circulation Time",
"transaction.hash": "Transaction Hash",
"apply.tips": "Please consider carefully once the aapplication is irrevocable!",
"input.address": "Please Fill In The Address",
"input.pla": "Please enter",
"apply.btn": "Apply",
"error.consignee.name": "Please enter the name of the consignee",
"error.consignee.phone": "Please enter the phone number ",
"error.consignee.address": "Please enter the consignee address",
"apply.succes": "Successful aapplication",
"apply.error": "Application failed ",
"load.failed": "Load failed",
"update.succes": "Modified Successfully",
"code.actPass": "Please enter the operation password and verification code",
"code.start": "Get the code",
"code.change": "X s to reacquire",
"code.end": "Retrieve",
"error.phone": "The mobile phone number entered is incorrect",
"pick.up": "Pick up",
"letter.you": "A Letter To You",
"letter.all": "A Letter To All Staff"
}

@ -0,0 +1,36 @@
{
"common": {
"uni.app.quit": "再按一次退出应用",
"uni.async.error": "连接服务器超时,点击屏幕重试",
"uni.showActionSheet.cancel": "取消",
"uni.showToast.unpaired": "请注意 showToast 与 hideToast 必须配对使用",
"uni.showLoading.unpaired": "请注意 showLoading 与 hideLoading 必须配对使用",
"uni.showModal.cancel": "取消",
"uni.showModal.confirm": "确定",
"uni.chooseImage.cancel": "取消",
"uni.chooseImage.sourceType.album": "从相册选择",
"uni.chooseImage.sourceType.camera": "拍摄",
"uni.chooseVideo.cancel": "取消",
"uni.chooseVideo.sourceType.album": "从相册选择",
"uni.chooseVideo.sourceType.camera": "拍摄",
"uni.previewImage.cancel": "取消",
"uni.previewImage.button.save": "保存图像",
"uni.previewImage.save.success": "保存图像到相册成功",
"uni.previewImage.save.fail": "保存图像到相册失败",
"uni.setClipboardData.success": "内容已复制",
"uni.scanCode.title": "扫码",
"uni.scanCode.album": "相册",
"uni.scanCode.fail": "识别失败",
"uni.scanCode.flash.on": "轻触照亮",
"uni.scanCode.flash.off": "轻触关闭",
"uni.startSoterAuthentication.authContent": "指纹识别中...",
"uni.picker.done": "完成",
"uni.picker.cancel": "取消",
"uni.video.danmu": "弹幕",
"uni.video.volume": "音量",
"uni.button.feedback.title": "问题反馈",
"uni.button.feedback.send": "发送"
},
"ios": {},
"android": {}
}

@ -0,0 +1,36 @@
{
"common": {
"uni.app.quit": "再按一次退出应用",
"uni.async.error": "连接服务器超时,点击屏幕重试",
"uni.showActionSheet.cancel": "取消",
"uni.showToast.unpaired": "请注意 showToast 与 hideToast 必须配对使用",
"uni.showLoading.unpaired": "请注意 showLoading 与 hideLoading 必须配对使用",
"uni.showModal.cancel": "取消",
"uni.showModal.confirm": "确定",
"uni.chooseImage.cancel": "取消",
"uni.chooseImage.sourceType.album": "从相册选择",
"uni.chooseImage.sourceType.camera": "拍摄",
"uni.chooseVideo.cancel": "取消",
"uni.chooseVideo.sourceType.album": "从相册选择",
"uni.chooseVideo.sourceType.camera": "拍摄",
"uni.previewImage.cancel": "取消",
"uni.previewImage.button.save": "保存图像",
"uni.previewImage.save.success": "保存图像到相册成功",
"uni.previewImage.save.fail": "保存图像到相册失败",
"uni.setClipboardData.success": "内容已复制",
"uni.scanCode.title": "扫码",
"uni.scanCode.album": "相册",
"uni.scanCode.fail": "识别失败",
"uni.scanCode.flash.on": "轻触照亮",
"uni.scanCode.flash.off": "轻触关闭",
"uni.startSoterAuthentication.authContent": "指纹识别中...",
"uni.picker.done": "完成",
"uni.picker.cancel": "取消",
"uni.video.danmu": "弹幕",
"uni.video.volume": "音量",
"uni.button.feedback.title": "问题反馈",
"uni.button.feedback.send": "发送"
},
"ios": {},
"android": {}
}

@ -0,0 +1,36 @@
{
"common": {
"uni.app.quit": "再按一次退出应用",
"uni.async.error": "连接服务器超时,点击屏幕重试",
"uni.showActionSheet.cancel": "取消",
"uni.showToast.unpaired": "请注意 showToast 与 hideToast 必须配对使用",
"uni.showLoading.unpaired": "请注意 showLoading 与 hideLoading 必须配对使用",
"uni.showModal.cancel": "取消",
"uni.showModal.confirm": "确定",
"uni.chooseImage.cancel": "取消",
"uni.chooseImage.sourceType.album": "从相册选择",
"uni.chooseImage.sourceType.camera": "拍摄",
"uni.chooseVideo.cancel": "取消",
"uni.chooseVideo.sourceType.album": "从相册选择",
"uni.chooseVideo.sourceType.camera": "拍摄",
"uni.previewImage.cancel": "取消",
"uni.previewImage.button.save": "保存图像",
"uni.previewImage.save.success": "保存图像到相册成功",
"uni.previewImage.save.fail": "保存图像到相册失败",
"uni.setClipboardData.success": "内容已复制",
"uni.scanCode.title": "扫码",
"uni.scanCode.album": "相册",
"uni.scanCode.fail": "识别失败",
"uni.scanCode.flash.on": "轻触照亮",
"uni.scanCode.flash.off": "轻触关闭",
"uni.startSoterAuthentication.authContent": "指纹识别中...",
"uni.picker.done": "完成",
"uni.picker.cancel": "取消",
"uni.video.danmu": "弹幕",
"uni.video.volume": "音量",
"uni.button.feedback.title": "问题反馈",
"uni.button.feedback.send": "发送"
},
"ios": {},
"android": {}
}

@ -0,0 +1,193 @@
{
"app.name": "丰链艺树",
"tabbar.home": "首页",
"tabbar.mine": "我的",
"index.title": "首页",
"locale.auto": "系统",
"locale.en": "English",
"locale.zh-hans": "简体中文",
"locale.zh-hant": "繁体中文",
"api-header": "zh-CN",
"index.language-change-confirm": "应用此设置将重启App",
"navbar.back": "返回",
"login.title": "登录/注册",
"login.input": "在此输入手机号",
"login.agree": "已阅读并同意",
"login.service": "《平台服务协议》",
"login.privacy": "《隐私权政策》",
"login.registration": "《平台注册相关协议》",
"login.btn": "发送验证码",
"login.mess": "请阅读并勾选协议",
"authentication.title": "安全验证",
"authentication.content": "拖动滑块填充拼图",
"sendCode.title": "输入验证码",
"sendCode.send": "已发送到",
"sendCode.login": "登录",
"sendCode.update": "确认修改",
"sendCode.loading": "正在获取验证码",
"sendCode.toast": "倒计时结束后再发送",
"login.success": "登录成功",
"login.error": "登录失败",
"sendCode.updateSuccess": "修改成功,请重新登录",
"sendCode.updateError": "修改失败",
"sendCode": "验证码已发送",
"welcome.toHome": "正在跳转至首页",
"welcome.title": "验证成功欢迎来到",
"collection.info": "藏品信息",
"collection.buy": "购买",
"collection.name": "藏品名称",
"collection.type": "藏品类型",
"collection.size": "藏品尺寸",
"collection.specs": "藏品规格",
"collection.address": "藏品产地",
"collection.intro": "藏品介绍",
"collection.detail": "藏品详情",
"collection.sell": "藏品卖点",
"collection.sellDec": "藏品细节",
"collection.company": "工艺介绍",
"collection.copyight": "版权声明",
"collection.blockchain": "区块链说明",
"buyVerfy.title": "购买商品需要进行实名认证",
"buyVerfy.username": "真实姓名",
"buyVerfy.idNum": "身份证号",
"buyVerfy.suss": "实名认证有效",
"buyVerfy.error": "实名认证无效",
"buyVerfy.done": "完成",
"buyVerfy.cancel": "取消",
"buyVerfy.noGift": "售罄",
"login.pls": "请先登录",
"alipay.payment": "支付宝支付",
"comfirm.num1": "共",
"comfirm.num2": "件",
"comfirm.total": "合计",
"comfirm.pay": "生成核验二维码",
"confirm.payment":"去确认支付",
"comfirm.copy": "复制订单验证码",
"payment.back": "返回首页",
"payment.cancel": "取消交易",
"payment.check": "查看详情",
"payment.confirmSuccess": "交易成功",
"payment.cancelSuccess": "交易取消",
"payment.failed": "交易失败",
"payInfo.title": "核对订单",
"payInfo.subtxt1": "正在验证用户",
"payInfo.subtxt2": "的订单信息",
"payInfo.confirmDate": "核验日期",
"payInfo.buyerName": "买家昵称",
"payInfo.artworkName": "商品名称",
"payInfo.orderPrice": "订单金额",
"payInfo.payTypeName": "支付方式",
"payInfo.payImages": "支付凭证",
"payInfo.typePrice": "输入支付方式",
"payInfo.salesperson": "请联系工作人员核实消费信息",
"payInfo.waitConfirm": "等待销售员确认",
"payInfo.copyCode": "输入订单验证码",
"mine.language": "语言",
"mine.message": "消息",
"mine.setting": "设置",
"mine.scan": "扫码",
"mine.blockchain": "区块链",
"mine.artwork": "我的藏品",
"mine.noData": "暂无藏品",
"mine.updateLang": "更换语言",
"updateLang.done": "当前使用",
"updateLang.change": "更换",
"password.title": "使用操作密码解锁更多功能",
"password.set": "设置操作密码",
"password.name": "请用户",
"password.input": "输入操作密码",
"password.com": "确认操作密码",
"password.get": "使用操作密码",
"password.step": "下一步",
"password": "操作密码",
"password.vername": "正在验证用户",
"password.username": "身份信息",
"comfrim": "确认",
"password.inputPass": "请输入操作密码",
"password.messError": "请确认两次输入的操作密码相同",
"password.setSucc": "设置成功",
"password.setError": "设置失败",
"password.verSucc": "验证成功",
"password.verError": "验证失败",
"avatar.def": "恢复默认头像",
"avatar.update": "更换头像",
"userInfo.name": "昵称",
"userInfo.updateName": "修改昵称",
"userInfo.createTime": "注册日期",
"userInfo.idNum": "ID号码",
"userInfo.phone": "联系电话",
"phone.update": "换绑",
"phone.verInfo": "完成实名认证后才可以换绑手机",
"user.realName": "实名",
"user.verfy": "实名认证",
"user.username": "姓名",
"user.verDone": "已认证",
"user.idNum": "身份证",
"account.logout": "注销账号",
"account.signOut": "退出登录",
"set.name": "设置昵称",
"set.input": "请输入内容",
"problem.feedback": "问题反馈",
"logout.info": "是否确认要注销该账号",
"logout.btn": "注销",
"signout.info": "是否确认退出登录",
"realname.conduct": "进行实名认证",
"save.update": "保存修改",
"airdrop": "空投",
"announcement": "公告",
"read": "阅读",
"to.accept": "收下",
"close": "关闭",
"basic.info": "基础信息",
"series.name": "系列名称",
"series.issuer": "发行方",
"series.time": "交易日期",
"series.price": "交易价格",
"series.hash": "HASH值",
"series.No": "编号",
"phone.old": "原手机号",
"phone.code": "验证码",
"update.phone.title": "换绑手机号码需要原手机号验证",
"phone.new": "新手机号",
"input.phoneCode": "请填写验证码和新手机号",
"apply.logistics": "申请物流",
"logistics.info": "物流信息",
"telephone": "咨询电话",
"consignee.name": "收货人姓名",
"consignee.address": "收货地址",
"consignee.phone": "联系电话",
"release.info": "发行信息",
"release.time": "发行时间",
"brand.side": "品牌方",
"circulation.info": "流转信息",
"possessor": "持有人",
"collection.status": "藏品状态",
"in.library": "在库",
"been.applied": "已申请物流",
"circulation.type": "流转类型",
"on.line": "在线",
"circulation.time": "流转时间",
"transaction.hash": "交易哈希",
"apply.tips": "一旦申请,不可撤销,请着重考虑!",
"input.address": "请填写地址",
"input.pla": "请输入",
"apply.btn": "申请",
"error.consignee.name": "请输入收货人姓名",
"error.consignee.phone": "请输入联系电话",
"error.consignee.address": "请输入收货地址",
"apply.succes": "申请成功",
"apply.error": "申请失败",
"load.failed": "加载失败",
"update.succes": "修改成功",
"code.actPass": "请输入操作密码和验证码",
"code.start": "获取验证码",
"code.change": "X秒重新获取",
"code.end": "重新获取",
"error.phone": "手机号码不正确",
"pick.up": "领取",
"letter.you": "给你的一封信",
"letter.all": "给全体员工的一封信",
"sumbit":"提交",
"realHashTitle":"藏品信息",
"realHash":"藏品hash"
}

@ -0,0 +1,190 @@
{
"app.name": "豐鏈藝樹",
"tabbar.home": "首頁",
"tabbar.mine": "我的",
"index.title": "首頁",
"locale.auto": "系統",
"locale.en": "English",
"locale.zh-hans": "简体中文",
"locale.zh-hant": "繁體中文",
"api-header": "zh-TW",
"index.language-change-confirm": "應用此設置將重啟App",
"navbar.back": "返回",
"login.title": "登入/注册",
"login.input": "在此輸入手機號",
"login.agree": "已閱讀並同意",
"login.service": "《平臺服務協議》",
"login.privacy": "《隱私權政策》",
"login.registration": "《平臺注册相關協議》",
"login.btn": "發送驗證碼",
"login.mess": "請閱讀並勾選協定",
"authentication.title": "安全驗證",
"authentication.content": "拖動滑塊填充拼圖",
"sendCode.title": "輸入驗證碼",
"sendCode.send": "已發送到",
"sendCode.login": "登入",
"sendCode.update": "確認修改",
"sendCode.loading": "正在獲取驗證碼",
"sendCode.toast": "倒數計時結束後再發送",
"login.success": "登入成功",
"login.error": "登入失敗",
"sendCode.updateSuccess": "修改成功,請重新登入",
"sendCode.updateError": "修改失敗",
"sendCode": "驗證碼已發送",
"welcome.toHome": "正在跳轉至首頁",
"welcome.title": "驗證成功歡迎來到",
"collection.info": "藏品資訊",
"collection.buy": "購買",
"collection.name": "藏品名稱",
"collection.type": "藏品類型",
"collection.size": "藏品尺寸",
"collection.specs": "藏品規格",
"collection.address": "藏品產地",
"collection.intro": "藏品介紹",
"collection.detail": "藏品詳情",
"collection.sell": "藏品賣點",
"collection.sellDec": "藏品細節",
"collection.company": "工藝介紹",
"collection.copyight": "版權聲明",
"collection.blockchain": "區塊鏈說明",
"buyVerfy.title": "購買商品需要進行實名認證",
"buyVerfy.username": "真實姓名",
"buyVerfy.idNum": "身份證號",
"buyVerfy.suss": "實名認證有效",
"buyVerfy.error": "實名認證無效",
"buyVerfy.done": "完成",
"buyVerfy.noGift": "售罄",
"buyVerfy.cancel": "取消",
"login.pls": "請先登錄",
"alipay.payment": "支付寶支付",
"comfirm.num1": "共",
"comfirm.num2": "件",
"comfirm.total": "合計",
"comfirm.pay": "生成核驗二維碼",
"comfirm.copy": "復製訂單碼驗證",
"payment.back": "返回首頁",
"payment.cancel": "取消交易",
"payment.check": "查看詳情",
"payment.confirmSuccess": "交易成功",
"payment.cancelSuccess": "交易取消",
"payment.failed": "交易失敗",
"payInfo.title": "核對訂單",
"payInfo.subtxt1": "正在驗證用戶",
"payInfo.subtxt2": "的訂單信息",
"payInfo.confirmDate": "核驗日期",
"payInfo.buyerName": "買家昵稱",
"payInfo.artworkName": "商品名稱",
"payInfo.orderPrice": "訂單金額",
"payInfo.payTypeName": "支付方式",
"payInfo.payImages": "支付憑證",
"payInfo.typePrice": "輸入支付方式",
"payInfo.salesperson": "請聯系業務員線下核實消費信息",
"payInfo.waitConfirm": "等待銷售員確認",
"payInfo.copyCode": "輸入訂單驗證碼",
"mine.language": "語言",
"mine.message": "消息",
"mine.setting": "設定",
"mine.scan": "掃碼",
"mine.blockchain": "區塊鏈",
"mine.artwork": "我的藏品",
"mine.noData": "暫無藏品",
"mine.updateLang": "更換語言",
"updateLang.done": "當前使用",
"updateLang.change": "更換",
"password.title": "使用操作密碼解鎖更多功能",
"password.set": "設定操作密碼",
"password.name": "請用戶",
"password.input": "輸入操作密碼",
"password.com": "確認操作密碼",
"password.get": "使用操作密碼",
"password.step": "下一步",
"password": "操作密碼",
"password.vername": "正在驗證用戶",
"password.username": "身份資訊",
"comfrim": "確認",
"password.inputPass": "請輸入操作密碼",
"password.messError": "請確認兩次輸入的操作密碼相同",
"password.setSucc": "設定成功",
"password.setError": "設定失敗",
"password.verSucc": "驗證成功",
"password.verError": "驗證失敗",
"avatar.def": "恢復默認頭像",
"avatar.update": "更換頭像",
"userInfo.name": "昵稱",
"userInfo.updateName": "修改昵稱",
"userInfo.createTime": "注册日期",
"userInfo.idNum": "ID號碼",
"userInfo.phone": "聯繫電話",
"phone.update": "換綁",
"phone.verInfo": "完成實名認證後才可以換綁手機",
"user.realName": "實名",
"user.verfy": "實名認證",
"user.username": "姓名",
"user.verDone": "已認證",
"user.idNum": "身份證",
"account.logout": "註銷帳號",
"account.signOut": "登出",
"set.name": "設定昵稱",
"set.input": "請輸入內容",
"problem.feedback": "問題迴響",
"logout.info": "是否確認要註銷該帳號",
"logout.btn": "註銷",
"signout.info": "是否確認登出",
"realname.conduct": "進行實名認證",
"save.update": "保存修改",
"airdrop": "空投",
"announcement": "公告",
"read": "閱讀",
"to.accept": "收下",
"close": "關閉",
"basic.info": "基礎資訊",
"series.name": "系列名稱",
"series.issuer": "發行方",
"series.time": "交易日期",
"series.price": "交易價格",
"series.hash": "HASH值",
"series.No": "編號",
"phone.old": "原手機號",
"phone.code": "驗證碼",
"update.phone.title": "換綁手機號碼需要原手機號驗證",
"phone.new": "新手機號",
"input.phoneCode": "請填寫驗證碼和新手機號",
"apply.logistics": "申請物流",
"logistics.info": "物流資訊",
"telephone": "諮詢電話",
"consignee.name": "收貨人姓名",
"consignee.address": "收貨地址",
"consignee.phone": "聯繫電話",
"release.info": "發行資訊",
"release.time": "發行時間",
"brand.side": "品牌方",
"circulation.info": "流轉資訊",
"possessor": "持有人",
"collection.status": "藏品狀態",
"in.library": "在庫",
"been.applied": "已經申請物流",
"circulation.type": "流轉類型",
"on.line": "線上",
"circulation.time": "流轉時間",
"transaction.hash": "交易雜湊",
"apply.tips": "一旦申請,不可撤銷,請著重考慮!",
"input.address": "請填寫地址",
"input.pla": "請輸入",
"apply.btn": "申請",
"error.consignee.name": "請輸入收貨人姓名",
"error.consignee.phone": "請輸入聯繫電話",
"error.consignee.address": "請輸入收貨地址",
"apply.succes": "申請成功",
"apply.error": "申請失敗",
"load.failed": "加載失敗",
"update.succes": "修改成功",
"code.actPass": "請輸入操作密碼和驗證碼",
"code.start": "獲取驗證碼",
"code.change": "X秒重新獲取",
"code.end": "重新獲取",
"error.phone": "手機號碼不正確",
"pick.up": "領取",
"letter.you": "給你的一封信",
"letter.all": "給全體員工的一封信"
}

@ -0,0 +1,52 @@
import App from "./App";
import en from "./locale/en.json";
import zhHans from "./locale/zh-Hans.json";
import zhHant from "./locale/zh-Hant.json";
const messages = {
en,
"zh-Hans": zhHans,
"zh-Hant": zhHant,
};
let i18nConfig = {
locale: uni.getLocale(), // 获取已设置的语言
messages,
};
//弹出框禁止滑动
Vue.prototype.stopScroll = function () {
var mo = function (e) {
e.preventDefault();
};
document.body.style.overflow = "hidden";
document.addEventListener("touchmove", mo, false); // 禁止页面滑动
};
//弹出框可以滑动
Vue.prototype.canScroll = function () {
var mo = function (e) {
e.preventDefault();
};
document.body.style.overflow = ""; // 出现滚动条
document.removeEventListener("touchmove", mo, false);
};
import Vue from "vue";
import VueI18n from "vue-i18n"; // v8.x
import uView from "uview-ui";
import common from "./common/index.js";
import api from "@/http/";
Vue.use(VueI18n);
Vue.use(uView);
Vue.prototype.$common = common;
Vue.prototype.$api = api;
// Vue.prototype.$baseUrl = "http://114.218.158.24:9022";
Vue.prototype.$baseUrl = "https://shop.szjixun.cn";
const i18n = new VueI18n(i18nConfig);
Vue.config.productionTip = false;
App.mpType = "app";
const app = new Vue({
i18n,
...App,
});
app.$mount();

@ -0,0 +1,122 @@
{
"name" : "艺术商城",
"appid" : "__UNI__7D47507",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : 101,
"locale" : "zh-Hans",
"transformPx" : false,
/* 5+App */
"app-plus" : {
"safearea" : {
"bottom" : "none"
},
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {
"Payment" : {},
"Camera" : {}
},
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios */
"ios" : {
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {
"payment" : {
"alipay" : {
"__platform__" : [ "ios", "android" ]
}
},
"ad" : {}
},
"splashscreen" : {
"androidStyle" : "common"
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "2",
"h5" : {
"title" : "艺树商城"
}
}

480
package-lock.json generated

@ -0,0 +1,480 @@
{
"name": "mall-app",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"dependencies": {
"jweixin-module": "^1.6.0",
"vue-3d-model": "^1.4.1",
"weixin-js-sdk": "^1.6.0"
}
},
"node_modules/@babel/parser": {
"version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
"integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==",
"peer": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@vue/compiler-core": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
"integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
"peer": true,
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/shared": "3.2.45",
"estree-walker": "^2.0.2",
"source-map": "^0.6.1"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
"integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
"peer": true,
"dependencies": {
"@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
"integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
"peer": true,
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.45",
"@vue/compiler-dom": "3.2.45",
"@vue/compiler-ssr": "3.2.45",
"@vue/reactivity-transform": "3.2.45",
"@vue/shared": "3.2.45",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7",
"postcss": "^8.1.10",
"source-map": "^0.6.1"
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
"integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"node_modules/@vue/reactivity": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz",
"integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
"peer": true,
"dependencies": {
"@vue/shared": "3.2.45"
}
},
"node_modules/@vue/reactivity-transform": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
"integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
"peer": true,
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.45",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
"integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
"peer": true,
"dependencies": {
"@vue/reactivity": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
"integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
"peer": true,
"dependencies": {
"@vue/runtime-core": "3.2.45",
"@vue/shared": "3.2.45",
"csstype": "^2.6.8"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
"integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
"peer": true,
"dependencies": {
"@vue/compiler-ssr": "3.2.45",
"@vue/shared": "3.2.45"
},
"peerDependencies": {
"vue": "3.2.45"
}
},
"node_modules/@vue/shared": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
"peer": true
},
"node_modules/csstype": {
"version": "2.6.21",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
"peer": true
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"peer": true
},
"node_modules/jweixin-module": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.6.0.tgz",
"integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
},
"node_modules/magic-string": {
"version": "0.25.9",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"peer": true,
"dependencies": {
"sourcemap-codec": "^1.4.8"
}
},
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"peer": true
},
"node_modules/postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
}
],
"peer": true,
"dependencies": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"deprecated": "Please use @jridgewell/sourcemap-codec instead",
"peer": true
},
"node_modules/three": {
"version": "0.135.0",
"resolved": "https://registry.npmjs.org/three/-/three-0.135.0.tgz",
"integrity": "sha512-kuEpuuxRzLv0MDsXai9huCxOSQPZ4vje6y0gn80SRmQvgz6/+rI0NAvCRAw56zYaWKMGMfqKWsxF9Qa2Z9xymQ=="
},
"node_modules/vue": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz",
"integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.2.45",
"@vue/compiler-sfc": "3.2.45",
"@vue/runtime-dom": "3.2.45",
"@vue/server-renderer": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"node_modules/vue-3d-model": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/vue-3d-model/-/vue-3d-model-1.4.1.tgz",
"integrity": "sha512-IQjpqEjK1OLF/0XgF6O++IvOPLinLQ2aWZQFHxPFoTfPlB4vQW2sgv8EJSqpsIYC/wSCdGlP3CEnv9L3aZHlow==",
"dependencies": {
"three": "^0.135.0"
},
"peerDependencies": {
"vue": ">=2.0.0"
}
},
"node_modules/weixin-js-sdk": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/weixin-js-sdk/-/weixin-js-sdk-1.6.0.tgz",
"integrity": "sha512-3IYQH7aalJGFJrwdT3epvTdR1MboMiH7vIZ5BRL2eYOJ12BNah7csoMkmSZzkq1+l92sSq29XdTCVjCJoK2sBQ=="
}
},
"dependencies": {
"@babel/parser": {
"version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
"integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==",
"peer": true
},
"@vue/compiler-core": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
"integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
"peer": true,
"requires": {
"@babel/parser": "^7.16.4",
"@vue/shared": "3.2.45",
"estree-walker": "^2.0.2",
"source-map": "^0.6.1"
}
},
"@vue/compiler-dom": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
"integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
"peer": true,
"requires": {
"@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"@vue/compiler-sfc": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
"integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
"peer": true,
"requires": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.45",
"@vue/compiler-dom": "3.2.45",
"@vue/compiler-ssr": "3.2.45",
"@vue/reactivity-transform": "3.2.45",
"@vue/shared": "3.2.45",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7",
"postcss": "^8.1.10",
"source-map": "^0.6.1"
}
},
"@vue/compiler-ssr": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
"integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
"peer": true,
"requires": {
"@vue/compiler-dom": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"@vue/reactivity": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz",
"integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
"peer": true,
"requires": {
"@vue/shared": "3.2.45"
}
},
"@vue/reactivity-transform": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
"integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
"peer": true,
"requires": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.45",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7"
}
},
"@vue/runtime-core": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
"integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
"peer": true,
"requires": {
"@vue/reactivity": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"@vue/runtime-dom": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
"integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
"peer": true,
"requires": {
"@vue/runtime-core": "3.2.45",
"@vue/shared": "3.2.45",
"csstype": "^2.6.8"
}
},
"@vue/server-renderer": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
"integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
"peer": true,
"requires": {
"@vue/compiler-ssr": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"@vue/shared": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
"peer": true
},
"csstype": {
"version": "2.6.21",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
"peer": true
},
"estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"peer": true
},
"jweixin-module": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.6.0.tgz",
"integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
},
"magic-string": {
"version": "0.25.9",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"peer": true,
"requires": {
"sourcemap-codec": "^1.4.8"
}
},
"nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"peer": true
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"peer": true
},
"postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"peer": true,
"requires": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"peer": true
},
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"peer": true
},
"sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"peer": true
},
"three": {
"version": "0.135.0",
"resolved": "https://registry.npmjs.org/three/-/three-0.135.0.tgz",
"integrity": "sha512-kuEpuuxRzLv0MDsXai9huCxOSQPZ4vje6y0gn80SRmQvgz6/+rI0NAvCRAw56zYaWKMGMfqKWsxF9Qa2Z9xymQ=="
},
"vue": {
"version": "3.2.45",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz",
"integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
"peer": true,
"requires": {
"@vue/compiler-dom": "3.2.45",
"@vue/compiler-sfc": "3.2.45",
"@vue/runtime-dom": "3.2.45",
"@vue/server-renderer": "3.2.45",
"@vue/shared": "3.2.45"
}
},
"vue-3d-model": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/vue-3d-model/-/vue-3d-model-1.4.1.tgz",
"integrity": "sha512-IQjpqEjK1OLF/0XgF6O++IvOPLinLQ2aWZQFHxPFoTfPlB4vQW2sgv8EJSqpsIYC/wSCdGlP3CEnv9L3aZHlow==",
"requires": {
"three": "^0.135.0"
}
},
"weixin-js-sdk": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/weixin-js-sdk/-/weixin-js-sdk-1.6.0.tgz",
"integrity": "sha512-3IYQH7aalJGFJrwdT3epvTdR1MboMiH7vIZ5BRL2eYOJ12BNah7csoMkmSZzkq1+l92sSq29XdTCVjCJoK2sBQ=="
}
}
}

@ -0,0 +1,7 @@
{
"dependencies": {
"jweixin-module": "^1.6.0",
"vue-3d-model": "^1.4.1",
"weixin-js-sdk": "^1.6.0"
}
}

@ -0,0 +1,253 @@
{
"easycom": {
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
},
"pages": [
//pageshttps://uniapp.dcloud.io/collocation/pages
{
"path": "pages/start/start",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/changePhone/changePhone",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/realName/realName",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/index",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/series/series",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/activeSeries/activeSeries",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/detail/detail",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/login/login",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/setting/setting",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/notice/notice",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/comfirm/comfirm",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/payment/payment",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/detail/detail",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/cert/cert",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/login/sendCode/sendCode",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/login/welcome/welcome",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/detail/open3D/open3D",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/mine/confirmOrder/confirmOrder",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/payment/reciveOK",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/activity/index",
"style": {
"navigationBarTitleText": "系列活动详情页",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "pages/index/activity/detail",
"style": {
"navigationBarTitleText": "藏品活动详情页",
"enablePullDownRefresh": false,
"app-plus": {
"titleNView": false //
}
}
},
{
"path": "components/tabBar/tabBar",
"style": {}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8",
"app-plus": {
"bounce": "none"
}
},
"tabBar": {
"list": [{
"pagePath": "pages/index/index",
"text": "%tabbar.home%"
},
{
"pagePath": "pages/mine/index",
"text": "%tabbar.mine%"
}
]
},
"uniIdRouter": {}
}

@ -0,0 +1,104 @@
<template>
<view>
<!-- <navBar navTitle="" :stickyShow="stickyShow" :backBackGroundColor="'rgba(255, 255, 255, 0.4)'"></navBar> -->
<view class="top">
<button class="back" @click="back"></button>
<image src="@/static/image/home/activity/series.png" mode="" class="cover"></image>
<button class="btn" @click="detail">
<image src="@/static/image/home/activity/right.png" mode="scaleToFill" class="img" />
</button>
</view>
<view class="article-box">
<image src="@/static/image/home/activity/article.png" mode="" class="article"></image>
</view>
</view>
</template>
<script>
export default {
data() {
return {
stickyShow: false,
}
},
methods: {
back() {
uni.switchTab({
url: '/pages/index/index'
});
},
detail() {
uni.navigateTo({
url: '/pages/index/detail/detail'
});
}
}
}
</script>
<style lang="scss">
page {
height: 100vh;
}
.top {
position: relative;
.btn {
width: 240rpx;
height: 58rpx;
position: absolute;
color: #FFFFFF;
background: #3E0007;
border-radius: 40rpx;
font-size: 24rpx;
bottom: 44rpx;
left: 254rpx;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
.img {
width: 12rpx;
height: 12rpx;
margin-left: 14rpx;
}
}
.cover {
width: 100%;
height: 1624rpx;
display: block;
}
.back {
position: absolute;
width: 128rpx;
height: 56rpx;
background: rgba(255, 255, 255, 0.4);
color: #FFFFFF;
z-index: 999;
border-radius: 40rpx;
font-size: 32rpx;
line-height: 56rpx;
left: 26rpx;
top: 30rpx;
}
}
.article-box {
background: url('@/static/image/home/activity/container.png') no-repeat;
background-size: 100% 100%;
width: 100%;
height: 1382rpx;
padding: 72rpx 44rpx;
box-sizing: border-box;
.article {
width: 100%;
height: 100%;
}
}
</style>

@ -0,0 +1,428 @@
<template>
<view>
<!-- <navBar :navTitle="collectionsDetail.Name" :isBack="true" :stickyShow="stickyShow"></navBar> -->
<view class="fixed-box">
<view class="btn">
<u-button
type="warning"
:text="$t('navbar.back')"
class="back"
@click="back"
></u-button>
<u-button
v-if="collectionsDetail.Num === collectionsDetail.SellNum"
:disabled="true"
type="primary"
:text="$t('buyVerfy.noGift')"
class="buyer"
></u-button>
<u-button
v-else
type="primary"
:text="$t('collection.buy')"
class="buyer"
@click="buy"
></u-button>
</view>
</view>
<image
src="@/static/image/home/activity/xqy1_01.png"
mode="widthFix"
></image>
<image
src="@/static/image/home/activity/xqy1_02.png"
mode="widthFix"
></image>
<image
src="@/static/image/home/activity/xqy1_03.png"
mode="widthFix"
></image>
<image
src="@/static/image/home/activity/xqy1_04.png"
mode="widthFix"
></image>
<image
src="@/static/image/home/activity/xqy1_05.png"
mode="widthFix"
></image>
<image
src="@/static/image/home/activity/xqy1_06.png"
mode="widthFix"
></image>
<image
src="@/static/image/home/activity/xqy1_07.png"
mode="widthFix"
></image>
<view style="height: 160rpx"></view>
<u-popup
:show="showVerfy"
mode="center"
@close="closeVerfy"
bgColor="transparent"
>
<view class="popup-box">
<view class="title">{{ $t("buyVerfy.title") }}</view>
<view class="">
<view class="input-box">
<view class="label">{{ $t("buyVerfy.username") }}</view>
<view class="input">
<u--input
border="none"
shape="circle"
v-model="realName"
@focus="verfFocus"
></u--input>
</view>
</view>
<view class="input-box">
<view class="label">{{ $t("buyVerfy.idNum") }}</view>
<view class="input">
<u--input
border="none"
shape="circle"
v-model="idNum"
@focus="verfFocus"
></u--input>
</view>
</view>
<view class="flex-end">
<view class="fl-e" v-if="succes">
<image
src="../../../static/image/home/true.png"
mode=""
style="width: 30rpx; height: 30rpx; margin-right: 5px"
></image>
<text style="color: #ffffff; font-size: 24rpx">{{
$t("buyVerfy.suss")
}}</text>
</view>
<view class="fl-e" v-if="err">
<image
src="../../../static/image/home/false.png"
mode=""
style="width: 30rpx; height: 30rpx; margin-right: 5px"
></image>
<text style="color: #fd343c; font-size: 24rpx">{{
$t("buyVerfy.error")
}}</text>
</view>
</view>
</view>
<u-button
:text="$t('buyVerfy.done')"
color="#558BF2"
@click="verifyName"
style="
width: 622rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
"
></u-button>
<u-button
:text="$t('buyVerfy.cancel')"
color="#000000"
@click="closeVerfy"
style="
width: 622rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
"
></u-button>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
return {
stickyShow: false,
showVerfy: false,
CollectionUID: "",
collectionsDetail: {},
sellPoint: [],
collDetails: [],
companyInfo: [],
copyright: [],
Blockchain: [],
realName: "",
idNum: "",
err: false,
succes: false,
SeriesName: "",
isHave: false,
AirdorpUid: "",
isClose: true,
};
},
onPageScroll(e) {
this.stickyShow = e.scrollTop > 5 ? true : false;
},
onLoad: function (option) {
this.CollectionUID = option.CollectionUID;
this.SeriesName = option.SeriesName;
// this.getCollectionDetail();
},
onShow() {
this.getCollectionDetail();
},
methods: {
open3D() {
uni.navigateTo({
url: "/pages/index/detail/open3D/open3D",
});
},
back() {
// this.$common.navigateBack();
uni.navigateTo({
url:
"/pages/index/activity/index?detail=" +
uni.getStorageSync("activity_params"),
});
},
async getCollectionDetail() {
let data = {
CollectionsUID: this.CollectionUID,
};
let res = await this.$api.series.collectionsInfo(data);
if (res.status === 0) {
// await this.getPick(res.data.CollectionUID)
this.collectionsDetail = res.data;
// (this.AllImgList = res.data.CutImg ? JSON.parse(res.data.CutImg) : []),
// this.cutImg();
} else {
uni.$u.toast(this.$t("load.failed"));
}
},
/* async getPick(uid) {
let parmas = {
uuid: uid
}
let res = await this.$api.series.userHaveDropNo(parmas);
if(res.status === 0) {
console.log(res.data.Hava);
this.isHave = res.data.Have != 0 ? false : true;
this.AirdorpUid = res.data.UserAirdorpUid
} else {
this.isHave = false
}
}, */
/* cutImg() {
this.AllImgList.forEach((v) => {
if (v.label === "卖点") {
this.sellPoint = v.imgs;
} else if (v.label === "藏品细节") {
this.collDetails = v.imgs;
} else if (v.label === "工艺/公司介绍") {
this.companyInfo = v.imgs;
} else if (v.label === "版权声明") {
this.copyright = v.imgs;
} else if (v.label === "区块链说明") {
this.Blockchain = v.imgs;
}
});
}, */
buy() {
let token = uni.getStorageSync("mall_token");
let realName = uni.getStorageSync("mall-user-info")
? uni.getStorageSync("mall-user-info").realName
: "";
if (!token) {
uni.$u.toast(this.$t("login.pls"));
uni.setStorageSync(
"return_url",
"/pages/index/activity/detail?CollectionUID=" +
this.CollectionUID +
"&SeriesName=" +
this.SeriesName
);
uni.navigateTo({
url: "/pages/login/login",
});
} else if (!realName) {
this.showVerfy = true;
} else {
uni.navigateTo({
url:
"/pages/index/comfirm/comfirm?Collection=" +
encodeURIComponent(JSON.stringify(this.collectionsDetail)),
});
}
},
/* async pickUp() {
let data = {
UserId: uni.getStorageSync('mall-user-info').ID,
Uuid: this.AirdorpUid
};
let res = await this.$api.airdrop.getCollection(data);
if (res.status === 0) {
this.recive();
} else {
uni.$u.toast(res.msg);
}
},
async recive() {
let data = {
collectionsUID: this.CollectionUID,
userAirdropUuid: this.AirdorpUid
};
let res = await this.$api.airdrop.getCollectionStepTwo(data);
if (res.status === 0) {
uni.navigateTo({
url: '/pages/index/payment/reciveOK'
})
} else {
uni.$u.toast(res.msg);
}
}, */
async verifyName() {
let data = {
idNum: this.idNum,
realName: this.realName,
};
let res = await this.$api.mine.update(data);
if (res.status === 0) {
this.succes = true;
uni.setStorageSync("mall-user-info", res.data);
setTimeout(() => {
this.idNum = "";
this.realName = "";
this.showVerfy = false;
this.err = false;
}, 1000);
} else {
this.err = true;
this.succes = false;
uni.$u.toast(res.msg);
}
},
verfFocus() {
this.err = false;
this.succes = false;
},
doneVerfy() {
this.showVerfy = false;
},
closeVerfy() {
this.showVerfy = false;
},
},
};
</script>
<style lang="scss">
.fixed-box {
position: fixed;
bottom: 0;
width: 100%;
height: 172rpx;
// background: #3e3e3e;
background: rgba(0, 0, 0, 1);
z-index: 10;
.btn {
display: flex;
padding: 42rpx 38rpx;
}
.back {
width: 172rpx;
height: 56rpx;
border-radius: 40rpx;
// background: #efba42;
background: rgba(255, 255, 255, 0.3);
border-color: rgba(0, 0, 0, 1);
margin-right: 30rpx;
}
.buyer {
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
// background: #558bf2;
background: rgba(
252,
73,
71,
1
); //linear-gradient(#FFA10A 0%,#C12020 100%);
border-color: rgba(0, 0, 0, 1);
}
/* .disBtn {
width: 484rpx;
height: 56rpx;
line-height: 56upx;
border-radius: 40rpx;
background: rgba(65, 0, 0, 1);
border: 1upx #fff solid;
text-align: center;
}
*/
}
image {
width: 100%;
height: auto;
display: block;
}
.popup-box {
background: rgba(0, 0, 0, 1);
width: 698rpx;
overflow: hidden;
padding: 30rpx 0;
.title {
font-size: 40rpx;
text-align: center;
margin-top: 80rpx;
margin-bottom: 100rpx;
}
.input-box {
display: flex;
align-items: center;
padding: 0 34rpx 34rpx 38rpx;
.label {
font-size: 22rpx;
}
.input {
background: rgba(255, 255, 255, 0.5);
width: 450rpx;
height: 60rpx;
border-radius: 40rpx;
padding: 0 20rpx;
display: flex;
align-items: center;
/deep/ .input-placeholder {
font-size: 24rpx;
}
/deep/ .uni-input-input {
font-size: 24rpx;
color: #fff;
}
}
}
.flex-end {
padding: 0 34rpx 34rpx 38rpx;
display: flex;
justify-content: flex-end;
.fl-e {
display: flex;
align-items: center;
}
}
}
</style>

@ -0,0 +1,154 @@
<template>
<view>
<view class="container">
<view class="top-back">
<text @click="navigateBack">{{$t('navbar.back')}}</text>
</view>
<image src="@/static/image/home/activity/series.png" mode="widthFix" class="image1"></image>
<view class="click" @click="goDetail"></view>
<view class="btn" @click="goDetail">
查看详情
<image src="@/static/image/home/activity/right.png" mode="widthFix"></image>
</view>
</view>
<view class="info">
<view class="content">
<image src="@/static/image/home/title.png" mode="widthFix" class="title"></image>
<image src="http://cdn2.tyfon.com.cn/activity/wen_an.png" mode="widthFix" class="wenan"></image>
<image src="@/static/image/home/activity/from.png" mode="widthFix" class="from"></image>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
collectionsData: [],
CollectionUID: ''
};
},
onLoad: function(option) {
this.seriesItem = JSON.parse(decodeURIComponent(option.detail));
this.getCollections()
},
methods: {
navigateBack() {
uni.switchTab({
url: '/pages/index/index'
});
},
goDetail() {
uni.navigateTo({
url: '/pages/index/activity/detail?CollectionUID=' + this.CollectionUID + '&SeriesName=' + this.seriesItem.SeriesName
})
},
async getCollections(){
let data = {
Page: 1,
PageSize: 99999,
SeriesUID:this.seriesItem.SeriesUuid
};
let res = await this.$api.series.collectionsList(data);
if (res.status === 0) {
// this.collectionsData = res.data.Data;
res.data.Data.forEach(i =>{
if(i.CollectionUID == 'd00c6694-f223-48e7-a9fc-a08d7fe18b1e' || i.Name == '泰丰十周年纪念胸章') {
this.CollectionUID = i.CollectionUID
}
})
} else {
uni.$u.toast(this.$t('load.failed'));
}
}
}
}
</script>
<style lang="scss">
image{
display: block;
}
.image1{
width: 100%;
height: auto;
}
.info{
width: 100%;
background:url('@/static/image/home/activity/bg.png'), #5F000B;
background-position: bottom right;
background-size: contain;
background-repeat: no-repeat;
padding: 72upx 34upx 52upx 34upx;
box-sizing: border-box;
.content{
width: 100%;
background: rgba(11,0,0,0.4);
border-radius: 8upx;
padding: 40upx 26upx 80upx 26upx;
box-sizing: border-box;
position: relative;
flex-direction: column;
justify-content: center;
align-items: center;
.title{
margin: auto;
width: 300upx;
}
.wenan{
width: 618upx;
margin-top: 24upx;
}
.from{
width: 356upx;
position: absolute;
right: 26upx;
bottom: 52upx;
}
}
}
.container{
position: relative;
.top-back{
width: 68upx;
background: rgba(255, 255, 255, 0.4);
padding: 6upx 32upx;
border-radius: 40upx;
font-size: 28upx;
color: #ffffff;
position: absolute;
top: 50upx;
left: 46upx;
z-index: 2;
}
.click{
position: absolute;
width: 240upx;
height: 304upx;
bottom: 410upx;
left: 50%;
transform: rotateZ(-17deg) translateX(-58%);
}
.btn{
position: absolute;
width: 240upx;
height: 58upx;
display: flex;
justify-content: center;
align-items: center;
background: rgba(62, 0, 7, 1);
border-radius: 40upx;
bottom: 30upx;
left: 50%;
transform: translateX(-50%);
image{
width: 10upx;
margin-left: 10upx;
}
}
}
</style>

@ -0,0 +1,595 @@
<template>
<view>
<navBar
navTitle=""
:hasLogo="true"
:color="'#000000'"
:backBackGroundColor="'rgb(105, 154, 112)'"
></navBar>
<view class="goods">
<image :src="collection.CollectionImg" mode=""></image>
<view class="right">
<view class="title">{{ collection.Name }}</view>
<text style="font-size: 30rpx" class="price">
<text style="font-size: 48rpx; font-weight: 600" class="price">{{
collection.Price.toFixed(2)
}}</text>
</text>
</view>
</view>
<view class="pay">
<!-- <u-radio-group v-model="payType" style="width: 100%">
<view class="item" v-for="(item, index) in list" :key="index">
<view class="left">
<image :src="item.icon"></image>
{{ item.name }}
</view>
<u-radio :name="item.id" active-color="#07C160"></u-radio>
</view>
</u-radio-group> -->
<view class="item">
<view class="min200">{{ $t("payInfo.buyerName") }}</view>
<view class="value">{{ nickName }}</view>
</view>
<view class="item">
<view class="min200">{{ $t("payInfo.orderPrice") }}</view>
<view class="value">{{ collection.Price }}</view>
</view>
<view class="item">
<view class="min200">{{ $t("payInfo.typePrice") }}</view>
<!-- <view>{{ payTypeName }}</view> -->
<view>
<payComponet @payModeHandel="payModeHandel" />
</view>
<!-- <u-input
v-model="payTypeName"
shape="circle"
border="none"
class="login-input"
></u-input> -->
</view>
<view class="item" v-show="payTypeName === '央行数字人民币'">
<view class="min200">{{ $t("payInfo.payImages") }}</view>
<view
><u-upload
:fileList="fileList"
@afterRead="afterRead"
@delete="deletePic"
multiple
:previewFullImage="true"
></u-upload
></view>
</view>
</view>
<view
style="text-align: center; color: #699a70"
v-if="payTypeName === '央行数字人民币'"
>{{ $t("payInfo.salesperson") }}
</view>
<view class="online-pay" v-else>
<view class="mode">请选择线上支付方式</view>
<view class="line"></view>
<u-radio-group v-model="value">
<u-radio>
<view class="mode-pay">
<image
src="@/static/image/home/money.png"
mode="scaleToFill"
class="img"
/>
<view class="text">数字人名币</view>
</view>
</u-radio>
</u-radio-group>
</view>
<view class="navigation">
<view class="left">
<view class="price">
<text>{{ $t("comfirm.total") }}</text>
<text></text>
<text style="font-size: 46rpx">{{
collection.Price.toFixed(2)
}}</text>
</view>
</view>
<view class="right"
><u-button class="btn" @click="showCode" :disabled="!uploadFlag">{{
$t("confirm.payment")
}}</u-button>
</view>
<!-- <u-button :text="$t('comfirm.pay')" @click="showCode" :disabled="!uploadFlag" style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
background: rgba(252, 73, 71, 1);
border-color: #3e3e3e;
color: #fff;
"></u-button> -->
</view>
<u-popup :show="show" @close="show = false" mode="center">
<view>
<view class="pop-title">{{ $t("payInfo.waitConfirm") }}</view>
<view class="codebox">
<img :src="qrCode" />
</view>
<u-button
:text="$t('comfirm.copy')"
color="#699A70"
@click="copyCode"
style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
"
></u-button>
</view>
</u-popup>
</view>
</template>
<script>
import payComponet from "pages/index/comfirm/payComponet/payComponet";
export default {
components: {
payComponet,
},
data() {
return {
list: [
{
id: 0,
name: this.$t("alipay.payment"),
icon: "/static/image/home/zhifubao.png",
},
// {id: 1, name: '', icon:'/static/image/home/weixin.png'},
],
show: false,
numTotal: 1,
payType: 0,
collection: {},
fileList: [],
payTypeName: "央行数字人民币", // 线
nickName: "",
qrCode: "",
codeSec: "",
// flag
uploadFlag: false,
value: "",
};
},
onLoad: function (option) {
this.collection = JSON.parse(decodeURIComponent(option.Collection));
// localStorage
this.nickName = uni.getStorageSync("mall-user-info").nickName;
console.log(this.nickName, "nickName");
},
// 1
watch: {
fileList: function (val) {
if (val.length < 1) {
this.uploadFlag = false;
}
},
},
methods: {
//
copyCode() {
uni.setClipboardData({
data: this.codeSec,
success: (res) => {
uni.showToast({
title: "复制成功",
icon: "success",
duration: 2000,
});
},
fail: (res) => {
uni.showToast({
title: "复制失败",
icon: "none",
duration: 2000,
});
},
});
},
async submit() {
let res = await this.$api.series.buy({
collectionsUID: this.collection.CollectionUID,
});
if (res.status === 0) {
// window.location.href = res.data.Url
uni.requestPayment({
provider: "alipay",
orderInfo: res.data.AppParams,
success: (result) => {
console.log(result, "成功回调");
let rawdata = JSON.parse(result.rawdata);
let outTradeNo = JSON.parse(rawdata.result)
.alipay_trade_app_pay_response.out_trade_no;
this.toFinish(outTradeNo);
},
fail: (error) => {},
});
} else if (res.status === 401) {
uni.navigateTo({
url: "/pages/login/login",
});
uni.clearStorageSync();
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
},
//
deletePic(event) {
this[`fileList`].splice(event.index, 1);
},
async afterRead(event) {
// multiple true , file
let lists = [].concat(event.file);
let fileListLen = this[`fileList`].length;
lists.map((item) => {
this[`fileList`].push({
...item,
status: "uploading",
message: "上传中",
});
});
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url);
console.log(result, "result");
let item = this[`fileList`][fileListLen];
this[`fileList`].splice(
fileListLen,
1,
Object.assign(item, {
status: "success",
message: "",
url: result,
})
);
fileListLen++;
}
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
const Authorization = uni.getStorageSync("token");
const userId = uni.getStorageSync("mall-user-info").ID;
let a = uni.uploadFile({
url: this.$baseUrl + "/mall/upload/file",
filePath: url,
name: "file",
formData: {
type: "image",
source: "user",
mask: userId,
},
header: {
Authorization,
},
success: (res) => {
console.log(res, "res");
res.data = JSON.parse(res.data);
resolve(res.data.data.ori_url);
this.uploadFlag = true;
},
});
});
},
//
async toFinish(tradeno) {
let res = await this.$api.mine.paymentDetail({
outTradeNo: tradeno,
});
if (res.status === 0) {
console.log(res);
// uni.$u.toast('');
setTimeout(() => {
uni.navigateTo({
url:
"/pages/index/payment/payment?artworkUid=" +
res.data.pay.artworkUid +
"&ID=" +
res.data.pay.ID,
});
}, 1000);
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
},
//
async showCode() {
//
console.log(this.fileList, "fileList");
if (!this.payTypeName) {
uni.$u.toast(this.$t("payInfo.typePrice"));
return;
}
let res = await this.$api.series.createQrcode({
collectionsUID: this.collection.CollectionUID,
payTypeName: this.payTypeName,
payImages: this.fileList.map((item) => item.url),
});
if (res.status === 0) {
this.qrCode = res.data.Code;
this.codeSec = res.data.CodeSc;
this.show = true;
} else {
uni.$u.toast(res.msg);
}
},
payModeHandel(mode) {
this.payTypeName = mode === "线下支付" ? "央行数字人民币" : mode;
console.log(this.payTypeName);
},
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/new_bg.png") no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
}
/deep/ .u-radio {
width: 550rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.online-pay {
margin: 40rpx 45rpx;
background: #ffffff;
border-radius: 8rpx;
display: flex;
flex-direction: column;
align-items: center;
height: 190rpx;
.mode {
color: #699a70;
font-size: 28rpx;
margin-top: 30rpx;
margin-bottom: 22rpx;
}
.line {
width: 568rpx;
height: 0.5rpx;
background: #9dd0a4;
}
.mode-pay {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
// margin-top: 30rpx;
.img {
width: 26rpx;
height: 26rpx;
margin-right: 4rpx;
}
.text {
color: #434343;
font-size: 24rpx;
}
}
}
.goods {
margin: 40rpx 45rpx;
background: #ffffff;
border-radius: 8rpx;
display: flex;
align-items: center;
padding: 40rpx 22rpx;
image {
width: 228rpx;
height: 228rpx;
}
.right {
margin-left: 20rpx;
.title {
font-size: 32rpx;
margin-bottom: 10rpx;
color: #878787;
}
.price {
color: #699a70;
}
}
}
.min200 {
min-width: 200rpx;
color: #434343;
}
.value {
color: #878787;
}
.login-input {
height: 68upx;
background-color: rgba(255, 255, 255, 0.6);
padding: 0 20rpx;
/deep/ .uni-input-placeholder {
padding: 0 20rpx;
}
/deep/ .uni-input-input {
color: #fff;
padding: 0 20rpx;
}
}
.pay {
margin: 40rpx 45rpx;
background: #ffffff;
border-radius: 8rpx;
display: flex;
flex-direction: column;
align-items: center;
padding: 20rpx 22rpx;
.item {
width: 100%;
display: flex;
// justify-content: space-between;
align-items: center;
margin: 10rpx 0;
margin-bottom: 30upx;
.left {
display: flex;
justify-content: space-between;
image {
width: 40rpx;
height: 40rpx;
border-radius: 50%;
margin-right: 20rpx;
background: #fff;
}
}
}
}
.navigation {
position: fixed;
bottom: 0;
z-index: 10;
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
margin-top: 100rpx;
background: #ffffff;
padding: 30rpx 16rpx 30rpx 10rpx;
.left {
display: flex;
align-items: center;
font-size: 20rpx;
margin-left: 30rpx;
font-size: 24rpx;
.num {
width: 84rpx;
color: #878787;
margin-right: 10rpx;
font-size: 24rpx;
display: flex;
align-items: center;
}
.price {
flex: 1;
color: #434343;
text:nth-child(1) {
// color: #000000;
font-size: 24rpx;
}
text:nth-child(2) {
font-size: 32rpx;
}
text:nth-child(3) {
font-size: 60rpx;
}
}
}
.right {
display: flex;
justify-content: flex-end;
padding-right: 40rpx;
.btn {
width: 258rpx;
height: 56rpx;
line-height: 56rpx;
background: #699a70;
border-radius: 40rpx;
color: #ffffff;
text-align: center;
border: none;
// background-color: $tree-theme-color;
}
}
.item {
font-size: 30upx;
width: 400rpx;
display: flex;
margin-bottom: 40upx;
.imgBox {
width: 300rpx;
height: 300rpx;
border: 1px solid #fff;
margin-left: 20rpx;
}
image {
width: 300rpx;
height: 300rpx;
}
}
}
/deep/ .u-upload__button {
background-color: #878787;
}
/deep/ .u-popup__content {
background-color: #3e3e3e !important;
width: 700upx !important;
height: 880upx !important;
display: flex !important;
align-items: center !important;
.pop-title {
font-size: 40upx;
color: #699a70;
text-align: center;
margin-bottom: 80upx;
margin-top: 70upx;
}
img {
width: 520upx;
height: 520upx;
}
.codebox {
width: 570upx;
height: 570upx;
background-color: #fff;
border-radius: 10upx;
display: flex;
align-items: center;
justify-content: center;
}
}
</style>

@ -0,0 +1,124 @@
<template>
<view class="butttonGroup" :class="{ bg: isShow }">
<view class="onlineBox">
<view class="title">{{ selectPayMode }}</view>
<image
v-show="!isShow"
src="@/static/image/home/down-icon.png"
mode="scaleToFill"
class="img"
@click="showPay('up')"
/>
<image
v-show="isShow"
src="@/static/image/home/up-icon.png"
mode="scaleToFill"
class="img"
@click="showPay('down')"
/>
</view>
<view class="mode" v-show="isShow">
<view v-for="(item, index) in modeList" :key="item.id" class="pay">
<view
:class="['name', currect === index ? 'active' : '']"
@click="checkPay(item, index)"
>{{ item.name }}</view
>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
modeList: [
// { id: "1", name: "线" },// 线
{ id: "2", name: "线下支付" },
],
isShow: false,
currect: 0,
selectPayMode: "线下支付", // 线
};
},
methods: {
showPay(type) {
if (type === "up") {
this.isShow = true;
} else {
this.isShow = false;
}
},
checkPay(item, index) {
this.currect = index;
if (this.selectPayMode === item.name) {
return this.selectPayMode;
}
this.selectPayMode = item.name;
this.$emit("payModeHandel", this.selectPayMode);
this.isShow = false;
},
},
};
</script>
<style lang="scss" scoped>
.bg {
background: #f5f5f5;
}
.butttonGroup {
width: 198rpx;
border-radius: 30rpx 30rpx 0 0;
position: relative;
border: 0;
.onlineBox {
width: 198rpx;
display: flex;
align-items: center;
height: 60rpx;
background-color: #e4e4e4;
border-radius: 30rpx;
color: #434343;
font-size: 20rpx;
border: 0;
justify-content: space-around;
.title {
// margin-left: 40rpx;
// margin-right: 30rpx;
}
.img {
width: 40rpx;
height: 40rpx;
}
}
.mode {
position: absolute;
width: 100%;
height: 150rpx;
height: 80rpx; // 线
border-radius: 0 0 30rpx 30rpx;
z-index: 1;
color: #434343;
font-size: 20rpx;
background: #f5f5f5;
top: 57rpx;
.pay {
padding: 0 20rpx;
.name {
height: 42rpx;
padding: 8rpx 0;
margin-top: 14rpx;
line-height: 42rpx;
text-align: center;
}
.active {
background: rgba(157, 208, 164, 0.2);
border-radius: 30rpx;
}
}
}
}
</style>

@ -0,0 +1,832 @@
<template>
<view>
<navBar
:navTitle="collectionsDetail.Name"
:stickyShow="stickyShow"
:color="'#000000'"
:backBackGroundColor="'#699A70'"
v-if="!isActive"
:sfBack="true"
@triggerSfBack="back"
></navBar>
<view
class="fixed-box"
:style="{ background: !isActive ? '#FFFFFF' : '#000000' }"
>
<view class="btn" v-if="!isActive">
<u-button
type="primary"
:text="$t('navbar.back')"
class="back"
@click="back"
></u-button>
<u-button
v-if="this.collectionsDetail.CurrencyType === 'point'"
type="success"
:text="'积分制尚未开通'"
class="buyer"
></u-button>
<u-button
v-if="this.collectionsDetail.CurrencyType === 'normal'"
type="success"
:text="
this.collectionsDetail.SaleType === 'draw'
? '领取'
: this.collectionsDetail.SaleType === 'normal'
? '¥' + price + $t('collection.buy')
: '仅限渠道购买'
"
class="buyer"
@click="buy"
></u-button>
</view>
<view class="btn" v-else>
<u-button
type="primary"
:text="$t('navbar.back')"
class="back-active"
@click="back"
></u-button>
<u-button type="success" :text="'售罄'" class="sell-out"></u-button>
</view>
</view>
<view v-if="!isActive">
<view class="top-img">
<!-- @click="open3D"-->
<image
:src="this.collectionsDetail.CollectionImg"
mode="widthFix"
></image>
<!-- <text class="price" v-if="this.collectionsDetail.Price != 0">{{ this.collectionsDetail.Price }}</text> -->
</view>
<!-- <view class="title-t">{{ collectionsDetail.Price != 0 ? $t('letter.all') : $t('letter.you') }}</view> -->
<!-- <view class="info-box" style="padding: 28rpx 32rpx">
<image src="@/static/image/home/to1.png" class="title-img" v-if="collectionsDetail.Price != 0"></image>
<image src="@/static/image/home/to.png" class="title-img" v-else></image>
<image src="@/static/image/home/333.png" class="content-img" mode="widthFix"
v-if="collectionsDetail.Price != 0"></image>
<image src="@/static/image/home/222.png" class="content-img" mode="widthFix" v-else></image>
<view style="text-align: right;">
<image src="@/static/image/home/from.png" class="from-img"></image>
</view>
</view> -->
<view
class="title-t"
:style="{ fontSize: '36rpx', color: '#434343', fontWeight: 600 }"
>{{ $t("collection.info") }}
</view>
<view class="info-box" style="padding: 28rpx 32rpx; background: #ffffff">
<view class="item">
<text class="label">{{ $t("collection.name") }}</text>
<text class="value">{{ this.collectionsDetail.Name || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.type") }}</text>
<text class="value">{{
this.collectionsDetail.CollectionType || "-"
}}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.size") }}</text>
<text class="value">{{ this.collectionsDetail.Size || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.specs") }}</text>
<text class="value">{{ this.collectionsDetail.Specs || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.address") }}</text>
<text class="value">{{ this.collectionsDetail.Address || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.intro") }}</text>
<view class="des">{{ this.collectionsDetail.Intro || "-" }}</view>
</view>
</view>
<view
class="title-t"
:style="{ fontSize: '36rpx', color: '#434343', fontWeight: 600 }"
>{{ $t("collection.detail") }}
</view>
<view class="detail-info">
<!-- <view class="title-t">{{$t('collection.sell')}}</view>
<view class="box">
<image v-for="item in sellPoint" :key="item" :src="item" mode="widthFix" class="img"></image>
</view> -->
<view
v-if="
this.CollectionUID !== '372afbef-4d3c-4e06-8fae-2ef1068b0a89' &&
collDetails.length > 0
"
class="title-t"
>{{ $t("collection.sellDec") }}</view
>
<view
v-if="
this.CollectionUID !== '372afbef-4d3c-4e06-8fae-2ef1068b0a89' &&
collDetails.length > 0
"
class="box"
>
<image
v-for="item in collDetails"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
<view
v-if="
this.CollectionUID !== '372afbef-4d3c-4e06-8fae-2ef1068b0a89' &&
companyInfo.length > 0
"
class="title-t"
>{{ $t("collection.company") }}</view
>
<view
v-if="
this.CollectionUID !== '372afbef-4d3c-4e06-8fae-2ef1068b0a89' &&
companyInfo.length > 0
"
class="box"
>
<image
v-for="item in companyInfo"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
<view v-if="copyright.length > 0" class="title-t">{{
$t("collection.copyight")
}}</view>
<view v-if="copyright.length > 0" lass="box">
<image
v-for="item in copyright"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
<view v-if="Blockchain.length > 0" class="title-t">{{
$t("collection.blockchain")
}}</view>
<view v-if="Blockchain.length > 0" class="box">
<image
v-for="item in Blockchain"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
</view>
<view class="" style="text-align: center; margin-top: 30rpx">
<image
src="@/static/image/home/fontree.png"
mode=""
class="logo"
></image>
</view>
</view>
<view v-else class="active">
<view class="head">
<u-button class="back" @click="back"> </u-button>
<view>泰丰十周年纪念徽章</view>
</view>
<image
src="@/static/image/home/drawing-board.png"
mode="scaleToFill"
class="drawing-board"
/>
</view>
<view style="height: 180rpx"></view>
<u-popup
:show="showVerfy"
mode="center"
@close="closeVerfy"
bgColor="transparent"
>
<view class="popup-box">
<view class="title">{{ $t("buyVerfy.title") }}</view>
<view class="">
<view class="input-box">
<view class="label">{{ $t("buyVerfy.username") }}</view>
<view class="input">
<u--input
border="none"
shape="circle"
v-model="realName"
@focus="verfFocus"
></u--input>
</view>
</view>
<view class="input-box">
<view class="label">{{ $t("buyVerfy.idNum") }}</view>
<view class="input">
<u--input
border="none"
shape="circle"
v-model="idNum"
@focus="verfFocus"
></u--input>
</view>
</view>
<view class="flex-end">
<view class="fl-e" v-if="succes">
<image
src="../../../static/image/home/true.png"
mode=""
style="width: 30rpx; height: 30rpx; margin-right: 5px"
></image>
<text style="color: #ffffff; font-size: 24rpx">{{
$t("buyVerfy.suss")
}}</text>
</view>
<view class="fl-e" v-if="err">
<image
src="../../../static/image/home/false.png"
mode=""
style="width: 30rpx; height: 30rpx; margin-right: 5px"
></image>
<text style="color: #fd343c; font-size: 24rpx">{{
$t("buyVerfy.error")
}}</text>
</view>
</view>
</view>
<u-button
:text="$t('buyVerfy.done')"
color="#699A70"
@click="verifyName"
style="
'width: 622rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 114rpx;'
"
></u-button>
<view @click="closeVerfy" class="cancel">{{
$t("buyVerfy.cancel")
}}</view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
return {
stickyShow: false,
showVerfy: false,
CollectionUID: "",
collectionsDetail: {},
sellPoint: [],
collDetails: [],
companyInfo: [],
copyright: [],
Blockchain: [],
realName: "",
idNum: "",
err: false,
succes: false,
SeriesName: "",
isHave: false,
AirdorpUid: "",
price: "",
isActive: false,
currencyType: "",
pageParams: {},
};
},
onPageScroll(e) {
this.stickyShow = e.scrollTop > 5 ? true : false;
},
onLoad: function (option) {
this.pageParams = option;
this.CollectionUID = option.CollectionUID;
this.SeriesName = option.SeriesName;
this.price = option.Price;
this.isActive = !Object.keys(option).length;
},
onShow() {
this.getCollectionDetail();
},
methods: {
calcRouteParams(obj) {
if (obj && JSON.stringify(obj) !== "{}") {
let str = "?";
for (let key in obj) {
str += key + "=" + obj[key] + "&";
}
return str.slice(0, -1);
}
return "";
},
open3D() {
uni.navigateTo({
url: "/pages/index/detail/open3D/open3D",
});
},
back() {
let routesRecord = getCurrentPages();
if (routesRecord.length > 1) {
this.$common.navigateBack();
} else {
uni.reLaunch({
url: "/pages/index/index",
});
}
},
async getCollectionDetail() {
if (this.isActive) return;
let data = {
CollectionsUID: this.CollectionUID,
};
let res = await this.$api.series.collectionsInfo(data);
if (res.status === 0) {
// await this.getPick(res.data.CollectionUID);
this.collectionsDetail = res.data;
(this.AllImgList = res.data.CutImg ? JSON.parse(res.data.CutImg) : []),
this.cutImg();
} else {
uni.$u.toast(this.$t("load.failed"));
}
},
async getPick(uid) {
if (this.isActive) return;
let parmas = {
uuid: uid,
};
let res = await this.$api.series.userHaveDropNo(parmas);
if (res.status === 0) {
console.log(res.data.Hava);
this.isHave = res.data.Have != 0 ? false : true;
this.AirdorpUid = res.data.UserAirdorpUid;
} else {
this.isHave = false;
}
},
cutImg() {
this.AllImgList.forEach((v) => {
if (Array.isArray(v.imgs)) {
v.imgs = v.imgs.filter((img) => {
if (img) {
return img;
}
});
}
switch (v.label) {
case "卖点":
this.sellPoint = v.imgs;
break;
case "藏品细节":
this.collDetails = v.imgs;
break;
case "工艺/公司介绍":
this.companyInfo = v.imgs;
break;
case "版权声明":
this.copyright = v.imgs;
break;
case "区块链说明":
this.Blockchain = v.imgs;
break;
}
});
},
buy() {
//
if (
this.collectionsDetail.CurrencyType === "normal" &&
["normal", "draw"].includes(this.collectionsDetail.SaleType)
) {
let token = uni.getStorageSync("mall_token");
let realName = uni.getStorageSync("mall-user-info")
? uni.getStorageSync("mall-user-info").realName
: "";
if (!token) {
uni.$u.toast(this.$t("login.pls"));
uni.setStorageSync(
"login-redirect",
"/pages/index/detail/detail" + this.calcRouteParams(this.pageParams)
);
uni.navigateTo({
url: "/pages/login/login",
});
} else if (!realName) {
this.showVerfy = true;
} else {
if (this.collectionsDetail.SaleType === "draw") {
this.directGet();
return;
}
uni.navigateTo({
url:
"/pages/index/comfirm/comfirm?Collection=" +
encodeURIComponent(JSON.stringify(this.collectionsDetail)),
});
}
}
},
async directGet() {
let data = {
CollectionsUID: this.collectionsDetail.CollectionUID,
};
let res = await this.$api.airdrop.directGet(data);
if (res.status === 0) {
uni.$u.toast("领取成功!");
this.getCollectionDetail();
let routesRecord = getCurrentPages();
if (routesRecord.length > 1) {
let that = this;
setTimeout(() => {
that.$common.navigateBack();
}, 1000);
} else {
setTimeout(() => {
uni.reLaunch({
url: "/pages/index/index",
});
}, 1000);
}
} else {
uni.$u.toast(res.msg);
}
},
async pickUp() {
let data = {
UserId: uni.getStorageSync("mall-user-info").ID,
Uuid: this.AirdorpUid,
};
let res = await this.$api.airdrop.getCollection(data);
if (res.status === 0) {
this.recive();
} else {
uni.$u.toast(res.msg);
}
},
async recive() {
let data = {
collectionsUID: this.CollectionUID,
userAirdropUuid: this.AirdorpUid,
};
let res = await this.$api.airdrop.getCollectionStepTwo(data);
if (res.status === 0) {
uni.navigateTo({
url: "/pages/index/payment/reciveOK",
});
} else {
uni.$u.toast(res.msg);
}
},
async verifyName() {
let data = {
idNum: this.idNum,
realName: this.realName,
};
if (!data.idNum || !data.realName) {
return uni.$u.toast("姓名和身份证号不能为空");
}
if (!uni.$u.test.idCard(data.idNum)) {
return uni.$u.toast("身份证号不正确");
}
let res = await this.$api.mine.update(data);
if (res.status === 0) {
this.succes = true;
uni.setStorageSync("mall-user-info", res.data);
setTimeout(() => {
this.idNum = "";
this.realName = "";
this.showVerfy = false;
this.err = false;
this.succes = false;
}, 1000);
} else {
this.err = true;
this.succes = false;
uni.$u.toast(res.msg);
}
},
verfFocus() {
this.err = false;
this.succes = false;
},
doneVerfy() {
this.showVerfy = false;
},
closeVerfy() {
this.showVerfy = false;
},
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/new_bg.png?x-oss-process=image/resize,w_750,h_1580")
no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
}
.active {
position: relative;
.head {
position: absolute;
top: 30rpx;
left: 26rpx;
display: flex;
height: 110rpx;
align-items: center;
font-size: 32rpx;
z-index: 1;
.back {
width: 128rpx;
height: 56rpx;
color: #ffffff;
border-radius: 40rpx;
line-height: 56rpx;
background: rgba(255, 255, 255, 0.4);
margin-right: 78rpx;
border: 0;
}
}
}
.drawing-board {
width: 100%;
height: 6986rpx;
}
.fixed-box {
position: fixed;
bottom: 0;
width: 100%;
height: 172rpx;
// background: #3e3e3e;
background: #ffffff;
z-index: 10;
.btn {
display: flex;
padding: 42rpx 38rpx;
}
.back {
width: 172rpx;
height: 56rpx;
border-radius: 40rpx;
// background: #efba42;
background: #efba42;
border-color: aliceblue;
margin-right: 30rpx;
}
.back-active {
width: 172rpx;
height: 56rpx;
border-radius: 40rpx;
// background: #efba42;
background: rgba(255, 255, 255, 0.4);
border-color: aliceblue;
margin-right: 30rpx;
border: 0;
}
.buyer {
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
// background: #558bf2;
background: #699a70;
border-color: aliceblue;
}
.sell-out {
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
// background: #558bf2;
background: #fc4947;
border-color: #fc4947;
}
.disBtn {
width: 484rpx;
height: 56rpx;
line-height: 56upx;
border-radius: 40rpx;
background: rgba(65, 0, 0, 1);
border: 1upx #fff solid;
text-align: center;
}
}
.top-img {
background-size: contain;
width: 660rpx;
height: 660rpx;
border-radius: 8rpx;
margin: 44rpx 44rpx 32rpx 46rpx;
position: relative;
.price {
font-size: 48rpx;
position: absolute;
bottom: 10rpx;
right: 30upx;
// left: 50%;
// transform: translateX(-50%);
}
image {
width: 100%;
height: 100%;
}
}
/* .box-item {
// background: rgba(255, 255, 255, 0.3);
// background: rgba(11, 0, 0, 0.4);
// margin: 0 44rpx 0 46rpx;
image {
width: 100%;
display: block;
// height: 198rpx;
}
} */
.detail-info {
// background: rgba(0, 0, 0, 0.8);
background: rgba(255, 255, 255, 0.2);
border-radius: 8rpx;
margin: 30rpx;
padding: 23rpx;
.box {
// margin: 0 44rpx 0 46rpx;
margin-bottom: 46rpx;
// background: url('@/static/image/home/bg-info.png') no-repeat; // rgba(255, 255, 255, 0.3);
border-radius: 15rpx;
// padding: 38rpx 32rpx;
position: relative;
overflow: hidden;
.img {
width: 100%;
display: block;
}
}
}
.title-t {
text-align: center;
margin: 40rpx 0 30rpx 0;
color: #494949;
}
.info-box {
margin: 0 44rpx 0 46rpx;
margin-bottom: 46rpx;
// background: rgba(255, 255, 255, 0.3);
background: rgba(11, 0, 0, 0.3);
// background: url('@/static/image/home/bg-info.png') no-repeat;
border-radius: 8rpx;
// padding: 38rpx 32rpx;
position: relative;
.title-img {
width: 300upx;
height: 50upx;
margin-bottom: 32upx;
}
.content-img {
width: 100%;
display: block;
object-fit: contain;
}
.from-img {
width: 356upx;
height: 44upx;
margin-top: 20upx;
}
.item {
display: flex;
margin-bottom: 20rpx;
font-size: 20rpx;
.label {
padding-right: 40rpx;
width: 130rpx;
color: #434343;
font-size: 20rpx;
}
.value {
color: #878787;
}
.des {
width: 450rpx;
/* display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden; */
word-break: break-all;
white-space: normal;
color: #878787;
}
}
.img {
width: 100%;
display: block;
}
}
.logo {
margin-top: 10rpx;
width: 202rpx;
height: 56rpx;
}
.popup-box {
background: #ffffff;
height: 842rpx;
width: 698rpx;
overflow: hidden;
padding: 30rpx 38rpx;
box-sizing: border-box;
.title {
font-size: 40rpx;
text-align: center;
margin-top: 96rpx;
margin-bottom: 152rpx;
color: #434343;
}
.input-box {
display: flex;
align-items: center;
padding-bottom: 34rpx;
.label {
font-size: 22rpx;
color: #699a70;
}
.input {
background-color: rgba(135, 135, 135, 0.5);
width: 515rpx;
height: 60rpx;
border-radius: 40rpx;
display: flex;
align-items: center;
box-sizing: border-box;
/deep/ .input-placeholder {
font-size: 24rpx;
}
/deep/ .uni-input-input {
font-size: 24rpx;
padding: 0 20rpx;
color: #fff;
}
}
}
.flex-end {
padding: 0 34rpx 34rpx 38rpx;
display: flex;
justify-content: flex-end;
.fl-e {
display: flex;
align-items: center;
}
}
.cancel {
color: #878787;
font-size: 32rpx;
margin-top: 30rpx;
text-align: center;
}
}
</style>

@ -0,0 +1,50 @@
<template>
<view>
<view class="ThreeJSCity">
<!-- <model-obj class="ThreeDShow" src="../../static/5.obj" mtl="../../static/5.mtl" ></model-obj> -->
<!-- :background-alpha="alpha" :lights="lights"-->
</view>
</view>
</template>
<script>
// import { ModelStl,ModelObj } from 'vue-3d-model'
export default {
data() {
return {
alpha: 0,
lights: [{
type: 'HemisphereLight',
position: {x: 0, y: 1, z: 0},
skyColor: 0xffffff,
// groundColor: 0xFF0000, //
intensity: 1,
},
{
type: 'DirectionalLight',
position: {x: 1, y: 1, z: 1},
color: 0xffffff,
intensity: .7,
}]
};
},
components: { ModelStl ,ModelObj},
}
</script>
<style lang="scss">
.ThreeJSCity {
width: 750upx;
height: 100vh;
// border:1px solid red;
background: url('../../../../static/bg-3d.png') no-repeat;
background-size: 100% 100%;
// z-index:0;
// background: #fff;
.ThreeDShow {
width: 750upx;
height: 750upx;
}
}
</style>

@ -0,0 +1,171 @@
<template>
<div>
<u-popup :show="show" mode="center" bgColor="transparent">
<view class="popupLocale-box">
<view class="item">
<image style="width: 600upx; height: 600upx" :src="detail.collectionImg"></image>
</view>
<view style="
color: rgb(0, 0, 0);
margin-top: 10upx;
margin-bottom: 10upx;
font-size: 40upx;
">
{{ detail.name }}
</view>
<view style="color: #6c6c6c; margin-top: 10upx; margin-bottom: 10upx" v-html="detail.intro">
</view>
</view>
<view class="btn-box">
<u-button :text="detail.isReceive
? '已被领取'
: detail.saleType === 'homebuy'
? '¥' + detail.price + '购买'
: $t('to.accept')
" @click="recive" style="
width: 460rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
background: #699a70;
border: none;
color: #fff;
"></u-button>
<view style="margin-top: 30rpx; text-align: center" @click="close">{{
$t("buyVerfy.cancel")
}}</view>
</view>
</u-popup>
</div>
</template>
<script>
// const jweixin = require("jweixin-module");
// import jweixin from "weixin-js-sdk";
export default {
data() {
return {
show: false,
};
},
watch: {
isShow: {
immediate: true,
handler(newValue) {
this.show = newValue;
},
},
},
props: ["detail", "collectionsUID", "num", "isShow"],
methods: {
close() {
this.show = false;
},
async recive() {
if (this.detail.isReceive) return;
if (this.detail.saleType === 'homebuy') {
this.payHandle()
} else {
await this.$api.series
.collectionsReceive({
collectionsUID: this.collectionsUID,
num: this.num,
})
.then((res) => {
console.log(res);
if (res.status === 0) {
this.show = false;
} else {
this.$common.msgToast(res.msg, null, "error");
}
})
.catch(() => {
uni.showToast({
title: this.$t("load.failed"),
icon: "none",
});
});
}
},
async payHandle() {
await this.$api.series
.collectionsBuy({
collectionsUID: this.collectionsUID,
num: this.num,
openId: uni.getStorageSync("openId"),
})
.then((res) => {
if (res.status === 0) {
this.vxPay(res.data);
}
})
.catch(() => {
uni.showToast({
title: this.$t("load.failed"),
icon: "none",
});
});
},
vxPay(data) {
jweixin.config({
debug: false,
appId: "wx72ffc6670d5ddb12",
timestamp: 1682402430,
nonceStr: "123",
signature: "123",
jsApiList: ["chooseWXPay"],
});
jweixin.chooseWXPay({
prepay_id: data.prepay_id,
appId: data.appId,
timestamp: data.timeStamp,
nonceStr: data.nonceStr,
package: data.package,
signType: data.signType,
paySign: data.paySign,
success: () => {
this.$common.msgToast("支付成功", null, "success");
this.close();
},
fail: (res) => {
this.$common.msgToast(res.errMsg, null, "error");
},
});
jweixin.error(function (res) {
this.$common.msgToast("用户取消支付", null, "error");
});
},
},
};
</script>
<style lang="scss" scoped>
.popupLocale-box {
background: rgba(255, 255, 255, 0.8);
width: 582rpx;
overflow: hidden;
padding: 30rpx 42rpx;
.u-button {
width: 260rpx;
height: 56rpx;
border-radius: 40rpx;
}
.item {
display: flex;
align-items: center;
justify-content: center;
}
.btn-box {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
}
</style>

@ -0,0 +1,395 @@
<template>
<view>
<tabBar :currentPage="'pages/index/index'"></tabBar>
<view class="content">
<image
src="../../static/image/home/fontree.png"
mode=""
class="logo"
></image>
</view>
<scroll-view
scroll-y
@scrolltolower="onreachBottom"
:refresher-enabled="true"
:refresher-triggered="isrefresh"
@refresherpulling="openLoading"
@refresherrefresh="onRefresh"
@refresherrestore="onRestore"
@scroll="onScroll"
:scroll-anchoring="true"
refresher-background="#699A70"
refresher-default-style="none"
:style="'height:' + listHeight + 'px;'"
:refresher-threshold="300"
class="scroll"
>
<image
src="../../static/image/home/new_line.png"
mode=""
class="line"
v-if="showPull"
></image>
<image
src="../../static/image/home/new_flower.png"
mode=""
class="flower-static"
v-if="showPull"
></image>
<view v-for="(item, index) in listData" :key="index" class="item">
<view class="box">
<!-- :style="'background: url(' + item.CoverImg + ');'" -->
<image
:src="item.CoverImg"
mode="scaleToFill"
class="img"
@click="goLink(item)"
></image>
<!-- <view class="bt-con">
<view class="name">{{ item.SeriesName }}</view>
<view class="des">{{ item.Desc }}</view>
</view> -->
<view class="description">
<view class="text">
<view class="name">{{ item.SeriesName }}</view>
<view class="des">{{ item.Desc }}</view>
</view>
<view class="line-des"></view>
<view
class="detail"
@click="goLink(item)"
:style="{
background:
item.SeriesName === '泰丰十周年' ? '#FC4947' : '#699A70',
}"
>查看详情</view
>
</view>
</view>
</view>
</scroll-view>
<Dialog
:detail="detail"
:collectionsUID="collectionsUID"
:num="num"
:isShow="isShow"
/>
</view>
</template>
haojia
<script>
import Dialog from "./dialog/dialog.vue";
export default {
components: {
Dialog,
},
data() {
return {
title: "Hello",
fromLogin: true,
listData: [],
page: 1,
pageSize: 10,
showPull: false,
isrefresh: false,
listHeight: uni.getSystemInfoSync().windowHeight - 88 - 61,
isShow: false,
collectionsUID: "",
num: "",
detail: {},
};
},
onShow() {
let routes = getCurrentPages(); //
let curRoute = routes[routes.length - 2];
},
onLoad() {
this.onreachBottom();
const collectionsUID = uni.getStorageSync("collectionsUID");
if (collectionsUID) {
this.collectionsUID = collectionsUID;
}
const num = uni.getStorageSync("num");
if (num) {
this.num = JSON.parse(num);
}
if (this.collectionsUID && this.num) {
this.collectionsDetail();
}
},
methods: {
openLoading(e) {
if (e.detail.deltaY < 0) return;
this.showPull = true;
this.isrefresh = true;
},
onRefresh(e) {
if (this._freshing) return;
this._freshing = true;
this.isrefresh = true;
setTimeout(() => {
this.getData();
}, 2000);
},
onRestore() {
this.showPull = false;
},
onreachBottom() {
this.getData();
},
onScroll() {
this.page++;
let params = {
page: this.page,
pageSize: this.pageSize,
};
uni.$u.debounce(async () => {
await this.$api.series
.list(params)
.then((res) => {
if (res.status === 0) {
if (res.data.Data) {
this.listData = [...this.listData, ...(res.data.Data || [])];
}
this.page--;
} else {
uni.showToast({
title: this.$t("load.failed"),
icon: "none",
});
}
})
.catch((err) => {
uni.showToast({
title: this.$t("load.failed"),
icon: "none",
});
});
}, 500);
},
goLink(item) {
// uni.navigateTo({
// url: '/pages/index/activity/index?detail=' + encodeURIComponent(JSON.stringify(item))
// });
console.log(1111, item);
if (item.SeriesName === "泰丰十周年") {
uni.navigateTo({
url:
"/pages/index/activeSeries/activeSeries?detail=" +
encodeURIComponent(JSON.stringify(item)),
});
} else {
uni.navigateTo({
url: "/pages/index/series/series?SeriesUID=" + item.SeriesUuid,
});
}
},
async getData() {
let params = {
page: 1,
pageSize: this.pageSize,
};
await this.$api.series
.list(params)
.then((res) => {
if (res.status === 0) {
this.listData = res.data.Data;
/* } else {
this.listData = [...this.listData, ...res.data.Data || []];
} */
} else {
uni.showToast({
title: this.$t("load.failed"),
icon: "none",
});
}
this.isrefresh = false; //onRestore
this._freshing = false;
})
.catch((err) => {
console.log(1231312312, err);
uni.showToast({
title: this.$t("load.failed"),
icon: "none",
});
});
},
async collectionsDetail() {
if (uni.getStorageSync("collectionsDetail")) {
await this.$api.series
.collectionsDetail({
collectionsUID: this.collectionsUID,
num: this.num,
})
.then((res) => {
if (res.status === 0) {
this.detail = res.data;
this.isShow = true;
uni.setStorageSync("collectionsDetail", false);
} else {
this.$common.msgToast(res.msg, null, "error");
}
})
.catch((err) => {
uni.showToast({
title: this.$t("load.failed"),
icon: "none",
});
});
}
},
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/new_bg.png") no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
}
/deep/ .uni-scroll-view-refresher {
max-height: 250rpx;
}
/deep/ .uni-scroll-view {
overflow-y: auto !important;
}
.content {
height: 122rpx;
background: #ffffff;
// padding-top: 300rpx;
// border: 1px solid red;
.logo {
width: 188rpx;
height: 56rpx;
margin-top: 36rpx;
margin-left: 48rpx;
}
}
.line {
width: 2rpx;
height: 164rpx;
position: absolute;
left: 50%;
top: 0;
transform: translateX(-50%);
}
.flower-static {
width: 43rpx;
height: 43rpx;
position: absolute;
left: 47%;
top: 167rpx;
animation: fadenum 1s infinite;
}
@keyframes fadenum {
100% {
transform: rotate(360deg);
}
}
.item {
margin-bottom: 40rpx;
}
.box {
width: 656rpx;
height: 814rpx;
margin: 0 48rpx;
display: flex;
flex-direction: column;
.img {
width: 656rpx;
height: 656rpx;
}
// .bt-con {
// position: absolute;
// bottom: 0;
// width: 656rpx;
// height: 158rpx;
// background: rgba(255, 255, 255, 0.3);
// //
// .name {
// font-size: 32rpx;
// border-bottom: 1rpx solid #fff;
// margin: 28rpx 50rpx 0 50rpx;
// text-align: center;
// padding-bottom: 10rpx;
// }
// .des {
// padding-top: 10rpx;
// font-size: 20rpx;
// text-align: center;
// overflow: hidden;
// text-overflow: ellipsis;
// white-space: nowrap;
// }
// }
.description {
width: 656rpx;
height: 158rpx;
// border: 1px solid red;
box-sizing: border-box;
padding: 18px 11px 18px 11px;
display: flex;
justify-content: center;
align-items: center;
background-color: #ffffff;
border-bottom-left-radius: 8rpx;
border-bottom-right-radius: 8rpx;
.text {
flex: 1;
.name {
font-size: 32rpx;
color: #000000;
font-family: "Songti TC";
font-weight: 500;
margin-bottom: 2px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.des {
margin-right: 28rpx;
font-size: 20rpx;
color: #939393;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
}
.line-des {
width: 1rpx;
height: 114rpx;
background-color: #d8d8d8;
}
.detail {
background: #699a70;
padding: 12rpx 40rpx;
border-radius: 8rpx;
text-align: center;
margin-left: 19px;
font-size: 28rpx;
}
}
}
</style>

@ -0,0 +1,76 @@
<template>
<view>
<navBar navTitle="" :hasLogo="true" :backToUrl="'/pages/index/index'" :isSwitchTab="true"></navBar>
<view class="" style="text-align: center;margin-top: 60upx;">
<image src="@/static/image/home/ok-logo.png" mode="" class="pay-Img"></image>
<image src="@/static/image/home/ok.png" mode="" class="payImg"></image>
</view>
<view class="btns">
<view class="item">
<u-button :text="$t('payment.back')" color="#EDC466" @click="goHome" style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
<!-- <u-button :text="$t('payment.check')" color="#558BF2" @click="goDetail" style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button> -->
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
artworkUid:'',
ID: '',
};
},
onLoad: function (option) {
this.ID = option.ID
this.artworkUid = option.artworkUid
},
methods: {
goHome() {
uni.reLaunch({
url: '/pages/index/index'
})
},
goDetail() {
uni.navigateTo({
url: '/pages/mine/detail/detail?ID=' + this.ID + '&artworkUid=' + this.artworkUid
})
}
}
}
</script>
<style lang="scss">
page{
background: url('@/static/image/home/bg.png') no-repeat;
background-size: 100% 100%;
background-attachment:fixed;
height: 100vh;
}
.pay-Img{
width: 608upx;
height: 576upx;
margin-top: 30upx;
}
.payImg{
width: 218rpx;
height: 56rpx;
margin-top: 20upx;
/* position: absolute;
left: 50%;
top: 40%;
transform: translate(-50%,-50%); */
}
.btns{
position: fixed;
width: 100%;
bottom: 200rpx;
.item{
display: flex;
justify-content: center;
}
}
</style>

@ -0,0 +1,76 @@
<template>
<view>
<navBar navTitle="" :hasLogo="true" :backToUrl="'/pages/index/index'" :isSwitchTab="true"></navBar>
<view class="" style="text-align: center;margin-top: 60upx;">
<image src="@/static/image/home/ok-logo.png" mode="" class="pay-Img"></image>
<image src="@/static/image/home/recive.png" mode="" class="payImg"></image>
</view>
<view class="btns">
<view class="item">
<u-button :text="$t('payment.back')" color="#EDC466" @click="goHome" style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
<!-- <u-button :text="$t('payment.check')" color="#558BF2" @click="goDetail" style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button> -->
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
artworkUid:'',
ID: '',
};
},
onLoad: function (option) {
this.ID = option.ID
this.artworkUid = option.artworkUid
},
methods: {
goHome() {
uni.reLaunch({
url: '/pages/index/index'
})
},
goDetail() {
uni.navigateTo({
url: '/pages/mine/detail/detail?ID=' + this.ID + '&artworkUid=' + this.artworkUid
})
}
}
}
</script>
<style lang="scss">
page{
background: url('@/static/image/home/bg.png') no-repeat;
background-size: 100% 100%;
background-attachment:fixed;
height: 100vh;
}
.pay-Img{
width: 608upx;
height: 576upx;
margin-top: 30upx;
}
.payImg{
width: 218rpx;
height: 56rpx;
margin-top: 20upx;
/* position: absolute;
left: 50%;
top: 40%;
transform: translate(-50%,-50%); */
}
.btns{
position: fixed;
width: 100%;
bottom: 200rpx;
.item{
display: flex;
justify-content: center;
}
}
</style>

@ -0,0 +1,292 @@
<template>
<view class="container">
<navBar
navTitle=""
:stickyShow="stickyShow"
:backBackGroundColor="'#699A70'"
></navBar>
<image :src="seriesItem.CoverImg" mode="" class="cover"></image>
<view class="designation">
<view class="left-x">
<view class="name">{{ seriesItem.SeriesName }}</view>
<view class="line"></view>
<view class="des">
{{ seriesItem.Desc }}
</view>
</view>
<view class="right-x">
<image :src="seriesItem.BrandImg" mode="" class="img"></image>
{{ seriesItem.BrandName }}
</view>
</view>
<view class="order-box">
<view
class="item"
v-for="i in collectionsData"
:key="i.CollectionUID"
@click="goDetail(i.CollectionUID)"
>
<image :src="i.CollectionImg" mode="" class="img"> </image>
<view class="content">
<view class="title">{{ i.Name }}</view>
<view class="price">
<text v-if="i.CurrencyType === 'normal'"></text>
<image
src="@/static/image/home/jifen.png"
mode="scaleToFill"
style="width: 24rpx; height: 24rpx"
v-else
/>
{{ i.Price }}
</view>
</view>
</view>
</view>
<view class="bot-text">
<view class="text-line"></view>
<image
src="@/static/image/home/fontree.png"
mode="aspectFit"
class="logo"
></image>
</view>
</view>
</template>
<script>
export default {
data() {
return {
stickyShow: false,
seriesItem: {},
collectionsData: [],
};
},
onLoad: function (option) {
Object.assign(this.seriesItem, { SeriesUuid: option.SeriesUID });
this.getPageData();
this.getCollections();
},
onPageScroll(e) {
this.stickyShow = e.scrollTop > 5 ? true : false;
},
methods: {
async getPageData() {
let params = {
seriesUuid: this.seriesItem.SeriesUuid,
};
let res = await this.$api.series.getSeriesData(params);
if (res.status === 0) {
this.seriesItem = res.data;
} else {
uni.$u.toast(this.$t("load.failed"));
}
},
navigateBack() {
uni.switchTab({
url: "/pages/index/index",
});
},
goDetail(CollectionUID) {
const price = this.collectionsData.find(
(item) => item.CollectionUID === CollectionUID
).Price;
uni.navigateTo({
url:
"/pages/index/detail/detail?CollectionUID=" +
CollectionUID +
"&SeriesName=" +
this.seriesItem.SeriesName +
"&Price=" +
price,
});
},
async getCollections() {
let data = {
Page: 1,
PageSize: 99999,
SeriesUID: this.seriesItem.SeriesUuid,
};
let res = await this.$api.series.collectionsList(data);
if (res.status === 0) {
this.collectionsData = res.data.Data;
} else {
uni.$u.toast(this.$t("load.failed"));
}
},
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/detail-kind-bg.png?x-oss-process=image/resize,w_750,h_1580")
no-repeat;
background-size: 100% 100%;
background-position: top center;
background-attachment: fixed;
height: 100vh;
// border: 1px solid red;
}
.container {
padding-bottom: 1upx;
}
.text-box {
margin: 72upx 45upx;
background: rgba(11, 0, 0, 0.4);
border-radius: 8upx;
padding: 36upx;
text-align: center;
.title-img {
width: 300upx;
height: 44upx;
margin-bottom: 24upx;
}
.content-img {
width: 594upx;
height: 1074upx;
}
.from-img {
width: 356upx;
height: 44upx;
}
}
.cover {
width: 100%;
height: 772rpx;
object-fit: cover;
margin-top: -110rpx;
}
.designation {
margin: 20rpx;
background: #ffffff;
border-radius: 8rpx;
display: flex;
justify-content: space-between;
padding: 28rpx 26rpx;
.left-x {
width: 460rpx;
.name {
color: #000000;
font-size: 32rpx;
width: 100%;
margin-bottom: 8rpx;
}
.line {
width: 100%;
background: #878787;
height: 1px;
}
.des {
padding-top: 30rpx;
width: 100%;
font-size: 20rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
color: #878787;
}
}
.right-x {
color: #878787;
font-size: 24rpx;
text-align: center;
display: flex;
flex-direction: column;
.img {
width: 128rpx;
height: 128rpx;
border-radius: 50%;
margin-bottom: 10rpx;
}
}
}
.order-box {
width: 100%;
box-sizing: border-box;
width: 100%;
display: flex;
justify-content: space-between;
padding: 0 24rpx;
flex-wrap: wrap;
.item {
width: 332rpx;
height: 418rpx;
background: #797979;
border-radius: 8rpx;
overflow: hidden;
position: relative;
margin-top: 20rpx;
.img {
width: 332rpx;
height: 318rpx;
// object-fit: cover;
}
.content {
width: 100%;
height: 74rpx;
position: absolute;
bottom: 0;
text-align: center;
// border-radius: 8rpx;
padding: 10rpx 0;
.title {
font-size: 32rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.price {
font-size: 24rpx;
}
}
}
}
.bot-text {
margin-top: 40rpx;
padding-bottom: 50rpx;
text-align: center;
.text-line {
width: 90%;
height: 1rpx;
background: #878787;
margin: auto;
}
.copyright {
font-size: 24rpx;
color: #878787;
margin-top: 10rpx;
}
.logo {
margin-top: 10rpx;
width: 252rpx;
height: 76rpx;
}
}
</style>

@ -0,0 +1,193 @@
<template>
<view class="main">
<navBar navTitle="" :backToUrl="'/pages/index/index'" :isSwitchTab="true" :color="'#000000'"
:backBackGroundColor="'#3D553D'"></navBar>
<view class="hint">*登录/注册后才可以体验所有功能</view>
<view style="margin-top: 446upx; font-size: 40upx">{{ $t('login.title') }}</view>
<view class="input-box">
<u-input v-model="TelNum" :placeholder="$t('login.input')" shape="circle" type="number" border="none"
class="login-input"></u-input>
<u-checkbox-group v-model="checked" iconPlacement="left" placement="row" @change="changechec">
<u-checkbox name="yes" shape="circle"></u-checkbox>
<view class="know">
{{ $t('login.agree') }}
<text>{{ $t('login.service') }}</text>
<text>{{ $t('login.privacy') }}</text>
<text>{{ $t('login.registration') }}</text>
</view>
</u-checkbox-group>
</view>
<u-button :loading="loading" @click="goSendCode" class="btn" :text="$t('login.btn')" shape="circle"
color="#699A70"></u-button>
<slider-verify :isShow="sliderVerifyFLag" @touchSliderResult="verifyResult" ref="verifyElement"></slider-verify>
<image class="logo" src="../../static/image/home/fontree-white.png"></image>
</view>
</template>
<script>
export default {
data() {
return {
TelNum: "",
Password: "",
checkKnow: "",
loading: false,
sliderVerifyFLag: false,
count: 120,
timer: null,
checked: [],
};
},
onLoad(e) {
if (Object.keys(e).length) {
const { collectionsUID, num } = e
uni.setStorageSync('collectionsUID', collectionsUID);
uni.setStorageSync('num', num);
if (uni.getStorageSync("mall-user-info") && uni.getStorageSync("mall_token")) {
uni.navigateTo({
url: "/pages/login/welcome/welcome",
});
}
}
},
methods: {
goSendCode() {
if (!uni.$u.test.mobile(this.TelNum)) {
this.$u.toast(this.$t('error.phone'));
return false
}
if (this.checked.length > 0) {
this.sliderVerifyFLag = true;
} else {
this.$u.toast(this.$t('login.mess'));
}
},
changechec() {
console.log(this.checked);
},
countdown() {
this.timer = setInterval(() => {
this.count--;
if (this.count === 0) {
clearInterval(this.timer);
// this.isReset = false;
}
}, 1000);
},
//
verifyResult(res) {
console.log(res);
setTimeout(() => {
this.sliderVerifyFLag = false;
this.countdown();
if (res) {
uni.navigateTo({
url: "../login/sendCode/sendCode?telNum=" + this.TelNum,
});
}
}, 1000);
},
},
};
</script>
<style lang="scss">
/deep/ .u-input__content__field-wrapper__field {
font-size: 24upx !important;
margin-left: 10upx;
}
/deep/.u-checkbox__icon-wrap--circle {
width: 25upx !important;
height: 25upx !important;
}
/deep/ .u-checkbox-label--left {
margin-top: -20rpx;
}
page {
background: url("@/static/image/home/login-bg.png") no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
}
.main {
height: 100%;
position: relative;
display: flex;
justify-content: center;
.hint {
width: 588rpx;
height: 72rpx;
background-color: rgba(157, 208, 164, 0.3);
font-size: 28rpx;
line-height: 72rpx;
text-align: center;
border-radius: 20rpx;
position: absolute;
top: 216rpx;
}
.know {
margin-top: 20upx;
font-size: 28upx;
color: rgba(255, 255, 255, 0.6);
text {
color: #699A70;
}
}
.input-box {
position: absolute;
top: 658upx;
width: 638upx;
.login-input {
height: 68upx;
background-color: rgba(255, 255, 255, 0.5);
margin-bottom: 17upx;
padding: 0 20rpx;
/deep/ .uni-input-placeholder {
padding: 0 20rpx;
}
/deep/ .uni-input-input {
color: #fff;
padding: 0 20rpx;
}
}
.close {
width: 24upx;
height: 24upx;
margin-right: 20upx;
}
}
.btn {
width: 344upx;
height: 60upx;
position: absolute;
top: 942upx;
}
.change-way {
color: #fcb462;
font-size: 28upx;
position: absolute;
top: 1068upx;
}
}
.logo {
width: 202upx;
height: 56upx;
position: absolute;
bottom: 40upx;
}</style>

@ -0,0 +1,201 @@
<template>
<view class="main">
<navBar navTitle="" :isSwitchTab="true" :color="'#000000'" :backBackGroundColor="'#3D553D'"></navBar>
<u-code :seconds="seconds" @start="start" ref="uCode"
:start-text="$t('code.start')"
:change-text="$t('code.change')"
:end-text="$t('code.end')"
@change="codeChange"></u-code>
<view class="main-word">{{$t('sendCode.title')}}</view>
<view class="sec">
<view>{{$t('sendCode.send')}}</view>
<u--text mode="phone" color="#fff" :text="telNum || newNum" format="encrypt"></u--text>
<view class="resend" @tap="getCode">{{ tips }}</view>
</view>
<view class="code-box"><u-code-input v-model="Code" :focus="focus"></u-code-input></view>
<u-button v-if="!this.token" class="btn" :text="$t('sendCode.login')" shape="circle" color="#699A70" @click="gologin" ></u-button>
<u-button v-else class="btn" :text="$t('sendCode.update')" shape="circle" color="#558BF2" @click="confirmChange" ></u-button>
<image class="logo" src="../../../static/image/home/fontree-white.png"></image>
</view>
</template>
<script>
export default {
data() {
return {
tips: "",
// refCode: null,
seconds: 60,
wathTime: 10,
Code: "",
focus: false,
telNum: "",
token: "",
newNum: "",
};
},
mounted() {
if (this.telNum) {
this.getCode();
} else {
this.getNewCode();
}
},
onLoad(options) {
this.telNum = options.telNum;
this.token = options.token;
this.newNum = options.newNum;
},
methods: {
codeChange(text) {
this.tips = text;
},
async getCode() {
if (this.$refs.uCode.canGetCode) {
uni.showLoading({
title: this.$t("sendCode.loading"),
});
let res = await this.$api.login.sendCode({ telNum: this.telNum });
if (res.status === 0) {
uni.hideLoading();
// this.start()
this.focus = true;
this.$refs.uCode.start();
//
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
} else {
uni.$u.toast(this.$t("sendCode.toast"));
}
},
async getNewCode() {
if (this.$refs.uCode.canGetCode) {
uni.showLoading({
title: this.$t("sendCode.loading"),
});
let res = await this.$api.login.sendNewCode({ token: this.token });
if (res.status === 0) {
uni.hideLoading();
// this.start()
this.focus = true;
this.$refs.uCode.start();
//
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
} else {
uni.$u.toast(this.$t("sendCode.toast"));
}
},
async gologin() {
let data = {
telNum: this.telNum,
password: "",
code: this.Code,
};
let res = await this.$api.login.login(data);
if (res.status === 0) {
this.$common.msgToast(this.$t("login.success"), null, "success");
uni.setStorageSync("mall-user-info", res.data.accountInfo);
uni.setStorageSync("mall_token", res.data.token);
let returnUrl = uni.getStorageSync("return_url");
if (returnUrl) {
uni.reLaunch({
url: returnUrl,
});
}
uni.navigateTo({
url: "/pages/login/welcome/welcome",
});
} else {
this.$common.msgToast(res.msg || this.$t("login.error"), null, "error");
}
},
async confirmChange() {
let data = {
code: this.Code,
};
let res = await this.$api.login.confirmNew(data);
if (res.status === 0) {
this.$common.msgToast(
this.$t("sendCode.updateSuccess"),
null,
"success"
);
uni.removeStorageSync("mall-user-info");
uni.removeStorageSync("mall_token");
setTimeout(() => {
uni.reLaunch({
url: "/pages/login/login",
});
}, 1000);
} else {
uni.$u.toast(res.msg || this.$t("sendCode.updateError"));
}
},
start() {
uni.$u.toast(this.$t("sendCode"));
},
},
};
</script>
<style lang="scss">
page {
background: url('@/static/image/home/login-bg.png') no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
}
.main {
height: 100%;
position: relative;
display: flex;
justify-content: center;
.main-word {
color: #fff;
position: absolute;
font-size: 40upx;
font-weight: bold;
top: 274upx;
}
.sec {
color: #fff;
position: absolute;
display: flex;
top: 380upx;
.resend {
margin-left: 20upx;
color: #fcb462;
}
}
.code-box {
position: absolute;
top: 554upx;
}
.btn {
width: 344upx;
height: 60upx;
position: absolute;
top: 742upx;
}
/deep/ .u-code-input__item {
border: 0;
border-radius: 20upx;
background-color: rgba(255, 255, 255, 0.65);
}
.logo {
width: 202upx;
height: 56upx;
position: absolute;
bottom: 40upx;
}
}
</style>

@ -0,0 +1,134 @@
<template>
<view>
<image src="@/static/image/home/new_line.png" mode="" class="line"></image>
<image
src="@/static/image/home/new_flower.png"
mode=""
class="flower"
></image>
<view class="text">{{ $t("welcome.toHome") }}</view>
<!-- <view class="title-one">- - -{{$t('welcome.title')}}- - -</view> -->
<!-- <image class="img" src="@/static/image/home/fonchain.png"></image> -->
<image class="logo" src="@/static/image/home/fontree-white.png"></image>
<u-loading-page
loading-text="请在微信浏览器中打开"
:loading="loading"
></u-loading-page>
</view>
</template>
<script>
export default {
data() {
return {
loading: false,
};
},
onShow() {
// if (this.loading) return;
setTimeout(() => {
uni.reLaunch({
url: uni.getStorageSync("login-redirect") || "/pages/index/index",
success: () => {
uni.setStorageSync("collectionsDetail", true);
if (uni.getStorageSync("login-redirect")) {
uni.removeStorageSync("login-redirect");
}
},
});
}, 3000);
},
onLoad(params) {
// openid
if (params) {
uni.setStorageSync("openid_code", params.code);
uni.setStorageSync("openid_state", params.state);
}
let ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") {
let openid_code = uni.getStorageSync("openid_code");
if (!openid_code) {
const apiUrl = "https://appointteam.szjixun.cn/";
window.location.href = `${apiUrl}api/appointment/auth/wx?time=${Math.random()}&notifyUrl=${encodeURIComponent(
window.location.href
)}`;
} else {
this.handleOpenId();
}
} else {
this.loading = true;
}
},
methods: {
async handleOpenId() {
let params = {
code: uni.getStorageSync("openid_code"),
state: uni.getStorageSync("openid_state"),
};
await this.$api.login
.getOpenId(params)
.then((res) => {
if (res.status === 0) {
uni.setStorageSync("openId", res.data.openId);
}
})
.catch((err) => {});
},
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/welcome-bg.png") no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
// border: 1px solid red;
}
.line {
width: 2rpx;
height: 164rpx;
position: absolute;
left: 50%;
top: 0;
transform: translateX(-50%);
}
.flower {
width: 43rpx;
height: 43rpx;
position: absolute;
left: 47%;
top: 167rpx;
// transform: translateX(-50%);
animation: fadenum 1s infinite;
}
@keyframes fadenum {
100% {
transform: rotate(360deg);
}
}
.text {
position: absolute;
// left: 37%;
top: 227rpx;
width: 100%;
text-align: center;
}
.title-one {
color: #558bf2;
position: absolute;
font-size: 33upx;
// left: 26%;
top: 600rpx;
width: 100%;
text-align: center;
}
.logo {
width: 202rpx;
height: 56rpx;
position: absolute;
top: 92rpx;
left: 46rpx;
}
</style>

@ -0,0 +1,557 @@
<template>
<view>
<navBar
:navTitle="seriesName"
:stickyShow="stickyShow"
:color="'#000000'"
:backBackGroundColor="'#699A70'"
>
</navBar>
<view class="top-img">
<image :src="collectionImg"></image>
</view>
<view
class=""
style="margin: auto; width: 500rpx"
v-if="physical && status === 2"
>
<u-button
type="primary"
:text="$t('apply.logistics')"
class="apply"
@click="apply"
></u-button>
</view>
<view class="info-box">
<view class="title">{{ $t("logistics.info") }}</view>
<view class="address-box">
<view class="item">
<text class="label">{{ $t("telephone") }}</text>
<text class="value" @click="goPhone">(852) 5491 1547</text>
</view>
</view>
<view class="address-box" v-if="status > 3">
<view class="item bm">
<text class="label">{{ $t("consignee.name") }}</text>
<text class="value">{{ express.name }}</text>
</view>
<view class="item bm">
<text class="label">{{ $t("consignee.address") }}</text>
<text class="value">{{ express.address }}</text>
</view>
<view class="item">
<text class="label">{{ $t("consignee.phone") }}</text>
<text class="value">{{ express.telNum }}</text>
</view>
</view>
</view>
<view class="info-box">
<view class="title">{{ $t("realHashTitle") }}</view>
<view class="box">
<view class="item">
<text class="label">{{ $t("realHash") }}</text>
<text class="value">{{ realHash }}</text>
</view>
</view>
</view>
<view class="info-box">
<view class="title">{{ $t("release.info") }}</view>
<view class="box">
<view class="item">
<text class="label">{{ $t("series.issuer") }}</text>
<text class="value">{{ detail.publisher || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("release.time") }}</text>
<text class="value">{{ detail.published_time || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("brand.side") }}</text>
<text class="value">{{ detail.brand_name || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("series.hash") }}</text>
<text class="value">{{ detail.brand_hash || "-" }}</text>
</view>
</view>
</view>
<view class="info-box">
<view class="title">{{ $t("circulation.info") }}</view>
<view class="detail">
<view class="item" v-for="(item, index) in flows" :key="index">
<view class="left">
{{ item.createdAt }}
<!-- <view class="" style="font-size: 10rpx;">
星期二 下午 5:07
</view> -->
</view>
<view class="right">
<view class="cricle2" v-if="item.status === 1"></view>
<view class="cricle" v-else></view>
<view class="item">
<text class="label">{{ $t("possessor") }}</text>
<text class="value">{{ item.holdName || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.status") }}</text>
<text class="value">{{
item.status == 1 ? $t("in.library") : $t("been.applied")
}}</text>
</view>
<view class="item">
<text class="label">{{ $t("circulation.type") }}</text>
<text class="value">{{
item.type == 1 ? $t("on.line") : "-"
}}</text>
</view>
<view class="item">
<text class="label">{{ $t("circulation.time") }}</text>
<text class="value">{{ item.createdAt || "-" }}</text>
</view>
<view class="item" v-if="item.flowHash">
<text class="label">{{ $t("transaction.hash") }}</text>
<text class="value" style="font-size: 24rpx">{{
item.flowHash || "-"
}}</text>
</view>
</view>
</view>
</view>
</view>
<view class="" style="text-align: center; margin-top: 30rpx">
<image src="@/static/image/home/fontree.png" mode="" class="logo"></image>
</view>
<u-popup
:show="showApply"
mode="center"
@close="closeApply"
bgColor="transparent"
>
<view class="popup-top"> *{{ $t("apply.tips") }} </view>
<view class="popup-box">
<view class="title">{{ $t("input.address") }}</view>
<view class="">
<view class="input-box">
<view class="label">{{ $t("consignee.name") }}</view>
<view class="input">
<u--input
border="none"
shape="circle"
v-model="name"
:placeholder="$t('input.pla')"
></u--input>
</view>
</view>
<view class="input-box">
<view class="label">{{ $t("consignee.address") }}</view>
<view class="input">
<u--textarea
v-model="address"
border="none"
:placeholder="$t('input.pla')"
autoHeight
></u--textarea>
</view>
</view>
<view class="input-box">
<view class="label">{{ $t("consignee.phone") }}</view>
<view class="input">
<u--input
border="none"
shape="circle"
v-model="telNum"
:placeholder="$t('input.pla')"
></u--input>
</view>
</view>
</view>
</view>
<view class="btns">
<u-button
:text="$t('navbar.back')"
color="#EDC466"
@click="closeApply"
style="width: 260rpx; height: 56rpx; border-radius: 40rpx"
></u-button>
<u-button
:text="$t('apply.btn')"
color="#699A70"
@click="applyCom"
style="width: 260rpx; height: 56rpx; border-radius: 40rpx"
></u-button>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
return {
stickyShow: false,
showApply: false,
address: "",
name: "",
telNum: "",
CollectionsUID: "",
express: {},
flows: [],
detail: {},
seriesName: "",
collectionImg: "",
ID: "",
status: "",
realHash: "",
physical: "",
//(1- 2- 3-4-5 6-退)
};
},
onPageScroll(e) {
this.stickyShow = e.scrollTop > 5 ? true : false;
},
onShow() {
console.log(11111111, this.flows);
},
methods: {
apply() {
this.showApply = true;
},
closeApply() {
this.showApply = false;
this.name = "";
this.address = "";
this.telNum = "";
},
async applyCom() {
let name = this.$common.vefEmpty(
this.name,
this.$t("error.consignee.name")
);
let address = this.$common.vefEmpty(
this.address,
this.$t("error.consignee.address")
);
let telNum = this.$common.vefEmpty(
this.telNum,
this.$t("error.consignee.phone")
);
if (!name || !address || !telNum) return;
let data = {
ID: Number(this.ID),
express: {
address: this.address,
name: this.name,
telNum: this.telNum,
},
};
let res = await this.$api.mine.paymentApproval(data);
if (res.status === 0) {
uni.$u.toast(this.$t("apply.succes"));
this.status = 4;
this.express = res.data.express;
this.flows = res.data.flows;
} else {
uni.$u.toast(this.$t("apply.error"));
}
this.showApply = false;
this.name = "";
this.address = "";
this.telNum = "";
},
goPhone(val) {
//
uni.makePhoneCall({
phoneNumber: val,
});
},
async getDetail() {
let data = {
CollectionsUID: this.CollectionsUID,
};
let res = await this.$api.mine.certDetail(data);
if (res.status === 0) {
this.detail = res.data;
} else {
uni.$u.toast(this.$t("load.failed"));
}
},
},
onLoad(option) {
const item = JSON.parse(decodeURIComponent(option.data));
this.CollectionsUID = item.CollectionsUID;
this.physical = item.physical;
this.ID = item.payDetail.ID;
this.express = item.payDetail.express;
this.flows = item.payDetail.flows;
this.status = item.payDetail.status;
this.realHash = item.payDetail.realHash;
this.collectionImg = item.collectionImg;
console.log(this.collectionImg);
this.seriesName = item.seriesName;
this.getDetail();
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/detail-kind-bg.png") no-repeat;
// background-size: 100% 100%;
// background-attachment:fixed;
// height: 100vh;
}
.top-img {
background-repeat: no-repeat;
background-size: contain;
width: 660rpx;
height: 660rpx;
border-radius: 8rpx;
margin: 44rpx 44rpx 32rpx 46rpx;
position: relative;
image {
width: 100%;
height: 100%;
}
}
.apply {
width: 500rpx;
height: 60rpx;
border-radius: 40rpx !important;
// background: #558BF2;
background: #699a70;
border-color: #699a70;
margin-bottom: 30rpx;
}
.info-box {
margin: 0 44rpx 0 46rpx;
margin-bottom: 46rpx;
border-radius: 8rpx;
// padding: 38rpx 32rpx;
position: relative;
.title {
text-align: center;
font-size: 32rpx;
margin-bottom: 30rpx;
color: #434343;
}
.box {
// background: rgba(255,255,255,0.3);
background: #ffffff;
padding: 24rpx 32rpx;
border-radius: 8rpx;
.item {
display: flex;
margin: 32rpx 0;
font-size: 20rpx;
.label {
color: #434343;
padding-right: 40rpx;
width: 130rpx;
}
.value {
color: #878787;
width: 450rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
word-break: break-all;
white-space: normal;
}
}
}
.address-box {
// background: rgba(255,255,255,0.3);
background: #ffffff;
padding: 24rpx 32rpx;
margin-top: 30rpx;
border-radius: 8rpx;
.bm {
border-bottom: 1px solid #dedede;
padding-bottom: 20rpx;
}
.item {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin: 15rpx 0;
font-size: 20rpx;
.label {
padding-right: 40rpx;
width: 150rpx;
font-size: 28rpx;
color: #434343;
}
.value {
text-align: right;
width: 400rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
word-break: break-all;
white-space: normal;
color: #878787;
}
}
}
.detail {
// background: rgba(255,255,255,0.3);
padding: 24rpx 32rpx;
background: #ffffff;
margin-top: 30rpx;
.item {
display: flex;
}
.left {
font-size: 16rpx;
padding-right: 30rpx;
color: #434343;
}
.right {
border-left: 1rpx solid #464646;
padding: 0 30rpx;
position: relative;
.item {
margin-bottom: 30rpx;
}
.label {
color: #434343;
padding-right: 20rpx;
width: 130rpx;
}
.value {
color: #434343;
width: 260rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
word-break: break-all;
white-space: normal;
}
.cricle {
width: 22rpx;
height: 22rpx;
border-radius: 50%;
position: absolute;
top: 0;
left: -14rpx;
background: #e4e4e4;
}
.cricle2 {
width: 21rpx;
height: 21rpx;
border-radius: 50%;
position: absolute;
top: 0;
left: -13rpx;
background: #699a70;
border: 1px solid #699a70;
}
}
}
}
.logo {
margin-top: 10rpx;
width: 202rpx;
height: 56rpx;
margin-bottom: 40rpx;
}
.popup-box {
background: rgba(0, 0, 0, 0.8);
width: 582rpx;
overflow: hidden;
padding: 30rpx 0;
.title {
font-size: 40rpx;
text-align: center;
margin-top: 30rpx;
margin-bottom: 100rpx;
}
.input-box {
display: flex;
justify-content: space-between;
// align-items: center;
padding: 0 34rpx 34rpx 38rpx;
.label {
font-size: 28rpx;
}
.input {
width: 340rpx;
display: flex;
align-items: center;
/deep/ .input-placeholder {
font-size: 24rpx;
text-align: right;
}
/deep/ .uni-input-input {
font-size: 24rpx;
color: #fff;
text-align: right;
}
/deep/ .u-textarea {
background: transparent;
width: 340rpx;
padding: 0;
text-align: right;
}
/deep/ .u-textarea__field {
color: #ffffff;
}
}
}
}
.btns {
display: flex;
justify-content: space-around;
margin-top: 30rpx;
}
.popup-top {
width: 582rpx;
padding: 22rpx 0;
background: rgba(255, 255, 255, 0.3);
font-size: 32rpx;
text-align: center;
margin-bottom: 30rpx;
}
</style>

@ -0,0 +1,189 @@
<template>
<view class="main">
<navBar navTitle="" :hasLogo="true" :hasRight="true" :backToUrl="'/pages/mine/setting/setting'"
@clickRight="clickRight" :color="'#000000'" :backBackGroundColor="'#3D553D'" />
<u-code :seconds="seconds" @start="start" ref="uCode"
:start-text="$t('code.start')"
:change-text="$t('code.change')"
:end-text="$t('code.end')"
@change="codeChange"></u-code>
<view class="info">
<view class="item">
<view class="lable">{{$t('phone.old')}}</view>
<view class="gray">{{ telNum }}</view>
</view>
<u-divider></u-divider>
<view class="item">
<view class="lable">{{$t('phone.code')}}</view>
<view style="margin-left: 30upx;">
<u--input style="width: 130upx;" border="none" v-model="code" type="number"></u--input>
</view>
<view class="resend" @tap="getCode">{{ tips }}</view>
</view>
</view>
<view style="color: #717171; text-align: right;font-size: 10rpx;margin-right:56rpx;margin-top:16rpx">*{{$t('update.phone.title')}}</view>
<view class="info" style="height: 120upx;">
<view class="item">
<view class="lable">{{$t('phone.new')}}</view>
<view style="margin-left: 30upx;">
<u--input style="width: 200upx; color:#878787" :placeholder="$t('input.pla')" border="none" v-model="newTelNum" type="number"></u--input>
</view>
</view>
</view>
<u-button :text="$t('save.update')" color="#699A70" @click="changePhone" class="btn" style=""></u-button>
</view>
</template>
<script>
export default {
data() {
return {
tips: '',
// refCode: null,
seconds: 60,
wathTime: 10,
code: '',
focus: false,
telNum: '',
newTelNum: ''
};
},
onLoad(opt) {
this.telNum = opt.telNum
},
methods: {
cancel() {
uni.navigateTo({
url: '/pages/mine/setting/setting'
});
},
codeChange(text) {
this.tips = text;
},
async getCode() {
if (this.$refs.uCode.canGetCode) {
uni.showLoading({
title: this.$t('sendCode.loading')
});
let res = await this.$api.mine.mineCode();
if (res.status === 0) {
uni.hideLoading();
// this.start()
this.focus = true;
this.$refs.uCode.start();
//
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
} else {
uni.$u.toast(this.$t('sendCode.toast'));
}
},
start() {
uni.$u.toast(this.$t('sendCode'));
},
async changePhone(){
if(!this.code || !this.newTelNum){
uni.$u.toast(this.$t('input.phoneCode'));
return
}
let data = {code:this.code,newTelNum:this.newTelNum}
let res = await this.$api.mine.verifyCode(data);
if (res.status === 0) {
uni.navigateTo({
url: '/pages/login/sendCode/sendCode?token='+res.data.token+'&newNum='+this.newTelNum
});
} else {
uni.$u.toast(res.msg);
}
}
}
};
</script>
<style lang="scss">
page {
background: url('@/static/image/home/new_bg.png') no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
position: relative;
}
.main {
display: grid;
justify-content: center;
/deep/.uni-input-input{
color: #878787;
}
.title {
margin-top: 40upx;
display: flex;
justify-content: center;
image {
width: 201upx;
height: 60upx;
}
}
.btn {
height: 56rpx;
width: 600upx;
border-radius: 40rpx;
margin-top: 30rpx;
position: absolute;
bottom: 120upx;
left: 10%;
}
.cancel {
text-align: center;
height: 56rpx;
width: 600upx;
border-radius: 40rpx;
margin-top: 30rpx;
position: absolute;
bottom: 40upx;
left: 10%;
}
}
.info {
box-sizing: border-box;
border-radius: 8rpx;
width: 650upx;
height: 218upx;
background: #FFFFFF;
margin: 65rpx 50rpx 0 50rpx;
padding: 0 65rpx 0 65rpx;
.item {
font-size: 30upx;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 40upx;
.rz {
margin-left: 10upx;
font-size: 28rpx;
background-color: #558bf2;
width: 60upx;
border-radius: 40upx;
padding: 0upx 20upx 4upx 20upx;
}
}
.lable{
color: #434343;
}
.gray {
color: #878787;
}
/deep/ .u-input__content__field-wrapper__field {
color: #fff !important;
}
.resend {
color: #699A70;
}
}
</style>

@ -0,0 +1,223 @@
<template>
<view>
<navBar
navTitle=""
:hasLogo="true"
:backToUrl="'/pages/index/index'"
:isSwitchTab="true"
:color="'#000000'" :backBackGroundColor="'#3D553D'"
></navBar>
<view class="info">
<view class="head">
<view class="title">{{ $t("payInfo.title") }}</view>
<view class="user"
>{{ $t("payInfo.subtxt1") }}<span style="color:#699A70">{{ payInfo.buyerTel }}</span
>{{ $t("payInfo.subtxt2") }}</view
>
</view>
<view class="item">
<view class="min160">{{ $t("payInfo.confirmDate") }}</view>
<view class="lable">{{ today }}</view>
</view>
<view class="item">
<view class="min160">{{ $t("payInfo.buyerName") }}</view>
<view class="lable">{{ payInfo.buyerName }}</view>
</view>
<view class="item">
<view class="min160">{{ $t("payInfo.orderPrice") }}</view>
<view class="lable">{{ payInfo.price }}</view>
</view>
<view class="item">
<view class="min160">{{ $t("payInfo.artworkName") }}</view>
<view class="lable">{{ payInfo.artworkName }}</view>
</view>
<view class="item">
<view class="min160">{{ $t("payInfo.payTypeName") }}</view>
<view class="lable">{{ payInfo.payTypeName }}</view>
</view>
<view class="item">
<view class="min160">{{ $t("payInfo.payImages") }}</view>
<view class="imgBox">
<u--image
v-for="(item, index) in payInfo.payImages"
width="300rpx"
height="300rpx"
:key="index"
:src="item"
@click="privewImg(item)"
mode="scaleToFill"
></u--image>
</view>
</view>
</view>
<u-button
:text="$t('comfrim')"
color="#699A70"
@click="comfirmPayment"
style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 60rpx;
"
></u-button>
<u-button
:text="$t('payment.cancel')"
color="#808080"
@click="cancelPayment"
style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 20rpx;
"
></u-button>
</view>
</template>
<script>
export default {
data() {
return {
infoCode: "",
collectionsInfo: {},
payInfo: {},
today: "",
};
},
methods: {
//
async getCodeInfo() {
let data = {
code: this.infoCode,
};
let res = await this.$api.series.getQrcodeInfo(data);
if (res.status === 0) {
this.collectionsInfo = res.data.collections;
this.payInfo = res.data.pay;
} else {
uni.$u.toast(this.$t("load.failed"));
}
},
//
async comfirmPayment() {
let data = {
code: this.infoCode,
};
let res = await this.$api.series.confirmPay(data);
if (res.status === 0) {
uni.$u.toast(this.$t("payment.confirmSuccess"));
setTimeout(() => {
uni.switchTab({
url: "/pages/index/index",
});
}, 2000);
} else {
uni.$u.toast(res.msg || this.$t("payment.failed"));
}
},
//
async cancelPayment() {
let data = {
code: this.infoCode,
};
let res = await this.$api.series.cancelPay(data);
if (res.status === 0) {
uni.$u.toast(this.$t("payment.cancelSuccess"));
setTimeout(() => {
uni.switchTab({
url: "/pages/index/index",
});
}, 2000);
} else {
uni.$u.toast(res.msg || this.$t("payment.failed"));
}
},
//
privewImg(url) {
uni.previewImage({
urls: [url],
});
},
},
onLoad: function (option) {
this.infoCode = option.code;
this.getCodeInfo();
//
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
this.today = year + "年" + month + "月" + day + "日";
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/new_bg.png") no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
// border: 1px solid red;696.1123
display: flex;
justify-content: center;
}
.min160 {
min-width: 160rpx;
color: #434343;
}
//
.info {
width: 600rpx;
height: 1100rpx;
margin-top: 60rpx;
border-radius: 8rpx;
display: flex;
flex-direction: column;
background-color: #FFFFFF;
padding: 40rpx;
box-sizing: border-box;
overflow-y: scroll;
.head {
text-align: center;
}
.title {
margin-top: 44rpx;
font-size: 40rpx;
color: #434343;
}
.lable{
color: #878787;
}
.user {
font-size: 16rpx;
color: #878787;
margin-bottom: 66rpx;
}
.content {
font-size: 24rpx;
color: #fff;
text-align: center;
line-height: 40rpx;
}
.item {
font-size: 30upx;
width: 400rpx;
display: flex;
margin-bottom: 40upx;
.imgBox {
width: 300rpx;
height: 300rpx;
border: 1px solid #fff;
margin-left: 20rpx;
}
.image {
width: 300rpx;
height: 300rpx;
}
}
}
</style>

@ -0,0 +1,405 @@
<template>
<view>
<navBar
:navTitle="collectionsDetail.name"
:stickyShow="stickyShow"
:color="'#000000'"
:backBackGroundColor="'#699A70'"
></navBar>
<view class="top-img">
<image :src="collectionsDetail.coverImg"></image>
</view>
<view
class="title-t"
:style="{ fontSize: '36rpx', color: '#434343', fontWeight: 600 }"
>{{ $t("basic.info") }}</view
>
<view class="info-box" style="padding: 28rpx 32rpx 4rpx 32rpx">
<view class="item">
<text class="label">{{ $t("series.name") }}</text>
<text class="value">{{ payDetail.seriesName }}</text>
</view>
<view class="item">
<text class="label">{{ $t("series.issuer") }}</text>
<text class="value">{{ payDetail.senderName }}</text>
</view>
<view class="item">
<text class="label">{{ $t("series.time") }}</text>
<text class="value">{{ payDetail.createdAt }}</text>
</view>
<view class="item">
<text class="label">{{ $t("series.price") }}</text>
<text class="value">
<text v-if="collectionsDetail.currencyType === 'normal'">{{
symbol
}}</text>
<image
src="@/static/image/home/jifen.png"
mode="scaleToFill"
style="width: 24rpx; height: 24rpx"
v-else
/>
{{ payDetail.price }}
<!-- <text v-if="payDetail.payType === 6">{{
$t("airdrop")
}}</text> -->
</text>
</view>
<!-- <view class="item">
<text class="label">{{$t('series.No')}}</text>
<text class="value">{{payDetail.payNum}}</text>
</view> -->
<view class="item">
<text class="label">{{ $t("series.hash") }}</text>
<text class="value">{{ payDetail.artworkHash }}</text>
</view>
</view>
<view class="title-t">{{ $t("collection.info") }}</view>
<view class="info-box" style="padding: 28rpx 32rpx">
<view class="item">
<text class="label">{{ $t("collection.name") }}</text>
<text class="value">{{ collectionsDetail.name || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.type") }}</text>
<text class="value">{{ collectionsDetail.collectionType || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.size") }}</text>
<text class="value">{{ collectionsDetail.size || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.specs") }}</text>
<text class="value">{{ collectionsDetail.specs || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.address") }}</text>
<text class="value">{{ collectionsDetail.address || "-" }}</text>
</view>
<view class="item">
<text class="label">{{ $t("collection.intro") }}</text>
<view class="des">{{ collectionsDetail.intro || "-" }}</view>
</view>
</view>
<view
class="title-t"
:style="{ fontSize: '36rpx', color: '#434343', fontWeight: 600 }"
>{{ $t("collection.detail") }}</view
>
<view class="detail-info">
<!-- <view class="title-t">{{$t('collection.sell')}}</view>
<view class="box-item">
<image v-for="item in sellPoint" :key="item" :src="item" mode="widthFix"></image>
</view> -->
<view v-if="collDetails.length > 0" class="title-t">{{
$t("collection.sellDec")
}}</view>
<view v-if="collDetails.length > 0" class="box">
<image
v-for="item in collDetails"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
<view v-if="companyInfo.length > 0" class="title-t">{{
$t("collection.company")
}}</view>
<view v-if="companyInfo.length > 0" class="box">
<image
v-for="item in companyInfo"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
<view v-if="copyright.length > 0" class="title-t">{{
$t("collection.copyight")
}}</view>
<view v-if="copyright.length > 0" class="box">
<image
v-for="item in copyright"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
<view v-if="Blockchain.length > 0" class="title-t">{{
$t("collection.blockchain")
}}</view>
<view v-if="Blockchain.length > 0" class="box">
<image
v-for="item in Blockchain"
:src="item"
:key="item"
mode="widthFix"
class="img"
></image>
</view>
</view>
<view class="" style="text-align: center; margin-top: 30rpx">
<image
src="@/static/image/home/fontree.png"
mode="aspectFit"
class="logo"
></image>
</view>
<image
src="../../../static/image/mine/cert.png"
@click="goCert"
mode=""
class="cert-img"
></image>
</view>
</template>
<script>
export default {
data() {
return {
stickyShow: false,
ID: 0,
collectionsDetail: {},
sellPoint: [],
collDetails: [],
companyInfo: [],
copyright: [],
Blockchain: [],
payDetail: {},
allImgList: [],
symbol:
uni.getLocale() === "en"
? "$"
: uni.getLocale() === "zh-Hant"
? "HK$"
: "¥",
};
},
onPageScroll(e) {
this.stickyShow = e.scrollTop > 5 ? true : false;
},
methods: {
goCert() {
console.log(this.collectionsDetail.coverImg);
let data = {
CollectionsUID: this.collectionsDetail.collectionUID,
collectionImg: this.collectionsDetail.coverImg,
seriesName: this.collectionsDetail.name,
physical: this.collectionsDetail.physical,
payDetail: this.payDetail,
};
uni.navigateTo({
url:
"/pages/mine/cert/cert?data=" +
encodeURIComponent(JSON.stringify(data)),
});
},
async getDetail() {
let data = {
ID: Number(this.ID),
};
let res = await this.$api.mine.paymentDetail(data);
if (res.status === 0) {
this.collectionsDetail = res.data.collections;
this.payDetail = res.data.pay;
(this.allImgList = this.collectionsDetail.cutImg
? JSON.parse(this.collectionsDetail.cutImg)
: []),
this.cutImg();
} else {
uni.$u.toast(this.$t("load.failed"));
}
},
cutImg() {
this.allImgList.forEach((v) => {
if (Array.isArray(v.imgs)) {
v.imgs = v.imgs.filter((img) => {
if (img) {
return img;
}
});
}
});
this.allImgList.forEach((v) => {
if (v.label === "卖点") {
this.sellPoint = v.imgs;
} else if (v.label === "藏品细节") {
this.collDetails = v.imgs;
} else if (v.label === "工艺/公司介绍") {
this.companyInfo = v.imgs;
} else if (v.label === "版权声明") {
this.copyright = v.imgs;
} else if (v.label === "区块链说明") {
this.Blockchain = v.imgs;
}
});
},
},
onLoad(option) {
this.ID = option.ID;
this.artworkUid = option.artworkUid;
},
onShow() {
this.getDetail();
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/detail-kind-bg.png") no-repeat;
// background-size: 100% 100%;
// background-attachment:fixed;
// height: 100vh;
}
.fixed-box {
position: fixed;
bottom: 0;
width: 100%;
height: 172rpx;
background: #3e3e3e;
z-index: 10;
.btn {
display: flex;
padding: 42rpx 38rpx;
}
.back {
width: 172rpx;
height: 56rpx;
border-radius: 40rpx;
background: #efba42;
margin-right: 30rpx;
}
.buyer {
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
background: #558bf2;
}
}
.top-img {
// background: url('../../../static/image/home/box.png') no-repeat;
background-repeat: no-repeat;
background-size: contain;
width: 660rpx;
height: 660rpx;
border-radius: 8rpx;
margin: 44rpx 44rpx 32rpx 46rpx;
position: relative;
.price {
font-size: 48rpx;
position: absolute;
bottom: 10rpx;
left: 50%;
transform: translateX(-50%);
}
image {
width: 100%;
height: 100%;
}
}
.box-item {
background: rgba(255, 255, 255, 0.3);
// margin: 0 44rpx 0 46rpx;
image {
width: 100%;
// height: 198rpx;
display: block;
}
}
.detail-info {
// background: rgba(0,0,0,0.8);
background: #ffffff;
border-radius: 8rpx;
margin: 30rpx;
padding: 23rpx;
.box {
// margin: 0 44rpx 0 46rpx;
margin-bottom: 46rpx;
background: rgba(255, 255, 255, 0.3);
border-radius: 8rpx;
// padding: 38rpx 32rpx;
position: relative;
.item-img {
width: 234rpx;
height: 234rpx;
border-radius: 8rpx;
position: absolute;
top: 38rpx;
right: 32rpx;
}
.img {
width: 100%;
display: block;
}
}
}
.title-t {
text-align: center;
margin: 40rpx 0 16rpx 0;
color: #434343;
}
.info-box {
margin: 0 44rpx 0 46rpx;
margin-bottom: 46rpx;
background: #ffffff;
// background: rgba(11, 0, 0, 0.3);
border-radius: 8rpx;
// padding: 38rpx 32rpx;
position: relative;
.item {
display: flex;
font-size: 20rpx;
margin-bottom: 32rpx;
.label {
color: #434343;
padding-right: 40rpx;
width: 130rpx;
}
.value {
color: #878787;
width: 450rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
word-break: break-all;
white-space: normal;
}
.des {
color: #878787;
width: 450rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
word-break: break-all;
white-space: normal;
font-size: 20rpx;
}
}
.img {
width: 100%;
}
}
.logo {
margin-top: 10rpx;
width: 202rpx;
height: 56rpx;
margin-bottom: 40rpx;
}
.cert-img {
position: fixed;
right: 40rpx;
bottom: 25vh;
width: 84rpx;
height: 84rpx;
}
</style>

@ -0,0 +1,100 @@
<template>
<u-popup :show="isShow" mode="center" bgColor="transparent" @close="close">
<view class="popupLocale-box">
<view class="title">{{ $t('problem.feedback') }}</view>
<view class="item">
<u--textarea height="340" v-model="content" :placeholder="$t('set.input')" maxlength="200" count
border="none"></u--textarea>
</view>
</view>
<view style="display: flex;">
<u-button :text="$t('navbar.back')" color="#EDC466" @click="close"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
<u-button :text="$t('sumbit')" color="#699A70" @click="sendFeedBack"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
</view>
</u-popup>
</template>
<script>
export default {
data() {
return {
content: '',
isShow: false
}
},
props: ['showQa'],
watch: {
showQa() {
this.isShow = this.showQa
}
},
methods: {
async sendFeedBack() {
let res = await this.$api.mine.feedBack({
content: this.content
});
if (res.status === 0) {
this.$common.msgToast(res.msg, null, 'success');
this.show = false
this.content = ''
} else {
uni.$u.toast(res.msg);
}
},
close() {
this.$emit('closeFeed', false)
}
}
}
</script>
<style lang="scss" >
.popupLocale-box {
background: rgba(0, 0, 0, 0.8);
width: 582rpx;
overflow: hidden;
padding: 30rpx 42rpx;
.title {
font-size: 40rpx;
text-align: center;
margin-bottom: 40rpx;
}
.u-button {
width: 260rpx;
height: 56rpx;
border-radius: 40rpx;
}
.item {
display: flex;
align-items: center;
justify-content: center;
padding: 34rpx 0 38rpx 0;
}
.tips {
color: #DC0023;
font-size: 20rpx;
text-align: center;
margin-top: 80rpx;
}
/deep/ .u-textarea__count {
background-color: transparent !important;
color: #000000;
}
/deep/ .uni-textarea-textarea {
color: #fff;
}
/deep/ .u-textarea {
background-color: rgba(255, 255, 255, 0.5);
}
}
</style>

@ -0,0 +1,849 @@
<template>
<view v-show="showPage">
<tabBar :currentPage="'pages/mine/index'"></tabBar>
<view class="logo">
<image src="../../static/image/home/fontree.png" mode="" class="img"></image>
</view>
<scroll-view scroll-y :scroll-anchoring="true" :style="'height:' + listHeight + 'px;'">
<view class="user-box">
<u-avatar :src="userInfo.avatar" class="avatar" size="75" fontSize="18" bg-color="#558BF2"></u-avatar>
<view class="info">
<view class="username">{{ userInfo.nickName }}</view>
<view class="blockchain">{{ $t("mine.blockchain") }}{{ userInfo.account }}</view>
</view>
</view>
<view class="mine-icon">
<view class="message" @click="goMess">
<u-badge v-if="notReadNum > 0" class="point" numberType="overflow" max="99" :value="notReadNum">
</u-badge>
<image src="../../static/image/mine/message-icon.png" mode="" style="width: 60rpx; height: 60rpx">
</image>
<view class="value">{{ $t("mine.message") }}</view>
</view>
<view class="scan" @click="goScan" v-if="canScan">
<image src="../../static/image/mine/scan-icon.png" mode="" style="width: 60rpx; height: 60rpx"></image>
<view class="value">{{ $t("mine.scan") }}</view>
</view>
<view @click="goLang" class="tag">
<image src="../../static/image/mine/language.png" mode="" style="width: 60rpx; height: 60rpx"></image>
<view class="value">{{ $t("mine.language") }}</view>
</view>
<view class="setting" @click="goSets">
<image src="../../static/image/mine/setting-icon.png" mode="" style="width: 60rpx; height: 60rpx">
</image>
<view class="value">{{ $t("mine.setting") }}</view>
</view>
</view>
<view class="his-title-text">
<view>我的历史购买记录</view>
<view class="line"></view>
</view>
<view class="his-box">
<view class="item" v-for="(item, index) in paymentList" :key="index"
@click="goDetail(item.ID, item.artworkUid)">
<image src="../../static/image/mine/icon-logo1.png" v-if="item.artworkLevel == 'D'" mode=""
class="icon"></image>
<image src="../../static/image/mine/icon-logo2.png" v-if="item.artworkLevel == 'C'" mode=""
class="icon"></image>
<image src="../../static/image/mine/icon-logo3.png" v-if="item.artworkLevel == 'B'" mode=""
class="icon"></image>
<image src="../../static/image/mine/icon-logo4.png" v-if="item.artworkLevel == 'A'" mode=""
class="icon"></image>
<image :src="item.coverImg || item.artworkImg" mode="" class="img"> </image>
<view class="contentD content" v-if="item.artworkLevel == 'D'">{{
item.artworkName
}}</view>
<view class="contentC content" v-if="item.artworkLevel == 'C'">{{
item.artworkName
}}</view>
<view class="contentB content" v-if="item.artworkLevel == 'B'">{{
item.artworkName
}}</view>
<view class="contentA content" v-if="item.artworkLevel == 'A'">{{
item.artworkName
}}</view>
</view>
</view>
<u-empty mode="favor" v-if="!paymentList" :text="$t('mine.noData')" marginTop="100"></u-empty>
</scroll-view>
<u-popup :show="showLocale" mode="center" @close="closeLocale" @open="openLocale" bgColor="transparent">
<view class="popupLocale-box">
<view class="title">{{ $t("mine.updateLang") }}</view>
<view class="item" v-for="(item, index) in locales" :key="index"
:style="{ borderBottom: (item.code !== 'en' ? '1px solid #dedede' : 'none') }">
<view class="left">{{ item.text }}</view>
<view class="right">
<text v-if="item.code == applicationLocale">{{
$t("updateLang.done")
}}</text>
<u-tag v-else :text="$t('updateLang.change')" @click="onLocaleChange(item)" class="tag-btn"
shape="circle" bgColor="#699A70" borderColor="#699A70"></u-tag>
</view>
</view>
</view>
<u-button :text="$t('navbar.back')" color="#EDC466" @click="closeLocale" style="
width: 260rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
"></u-button>
</u-popup>
<u-popup :show="showSetPass" mode="bottom" @close="closeBack" bgColor="transparent">
<view class="step-top">{{ $t("password.title") }}</view>
<view class="step-box">
<view class="title">{{ $t("password.set") }}</view>
<view class="step-pl">
{{ $t("password.name") }}
<text>{{ userInfo.telNum | disposeTel }}</text>
{{ $t("password.set") }}
</view>
<view class="verfy-box">
<view>
<view class="label">{{ $t("password.input") }}</view>
<u-code-input v-model="setPwd" dot :maxlength="6" hairline color="#ffffff"
borderColor="transparent"></u-code-input>
</view>
</view>
<view class="verfy-box">
<view>
<view class="label">{{ $t("password.com") }}</view>
<u-code-input v-model="confirmPwd" dot :maxlength="6" hairline color="#ffffff"
borderColor="transparent"></u-code-input>
</view>
</view>
<u-button :text="$t('password.step')" color="#699A70" @click="step2" style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 150rpx;
"></u-button>
</view>
</u-popup>
<u-popup :show="showVerfyPass" mode="bottom" @close="closeBack" bgColor="transparent">
<view class="step-top">{{ $t("password.title") }}</view>
<view class="step-box">
<view class="title">{{ $t("password.get") }}</view>
<view class="verfy-box">
<view>
<view class="label">{{ $t("password.input") }}</view>
<u-code-input v-model="userPwd" dot :maxlength="6" hairline color="#ffffff"
borderColor="transparent"></u-code-input>
</view>
</view>
<view class="verfy-box" style="margin-top: 40upx">
<view>
<view class="label">{{ $t("password.com") }}</view>
<u-code-input v-model="confirmUserPwd" dot :maxlength="6" hairline color="#ffffff"
borderColor="transparent"></u-code-input>
</view>
</view>
<u-button :text="$t('buyVerfy.done')" color="#699A70" @click="stepDone" style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 150rpx;
"></u-button>
</view>
</u-popup>
<u-popup :show="showAuthentication" mode="center" @close="closePass" bgColor="transparent">
<view class="pass-box">
<view class="title">{{ $t("password") }}</view>
<view class="verfy-box">
<view>
<view class="label" style="margin-top:30rpx">{{ $t("password.input") }}</view>
<u-code-input v-model="userPwd" dot :maxlength="6" hairline color="#ffffff"
borderColor="transparent"></u-code-input>
</view>
</view>
<view class="flex-end">
{{ $t("password.vername") }}
<text>{{ userInfo.telNum | disposeTel }}</text>
{{ $t("password.username") }}
</view>
<u-button :text="$t('comfrim')" color="#699A70" @click="comPass" style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top:30rpx;
"></u-button>
<u-button :text="$t('payment.back')" color="#EDC466" @click="closePass" style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
"></u-button>
</view>
</u-popup>
<!-- 邀请码弹窗 -->
<u-popup :show="showInvite" mode="center" @close="closeInvite" bgColor="transparent">
<view class="invite-box">
<view style="margin-bottom: 20upx">{{ $t("payInfo.copyCode") }}</view>
<u-input v-model="codeSC" shape="circle" border="none" class="login-input"></u-input>
<u-button :text="$t('comfrim')" color="#558BF2" @click="sendConfirm" style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 20rpx;
"></u-button>
<u-button :text="$t('close')" color="rgb(224,119,115)" @click="closeInvite" style="
width: 484rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 20rpx;
"></u-button>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
return {
src: "",
showLocale: false,
applicationLocale: "",
userInfo: {},
showSetPass: false,
showVerfyPass: false,
showAuthentication: false,
setPwd: "",
confirmPwd: "",
userPwd: "",
confirmUserPwd: "",
paymentList: [],
notReadNum: 0,
showPage: false,
isAndroid: false,
canScan: false,
showInvite: false,
codeSC: "",
showPull: false,
listHeight: uni.getSystemInfoSync().windowHeight - 88 - 61,
};
},
computed: {
locales() {
return [
// {
// text: this.$t("locale.auto"),
// code: "auto",
// },
{
text: this.$t("locale.zh-hans"),
code: "zh-Hans",
},
{
text: this.$t("locale.zh-hant"),
code: "zh-Hant",
},
{
text: this.$t("locale.en"),
code: "en",
},
];
},
},
filters: {
disposeTel(phoneNum) {
return Number(phoneNum).toString().slice(0, 3) + '****' + Number(phoneNum).toString().slice(-4);
}
},
methods: {
toJSON() { },
goLang() {
this.showLocale = true;
},
closeLocale() {
this.showLocale = false;
},
closeInvite() {
this.showInvite = false;
this.codeSC = "";
},
openLocale() {
// console.log(uni.getLocale());
let systemInfo = uni.getSystemInfoSync();
this.systemLocale = systemInfo.language;
this.applicationLocale = uni.getLocale();
this.isAndroid = systemInfo.platform.toLowerCase() === "android";
uni.onLocaleChange((e) => {
this.applicationLocale = e.locale;
});
},
onLocaleChange(e) {
// console.log(e)
if (this.isAndroid) {
uni.showModal({
content: this.$t("index.language-change-confirm"),
success: (res) => {
if (res.confirm) {
uni.setLocale(e.code);
}
},
});
} else {
uni.setLocale(e.code);
this.$i18n.locale = e.code;
}
// console.log(this.$refs.tabbarRef);
this.$refs.tabbarRef.tabBarList = [{
pagePath: "pages/index/index",
iconPath: "../../static/image/tabbar/home.png",
selectedIconPath: "../../static/image/tabbar/home_check.png",
text: this.$t("tabbar.home"),
customIcon: false,
},
{
pagePath: "pages/mine/index",
iconPath: "../../static/image/tabbar/mine.png",
selectedIconPath: "../../static/image/tabbar/mine_check.png",
text: this.$t("tabbar.mine"),
customIcon: false,
},
];
},
goDetail(ID, artworkUid) {
uni.navigateTo({
url: "/pages/mine/detail/detail?ID=" + ID + "&artworkUid=" + artworkUid,
});
},
goMess() {
uni.navigateTo({
url: "/pages/mine/notice/notice",
});
},
goSets() {
uni.navigateTo({
url: "/pages/mine/setting/setting",
});
},
//
goScan() {
this.showInvite = true;
// H5
// try {
// uni.scanCode({
// success: (res) => {
// if (res.result) {
// console.log(res.result, "res.result");
// uni.navigateTo({
// url: `/pages/mine/confirmOrder/confirmOrder?code=${res.result}`,
// });
// }
// },
// });
// } catch (error) {
// console.log(123123);
// }
},
sendConfirm() {
uni.navigateTo({
url: `/pages/mine/confirmOrder/confirmOrder?code=${this.codeSC}`,
});
this.closeInvite();
},
//
async getNotReadMsg() {
let res = await this.$api.airdrop.checkPoint();
if (res.status === 0) {
this.notReadNum = res.data.Count;
}
},
//
step2() {
if (!this.setPwd || !this.confirmPwd) {
this.$common.msgToast(this.$t("password.inputPass"), null, "error");
return;
}
if (this.setPwd !== this.confirmPwd) {
this.$common.msgToast(this.$t("password.messError"), null, "error");
return;
}
this.setPassword();
},
//
async setPassword() {
let res = await this.$api.mine.update({
password: this.confirmPwd,
});
if (res.status === 0) {
uni.$u.toast(this.$t("password.setSucc"));
this.showSetPass = false;
this.showVerfyPass = true;
} else {
uni.$u.toast(res.msg || this.$t("password.setError"));
}
},
//
async verifyPwd(setFlag) {
let res = await this.$api.mine.verifyPwd({
password: this.userPwd,
});
if (res.status === 0) {
uni.$u.toast(this.$t("password.verSucc"));
this.showVerfyPass = false;
this.showAuthentication = false;
// setFlag ,localStorage
if (setFlag) {
uni.setStorageSync("isSetPass", 1);
}
} else {
uni.$u.toast(res.msg || this.$t("password.verError"));
}
},
//
async stepDone() {
if (!this.userPwd || !this.confirmUserPwd) {
this.$common.msgToast(this.$t("password.inputPass"), null, "error");
return;
}
if (this.userPwd !== this.confirmUserPwd) {
this.$common.msgToast(this.$t("password.messError"), null, "error");
return;
}
await this.verifyPwd();
this.showVerfyPass = false;
},
//
async comPass() {
let vef = this.$common.vefEmpty(
this.userPwd,
this.$t("password.inputPass")
);
if (!vef) return;
await this.verifyPwd(true);
this.userPwd = "";
//
},
//
closePass() {
this.showAuthentication = false;
uni.switchTab({
url: "/pages/index/index",
});
},
//
closeBack() {
this.showSetPass = false;
this.showVerfyPass = false;
uni.switchTab({
url: "/pages/index/index",
});
},
//
async getInfo() {
uni.showLoading();
await this.$api.mine
.getInfo()
.then(async (res) => {
if (res.status === 0) {
this.userInfo = res.data;
this.showPage = true;
await this.getPaymentInfo();
await this.getNotReadMsg();
} else if (res.status === 401) {
uni.navigateTo({
url: "/pages/login/login",
});
uni.clearStorageSync();
} else {
this.$common.msgToast(res.msg, null, "error");
}
})
.catch((err) => {
uni.showToast({
title: this.$t("load.failed"),
icon: "none"
});
});
uni.hideLoading();
/* let res = await this.$api.mine.getInfo();
if (res.status === 0) {
this.userInfo = res.data;
} else {
this.$common.msgToast(res.msg , null, "error");
} */
},
//
async getPaymentInfo() {
let res = await this.$api.mine.paymentList();
console.log(1111, res)
if (res.status === 0) {
this.paymentList = res.data.data;
} else {
this.$common.msgToast(res.msg || this.$t("load.failed"), null, "error");
}
},
},
async onShow() {
this.showPage = false;
await this.getInfo();
this.canScan = uni.getStorageSync("mall-user-info")?.canScan;
//
if (this.userInfo.isNeedChange === 1) {
this.showSetPass = true;
} else {
this.userPwd = "";
// localStorageisSetPass ,
this.showAuthentication = uni.getStorageSync("isSetPass") !== 1;
}
},
};
</script>
<style lang="scss">
page {
background: url("@/static/image/home/mine-bg.png") no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
// border: 1px solid red;696.1123
}
.login-input {
height: 68upx;
background-color: rgba(255, 255, 255, 0.6);
padding: 0 20rpx;
/deep/ .uni-input-placeholder {
padding: 0 20rpx;
}
/deep/ .uni-input-input {
color: #E4E4E4;
padding: 0 20rpx;
}
}
.logo {
width: 100vw;
height: 122rpx;
background: #FFFFFF;
overflow: hidden;
.img {
width: 188rpx;
height: 56rpx;
margin-top: 36rpx;
margin-left: 48rpx;
}
}
.user-box {
background: #FFFFFF;
border-radius: 20rpx;
height: 210rpx;
margin: 20rpx 28rpx 20rpx 28rpx;
padding: 22rpx 20rpx;
display: flex;
box-sizing: border-box;
align-items: center;
.avatar {
margin-left: 50rpx;
}
.info {
flex: 1;
display: flex;
flex-direction: column;
margin-left: 10rpx;
.username {
width: 75%;
color: #000000;
font-size: 34rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.blockchain {
color: #699A70;
font-size: 20rpx;
margin-top: 10rpx;
width: 75%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
.mine-icon {
background: #FFFFFF;
border-radius: 20rpx;
height: 130rpx;
margin: 0rpx 28rpx 40rpx 28rpx;
padding: 20rpx 20rpx;
display: flex;
box-sizing: border-box;
justify-content: space-around;
align-items: center;
.value {
color: #000000;
font-size: 12px;
}
.tag,
.message,
.scan,
.setting {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.message {
position: relative;
.point {
position: absolute;
z-index: 999;
left: 35rpx;
top: 0rpx;
}
}
// .scan {
// width: 60rpx;
// font-size: 20rpx;
// }
}
.his-title-text {
font-size: 24rpx;
margin: 28rpx;
padding-bottom: 4upx;
color: #959595;
display: flex;
align-items: center;
&>.line {
flex: 1;
height: 0.5rpx;
background: #D0D0D0;
margin-left: 5rpx;
}
}
.his-box {
margin: 0 8rpx;
display: flex;
flex-wrap: wrap;
.item {
width: 332rpx;
height: 418rpx;
// background: #000000;
// border-radius: 8rpx;
overflow: hidden;
position: relative;
margin: 20rpx 10rpx 0 18rpx;
box-sizing: border-box;
.icon {
width: 28rpx;
height: 28rpx;
position: absolute;
top: 16rpx;
right: 18rpx;
z-index: 10;
}
.img {
width: 100%;
height: 324rpx;
}
.content {
height: 96rpx;
width: 100%;
position: absolute;
bottom: 0;
font-size: 32rpx;
text-align: center;
line-height: 96rpx;
background-position: center center;
background-size:cover !important;
}
.contentD {
background: url("../../static/image/mine/item-bg1.png") no-repeat;
}
.contentC {
background: url("../../static/image/mine/item-bg2.png") no-repeat;
}
.contentB {
background: url("../../static/image/mine/item-bg3.png") no-repeat;
}
.contentA {
background: url("../../static/image/mine/item-bg4.png") no-repeat;
}
}
}
.invite-box {
text-align: center;
}
.popupLocale-box {
background: rgba(0, 0, 0, 0.8);
width: 582rpx;
overflow: hidden;
padding: 30rpx 42rpx;
.content3 {
background: url("../../static/image/mine/item-bg3.png") no-repeat;
}
.content4 {
background: url("../../static/image/mine/item-bg4.png") no-repeat;
}
.content {
height: 96rpx;
width: 100%;
background-size: 100% 100%;
position: absolute;
bottom: 0;
font-size: 32rpx;
text-align: center;
line-height: 96rpx;
}
}
.popupLocale-box {
background: rgba(0, 0, 0, 0.8);
width: 582rpx;
overflow: hidden;
padding: 30rpx 42rpx 0 42rpx;
.title {
font-size: 40rpx;
text-align: center;
margin-bottom: 40rpx;
}
.u-button {
width: 260rpx;
height: 56rpx;
border-radius: 40rpx;
}
.item {
display: flex;
justify-content: space-between;
padding: 34rpx 50rpx 38rpx 0;
// border-bottom: 1px solid #dedede;
align-items: center;
.right {
font-size: 20rpx;
.tag-btn {
width: 100rpx;
/deep/ .u-tag {
justify-content: center;
}
/deep/ .u-tag__text--medium {
font-size: 20rpx;
text-align: center;
height: 40rpx;
line-height: 40rpx;
}
}
}
}
}
.u-popup__content {
border-radius: 8rpx;
}
.step-top {
width: 466rpx;
padding: 16rpx 40rpx;
background: #699A70;
margin: auto;
text-align: center;
}
.step-box {
width: 100%;
margin-top: 26rpx;
background: #FFFFFF;
padding-bottom: 80rpx;
.title {
font-size: 40rpx;
text-align: center;
margin: 46rpx 0 34rpx 0;
color: #434343;
}
.step-pl {
text-align: center;
color: #878787;
font-size: 28rpx;
}
}
.verfy-box {
display: flex;
justify-content: center;
.label {
font-size: 24rpx;
text-align: left;
margin-bottom: 20rpx;
margin-top: 90rpx;
color: #878787;
}
/deep/ .u-code-input__item {
background: rgba(228, 228, 228, 0.7);
width: 60rpx !important;
height: 60rpx !important;
}
}
.pass-box {
width: 582rpx;
height: 484rpx;
background: #FFFFFF;
.title {
font-size: 40rpx;
text-align: center;
margin: 46rpx 0 34rpx 0;
color: #434343;
}
.flex-end {
margin-top: 70rpx;
padding: 58rpx;
text-align: right;
font-size: 24rpx;
color: #878787;
}
}</style>

@ -0,0 +1,367 @@
<template>
<view class="main">
<feedback :showQa="showQa" @closeFeed ='closeFeed'/>
<navBar :navTitle="'消息'" :hasRight="true" :stickyShow="stickyShow" :currentPage="'pages/mine/index'" :backBackGroundColor="'#699A70'" @clickRight="clickRight"/>
<view class="list">
<scroll-view style="width: 100%; height: calc(100vh - 200upx); position: relative" scroll-y="true">
<view
class="card"
v-for="item in indexList"
:key="item.Uuid"
:style="!item.Clicked ||!item.Claimed? 'background-color: #E4E4E4;':'background-color: #FFFFFF;' "
@click="openKt(item)"
>
<view class="avtor"><image class="avtimg" :src="item.PicUrl"></image></view>
<view class="item">
<view class="item-txt">
<view v-if="item.DropOrAnnounce === 0" class="kt">{{$t('airdrop')}}</view>
<view v-else class="gonggao">{{$t('announcement')}}</view>
<view v-if="item.DropOrAnnounce === 0" class="title">{{ item.Series }}</view>
<view v-else class="title">{{ item.Title }}</view>
<image
v-if="!item.Clicked&& item.DropOrAnnounce === 0"
class="dian"
src="../../../static/image/mine/dian.png"
></image>
</view>
<view class="item-txt" style="margin-top: 10upx">
<view v-if="item.DropOrAnnounce === 0" class="content">{{ item.Desc }}</view>
<view v-else class="content" v-html="item.Content"></view>
<!-- <view style="font-size: 12upx;color: rgba(255, 255, 255, 0.3);">{{ item.TimeFormat }}</view> -->
</view>
</view>
</view>
</scroll-view>
</view>
<u-popup :show="showKt" mode="center" @close="closePop" bgColor="transparent">
<view class="popupLocale-box">
<view style="padding-left: 190upx; padding-right: 190upx">
<view v-if="!this.isMsgDetail" class="title">{{$t('airdrop')}}</view>
<view v-else style="background-color: #EDC466;" class="title">{{$t('announcement')}}</view>
</view>
<view class="item"><image style="width: 600upx; height: 600upx" :src="listItem.PicUrl"></image></view>
<view
style="
color: #000;
margin-top: 10upx;
margin-bottom: 10upx;
font-size: 40upx;
"
>
{{ this.isMsgDetail ? listItem.Title : listItem.Collection }}
</view>
<view v-if="!this.isMsgDetail" style="color: #6c6c6c; margin-top: 10upx; margin-bottom: 10upx">
{{ listItem.Desc }}
</view>
<view v-else style="color: #6c6c6c; margin-top: 10upx; margin-bottom: 10upx" v-html="listItem.Content"></view>
</view>
<view style="display: flex">
<u-button
v-if="listItem.Claimed === 0 && !this.isMsgDetail"
:text="$t('to.accept')"
@click="recive"
style="width: 460rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;background: #699A70;
border: none;
color:#fff;"
></u-button>
<u-button
v-if="listItem.Clicked === 0 && this.isMsgDetail"
:text="$t('read')"
@click="readMsg"
style="
width: 460rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
background: #699A70;
border: none;
color:#fff;
"
></u-button>
<u-button
v-if="listItem.Clicked === 1 && this.isMsgDetail"
:text="$t('close')"
@click="closePop"
style="
width: 460rpx;
height: 56rpx;
border-radius: 40rpx;
margin-top: 30rpx;
background: #699A70;
border: none;
color:#fff;
"
></u-button>
<u-button
v-if="listItem.Claimed === 1 && !this.isMsgDetail"
:text="$t('close')"
@click="closePop"
style="width: 460rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;background: #699A70;
border: none;
color:#fff;"
></u-button>
</view>
</u-popup>
</view>
</template>
<script>
import feedback from '../feedback/feedback.vue';
export default {
components:{
feedback
},
data() {
return {
showKt: false,
stickyShow: false,
indexList: [],
listItem: {},
isMsgDetail: false,
showQa:false
};
},
onLoad() {
this.loadmore();
},
onPageScroll(e) {
this.stickyShow = e.scrollTop > 5 ? true : false;
},
methods: {
closePop() {
this.showKt = false;
this.loadmore();
this.canScroll();
},
//
async openKt(item) {
this.listItem = item;
// console.log(this.listItem);
if (this.listItem.DropOrAnnounce === 0) {
this.isMsgDetail = false;
await this.clickDetail();
} else {
this.isMsgDetail = true;
}
this.showKt = true;
this.stopScroll();
},
//
async readMsg(){
let data = {
Uuid: this.listItem.Uuid,
Clicked: this.listItem.Clicked
};
let res = await this.$api.airdrop.readMsg(data);
if (res.status === 0) {
this.showKt = false;
this.canScroll();
this.loadmore();
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
},
//
async clickDetail() {
let data = {
Collection: this.listItem.Collection,
Desc: this.listItem.Desc,
PicUrl: this.listItem.PicUrl,
Series: this.listItem.Series,
Uuid: this.listItem.Uuid,
Clicked: this.listItem.Clicked
};
let res = await this.$api.airdrop.collectionSepcific(data);
if (res.status === 0) {
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
},
//
async loadmore() {
let res = await this.$api.airdrop.collectionList();
if (res.status === 0) {
this.indexList = res.data.Data;
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
},
// 1
async recive() {
let data = {
UserId: uni.getStorageSync('mall-user-info').ID,
Uuid: this.listItem.Uuid
};
let res = await this.$api.airdrop.getCollection(data);
if (res.status === 0) {
this.step2(this.listItem.CollectionUid);
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
},
// 1
async step2(id) {
let data = {
collectionsUID: id,
userAirdropUuid: this.listItem.Uuid
};
let res = await this.$api.airdrop.getCollectionStepTwo(data);
if (res.status === 0) {
this.showKt = false;
this.canScroll();
this.loadmore();
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
},
clickRight() {
this.showQa = true;
},
closeFeed(isShow){
this.showQa = isShow
}
}
};
</script>
<style lang="scss">
page {
background: #F5F5F5;
// background-size: 100% 100%;
// background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
}
.main {
height: 100%;
padding: 36upx 32upx;
.list {
height: 100%;
}
// .u-popup /deep/ .u-transition {
// background-color: rgba(0, 0, 0, 0.9) !important;
// }
.popupLocale-box {
background: rgba(255, 255, 255, 0.8);
width: 582rpx;
overflow: hidden;
padding: 30rpx 42rpx;
.title {
// background-color: rgba(88, 146, 255, 0.6);
background: rgba(105,154,112, 0.6);
font-size: 40rpx;
border-radius: 40upx;
text-align: center;
margin-bottom: 40rpx;
}
.u-button {
width: 260rpx;
height: 56rpx;
border-radius: 40rpx;
}
.item {
display: flex;
align-items: center;
justify-content: center;
}
}
.card {
width: 100%;
height: 200upx;
border-radius: 8upx;
text-align: center;
margin-bottom: 20upx;
display: inline-flex;
// background: #FFFFFF;
.avtor {
width: 220upx;
margin-top: 30upx;
height: 100%;
display: block;
align-items: center;
.avtimg {
width: 144upx;
height: 144upx;
}
}
.item {
flex: 1;
height: 100%;
padding-right: 20upx;
position: relative;
.happy {
position: absolute;
width: 181upx;
height: 176upx;
right: 0;
}
.item-txt {
margin-top: 30upx;
display: inline-flex;
width: 100%;
align-items: center;
position: relative;
.kt {
padding: 4upx 16upx ;
// background-color: #558bf2;
background: #699A70;
border-radius: 30upx;
margin-right: 10upx;
font-size: 24upx;
}
.gonggao {
padding: 4upx 16upx ;
background-color: #edc466;
border-radius: 30upx;
margin-right: 10upx;
font-size: 24upx;
}
.title {
width: 290upx;
font-size: 34upx;
line-height: 1;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
word-break: break-all;
color: #434343;
text-align: left;
-webkit-box-orient: vertical;
}
.dian {
width: 40upx;
height: 40upx;
position: absolute;
right: 20upx;
}
.content {
width: 300upx;
height: 80upx;
word-break: break-all;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2; //N
-webkit-box-orient: vertical;
color: #878787;
}
}
}
}
}
</style>

@ -0,0 +1,152 @@
<template>
<view class="main">
<navBar navTitle="" :hasLogo="true" :backToUrl="'/pages/mine/setting/setting'" :backBackGroundColor="'#3D553D'" />
<view class="input-box">
<view class="text">{{ $t('realname.conduct') }}</view>
<view class="formItem">
<view style="color: #434343;font-size: 26upx;">{{ $t('buyVerfy.username') }}</view>
<u-input v-model="realName" shape="circle" border="none" class="login-input"></u-input>
</view>
<view class="formItem">
<view style="color:#434343;font-size: 26upx;">{{ $t('buyVerfy.idNum') }}</view>
<u-input v-model="idNum" shape="circle" border="none" class="login-input"></u-input>
</view>
</view>
<u-button :text="$t('buyVerfy.done')" color="#699A70" @click="save" class="btn"></u-button>
<!-- <view @click="cancel" class="cancel">{{ $t('buyVerfy.cancel') }}</view> -->
<u-toast ref="uToast" />
</view>
</template>
<script>
export default {
data() {
return {
idNum: '',
realName: ''
};
},
methods: {
cancel() {
uni.navigateTo({
url: '/pages/mine/setting/setting'
})
},
async save() {
if (!this.idNum || !this.realName) {
return this.$refs.uToast.show({
message: '姓名和身份证号码不能为空',
type: 'error',
})
}
let data = { idNum: this.idNum, realName: this.realName }
let res = await this.$api.mine.update(data);
if (res.status === 0) {
this.$refs.uToast.show({
message: this.$t('buyVerfy.done'),
type: 'success',
})
this.cancel()
} else {
this.$refs.uToast.show({
message: res.msg,
type: 'error',
})
}
}
}
}
</script>
<style lang="scss">
page {
background: url('@/static/image/home/new_bg.png') no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
}
/deep/ .u-input__content__field-wrapper__field {
font-size: 24upx !important;
margin-left: 10upx;
}
.main {
height: 100%;
position: relative;
display: flex;
justify-content: center;
.title {
margin-top: 40upx;
display: flex;
justify-content: center;
image {
width: 201upx;
height: 60upx;
}
}
.btn {
height: 56rpx;
width: 600upx;
border-radius: 40rpx;
margin-top: 30rpx;
position: absolute;
bottom: 120upx;
left: 10%;
}
.cancel {
text-align: center;
height: 56rpx;
width: 600upx;
border-radius: 40rpx;
margin-top: 30rpx;
position: absolute;
bottom: 40upx;
left: 10%;
}
.input-box {
position: absolute;
top: 258upx;
width: 638upx;
.text {
display: flex;
justify-content: center;
font-size: 45upx;
margin-bottom: 250upx;
color: #434343;
}
.formItem {
display: inline-flex;
justify-content: center;
align-items: center;
margin-bottom: 40upx;
}
.login-input {
height: 60upx;
background-color: rgba(135, 135, 135, 0.5);
margin-left: 10upx;
width: 482upx;
/deep/ .uni-input-input {
color: #fff;
padding: 0 20rpx;
}
}
.close {
width: 24upx;
height: 24upx;
margin-right: 20upx;
}
}
}
</style>

@ -0,0 +1,501 @@
<template>
<view class="main">
<navBar navTitle="" :hasLogo="true" :hasRight="true" :backToUrl="'/pages/mine/index'" :isSwitchTab="true"
@clickRight="clickRight" :color="'#000000'" :backBackGroundColor="'rgb(105, 154, 112)'" />
<view class="avtor">
<image :src="userInfo.avatar + '?x-oss-process=image/resize,w_158,h_158'"></image>
<view>
<u-button :text="$t('avatar.def')" shape="circle" class="size" style="background-color: #000000;"
@click="backDafult"></u-button>
<u-upload :fileList="fileList" name="1" accept="image" @afterRead="upLoaded">
<u-button :text="$t('avatar.update')" shape="circle" class="size"></u-button>
</u-upload>
</view>
</view>
<view class="info">
<view class="item">
<view class="title">{{ $t('userInfo.name') }}</view>
<view class="gray" style="display:flex;justify-content: center;align-items: center;">
<view>{{ userInfo.nickName }}</view>
<text class="rz" @click="showName = true">{{ $t('userInfo.updateName') }}</text>
</view>
</view>
<u-divider></u-divider>
<view class="item">
<view class="title">{{ $t('userInfo.createTime') }}</view>
<view class="gray">{{ userInfo.createdAt }}</view>
</view>
<u-divider></u-divider>
<view class="item">
<view class="title">{{ $t('userInfo.idNum') }}</view>
<view class="gray">{{ userInfo.ID }}</view>
</view>
</view>
<view class="info">
<view class="item">
<view class="title">{{ $t('userInfo.phone') }}</view>
<view class="gray" style="display: flex;">
<u--text mode="phone" :text="userInfo.telNum" format="encrypt"></u--text>
<view class="rz" style="background-color:#676767;" @click="goChangeNum">{{ $t('phone.update') }}</view>
</view>
</view>
</view>
<view style="width: 100%; text-align: right;color: #656565;margin-top: 20upx;font-size:20rpx">
*{{ $t('phone.verInfo') }}</view>
<view v-if="!userInfo.realName" class="info" style="margin-top: 20upx;">
<view class="item">
<view class="title">{{ $t('user.realName') }}</view>
<view class="gray"><text class="rz" @click="goRealName">{{ $t('user.verfy') }}</text></view>
</view>
</view>
<view v-if="userInfo.realName" class="info" style="margin-top: 20upx;">
<view class="item">
<view class="title" style="display: flex;
align-items: center;
justify-content: center;">
{{ $t('user.username') }}
<view
style="background-color:#699A70 ;border-radius: 40rpx;font-size: 20rpx;padding: 0 15rpx 0 15rpx;color:#FFFFFF;margin-left:10rpx">
{{ $t('user.verDone') }}
</view>
</view>
<view class="gray">
{{ userInfo.realName }}
</view>
</view>
<u-divider></u-divider>
<view class="item">
<view class="title">{{ $t('user.idNum') }}</view>
<view class="gray">{{ userInfo.idNum }}</view>
</view>
</view>
<view class="btn">
<u-button :text="$t('account.logout')" shape="circle" class="size"
style=" background-color:#ED6666;color: #fff;border: 0;margin-right: 20upx;"
@click="showDestory = true"></u-button>
<u-button @click="showLogout = true" :text="$t('account.signOut')" shape="circle" class="size"
style="background-color: #3E3E3E;color: #fff;border: 0;"></u-button>
</view>
<u-popup :show="showName" mode="center" @close="showName = false" bgColor="transparent">
<view class="popupLocale-box">
<view class="title" style="color:#FFFFFF;font-size:40rpx">{{ $t('set.name') }}</view>
<view class="item">
<u--input :placeholder="$t('set.input')" shape="circle" v-model="changeName"
style="background-color: rgba(255, 255, 255, 0.5);border: 0;margin-left: 50upx;"
class="setName"></u--input>
</view>
</view>
<view style="display: flex;">
<u-button :text="$t('navbar.back')" color="#EDC466" @click="showName = false"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
<u-button :text="$t('comfrim')" color="#699A70" @click="updateName"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
</view>
</u-popup>
<feedback :showQa="showQa" @closeFeed='closeFeed' />
<u-popup :show="showDestory" mode="center" @close="showDestory = false" bgColor="transparent">
<view class="popupLocale-box">
<view class="title" style="margin-bottom: 0;">
<image style="width: 76upx;height: 76upx;" src="../../../static/image/mine/warning.png"></image>
</view>
<view class="item" style="font-size: 32upx;">{{ $t('logout.info') }}</view>
</view>
<view style="display: flex;">
<u-button :text="$t('navbar.back')" color="#EDC466" @click="showDestory = false"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
<u-button :text="$t('comfrim')" color="#ED6666" @click="goConfirm"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
</view>
</u-popup>
<u-popup :show="confirmDestory" mode="center" @close="confirmDestory = false" bgColor="transparent">
<view class="popupLocale-box">
<view class="title" style="margin-bottom: 0;">
<image style="width: 76upx;height: 76upx;" src="../../../static/image/mine/confim-warning.png"></image>
</view>
<view class="item">
<view class="sec">
<view>{{ $t('sendCode.send') }}{{ userInfo.telNum }}</view>
<view class="resend" @tap="getCode">{{ tips }}</view>
</view>
<view class="code-box">
<u-code-input v-model="Code" :focus="focus"></u-code-input>
</view>
</view>
<view class="action-box">
<view class="confirm-input">
<view style="margin-bottom: 15upx;color: rgba(255, 255, 255, 0.6);">{{ $t('password.input') }}
</view>
<u-code-input v-model="actCode"></u-code-input>
</view>
</view>
<view class="tips">*注意此操作将彻底删除该账号所有信息</view>
</view>
<view style="display: flex;">
<u-button :text="$t('navbar.back')" color="#ECC366" @click="confirmDestory = false"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
<u-button :text="$t('logout.btn')" color="#ED6666" @click="destoryAccount"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
</view>
</u-popup>
<u-popup :show="showLogout" mode="center" @close="showLogout = false" bgColor="transparent">
<view class="popupLocale-box">
<view class="title" style="margin-bottom: 0;">
<image style="width: 80upx;height: 80upx;" src="../../../static/image/mine/warning.png"></image>
</view>
<view class="item" style="font-size: 30upx;">{{ $t('signout.info') }}</view>
</view>
<view style="display: flex;">
<u-button :text="$t('navbar.back')" color="#ECC366" @click="showLogout = false"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
<u-button :text="$t('comfrim')" color="#ED6666" @click="logout"
style="width: 260rpx;height: 56rpx;border-radius: 40rpx;margin-top: 30rpx;"></u-button>
</view>
</u-popup>
<u-code :seconds="seconds" @start="start" ref="uCode" @change="codeChange"></u-code>
</view>
</template>
<script>
import feedback from '../feedback/feedback.vue';
export default {
components: {
feedback
},
data() {
return {
showName: false,
showQa: false,
showDestory: false,
showLogout: false,
confirmDestory: false,
fileList: [],
tips: '',
seconds: 60,
wathTime: 10,
changeName: '',
focus: false,
Code: '',
actCode: '',
userInfo: {},
// content: ''
};
},
onShow() {
this.getInfo()
},
methods: {
//
async getInfo() {
let res = await this.$api.mine.getInfo();
if (res.status === 0) {
this.userInfo = res.data;
} else {
this.$common.msgToast(res.msg, null, 'error');
}
},
//
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
const Authorization = uni.getStorageSync('token');
const userId = uni.getStorageSync('mall-user-info').ID
let a = uni.uploadFile({
url: this.$baseUrl + '/mall/upload/file',
filePath: url,
name: 'file',
formData: {
type: 'image',
source: 'user',
mask: userId
},
header: {
Authorization
},
success: res => {
resolve(res.data);
this.updateInfo({
avatar: JSON.parse(res.data).data.ori_url
})
}
});
});
},
//
async upLoaded(file, lists, name) {
this.uploadFilePromise(file.file.url);
},
//
start() {
uni.$u.toast(this.$t('sendCode'));
},
//
codeChange(text) {
this.tips = text;
},
async destoryAccount() {
if (!this.Code || !this.actCode) {
this.$common.msgToast(this.$t('code.actPass'), null, 'error');
return;
}
const data = {
password: this.actCode,
code: this.Code
}
const res = await this.$api.mine.logout(data)
if (res.status === 0) {
console.log(res)
this.confirmDestory = false;
this.logout()
} else {
uni.$u.toast(res.msg);
}
},
//
async getCode() {
if (this.$refs.uCode.canGetCode) {
uni.showLoading({
title: this.$t('sendCode.loading')
});
let res = await this.$api.mine.mineCode({
TelNum: this.userInfo.telNum
});
if (res.status === 0) {
uni.hideLoading();
// this.start()
this.focus = true;
this.$refs.uCode.start();
//
} else {
uni.hideLoading();
uni.$u.toast(res.msg);
}
} else {
uni.$u.toast(this.$t('sendCode.toast'));
}
},
// 退
logout() {
// uni.removeStorageSync("mall-user-info");
// uni.removeStorageSync("token");
uni.clearStorageSync();
uni.switchTab({
url: '/pages/index/index'
});
},
//
goConfirm() {
this.showDestory = false;
this.confirmDestory = true;
},
//
goChangeNum() {
if (!this.userInfo.realName) {
return
}
uni.navigateTo({
url: '/pages/mine/changePhone/changePhone?telNum=' + this.userInfo.telNum
});
},
//
goRealName() {
uni.navigateTo({
url: '/pages/mine/realName/realName'
});
},
//
async updateName() {
await this.updateInfo({
nickName: this.changeName
})
this.showName = false
},
//
async updateInfo(data) {
let res = await this.$api.mine.update(data);
if (res.status === 0) {
uni.$u.toast(this.$t('update.succes'));
this.getInfo()
uni.setStorageSync('mall-user-info', this.userInfo);
} else {
uni.$u.toast(res.msg);
}
},
//
backDafult() {
this.updateInfo({
avatar: 'https://dci-file.bj.bcebos.com/shop-main/prod/image/0/user/6ae57adf-7d05-4f84-9053-d39967870327.jpg'
})
},
//
clickRight() {
this.showQa = true;
},
closeFeed(isShow) {
this.showQa = isShow
}
}
};
</script>
<style lang="scss">
page {
background: url('@/static/image/home/new_bg.png') no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
height: 100vh;
box-sizing: border-box;
}
.title {
color: #434343;
}
.sec {
color: #ffffff;
position: absolute;
display: flex;
top: 120upx;
.resend {
margin-left: 100upx;
color: #fcb462;
}
}
.code-box {
margin-top: 70upx;
}
/deep/ .u-code-input__item {
border: 0;
border-radius: 20upx;
background-color: rgba(255, 255, 255, 0.65);
}
.main {
display: grid;
justify-content: center;
.avtor {
margin-top: 40upx;
display: flex;
width: 100%;
justify-content: space-around;
image {
width: 160upx;
height: 160upx;
border-radius: 40upx;
}
.size {
color: #fff;
border: 0;
background-color: #699A70;
margin-bottom: 20upx;
width: 348upx;
height: 64upx;
}
}
.action-box {
margin-top: 50upx;
position: relative;
height: 250upx;
background-color: rgba(255, 255, 255, 0.3);
.confirm-input {
position: absolute;
top: 30%;
left: 4%;
}
}
.info {
width: 600upx;
background: #FFFFFF;
margin-top: 65upx;
padding: 34rpx 40upx;
.item {
font-size: 30upx;
display: flex;
justify-content: space-between;
align-items: center;
.rz {
box-sizing: border-box;
margin-left: 10upx;
font-size: 20rpx;
background-color: #699A70;
color: #FFFFFF;
border-radius: 40upx;
padding: 6rpx 34rpx;
text-align: center;
}
}
.gray {
color: #878787;
}
}
.btn {
margin-top: 100upx;
width: 100%;
display: inline-flex;
align-items: center;
justify-content: center;
}
.popupLocale-box {
background: rgba(0, 0, 0, 0.8);
width: 582rpx;
overflow: hidden;
padding: 30rpx 42rpx;
.title {
font-size: 40rpx;
text-align: center;
margin-bottom: 40rpx;
}
.u-button {
width: 260rpx;
height: 56rpx;
border-radius: 40rpx;
}
.item {
display: flex;
align-items: center;
justify-content: center;
padding: 34rpx 0 38rpx 0;
}
.tips {
color: #DC0023;
font-size: 20rpx;
text-align: center;
margin-top: 80rpx;
}
}
}
.setName {
/deep/ .uni-input-placeholder {
padding: 0 20rpx;
}
/deep/ .uni-input-input {
color: #ffffff;
padding: 0 20rpx;
}
}</style>

@ -0,0 +1,46 @@
<template>
<view>
<!-- <image src="../../static/image/start/logo.png" mode="" class="logo"></image> -->
<!-- <image src="../../static/image/start/welcome.png" mode="" class="welcome"></image> -->
<!-- <image src="../../static/image/start/bt-bg.png" mode="" class="btBg"></image> -->
<!-- <view class="btn" @click="goHome">
点击进入
</view> -->
</view>
</template>
<script>
export default {
data() {
return {
};
},
methods: {
/* goHome() {
console.log(1111);
uni.switchTab({
url: '/pages/index/index'
})
} */
},
onShow() {
setTimeout(() => {
uni.switchTab({
url: '/pages/index/index'
})
},1000)
}
}
</script>
<style lang="scss">
page{
height: 100vh;
background:url('../../static/image/start/new_bg.png') no-repeat center center fixed;
background-size: cover;
box-sizing: border-box;
}
</style>

@ -0,0 +1,14 @@
#
## Alias OBJ Material File
# Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
newmtl Color_D06
Ka 0.000000 0.000000 0.000000
Kd 0.894118 0.752941 0.329412
Ks 0.330000 0.330000 0.330000
newmtl Color_D07
Ka 0.000000 0.000000 0.000000
Kd 0.650980 0.513725 0.105882
Ks 0.330000 0.330000 0.330000

File diff suppressed because it is too large Load Diff

@ -0,0 +1,19 @@
#
## Alias OBJ Material File
# Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited
newmtl Color_D06
Ka 0.000000 0.000000 0.000000
Kd 0.894118 0.752941 0.329412
Ks 0.330000 0.330000 0.330000
newmtl ForegroundColor
Ka 0.000000 0.000000 0.000000
Kd 0.000000 0.000000 0.000000
Ks 0.330000 0.330000 0.330000
newmtl Color_D07
Ka 0.000000 0.000000 0.000000
Kd 0.650980 0.513725 0.105882
Ks 0.330000 0.330000 0.330000

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

@ -0,0 +1,5 @@
安卓证书
证书别名: mallapp
秘钥密码: 12345678
证明文件: <同目录的mall-app.keystore>SDSSS

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save