清理代码

This commit is contained in:
2022-02-08 09:17:12 +08:00
parent 0bfdcdf6af
commit ab958d0777
16 changed files with 1332 additions and 1817 deletions

View File

@@ -4,8 +4,6 @@
"description": "ZH健康",
"main": "main.js",
"dependencies": {
"bitcore-lib": "^8.25.25",
"bitcore-mnemonic": "^8.25.25",
"moment": "^2.29.1",
"uni-read-pages": "^1.0.5",
"uni-simple-router": "^2.0.7",

View File

@@ -1,6 +1,6 @@
<template>
<view class="im--img" :class="guest ? 'right': 'left'">
<image class="src" :src="msg.thumbnail" @click="previewImage" mode="widthFix"></image>
<view class="im--image" :class="guest ? 'right': 'left'">
<image class="img" :src="msg.thumbnail" @click="previewImage" mode="widthFix"></image>
</view>
</template>
@@ -10,7 +10,15 @@
props: {
msg: {
type: Object,
default: {}
default: () => {
return {
local: '',
remote: '',
objectName: '',
thumbnail: '',
isFull: false
}
}
},
guest: {
type: Boolean,
@@ -30,22 +38,23 @@
}
</script>
<style scoped>
.im--img {
padding: 19rpx;
}
<style scoped lang="scss">
.im--image {
padding: 20rpx;
.im--img.left {
border-radius: 0 20rpx 20rpx 20rpx;
background: white;
}
&.left {
border-radius: 0 20rpx 20rpx 20rpx;
background: white;
}
.im--img.right {
border-radius: 20rpx 0 20rpx 20rpx;
background: #34CE98;
}
&.right {
border-radius: 20rpx 0 20rpx 20rpx;
background: #34CE98;
}
.src {
width: 240rpx;
.img {
width: 150rpx;
border-radius: 10rpx;
}
}
</style>

View File

@@ -7,11 +7,6 @@
<script>
export default {
name: 'showText',
data() {
return {
};
},
props: {
msg: {
type: Object,
@@ -25,22 +20,22 @@
}
</script>
<style scoped>
<style scoped lang="scss">
.im--text {
max-width: 400rpx;
padding: 20rpx;
font-size: 28rpx;
line-height: 40rpx;
}
.im--text.left {
border-radius: 0 20rpx 20rpx 20rpx;
background: white;
}
&.left {
border-radius: 0 20rpx 20rpx 20rpx;
background: white;
}
.im--text.right {
border-radius: 20rpx 0 20rpx 20rpx;
background: #34CE98;
color: white;
&.right {
border-radius: 20rpx 0 20rpx 20rpx;
background: $main-color;
color: white;
}
}
</style>

View File

@@ -1,9 +1,9 @@
<template>
<view>
<view class="im--audio" :class="guest ? 'right': 'left'" @click="onPlayMsg">
<image v-if="!guest" class="audio-mp3" src="@/static/icon/audio_green.png" mode="widthFix"></image>
<text class="audio-text">"{{msg.duration}}"</text>
<image v-if="guest" class="audio-mp3" src="@/static/icon/audio_white.png" mode="widthFix"></image>
<view class="im--voice" :class="guest ? 'right': 'left'" @click="onPlayMsg">
<image v-if="!guest" class="icon" src="@/static/icon/audio_green.png" mode="widthFix"></image>
<text class="duration">{{msg.duration}}"</text>
<image v-if="guest" class="icon" src="@/static/icon/audio_white.png" mode="widthFix"></image>
</view>
</view>
</template>
@@ -57,8 +57,8 @@
}
</script>
<style scoped>
.im--audio {
<style scoped lang="scss">
.im--voice {
flex-direction: row;
justify-content: space-between;
align-items: center;
@@ -66,33 +66,30 @@
width: 170rpx;
padding: 0 20rpx;
box-sizing: border-box;
}
,
.im--audio.left {
border-radius: 0 20rpx 20rpx 20rpx;
background: white;
}
.icon {
width: 38rpx;
height: 38rpx;
}
.im--audio.right {
border-radius: 20rpx 0 20rpx 20rpx;
background: #34CE98;
}
&.left {
border-radius: 0 20rpx 20rpx 20rpx;
background: white;
.audio-mp3 {
width: 38rpx;
height: 38rpx;
}
.duration {
color: #333;
font-size: 30rpx;
}
}
.audio-text {
font-size: 30rpx;
}
&.right {
border-radius: 20rpx 0 20rpx 20rpx;
background: $main-color;
.im--audio.left .audio-text {
color: #333;
}
.im--audio.right .audio-text {
color: white;
.duration {
color: white;
font-size: 30rpx;
}
}
}
</style>

View File

@@ -1,64 +1,68 @@
<template>
<view class="content vertical">
<!-- logo -->
<image class="logo" src="@/static/wallet/logo.png" mode="widthFix"></image>
<!-- 副标题 -->
<view class="sub-title">激活您的ZH健康钱包获取钱包地址地址可以理解为您的个人银行卡卡号</view>
<!-- 按钮 -->
<view class="wallet-btn" @click="$Router.replace({name: 'WalletCreate'})">激活钱包</view>
</view>
<view class="content vertical">
<!-- logo -->
<image class="logo" src="@/static/wallet/logo.png" mode="widthFix"></image>
<!-- 副标题 -->
<view class="sub-title">激活您的ZH健康钱包获取钱包地址地址可以理解为您的个人银行卡卡号</view>
<!-- 按钮 -->
<view class="wallet-btn" @click="$Router.replace({name: 'WalletCreate'})">激活钱包</view>
</view>
</template>
<script>
export default {
data() {
return {
export default {
data() {
return {
}
},
methods: {
}
},
methods: {
}
}
}
}
</script>
<style>
page {
background-color: white;
}
page {
background-color: white;
}
</style>
<style lang="scss" scoped>
.content{
position: relative;
height: 100vh;
padding: 0 15vw;
text-align: center;
.logo{
width: 138rpx;
vertical-align: top;
margin-bottom: 20vh;
}
.sub-title{
font-size: $title-size-m;
color: $text-gray;
}
.wallet-btn{
width: 100%;
background-color: $main-color;
height: 90rpx;
line-height: 90rpx;
margin-top: $margin * 2;
border-radius: $radius-lg;
color: white;
font-weight: bold;
font-size: $title-size;
&.hollow{
background-color: white;
color: $main-color;
border:solid 2rpx $main-color;
box-sizing: border-box;
}
}
}
.content {
position: relative;
height: 100vh;
padding: 0 15vw;
text-align: center;
.logo {
width: 138rpx;
vertical-align: top;
margin-bottom: 20vh;
}
.sub-title {
font-size: $title-size-m;
color: $text-gray;
}
.wallet-btn {
width: 100%;
background-color: $main-color;
height: 90rpx;
line-height: 90rpx;
margin-top: $margin * 2;
border-radius: $radius-lg;
color: white;
font-weight: bold;
font-size: $title-size;
&.hollow {
background-color: white;
color: $main-color;
border: solid 2rpx $main-color;
box-sizing: border-box;
}
}
}
</style>

View File

@@ -1,187 +1,193 @@
<template>
<view>
<!-- 设置钱包密码 -->
<view class="password">
<view class="prompt">请设置6位数字密码建议不要使用连续的数字</view>
<view class="group">
<view class="inputs" @click="onShowKet('password')">
<block v-if="password.length > 0">
<text v-for="item in password.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'password'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="password.length === 0" class="placeholder">请设置密码</text>
</block>
</view>
<view class="inputs" :class="{'hide': verify === ''}" @click="onShowKet('verify')">
<block v-if="verify.length > 0">
<text v-for="item in verify.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'verify'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="verify.length === 0" class="placeholder">请确认密码</text>
</block>
</view>
</view>
</view>
<!-- key键盘 -->
<u-keyboard
mode="number"
random
dotDisabled
:overlay="false"
:show="keyShow"
:showCancel="false"
@change="keyValChange"
@backspace="keyValBackspace"
@confirm="keyShow = false"
></u-keyboard>
<!-- 按钮 -->
<view class="buttons">
<button type="default" form-type="submit" @click="createWallet">确认激活</button>
</view>
</view>
<view>
<!-- 设置钱包密码 -->
<view class="password">
<view class="prompt">请设置6位数字密码建议不要使用连续的数字</view>
<view class="group">
<view class="inputs" @click="onShowKet('password')">
<block v-if="password.length > 0">
<text v-for="item in password.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'password'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="password.length === 0" class="placeholder">请设置密码</text>
</block>
</view>
<view class="inputs" :class="{'hide': verify === ''}" @click="onShowKet('verify')">
<block v-if="verify.length > 0">
<text v-for="item in verify.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'verify'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="verify.length === 0" class="placeholder">请确认密码</text>
</block>
</view>
</view>
</view>
<!-- key键盘 -->
<u-keyboard mode="number" random dotDisabled :overlay="false" :show="keyShow" :showCancel="false"
@change="keyValChange" @backspace="keyValBackspace" @confirm="keyShow = false"></u-keyboard>
<!-- 按钮 -->
<view class="buttons">
<button type="default" form-type="submit" @click="createWallet">确认激活</button>
</view>
</view>
</template>
<script>
import { security } from '@/apis/interfaces/wallet';
export default {
data() {
return {
password: '',
verify : '',
valKye : '',
keyShow : false
};
},
methods: {
// 唤起key
onShowKet(key){
this.valKye = key
this.keyShow = true
},
// 键盘输入
keyValChange(e){
if(this[this.valKye].length >= 6) return
this[this.valKye] += e
},
// 键盘删除
keyValBackspace(e){
if(this[this.valKye].length) this[this.valKye] = this[this.valKye].substr(0, this[this.valKye].length - 1)
},
// 激活钱包
createWallet() {
if (this.password === '' || this.verify === '') {
uni.showToast({
icon: 'none',
title: '请设置密码'
});
return;
}
if (this.password !== this.verify) {
uni.showToast({
icon: 'none',
title: '两次输入密码不一致'
});
return;
}
import {
security
} from '@/apis/interfaces/wallet';
export default {
data() {
return {
password: '',
verify: '',
valKye: '',
keyShow: false
};
},
methods: {
// 唤起key
onShowKet(key) {
this.valKye = key
this.keyShow = true
},
// 键盘输入
keyValChange(e) {
if (this[this.valKye].length >= 6) return
this[this.valKye] += e
},
// 键盘删除
keyValBackspace(e) {
if (this[this.valKye].length) this[this.valKye] = this[this.valKye].substr(0, this[this.valKye].length -
1)
},
// 激活钱包
createWallet() {
if (this.password === '' || this.verify === '') {
uni.showToast({
icon: 'none',
title: '请设置密码'
});
return;
}
if (this.password !== this.verify) {
uni.showToast({
icon: 'none',
title: '两次输入密码不一致'
});
return;
}
security({
code: Number(this.password)
}).then(res => {
this.$Router.replace({
name: 'WalletProperty'
})
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
});
});
}
}
};
security({
code: Number(this.password)
}).then(res => {
this.$Router.replace({
name: 'WalletProperty'
})
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
});
});
}
}
};
</script>
<style>
.flicker-animation{
animation: flicker .8s infinite;
}
@keyframes flicker{
0%{opacity: 0;}
100{opacity: 1;}
}
.flicker-animation {
animation: flicker .8s infinite;
}
@keyframes flicker {
0% {
opacity: 0;
}
100 {
opacity: 1;
}
}
</style>
<style lang="scss" scoped>
// 副标题
.sub-title {
color: $text-gray;
text-align: center;
margin: $margin * 2 $margin;
font-size: $title-size-m;
}
// 副标题
.sub-title {
color: $text-gray;
text-align: center;
margin: $margin * 2 $margin;
font-size: $title-size-m;
}
// 设置密码
.password {
padding: 0 $padding * 2;
.prompt {
margin-top: $margin * 2;
font-size: $title-size-m;
color: $main-color;
text-align: center;
}
// 设置密码
.password {
padding: 0 $padding * 2;
.group {
padding-top: $padding;
.inputs {
padding: 10rpx $padding + 10;
margin-top: $margin;
border-radius: $radius-m;
background-color: $window-color;
height: 70rpx;
line-height: 70rpx;
font-size: $title-size-lg;
text-align: center;
text{
padding: 0 10rpx;
text-align: center;
}
.placeholder{
color: $text-gray;
}
}
}
}
.prompt {
margin-top: $margin * 2;
font-size: $title-size-m;
color: $main-color;
text-align: center;
}
// 按钮
.buttons {
padding: $padding * 2;
.text {
text-align: center;
line-height: 90rpx;
height: 90rpx;
margin-bottom: $margin * 2;
font-size: $title-size-lg;
color: $main-color;
font-weight: bold;
}
.group {
padding-top: $padding;
button {
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-m;
color: white;
font-weight: bold;
font-size: $title-size;
&::after{
display: none;
}
}
}
.inputs {
padding: 10rpx $padding + 10;
margin-top: $margin;
border-radius: $radius-m;
background-color: $window-color;
height: 70rpx;
line-height: 70rpx;
font-size: $title-size-lg;
text-align: center;
text {
padding: 0 10rpx;
text-align: center;
}
.placeholder {
color: $text-gray;
}
}
}
}
// 按钮
.buttons {
padding: $padding * 2;
.text {
text-align: center;
line-height: 90rpx;
height: 90rpx;
margin-bottom: $margin * 2;
font-size: $title-size-lg;
color: $main-color;
font-weight: bold;
}
button {
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-m;
color: white;
font-weight: bold;
font-size: $title-size;
&::after {
display: none;
}
}
}
</style>

View File

@@ -1,112 +1,122 @@
<template>
<view>
<!-- 提示信息 -->
<view class="prompt">请按照顺序记录并确保正确备份助记词</view>
<!-- 助记词 -->
<ul class="mnemonic">
<li v-for="(item, index) in mnemonic" :key="index">{{item}}</li>
</ul>
<!-- 按钮 -->
<view class="buttons">
<view class="text">助记词是用户账户的唯一标识不能分享给他人掌握该助记词即可控制该账户与钱包</view>
<!-- <button type="default" @click="goto">验证助记词</button> -->
</view>
</view>
<view>
<!-- 提示信息 -->
<view class="prompt">请按照顺序记录并确保正确备份助记词</view>
<!-- 助记词 -->
<ul class="mnemonic">
<li v-for="(item, index) in mnemonic" :key="index">{{item}}</li>
</ul>
<!-- 按钮 -->
<view class="buttons">
<view class="text">助记词是用户账户的唯一标识不能分享给他人掌握该助记词即可控制该账户与钱包</view>
<!-- <button type="default" @click="goto">验证助记词</button> -->
</view>
</view>
</template>
<script>
import { seed } from "@/apis/interfaces/wallet"
export default {
data() {
return {
mnemonic: []
}
},
mounted() {
seed({
code: this.$Route.query.password
}).then(res => {
this.mnemonic = res.seed.split(' ')
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
})
})
},
methods: {
goto(){
this.$Router.replace({
name: 'WalletValidation',
params: {
seed: this.mnemonic,
sign: this.sign
}
})
}
}
}
import {
seed
} from "@/apis/interfaces/wallet"
export default {
data() {
return {
mnemonic: []
}
},
mounted() {
seed({
code: this.$Route.query.password
}).then(res => {
this.mnemonic = res.seed.split(' ')
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
})
})
},
methods: {
goto() {
this.$Router.replace({
name: 'WalletValidation',
params: {
seed: this.mnemonic,
sign: this.sign
}
})
}
}
}
</script>
<style lang="scss" scoped>
// 提示信息
.prompt{
color: $text-gray;
text-align: center;
line-height: 90rpx;
font-size: $title-size-m;
}
// 跳过
.skip{
padding: $padding * 2;
text-align: center;
color: $text-gray;
navigator{
color: $main-color;
margin-left: $margin/2;
display: inline-block;
}
}
// 助记词
.mnemonic{
margin: $margin $margin * 2;
border-radius: $radius-m;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
background-color: white;
padding: $padding;
list-style: none;
display: flex;
flex-wrap: wrap;
li{
text-align: center;
height: 58rpx;
padding: 0 $padding/2;
line-height: 58rpx;
margin: $margin / 2;
color: $text-color;
background: rgba($color: $border-color, $alpha: .4);
}
}
// 按钮
.buttons{
padding: $padding $padding * 2;
.text{
text-align: center;
margin-bottom: $margin * 2;
font-size: $title-size-m;
color: $text-price;
}
button{
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-lg;
color: white;
font-weight: bold;
font-size: $title-size;
&::after{
display: none;
}
}
}
// 提示信息
.prompt {
color: $text-gray;
text-align: center;
line-height: 90rpx;
font-size: $title-size-m;
}
// 跳过
.skip {
padding: $padding * 2;
text-align: center;
color: $text-gray;
navigator {
color: $main-color;
margin-left: $margin/2;
display: inline-block;
}
}
// 助记词
.mnemonic {
margin: $margin $margin * 2;
border-radius: $radius-m;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
background-color: white;
padding: $padding;
list-style: none;
display: flex;
flex-wrap: wrap;
li {
text-align: center;
height: 58rpx;
padding: 0 $padding/2;
line-height: 58rpx;
margin: $margin / 2;
color: $text-color;
background: rgba($color: $border-color, $alpha: .4);
}
}
// 按钮
.buttons {
padding: $padding $padding * 2;
.text {
text-align: center;
margin-bottom: $margin * 2;
font-size: $title-size-m;
color: $text-price;
}
button {
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-lg;
color: white;
font-weight: bold;
font-size: $title-size;
&::after {
display: none;
}
}
}
</style>

View File

@@ -1,119 +1,130 @@
<template>
<view>
<!-- 私钥 -->
<view class="keys">
<view class="title">您的ZH托管钱包</view>
<view class="key">{{key || '-'}}</view>
<view class="copykey" @click="copykey">复制我的私钥</view>
</view>
<!-- 疑问 -->
<view class="doubt" v-if="rules.length > 0">
<view class="doubt-item" v-for="(item, index) in rules" :key="index">
<view class="title">{{item.title || '-'}}</view>
<view class="content">{{item.description || '-'}}</view>
</view>
</view>
<!-- 免责说明 -->
<!-- <view class="liability">
<view>
<!-- 私钥 -->
<view class="keys">
<view class="title">您的ZH托管钱包</view>
<view class="key">{{key || '-'}}</view>
<view class="copykey" @click="copykey">复制我的私钥</view>
</view>
<!-- 疑问 -->
<view class="doubt" v-if="rules.length > 0">
<view class="doubt-item" v-for="(item, index) in rules" :key="index">
<view class="title">{{item.title || '-'}}</view>
<view class="content">{{item.description || '-'}}</view>
</view>
</view>
<!-- 免责说明 -->
<!-- <view class="liability">
<navigator url="/pages/wallet/cmsWithDraw">免责条款</navigator>
</view> -->
</view>
</view>
</template>
<script>
import { privatekey, keyrules } from '@/apis/interfaces/wallet'
export default {
data() {
return {
key: "",
rules: [
{
title: "什么是托管钱包?",
description: "托管钱包顾名思义就是用户把私钥和数字资产委托给其他机构管理,也就是就是通过中心化的方式安全管理并保存资产,本质上是与区块链所追求的去中心化相背离的。"
},
{
title: "什么是钱包私钥?",
description: "作为管理和使用加密货币最关键的东西,私钥对所有数字货币用户而言具有所有权,拥有私钥才能支配相应的加密资产。"
}
]
};
},
mounted() {
privatekey(this.$Route.query.password).then(res => {
this.key = res.private_key
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
methods:{
copykey(){
uni.setClipboardData({
data: this.key
})
}
}
}
import {
privatekey,
keyrules
} from '@/apis/interfaces/wallet'
export default {
data() {
return {
key: "",
rules: [{
title: "什么是托管钱包?",
description: "托管钱包顾名思义就是用户把私钥和数字资产委托给其他机构管理,也就是就是通过中心化的方式安全管理并保存资产,本质上是与区块链所追求的去中心化相背离的。"
},
{
title: "什么是钱包私钥?",
description: "作为管理和使用加密货币最关键的东西,私钥对所有数字货币用户而言具有所有权,拥有私钥才能支配相应的加密资产。"
}
]
};
},
mounted() {
privatekey(this.$Route.query.password).then(res => {
this.key = res.private_key
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
methods: {
copykey() {
uni.setClipboardData({
data: this.key
})
}
}
}
</script>
<style lang="scss">
.keys{
margin: $margin * 2;
background: white;
padding: $padding * 2;
box-shadow: 0 0 4rpx 4rpx rgba($color: #000000, $alpha: .02);
border-radius: $radius;
.title{
text-align: center;
font-weight: bold;
font-size: $title-size + 4;
color: $text-color;
}
.key{
padding: $padding * 2 0;
text-align: center;
color: $main-color;
word-wrap: break-word;
}
.copykey{
background-color: $main-color;
color: white;
height: 95rpx;
line-height: 95rpx;
text-align: center;
font-size: $title-size;
border-radius: $radius-m;
font-weight: bold;
}
}
.doubt{
margin: $margin $margin * 2;
.doubt-item{
padding: $padding 0;
.title{
font-weight: bold;
color: $text-color;
line-height: 50rpx;
font-size: $title-size + 2;
}
.content{
color: $text-gray;
font-size: $title-size-m;
line-height: 40rpx;
}
}
}
.liability{
text-align: center;
color: $text-gray;
@extend .ios-bottom;
navigator{
font-size: $title-size-sm;
display: inline-block;
line-height: 90rpx;
padding: 0 ($padding * 2);
}
}
.keys {
margin: $margin * 2;
background: white;
padding: $padding * 2;
box-shadow: 0 0 4rpx 4rpx rgba($color: #000000, $alpha: .02);
border-radius: $radius;
.title {
text-align: center;
font-weight: bold;
font-size: $title-size + 4;
color: $text-color;
}
.key {
padding: $padding * 2 0;
text-align: center;
color: $main-color;
word-wrap: break-word;
}
.copykey {
background-color: $main-color;
color: white;
height: 95rpx;
line-height: 95rpx;
text-align: center;
font-size: $title-size;
border-radius: $radius-m;
font-weight: bold;
}
}
.doubt {
margin: $margin $margin * 2;
.doubt-item {
padding: $padding 0;
.title {
font-weight: bold;
color: $text-color;
line-height: 50rpx;
font-size: $title-size + 2;
}
.content {
color: $text-gray;
font-size: $title-size-m;
line-height: 40rpx;
}
}
}
.liability {
text-align: center;
color: $text-gray;
@extend .ios-bottom;
navigator {
font-size: $title-size-sm;
display: inline-block;
line-height: 90rpx;
padding: 0 ($padding * 2);
}
}
</style>

View File

@@ -1,359 +1,386 @@
<template>
<view>
<view class="propery">
<view class="propery-content">
<view class="currency">钱包余额</view>
<view class="balance">{{ balance.balance || '0' }}</view>
<view class="frozen">{{ balance.frozen || '0' }} 冻结中</view>
<view class="balance-flex">
<view class="balance-flex-item" @click="showAddress">区块链地址</view>
<view class="balance-flex-item" @click="showPrivatekey('privatekey')">我的私钥</view>
</view>
</view>
</view>
<!-- 账户记录 -->
<view class="record">
<view class="record-tabs">
<view class="tabs-item" :class="logsType === 0 ? 'show': ''" @click="onLogsType(0)">全部</view>
<view class="tabs-item" :class="logsType === 2 ? 'show': ''" @click="onLogsType(2)">收入</view>
<view class="tabs-item" :class="logsType === 1 ? 'show': ''" @click="onLogsType(1)">支出</view>
</view>
<record :list="logs" />
<!-- ios安全距离 -->
<view class="ios-bottom"></view>
</view>
<!-- 钱包密码 -->
<u-popup :show="passwordShow" @close="resetPassword" mode="center" round="10" borderRadius="10">
<view class="validationPassword">
<view class="from">
<view class="title">验证钱包密码</view>
<view class="inputs">
<text v-for="item in password.length" :key="item"></text>
<text class="flicker-animation">|</text>
</view>
</view>
</view>
</u-popup>
<!-- key -->
<u-keyboard
mode="number"
random
dotDisabled
:overlay="false"
:show="passwordShow"
confirmText="验证"
@change="keyValChange"
@backspace="keyValBackspace"
@confirm="payPassword('confirm', passwordPages)"
@cancel="passwordShow = false"
></u-keyboard>
</view>
<view>
<view class="propery">
<view class="propery-content">
<view class="currency">钱包余额</view>
<view class="balance">{{ balance.balance || '0' }}</view>
<view class="frozen">{{ balance.frozen || '0' }} 冻结中</view>
<view class="balance-flex">
<view class="balance-flex-item" @click="showAddress">区块链地址</view>
<view class="balance-flex-item" @click="showPrivatekey('privatekey')">我的私钥</view>
</view>
</view>
</view>
<!-- 账户记录 -->
<view class="record">
<view class="record-tabs">
<view class="tabs-item" :class="logsType === 0 ? 'show': ''" @click="onLogsType(0)">全部</view>
<view class="tabs-item" :class="logsType === 2 ? 'show': ''" @click="onLogsType(2)">收入</view>
<view class="tabs-item" :class="logsType === 1 ? 'show': ''" @click="onLogsType(1)">支出</view>
</view>
<record :list="logs" />
<!-- ios安全距离 -->
<view class="ios-bottom"></view>
</view>
<!-- 钱包密码 -->
<u-popup :show="passwordShow" @close="resetPassword" mode="center" round="10" borderRadius="10">
<view class="validationPassword">
<view class="from">
<view class="title">验证钱包密码</view>
<view class="inputs">
<text v-for="item in password.length" :key="item"></text>
<text class="flicker-animation">|</text>
</view>
</view>
</view>
</u-popup>
<!-- key -->
<u-keyboard mode="number" random dotDisabled :overlay="false" :show="passwordShow" confirmText="验证"
@change="keyValChange" @backspace="keyValBackspace" @confirm="payPassword('confirm', passwordPages)"
@cancel="passwordShow = false"></u-keyboard>
</view>
</template>
<script>
import record from '@/components/property/record'
import { sum, logs, securityCheck } from '@/apis/interfaces/wallet'
export default {
components: {
record
},
data() {
return {
balance : {},
logs : [],
logsType : 0,
password : '',
passwordShow : false,
passwordPages: ''
};
},
onShow() {
Promise.all([
sum(),
logs()
]).then(res => {
this.balance = res[0]
this.logs = res[1]
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
})
})
},
methods: {
// 键盘输入
keyValChange(e){
if(this.password.length >= 6) return
this.password += e
},
// 键盘删除
keyValBackspace(e){
if(this.password.length) this.password = this.password.substr(0, this.password.length - 1)
},
// 弹出私钥
showPrivatekey(pages){
this.passwordShow = true
this.passwordPages = pages
},
// 重置密码
resetPassword(){
this.passwordShow = false
this.password = ''
},
// 验证私钥
payPassword(type){
if(type === 'confirm'){
if(this.password === '') {
uni.showToast({
title: '请输入安全密码',
icon : 'none'
})
return
}
securityCheck(this.password).then(res => {
switch (this.passwordPages){
case 'privatekey':
this.$Router.push({name:'WalletPrivatekey', params: {password: this.password}})
break;
case 'ResetPassword':
this.$Router.push({name:'ResetPassword', params: {password: this.password}})
break;
case 'WalletMnemonic':
this.$Router.push({name:'WalletMnemonic', params: {password: this.password}})
break;
}
this.resetPassword()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none',
})
})
return
}
this.$refs.showPassword.close()
},
// 交易记录
onLogsType(index) {
if (this.logsType === index) return
this.logsType = index
this.logs = []
logs({
flag: this.logsType
}).then(res => {
this.logs = res
})
},
// 区块地址
showAddress() {
uni.showModal({
title: '我的区块链地址',
content: this.balance.address,
cancelText: '复制',
cancelColor: '#009B69',
success: (res) => {
if (res.cancel) {
uni.setClipboardData({
data: this.balance.address
})
}
}
})
}
},
onNavigationBarButtonTap(e) {
if (e.index === 0) {
uni.showActionSheet({
itemList: ['导出助记词', '修改密码'],
success: (res) => {
switch (res.tapIndex) {
case 0:
this.showPrivatekey('WalletMnemonic')
break;
case 1:
this.showPrivatekey('ResetPassword')
break;
}
uni.hideLoading()
}
})
}
}
}
import record from '@/components/property/record'
import {
sum,
logs,
securityCheck
} from '@/apis/interfaces/wallet'
export default {
components: {
record
},
data() {
return {
balance: {},
logs: [],
logsType: 0,
password: '',
passwordShow: false,
passwordPages: ''
};
},
onShow() {
Promise.all([
sum(),
logs()
]).then(res => {
this.balance = res[0]
this.logs = res[1]
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
})
})
},
methods: {
// 键盘输入
keyValChange(e) {
if (this.password.length >= 6) return
this.password += e
},
// 键盘删除
keyValBackspace(e) {
if (this.password.length) this.password = this.password.substr(0, this.password.length - 1)
},
// 弹出私钥
showPrivatekey(pages) {
this.passwordShow = true
this.passwordPages = pages
},
// 重置密码
resetPassword() {
this.passwordShow = false
this.password = ''
},
// 验证私钥
payPassword(type) {
if (type === 'confirm') {
if (this.password === '') {
uni.showToast({
title: '请输入安全密码',
icon: 'none'
})
return
}
securityCheck(this.password).then(res => {
switch (this.passwordPages) {
case 'privatekey':
this.$Router.push({
name: 'WalletPrivatekey',
params: {
password: this.password
}
})
break;
case 'ResetPassword':
this.$Router.push({
name: 'ResetPassword',
params: {
password: this.password
}
})
break;
case 'WalletMnemonic':
this.$Router.push({
name: 'WalletMnemonic',
params: {
password: this.password
}
})
break;
}
this.resetPassword()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none',
})
})
return
}
this.$refs.showPassword.close()
},
// 交易记录
onLogsType(index) {
if (this.logsType === index) return
this.logsType = index
this.logs = []
logs({
flag: this.logsType
}).then(res => {
this.logs = res
})
},
// 区块地址
showAddress() {
uni.showModal({
title: '我的区块链地址',
content: this.balance.address,
cancelText: '复制',
cancelColor: '#009B69',
success: (res) => {
if (res.cancel) {
uni.setClipboardData({
data: this.balance.address
})
}
}
})
}
},
onNavigationBarButtonTap(e) {
if (e.index === 0) {
uni.showActionSheet({
itemList: ['导出助记词', '修改密码'],
success: (res) => {
switch (res.tapIndex) {
case 0:
this.showPrivatekey('WalletMnemonic')
break;
case 1:
this.showPrivatekey('ResetPassword')
break;
}
uni.hideLoading()
}
})
}
}
}
</script>
<style>
.flicker-animation{
animation: flicker .8s infinite;
}
@keyframes flicker{
0%{opacity: 0;}
100{opacity: 1;}
}
.flicker-animation {
animation: flicker .8s infinite;
}
@keyframes flicker {
0% {
opacity: 0;
}
100 {
opacity: 1;
}
}
</style>
<style lang="scss" scoped>
// 验证密码弹出层
.validationPassword{
width: 80vw;
.from{
padding: $padding*2;
text-align: center;
.title{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: $title-size;
padding-bottom: $padding;
}
// input{
// background: $window-color;
// height: 90rpx;
// left: 90rpx;
// font-size: $title-size-lg;
// border-radius: 45rpx;
// }
.inputs {
background-color: $window-color;
height: 90rpx;
line-height: 90rpx;
border-radius: 45rpx;
font-size: $title-size-lg;
text-align: center;
text{
padding: 0 10rpx;
text-align: center;
}
.placeholder{
color: $text-gray;
}
}
}
.buttons{
text-align: center;
padding: 0 $padding*2;
.button{
height: 90rpx;
line-height: 90rpx;
margin-bottom: $margin;
&.cancel{
color: $text-gray;
}
&.confirm{
color: white;
background: $main-color;
border-radius: 45rpx;
}
}
}
//
//
}
// 账户
.propery {
position: relative;
padding-top: var(--status-bar-height);
background-image: linear-gradient(to right, $main-color, #22aa98);
// 验证密码弹出层
.validationPassword {
width: 80vw;
&::before {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
content: " ";
// background-image: url(@/static/background/wallet-back.png);
background-size: 100%;
background-repeat: no-repeat;
}
.from {
padding: $padding*2;
text-align: center;
.propery-content {
position: relative;
z-index: 1;
padding: $padding * 5 $padding * 2;
text-align: center;
.title {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: $title-size;
padding-bottom: $padding;
}
.currency {
font-size: $title-size-m;
color: rgba($color: white, $alpha: .8);
}
// input{
// background: $window-color;
// height: 90rpx;
// left: 90rpx;
// font-size: $title-size-lg;
// border-radius: 45rpx;
// }
.inputs {
background-color: $window-color;
height: 90rpx;
line-height: 90rpx;
border-radius: 45rpx;
font-size: $title-size-lg;
text-align: center;
.balance {
font-size: $title-size * 2;
padding: ($padding / 2) 0;
color: white;
}
text {
padding: 0 10rpx;
text-align: center;
}
.frozen {
background: rgba($color: #000000, $alpha: .1);
color: rgba($color: white, $alpha: .7);
display: inline-block;
padding: 0 $padding;
font-size: $title-size-m;
height: 50rpx;
line-height: 50rpx;
border-radius: $radius-m;
border: solid 1rpx rgba($color: white, $alpha: .4)
}
.placeholder {
color: $text-gray;
}
}
}
.balance-flex {
display: flex;
justify-content: center;
margin-top: $margin * 3;
.buttons {
text-align: center;
padding: 0 $padding*2;
.balance-flex-item {
background-color: white;
width: 200rpx;
height: 75rpx;
line-height: 75rpx;
color: $main-color;
margin: 0 $margin;
border-radius: $radius-m;
font-size: $title-size-lg;
}
}
}
}
.button {
height: 90rpx;
line-height: 90rpx;
margin-bottom: $margin;
// 记录
.record {
background-color: white;
border-radius: $radius $radius 0 0;
padding: $padding ($padding * 2);
margin-top: -$margin;
position: relative;
z-index: 2;
&.cancel {
color: $text-gray;
}
.record-tabs {
display: flex;
justify-content: space-around;
font-weight: bold;
font-size: $title-size;
color: $text-gray;
line-height: 70rpx;
margin-bottom: $margin;
&.confirm {
color: white;
background: $main-color;
border-radius: 45rpx;
}
}
}
.tabs-item {
position: relative;
padding: 0 $padding;
//
//
}
&.show {
color: $main-color;
// 账户
.propery {
position: relative;
padding-top: var(--status-bar-height);
background-image: linear-gradient(to right, $main-color, #22aa98);
&::before {
position: absolute;
bottom: 0;
left: $padding;
right: $padding;
height: 4rpx;
content: " ";
background-color: $main-color;
}
}
}
}
}
&::before {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
content: " ";
// background-image: url(@/static/background/wallet-back.png);
background-size: 100%;
background-repeat: no-repeat;
}
.propery-content {
position: relative;
z-index: 1;
padding: $padding * 5 $padding * 2;
text-align: center;
.currency {
font-size: $title-size-m;
color: rgba($color: white, $alpha: .8);
}
.balance {
font-size: $title-size * 2;
padding: ($padding / 2) 0;
color: white;
}
.frozen {
background: rgba($color: #000000, $alpha: .1);
color: rgba($color: white, $alpha: .7);
display: inline-block;
padding: 0 $padding;
font-size: $title-size-m;
height: 50rpx;
line-height: 50rpx;
border-radius: $radius-m;
border: solid 1rpx rgba($color: white, $alpha: .4)
}
.balance-flex {
display: flex;
justify-content: center;
margin-top: $margin * 3;
.balance-flex-item {
background-color: white;
width: 200rpx;
height: 75rpx;
line-height: 75rpx;
color: $main-color;
margin: 0 $margin;
border-radius: $radius-m;
font-size: $title-size-lg;
}
}
}
}
// 记录
.record {
background-color: white;
border-radius: $radius $radius 0 0;
padding: $padding ($padding * 2);
margin-top: -$margin;
position: relative;
z-index: 2;
.record-tabs {
display: flex;
justify-content: space-around;
font-weight: bold;
font-size: $title-size;
color: $text-gray;
line-height: 70rpx;
margin-bottom: $margin;
.tabs-item {
position: relative;
padding: 0 $padding;
&.show {
color: $main-color;
&::before {
position: absolute;
bottom: 0;
left: $padding;
right: $padding;
height: 4rpx;
content: " ";
background-color: $main-color;
}
}
}
}
}
</style>

View File

@@ -1,198 +1,203 @@
<template>
<view>
<!-- 设置钱包密码 -->
<view class="password">
<view class="prompt">请设置6位数字密码建议不要使用连续的数字</view>
<view class="group">
<view class="inputs" @click="onShowKet('password')">
<block v-if="password.length > 0">
<text v-for="item in password.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'password'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="password.length === 0" class="placeholder">请设置密码</text>
</block>
</view>
<view class="inputs" :class="{'hide': verify === ''}" @click="onShowKet('verify')">
<block v-if="verify.length > 0">
<text v-for="item in verify.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'verify'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="verify.length === 0" class="placeholder">请确认密码</text>
</block>
</view>
</view>
</view>
<!-- key键盘 -->
<u-keyboard
mode="number"
random
dotDisabled
:overlay="false"
:show="keyShow"
:showCancel="false"
@change="keyValChange"
@backspace="keyValBackspace"
@confirm="keyShow = false"
></u-keyboard>
<!-- 按钮 -->
<view class="buttons">
<button type="default" form-type="submit" @click="createWallet">确认修改</button>
</view>
</view>
<view>
<!-- 设置钱包密码 -->
<view class="password">
<view class="prompt">请设置6位数字密码建议不要使用连续的数字</view>
<view class="group">
<view class="inputs" @click="onShowKet('password')">
<block v-if="password.length > 0">
<text v-for="item in password.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'password'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="password.length === 0" class="placeholder">请设置密码</text>
</block>
</view>
<view class="inputs" :class="{'hide': verify === ''}" @click="onShowKet('verify')">
<block v-if="verify.length > 0">
<text v-for="item in verify.length" :key="item"></text>
</block>
<block v-if="keyShow && valKye === 'verify'">
<text class="flicker-animation">|</text>
</block>
<block v-else>
<text v-if="verify.length === 0" class="placeholder">请确认密码</text>
</block>
</view>
</view>
</view>
<!-- key键盘 -->
<u-keyboard mode="number" random dotDisabled :overlay="false" :show="keyShow" :showCancel="false"
@change="keyValChange" @backspace="keyValBackspace" @confirm="keyShow = false"></u-keyboard>
<!-- 按钮 -->
<view class="buttons">
<button type="default" form-type="submit" @click="createWallet">确认修改</button>
</view>
</view>
</template>
<script>
import { securityReset } from '@/apis/interfaces/wallet'
export default {
data() {
return {
password: '',
verify: '',
oldPassword: '',
valKye : '',
keyShow : false
}
},
onLoad() {
this.oldPassword = this.$Route.query.password
},
methods: {
// 唤起key
onShowKet(key){
this.valKye = key
this.keyShow = true
},
// 键盘输入
keyValChange(e){
if(this[this.valKye].length >= 6) return
this[this.valKye] += e
},
// 键盘删除
keyValBackspace(e){
if(this[this.valKye].length) this[this.valKye] = this[this.valKye].substr(0, this[this.valKye].length - 1)
},
// 修改密码
createWallet() {
if (this.password === '' || this.verify === '') {
uni.showToast({
icon: 'none',
title: '请设置密码'
})
return
}
if (this.password !== this.verify) {
uni.showToast({
icon: 'none',
title: '两次输入密码不一致'
})
return
}
securityReset({
new_code: this.password,
code: this.oldPassword
}).then(res => {
uni.showModal({
title: '提示',
content: '密码已重置',
showCancel:false,
success: res=> {
uni.navigateBack()
}
})
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
})
})
}
}
}
import {
securityReset
} from '@/apis/interfaces/wallet'
export default {
data() {
return {
password: '',
verify: '',
oldPassword: '',
valKye: '',
keyShow: false
}
},
onLoad() {
this.oldPassword = this.$Route.query.password
},
methods: {
// 唤起key
onShowKet(key) {
this.valKye = key
this.keyShow = true
},
// 键盘输入
keyValChange(e) {
if (this[this.valKye].length >= 6) return
this[this.valKye] += e
},
// 键盘删除
keyValBackspace(e) {
if (this[this.valKye].length) this[this.valKye] = this[this.valKye].substr(0, this[this.valKye].length -
1)
},
// 修改密码
createWallet() {
if (this.password === '' || this.verify === '') {
uni.showToast({
icon: 'none',
title: '请设置密码'
})
return
}
if (this.password !== this.verify) {
uni.showToast({
icon: 'none',
title: '两次输入密码不一致'
})
return
}
securityReset({
new_code: this.password,
code: this.oldPassword
}).then(res => {
uni.showModal({
title: '提示',
content: '密码已重置',
showCancel: false,
success: res => {
uni.navigateBack()
}
})
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
})
})
}
}
}
</script>
<style>
.flicker-animation{
animation: flicker .8s infinite;
}
@keyframes flicker{
0%{opacity: 0;}
100{opacity: 1;}
}
.flicker-animation {
animation: flicker .8s infinite;
}
@keyframes flicker {
0% {
opacity: 0;
}
100 {
opacity: 1;
}
}
</style>
<style lang="scss" scoped>
// 副标题
.sub-title {
color: $text-gray;
text-align: center;
margin: $margin * 2 $margin;
font-size: $title-size-m;
}
// 副标题
.sub-title {
color: $text-gray;
text-align: center;
margin: $margin * 2 $margin;
font-size: $title-size-m;
}
// 设置密码
.password {
padding: 0 $padding * 2;
.prompt {
margin-top: $margin * 2;
font-size: $title-size-m;
color: $main-color;
text-align: center;
}
// 设置密码
.password {
padding: 0 $padding * 2;
.group {
padding-top: $padding;
.inputs {
padding: 10rpx $padding + 10;
margin-top: $margin;
border-radius: $radius-m;
background-color: $window-color;
height: 70rpx;
line-height: 70rpx;
font-size: $title-size-lg;
text-align: center;
text{
padding: 0 10rpx;
text-align: center;
}
.placeholder{
color: $text-gray;
}
}
}
}
.prompt {
margin-top: $margin * 2;
font-size: $title-size-m;
color: $main-color;
text-align: center;
}
// 按钮
.buttons {
padding: $padding * 2;
.text {
text-align: center;
line-height: 90rpx;
height: 90rpx;
margin-bottom: $margin * 2;
font-size: $title-size-lg;
color: $main-color;
font-weight: bold;
}
.group {
padding-top: $padding;
button {
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-m;
color: white;
font-weight: bold;
font-size: $title-size;
&::after{
display: none;
}
}
}
.inputs {
padding: 10rpx $padding + 10;
margin-top: $margin;
border-radius: $radius-m;
background-color: $window-color;
height: 70rpx;
line-height: 70rpx;
font-size: $title-size-lg;
text-align: center;
text {
padding: 0 10rpx;
text-align: center;
}
.placeholder {
color: $text-gray;
}
}
}
}
// 按钮
.buttons {
padding: $padding * 2;
.text {
text-align: center;
line-height: 90rpx;
height: 90rpx;
margin-bottom: $margin * 2;
font-size: $title-size-lg;
color: $main-color;
font-weight: bold;
}
button {
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-m;
color: white;
font-weight: bold;
font-size: $title-size;
&::after {
display: none;
}
}
}
</style>

View File

@@ -1,170 +1,178 @@
<template>
<view>
<!-- 提示信息 -->
<view class="prompt">
验证您的钱包助记词
</view>
<!-- 助记词 -->
<view class="mnemonic">
<view
class="item"
v-for="(item, index) in validation"
:key="index"
:class="item === null ? 'hide': ''"
@click="onKeys('removeKey', index)"
>{{ item }}</view>
</view>
<!-- 选择助记词 -->
<block v-if="mnemonic.length > 0">
<view class="mnemonic-title">
按顺序填写助记词
</view>
<view class="mnemonic-select">
<view class="item" v-for="(item, index) in mnemonic" :key="index" @click="onKeys('addKey', index)">{{ item }}</view>
</view>
</block>
<!-- 按钮 -->
<view class="buttons">
<button type="default" @click="verifyMnemonic">验证</button>
</view>
</view>
<view>
<!-- 提示信息 -->
<view class="prompt">
验证您的钱包助记词
</view>
<!-- 助记词 -->
<view class="mnemonic">
<view class="item" v-for="(item, index) in validation" :key="index" :class="item === null ? 'hide': ''"
@click="onKeys('removeKey', index)">{{ item }}</view>
</view>
<!-- 选择助记词 -->
<block v-if="mnemonic.length > 0">
<view class="mnemonic-title">
按顺序填写助记词
</view>
<view class="mnemonic-select">
<view class="item" v-for="(item, index) in mnemonic" :key="index" @click="onKeys('addKey', index)">
{{ item }}</view>
</view>
</block>
<!-- 按钮 -->
<view class="buttons">
<button type="default" @click="verifyMnemonic">验证</button>
</view>
</view>
</template>
<script>
import { hash } from "../../apis/interfaces/wallet"
export default {
data() {
return {
validation : new Array(12).fill(null), // 验证key
mnemonic : [], // 助记词key
sign : '', // 助记词校验签名
seedString : '', // 助记词原词
}
},
mounted() {
let seed = this.$Route.query.seed.split(',')
seed.sort(() => {
return Math.random() - .5
});
console.log(seed)
// this.mnemonic = seed
// this.sign = this.$Route.query.sign
// this.seedString = this.$Route.query.seed
},
methods: {
// 填写助记词
onKeys(type, index){
if(type === 'addKey') {
this.$set(this.validation, this.validation.findIndex(val => val === null), this.mnemonic[index])
this.$delete(this.mnemonic, index)
return
}
if(type === 'removeKey' && this.validation[index] !== null) {
this.mnemonic.push(this.validation[index])
this.$delete(this.validation, index)
this.validation.push(null)
}
},
// 验证助记词
verifyMnemonic(){
if(this.validation.findIndex(val => val === null) > -1){
uni.showToast({
title: '请完整填写助记词',
icon : 'none'
})
return
}
let seed = this.validation.toString().replace(/,/g, ',')
if (this.seedString !== seed) {
uni.showToast({
title: '验证失败,请确认您的助记词',
icon : 'none'
})
return
}
uni.redirectTo({
url: './create'
})
}
}
}
import {
hash
} from "@/apis/interfaces/wallet"
export default {
data() {
return {
validation: new Array(12).fill(null), // 验证key
mnemonic: [], // 助记词key
sign: '', // 助记词校验签名
seedString: '', // 助记词原词
}
},
mounted() {
let seed = this.$Route.query.seed.split(',')
seed.sort(() => {
return Math.random() - .5
});
console.log(seed)
// this.mnemonic = seed
// this.sign = this.$Route.query.sign
// this.seedString = this.$Route.query.seed
},
methods: {
// 填写助记词
onKeys(type, index) {
if (type === 'addKey') {
this.$set(this.validation, this.validation.findIndex(val => val === null), this.mnemonic[index])
this.$delete(this.mnemonic, index)
return
}
if (type === 'removeKey' && this.validation[index] !== null) {
this.mnemonic.push(this.validation[index])
this.$delete(this.validation, index)
this.validation.push(null)
}
},
// 验证助记词
verifyMnemonic() {
if (this.validation.findIndex(val => val === null) > -1) {
uni.showToast({
title: '请完整填写助记词',
icon: 'none'
})
return
}
let seed = this.validation.toString().replace(/,/g, ',')
if (this.seedString !== seed) {
uni.showToast({
title: '验证失败,请确认您的助记词',
icon: 'none'
})
return
}
uni.redirectTo({
url: './create'
})
}
}
}
</script>
<style lang="scss" scoped>
// 提示信息
.prompt{
color: $text-gray;
text-align: center;
line-height: 90rpx;
font-size: $title-size-m;
}
// 选择助记词
.mnemonic-title{
padding-top: $padding * 2;
margin: 0 $margin * 2;
font-size: $title-size-m;
color: $main-color;
}
.mnemonic-select{
display: flex;
flex-wrap: wrap;
padding: $padding $padding + $padding / 2;
.item{
background-color: white;
line-height: 68rpx;
height: 68rpx;
width: 68rpx;
text-align: center;
margin: $margin / 2;
border-radius: $radius-m;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
}
}
// 助记词
.mnemonic{
margin: $margin ($margin * 2);
border-radius: $radius-m;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
background-color: white;
padding: $padding;
display: flex;
flex-wrap: wrap;
align-items: flex-start;
.item{
background: rgba($color: $border-color, $alpha: .4);
min-width: 58rpx;
height: 58rpx;
line-height: 58rpx;
text-align: center;
color: $text-color;
margin: $margin / 2;
&.hide{
border:dashed 1px $border-color;
box-sizing: border-box;
background-color: white;
}
}
}
// 按钮
.buttons{
padding: $padding $padding * 2;
.text{
text-align: center;
margin-bottom: $margin * 2;
font-size: $title-size-lg;
color: $text-price;
}
button{
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-lg;
color: white;
font-weight: bold;
font-size: $title-size;
&[disabled]{
background: rgba($color: $main-color, $alpha: .8);
}
}
}
// 提示信息
.prompt {
color: $text-gray;
text-align: center;
line-height: 90rpx;
font-size: $title-size-m;
}
// 选择助记词
.mnemonic-title {
padding-top: $padding * 2;
margin: 0 $margin * 2;
font-size: $title-size-m;
color: $main-color;
}
.mnemonic-select {
display: flex;
flex-wrap: wrap;
padding: $padding $padding + $padding / 2;
.item {
background-color: white;
line-height: 68rpx;
height: 68rpx;
width: 68rpx;
text-align: center;
margin: $margin / 2;
border-radius: $radius-m;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
}
}
// 助记词
.mnemonic {
margin: $margin ($margin * 2);
border-radius: $radius-m;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
background-color: white;
padding: $padding;
display: flex;
flex-wrap: wrap;
align-items: flex-start;
.item {
background: rgba($color: $border-color, $alpha: .4);
min-width: 58rpx;
height: 58rpx;
line-height: 58rpx;
text-align: center;
color: $text-color;
margin: $margin / 2;
&.hide {
border: dashed 1px $border-color;
box-sizing: border-box;
background-color: white;
}
}
}
// 按钮
.buttons {
padding: $padding $padding * 2;
.text {
text-align: center;
margin-bottom: $margin * 2;
font-size: $title-size-lg;
color: $text-price;
}
button {
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: $radius-lg;
color: white;
font-weight: bold;
font-size: $title-size;
&[disabled] {
background: rgba($color: $main-color, $alpha: .8);
}
}
}
</style>

View File

@@ -1,126 +0,0 @@
import Bitcore from "bitcore-lib"
import Mnemonic from "bitcore-mnemonic"
import secp256k1 from 'secp256k1'
import {
Address,
pubToAddress,
toBuffer,
toChecksumAddress,
intToBuffer
} from 'ethereumjs-util'
import coinType from './networks.js'
import basex from 'base-x'
export default class Wallet {
static coinType = coinType
/**
* 生成助记词
* @param {Object} lang
*/
static generateMnemonic(lang) {
if (lang) {
return (new Mnemonic(this.getLanguage(lang))).toString();
} else {
return (new Mnemonic()).toString();
}
}
/**
* 验证助记词
* @param {Object} code
* @param {Object} lang
*/
static validMnemonic(code, lang) {
if (lang) {
return Mnemonic.isValid(code, this.getLanguage(lang));
} else {
return Mnemonic.isValid(code);
}
}
/**
* 获取助记词字典
* @param {Object} lang
*/
static getLanguage(lang) {
return Mnemonic.Words[lang]
}
/**
* 转成硬钱包私钥
* @param {Object} code
*/
static toHDPrivateKey(code) {
return (new Mnemonic(code)).toHDPrivateKey()
}
/**
* 验证地址是否合法
* @param {Object} addr
*/
static isValidAddress(addr) {
return Bitcore.Address.isValid(addr)
}
/**
* 硬钱包私钥转成对应网络的 地址 和 私钥
* @param {Object} hdPrivateKey
* @param {Object} type
*/
static HDPrivateKeyToAddress(hdPrivateKey, type) {
const derived = hdPrivateKey.derive("m/44'/" + type.type + "'/0'/0/0");
if (type.type === 195) {
const ethAddr = this.getEthereumAddress(derived)
const addressBuffer = Buffer.concat([intToBuffer(0x41), ethAddr.buf], 21)
return {
address: Bitcore.encoding.Base58Check.encode(addressBuffer),
public_key: derived.privateKey.publicKey.toString(),
private_key: derived.privateKey.toString()
}
}
if (type.type === 144) {
let addr = derived.privateKey.toAddress(type.network).toString()
let deco = Bitcore.encoding.Base58.decode(addr)
return {
address: basex('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz').encode(deco),
public_key: derived.privateKey.publicKey.toString(),
private_key: derived.privateKey.toString()
}
}
if (this.networkIsEthereum(type)) {
return {
address: toChecksumAddress(this.getEthereumAddress(derived).toString()),
public_key: derived.privateKey.publicKey.toString(),
private_key: derived.privateKey.toString()
}
}
return {
address: derived.privateKey.toAddress(type.network).toString(),
public_key: derived.privateKey.publicKey.toString(),
private_key: derived.privateKey.toString()
}
}
/**
* 以太坊地址格式转换
* @param {Object} derived
*/
static getEthereumAddress(derived) {
const publicKey = derived.hdPublicKey.publicKey.toBuffer()
const ethPublicKey = secp256k1.publicKeyConvert(publicKey, false)
.slice(1)
return Address.fromPublicKey(toBuffer(ethPublicKey))
}
/**
* 是否是以太坊网络
* @param {Object} type
*/
static networkIsEthereum(type) {
return type.isEthereum
}
}

View File

@@ -1,29 +0,0 @@
import {
Wallet
} from "./Wallet.js"
const code = Wallet.generateMnemonic(this.defaultLanguage)
this.mnemonicCode = code
const hdPrivateKey = Wallet.toHDPrivateKey(this.mnemonicCode)
// const derived = hdPrivateKey.derive("m/44'/61'/0'/0/0");
// const publicKey = derived.hdPublicKey.publicKey.toBuffer()
// const ethPublicKey = secp256k1.publicKeyConvert(publicKey, false)
// .slice(1)
// const ethAddr = Address.fromPublicKey(toBuffer(ethPublicKey)).toString();
// console.log(toChecksumAddress(ethAddr));
// console.log(Address.fromPrivateKey(hdPrivateKey.hdPublicKey.publicKey.toBuffer()));
var addr = []
for (var i in this.coinType) {
let whk = Wallet.HDPrivateKeyToAddress(hdPrivateKey, i)
let parmas = {
name: this.coinType[i],
address: whk.address,
private_key: whk.private_key,
}
addr.push(parmas)
}
this.address = addr

View File

@@ -1,24 +0,0 @@
import store from "@/store/index.js"
const USE_SOTER_AUTH_KEY = 'USE_SOTER_AUTH_KEY'
/**
* 初始化配置
*/
const initWalletConfigs = () => {
// 生物识别
const USE_SOTER = Boolean(uni.getStorageSync(USE_SOTER_AUTH_KEY))
store.dispatch('wallet/setSoterAuth', USE_SOTER)
// 获取默认钱包
}
const setSoterAuthStatus = (opt) => {
uni.setStorageSync(USE_SOTER_AUTH_KEY, opt)
store.dispatch('wallet/setSoterAuth', opt)
}
export default {
USE_SOTER_AUTH_KEY,
setSoterAuthStatus,
initWalletConfigs
}

View File

@@ -1,209 +0,0 @@
import Bitcore from "bitcore-lib"
export default [{
type: 0,
name: '比特币',
symbol: 'BTC',
code: 'btc',
isEthereum: false,
network: Bitcore.Networks.mainnet
},
{
type: 60,
name: '以太坊',
symbol: 'ETH',
code: 'eth',
isEthereum: true
},
{
type: 61,
name: '以太经典',
symbol: 'ETC',
code: 'etc',
isEthereum: true
},
{
type: 60,
name: '赤子心',
symbol: 'CZX',
code: 'eth_0x3a2a239b1bdaae768ffa06314d523e88e98d4d1f',
isEthereum: true
},
// {
// type: 2,
// name: '莱特币',
// symbol: 'LTC',
// isEthereum: false,
// network: Bitcore.Networks.add({
// name: 'LTC',
// alias: 'LTC',
// pubkeyhash: 0x30,
// privatekey: 0x32,
// scripthash: 0xb0,
// bech32prefix: 'ltc',
// xpubkey: 0x019da462,
// xprivkey: 0x019d9cfe,
// networkMagic: 0xdbb6c0fb
// })
// },
{
type: 3,
name: '狗狗币',
symbol: 'DOGE',
code: 'doge',
isEthereum: false,
network: Bitcore.Networks.add({
name: 'DOGE',
alias: 'DOGE',
pubkeyhash: 0x1e,
privatekey: 0x16,
scripthash: 0x9e,
bech32prefix: 'doge',
xpubkey: 0x02facafd,
xprivkey: 0x02fac398,
networkMagic: 0xc0c0c0c0
})
},
// {
// type: 133,
// name: '零币',
// symbol: 'ZEC',
// isEthereum: false,
// network: Bitcore.Networks.add({
// name: 'ZEC',
// alias: 'ZEC',
// pubkeyhash: 0x1e,
// privatekey: 0x16,
// scripthash: 0x9e,
// bech32prefix: 'doge',
// xpubkey: 0x02facafd,
// xprivkey: 0x02fac398,
// networkMagic: 0xc0c0c0c0
// })
// },
// {
// type: 144,
// name: 'XPR - 瑞波币',
// symbol: 'XPR',
// isEthereum: false,
// network: Bitcore.Networks.add({
// name: 'XPR',
// alias: 'XPR',
// pubkeyhash: 0x1e,
// privatekey: 0x16,
// scripthash: 0x9e,
// bech32prefix: 'doge',
// xpubkey: 0x02facafd,
// xprivkey: 0x02fac398,
// networkMagic: 0xc0c0c0c0
// })
// },
// {
// type: 145,
// name: '比特现金',
// symbol: 'BCH',
// isEthereum: false,
// network: Bitcore.Networks.add({
// name: 'BCH',
// alias: 'BCH',
// pubkeyhash: 0x00,
// privatekey: 0x05,
// scripthash: 0x80,
// bech32prefix: 'bitcoincash',
// xpubkey: 0x0488b21e,
// xprivkey: 0x0488ade4,
// networkMagic: 0xd9b4bef9
// })
// },
// {
// type: 195,
// name: '波场',
// symbol: 'TRX',
// isEthereum: false,
// network: Bitcore.Networks.add({
// name: 'TRX',
// alias: 'TRX',
// pubkeyhash: 0x41,
// privatekey: 0x05,
// scripthash: 0x80,
// bech32prefix: '',
// xpubkey: 0x0488b21e,
// xprivkey: 0x0488ade4
// })
// },
{
type: 195,
name: 'USDT(TRC20)',
symbol: 'USDT',
code: 'trx_TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
isEthereum: false,
network: Bitcore.Networks.add({
name: 'USDT',
alias: 'USDT',
pubkeyhash: 0x41,
privatekey: 0x05,
scripthash: 0x80,
bech32prefix: '',
xpubkey: 0x0488b21e,
xprivkey: 0x0488ade4
})
},
{
type: 195,
name: 'USDT(ERC20)',
symbol: 'USDT',
code: 'eth_0xdac17f958d2ee523a2206206994597c13d831ec7',
isEthereum: true
},
{
type: 0,
name: 'USDT(OMNI)',
symbol: 'USDT',
code: 'usdt',
isEthereum: false,
network: Bitcore.Networks.mainnet
},
{
type: 13107,
name: '比特元',
symbol: 'BTY',
code: 'bty',
isEthereum: false,
network: Bitcore.Networks.add({
name: 'BTY',
alias: 'BTY',
pubkeyhash: 0x00,
privatekey: 0x05,
scripthash: 0x80,
bech32prefix: 'bityuan',
xpubkey: 0x0488b21e,
xprivkey: 0x0488ade4,
networkMagic: 0xd9b4bef9
})
},
// {
// type: 60,
// name: '元链',
// symbol: 'YCC',
// isEthereum: true
// },
{
type: 13107,
name: 'JZC',
symbol: 'JZC',
code: 'bty',
isEthereum: false,
network: Bitcore.Networks.add({
name: 'JZC',
alias: 'JZC',
pubkeyhash: 0x00,
privatekey: 0x05,
scripthash: 0x80,
bech32prefix: 'bityuan',
xpubkey: 0x0488b21e,
xprivkey: 0x0488ade4,
networkMagic: 0xd9b4bef9
})
}
]

207
yarn.lock
View File

@@ -2,194 +2,27 @@
# yarn lockfile v1
"base-x@^3.0.2":
"integrity" "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ=="
"resolved" "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz"
"version" "3.0.9"
dependencies:
"safe-buffer" "^5.0.1"
moment@^2.29.1:
version "2.29.1"
resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
"bech32@=2.0.0":
"integrity" "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="
"resolved" "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz"
"version" "2.0.0"
uni-read-pages@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/uni-read-pages/-/uni-read-pages-1.0.5.tgz"
integrity sha512-GkrrZ0LX0vn9R5k6RKEi0Ez3Q3e2vUpjXQ8Z6/K/d28KudI9ajqgt8WEjQFlG5EPm1K6uTArN8LlqmZTEixDUA==
"bigi@^1.1.0", "bigi@^1.4.2":
"integrity" "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU="
"resolved" "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz"
"version" "1.4.2"
uni-simple-router@^2.0.7:
version "2.0.7"
resolved "https://registry.npmjs.org/uni-simple-router/-/uni-simple-router-2.0.7.tgz"
integrity sha512-8FKv5dw7Eoonm0gkO8udprrxzin0fNUI0+AvIphFkFRH5ZmP5ZWJ2pvnWzb2NiiqQSECTSU5VSB7HhvOSwD5eA==
"bip-schnorr@=0.6.4":
"integrity" "sha512-dNKw7Lea8B0wMIN4OjEmOk/Z5qUGqoPDY0P2QttLqGk1hmDPytLWW8PR5Pb6Vxy6CprcdEgfJpOjUu+ONQveyg=="
"resolved" "https://registry.npmjs.org/bip-schnorr/-/bip-schnorr-0.6.4.tgz"
"version" "0.6.4"
dependencies:
"bigi" "^1.4.2"
"ecurve" "^1.0.6"
"js-sha256" "^0.9.0"
"randombytes" "^2.1.0"
"safe-buffer" "^5.2.1"
uview-ui@^2.0.19:
version "2.0.19"
resolved "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.19.tgz"
integrity sha512-ddZiaP7R9wsUxMzAuhuXgh5OswgCm2lKuulTqjnRXFr0uUWsgL1iBifU3GbOwpwP0LtTHKJOo9rYv1LP0WXmzA==
"bitcore-lib@^8.25.25":
"integrity" "sha512-H6qNCVl4M8/MglXhvc04mmeus1d6nrmqTJGQ+xezJLvL7hs7R3dyBPtOqSP3YSw0iq/GWspMd8f5OOlyXVipJQ=="
"resolved" "https://registry.npmjs.org/bitcore-lib/-/bitcore-lib-8.25.25.tgz"
"version" "8.25.25"
dependencies:
"bech32" "=2.0.0"
"bip-schnorr" "=0.6.4"
"bn.js" "=4.11.8"
"bs58" "^4.0.1"
"buffer-compare" "=1.1.1"
"elliptic" "^6.5.3"
"inherits" "=2.0.1"
"lodash" "^4.17.20"
"bitcore-mnemonic@^8.25.25":
"integrity" "sha512-7HvRxHrmd+Rh0Ohl0SEDMKQBAM+FoevXbCFnxGju6H+uZjtWMOToHA8vUg0+B91pfEMjdt9mQVB/wSA8GMqnCA=="
"resolved" "https://registry.npmjs.org/bitcore-mnemonic/-/bitcore-mnemonic-8.25.25.tgz"
"version" "8.25.25"
dependencies:
"bitcore-lib" "^8.25.25"
"unorm" "^1.4.1"
"bn.js@^4.11.9":
"integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
"resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
"version" "4.12.0"
"bn.js@=4.11.8":
"integrity" "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
"resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz"
"version" "4.11.8"
"brorand@^1.1.0":
"integrity" "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
"resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
"version" "1.1.0"
"bs58@^4.0.1":
"integrity" "sha1-vhYedsNU9veIrkBx9j806MTwpCo="
"resolved" "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz"
"version" "4.0.1"
dependencies:
"base-x" "^3.0.2"
"buffer-compare@=1.1.1":
"integrity" "sha1-W+e+hTr4kZjR9N3AkNHWakiu9ZY="
"resolved" "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz"
"version" "1.1.1"
"ecurve@^1.0.6":
"integrity" "sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w=="
"resolved" "https://registry.npmjs.org/ecurve/-/ecurve-1.0.6.tgz"
"version" "1.0.6"
dependencies:
"bigi" "^1.1.0"
"safe-buffer" "^5.0.1"
"elliptic@^6.5.3":
"integrity" "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ=="
"resolved" "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz"
"version" "6.5.4"
dependencies:
"bn.js" "^4.11.9"
"brorand" "^1.1.0"
"hash.js" "^1.0.0"
"hmac-drbg" "^1.0.1"
"inherits" "^2.0.4"
"minimalistic-assert" "^1.0.1"
"minimalistic-crypto-utils" "^1.0.1"
"hash.js@^1.0.0", "hash.js@^1.0.3":
"integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="
"resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
"version" "1.1.7"
dependencies:
"inherits" "^2.0.3"
"minimalistic-assert" "^1.0.1"
"hmac-drbg@^1.0.1":
"integrity" "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE="
"resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
"version" "1.0.1"
dependencies:
"hash.js" "^1.0.3"
"minimalistic-assert" "^1.0.0"
"minimalistic-crypto-utils" "^1.0.1"
"inherits@^2.0.3":
"integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
"resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
"version" "2.0.4"
"inherits@^2.0.4":
"integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
"resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
"version" "2.0.4"
"inherits@=2.0.1":
"integrity" "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
"resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
"version" "2.0.1"
"js-sha256@^0.9.0":
"integrity" "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
"resolved" "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz"
"version" "0.9.0"
"lodash@^4.17.20":
"integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
"resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
"version" "4.17.21"
"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1":
"integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
"resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
"version" "1.0.1"
"minimalistic-crypto-utils@^1.0.1":
"integrity" "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
"resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
"version" "1.0.1"
"moment@^2.29.1":
"integrity" "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
"resolved" "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz"
"version" "2.29.1"
"randombytes@^2.1.0":
"integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="
"resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
"version" "2.1.0"
dependencies:
"safe-buffer" "^5.1.0"
"safe-buffer@^5.0.1", "safe-buffer@^5.1.0", "safe-buffer@^5.2.1":
"integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
"resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
"version" "5.2.1"
"uni-read-pages@^1.0.5":
"integrity" "sha512-GkrrZ0LX0vn9R5k6RKEi0Ez3Q3e2vUpjXQ8Z6/K/d28KudI9ajqgt8WEjQFlG5EPm1K6uTArN8LlqmZTEixDUA=="
"resolved" "https://registry.npmjs.org/uni-read-pages/-/uni-read-pages-1.0.5.tgz"
"version" "1.0.5"
"uni-simple-router@^2.0.7":
"integrity" "sha512-8FKv5dw7Eoonm0gkO8udprrxzin0fNUI0+AvIphFkFRH5ZmP5ZWJ2pvnWzb2NiiqQSECTSU5VSB7HhvOSwD5eA=="
"resolved" "https://registry.npmjs.org/uni-simple-router/-/uni-simple-router-2.0.7.tgz"
"version" "2.0.7"
"unorm@^1.4.1":
"integrity" "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA=="
"resolved" "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz"
"version" "1.6.0"
"uview-ui@^2.0.19":
"integrity" "sha512-ddZiaP7R9wsUxMzAuhuXgh5OswgCm2lKuulTqjnRXFr0uUWsgL1iBifU3GbOwpwP0LtTHKJOo9rYv1LP0WXmzA=="
"resolved" "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.19.tgz"
"version" "2.0.19"
"vuex@^3.6.2":
"integrity" "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
"resolved" "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz"
"version" "3.6.2"
vuex@^3.6.2:
version "3.6.2"
resolved "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz"
integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==