init
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/node_modules
|
||||
/unpackage
|
24
.hbuilderx/launch.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
// launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
|
||||
// launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
27
App.vue
Normal file
@ -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>
|
98
common/index.js
Normal file
@ -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
|
||||
}
|
167
components/navBar/navBar.vue
Normal file
@ -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>
|
288
components/slider-verify/slider-verify.vue
Normal file
@ -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>
|
102
components/tabBar/tabBar.vue
Normal file
@ -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>
|
103
components/welcome/welcome.vue
Normal file
@ -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>
|
67
http/airdrop.js
Normal file
@ -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
|
||||
}
|
13
http/index.js
Normal file
@ -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
|
||||
}
|
||||
|
176
http/interface.js
Normal file
@ -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;
|
||||
}
|
||||
}
|
51
http/login.js
Normal file
@ -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
|
||||
|
||||
}
|
109
http/mine.js
Normal file
@ -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
|
||||
}
|
198
http/readme.md
Normal file
@ -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()方法
|
||||
|
||||
|
||||
|
||||
|
118
http/series.js
Normal file
@ -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
|
||||
};
|
20
index.html
Normal file
@ -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>
|
190
locale/en.json
Normal file
@ -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"
|
||||
|
||||
}
|
36
locale/uni-app.en.json
Normal file
@ -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": {}
|
||||
}
|
36
locale/uni-app.zh-Hans.json
Normal file
@ -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": {}
|
||||
}
|
36
locale/uni-app.zh-Hant.json
Normal file
@ -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": {}
|
||||
}
|
193
locale/zh-Hans.json
Normal file
@ -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"
|
||||
}
|
190
locale/zh-Hant.json
Normal file
@ -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": "給全體員工的一封信"
|
||||
|
||||
}
|
52
main.js
Normal file
@ -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();
|
122
manifest.json
Normal file
@ -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
Normal file
@ -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=="
|
||||
}
|
||||
}
|
||||
}
|
7
package.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"jweixin-module": "^1.6.0",
|
||||
"vue-3d-model": "^1.4.1",
|
||||
"weixin-js-sdk": "^1.6.0"
|
||||
}
|
||||
}
|
253
pages.json
Normal file
@ -0,0 +1,253 @@
|
||||
{
|
||||
"easycom": {
|
||||
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
|
||||
},
|
||||
"pages": [
|
||||
//pages数组中第一项表示应用启动页,参考:https://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": {}
|
||||
}
|
104
pages/index/activeSeries/activeSeries.vue
Normal file
@ -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>
|
428
pages/index/activity/detail.vue
Normal file
@ -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>
|
154
pages/index/activity/index.vue
Normal file
@ -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>
|
595
pages/index/comfirm/comfirm.vue
Normal file
@ -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>
|
124
pages/index/comfirm/payComponet/payComponet.vue
Normal file
@ -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>
|
832
pages/index/detail/detail.vue
Normal file
@ -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>
|
50
pages/index/detail/open3D/open3D.vue
Normal file
@ -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>
|
171
pages/index/dialog/dialog.vue
Normal file
@ -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>
|
395
pages/index/index.vue
Normal file
@ -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>
|
76
pages/index/payment/payment.vue
Normal file
@ -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>
|
76
pages/index/payment/reciveOK.vue
Normal file
@ -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>
|
292
pages/index/series/series.vue
Normal file
@ -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>
|
193
pages/login/login.vue
Normal file
@ -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>
|
201
pages/login/sendCode/sendCode.vue
Normal file
@ -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>
|
134
pages/login/welcome/welcome.vue
Normal file
@ -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()}¬ifyUrl=${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>
|
557
pages/mine/cert/cert.vue
Normal file
@ -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>
|
189
pages/mine/changePhone/changePhone.vue
Normal file
@ -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>
|
223
pages/mine/confirmOrder/confirmOrder.vue
Normal file
@ -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>
|
405
pages/mine/detail/detail.vue
Normal file
@ -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>
|
100
pages/mine/feedback/feedback.vue
Normal file
@ -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>
|
849
pages/mine/index.vue
Normal file
@ -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 = "";
|
||||
// 如果localStorage中有isSetPass 说明已经设置过操作密码,不需要再次验证
|
||||
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>
|
367
pages/mine/notice/notice.vue
Normal file
@ -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>
|
152
pages/mine/realName/realName.vue
Normal file
@ -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>
|
501
pages/mine/setting/setting.vue
Normal file
@ -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>
|
46
pages/start/start.vue
Normal file
@ -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>
|
14
static/1.mtl
Normal file
@ -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
|
||||
|
25988
static/1.obj
Normal file
19
static/5.mtl
Normal file
@ -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
|
||||
|
76656
static/5.obj
Normal file
BIN
static/app.png
Normal file
After Width: | Height: | Size: 1.8 MiB |
BIN
static/bg-3d.png
Normal file
After Width: | Height: | Size: 403 KiB |
5
static/book.txt
Normal file
@ -0,0 +1,5 @@
|
||||
安卓证书
|
||||
|
||||
证书别名: mallapp
|
||||
秘钥密码: 12345678
|
||||
证明文件: <同目录的mall-app.keystore>SDSSS
|
BIN
static/code.jpg
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
static/image/home/1.png
Normal file
After Width: | Height: | Size: 451 KiB |
BIN
static/image/home/1/1.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
static/image/home/1/2.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
static/image/home/1/bg.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
static/image/home/1/flower.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
static/image/home/1/line.png
Normal file
After Width: | Height: | Size: 134 B |
BIN
static/image/home/1/top-bg.png
Normal file
After Width: | Height: | Size: 3.5 MiB |
BIN
static/image/home/1/top-bg1.png
Normal file
After Width: | Height: | Size: 1.6 MiB |
BIN
static/image/home/222.png
Normal file
After Width: | Height: | Size: 382 KiB |
BIN
static/image/home/333.png
Normal file
After Width: | Height: | Size: 465 KiB |
BIN
static/image/home/activity/article.png
Normal file
After Width: | Height: | Size: 578 KiB |
BIN
static/image/home/activity/bg.png
Normal file
After Width: | Height: | Size: 244 KiB |
BIN
static/image/home/activity/container.png
Normal file
After Width: | Height: | Size: 116 KiB |
BIN
static/image/home/activity/from.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
static/image/home/activity/right.png
Normal file
After Width: | Height: | Size: 280 B |
BIN
static/image/home/activity/series.png
Normal file
After Width: | Height: | Size: 3.1 MiB |
BIN
static/image/home/activity/series1.png
Normal file
After Width: | Height: | Size: 3.0 MiB |
BIN
static/image/home/activity/title.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
static/image/home/activity/wen_an.png
Normal file
After Width: | Height: | Size: 630 KiB |
BIN
static/image/home/activity/xqy1_01.png
Normal file
After Width: | Height: | Size: 1.6 MiB |
BIN
static/image/home/activity/xqy1_02.png
Normal file
After Width: | Height: | Size: 777 KiB |
BIN
static/image/home/activity/xqy1_03.png
Normal file
After Width: | Height: | Size: 1.0 MiB |
BIN
static/image/home/activity/xqy1_04.png
Normal file
After Width: | Height: | Size: 1.5 MiB |
BIN
static/image/home/activity/xqy1_05.png
Normal file
After Width: | Height: | Size: 1.0 MiB |
BIN
static/image/home/activity/xqy1_06.png
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
static/image/home/activity/xqy1_07.png
Normal file
After Width: | Height: | Size: 382 KiB |
BIN
static/image/home/bg-info.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
static/image/home/bg.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
static/image/home/button.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
static/image/home/detail-bg.png
Normal file
After Width: | Height: | Size: 7.1 MiB |
BIN
static/image/home/detail-kind-bg.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
static/image/home/detail_bg.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
static/image/home/down-icon.png
Normal file
After Width: | Height: | Size: 623 B |
BIN
static/image/home/drawing-board.png
Normal file
After Width: | Height: | Size: 5.1 MiB |
BIN
static/image/home/false.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
static/image/home/flower.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
static/image/home/fonchain.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
static/image/home/fontree-white.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
static/image/home/fontree.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
static/image/home/from.png
Normal file
After Width: | Height: | Size: 7.6 KiB |