Browse Source

小程序登陆

h5_css
yanyan 3 years ago
parent
commit
51f69b2676
  1. 106
      components/my-login/my-login.vue
  2. 74
      components/my-search/my-search.vue
  3. 8
      pages.json
  4. 32
      pages/index/index.vue
  5. 13
      pages/my/my.vue
  6. 9
      subpkg/list/list.vue
  7. 110
      subpkg/login/login.vue

106
components/my-login/my-login.vue

@ -1,106 +0,0 @@
<template>
<view class="login-container">
<uni-icons type="contact-filled" size="100" color="#AFAFAF"></uni-icons>
<button type="primary" class="btn-login" open-type="getUserInfo" @getuserinfo="getUserInfo">一键登录</button>
<text class="tips-text">登录后尽享更多权益</text>
</view>
</template>
<script>
import { mapMutations, mapState } from 'vuex'
export default {
data() {
return {
};
},
computed: {
...mapState('m_user', ['redirectInfo'])
},
methods: {
...mapMutations('m_user', ['updateUserInfo', 'updateToken', 'updateRedirectInfo']),
//
getUserInfo(e) {
console.log(e)
if (e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')
console.log(e.detail.userInfo)
this.updateUserInfo(e.detail.userInfo)
this.getToken(e.detail)
},
async getToken(info) {
// code
const [err, res] = await uni.login().catch(err => err)
if (err || res.errMsg !== 'login:ok') return uni.$showMsg('登录失败!')
//
const query = {
code: res.code,
encryptedData: info.encryptedData,
iv: info.iv,
rawData: info.rawData,
signature: info.signature
}
const { data: loginResult } = await uni.$http.post('/api/public/v1/users/wxlogin', query)
if (loginResult.meta.status !== 200) return uni.$showMsg('登录失败!')
// token vuex
this.updateToken(loginResult.message.token)
this.navigateBack()
},
navigateBack() {
if (this.redirectInfo && this.redirectInfo.openType === 'switchTab') {
uni.switchTab({
url: this.redirectInfo.from,
complete: () => {
this.updateRedirectInfo(null)
}
})
}
}
}
}
</script>
<style lang="scss">
.login-container {
height: 750rpx;
background-color: #F8F8F8;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
overflow: hidden;
&::after {
content: ' ';
display: block;
width: 100%;
height: 40px;
background-color: white;
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;
}
.tips-text {
font-size: 12px;
color: gray;
}
}
</style>

74
components/my-search/my-search.vue

@ -1,74 +0,0 @@
<template>
<view class="search">
<view class="search-title">请选择演练场景</view>
<view class="my-search-container" @click="searchBoxHandler">
<view class="my-search-box" :style="{ 'border-radius': radius + 'px' }">
<uni-search-bar @confirm="search" @input="input"></uni-search-bar>
<!-- 使用 uni-ui 提供的图标组件 -->
<uni-icons type="search" size="17" color="" ></uni-icons>
<text class="placeholder">搜索场景</text>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
//
bgcolor: {
type: String,
default: 'white'
},
//
radius: {
type: Number,
default: 4 // px
}
},
data() {
return {
}
},
methods: {
searchBoxHandler() {
this.$emit('click')
}
}
}
</script>
<style lang="scss">
.search-title{
font-family: 'Courier New', Courier, monospace;
color: #67676a;
margin-left: 8px;
margin-top: 6px;
}
.my-search-container {
height: 50px;
// background-color: #C00000;
display: flex;
align-items: center;
padding: 0 10px;
.my-search-box {
height: 36px;
border: 0.5px solid #969696;
background-color: #FFFFFF;
// border-radius: 18px;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
.placeholder {
font-size: 12px;
margin-left: 4px;
color: #969696;
}
}
}
</style>

8
pages.json

@ -38,6 +38,14 @@
"navigationBarTextStyle": "black",
"enablePullDownRefresh": false
}
},
{
"path" : "login/login",
"style" :
{
"navigationBarTitleText" : "",
"enablePullDownRefresh" : false
}
}]
}],
"globalStyle": {

32
pages/index/index.vue

@ -6,16 +6,13 @@
<!-- 轮播图 -->
<swiper :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000" :circular="true">
<swiper-item v-for="(item, i) in swiperList" :key="i">
<!-- <view class="swiper-item">
<image :src="item.image_src"></image>
</view> -->
<navigator class="swiper-item">
<image :src="item"></image>
</navigator>
</swiper-item>
</swiper>
<view class="scene-list">
<view class="scene-item" v-for="(item,i) in sceneList" :key="i">
<view class="scene-item" v-for="(item,i) in sceneList" :key="i" @click="navClickHandler(item)">
<image :src="item" class="scene-img"></image>
</view>
</view>
@ -23,7 +20,9 @@
</template>
<script>
import { mapMutations, mapState } from 'vuex'
export default {
data() {
return {
//
@ -36,6 +35,9 @@
sceneList: []
};
},
computed: {
...mapState('m_user', ['token'])
},
onLoad() {
uni.setTabBarItem({
index: 1,
@ -54,7 +56,8 @@
"visible": false
});
this.listTabbar();
this.getSwiperList()
this.getSwiperList();
this.checkLogin()
},
methods: {
listTabbar() {
@ -100,22 +103,35 @@
const {
data: res
} = await uni.$http.post('/small/customImage/listAll')
} = await uni.$http.post('/small/customImage/listAll',{page:"home"})
if (!res.success) return uni.$showMsg()
res.data.forEach(item => {
item.uploadPath = 'http://localhost:85' + item.uploadPath
if (item.position === "top") {
this.topImg = item.uploadPath
} else if (item.position === "middle") {
} else if (item.position.indexOf("banner") !=-1) {
this.swiperList.push(item.uploadPath)
} else if (item.position === "bottom") {
} else if (item.position.indexOf("bottom") !=-1) {
this.sceneList.push(item.uploadPath)
}
})
uni.$showMsg('数据请求成功!')
},
navClickHandler(item) {
uni.navigateTo({
url: '/subpkg/list/list'
})
},
checkLogin() {
if(this.token === "") {
uni.reLaunch({
url: '/subpkg/login/login',
})
}
},
}
}
</script>

13
pages/my/my.vue

@ -25,7 +25,7 @@
<!-- 第2个面板 -->
<view class="panel">
<!-- 轮播图 -->
<swiper :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000" :circular="true">
<swiper :indicator-dots="false" :autoplay="true" :interval="3000" :duration="1000" :circular="true">
<swiper-item v-for="(item, i) in swiperList" :key="i">
<navigator class="swiper-item">
<image :src="item"></image>
@ -39,7 +39,7 @@
<view class="function-list">
<view class="panel-list-item" v-for="(item,i) in functionList" :key="i">
<image class="function-img" :src="item.uploadPath"></image>
<text style="margin-right: 240px;">{{item.name}}</text>
<text style="margin-right: 220px;">{{item.name}}</text>
<uni-icons type="arrowright" size="15"></uni-icons>
</view>
</view>
@ -53,7 +53,7 @@
export default {
data() {
return {
avatarUrl :"http://localhost:85/profile//2024/01/18/6147d64a3b94d7b3d3cc35aaf8cbfe06.png",
avatarUrl : uni.$http.baseUrl+"/profile//2024/01/18/6147d64a3b94d7b3d3cc35aaf8cbfe06.png",
//
swiperList: [],
//
@ -85,12 +85,12 @@
const {
data: res
} = await uni.$http.post('/small/customImage/listAll')
} = await uni.$http.post('/small/customImage/listAll',{page:"my"})
if (!res.success) return uni.$showMsg()
res.data.forEach(item=>{
//item.uploadPath = uni.$http.baseUrl +item.uploadPath
//this.swiperList.push(item.uploadPath)
item.uploadPath = uni.$http.baseUrl +item.uploadPath
this.swiperList.push(item.uploadPath)
})
uni.$showMsg('数据请求成功!')
},
@ -105,7 +105,6 @@
item.uploadPath = uni.$http.baseUrl +item.uploadPath
})
this.functionList = res.data;
this.swiperList.push("http://localhost:85/profile//2024/01/18/d8796bd0b80cfbba38585c3462405022.jpeg")
uni.$showMsg('数据请求成功!')
}
},

9
subpkg/list/list.vue

@ -21,7 +21,7 @@
</view>
<!-- 场景区域 -->
<view class="nav-list">
<view class="nav-item" v-for="(item, i) in sceneList" :key="i" @click="navClickHandler(item)">
<view class="nav-item" v-for="(item, i) in sceneList" :key="i">
<image :src="item" class="nav-img"></image>
</view>
</view>
@ -106,13 +106,14 @@
}
}
.nav-list {
display: flex;
justify-content: space-around;
margin: 15px 0;
margin: 12px 0;
.nav-img {
width: 328rpx;
width: 100%;
height: 140rpx;
margin-bottom: 10rpx;
border-radius: 10px;
}
}

110
subpkg/login/login.vue

@ -0,0 +1,110 @@
<template>
<view class="login-container">
<uni-icons type="contact-filled" size="100" color="#AFAFAF"></uni-icons>
<button type="primary" class="btn-login" open-type="getUserInfo" @getuserinfo="getUserInfo">一键登录</button>
<text class="tips-text">登录后尽享更多权益</text>
</view>
</template>
<script>
import { mapMutations, mapState } from 'vuex'
export default {
data() {
return {
};
},
computed: {
...mapState('m_user', ['redirectInfo'])
},
methods:{
...mapMutations('m_user', ['updateUserInfo', 'updateToken', 'updateRedirectInfo']),
getUserInfo(e) {
console.log(e)
if (e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')
// console.log(e.detail.userInfo)
// this.updateToken("11111")
// uni.switchTab({
// url: '/pages/index/index'
// })
console.log(e.detail.userInfo)
this.updateUserInfo(e.detail.userInfo)
this.getToken(e.detail)
},
async getToken(info) {
// code
const [err, res] = await uni.login().catch(err => err)
if (err || res.errMsg !== 'login:ok') return uni.$showMsg('登录失败!')
//
const query = {
code: res.code,
encryptedData: info.encryptedData,
iv: info.iv,
rawData: info.rawData,
signature: info.signature
}
const { data: loginResult } = await uni.$http.post('/small/wechat/login', query)
if (loginResult.meta.status !== 200) return uni.$showMsg('登录失败!')
// token vuex
this.updateToken(loginResult.data)
//this.navigateBack()
},
navigateBack() {
if (this.redirectInfo && this.redirectInfo.openType === 'switchTab') {
uni.switchTab({
url: this.redirectInfo.from,
complete: () => {
this.updateRedirectInfo(null)
}
})
}
}
}
}
</script>
<style lang="scss">
.login-container {
height: 750rpx;
background-color: #F8F8F8;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
overflow: hidden;
&::after {
content: ' ';
display: block;
width: 100%;
height: 40px;
background-color: white;
position: absolute;
bottom: 0;
left: 0;
border-radius: 100%;
transform: translateY(50%);
}
.btn-login {
width: 90%;
border-radius: 100px;
margin: 15px 0;
background-color: #aba9d0;
}
.tips-text {
font-size: 12px;
color: gray;
}
}
</style>
Loading…
Cancel
Save