Compare commits
No commits in common. 'develop' and 'gongyijia_branch' have entirely different histories.
develop
...
gongyijia_
@ -1,3 +1,2 @@
|
|||||||
/node_modules
|
/node_modules
|
||||||
/unpackage/dist
|
/unpackage/dist
|
||||||
/.hbuilderx
|
|
@ -1,2 +0,0 @@
|
|||||||
# DYBG [BETA1]
|
|
||||||
#### 一个简单的动态背景生成器
|
|
@ -1,66 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="dishes-item">
|
|
||||||
<!-- 菜品左侧图片区域 -->
|
|
||||||
<view class="dishes-item-left">
|
|
||||||
<image :src="dishes.dish_src" class="dishes-pic"></image>
|
|
||||||
</view>
|
|
||||||
<!-- 菜品右侧信息区域 -->
|
|
||||||
<view class="dishes-item-right">
|
|
||||||
<!-- 菜品标题 -->
|
|
||||||
<view class="dishes-name">{{dishes.dish_name}}</view>
|
|
||||||
<view class="dishes-info-box">
|
|
||||||
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
dishes: {
|
|
||||||
type: Object,
|
|
||||||
default:{},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data: {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.dishes-item {
|
|
||||||
display: flex;
|
|
||||||
padding: 10px 5px;
|
|
||||||
border-bottom: 1px solid #f0f0f0;
|
|
||||||
|
|
||||||
.dishes-item-left {
|
|
||||||
margin-right: 5px;
|
|
||||||
|
|
||||||
.dishes-pic {
|
|
||||||
width: 100px;
|
|
||||||
height: 100px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dishes-item-right {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
.dishes-name {
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dishes-price {
|
|
||||||
font-size: 16px;
|
|
||||||
color: #c00000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,119 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="login-container">
|
|
||||||
<uni-icons type="contact-filled" size="100" color="#afafaf"></uni-icons>
|
|
||||||
|
|
||||||
<button type="primary" class="btn-login" @click="getUserInfo()">一键登录</button>
|
|
||||||
<text class="login-text">登陆后尽享更多权益</text>
|
|
||||||
<image :src="headerURL"></image>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {
|
|
||||||
mapMutations
|
|
||||||
} from 'vuex'
|
|
||||||
export default {
|
|
||||||
name: "my-login",
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
nickName: '',
|
|
||||||
headerURL: '',
|
|
||||||
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
...mapMutations('m_user', ['updateUserInfo', 'updatetoken','savetokentostorage','saveUserInfoToStorage']),
|
|
||||||
getUserInfo() {
|
|
||||||
let that = this
|
|
||||||
uni.showModal({
|
|
||||||
title: '温馨提示',
|
|
||||||
content: '授权后使用',
|
|
||||||
success: function(res) {
|
|
||||||
if (res.confirm) {
|
|
||||||
uni.getUserProfile({
|
|
||||||
desc: '获取你的昵称头像',
|
|
||||||
success: userRes => {
|
|
||||||
if (userRes.userInfo !==
|
|
||||||
undefined) {
|
|
||||||
let userInfo = {
|
|
||||||
avatarURL: userRes.userInfo.avatarUrl,
|
|
||||||
nickName: userRes.userInfo.nickName
|
|
||||||
}
|
|
||||||
that.nickName = userRes.userInfo.nickName
|
|
||||||
console.log(userInfo)
|
|
||||||
that.getOpenID(userInfo)
|
|
||||||
} else {
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'none',
|
|
||||||
title: '获取失败,请重试'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fail: error => {}
|
|
||||||
})
|
|
||||||
} else if (res.cancel) {}
|
|
||||||
},
|
|
||||||
fail: error => {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
async getOpenID(userInfo) {
|
|
||||||
let that = this
|
|
||||||
uni.login({
|
|
||||||
provider: 'weixin',
|
|
||||||
success: function(loginAuth) {
|
|
||||||
let code = loginAuth.code
|
|
||||||
uniCloud.callFunction({
|
|
||||||
name: 'wxlogin',
|
|
||||||
data: {
|
|
||||||
code: code
|
|
||||||
},
|
|
||||||
success: function(res) {
|
|
||||||
that.updatetoken(res.result)
|
|
||||||
that.savetokentostorage()
|
|
||||||
that.updateUserInfo(userInfo)
|
|
||||||
that.saveUserInfoToStorage()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
console.log(userInfo)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.login-container {
|
|
||||||
height: 750rpx;
|
|
||||||
background-color: #f8f8f8;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: 40px;
|
|
||||||
background-color: #f8f8f8;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
border-radius: 100%;
|
|
||||||
transform: translateY(50%);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-login {
|
|
||||||
width: 90%;
|
|
||||||
border-radius: 100px;
|
|
||||||
margin: 15px 0;
|
|
||||||
background-color: #C00000;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,64 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="my-search-container" @click="searchBoxHandler">
|
|
||||||
<!-- 使用 view 组件模拟 input 输入框的样式 -->
|
|
||||||
<view class="my-search-box">
|
|
||||||
<uni-icons type="search" size="17"></uni-icons>
|
|
||||||
<text class="placeholder">搜索</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name:"my-search",
|
|
||||||
props: {
|
|
||||||
// 背景颜色
|
|
||||||
bgcolor: {
|
|
||||||
type: String,
|
|
||||||
default: '#C00000'
|
|
||||||
},
|
|
||||||
// 圆角尺寸
|
|
||||||
radius: {
|
|
||||||
type: Number,
|
|
||||||
// 单位是 px
|
|
||||||
default: 18
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
searchBoxHandler(){
|
|
||||||
// 触发外界通过 @click 绑定的 click 事件处理函数
|
|
||||||
this.$emit('click')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.my-search-container {
|
|
||||||
background-color: #c00000;
|
|
||||||
height: 50px;
|
|
||||||
padding: 0 10px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.my-search-box {
|
|
||||||
height: 36px;
|
|
||||||
background-color: #ffffff;
|
|
||||||
border-radius: 15px;
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
.placeholder {
|
|
||||||
font-size: 15px;
|
|
||||||
margin-left: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,171 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="my-userinfo-container">
|
|
||||||
<!--头像和昵称区域-->
|
|
||||||
<view class="top-box">
|
|
||||||
<image :src="userinfo.avatarURL" class="avatar"></image>
|
|
||||||
<button class="header" open-type="chooseAvatar" @chooseavatar="chooseAvatar">修改头像</button>
|
|
||||||
</view>
|
|
||||||
<!--面版区域-->
|
|
||||||
<view class="panel-list">
|
|
||||||
<!--第一个面板-->
|
|
||||||
<view class="panel">
|
|
||||||
<view class="panel-body">
|
|
||||||
<view class="panel-item">
|
|
||||||
<text>8</text>
|
|
||||||
<text>收藏的菜品</text>
|
|
||||||
</view>
|
|
||||||
<view class="panel-item">
|
|
||||||
<text>2</text>
|
|
||||||
<text>信息</text>
|
|
||||||
</view>
|
|
||||||
<view class="panel-item">
|
|
||||||
<text>6</text>
|
|
||||||
<text>足迹</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!--第二个面板-->
|
|
||||||
<view class="panel">
|
|
||||||
<view class="panel-title">
|
|
||||||
我的评价
|
|
||||||
</view>
|
|
||||||
<view class="panel-body">
|
|
||||||
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!--第三个面板-->
|
|
||||||
<view class="panel">
|
|
||||||
<view class="third-panel-list">
|
|
||||||
<text>反馈与帮助</text>
|
|
||||||
<uni-icons type="arrowright" size="15"></uni-icons>
|
|
||||||
</view>
|
|
||||||
<view class="third-panel-list" @click="logout">
|
|
||||||
<text>退出登录</text>
|
|
||||||
<uni-icons type="arrowright" size="15"></uni-icons>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {
|
|
||||||
mapState,
|
|
||||||
mapMutations
|
|
||||||
} from 'vuex'
|
|
||||||
export default {
|
|
||||||
name: "my-userinfo",
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
|
|
||||||
};
|
|
||||||
},
|
|
||||||
onLoad() {
|
|
||||||
this.updateUserInfo(uni.getStorageInfoSync('userinfo'))
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState('m_user', ['userinfo'])
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
...mapMutations('m_user', ['updatetoken', 'updateUserInfo','saveUserInfoToStorage']),
|
|
||||||
chooseAvatar(e) {
|
|
||||||
this.userinfo.avatarURL = e.detail.avatarUrl
|
|
||||||
this.saveUserInfoToStorage()
|
|
||||||
},
|
|
||||||
async logout() {
|
|
||||||
let that = this
|
|
||||||
uni.showModal({
|
|
||||||
title: '提示',
|
|
||||||
content: '确认退出登录吗?',
|
|
||||||
success: (succ) => {
|
|
||||||
if (succ.confirm) {
|
|
||||||
that.updatetoken('')
|
|
||||||
that.savetokentostorage()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.my-userinfo-container {
|
|
||||||
height: 100%;
|
|
||||||
background-color: #f4f4f4;
|
|
||||||
|
|
||||||
.top-box {
|
|
||||||
height: 400rpx;
|
|
||||||
background-color: #efefef;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
.avatar {
|
|
||||||
width: 90px;
|
|
||||||
height: 90px;
|
|
||||||
border-radius: 45px;
|
|
||||||
border: 2px solid #FFF;
|
|
||||||
box-shadow: 0 1px 5px black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nikname {
|
|
||||||
font-size: 16px;
|
|
||||||
color: black;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-list {
|
|
||||||
padding: 0 10px;
|
|
||||||
position: relative;
|
|
||||||
top: -10px;
|
|
||||||
|
|
||||||
.panel {
|
|
||||||
background-color: white;
|
|
||||||
border-radius: 3px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
|
|
||||||
.panel-title {
|
|
||||||
line-height: 45px;
|
|
||||||
padding-left: 10px;
|
|
||||||
font-size: 15px;
|
|
||||||
border-bottom: 1px solid #f8f8f8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-body {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-around;
|
|
||||||
|
|
||||||
.panel-item {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-around;
|
|
||||||
padding: 10px 0;
|
|
||||||
font-size: 13px;
|
|
||||||
|
|
||||||
.icon {
|
|
||||||
width: 35px;
|
|
||||||
height: 35px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.third-panel-list {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 18px;
|
|
||||||
padding: 0 10px;
|
|
||||||
line-height: 45px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,95 +0,0 @@
|
|||||||
<template>
|
|
||||||
<img :src="captchaSrc" @click="onClick" :class="isRotate ? 'run' : ''" :style="{
|
|
||||||
width:width ? width +'rpx' : '100%',
|
|
||||||
height:height ? height +'rpx' : '100%',
|
|
||||||
marginTop:marginTop ? marginTop +'rpx' : '',
|
|
||||||
marginBottom:marginBottom ? marginBottom +'rpx' : '',
|
|
||||||
marginLeft:marginLeft ? marginLeft +'rpx' : '',
|
|
||||||
marginRight:marginRight ? marginRight +'rpx' : '',
|
|
||||||
borderRadius:borderRadius ? borderRadius +'rpx' : '',
|
|
||||||
opacity: opacity ? opacity : '',
|
|
||||||
'background-size': `${width ? width+'rpx':'100%'} ${height ? height+'rpx':'100%'}`
|
|
||||||
}" alt="-">
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'imageBox',
|
|
||||||
props: {
|
|
||||||
src: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
marginTop: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
marginBottom: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
marginLeft: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
marginRight: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
borderRadius: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
opacity: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
isRotate: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
captchaSrc() {
|
|
||||||
try{
|
|
||||||
if (this.src.indexOf('data:image/png;') !== -1) {
|
|
||||||
return this.src.replace(/[\r\n]/g, "")
|
|
||||||
} else {
|
|
||||||
return this.src
|
|
||||||
}
|
|
||||||
}catch(err){
|
|
||||||
console.info('err-----------------------',err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
onClick() {
|
|
||||||
this.$emit('click')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
@keyframes rotate {
|
|
||||||
0%{-webkit-transform:rotate(0deg);}
|
|
||||||
25%{-webkit-transform:rotate(90deg);}
|
|
||||||
50%{-webkit-transform:rotate(180deg);}
|
|
||||||
75%{-webkit-transform:rotate(270deg);}
|
|
||||||
100%{-webkit-transform:rotate(360deg);}
|
|
||||||
}
|
|
||||||
.run { animation: rotate 2s linear infinite; }
|
|
||||||
</style>
|
|
@ -1,543 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "canteen",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"": {
|
|
||||||
"name": "canteen",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"@escook/request-miniprogram": "^0.2.1",
|
|
||||||
"request-promise": "^4.2.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@escook/request-miniprogram": {
|
|
||||||
"version": "0.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@escook/request-miniprogram/-/request-miniprogram-0.2.1.tgz",
|
|
||||||
"integrity": "sha512-ueWV5YsaEm/ycQZuEjMiA88GFMhfBQSjy9GrP9omy4xAQajkGTbYIlnhzsDfWzRPmRC1fKmAiKMrCVcgS+SHcQ=="
|
|
||||||
},
|
|
||||||
"node_modules/ajv": {
|
|
||||||
"version": "6.12.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
|
|
||||||
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"fast-deep-equal": "^3.1.1",
|
|
||||||
"fast-json-stable-stringify": "^2.0.0",
|
|
||||||
"json-schema-traverse": "^0.4.1",
|
|
||||||
"uri-js": "^4.2.2"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/epoberezkin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/asn1": {
|
|
||||||
"version": "0.2.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
|
|
||||||
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"safer-buffer": "~2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/assert-plus": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/asynckit": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
|
||||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/aws-sign2": {
|
|
||||||
"version": "0.7.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
|
||||||
"integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/aws4": {
|
|
||||||
"version": "1.12.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
|
|
||||||
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/bcrypt-pbkdf": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"tweetnacl": "^0.14.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/bluebird": {
|
|
||||||
"version": "3.7.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
|
|
||||||
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
|
|
||||||
},
|
|
||||||
"node_modules/caseless": {
|
|
||||||
"version": "0.12.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
|
||||||
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/combined-stream": {
|
|
||||||
"version": "1.0.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
|
||||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"delayed-stream": "~1.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/core-util-is": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/dashdash": {
|
|
||||||
"version": "1.14.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
|
||||||
"integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": "^1.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/delayed-stream": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.4.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ecc-jsbn": {
|
|
||||||
"version": "0.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
|
|
||||||
"integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"jsbn": "~0.1.0",
|
|
||||||
"safer-buffer": "^2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/extend": {
|
|
||||||
"version": "3.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
|
||||||
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/extsprintf": {
|
|
||||||
"version": "1.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
|
||||||
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
|
|
||||||
"engines": [
|
|
||||||
"node >=0.6.0"
|
|
||||||
],
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/fast-deep-equal": {
|
|
||||||
"version": "3.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
|
||||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/fast-json-stable-stringify": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
|
||||||
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/forever-agent": {
|
|
||||||
"version": "0.6.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
|
|
||||||
"integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/form-data": {
|
|
||||||
"version": "2.3.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
|
|
||||||
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"asynckit": "^0.4.0",
|
|
||||||
"combined-stream": "^1.0.6",
|
|
||||||
"mime-types": "^2.1.12"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/getpass": {
|
|
||||||
"version": "0.1.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
|
||||||
"integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/har-schema": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/har-validator": {
|
|
||||||
"version": "5.1.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
|
|
||||||
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
|
|
||||||
"deprecated": "this library is no longer supported",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"ajv": "^6.12.3",
|
|
||||||
"har-schema": "^2.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/http-signature": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": "^1.0.0",
|
|
||||||
"jsprim": "^1.2.2",
|
|
||||||
"sshpk": "^1.7.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.8",
|
|
||||||
"npm": ">=1.3.7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/is-typedarray": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/isstream": {
|
|
||||||
"version": "0.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
|
|
||||||
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/jsbn": {
|
|
||||||
"version": "0.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
|
||||||
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/json-schema": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
|
|
||||||
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/json-schema-traverse": {
|
|
||||||
"version": "0.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
|
||||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/json-stringify-safe": {
|
|
||||||
"version": "5.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
|
|
||||||
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/jsprim": {
|
|
||||||
"version": "1.4.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
|
|
||||||
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": "1.0.0",
|
|
||||||
"extsprintf": "1.3.0",
|
|
||||||
"json-schema": "0.4.0",
|
|
||||||
"verror": "1.10.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.6.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/lodash": {
|
|
||||||
"version": "4.17.21",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
|
||||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
|
|
||||||
},
|
|
||||||
"node_modules/mime-db": {
|
|
||||||
"version": "1.52.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
|
||||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/mime-types": {
|
|
||||||
"version": "2.1.35",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
|
||||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"mime-db": "1.52.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/oauth-sign": {
|
|
||||||
"version": "0.9.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
|
|
||||||
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/performance-now": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
|
||||||
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/psl": {
|
|
||||||
"version": "1.9.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
|
|
||||||
"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
|
|
||||||
},
|
|
||||||
"node_modules/punycode": {
|
|
||||||
"version": "2.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
|
|
||||||
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/qs": {
|
|
||||||
"version": "6.5.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
|
|
||||||
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/request": {
|
|
||||||
"version": "2.88.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
|
|
||||||
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
|
|
||||||
"deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"aws-sign2": "~0.7.0",
|
|
||||||
"aws4": "^1.8.0",
|
|
||||||
"caseless": "~0.12.0",
|
|
||||||
"combined-stream": "~1.0.6",
|
|
||||||
"extend": "~3.0.2",
|
|
||||||
"forever-agent": "~0.6.1",
|
|
||||||
"form-data": "~2.3.2",
|
|
||||||
"har-validator": "~5.1.3",
|
|
||||||
"http-signature": "~1.2.0",
|
|
||||||
"is-typedarray": "~1.0.0",
|
|
||||||
"isstream": "~0.1.2",
|
|
||||||
"json-stringify-safe": "~5.0.1",
|
|
||||||
"mime-types": "~2.1.19",
|
|
||||||
"oauth-sign": "~0.9.0",
|
|
||||||
"performance-now": "^2.1.0",
|
|
||||||
"qs": "~6.5.2",
|
|
||||||
"safe-buffer": "^5.1.2",
|
|
||||||
"tough-cookie": "~2.5.0",
|
|
||||||
"tunnel-agent": "^0.6.0",
|
|
||||||
"uuid": "^3.3.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/request-promise": {
|
|
||||||
"version": "4.2.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz",
|
|
||||||
"integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==",
|
|
||||||
"deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
|
|
||||||
"dependencies": {
|
|
||||||
"bluebird": "^3.5.0",
|
|
||||||
"request-promise-core": "1.1.4",
|
|
||||||
"stealthy-require": "^1.1.1",
|
|
||||||
"tough-cookie": "^2.3.3"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"request": "^2.34"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/request-promise-core": {
|
|
||||||
"version": "1.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
|
|
||||||
"integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
|
|
||||||
"dependencies": {
|
|
||||||
"lodash": "^4.17.19"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"request": "^2.34"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/safe-buffer": {
|
|
||||||
"version": "5.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
|
||||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/feross"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "patreon",
|
|
||||||
"url": "https://www.patreon.com/feross"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "consulting",
|
|
||||||
"url": "https://feross.org/support"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/safer-buffer": {
|
|
||||||
"version": "2.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
|
||||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/sshpk": {
|
|
||||||
"version": "1.17.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
|
|
||||||
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"asn1": "~0.2.3",
|
|
||||||
"assert-plus": "^1.0.0",
|
|
||||||
"bcrypt-pbkdf": "^1.0.0",
|
|
||||||
"dashdash": "^1.12.0",
|
|
||||||
"ecc-jsbn": "~0.1.1",
|
|
||||||
"getpass": "^0.1.1",
|
|
||||||
"jsbn": "~0.1.0",
|
|
||||||
"safer-buffer": "^2.0.2",
|
|
||||||
"tweetnacl": "~0.14.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"sshpk-conv": "bin/sshpk-conv",
|
|
||||||
"sshpk-sign": "bin/sshpk-sign",
|
|
||||||
"sshpk-verify": "bin/sshpk-verify"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/stealthy-require": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/tough-cookie": {
|
|
||||||
"version": "2.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
|
|
||||||
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
|
|
||||||
"dependencies": {
|
|
||||||
"psl": "^1.1.28",
|
|
||||||
"punycode": "^2.1.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/tunnel-agent": {
|
|
||||||
"version": "0.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
|
||||||
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"safe-buffer": "^5.0.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/tweetnacl": {
|
|
||||||
"version": "0.14.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
|
|
||||||
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
|
|
||||||
"peer": true
|
|
||||||
},
|
|
||||||
"node_modules/uri-js": {
|
|
||||||
"version": "4.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
|
|
||||||
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"punycode": "^2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/uuid": {
|
|
||||||
"version": "3.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
|
|
||||||
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
|
|
||||||
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
|
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
|
||||||
"uuid": "bin/uuid"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/verror": {
|
|
||||||
"version": "1.10.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
|
||||||
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
|
|
||||||
"engines": [
|
|
||||||
"node >=0.6.0"
|
|
||||||
],
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": "^1.0.0",
|
|
||||||
"core-util-is": "1.0.2",
|
|
||||||
"extsprintf": "^1.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "canteen",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "",
|
|
||||||
"main": "main.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"keywords": [],
|
|
||||||
"author": "",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"@escook/request-miniprogram": "^0.2.1",
|
|
||||||
"request-promise": "^4.2.6"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view>
|
|
||||||
<button @click="login()">登录</button>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
login() {
|
|
||||||
let that = this
|
|
||||||
uni.login({
|
|
||||||
provider:'weixin',
|
|
||||||
success:function(res){
|
|
||||||
uniCloud.callFunction({
|
|
||||||
name:'wxlogin',
|
|
||||||
data:{code: res.code},
|
|
||||||
success: (res) => {
|
|
||||||
console.log(res)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,38 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="my-container">
|
<view>
|
||||||
<my-login v-if="!token"></my-login>
|
|
||||||
|
</view>
|
||||||
<my-userinfo v-else></my-userinfo>
|
|
||||||
<m-tabbar native=""></m-tabbar>
|
|
||||||
</view>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapState} from "vuex"
|
export default {
|
||||||
import {
|
data() {
|
||||||
mapMutations
|
return {
|
||||||
} from 'vuex'
|
|
||||||
export default {
|
};
|
||||||
data() {
|
}
|
||||||
return {
|
}
|
||||||
|
|
||||||
};
|
|
||||||
},
|
|
||||||
onLoad(){
|
|
||||||
this.updatetoken(uni.getStorageSync('token'))
|
|
||||||
},
|
|
||||||
methods:{
|
|
||||||
...mapMutations('m_user', ['updateUserInfo', 'updatetoken','savetokentostorage'])
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState('m_user',['token'])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
page,
|
|
||||||
.my-container {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 765 B |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 544 B |
Before Width: | Height: | Size: 759 B |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 715 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 596 B |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 589 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.9 KiB |
@ -1,12 +0,0 @@
|
|||||||
import Vue from 'vue'
|
|
||||||
import Vuex from 'vuex'
|
|
||||||
import moduleUser from './user.js'
|
|
||||||
Vue.use(Vuex)
|
|
||||||
|
|
||||||
const store = new Vuex.Store({
|
|
||||||
modules: {
|
|
||||||
'm_user': moduleUser
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default store
|
|
@ -1,35 +0,0 @@
|
|||||||
export default {
|
|
||||||
//开启命名空间
|
|
||||||
namespaced: true ,
|
|
||||||
|
|
||||||
//数据
|
|
||||||
state: () => ({
|
|
||||||
token : '',
|
|
||||||
//用户的信息对象
|
|
||||||
userinfo: JSON.parse(uni.getStorageSync('userinfo') || '{}')
|
|
||||||
}),
|
|
||||||
|
|
||||||
//方法
|
|
||||||
mutations : {
|
|
||||||
updateUserInfo(state,userinfo){
|
|
||||||
state.userinfo = userinfo
|
|
||||||
this.commit('m_user/saveUserInfoToStorage')
|
|
||||||
},
|
|
||||||
saveUserInfoToStorage(state)
|
|
||||||
{
|
|
||||||
uni.setStorageSync('userinfo',JSON.stringify(state.userinfo))
|
|
||||||
},
|
|
||||||
updatetoken(state, token)
|
|
||||||
{
|
|
||||||
state.token = token
|
|
||||||
this.commit('m_user/savetokentostorage')
|
|
||||||
},
|
|
||||||
savetokentostorage(state){
|
|
||||||
uni.setStorageSync('token',state.token)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
getters: {},
|
|
||||||
|
|
||||||
}
|
|
@ -1,123 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view>
|
|
||||||
|
|
||||||
<view class="image_view">
|
|
||||||
<image class='dish_image' :src="dish_image_src"></image>
|
|
||||||
</view>
|
|
||||||
<view>
|
|
||||||
<text>{{"菜品名称:" + dish_name + '\n'}}</text>
|
|
||||||
<text>{{"菜品位置:" + dish_location + dish_window_name + '\n'}}</text>
|
|
||||||
<text>{{"菜品类别:" + dish_label + '\n'}}</text>
|
|
||||||
<text>{{"菜品评分:" + dish_avg_score + '\n'}}</text>
|
|
||||||
</view>
|
|
||||||
<view class="evaluete">
|
|
||||||
|
|
||||||
<hb-comment ref="hbComment" @add="add" @del="del" @like="like" :deleteTip="'确认删除?'" :cmData="commentData"
|
|
||||||
v-if="commentData"></hb-comment>
|
|
||||||
</view>
|
|
||||||
<view>
|
|
||||||
<text>{{"菜品打分:\n"}}</text>
|
|
||||||
<uni-rate v-model="value" @change="onChange" allow-half="true" size="75" />
|
|
||||||
</view>
|
|
||||||
|
|
||||||
</view>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
dish_image_src: '',
|
|
||||||
dish_name: '',
|
|
||||||
dish_label: [],
|
|
||||||
dish_location: '',
|
|
||||||
dish_window_name: '',
|
|
||||||
value: 4,
|
|
||||||
comentData: [],
|
|
||||||
dish_id: '',
|
|
||||||
dish_avg_score: 5.0
|
|
||||||
};
|
|
||||||
},
|
|
||||||
onLoad(option) {
|
|
||||||
|
|
||||||
//this.getLabels()
|
|
||||||
this.dish_id = JSON.parse(decodeURIComponent(option._id))
|
|
||||||
this.getImage()
|
|
||||||
console.log(this.dish_id)
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getImage() {
|
|
||||||
let that = this
|
|
||||||
uniCloud.callFunction({
|
|
||||||
name: 'getDishes',
|
|
||||||
data: {
|
|
||||||
api: 'getByID',
|
|
||||||
id: this.dish_id
|
|
||||||
},
|
|
||||||
success: function(res) {
|
|
||||||
that.dish_image_src = res.result.data[0].dish_src
|
|
||||||
that.dish_name = res.result.data[0].dish_name
|
|
||||||
that.dish_location = res.result.data[0].location
|
|
||||||
that.dish_window_name = res.result.data[0].window_name
|
|
||||||
that.dish_avg_score = res.result.data[0].avg_score
|
|
||||||
console.log(res)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
getLabels() {
|
|
||||||
let that = this
|
|
||||||
uniCloud.callFunction({
|
|
||||||
name: 'getLabels',
|
|
||||||
data: {
|
|
||||||
id: '650e8610a09a9bd68ba734ed'
|
|
||||||
},
|
|
||||||
success: function(res) {
|
|
||||||
that.dish_label = res.result.data[0].labelList
|
|
||||||
console.log(res)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
onChange(e) {
|
|
||||||
let that = this
|
|
||||||
uniCloud.callFunction({
|
|
||||||
name: 'scoreUpdate',
|
|
||||||
data: {
|
|
||||||
score: that.value,
|
|
||||||
dish_id: that.dish_id
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
add(commentReq) {
|
|
||||||
console.log(commentReq)
|
|
||||||
},
|
|
||||||
del(commentid) {
|
|
||||||
console.log(commentid)
|
|
||||||
},
|
|
||||||
like(commentid) {
|
|
||||||
console.log(commentid)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.image_view {
|
|
||||||
height: 400rpx;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
padding-left: 10rpx;
|
|
||||||
padding-right: 10rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dish_image {
|
|
||||||
display: flex;
|
|
||||||
height: 400rpx;
|
|
||||||
width: 600rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.evaluete {}
|
|
||||||
</style>
|
|
@ -1,104 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view>
|
|
||||||
<view class="dish-list">
|
|
||||||
<view class="product-list">
|
|
||||||
<view class="dish" v-for="(dishes, i) in labelList" :key="i" @click="gotoDetail(dishes)">
|
|
||||||
<image mode="widthFix" :src="dishes.dish_src"></image>
|
|
||||||
<view class="name">{{dishes.dish_name}}</view>
|
|
||||||
<view class="info">
|
|
||||||
<view class="price">{{}}</view>
|
|
||||||
<view class="label">{{}}</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="loading-text">{{}}</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
labelList:[]
|
|
||||||
}
|
|
||||||
},onLoad() {
|
|
||||||
|
|
||||||
const sysInfo = uni.getSystemInfoSync()
|
|
||||||
// 可用高度 = 屏幕高度 - navigationBar高度 - tabBar高度 - 自定义的search组件高度
|
|
||||||
this.wh = sysInfo.windowHeight - 50
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
goToDetail(item) {
|
|
||||||
console.log(item._id)
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/subpkg/dishDetail/dishDetail?_id=' +encodeURIComponent(JSON.stringify(item._id))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.dish-list {}
|
|
||||||
|
|
||||||
|
|
||||||
.loading-text {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
height: 30px;
|
|
||||||
color: #979797;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-list {
|
|
||||||
width: 92%;
|
|
||||||
padding: 0 4% 3vw 4%;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
.dish {
|
|
||||||
width: 48%;
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: #fff;
|
|
||||||
margin: 0 0 7px 0;
|
|
||||||
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
.image {
|
|
||||||
width: 100%;
|
|
||||||
border-radius: 10px 10px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.name {
|
|
||||||
width: 92%;
|
|
||||||
padding: 5px 4%;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
text-align: justify;
|
|
||||||
overflow: hidden;
|
|
||||||
font-size: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-end;
|
|
||||||
width: 92%;
|
|
||||||
padding: 5px 4% 5px 4%;
|
|
||||||
}
|
|
||||||
.price {
|
|
||||||
color: #e65339;
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.label{
|
|
||||||
color: #807c87;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,192 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view>
|
|
||||||
<view class="search-box">
|
|
||||||
<uni-search-bar @input="input" :radius="100" cancelButton="none" :focus="true"></uni-search-bar>
|
|
||||||
<button class="search" @click="goToSearchList">搜索</button>
|
|
||||||
</view>
|
|
||||||
<!--搜索建议-->
|
|
||||||
<view class="sugest-list" v-if="searchresult.length !== 0">
|
|
||||||
<view class="sugest-item" v-for="(item,i) in searchresult" :key="i" @click="gotodetail(item)">
|
|
||||||
<view class="dish-name">{{item.dish_name}}</view>
|
|
||||||
<uni-icons type="arrowright" size="16"></uni-icons>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<!--搜索历史-->
|
|
||||||
<view class="history-box" v-else>
|
|
||||||
<!--标题区域-->
|
|
||||||
<view class="history-title">
|
|
||||||
<text>搜索历史</text>
|
|
||||||
<uni-icons type="trash" size="17" @click="clean"></uni-icons>
|
|
||||||
</view>
|
|
||||||
<!--列表区域-->
|
|
||||||
<view class="history-list">
|
|
||||||
<uni-tag v-for="(item,i) in histories" :text="item" :key="i" @click="gotosearchdetail(item)"></uni-tag>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
timer: null,
|
|
||||||
kw: '',
|
|
||||||
searchresult: [],
|
|
||||||
//搜索结果
|
|
||||||
searchlist: [],
|
|
||||||
//搜索历史的数组
|
|
||||||
historylist: [],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
onLoad() {
|
|
||||||
this.historylist = JSON.parse(uni.getStorageSync('kw') || '[]')
|
|
||||||
this.cnt = this.historylist.length
|
|
||||||
console.log(this.historylist)
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
async goToSearchList() {
|
|
||||||
this.getsearchresult()
|
|
||||||
this.savesearchhistory()
|
|
||||||
let that = this
|
|
||||||
setTimeout(()=>{
|
|
||||||
uni.$emit('item',this.searchresult)
|
|
||||||
},500)
|
|
||||||
uni.navigateTo({
|
|
||||||
url:'/subpkg/searchList/searchList?searchlist=' + encodeURIComponent(JSON.stringify(this.searchresult))
|
|
||||||
})
|
|
||||||
},
|
|
||||||
//input输入事件的处理函数
|
|
||||||
input(e) {
|
|
||||||
//延时器
|
|
||||||
clearTimeout(this.timer)
|
|
||||||
this.timer = setTimeout(
|
|
||||||
() => {
|
|
||||||
this.kw = e
|
|
||||||
this.getsearchresult()
|
|
||||||
}, 500)
|
|
||||||
},
|
|
||||||
async getsearchresult() {
|
|
||||||
let that = this
|
|
||||||
//判断搜索关键词是否为空
|
|
||||||
if (this.kw.length === 0) {
|
|
||||||
this.searchresult = []
|
|
||||||
return
|
|
||||||
}
|
|
||||||
uniCloud.callFunction({
|
|
||||||
name:'getDishes',
|
|
||||||
data:{
|
|
||||||
api:'getByName',
|
|
||||||
dish_name:that.kw
|
|
||||||
},
|
|
||||||
success:function(res){
|
|
||||||
that.searchresult = res.result.data
|
|
||||||
that.searchlist = res.result.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
gotodetail(item) {
|
|
||||||
this.savesearchhistory()
|
|
||||||
console.log(item._id)
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/subpkg/dishDetail/dishDetail?_id=' +encodeURIComponent(JSON.stringify(item._id))
|
|
||||||
})
|
|
||||||
},
|
|
||||||
savesearchhistory() {
|
|
||||||
const set = new Set(this.historylist)
|
|
||||||
set.delete(this.kw)
|
|
||||||
set.add(this.kw)
|
|
||||||
this.historylist = Array.from(set)
|
|
||||||
uni.setStorageSync('kw', JSON.stringify(this.historylist))
|
|
||||||
},
|
|
||||||
//清空本地历史记录
|
|
||||||
clean() {
|
|
||||||
this.historylist = []
|
|
||||||
uni.setStorageSync('kw', '[]')
|
|
||||||
this.cnt = 0
|
|
||||||
},
|
|
||||||
gotosearchdetail(item) {
|
|
||||||
let historyresult = []
|
|
||||||
uniCloud.callFunction({
|
|
||||||
name:'getDishes',
|
|
||||||
data:{
|
|
||||||
api:'getByName',
|
|
||||||
dish_name:item
|
|
||||||
},
|
|
||||||
success:function(res){
|
|
||||||
historyresult = res.result.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
setTimeout(()=>{
|
|
||||||
uni.$emit('item',historyresult)
|
|
||||||
},500)
|
|
||||||
uni.navigateTo({
|
|
||||||
url:'/subpkg/searchList/searchList?searchlist=' + encodeURIComponent(JSON.stringify(historyresult))
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
histories() {
|
|
||||||
return [...this.historylist].reverse()
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.search-box {
|
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
z-index: 999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sugest-list {
|
|
||||||
padding: 0 5px;
|
|
||||||
|
|
||||||
.sugest-item {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
font-size: 12px;
|
|
||||||
padding: 13px 0;
|
|
||||||
border-bottom: 1 px solid #efefef;
|
|
||||||
|
|
||||||
.dish-name {
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.history-box {
|
|
||||||
padding: 0 5px;
|
|
||||||
|
|
||||||
.history-title {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
height: 40px;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 13px;
|
|
||||||
border-bottom: 1px solid #efefef;
|
|
||||||
}
|
|
||||||
|
|
||||||
.history-list {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
|
|
||||||
.uni-tag {
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.search{
|
|
||||||
height: 50rpx;
|
|
||||||
width: 200rpx;
|
|
||||||
font-size: 20rpx;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,83 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view>
|
|
||||||
<view class="search-list" v-for="data in dishList" :key="data._id">
|
|
||||||
|
|
||||||
<view class="dish-item" @click="goToDetail(data)">
|
|
||||||
<image class="dish-image" :src="data.dish_src"></image>
|
|
||||||
</view>
|
|
||||||
<view class="dish-intro">
|
|
||||||
<text>{{'菜名:' + data.dish_name + '\n'}}</text>
|
|
||||||
<text>{{'地点:' + data.location + '\n'}}</text>
|
|
||||||
<text>{{'窗口:' + data.window_name + '\n'}}</text>
|
|
||||||
<text>{{'评分:' + data.avg_score + '\n'}}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
dishList: []
|
|
||||||
};
|
|
||||||
},
|
|
||||||
onLoad(e) {
|
|
||||||
let that = this
|
|
||||||
uni.$on('item', (res) => {
|
|
||||||
that.dishList = res
|
|
||||||
console.log(res)
|
|
||||||
})
|
|
||||||
//this.dishList = JSON.parse(decodeURIComponent(e.searchlist))
|
|
||||||
|
|
||||||
},
|
|
||||||
methods:{
|
|
||||||
goToDetail(item) {
|
|
||||||
console.log(item._id)
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/subpkg/dishDetail/dishDetail?_id=' +encodeURIComponent(JSON.stringify(item._id))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.search-list {
|
|
||||||
padding-left: 5rpx;
|
|
||||||
padding-right: 5rpx;
|
|
||||||
border-style: solid;
|
|
||||||
border-radius: 5px;
|
|
||||||
border-color: #65654b;
|
|
||||||
border-width: 3rpx;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-around;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.dish-intro {
|
|
||||||
padding-left: 5rpx;
|
|
||||||
padding-right: 5rpx;
|
|
||||||
border-style: solid;
|
|
||||||
border-radius: 5px;
|
|
||||||
border-color: #65654b;
|
|
||||||
border-width: 3rpx;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
height: 256rpx;
|
|
||||||
font-size: 18rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dish-image {
|
|
||||||
padding-left: 5rpx;
|
|
||||||
padding-right: 5rpx;
|
|
||||||
border-style: solid;
|
|
||||||
border-radius: 5px;
|
|
||||||
border-color: #65654b;
|
|
||||||
border-width: 3rpx;
|
|
||||||
width: 475rpx;
|
|
||||||
height: 256rpx;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,23 +0,0 @@
|
|||||||
const {
|
|
||||||
createApi
|
|
||||||
} = require('./shared/index')
|
|
||||||
|
|
||||||
let reportDataReceiver, dataStatCron
|
|
||||||
module.exports = {
|
|
||||||
//uni统计数据上报数据接收器初始化
|
|
||||||
initReceiver: (options = {}) => {
|
|
||||||
if(!reportDataReceiver) {
|
|
||||||
reportDataReceiver = require('./stat/receiver')
|
|
||||||
}
|
|
||||||
options.clientType = options.clientType || __ctx__.PLATFORM
|
|
||||||
return createApi(reportDataReceiver, options)
|
|
||||||
},
|
|
||||||
//uni统计数据统计模块初始化
|
|
||||||
initStat: (options = {}) => {
|
|
||||||
if(!dataStatCron) {
|
|
||||||
dataStatCron = require('./stat/stat')
|
|
||||||
}
|
|
||||||
options.clientType = options.clientType || __ctx__.PLATFORM
|
|
||||||
return createApi(dataStatCron, options)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "uni-stat",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"lockfileVersion": 1
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "uni-stat",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"keywords": [],
|
|
||||||
"author": "",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"uni-config-center": "file:../../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class UniCloudError 错误处理模块
|
|
||||||
*/
|
|
||||||
module.exports = class UniCloudError extends Error {
|
|
||||||
constructor (options) {
|
|
||||||
super(options.message)
|
|
||||||
this.errMsg = options.message || ''
|
|
||||||
Object.defineProperties(this, {
|
|
||||||
message: {
|
|
||||||
get () {
|
|
||||||
return `errCode: ${options.code || ''} | errMsg: ` + this.errMsg
|
|
||||||
},
|
|
||||||
set (msg) {
|
|
||||||
this.errMsg = msg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
UniCloudError: require('./error'),
|
|
||||||
createApi: require('./create-api'),
|
|
||||||
... require('./utils')
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
DateTime: require('./date'),
|
|
||||||
UniCrypto: require('./uni-crypto')
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class AppCrashLogs 原生应用崩溃日志模型
|
|
||||||
* @function clean 原生应用崩溃日志清理函数
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const {
|
|
||||||
DateTime,
|
|
||||||
UniCrypto
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class AppCrashLogs extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'app-crash-logs'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 原生应用崩溃日志清理函数
|
|
||||||
* @param {Number} days 保留天数
|
|
||||||
*/
|
|
||||||
async clean(days = 7) {
|
|
||||||
days = Math.max(parseInt(days), 1)
|
|
||||||
console.log('clean app crash logs - day:', days)
|
|
||||||
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
|
|
||||||
const res = await this.delete(this.tableName, {
|
|
||||||
create_time: {
|
|
||||||
$lt: dateTime.getTimeBySetDays(0 - days)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!res.code) {
|
|
||||||
console.log('clean app crash log:', res)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class Channel 渠道模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const Scenes = require('./scenes')
|
|
||||||
const {
|
|
||||||
DateTime
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class Channel extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'app-channels'
|
|
||||||
this.scenes = new Scenes()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取渠道信息
|
|
||||||
* @param {String} appid
|
|
||||||
* @param {String} platformId 平台编号
|
|
||||||
* @param {String} channel 渠道代码
|
|
||||||
*/
|
|
||||||
async getChannel(appid, platformId, channel) {
|
|
||||||
const cacheKey = 'uni-stat-channel-' + appid + '-' + platformId + '-' + channel
|
|
||||||
let channelData = await this.getCache(cacheKey)
|
|
||||||
if (!channelData) {
|
|
||||||
const channelInfo = await this.getCollection(this.tableName).where({
|
|
||||||
appid: appid,
|
|
||||||
platform_id: platformId,
|
|
||||||
channel_code: channel
|
|
||||||
}).limit(1).get()
|
|
||||||
channelData = []
|
|
||||||
if (channelInfo.data.length > 0) {
|
|
||||||
channelData = channelInfo.data[0]
|
|
||||||
if (channelData.channel_name === '') {
|
|
||||||
const scenesName = await this.scenes.getScenesNameByPlatformId(platformId, channel)
|
|
||||||
if (scenesName) {
|
|
||||||
await this.update(this.tableName, {
|
|
||||||
channel_name: scenesName,
|
|
||||||
update_time: new DateTime().getTime()
|
|
||||||
}, {
|
|
||||||
_id: channelData._id
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await this.setCache(cacheKey, channelData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return channelData
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取渠道信息没有则进行创建
|
|
||||||
* @param {String} appid
|
|
||||||
* @param {String} platformId
|
|
||||||
* @param {String} channel
|
|
||||||
*/
|
|
||||||
async getChannelAndCreate(appid, platformId, channel) {
|
|
||||||
if (!appid || !platformId) {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
|
|
||||||
const channelInfo = await this.getChannel(appid, platformId, channel)
|
|
||||||
if (channelInfo.length === 0) {
|
|
||||||
const thisTime = new DateTime().getTime()
|
|
||||||
const insertParam = {
|
|
||||||
appid: appid,
|
|
||||||
platform_id: platformId,
|
|
||||||
channel_code: channel,
|
|
||||||
channel_name: await this.scenes.getScenesNameByPlatformId(platformId, channel),
|
|
||||||
create_time: thisTime,
|
|
||||||
update_time: thisTime
|
|
||||||
}
|
|
||||||
const res = await this.insert(this.tableName, insertParam)
|
|
||||||
if (res && res.id) {
|
|
||||||
return Object.assign(insertParam, {
|
|
||||||
_id: res.id
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return channelInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取渠道_id
|
|
||||||
* @param {String} appid
|
|
||||||
* @param {String} platformId
|
|
||||||
* @param {String} channel
|
|
||||||
*/
|
|
||||||
async getChannelId(appid, platformId, channel) {
|
|
||||||
const channelInfo = await this.getChannel(appid, platformId, channel)
|
|
||||||
return channelInfo.length > 0 ? channelInfo._id : ''
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取渠道码或者场景值
|
|
||||||
* @param {Object} params 上报参数
|
|
||||||
*/
|
|
||||||
getChannelCode(params) {
|
|
||||||
//小程序未上报渠道则使用场景值
|
|
||||||
if (params.ch) {
|
|
||||||
return params.ch
|
|
||||||
} else if (params.sc && params.ut.indexOf('mp-') === 0) {
|
|
||||||
return params.sc
|
|
||||||
}
|
|
||||||
return this.scenes.defualtCode
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,184 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class Device 设备模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const Platform = require('./platform')
|
|
||||||
const {
|
|
||||||
DateTime
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class Device extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'opendb-device'
|
|
||||||
this.tablePrefix = false
|
|
||||||
this.cacheKeyPre = 'uni-stat-device-'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 通过设备编号获取设备信息
|
|
||||||
* @param {Object} deviceId 设备编号
|
|
||||||
*/
|
|
||||||
async getDeviceById(deviceId) {
|
|
||||||
const cacheKey = this.cacheKeyPre + deviceId
|
|
||||||
let deviceData = await this.getCache(cacheKey)
|
|
||||||
if (!deviceData) {
|
|
||||||
const deviceRes = await this.getCollection().where({
|
|
||||||
device_id: deviceId
|
|
||||||
}).get()
|
|
||||||
deviceData = []
|
|
||||||
if (deviceRes.data.length > 0) {
|
|
||||||
deviceData = deviceRes.data[0]
|
|
||||||
await this.setCache(cacheKey, deviceData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return deviceData
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置设备信息
|
|
||||||
* @param {Object} params 上报参数
|
|
||||||
*/
|
|
||||||
async setDevice(params) {
|
|
||||||
// 设备信息
|
|
||||||
if (!params.did) {
|
|
||||||
return {
|
|
||||||
code: 200,
|
|
||||||
msg: 'Parameter "did" not found'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const deviceData = await this.getDeviceById(params.did)
|
|
||||||
//不存在则添加
|
|
||||||
if(deviceData.length === 0) {
|
|
||||||
return await this.addDevice(params)
|
|
||||||
} else {
|
|
||||||
return await this.updateDevice(params, deviceData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加设备信息
|
|
||||||
* @param {Object} params 上报参数
|
|
||||||
*/
|
|
||||||
async addDevice(params) {
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
const platform = new Platform()
|
|
||||||
const fillParams = {
|
|
||||||
device_id: params.did,
|
|
||||||
appid: params.ak,
|
|
||||||
vendor: params.brand ? params.brand : '',
|
|
||||||
push_clientid: params.cid ? params.cid : '',
|
|
||||||
imei: params.imei ? params.imei : '',
|
|
||||||
oaid: params.oaid ? params.oaid : '',
|
|
||||||
idfa: params.idfa ? params.idfa : '',
|
|
||||||
imsi: params.imsi ? params.imsi : '',
|
|
||||||
model: params.md ? params.md : '',
|
|
||||||
uni_platform: params.up ? params.up : '',
|
|
||||||
os_name: params.on ? params.on : platform.getOsName(params.p),
|
|
||||||
os_version: params.sv ? params.sv : '',
|
|
||||||
os_language: params.lang ? params.lang : '',
|
|
||||||
os_theme: params.ot ? params.ot : '',
|
|
||||||
pixel_ratio: params.pr ? params.pr : '',
|
|
||||||
network_model: params.net ? params.net : '',
|
|
||||||
window_width: params.ww ? params.ww : '',
|
|
||||||
window_height: params.wh ? params.wh : '',
|
|
||||||
screen_width: params.sw ? params.sw : '',
|
|
||||||
screen_height: params.sh ? params.sh : '',
|
|
||||||
rom_name: params.rn ? params.rn : '',
|
|
||||||
rom_version: params.rv ? params.rv : '',
|
|
||||||
location_ip: params.ip ? params.ip : '',
|
|
||||||
location_latitude: params.lat ? parseFloat(params.lat) : 0,
|
|
||||||
location_longitude: params.lng ? parseFloat(params.lng) : 0,
|
|
||||||
location_country: params.cn ? params.cn : '',
|
|
||||||
location_province: params.pn ? params.pn : '',
|
|
||||||
location_city: params.ct ? params.ct : '',
|
|
||||||
create_date: dateTime.getTime(),
|
|
||||||
last_update_date: dateTime.getTime()
|
|
||||||
}
|
|
||||||
const res = await this.insert(this.tableName, fillParams)
|
|
||||||
if (res && res.id) {
|
|
||||||
return {
|
|
||||||
code: 0,
|
|
||||||
msg: 'success',
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
code: 500,
|
|
||||||
msg: 'Device data filled error'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改设备信息
|
|
||||||
* @param {Object} params
|
|
||||||
* @param {Object} deviceData
|
|
||||||
*/
|
|
||||||
async updateDevice(params, deviceData) {
|
|
||||||
//最新的参数
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
const platform = new Platform()
|
|
||||||
console.log('device params', params)
|
|
||||||
const newDeviceParams = {
|
|
||||||
appid: params.ak,
|
|
||||||
push_clientid: params.cid ? params.cid : '',
|
|
||||||
imei: params.imei ? params.imei : '',
|
|
||||||
oaid: params.oaid ? params.oaid : '',
|
|
||||||
idfa: params.idfa ? params.idfa : '',
|
|
||||||
imsi: params.imsi ? params.imsi : '',
|
|
||||||
uni_platform: params.up ? params.up : '',
|
|
||||||
os_name: params.on ? params.on : platform.getOsName(params.p),
|
|
||||||
os_version: params.sv ? params.sv : '',
|
|
||||||
os_language: params.lang ? params.lang : '',
|
|
||||||
pixel_ratio: params.pr ? params.pr : '',
|
|
||||||
network_model: params.net ? params.net : '',
|
|
||||||
window_width: params.ww ? params.ww : '',
|
|
||||||
window_height: params.wh ? params.wh : '',
|
|
||||||
screen_width: params.sw ? params.sw : '',
|
|
||||||
screen_height: params.sh ? params.sh : '',
|
|
||||||
rom_name: params.rn ? params.rn : '',
|
|
||||||
rom_version: params.rv ? params.rv : '',
|
|
||||||
location_ip: params.ip ? params.ip : '',
|
|
||||||
location_latitude: params.lat ? parseFloat(params.lat) : '',
|
|
||||||
location_longitude: params.lng ? parseFloat(params.lng) : '',
|
|
||||||
location_country: params.cn ? params.cn : '',
|
|
||||||
location_province: params.pn ? params.pn : '',
|
|
||||||
location_city: params.ct ? params.ct : '',
|
|
||||||
}
|
|
||||||
|
|
||||||
//检查是否有需要更新的数据
|
|
||||||
const updateData = {}
|
|
||||||
for(let key in newDeviceParams) {
|
|
||||||
if(newDeviceParams[key] && newDeviceParams[key] !== deviceData[key]) {
|
|
||||||
updateData[key] = newDeviceParams[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Object.keys(updateData).length) {
|
|
||||||
if(this.debug) {
|
|
||||||
console.log('Device need to update', updateData)
|
|
||||||
}
|
|
||||||
//数据更新
|
|
||||||
updateData.last_update_date = dateTime.getTime()
|
|
||||||
await this.update(this.tableName, updateData, {device_id: params.did})
|
|
||||||
} else {
|
|
||||||
if(this.debug) {
|
|
||||||
console.log('Device not need update', newDeviceParams)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
code: 0,
|
|
||||||
msg: 'success'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async bindPush(params) {
|
|
||||||
if (!params.cid) {
|
|
||||||
return {
|
|
||||||
code: 200,
|
|
||||||
msg: 'Parameter "cid" not found'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return await this.setDevice(params)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,141 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class ErrorLog 错误日志模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const Platform = require('./platform')
|
|
||||||
const Channel = require('./channel')
|
|
||||||
const {
|
|
||||||
DateTime,
|
|
||||||
UniCrypto
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class ErrorLog extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'error-logs'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 错误日志数据填充
|
|
||||||
* @param {Object} reportParams 上报参数
|
|
||||||
*/
|
|
||||||
async fill(reportParams) {
|
|
||||||
let params, errorHash, errorCount, cacheKey;
|
|
||||||
const fillParams = []
|
|
||||||
const platform = new Platform()
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
const uniCrypto = new UniCrypto()
|
|
||||||
const channel = new Channel()
|
|
||||||
const {
|
|
||||||
needCheck,
|
|
||||||
checkTime
|
|
||||||
} = this.getConfig('errorCheck')
|
|
||||||
const errorCheckTime = Math.max(checkTime, 1)
|
|
||||||
let spaceId
|
|
||||||
let spaceProvider
|
|
||||||
for (const rk in reportParams) {
|
|
||||||
params = reportParams[rk]
|
|
||||||
errorHash = uniCrypto.md5(params.em)
|
|
||||||
cacheKey = 'error-count-' + errorHash
|
|
||||||
// 校验在指定时间段内是否已存在相同的错误项
|
|
||||||
if (needCheck) {
|
|
||||||
errorCount = await this.getCache(cacheKey)
|
|
||||||
if (!errorCount) {
|
|
||||||
errorCount = await this.getCollection(this.tableName).where({
|
|
||||||
error_hash: errorHash,
|
|
||||||
create_time: {
|
|
||||||
$gte: dateTime.getTime() - errorCheckTime * 60000
|
|
||||||
}
|
|
||||||
}).count()
|
|
||||||
if (errorCount && errorCount.total > 0) {
|
|
||||||
await this.setCache(cacheKey, errorCount, errorCheckTime * 60)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errorCount && errorCount.total > 0) {
|
|
||||||
if (this.debug) {
|
|
||||||
console.log('This error have already existsed: ' + params.em)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取云端信息
|
|
||||||
spaceId = null
|
|
||||||
spaceProvider = null
|
|
||||||
if (params.spi) {
|
|
||||||
//云函数调用参数
|
|
||||||
spaceId = params.spi.spaceId
|
|
||||||
spaceProvider = params.spi.provider
|
|
||||||
} else {
|
|
||||||
//云对象调用参数
|
|
||||||
if (params.spid) {
|
|
||||||
spaceId = params.spid
|
|
||||||
}
|
|
||||||
if (params.sppd) {
|
|
||||||
spaceProvider = params.sppd
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 填充数据
|
|
||||||
fillParams.push({
|
|
||||||
appid: params.ak,
|
|
||||||
version: params.v ? params.v : '',
|
|
||||||
platform: platform.getPlatformCode(params.ut, params.p),
|
|
||||||
channel: channel.getChannelCode(params),
|
|
||||||
device_id: params.did,
|
|
||||||
uid: params.uid ? params.uid : '',
|
|
||||||
os: params.on ? params.on : platform.getOsName(params.p),
|
|
||||||
ua: params.ua ? params.ua : '',
|
|
||||||
page_url: params.url ? params.url : '',
|
|
||||||
space_id: spaceId ? spaceId : '',
|
|
||||||
space_provider: spaceProvider ? spaceProvider : '',
|
|
||||||
platform_version: params.mpv ? params.mpv : '',
|
|
||||||
error_msg: params.em ? params.em : '',
|
|
||||||
error_hash: errorHash,
|
|
||||||
create_time: dateTime.getTime()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fillParams.length === 0) {
|
|
||||||
return {
|
|
||||||
code: 200,
|
|
||||||
msg: 'Invild param'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.insert(this.tableName, fillParams)
|
|
||||||
if (res && res.inserted) {
|
|
||||||
return {
|
|
||||||
code: 0,
|
|
||||||
msg: 'success'
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
code: 500,
|
|
||||||
msg: 'Filled error'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 错误日志清理
|
|
||||||
* @param {Number} days 日志保留天数
|
|
||||||
*/
|
|
||||||
async clean(days) {
|
|
||||||
days = Math.max(parseInt(days), 1)
|
|
||||||
console.log('clean error logs - day:', days)
|
|
||||||
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
|
|
||||||
const res = await this.delete(this.tableName, {
|
|
||||||
create_time: {
|
|
||||||
$lt: dateTime.getTimeBySetDays(0 - days)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!res.code) {
|
|
||||||
console.log('clean error log:', res)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class StatEvent 事件统计模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const {
|
|
||||||
DateTime
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class StatEvent extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'events'
|
|
||||||
this.defaultEvent = this.getConfig('event') || {
|
|
||||||
login: '登录',
|
|
||||||
register: '注册',
|
|
||||||
click: '点击',
|
|
||||||
share: '分享',
|
|
||||||
pay_success: '支付成功',
|
|
||||||
pay_fail: '支付失败'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取事件信息
|
|
||||||
* @param {String} appid: DCloud appid
|
|
||||||
* @param {String} eventKey 事件键值
|
|
||||||
*/
|
|
||||||
async getEvent(appid, eventKey) {
|
|
||||||
const cacheKey = 'uni-stat-event-' + appid + '-' + eventKey
|
|
||||||
let eventData = await this.getCache(cacheKey)
|
|
||||||
if (!eventData) {
|
|
||||||
const eventInfo = await this.getCollection(this.tableName).where({
|
|
||||||
appid: appid,
|
|
||||||
event_key: eventKey
|
|
||||||
}).get()
|
|
||||||
eventData = []
|
|
||||||
if (eventInfo.data.length > 0) {
|
|
||||||
eventData = eventInfo.data[0]
|
|
||||||
await this.setCache(cacheKey, eventData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return eventData
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取事件信息不存在则创建
|
|
||||||
* @param {String} appid: DCloud appid
|
|
||||||
* @param {String} eventKey 事件键值
|
|
||||||
*/
|
|
||||||
async getEventAndCreate(appid, eventKey) {
|
|
||||||
const eventInfo = await this.getEvent(appid, eventKey)
|
|
||||||
if (eventInfo.length === 0) {
|
|
||||||
const thisTime = new DateTime().getTime()
|
|
||||||
const insertParam = {
|
|
||||||
appid: appid,
|
|
||||||
event_key: eventKey,
|
|
||||||
event_name: this.defaultEvent[eventKey] ? this.defaultEvent[eventKey] : '',
|
|
||||||
create_time: thisTime,
|
|
||||||
update_time: thisTime
|
|
||||||
}
|
|
||||||
const res = await this.insert(this.tableName, insertParam)
|
|
||||||
|
|
||||||
if (res && res.id) {
|
|
||||||
return Object.assign(insertParam, {
|
|
||||||
_id: res.id
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return eventInfo
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,156 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class EventLog 事件日志模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const Platform = require('./platform')
|
|
||||||
const Channel = require('./channel')
|
|
||||||
const StatEvent = require('./event')
|
|
||||||
const SessionLog = require('./sessionLog')
|
|
||||||
const ShareLog = require('./shareLog')
|
|
||||||
const {
|
|
||||||
DateTime
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class EventLog extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'event-logs'
|
|
||||||
this.sessionLogInfo = []
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 事件日志填充
|
|
||||||
* @param {Object} reportParams 上报参数
|
|
||||||
*/
|
|
||||||
async fill(reportParams) {
|
|
||||||
let params;
|
|
||||||
let sessionKey, sessionLogKey;
|
|
||||||
let sessionLogInfo;
|
|
||||||
const sessionData = []
|
|
||||||
const fillParams = []
|
|
||||||
const shareParams = []
|
|
||||||
const sessionLog = new SessionLog()
|
|
||||||
const event = new StatEvent()
|
|
||||||
const platform = new Platform()
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
const channel = new Channel()
|
|
||||||
for (const rk in reportParams) {
|
|
||||||
params = reportParams[rk]
|
|
||||||
|
|
||||||
//暂存下会话数据,减少读库
|
|
||||||
sessionKey = params.ak + params.did + params.p
|
|
||||||
if (!this.sessionLogInfo[sessionKey]) {
|
|
||||||
// 会话日志
|
|
||||||
sessionLogInfo = await sessionLog.getSession(params)
|
|
||||||
if (sessionLogInfo.code) {
|
|
||||||
return sessionLogInfo
|
|
||||||
}
|
|
||||||
if (this.debug) {
|
|
||||||
console.log('sessionLogInfo', JSON.stringify(sessionLogInfo))
|
|
||||||
}
|
|
||||||
this.sessionLogInfo[sessionKey] = sessionLogInfo
|
|
||||||
} else {
|
|
||||||
sessionLogInfo = this.sessionLogInfo[sessionKey]
|
|
||||||
}
|
|
||||||
|
|
||||||
// 会话数据
|
|
||||||
sessionLogKey = sessionLogInfo.data.sessionLogId.toString()
|
|
||||||
if (!sessionData[sessionLogKey]) {
|
|
||||||
sessionData[sessionLogKey] = {
|
|
||||||
eventCount: sessionLogInfo.data.eventCount + 1,
|
|
||||||
addEventCount: 1,
|
|
||||||
uid: sessionLogInfo.data.uid,
|
|
||||||
createTime: sessionLogInfo.data.createTime
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sessionData[sessionLogKey].eventCount++
|
|
||||||
sessionData[sessionLogKey].addEventCount++
|
|
||||||
}
|
|
||||||
|
|
||||||
// 事件
|
|
||||||
const eventInfo = await event.getEventAndCreate(params.ak, params.e_n)
|
|
||||||
|
|
||||||
// 填充数据
|
|
||||||
fillParams.push({
|
|
||||||
appid: params.ak,
|
|
||||||
version: params.v ? params.v : '',
|
|
||||||
platform: platform.getPlatformCode(params.ut, params.p),
|
|
||||||
channel: channel.getChannelCode(params),
|
|
||||||
device_id: params.did,
|
|
||||||
uid: params.uid ? params.uid : '',
|
|
||||||
session_id: sessionLogInfo.data.sessionLogId,
|
|
||||||
page_id: sessionLogInfo.data.pageId,
|
|
||||||
event_key: eventInfo.event_key,
|
|
||||||
param: params.e_v ? params.e_v : '',
|
|
||||||
// 版本
|
|
||||||
sdk_version: params.mpsdk ? params.mpsdk : '',
|
|
||||||
platform_version: params.mpv ? params.mpv : '',
|
|
||||||
// 设备相关
|
|
||||||
device_os_name: params.on ? params.on : platform.getOsName(params.p),
|
|
||||||
device_os_version: params.sv ? params.sv : '',
|
|
||||||
device_vendor: params.brand ? params.brand : '',
|
|
||||||
device_model: params.md ? params.md : '',
|
|
||||||
device_language: params.lang ? params.lang : '',
|
|
||||||
device_pixel_ratio: params.pr ? params.pr : '',
|
|
||||||
device_window_width: params.ww ? params.ww : '',
|
|
||||||
device_window_height: params.wh ? params.wh : '',
|
|
||||||
device_screen_width: params.sw ? params.sw : '',
|
|
||||||
device_screen_height: params.sh ? params.sh : '',
|
|
||||||
create_time: dateTime.getTime()
|
|
||||||
})
|
|
||||||
// 分享数据
|
|
||||||
if (eventInfo.event_key === 'share') {
|
|
||||||
shareParams.push(params)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fillParams.length === 0) {
|
|
||||||
return {
|
|
||||||
code: 200,
|
|
||||||
msg: 'Invild param'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shareParams.length > 0) {
|
|
||||||
const shareLog = new ShareLog()
|
|
||||||
await shareLog.fill(shareParams, this.sessionLogInfo)
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.insert(this.tableName, fillParams)
|
|
||||||
if (res && res.inserted) {
|
|
||||||
for (const sid in sessionData) {
|
|
||||||
await sessionLog.updateSession(sid, sessionData[sid])
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
code: 0,
|
|
||||||
msg: 'success'
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
code: 500,
|
|
||||||
msg: 'Filled error'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 事件日志清理
|
|
||||||
* @param {Number} days 保留天数
|
|
||||||
*/
|
|
||||||
async clean(days) {
|
|
||||||
days = Math.max(parseInt(days), 1)
|
|
||||||
console.log('clean event logs - day:', days)
|
|
||||||
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
//删除过期数据
|
|
||||||
const res = await this.delete(this.tableName, {
|
|
||||||
create_time: {
|
|
||||||
$lt: dateTime.getTimeBySetDays(0 - days)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!res.code) {
|
|
||||||
console.log('clean event log:', res)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
/**
|
|
||||||
* 基础对外模型
|
|
||||||
*/
|
|
||||||
module.exports = {
|
|
||||||
BaseMod: require('./base'),
|
|
||||||
SessionLog: require('./sessionLog'),
|
|
||||||
UserSessionLog: require('./userSessionLog'),
|
|
||||||
PageLog: require('./pageLog'),
|
|
||||||
EventLog: require('./eventLog'),
|
|
||||||
ShareLog: require('./shareLog'),
|
|
||||||
ErrorLog: require('./errorLog'),
|
|
||||||
AppCrashLogs: require('./appCrashLogs'),
|
|
||||||
StatResult: require('./statResult'),
|
|
||||||
ActiveUsers: require('./activeUsers'),
|
|
||||||
ActiveDevices: require('./activeDevices'),
|
|
||||||
PageResult: require('./pageResult'),
|
|
||||||
EventResult: require('./eventResult'),
|
|
||||||
ErrorResult: require('./errorResult'),
|
|
||||||
Loyalty: require('./loyalty'),
|
|
||||||
RunErrors: require('./runErrors'),
|
|
||||||
uniPay: require('./uni-pay'),
|
|
||||||
Setting: require('./setting'),
|
|
||||||
}
|
|
@ -1,83 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class Page 页面模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const {
|
|
||||||
parseUrl
|
|
||||||
} = require('../../shared')
|
|
||||||
const {
|
|
||||||
DateTime
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class Page extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'pages'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取页面信息
|
|
||||||
* @param {String} appid
|
|
||||||
* @param {String} url 页面地址
|
|
||||||
*/
|
|
||||||
async getPage(appid, url) {
|
|
||||||
const cacheKey = 'uni-stat-page-' + appid + '-' + url
|
|
||||||
let pageData = await this.getCache(cacheKey)
|
|
||||||
if (!pageData) {
|
|
||||||
const pageInfo = await this.getCollection(this.tableName).where({
|
|
||||||
appid: appid,
|
|
||||||
path: url
|
|
||||||
}).limit(1).get()
|
|
||||||
pageData = []
|
|
||||||
if (pageInfo.data.length > 0) {
|
|
||||||
pageData = pageInfo.data[0]
|
|
||||||
await this.setCache(cacheKey, pageData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pageData
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取页面信息不存在则创建
|
|
||||||
* @param {String} appid
|
|
||||||
* @param {String} url 页面地址
|
|
||||||
* @param {Object} title 页面标题
|
|
||||||
*/
|
|
||||||
async getPageAndCreate(appid, url, title) {
|
|
||||||
//获取url信息
|
|
||||||
const urlInfo = parseUrl(url)
|
|
||||||
if (!urlInfo) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
const baseurl = urlInfo.path
|
|
||||||
const pageInfo = await this.getPage(appid, baseurl)
|
|
||||||
//页面不存在则创建
|
|
||||||
if (pageInfo.length === 0) {
|
|
||||||
const thisTime = new DateTime().getTime()
|
|
||||||
const insertParam = {
|
|
||||||
appid: appid,
|
|
||||||
path: baseurl,
|
|
||||||
title: title,
|
|
||||||
page_params: [],
|
|
||||||
create_time: thisTime,
|
|
||||||
update_time: thisTime
|
|
||||||
}
|
|
||||||
const res = await this.insert(this.tableName, insertParam)
|
|
||||||
|
|
||||||
if (res && res.id) {
|
|
||||||
return Object.assign(insertParam, {
|
|
||||||
_id: res.id
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else if (!pageInfo.title && title) {
|
|
||||||
const cacheKey = 'uni-stat-page-' + appid + '-' + baseurl
|
|
||||||
await this.clearCache(cacheKey)
|
|
||||||
await this.update(this.tableName, {
|
|
||||||
title: title
|
|
||||||
}, {
|
|
||||||
_id: pageInfo._id
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return pageInfo
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,186 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class PageLog 页面日志模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const Page = require('./page')
|
|
||||||
const Platform = require('./platform')
|
|
||||||
const Channel = require('./channel')
|
|
||||||
const SessionLog = require('./sessionLog')
|
|
||||||
const {
|
|
||||||
DateTime
|
|
||||||
} = require('../lib')
|
|
||||||
const {
|
|
||||||
parseUrl
|
|
||||||
} = require('../../shared')
|
|
||||||
module.exports = class PageLog extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'page-logs'
|
|
||||||
this.sessionLogInfo = []
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面日志数据填充
|
|
||||||
* @param {Object} reportParams 上报参数
|
|
||||||
*/
|
|
||||||
async fill(reportParams) {
|
|
||||||
let params;
|
|
||||||
let sessionKey
|
|
||||||
let sessionLogKey
|
|
||||||
let sessionLogInfo
|
|
||||||
let pageKey
|
|
||||||
let pageInfo
|
|
||||||
let referPageInfo
|
|
||||||
const sessionData = []
|
|
||||||
const pageData = []
|
|
||||||
const fillParams = []
|
|
||||||
const sessionLog = new SessionLog()
|
|
||||||
const page = new Page()
|
|
||||||
const platform = new Platform()
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
const channel = new Channel()
|
|
||||||
for (const pk in reportParams) {
|
|
||||||
params = reportParams[pk]
|
|
||||||
if (['3', '4'].includes(params.lt) && !params.url && params.urlref) {
|
|
||||||
params.url = params.urlref
|
|
||||||
}
|
|
||||||
|
|
||||||
// 页面信息
|
|
||||||
pageKey = params.ak + params.url
|
|
||||||
if (pageData[pageKey]) {
|
|
||||||
pageInfo = pageData[pageKey]
|
|
||||||
} else {
|
|
||||||
pageInfo = await page.getPageAndCreate(params.ak, params.url, params.ttpj)
|
|
||||||
if (!pageInfo || pageInfo.length === 0) {
|
|
||||||
console.log('Not found this page by param:', JSON.stringify(params))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pageData[pageKey] = pageInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
// 会话日志,暂存下会话数据,减少读库
|
|
||||||
sessionKey = params.ak + params.did + params.p
|
|
||||||
if (!this.sessionLogInfo[sessionKey]) {
|
|
||||||
sessionLogInfo = await sessionLog.getSession(params)
|
|
||||||
if (sessionLogInfo.code) {
|
|
||||||
return sessionLogInfo
|
|
||||||
}
|
|
||||||
if (this.debug) {
|
|
||||||
console.log('sessionLogInfo', JSON.stringify(sessionLogInfo))
|
|
||||||
}
|
|
||||||
this.sessionLogInfo[sessionKey] = sessionLogInfo
|
|
||||||
} else {
|
|
||||||
sessionLogInfo = this.sessionLogInfo[sessionKey]
|
|
||||||
}
|
|
||||||
|
|
||||||
// 会话数据
|
|
||||||
sessionLogKey = sessionLogInfo.data.sessionLogId.toString()
|
|
||||||
if (!sessionData[sessionLogKey]) {
|
|
||||||
//临时存储减少查询次数
|
|
||||||
sessionData[sessionLogKey] = {
|
|
||||||
pageCount: sessionLogInfo.data.pageCount + 1,
|
|
||||||
addPageCount: 1,
|
|
||||||
createTime: sessionLogInfo.data.createTime,
|
|
||||||
pageId: pageInfo._id,
|
|
||||||
uid: sessionLogInfo.data.uid
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.debug) {
|
|
||||||
console.log('add sessionData - ' + sessionLogKey, sessionData)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
sessionData[sessionLogKey].pageCount += 1
|
|
||||||
sessionData[sessionLogKey].addPageCount += 1
|
|
||||||
sessionData[sessionLogKey].pageId = pageInfo._id
|
|
||||||
|
|
||||||
if (this.debug) {
|
|
||||||
console.log('update sessionData - ' + sessionLogKey, sessionData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 上级页面信息
|
|
||||||
pageKey = params.ak + params.urlref
|
|
||||||
if (pageData[pageKey]) {
|
|
||||||
referPageInfo = pageData[pageKey]
|
|
||||||
} else {
|
|
||||||
referPageInfo = await page.getPageAndCreate(params.ak, params.urlref, params.ttpj)
|
|
||||||
if (!referPageInfo || referPageInfo.length === 0) {
|
|
||||||
referPageInfo = {_id:''}
|
|
||||||
}
|
|
||||||
pageData[pageKey] = referPageInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
//当前页面url信息
|
|
||||||
const urlInfo = parseUrl(params.url)
|
|
||||||
|
|
||||||
// 填充数据
|
|
||||||
fillParams.push({
|
|
||||||
appid: params.ak,
|
|
||||||
version: params.v ? params.v : '',
|
|
||||||
platform: platform.getPlatformCode(params.ut, params.p),
|
|
||||||
channel: channel.getChannelCode(params),
|
|
||||||
device_id: params.did,
|
|
||||||
uid: params.uid ? params.uid : '',
|
|
||||||
session_id: sessionLogInfo.data.sessionLogId,
|
|
||||||
page_id: pageInfo._id,
|
|
||||||
query_string: urlInfo.query,
|
|
||||||
//上级页面相关
|
|
||||||
previous_page_id: referPageInfo._id,
|
|
||||||
previous_page_duration: params.urlref_ts ? parseInt(params.urlref_ts) : 0,
|
|
||||||
previous_page_is_entry: referPageInfo._id === sessionLogInfo.data.entryPageId ? 1 : 0,
|
|
||||||
create_time: dateTime.getTime()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fillParams.length === 0) {
|
|
||||||
console.log('No page params')
|
|
||||||
return {
|
|
||||||
code: 200,
|
|
||||||
msg: 'Invild param'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//日志数据入库
|
|
||||||
const res = await this.insert(this.tableName, fillParams)
|
|
||||||
if (res && res.inserted) {
|
|
||||||
// 更新会话数据
|
|
||||||
const nowTime = dateTime.getTime()
|
|
||||||
for (const sid in sessionData) {
|
|
||||||
await sessionLog.updateSession(sid, sessionData[sid])
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
code: 0,
|
|
||||||
msg: 'success'
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
code: 500,
|
|
||||||
msg: 'Filled error'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面日志清理
|
|
||||||
* @param {Number} days 页面日志保留天数
|
|
||||||
*/
|
|
||||||
async clean(days) {
|
|
||||||
days = Math.max(parseInt(days), 1)
|
|
||||||
console.log('clean page logs - day:', days)
|
|
||||||
|
|
||||||
const dateTime = new DateTime()
|
|
||||||
|
|
||||||
const res = await this.delete(this.tableName, {
|
|
||||||
create_time: {
|
|
||||||
$lt: dateTime.getTimeBySetDays(0 - days)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!res.code) {
|
|
||||||
console.log('clean page log:', res)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,160 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class Platform 应用平台模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const {
|
|
||||||
DateTime
|
|
||||||
} = require('../lib')
|
|
||||||
module.exports = class Platform extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'app-platforms'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取平台信息
|
|
||||||
* @param {String} platform 平台代码
|
|
||||||
* @param {String} os 系统
|
|
||||||
*/
|
|
||||||
async getPlatform(platform, os) {
|
|
||||||
const cacheKey = 'uni-stat-platform-' + platform + '-' + os
|
|
||||||
let platformData = await this.getCache(cacheKey)
|
|
||||||
if (!platformData) {
|
|
||||||
const platformCode = this.getPlatformCode(platform, os)
|
|
||||||
const platformInfo = await this.getCollection(this.tableName).where({
|
|
||||||
code: platformCode
|
|
||||||
}).limit(1).get()
|
|
||||||
platformData = []
|
|
||||||
if (platformInfo.data.length > 0) {
|
|
||||||
platformData = platformInfo.data[0]
|
|
||||||
await this.setCache(cacheKey, platformData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return platformData
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取平台信息没有则创建
|
|
||||||
* @param {String} platform 平台代码
|
|
||||||
* @param {String} os 系统
|
|
||||||
*/
|
|
||||||
async getPlatformAndCreate(platform, os) {
|
|
||||||
if (!platform) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
const platformInfo = await this.getPlatform(platform, os)
|
|
||||||
|
|
||||||
if (platformInfo.length === 0) {
|
|
||||||
const platformCode = this.getPlatformCode(platform, os)
|
|
||||||
const insertParam = {
|
|
||||||
code: platformCode,
|
|
||||||
name: platformCode,
|
|
||||||
create_time: new DateTime().getTime()
|
|
||||||
}
|
|
||||||
const res = await this.insert(this.tableName, insertParam)
|
|
||||||
if (res && res.id) {
|
|
||||||
return Object.assign(insertParam, {
|
|
||||||
_id: res.id
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return platformInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取平台代码
|
|
||||||
* @param {String} platform 平台代码
|
|
||||||
* @param {String} os 系统
|
|
||||||
*/
|
|
||||||
getPlatformCode(platform, os) {
|
|
||||||
let platformCode = platform
|
|
||||||
|
|
||||||
//兼容客户端上报参数
|
|
||||||
switch(platform) {
|
|
||||||
//h5|web
|
|
||||||
case 'h5':
|
|
||||||
platformCode = 'web'
|
|
||||||
break
|
|
||||||
//微信小程序
|
|
||||||
case 'wx':
|
|
||||||
platformCode = 'mp-weixin'
|
|
||||||
break
|
|
||||||
//百度小程序
|
|
||||||
case 'bd':
|
|
||||||
platformCode = 'mp-baidu'
|
|
||||||
break
|
|
||||||
//支付宝小程序
|
|
||||||
case 'ali':
|
|
||||||
platformCode = 'mp-alipay'
|
|
||||||
break
|
|
||||||
//字节跳动小程序
|
|
||||||
case 'tt':
|
|
||||||
platformCode = 'mp-toutiao'
|
|
||||||
break
|
|
||||||
//qq小程序
|
|
||||||
case 'qq':
|
|
||||||
platformCode = 'mp-qq'
|
|
||||||
break
|
|
||||||
//快应用联盟
|
|
||||||
case 'qn':
|
|
||||||
platformCode = 'quickapp-webview-union'
|
|
||||||
break
|
|
||||||
//快应用(webview)
|
|
||||||
case 'qw':
|
|
||||||
platformCode = 'quickapp-webview'
|
|
||||||
break
|
|
||||||
//快应用华为
|
|
||||||
case 'qi':
|
|
||||||
platformCode = 'quickapp-webview-huawei'
|
|
||||||
break
|
|
||||||
//360小程序
|
|
||||||
case '360':
|
|
||||||
platformCode = 'mp-360'
|
|
||||||
break
|
|
||||||
//京东小程序
|
|
||||||
case 'jd':
|
|
||||||
platformCode = 'mp-jd'
|
|
||||||
break
|
|
||||||
//钉钉小程序
|
|
||||||
case 'dt':
|
|
||||||
platformCode = 'mp-dingtalk'
|
|
||||||
break
|
|
||||||
//快手小程序
|
|
||||||
case 'ks':
|
|
||||||
platformCode = 'mp-kuaishou'
|
|
||||||
break
|
|
||||||
//飞书小程序
|
|
||||||
case 'lark':
|
|
||||||
platformCode = 'mp-lark'
|
|
||||||
break
|
|
||||||
//原生应用
|
|
||||||
case 'n':
|
|
||||||
case 'app-plus':
|
|
||||||
case 'app':
|
|
||||||
os = this.getOsName(os)
|
|
||||||
if (os === 'ios') {
|
|
||||||
platformCode = 'ios'
|
|
||||||
} else {
|
|
||||||
platformCode = 'android'
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
return platformCode
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取系统名称
|
|
||||||
* @param {Object} os系统标识
|
|
||||||
*/
|
|
||||||
getOsName(os) {
|
|
||||||
if(!os) {
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
//兼容老版上报参数
|
|
||||||
const osSetting = {
|
|
||||||
i: 'ios',
|
|
||||||
a: 'android'
|
|
||||||
}
|
|
||||||
return osSetting[os] ? osSetting[os] : os
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class RunErrors 运行错误日志
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
module.exports = class RunErrors extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'run-errors'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建日志
|
|
||||||
* @param {Object} params 参数
|
|
||||||
*/
|
|
||||||
async create(params) {
|
|
||||||
if (!params) return
|
|
||||||
const res = await this.insert(this.tableName, params)
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,80 +0,0 @@
|
|||||||
/**
|
|
||||||
* @class Scenes 场景值模型
|
|
||||||
*/
|
|
||||||
const BaseMod = require('./base')
|
|
||||||
const Platform = require('./platform')
|
|
||||||
module.exports = class Scenes extends BaseMod {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.tableName = 'mp-scenes'
|
|
||||||
this.defualtCode = '1001'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取场景值
|
|
||||||
* @param {String} platform 平台代码
|
|
||||||
* @param {String} code 场景值代码
|
|
||||||
*/
|
|
||||||
async getScenes(platform, code) {
|
|
||||||
const cacheKey = 'uni-stat-scenes-' + platform + '-' + code
|
|
||||||
let scenesData = await this.getCache(cacheKey)
|
|
||||||
if (!scenesData) {
|
|
||||||
const scenesInfo = await this.getCollection(this.tableName).where({
|
|
||||||
platform: platform,
|
|
||||||
scene_code: code
|
|
||||||
}).limit(1).get()
|
|
||||||
scenesData = []
|
|
||||||
if (scenesInfo.data.length > 0) {
|
|
||||||
scenesData = scenesInfo.data[0]
|
|
||||||
await this.setCache(cacheKey, scenesData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return scenesData
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 通过平台编号获取场景值
|
|
||||||
* @param {String} platformId 平台编号
|
|
||||||
* @param {String} code 场景值代码
|
|
||||||
*/
|
|
||||||
async getScenesByPlatformId(platformId, code) {
|
|
||||||
const platform = new Platform()
|
|
||||||
let platformInfo = await this.getCollection(platform.tableName).where({
|
|
||||||
_id: platformId
|
|
||||||
}).limit(1).get()
|
|
||||||
let scenesData
|
|
||||||
if (platformInfo.data.length > 0) {
|
|
||||||
platformInfo = platformInfo.data[0]
|
|
||||||
scenesData = await this.getScenes(platformInfo.code, code)
|
|
||||||
} else {
|
|
||||||
scenesData = []
|
|
||||||
}
|
|
||||||
return scenesData
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取场景值名称
|
|
||||||
* @param {String} platform 平台代码
|
|
||||||
* @param {String} code 场景值代码
|
|
||||||
*/
|
|
||||||
async getScenesName(platform, code) {
|
|
||||||
const scenesData = await this.getScenes(platform, code)
|
|
||||||
if (scenesData.length === 0) {
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
return scenesData.scene_name
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 通过平台编号获取场景值名称
|
|
||||||
* @param {String} platformId 平台编号
|
|
||||||
* @param {String} code 场景值代码
|
|
||||||
*/
|
|
||||||
async getScenesNameByPlatformId(platformId, code) {
|
|
||||||
const scenesData = await this.getScenesByPlatformId(platformId, code)
|
|
||||||
if (scenesData.length === 0) {
|
|
||||||
return code === this.defualtCode ? '默认' : ''
|
|
||||||
}
|
|
||||||
return scenesData.scene_name
|
|
||||||
}
|
|
||||||
}
|
|