Commit 4d9430fb authored by June's avatar June

feature: login

parent 5fbbf2c4
<script> <script>
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import { checkLoginStatus } from '@/apis/user.js' // import { wxLogin } from '@/apis/user.js'
import { login_wx } from '@/utils/modules/login.js' import { login_wx } from '@/utils/modules/login.js'
export default { export default {
onLaunch: async function() { onLaunch: function() {
this.setSystemInfo() // 获取系统信息 this.setSystemInfo() // 获取系统信息
this.setLocation() // 获取经纬度 this.setLocation() // 获取经纬度
this.setMenuButtonInfo() // 获取胶囊信息 this.setMenuButtonInfo() // 获取胶囊信息
this.checkUpdate() // 检查更新 this.checkUpdate() // 检查更新
// await login_wx()
checkLoginStatus() // 检查登录状态 // wx.login
.then(res => { login_wx(async () => {
console.log(res) const token = await this.$getStorage('token')
if(res.status) { if(!token) {
this.setLoginStatus(true) uni.navigateTo({
this.setCount() url: '/pages/login/index'
})
} else { } else {
this.setLoginStatus(false) this.setToken(token)
} }
}) })
.catch(err => console.log(err))
}, },
methods: { methods: {
...mapActions('systemInfo', ['setSystemInfo', 'setMenuButtonInfo']), ...mapActions('systemInfo', ['setSystemInfo', 'setMenuButtonInfo']),
...mapActions('user', ['setLocation', 'setLoginStatus']), ...mapActions('user', ['setLocation', 'setToken', 'setLoginStatus']),
...mapActions('cart', ['setCount']), ...mapActions('cart', ['setCount']),
// 检查更新 // 检查更新
checkUpdate() { checkUpdate() {
......
// 用户相关 // 用户相关
import { request } from "@/lib/service" import { request } from "@/lib/service"
import { baseUrl } from '@/config' // 将请求的baseUrl写这里,为了开发时调试请求地址 import md5 from 'md5'
const RSA = require('@/utils/wx_rsa.js')
import { publicKey } from '@/config/index.js'
/** /**
* @desc 检查登录态 * @desc 检查登录态
*/ */
export function checkLoginStatus() { export function checkLoginStatus() {
return request({ return request({
url: `${baseUrl}/wxxcx/isLogin.htm`, url: `zsxcx/isLogin.htm`,
method: 'post', method: 'post',
needMask: true needMask: true
}) })
...@@ -20,54 +18,37 @@ export function checkLoginStatus() { ...@@ -20,54 +18,37 @@ export function checkLoginStatus() {
*/ */
export function checkLoginTime() { export function checkLoginTime() {
return request({ return request({
url: `${baseUrl}/wxxcx/getFwqTime.htm`, url: `zsxcx/getFwqTime.htm`,
method: 'post' method: 'post'
}) })
} }
/** /**
* @desc 微信登录 wx.login 获取openid unionid等信息 * @desc wx.login 获取openid unionid等信息
* @param { String } code * @param { String } code
*/ */
export function wxLogin(code) { export function wxLogin(code) {
return request({ return request({
url: `${baseUrl}/wxxcx/getInfo.htm`, url: `zsxcx/getInfo.htm`,
data: { data: {
js_code: code js_code: code
} }
}) })
} }
/**
* @desc 静默登录
* @param { Number } userPhone
* @param { String } time
*/
export function slelentLogin(userPhone, time) {
const encrypt_rsa = RSA.KEYUTIL.getKey(publicKey)
return request({
url: `${baseUrl}/wxxcx/silentLogin.htm`,
method: 'post',
data: {
un: RSA.hex2b64(encrypt_rsa.encrypt(userPhone)),
tm: RSA.hex2b64(encrypt_rsa.encrypt(time))
}
})
}
/** /**
* @desc 退出登录 * @desc 退出登录
*/ */
export function logout() { export function logout() {
return request({ return request({
url: `${baseUrl}/wxxcx/loginOut.htm`, url: `zsxcx/loginOut.htm`,
method: 'post', method: 'post',
needMask: true needMask: true
}) })
} }
/** /**
* @desc 注册 * @desc 登录
* @param {Object} params * @param {Object} params
* *
* lgtype 必填 登录方式:1微信登录 2短信验证码登录 3账号密码登录 * lgtype 必填 登录方式:1微信登录 2短信验证码登录 3账号密码登录
...@@ -78,22 +59,53 @@ export function logout() { ...@@ -78,22 +59,53 @@ export function logout() {
* iv 加密算法的初始向量(lgtype=1时必填) * iv 加密算法的初始向量(lgtype=1时必填)
* session_key 会话密钥(lgtype=1时必填) * session_key 会话密钥(lgtype=1时必填)
*/ */
export function register(params) { export function login(params) {
return request({ return request({
url: `${baseUrl}/wxxcx/login.htm`, url: `zsxcx/login.htm`,
method: 'post', method: 'post',
data: params data: params
}) })
} }
/**
* @desc 忘记密码
* @param { string } f_code 输入验证码
* @param { string } upwd 新密码
* @param { string } upwd2 新密码二次输入
*/
export function forgetPwd(params) {
return request({
url: `zsxcx/forgetPwd.htm`,
method: 'post',
data: params
})
}
/**
* @desc 发送登录验证码接口
* @param { String } phone
*/
export function loginSms(phone) {
return request({
url: `zsxcx/send_lgmessage.htm`,
method: 'post',
data: {
phone,
sign: md5('glsms' + phone)
}
})
}
/** /**
* @desc 获取手机验证码 * @desc 发送忘记密码验证码接口
*/ */
export function smsCode() { export function forgetSms(phone) {
return request({ return request({
url:`${baseUrl}/a` url: `zsxcx/send_fgmessage.htm`,
method: 'post',
data: {
phone,
sign: md5('glsms' + phone)
}
}) })
} }
\ No newline at end of file
...@@ -13,5 +13,3 @@ export const baseUrl = env[__wxConfig.envVersion] ...@@ -13,5 +13,3 @@ export const baseUrl = env[__wxConfig.envVersion]
// 商品图片的域名地址 // 商品图片的域名地址
export const imgUrl = process.env.NODE_ENV === 'development' ? 'https://d.gelifood.com/' : 'https://www.gelifood.com/' export const imgUrl = process.env.NODE_ENV === 'development' ? 'https://d.gelifood.com/' : 'https://www.gelifood.com/'
export const publicKey = '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp3Rit6cNlpOa9dbTx2ddt6ZblmMO04zdY+UIHMvsAnjBHYxEYfm7hx1yNkf1ohZNg47K+Ox/z8WcTRYpGnSka5UHDUTeBEQp4BGD25PsJLkc5YUk0PXjqRq5m+vuB3mEn7r6DaTwCxX5n2G4ky77xhzmZbG7MDP85RQHBVsvqYwIDAQAB-----END PUBLIC KEY-----'
\ No newline at end of file
import { baseUrl } from '@/config'
import Toast from "../toast/index.js" import Toast from "../toast/index.js"
import { isObeject, isFunction } from "@/utils/types.js" import { isObeject, isFunction } from "@/utils/types.js"
import Validator from "@/utils/validate.js" import Validator from "@/utils/validate.js"
...@@ -16,7 +17,7 @@ import store from '@/store/index.js' ...@@ -16,7 +17,7 @@ import store from '@/store/index.js'
function validateOps(options = {}) { function validateOps(options = {}) {
const validator = new Validator() const validator = new Validator()
validator.add(Object.keys(options), [{strategy: 'minLength:1', errorMsg: '参数格式不正确'}]) validator.add(Object.keys(options), [{strategy: 'minLength:1', errorMsg: '参数格式不正确'}])
validator.add(options.url, [{strategy: 'notEmpty', errorMsg: '请求地址不能为空'}, {strategy: 'isHttp', errorMsg: '请求地址不正确'}]) validator.add(options.url, [{strategy: 'notEmpty', errorMsg: '请求地址不能为空'}])
return validator.validate() return validator.validate()
} }
...@@ -25,19 +26,21 @@ export function request (options) { ...@@ -25,19 +26,21 @@ export function request (options) {
const valite_err = validateOps(options) const valite_err = validateOps(options)
if(valite_err) return Toast({title: valite_err}) if(valite_err) return Toast({title: valite_err})
options.method = options.method ? options.method.toUpperCase() : "GET" // 默认get options.method = options.method ? options.method.toUpperCase() : "GET" // 默认get
options.needMask && uni.showLoading({title: '加载中...', mask: true}) options.url = `${baseUrl}/${options.url}`
if(options.needMask) {
uni.showLoading({title: '加载中...', mask: true})
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const token = store.state.user.token
uni.request({ uni.request({
...options, ...options,
header: { header: {
'content-type': 'application/x-www-form-urlencoded', 'content-type': 'application/x-www-form-urlencoded',
'cookie': store.state.user.cookieKey 'token': token
}, },
success: async res => { success: async res => {
try{ try{
const statusCode = res.statusCode switch(res.statusCode) {
// console.log(statusCode)
switch(statusCode) {
case 200: case 200:
options.successCb && typeof options.successCb === 'function' && options.successCb() options.successCb && typeof options.successCb === 'function' && options.successCb()
// 处理某些接口返回String类型的数据 // 处理某些接口返回String类型的数据
...@@ -47,39 +50,29 @@ export function request (options) { ...@@ -47,39 +50,29 @@ export function request (options) {
case 10: case 10:
resolve({ resolve({
status: true, status: true,
data: res.data.list || res.data.data, data: data.data,
res: res.data,
msg: data.rep_msg msg: data.rep_msg
}) })
break; break;
case -1: case -1:
Toast({title: data.rep_msg})
resolve({ resolve({
status: true, status: false,
data: res.data.list || res.data.data, data: data.data,
res: res.data,
msg: data.rep_msg msg: data.rep_msg
}) })
break; break;
case -3: case -3:
const loginRes = await login_slilen() Toast({title: '登录已失效,请重新登录', cb: () => uni.navigateTo({
console.log('刷新登录 重新执行上一次请求=======') url: '/pages/login/index'
if(loginRes) { // 重新执行上一次的操作 })})
const againRes = await request(options)
resolve({
status: true,
data: againRes.list || againRes.data,
res: againRes.res,
msg: againRes.msg
})
}
break; break;
default: default:
Toast({title: data.rep_msg}) Toast({title: data.rep_msg})
resolve({ resolve({
status: false, status: false,
code: status, // 正常不返回为了好找 后端调试 -1 => 业务错误(一般失败情况返回此项);-2 => 系统异常; -3 => 请先登录; -4 => 请求失败; -10 => 签名失败 code: status, // 正常不返回为了好找 后端调试 -1 => 业务错误(一般失败情况返回此项);-2 => 系统异常; -3 => 请先登录; -4 => 请求失败; -10 => 签名失败
data: data.list, data: data.data,
res: res.data.list || res.data.data,
msg: data.rep_msg msg: data.rep_msg
}) })
break; break;
......
/** /**
* getStorage * getStorage
* @desc 获取存储的本地数据 * @desc 获取存储的本地数据
* @param { keyName } * @param { String } key
* @return { storageVal } * @return { storageVal }
*/ */
export function getStorage(key){ export function getStorage(key){
...@@ -9,6 +9,22 @@ export function getStorage(key){ ...@@ -9,6 +9,22 @@ export function getStorage(key){
return val ? JSON.parse(val) : '' return val ? JSON.parse(val) : ''
} }
/**
* getStorage 异步 用处不大
* @param { String } key
* @param { function } cb
* @return no
*/
// export function getStorageAsync(key, cb) {
// uni.getStorage({
// key,
// success: res => {
// cb && typeOf cb === 'function' && cb()
// console.log(res.data)
// }
// })
// }
/** /**
* setStorage * setStorage
* @desc 设置本地存储数据(同步) * @desc 设置本地存储数据(同步)
......
...@@ -10,6 +10,8 @@ import uniPopup from '@/components/uni-popup/index.vue' ...@@ -10,6 +10,8 @@ import uniPopup from '@/components/uni-popup/index.vue'
Vue.component('empty-view', emptyView) Vue.component('empty-view', emptyView)
Vue.component('uni-popup', uniPopup) Vue.component('uni-popup', uniPopup)
Vue.prototype.$store = store
Vue.config.productionTip = false Vue.config.productionTip = false
App.mpType = 'app' App.mpType = 'app'
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
"quickapp" : {}, "quickapp" : {},
/* 小程序特有相关 */ /* 小程序特有相关 */
"mp-weixin" : { "mp-weixin" : {
"appid" : "wxd170058f4ad8fecd", "appid" : "wxe4c065e2234c470b",
"setting" : { "setting" : {
"urlCheck" : false, "urlCheck" : false,
"es6" : true, "es6" : true,
......
...@@ -65,6 +65,12 @@ ...@@ -65,6 +65,12 @@
"subPackages": [{ "subPackages": [{
"root": "subPages", "root": "subPages",
"pages": [ "pages": [
{
"path": "resetPwd/index",
"style": {
"navigationBarTitleText": "重置密码"
}
},
{ {
"path": "userManage/index", "path": "userManage/index",
"style": { "style": {
......
...@@ -67,14 +67,11 @@ ...@@ -67,14 +67,11 @@
import searchBar from '@/components/search-bar/index.vue' import searchBar from '@/components/search-bar/index.vue'
import goodsModule from './components/goods-module.vue' import goodsModule from './components/goods-module.vue'
import goodsPopup from '@/components/goods-popup/index.vue' import goodsPopup from '@/components/goods-popup/index.vue'
import { mapState, mapActions } from 'vuex'
import cityPicker from '@/components/city-picker/index.vue' import cityPicker from '@/components/city-picker/index.vue'
import { mapState, mapActions } from 'vuex'
import { checkLogin } from '@/utils/common.js' import { checkLogin } from '@/utils/common.js'
import { logout } from '@/apis/user.js'
export default { export default {
data() { data() {
return { return {
...@@ -112,9 +109,9 @@ export default { ...@@ -112,9 +109,9 @@ export default {
methods: { methods: {
...mapActions('cart', ['setCount']), ...mapActions('cart', ['setCount']),
...mapActions('user', ['logout']),
handleLogout() { handleLogout() {
logout() this.logout()
.then(res => console.log(res))
}, },
handleCart() { handleCart() {
......
import Validator from "@/utils/validate.js" import Validator from "@/utils/validate.js"
import { register } from '@/apis/user.js'
function phoneValidate() {
const phoneValidator = new Validator()
const form = this.form
phoneValidator.add(form.user, [{strategy: 'notEmpty', errorMsg: '手机号码不能为空'}, {strategy: 'isMobile', errorMsg: '手机号码格式不正确'}])
return phoneValidator.validate()
}
function smsValidate() { function smsValidate() {
const smsValidator = new Validator() const smsValidator = new Validator()
const form = this.form const form = this.form
smsValidator.add(form.phone, [{strategy: 'notEmpty', errorMsg: '手机号码不能为空'}, {strategy: 'isMobile', errorMsg: '手机号码格式不正确'}]) smsValidator.add(form.user, [{strategy: 'notEmpty', errorMsg: '手机号码不能为空'}, {strategy: 'isMobile', errorMsg: '手机号码格式不正确'}])
smsValidator.add(form.smsCode, [{strategy: 'notEmpty', errorMsg: '验证码不能为空'}]) smsValidator.add(form.yzm, [{strategy: 'notEmpty', errorMsg: '验证码不能为空'}])
return smsValidator.validate() return smsValidator.validate()
} }
function accoutValidate() { function accoutValidate() {
const smsValidator = new Validator() const smsValidator = new Validator()
const form = this.form const form = this.form
smsValidator.add(form.phone, [{strategy: 'notEmpty', errorMsg: '手机号码不能为空'}, {strategy: 'isMobile', errorMsg: '手机号码格式不正确'}]) // 用户名不检验手机号码
smsValidator.add(form.password, [{strategy: 'notEmpty', errorMsg: '密码不能为空'}]) if(form.lgtype === 2) {
smsValidator.add(form.user, [{strategy: 'notEmpty', errorMsg: '手机号码不能为空'}, {strategy: 'isMobile', errorMsg: '手机号码格式不正确'}])
} else if(form.lgtype === 3) {
smsValidator.add(form.user, [{strategy: 'notEmpty', errorMsg: '用户名不能为空'}])
}
smsValidator.add(form.pwd, [{strategy: 'notEmpty', errorMsg: '密码不能为空'}])
return smsValidator.validate() return smsValidator.validate()
} }
async function registerCommon(params) { async function loginCommon(params) {
try{ params.openid = this.openid
const res = await register(params) this.login(params)
console.log(res)
}catch(e){
this.$toast({title: e.msg || '程序错误'})
}
} }
export default { export default {
smsValidate, smsValidate,
accoutValidate, accoutValidate,
registerCommon phoneValidate,
loginCommon
} }
\ No newline at end of file
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
<view> <view>
<view> <view>
<input <input
type="text" :type="form.lgtype === 3 ? 'text' : 'number'"
placeholder="请输入手机号码" :placeholder="userPlachelder"
data-type="phone" v-model="form.user"
@input="inputForm"
/> />
</view> </view>
...@@ -13,78 +12,82 @@ ...@@ -13,78 +12,82 @@
<input <input
type="text" type="text"
placeholder="请输入验证码" placeholder="请输入验证码"
data-type="smsCode" v-model="form.yzm"
@input="inputForm"
/> />
<view>SMS</view> <button @click="handleSms">{{smsMsg}}</button>
</view> </view>
<view v-show="form.lgtype === 3"> <view v-show="form.lgtype === 3">
<input <input
type="password" type="password"
placeholder="请输入密码" placeholder="请输入密码"
data-type="password" v-model="form.pwd"
@input="inputForm"
/> />
</view> </view>
<view> <view>
<button type="default" @click="handleLogin(2)">短信验证码注册登录</button> <button :class="form.lgtype === 2 ? 'btn_active' : null" type="default" @click="handleLogin(2)">短信验证码注册登录</button>
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信快捷登录</button> <button :class="form.lgtype === 1 ? 'btn_active' : null" open-type="getPhoneNumber" @click="handleLogin(1)" @getphonenumber="getPhoneNumber">微信快捷登录</button>
<button type="default" @click="handleLogin(3)">密码登录</button> <button :class="form.lgtype === 3 ? 'btn_active' : null" type="default" @click="handleLogin(3)">密码登录</button>
</view> </view>
<button type="default" @click="handleForget">忘记密码</button>
</view> </view>
</template> </template>
<script> <script>
import loginCommon from './common.js' import common from './common.js'
import { timerFn } from '@/utils/common.js' import { timerFn } from '@/utils/common.js'
import { mapState } from 'vuex' import { loginSms } from '@/apis/user.js'
import { mapState, mapActions } from 'vuex'
const userPlachelderStr = {
1: '',
2: '请输入手机号码',
3: '请输入用户名'
}
export default { export default {
data() { data() {
return { return {
login_type: "smsLogin", // smsLogin wxLogin accoutLogin smsDisabled: false, // sms按钮是否禁用
smsMsg: '获取验证码',
form: { form: {
lgtype: 2, // 1微信登录 2短信验证码登录 3账号密码登录 lgtype: 2, // 1微信登录 2短信验证码登录 3账号密码登录
phone: null, user: '',
smsCode: null, yzm: '',
password: null pwd: ''
} }
} }
}, },
computed: { computed: {
...mapState({ ...mapState({
session_key: state => state.user.session_key session_key: state => state.user.session_key,
}) openid: state => state.user.openid
}),
userPlachelder() {
return userPlachelderStr[this.form.lgtype]
}
}, },
// components: {
// uniPopup
// },
methods: { methods: {
...loginCommon, ...common,
...mapActions('user', ['login']),
inputForm(e) {
const { type } = e.currentTarget.dataset
this.form[type] = e.detail.value
},
handleLogin(type) { async handleLogin(type) {
if(type !== this.form.lgtype) return this.$set(this.form, 'lgtype', type) if(type !== this.form.lgtype) {
this.$set(this.form, 'lgtype', type)
}
switch (type) { switch (type) {
case 'smsLogin': case 2:
const smsValidaErr = this.smsValidate() const smsValidaErr = this.smsValidate()
if(smsValidaErr) return this.$toast({title: smsValidaErr}) if(smsValidaErr) return this.$toast({title: smsValidaErr})
console.log('login api') this.loginCommon(this.form)
uni.navigateBack()
break; break;
case 'accoutLogin': case 3:
const accoutValidaErr = this.accoutValidate() const accoutValidaErr = this.accoutValidate()
if(accoutValidaErr) return this.$toast({title: accoutValidaErr}) if(accoutValidaErr) return this.$toast({title: accoutValidaErr})
console.log('login api') this.loginCommon(this.form)
uni.navigateBack()
break; break;
default: default:
break; break;
...@@ -95,8 +98,7 @@ export default { ...@@ -95,8 +98,7 @@ export default {
getPhoneNumber (e) { getPhoneNumber (e) {
if(e.detail.errMsg === 'getPhoneNumber:fail user deny') return if(e.detail.errMsg === 'getPhoneNumber:fail user deny') return
const { iv, encryptedData } = e.detail const { iv, encryptedData } = e.detail
console.log(iv, encryptedData) this.loginCommon({
this.registerCommon({
lgtype: 1, lgtype: 1,
encryptedData, encryptedData,
iv, iv,
...@@ -104,18 +106,42 @@ export default { ...@@ -104,18 +106,42 @@ export default {
}) })
}, },
// 获取验证码
async handleSms() {
try{
if(this.smsDisabled) return console.log('验证码倒计时中')
const valiErr = this.phoneValidate()
if(valiErr) return this.$toast({title: valiErr})
const res = await loginSms(this.form.user)
timerFn(60, num => {
if(num <= 0) {
this.smsDisabled = false
this.smsMsg = '重新获取'
} else {
this.smsDisabled = true
this.smsMsg = `${num}S重试`
}
})
// console.log(res)
}catch(e){
console.log(e)
this.$toast({title: e.msg || '程序错误'})
}
},
// testTime() { handleForget() {
// timerFn(10, num => { uni.navigateTo({
// this.str = num url: `/subPages/resetPwd/index`
// }) })
// }, }
} }
} }
</script> </script>
<style scoped> <style scoped>
.btn_active {
background-color: yellow;
}
.test { .test {
position: fixed; position: fixed;
right: 20rpx; right: 20rpx;
......
...@@ -12,18 +12,19 @@ const mutations = { ...@@ -12,18 +12,19 @@ const mutations = {
const actions = { const actions = {
setCount: async ({ commit }) => { setCount: async ({ commit }) => {
const res = await cartCount() const { status, data } = await cartCount()
console.log(status, data)
const count = res.res.count const count = res.res.count
console.log('vuex actions success ==========================================') console.log('vuex actions success ==========================================')
if(res.status && count > 0) { // if(res.status && count > 0) {
commit('SETCOUNT', count) // commit('SETCOUNT', count)
uni.setTabBarBadge({ // uni.setTabBarBadge({
index: 2, // index: 2,
text: count > 99 ? '99+' : JSON.stringify(count) // text: count > 99 ? '99+' : JSON.stringify(count)
}) // })
} else { // } else {
wx.removeTabBarBadge({index: 2}) // wx.removeTabBarBadge({index: 2})
} // }
} }
} }
......
import { getStorage, setStorage, removeStorage } from '@/lib/storage' import { setStorageAsync, removeStorage } from '@/lib/storage'
// import store from '@/store/index.js' // import store from '@/store/index.js'
import { login, logout } from '@/apis/user.js'
import Toast from '@/lib/toast/index.js'
const state = { const state = {
isLogin: true, token: null,
openid: null, openid: null,
unionid: null, unionid: null,
session_key: '', session_key: '',
cookieKey: 'JSESSIONID=aaaD4X0GrEplMbVRPm5Nx; path=/', userInfo: {},
location: {},
isOverdue: false, // 服务是否过期 isOverdue: false, // 服务是否过期
userInfo: null,
location: {} isLogin: true,
} }
const mutations = { const mutations = {
SETLOGINSTATUS(state, status) {
state.isLogin = status
},
SETTOKEN(state, token){ SETTOKEN(state, token){
state.token = token state.token = token
}, },
SETLOGINSTATUS(state, status) {
state.isLogin = status
},
SETUSERINFO(state, userInfo){ SETUSERINFO(state, userInfo){
state.userInfo = userInfo state.userInfo = userInfo
}, },
LOGIN(state, params) {
state.token = params.token
state.userInfo.user = params.user
},
LOGOUT(state){ LOGOUT(state){
state.token = '' state.token = ''
state.userInfo = '' state.userInfo = {}
} }
} }
const actions = { const actions = {
setLoginStatus: ({commit}, status) => {
commit('SETLOGINSTATUS', status)
},
setToken: ({commit}, token) => { setToken: ({commit}, token) => {
commit('SETTOKEN', token) commit('SETTOKEN', token)
setStorage('token',token) setStorageAsync('token',token)
},
setLoginStatus: ({commit}, status) => {
commit('SETLOGINSTATUS', status)
}, },
setLocation: async ({state}) => { setLocation: async ({state}) => {
uni.getLocation({ uni.getLocation({
...@@ -49,10 +57,29 @@ const actions = { ...@@ -49,10 +57,29 @@ const actions = {
commit('SETUSERINFO', userInfo) commit('SETUSERINFO', userInfo)
setStorage('userInfo',userInfo) setStorage('userInfo',userInfo)
}, },
logout: ({commit})=>{ login: async ({commit}, form) => {
try{
const { status, data } = await login(form)
if(status) {
setStorageAsync('token', data.token)
commit('LOGIN', data)
uni.navigateBack()
}
}catch(e){
Toast({title: e.msg || '登录失败'})
}
},
logout: async ({commit})=>{
try{
const { status, data } = await logout()
if(status) {
commit('LOGOUT') commit('LOGOUT')
removeStorage('token') removeStorage('token')
removeStorage('userInfo') }
}catch(e){
Toast({title: e.msg || '退出登录失败'})
}
} }
} }
......
import Validator from "@/utils/validate.js"
function phoneValidate() {
const phoneValidator = new Validator()
const form = this.form
phoneValidator.add(form.phone, [{strategy: 'notEmpty', errorMsg: '手机号码不能为空'}, {strategy: 'isMobile', errorMsg: '手机号码格式不正确'}])
return phoneValidator.validate()
}
function validateForm() {
const smsValidator = new Validator()
const form = this.form
smsValidator.add(form.phone, [{strategy: 'notEmpty', errorMsg: '手机号码不能为空'}, {strategy: 'isMobile', errorMsg: '手机号码格式不正确'}])
smsValidator.add(form.f_code, [{strategy: 'notEmpty', errorMsg: '验证码不能为空'}])
smsValidator.add(form.upwd, [{strategy: 'notEmpty', errorMsg: '密码不能为空'}, {strategy: 'minLength:8', errorMsg: '密码不能少于8位数字或字母'}],
smsValidator.add(form.upwd2, [{strategy: 'notEmpty', errorMsg: '确认密码不能为空'}, {strategy: `unique:${form.upwd}`, errorMsg: '两次输入的密码不一致'}]))
return smsValidator.validate()
}
export default {
phoneValidate,
validateForm
}
\ No newline at end of file
<template>
<view>
<view>
<input
type="number"
placeholder="请输入手机号码"
maxlength="11"
v-model="form.phone"
/>
</view>
<view>
<input
type="text"
placeholder="请输入验证码"
v-model="form.f_code"
/>
</view>
<view>
<input
type="text"
placeholder="请输入新密码"
v-model="form.upwd"
/>
</view>
<view>
<input
type="text"
placeholder="请再次输入密码"
v-model="form.upwd2"
/>
</view>
<button type="default" @click="handleSms">{{smsMsg}}</button>
<button type="default" @click="handleReset">重置</button>
</view>
</template>
<script>
import { mapState } from 'vuex'
import common from './common.js'
import { forgetPwd, forgetSms } from '@/apis/user.js'
import { timerFn } from '@/utils/common.js'
export default {
data() {
return {
smsMsg: '获取验证码',
smsDisabled: false,
form: {
phone: '',
f_code: '',
upwd: '',
upwd2: ''
}
}
},
methods: {
...common,
// 获取验证码
async handleSms() {
try{
if(this.smsDisabled) return console.log('验证码倒计时中')
const valiErr = this.phoneValidate()
if(valiErr) return this.$toast({title: valiErr})
const res = await forgetSms(this.form.phone)
console.log(res)
timerFn(60, num => {
if(num <= 0) {
this.smsDisabled = false
this.smsMsg = '重新获取'
} else {
this.smsDisabled = true
this.smsMsg = `${num}S重试`
}
})
// console.log(res)
}catch(e){
console.log(e)
this.$toast({title: e.msg || '程序错误'})
}
},
async handleReset() {
try{
const validateErr = this.validateForm()
console.log(validateErr)
if(validateErr) return this.$toast({title: validateErr})
const { status, msg } = await forgetPwd(this.form)
if(status) {
this.$toast({title: msg, cb: () => {uni.navigateBack()}})
}
}catch(e){
this.$toast({title: e.msg || '程序错误'})
}
}
}
}
</script>
<style>
</style>
<template>
<view>1</view>
</template>
<script>
</script>
<style>
</style>
import { checkLoginTime, slelentLogin, wxLogin } from '@/apis/user.js' import { wxLogin } from '@/apis/user.js'
import store from '@/store/index.js' import store from '@/store/index.js'
import { isFunction } from '@/utils/types.js'
export async function login_slilen(cb) { // wx.login
const checkRes = await checkLoginTime() export function login_wx(cb) {
if(checkRes.status) {
const res = await slelentLogin('13143340532', checkRes.res.time)
store.state.user.userInfo = res.userInfo
return true
} else {
return false
}
}
export async function login_wx() {
return new Promise(()=> {
uni.login({ uni.login({
success: async res => { success: async res => {
const loginRes = await wxLogin(res.code) const { status, data } = await wxLogin(res.code)
console.log(store) cb && isFunction(cb) && cb()
if(loginRes.status) { if(status) {
store.state.user.openid = loginRes.res.openid store.state.user.openid = data.openid
store.state.user.unionid = loginRes.res.unionid store.state.user.unionid = data.unionid
store.state.user.session_key = loginRes.res.session_key store.state.user.session_key = data.session_key
} }
} }
}) })
})
} }
\ No newline at end of file
...@@ -10,6 +10,9 @@ const validate_strategies = { ...@@ -10,6 +10,9 @@ const validate_strategies = {
}, },
isHttp: (value, errorMsg) => { isHttp: (value, errorMsg) => {
if(!value.startsWith("http")) return errorMsg; if(!value.startsWith("http")) return errorMsg;
},
unique: (value, preValue, errorMsg) => {
if(preValue !== value) return errorMsg
} }
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment