提交 fc14212f authored 作者: lidongxu's avatar lidongxu

登录界面判断手机号是否登录注册过

上级 b234f130
import request from '@/utils/request' import request from '@/utils/request'
// 提交用户注册信息 // 促销员登录
export function submitUserInfo(data) { export function loginAPI(data) {
return request({
'url': '/user/wechat/query/temporary/login/phone_openid',
'method': 'post',
'data': data
})
}
// 促销员注册
export function submitUserInfoAPI(data) {
return request({ return request({
'url': '/user/wechat/core/temporary/enroll', 'url': '/user/wechat/core/temporary/enroll',
'method': 'post', 'method': 'post',
......
const qlIP = 'http://192.168.131.48:8011' import config from '@/config'
const apiUrl = `${qlIP}/user/aliyun/signature` // 后台获取阿里云 OSS 权限信息接口 const apiUrl = `${config.baseUrl}/user/aliyun/signature` // 后台获取阿里云 OSS 权限信息接口
const ossBaseURL = `https://link-promotion-dev.oss-cn-shanghai.aliyuncs.com/` const ossBaseURL = config.ossWebUrl // 阿里云 OSS 域名
// 上传文件 // 上传文件
export function uploadFile(fileName, filePath) { export function uploadFile(fileName, filePath) {
// 发送请求获取签名信息 // 发送请求获取签名信息
......
// 应用全局配置 // 应用全局配置
const miniProgram = wx.getAccountInfoSync()
const { envVersion } = miniProgram
module.exports = { module.exports = {
mapBaseUrl: 'https://apis.map.qq.com', // 腾讯地图 API 域名 mapBaseUrl: 'https://apis.map.qq.com', // 腾讯地图 API 域名
mapKey: 'EOGBZ-US2RW-YF5RC-OKB5O-R6BUK-2LFVS', // 腾讯地图 API key(TODO:后期换成后台的) mapKey: 'EOGBZ-US2RW-YF5RC-OKB5O-R6BUK-2LFVS', // 腾讯地图 API key(TODO:后期换成后台的)
coordtype: 'gcj02', // 坐标类型-国测局坐标(小程序使用的是这个,让百度地图也使用这个) coordtype: 'gcj02', // 坐标类型-国测局坐标(小程序使用的是这个,让百度地图也使用这个)
baseUrl: 'http://promotion.wxl66.cn:8010', // 云 API 域名(TODO: 后期要换个后台使用) baseUrl: envVersion === 'release' ? '正式地址' : 'http://192.168.100.39:8010',
ossWebUrl: envVersion === 'release' ? '正式地址' : 'https://link-promotion-dev.oss-cn-shanghai.aliyuncs.com/',
wxAppId: 'wx5d89065bb4725557', // 微信小程序 appId (TODO:后期换成后台的) wxAppId: 'wx5d89065bb4725557', // 微信小程序 appId (TODO:后期换成后台的)
wxSecret: '7395e91baf6b49ca9b84b1301989f77e', // 微信小程序 appSecret(TODO:后期换成后台的) wxSecret: '7395e91baf6b49ca9b84b1301989f77e', // 微信小程序 appSecret(TODO:后期换成后台的)
// 应用信息 // 应用信息
......
...@@ -13,7 +13,6 @@ uni.request({ ...@@ -13,7 +13,6 @@ uni.request({
url: `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.wxAppId}&secret=${config.wxSecret}`, url: `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.wxAppId}&secret=${config.wxSecret}`,
success: function (res) { success: function (res) {
setWxAccessToken(res.data.access_token) setWxAccessToken(res.data.access_token)
store.commit('SET_TOKEN', res.data.access_token)
}, },
fail: function () { fail: function () {
console.log('请求 access-token 失败'); console.log('请求 access-token 失败');
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
"await-to-js": "^3.0.0", "await-to-js": "^3.0.0",
"cos-wx-sdk-v5": "^1.7.2", "cos-wx-sdk-v5": "^1.7.2",
"qqmap-wx-jssdk": "^1.0.0", "qqmap-wx-jssdk": "^1.0.0",
"uuid": "^11.0.5" "uuid": "^11.0.5",
"webpack": "^5.97.1"
} }
} }
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
import { getWxAccessToken } from '@/utils/auth'; import { getWxAccessToken } from '@/utils/auth';
import storage from '../utils/storage' import storage from '../utils/storage'
import constant from '../utils/constant'; import constant from '../utils/constant';
import { loginAPI } from '@/api'
export default { export default {
data() { data() {
...@@ -51,7 +52,7 @@ export default { ...@@ -51,7 +52,7 @@ export default {
async getPhoneNumber(e) { async getPhoneNumber(e) {
this.$modal.loading("登录中,请耐心等待...") this.$modal.loading("登录中,请耐心等待...")
// 通过微信小程序 API 获取手机号 // 通过微信小程序 API 获取手机号
const [,phoneRes] = await uni.request({ const [, phoneRes] = await uni.request({
url: `https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=${getWxAccessToken()}`, url: `https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=${getWxAccessToken()}`,
method: 'POST', method: 'POST',
data: { data: {
...@@ -60,27 +61,40 @@ export default { ...@@ -60,27 +61,40 @@ export default {
}) })
// 调用微信登录接口,获取 code // 调用微信登录接口,获取 code
const [,loginRes] = await uni.login({ const [, loginRes] = await uni.login({
provider: 'weixin' provider: 'weixin'
}) })
// 通过 code 获取 openid // 通过 code 获取 openid
const [,openRes] = await uni.request({ const [, openRes] = await uni.request({
url: `https://api.weixin.qq.com/sns/jscode2session?appid=${this.globalConfig.wxAppId}&secret=${this.globalConfig.wxSecret}&js_code=${loginRes.code}&grant_type=authorization_code` url: `https://api.weixin.qq.com/sns/jscode2session?appid=${this.globalConfig.wxAppId}&secret=${this.globalConfig.wxSecret}&js_code=${loginRes.code}&grant_type=authorization_code`
}); });
// 获取用户信息-头像等 // 获取用户信息-头像等
const [,userRes] = await uni.getUserInfo({ const [, userRes] = await uni.getUserInfo({
provider: 'weixin', provider: 'weixin',
withCredentials: false withCredentials: false
}) })
// 调用后台接口,判断手机号是否注册过
// 注册过跳转到首页打卡
try {
await loginAPI({
phone: phoneRes.data.phone_info.phoneNumber,
openId: openRes.data.openid
})
} catch (err) {
// 未注册过跳转到注册信息页面
if (err === 3004) {
storage.set(constant.loginPhone, phoneRes.data.phone_info.phoneNumber) storage.set(constant.loginPhone, phoneRes.data.phone_info.phoneNumber)
storage.set(constant.loginOpenId, openRes.data.openid) storage.set(constant.loginOpenId, openRes.data.openid)
this.$store.commit('SET_USER', userRes.userInfo) this.$store.commit('SET_USER', userRes.userInfo)
this.$modal.closeLoading() this.$modal.closeLoading()
setTimeout(() => {
this.$tab.reLaunch('/pages/register') this.$tab.reLaunch('/pages/register')
}, 1500)
}
}
}, },
fail: function () { fail: function () {
console.log('后端解密手机号失败'); console.log('后端解密手机号失败');
......
...@@ -32,33 +32,34 @@ ...@@ -32,33 +32,34 @@
return-type="object" return-type="object"
title="正面图片" title="正面图片"
v-model="formData.idenFrontPhotoUrl" v-model="formData.idenFrontPhotoUrl"
@select="selectIdenPhotoFn"></uni-file-picker> @select="selectIdenPhotoFrontFn"></uni-file-picker>
<uni-file-picker fileMediatype="image" <uni-file-picker fileMediatype="image"
mode="grid" mode="grid"
limit="1" limit="1"
return-type="object" return-type="object"
title="反面图片" title="反面图片"
v-model="formData.idenReversePhotoUrl" v-model="formData.idenReversePhotoUrl"
@select="selectIdenPhotoFn"></uni-file-picker> @select="selectIdenPhotoBackFn"></uni-file-picker>
</view> </view>
</uni-forms-item> </uni-forms-item>
<button class="bg-blue" <button class="bg-blue register-btn"
@click="submit('valiForm')">提交信息</button> @click="submit('valiForm')">注册完成</button>
</uni-forms> </uni-forms>
</view> </view>
</template> </template>
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { uploadFile } from '../api' import { uploadFile, submitUserInfoAPI, loginAPI } from '../api'
import storage from '../utils/storage' import storage from '../utils/storage'
import constant from '../utils/constant' import constant from '../utils/constant'
export default { export default {
created() { created() {
this.phone = storage.get(constant.loginPhone) this.phone = storage.get(constant.loginPhone)
this.openId = storage.get(constant.loginOpenId)
// this.formData.avatarUrl = this.user.avatarUrl // this.formData.avatarUrl = this.user.avatarUrl
this.formData.name = this.user.nickName // this.formData.name = this.user.nickName
}, },
data() { data() {
return { return {
...@@ -67,8 +68,10 @@ export default { ...@@ -67,8 +68,10 @@ export default {
formData: { formData: {
avatarUrl: undefined, avatarUrl: undefined,
name: '', name: '',
idenFrontPhotoUrl: [], idenFrontPhotoUrl: undefined, // 组件展示地址
idenReversePhotoUrl: [], idenReversePhotoUrl: undefined,
idenFrontUrl: '', // 后台需要的 OSS 上身份证图片地址
idenBackUrl: '' // 后台需要的 OSS 上身份证图片地址
}, },
// 校验规则 // 校验规则
rules: { rules: {
...@@ -93,28 +96,33 @@ export default { ...@@ -93,28 +96,33 @@ export default {
methods: { methods: {
// 选择了头像 // 选择了头像
async chooseavatarFn(obj) { async chooseavatarFn(obj) {
console.log(this.phone) this.formData.avatarUrl = await uploadFile(`avatarAndIdentify/${this.phone}/${this.phone}-avatar.png`, obj.detail.avatarUrl)
const avatarUrl = await uploadFile(`avatar/${this.phone}.png`, obj.detail.avatarUrl)
this.formData.avatarUrl = avatarUrl
}, },
// 选择了身份证 // 选择了身份证
selectIdenPhotoFn(obj) { async selectIdenPhotoFrontFn(obj) {
// console.log(obj.tempFiles[0]) // TODO:文件对象-需要自己上传 OSS this.formData.idenFrontUrl = await uploadFile(`avatarAndIdentify/${this.phone}/${this.phone}-frontId.png`, obj.tempFiles[0].path)
this.uploadFileToOSS(obj.tempFiles[0].path) },
async selectIdenPhotoBackFn(obj){
this.formData.idenBackUrl = await uploadFile(`avatarAndIdentify/${this.phone}/${this.phone}-backId.png`, obj.tempFiles[0].path)
}, },
submit(ref) { submit(ref) {
this.$refs[ref].validate().then(async res => { this.$refs[ref].validate().then(async res => {
console.log('success', res);
// TODO: 后面需要后台提供促销员信息注册接口 // TODO: 后面需要后台提供促销员信息注册接口
// const result = await submitUserInfo({ const result = await submitUserInfoAPI({
// avatarUrl: this.formData.avatarUrl, avatarUrl: this.formData.avatarUrl,
// openId: storage.get(constant.loginOpenId), openId: storage.get(constant.loginOpenId),
// name: this.formData.name, name: this.formData.name,
// idenFrontPhotoUrl: this.formData.idenFrontPhotoUrl[0]?.url, idenFrontPhotoUrl: this.formData.idenFrontUrl,
// idenReversePhotoUrl: this.formData.idenReversePhotoUrl[0]?.url, idenReversePhotoUrl: this.formData.idenBackUrl,
// phone: storage.get(constant.loginPhone) phone: this.phone,
// }) phoneCode: '111111' // 先随便写一个
// console.log(result) })
// 单独调用登录拿到 token
const { data } = await loginAPI({
phone: this.phone,
openId: this.openId
})
this.$store.commit('SET_TOKEN', data.token)
uni.showToast({ uni.showToast({
title: `注册成功` title: `注册成功`
...@@ -124,11 +132,7 @@ export default { ...@@ -124,11 +132,7 @@ export default {
}).catch(err => { }).catch(err => {
console.log('err', err); console.log('err', err);
}) })
}, }
//上传文件方法
uploadFileToOSS(filePath, callback) {
},
} }
} }
</script> </script>
...@@ -188,70 +192,8 @@ page { ...@@ -188,70 +192,8 @@ page {
} }
} }
.logo-content { .register-btn{
width: 100%; border-radius: 50rpx;
font-size: 21px;
text-align: center;
padding-top: 15%;
image {
border-radius: 4px;
}
.title {
margin-left: 10px;
}
}
.login-form-content {
text-align: center;
margin: 20px auto;
margin-top: 15%;
width: 80%;
.input-item {
margin: 20px auto;
background-color: #f5f6f7;
height: 45px;
border-radius: 20px;
.icon {
font-size: 38rpx;
margin-left: 10px;
color: #999;
}
.input {
width: 100%;
font-size: 14px;
line-height: 20px;
text-align: left;
padding-left: 15px;
}
}
.register-btn {
margin-top: 40px;
height: 45px;
}
.xieyi {
color: #333;
margin-top: 20px;
}
.login-code {
height: 38px;
float: right;
.login-code-img {
height: 38px;
position: absolute;
margin-left: 10px;
width: 200rpx;
}
}
} }
} }
</style> </style>
import storage from './utils/storage' import storage from './utils/storage'
import constant from './utils/constant' import constant from './utils/constant'
import { getToken } from '@/utils/auth'
// 登录页面 // 登录页面
const loginPage = "/pages/login" const loginPage = "/pages/login"
...@@ -22,7 +23,7 @@ list.forEach(item => { ...@@ -22,7 +23,7 @@ list.forEach(item => {
uni.addInterceptor(item, { uni.addInterceptor(item, {
invoke(to) { invoke(to) {
// 之前是否已经登录过TODO:应该是提交完注册信息后才会有token // 之前是否已经登录过TODO:应该是提交完注册信息后才会有token
if (storage.get(constant.loginPhone)) { if (getToken()) {
// 如果已经登录了,还想去登录页面直接跳转到首页 // 如果已经登录了,还想去登录页面直接跳转到首页
if (to.url === loginPage) { if (to.url === loginPage) {
uni.reLaunch({ url: "/pages/index" }) uni.reLaunch({ url: "/pages/index" })
......
...@@ -6,6 +6,17 @@ ...@@ -6,6 +6,17 @@
"ignore": [], "ignore": [],
"include": [] "include": []
}, },
"env": {
"NODE_ENV": "development",
"development": {
"baseUrl": "http://192.168.100.39:8010",
"ossBucketWebUrl": "https://link-promotion-dev.oss-cn-shanghai.aliyuncs.com/"
},
"production": {
"baseUrl": "",
"ossBucketWebUrl": ""
}
},
"setting": { "setting": {
"coverView": true, "coverView": true,
"es6": true, "es6": true,
......
...@@ -2,13 +2,13 @@ import config from '@/config' ...@@ -2,13 +2,13 @@ import config from '@/config'
import storage from '@/utils/storage' import storage from '@/utils/storage'
import constant from '@/utils/constant' import constant from '@/utils/constant'
import { login, logout, getInfo } from '@/api' import { login, logout, getInfo } from '@/api'
import { getWxAccessToken, setWxAccessToken, removeWxAccessToken } from '@/utils/auth' import { getToken, setToken, removeToken } from '@/utils/auth'
const baseUrl = config.baseUrl const baseUrl = config.baseUrl
const user = { const user = {
state: { state: {
token: getWxAccessToken(), token: getToken(),
name: storage.get(constant.name), name: storage.get(constant.name),
avatar: storage.get(constant.avatar), avatar: storage.get(constant.avatar),
roles: storage.get(constant.roles), roles: storage.get(constant.roles),
...@@ -19,6 +19,7 @@ const user = { ...@@ -19,6 +19,7 @@ const user = {
mutations: { mutations: {
SET_TOKEN: (state, token) => { SET_TOKEN: (state, token) => {
state.token = token state.token = token
setToken(token)
}, },
SET_NAME: (state, name) => { SET_NAME: (state, name) => {
state.name = name state.name = name
...@@ -43,7 +44,7 @@ const user = { ...@@ -43,7 +44,7 @@ const user = {
}, },
actions: { actions: {
// 登录 // 登录(用不上)
Login({ commit }, userInfo) { Login({ commit }, userInfo) {
const username = userInfo.username.trim() const username = userInfo.username.trim()
const password = userInfo.password const password = userInfo.password
......
...@@ -11,3 +11,15 @@ export function setWxAccessToken(token) { ...@@ -11,3 +11,15 @@ export function setWxAccessToken(token) {
export function removeWxAccessToken() { export function removeWxAccessToken() {
return uni.removeStorageSync(WxAccessTokenKey) return uni.removeStorageSync(WxAccessTokenKey)
} }
// 业务 token
const TokenKey = 'Token'
export function getToken() {
return uni.getStorageSync(TokenKey)
}
export function setToken(token) {
return uni.setStorageSync(TokenKey, token)
}
export function removeToken() {
return uni.removeStorageSync(TokenKey)
}
\ No newline at end of file
import store from '@/store' import store from '@/store'
import config from '@/config' import config from '@/config'
// import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode' import errorCode from '@/utils/errorCode'
import { toast, showConfirm, tansParams } from '@/utils/common' import { toast, showConfirm, tansParams } from '@/utils/common'
...@@ -11,9 +11,9 @@ const request = config => { ...@@ -11,9 +11,9 @@ const request = config => {
// 是否需要设置 token // 是否需要设置 token
const isToken = (config.headers || {}).isToken === false const isToken = (config.headers || {}).isToken === false
config.header = config.header || {} config.header = config.header || {}
// if (getToken() && !isToken) { if (getToken() && !isToken) {
// config.header['Authorization'] = 'Bearer ' + getToken() config.header['Authorization'] = 'Bearer ' + getToken()
// } }
// get请求映射params参数 // get请求映射params参数
if (config.params) { if (config.params) {
let url = config.url + '?' + tansParams(config.params) let url = config.url + '?' + tansParams(config.params)
...@@ -50,7 +50,7 @@ const request = config => { ...@@ -50,7 +50,7 @@ const request = config => {
toast(msg) toast(msg)
reject('500') reject('500')
} else if (code !== 200) { } else if (code !== 200) {
toast(msg) // toast(msg)
reject(code) reject(code)
} }
resolve(res.data) resolve(res.data)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论