Browse Source

reconstruction index authorization for tid1807

tid1867
刘嘉炜 3 months ago
parent
commit
0ee0294ed6
  1. 3
      src/App.vue
  2. 12
      src/js/server.js
  3. 3
      src/main.js
  4. 14
      src/pages.json
  5. 275
      src/pages/index/index.vue
  6. 43
      src/store/actions.js
  7. 9
      src/store/index.js
  8. 13
      src/store/mutations.js
  9. 190
      src/subpackage/authorization/components/login.vue
  10. 7
      src/subpackage/authorization/js/api.js
  11. 10
      src/subpackage/authorization/js/server.js
  12. 16
      src/subpackage/authorization/pages/index.vue
  13. BIN
      src/subpackage/authorization/static/images/author_modal.png

3
src/App.vue

@ -3,9 +3,8 @@
import util from './utils/util';
export default {
onLaunch: function() {
// #ifndef H5
this.$store.commit('setLoginState', { loginState: false });
this.updateManager();
// #endif
},
methods: {
isLogin(){

12
src/js/server.js

@ -1,5 +1,6 @@
import util from '../utils/util';
// import { app as vm } from '../main';
import { app as vm } from '../main';
const islog = true;
@ -27,6 +28,9 @@ export class Server {
method: method,
data: res,
})
handleUserExceptions({ res });
if(isDefaultGet){
if(failMsg == '')throw Error('默认回调,失败提示不能为空 key -> failMsg');
defaultGet({
@ -70,6 +74,14 @@ export class Server {
reject({url,res,data});
}
}
// 用户信息异常
function handleUserExceptions({ res }){
if(res?.data?.code === 401&&res?.data?.message?.indexOf('用户') !== -1){
console.log('用户信息异常,请重新登录');
const _store = vm.$store;
_store.commit('setLoginState', { loginState: false });
}
}
}
get({url,data={},header={},isDefaultGet=true,failMsg=''}){
return this.request(url,data,'GET',header,isDefaultGet,failMsg);

3
src/main.js

@ -6,8 +6,9 @@ Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
export const app = new Vue({
...App,
store
})
app.$mount()

14
src/pages.json

@ -4,7 +4,8 @@
"path": "pages/index/index",
"style": {
"componentPlaceholder": {
"bottom-logo": "view"
"bottom-logo": "view",
"authorization-login": "view"
}
}
},
@ -969,6 +970,17 @@
}
}
]
},
{
"root": "subpackage/authorization",
"pages": [
{
"path": "pages/index",
"style" : {
"navigationBarTitleText": ""
}
}
]
}
],
"globalStyle": {

275
src/pages/index/index.vue

@ -2,22 +2,22 @@
<view class="index-container">
<view class="ic-content">
<view class="ic-header">
<view class="ih-address" v-if="loginStatus" @click="toStoreList">
<view class="ih-address" v-if="loginState" @click="toStoreList">
<view>{{indexData.brand_name || '-'}}({{indexData.stadium_num || '0'}})</view>
<image src="/static/images/icon/arrow_ff.png" mode="aspectFit"></image>
</view>
<view v-else class="ih-btn" hover-class="hover-active" @click="showAuthor">点击登陆</view>
<block v-if="isPermissionShowTab({ serverKey: 1001 })">
<view class="ih-tip">今日总收入</view>
<view class="ih-price"><text>{{loginStatus?'¥':''}}</text>{{loginStatus?(indexData.amount || '0'):'***'}}</view>
<view class="ih-price"><text>{{loginState?'¥':''}}</text>{{loginState?(indexData.amount || '0'):'***'}}</view>
<view class="ih-amount">
<view>
<view>收款笔数</view>
<view>{{loginStatus?(indexData.in_count || '0'):'**'}}</view>
<view>{{loginState?(indexData.in_count || '0'):'**'}}</view>
</view>
<view>
<view>退款笔数</view>
<view>{{loginStatus?(indexData.out_count || '0'):'**'}}</view>
<view>{{loginState?(indexData.out_count || '0'):'**'}}</view>
</view>
</view>
</block>
@ -52,33 +52,9 @@
<bottom-logo></bottom-logo>
<view class="ox-dark-mask" v-if="isShowAuthorModal">
<view class="ic-author-modal">
<view class="iam-title">微信授权</view>
<view class="iam-tip">您的信息和数据将受到保护</view>
<image class="iam-pic" mode="aspectFit" src="/static/images/icon/author_modal.png"></image>
<view class="iam-btns">
<button plain hover-class="hover-active" @click="cancelAuthor">取消</button>
<authorization-login ref="authorizationLogin"></authorization-login>
<button
v-if="isProfile"
plain
hover-class="hover-active"
@click="profileConfirm"
>授权并登录</button>
<button
v-else
plain
hover-class="hover-active"
open-type="getUserInfo"
lang="zh_CN"
@getuserinfo="confirmAuthor"
>授权并登录</button>
</view>
</view>
</view>
<view class="fly_btn" @click="toPageInfo(tabList[4])" v-if="loginStatus">
<view class="fly_btn" @click="toPageInfo(tabList[4])" v-if="loginState">
<image class="f_bg" src="/static/images/icon/index/green_bg_circle.png" mode="scaleToFill"/>
<image class="f_icon" src="/static/images/icon/index/scan_icon_white.png" mode="scaleToFill"/>
<text>核销</text>
@ -91,7 +67,9 @@
import util from '../../utils/util';
import { servers } from '../../js/server';
import { API } from '../../js/api';
import { mapGetters } from 'vuex';
import bottomLogo from "@/subpackage/menu/components/bottom_logo.vue";
import authorizationLogin from "@/subpackage/authorization/components/login.vue";
const tabList = [
{
id: 0,
@ -176,57 +154,34 @@
];
const app = getApp();
// #ifndef H5
const uniGetSetting = util.promisify(uni.getSetting);
const uniLogin = util.promisify(uni.login);
const uniGetUserInfo= util.promisify(uni.getUserInfo);
const APPID = uni.getAccountInfoSync().miniProgram.appId;
// #endif
// #ifdef H5
const APPID = "wx7106e84614cf0060" //TODO
// #endif
export default {
components: { bottomLogo },
components: { bottomLogo, authorizationLogin },
computed: {
isProfile: _=>util.isProfile(),
// loginStatus(){
// return app.isLogin();
// }
...mapGetters([ 'loginState' ]),
},
data() {
return {
tabList,
isShowAuthorModal: false,
indexData: {},
loginStatus: false,
}
},
async onLoad(options) {
try{
util.showLoad();
let _loginRes = {};
// 20230829
if(options.role !== 'ADMIN-PLATFORM')await this.checkUserAuthor();
util.hideLoad();
this.loginStatus = app.isLogin();
if(!!app.isLogin())this.getIndexInfo();
if(options.role !== 'ADMIN-PLATFORM')_loginRes = await this.$store.dispatch('checkUserAuthor');
// 20240325 openid
if(_loginRes?.data === '')this.webBrandUserCheck();
if(_loginRes?.data)this.getIndexInfo();
}catch(err){
util.hideLoad();
uni.removeStorageSync('token');
// util.showNone(err.message || '');
console.log('onLoad err',err);
this.loginStatus = app.isLogin();
console.warn('pages index onLoad err--->', err);
}
},
onShow(){
let { indexData } = this;
if(JSON.stringify(indexData)!='{}'&&!!app.isLogin())this.getIndexInfo();
let { indexData, loginState, getIndexInfo } = this;
if(JSON.stringify(indexData)!='{}'&&loginState)getIndexInfo();
},
methods: {
// ID1000840
@ -238,13 +193,13 @@
return false;
},
toNoticeList(){
if(!app.isLogin())return this.showAuthor();
if(!this.loginState)return this.showAuthor();
util.routeTo(`/pages/message/list/list`,'nT');
},
toPageInfo(tabInfo){
let { indexData } = this;
let { indexData, loginState } = this;
let _permission = indexData.permission || {};
if(!app.isLogin())return this.showAuthor();
if(!loginState)return this.showAuthor();
if(!tabInfo.path)return util.showNone('暂未开放!');
//if(tabInfo.id == 2)return util.routeTo(tabInfo.path,'nT'); //
if(!_permission[tabInfo.serverKey])return util.showNone('暂无权限,请联系管理员开启!')
@ -259,7 +214,6 @@
if([ 10, 11, 4 ].includes(tabInfo.id))return util.routeTo(tabInfo.path + `?brand_id=${indexData.brand.id}`,'nT');
if(tabInfo.id === 12){
// if(!indexData.brand.mini_wechat_appid)return util.showNone('appid')
let url = tabInfo.path + `?appid=${indexData.brand.mini_wechat_appid}`
console.log(222,url)
return util.routeTo(url,'nT');
@ -280,138 +234,16 @@
this.$store.commit('setBrandInfo',res);
})
},
// token
async checkUserAuthor(){
try{
let loginRes =""
// #ifndef H5
loginRes = await uniLogin();
// #endif
// #ifdef H5
loginRes = {errMsg: "login:ok", code: "0c3xEi0w3kr1t23zcU3w3ZQR3w3xEi0h"} //TODO H5
// #endif
console.log(loginRes)
return servers.get({
url: API.wechatMiniAppLoginAndSync,
data: {
code: loginRes.code,
appid: APPID,
// #ifdef H5
token:"3d2b0092-e761-11ee-8a66-5254005df464", //TODO
// #endif
},
isDefaultGet: false,
})
.then(res=>{
util.hideLoad();
let _data = res.data;
if(_data.code == 0){
// let _data = res.data.data;
if(_data.data == ''){
uni.removeStorageSync('token');
this.loginStatus = app.isLogin();
// 20240325 openid
this.webBrandUserCheck();
// return util.routeTo(`/pages/login/login`,'rL');
}
uni.setStorageSync('token',_data.data);
return _data;
}else{
util.showNone(_data.message || '校验身份失败!');
throw res.data || {};
}
})
.catch(err=>{
throw err;
})
}catch(err){
throw err;
}
},
showAuthor(){
this.isShowAuthorModal = true
},
closeAuthor(){
this.isShowAuthorModal = false
},
cancelAuthor(){
this.closeAuthor();
},
getLoginQuery({
userInfo,
loginRes
}){
return {
appid: APPID,
code: loginRes.code,
encryptedData: userInfo.encryptedData,
// is_details: 1,
//
user_info: userInfo.userInfo,
user_raw_data: userInfo.rawData,
...userInfo.userInfo,
}
},
//
profileConfirm(){
uni.getUserProfile({
lang: 'zh_CN', desc: '授权登陆',
success: res => {
this.confirmAuthor({detail: {...res}});
this.$refs?.authorizationLogin?.alert?.({
success: ()=>{
setTimeout(this.getIndexInfo, 1000);
},
fail: function(err) {
util.showNone('获取用户信息失败!请重试');
console.warn('getUserProfile Err', err)
fail: err =>{
// console.warn('pages index showAuthor authorizationLogin Err ->', err)
}
})
},
async confirmAuthor(userRes){
if(!userRes.detail.userInfo){
this.closeAuthor();
return util.showNone('获取用户信息失败!请稍后重试');
}
let loginRes = await uniLogin();
if(!loginRes.code){
this.closeAuthor();
return util.showNone('获取登陆凭证失败!稍后重试');
}
servers.post({
url: API.wechatMiniAppLoginAndSync,
data: this.getLoginQuery({
userInfo: userRes.detail,
loginRes
}),
isDefaultGet: false,
})
.then(res=>{
util.hideLoad();
let _data = res.data || {};
if(_data.code == 0){
if(_data.data == '')return util.routeTo(`/pages/login/login`,'rL');
util.showNone(_data.message || '登陆成功!');
// let _data = res.data.data;
// if(_data.user.role == '')return util.routeTo(`/pages/merchant_login/merchant_login`,'rL');
uni.setStorageSync('token',_data.data);
setTimeout(_=>{
this.getIndexInfo();
this.closeAuthor();
this.loginStatus = app.isLogin();
}, 1200);
}else{
util.showNone(_data.message || '后台登陆失败!');
setTimeout(_=>this.closeAuthor(), 1200);
}
}).catch(util.hideLoad)
},
webBrandUserCheck(){
// return this.webUserGet();
@ -456,8 +288,8 @@
})
},
toStoreList(){
if(!app.isLogin())return this.showAuthor();
let { indexData } = this;
let { indexData, loginState } = this;
if(!loginState)return this.showAuthor();
util.routeTo(`/pages/store_list/store_list?brand_id=${indexData.brand.id}`,'nT');
},
bindUserOpenid(){
@ -687,57 +519,6 @@
}
}
.ic-author-modal{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
padding-top: 60upx;
width: 662upx;
height: 884upx;
border-radius: 10upx;
background-color: #fff;
.iam-title{
margin-bottom: 22upx;
text-align: center;
line-height: 60upx;
font-size: 44upx;
font-weight: 500;
color: #1a1a1a;
}
.iam-tip{
margin-bottom: 52upx;
line-height: 40upx;
text-align: center;
font-size: 28upx;
color: #9c9c9f;
}
.iam-pic{
margin: 0 auto 62upx;
display: block;
width: 488upx;
height: 416upx;
}
.iam-btns{
@include centerFlex(center);
>button{
margin: 0 20upx;
width: 240upx;
height: 92upx;
line-height: 88upx;
text-align: center;
border-radius: 46upx;
border: 2upx solid $themeColor;
font-size: 32upx;
color: $themeColor;
&+button{
background-color: $themeColor;
color: #fff;
}
}
}
}
// fly_btn
.fly_btn{

43
src/store/actions.js

@ -1,7 +1,7 @@
// 异步方法
import { servers } from '../js/server';
import { API } from '../js/api';
import { showLoad, hideLoad, showModal } from '../utils/util';
import { showLoad, hideLoad, showModal, promisify } from '../utils/util';
export default {
getBrandInfo({commit, state}){
@ -56,4 +56,45 @@ export default {
// return Promise.reject(err);
})
},
// 看是否授权,清除token 也可以理解自动登陆
async checkUserAuthor({ commit, state }){
let loginRes = {};
try{
const uniLogin = promisify(uni.login);
loginRes = await uniLogin();
}catch(err){
console.warn('store actions checkUserAuthor login err', err);
showModal({ content: '获取登陆凭证失败!请稍后重新登录!' });
return Promise.reject(err);
}
showLoad();
return servers.post({
url: API.wechatMiniAppLoginAndSync,
data: {
code: loginRes.code,
appid: state.APPID,
},
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
if(_data.data === ''){
commit('setLoginState', { loginState: false, token: '' });
return _data;
}
commit('setLoginState', { loginState: true, token: _data.data });
return _data;
}else{
return Promise.reject(_data);
}
})
.catch(err=>{
console.warn('store actions checkUserAuthor wechatMiniAppLoginAndSync err --->', err);
hideLoad();
showModal({ content: err?.message || '静默登录失败!请稍后重试!' });
return Promise.reject(err);
})
},
}

9
src/store/index.js

@ -54,7 +54,8 @@ export default new Vuex.Store({
typeInfo: {}, // 球场类型
venueList: [], // 选择场地列表
orderInfo: {}, // 订单信息 // 20230620 新增挂账需求,用于回显确认订单
}
},
isLogin: false, // 登陆状态
},
mutations,
actions,
@ -69,6 +70,12 @@ export default new Vuex.Store({
}
console.warn(_arr.length)
return _arr;
},
loginState: state =>{
let _isLogin = state.isLogin;
let _token = uni.getStorageSync('token');
// 只是想获得一个响应的token状态
if(_isLogin || !_isLogin)return !!_token;
}
}
});

13
src/store/mutations.js

@ -10,5 +10,18 @@ export default {
// 场地占用信息
setOccupyInfo(state, _occupyInfo){
state.occupyInfo = _occupyInfo;
},
//
setLoginState(state, { loginState = false, token = '' }){
console.log(loginState, token);
if(loginState&&token){
uni.setStorageSync('token', token);
state.isLogin = loginState;
}else{
uni.removeStorageSync('token', token);
state.isLogin = false;
}
}
}

190
src/subpackage/authorization/components/login.vue

@ -0,0 +1,190 @@
<template>
<view class="authorization-login" v-show="isShow">
<view class="ic-author-modal">
<view class="iam-title">微信授权</view>
<view class="iam-tip">您的信息和数据将受到保护</view>
<image class="iam-pic" mode="aspectFit" src="../static/images/author_modal.png"></image>
<view class="iam-btns">
<button plain hover-class="hover-active" @click="hide">取消</button>
<button
v-if="isProfile"
plain
hover-class="hover-active"
@click="profileConfirm"
>授权并登录</button>
<button
v-else
plain
hover-class="hover-active"
open-type="getUserInfo"
lang="zh_CN"
@getuserinfo="confirmAuthor"
>授权并登录</button>
</view>
</view>
</view>
</template>
<script>
import { promisify, showModal, showNone, showLoad, hideLoad } from "@/utils/util";
import { AUTHOR_API } from "../js/api";
import server from "../js/server";
export default {
data(){
return {
isShow: false,
initData: {
/**
* @param {Object} data
* @param {Function} data.success
* @param {Function} data.fail
* */
},
}
},
methods: {
alert(data){
this.isShow = true;
this.initData = data ?? {};
},
hide(){
this.isShow = false;
},
isProfile(){
return !!uni.getUserProfile
},
//
profileConfirm(){
uni.getUserProfile({
lang: 'zh_CN', desc: '授权登陆',
success: res => { this.confirmAuthor({detail: {...res}}) },
fail: err => {
showModal({ content: '获取用户信息失败!请重试' });
console.warn('subpackage authorization components login getUserProfile Err ->', err)
}
})
},
async confirmAuthor(userRes){
if(!userRes.detail.userInfo){
this.hide();
return showModal({ content: '获取用户信息失败!请稍后重试' });
}
let loginRes = await promisify(uni.login)();
if(!loginRes.code){
this.hide();
return showModal({ content: '获取登陆凭证失败!请稍后重试' });
}
this.serverLogin({ userRes, loginRes })
},
getLoginQuery({
userInfo,
loginRes
}){
return {
appid: uni.getAccountInfoSync?.()?.miniProgram?.appId ?? '',
code: loginRes?.code ?? '',
encryptedData: userInfo?.encryptedData ?? '',
// is_details: 1,
//
user_info: userInfo?.userInfo ?? {},
user_raw_data: userInfo?.rawData ?? {},
...(userInfo?.userInfo ?? {}),
}
},
serverLogin({ userRes, loginRes }){
showLoad();
return server.post({
url: AUTHOR_API.wechatMiniAppLoginAndSync,
data: this.getLoginQuery({
userInfo: userRes.detail,
loginRes
}),
isDefaultGet: false,
})
.then(res=>{
hideLoad();
let _data = res.data || {};
if(_data.code == 0){
if(_data.data == '')return util.routeTo(`/pages/login/login`,'rL');
showNone(_data?.message || '登陆成功!');
this.$store.commit('setLoginState', { loginState: true, token: _data.data });
this.initData?.success?.(_data);
this.hide();
return _data;
}else{
// util.showNone(_data.message || '');
// setTimeout(_=>this.closeAuthor(), 1200);
return Promise.reject(_data);
}
})
.catch(err=>{
hideLoad();
showModal({ content: err?.message || '后台登陆失败!' });
console.warn('subpackage authorization components login serverLogin Err ->', err);
if(this.initData?.fail)return this.initData?.fail?.(err);
return Promise.reject(err);
})
},
cancelAuthor(){
}
}
}
</script>
<style lang="scss">
.authorization-login{
position: fixed;
left: 0;
top: var(--window-top);
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, .5);
}
.ic-author-modal{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
padding-top: 60upx;
width: 662upx;
height: 884upx;
border-radius: 10upx;
background-color: #fff;
.iam-title{
margin-bottom: 22upx;
text-align: center;
@include flcw(44upx, 60upx, #1a1a1a, 500);
}
.iam-tip{
margin-bottom: 52upx;
text-align: center;
@include flcw(28upx, 40upx, #9c9c9f);
}
.iam-pic{
margin: 0 auto 62upx;
display: block;
width: 488upx;
height: 416upx;
}
.iam-btns{
@include ctf(center);
>button{
margin: 0 20upx;
width: 240upx;
height: 92upx;
text-align: center;
border-radius: 46upx;
border: 2upx solid $mColor;
@include flcw(32upx, 88upx, $mColor);
&+button{
background-color: $mColor;
color: #fff;
}
}
}
}
</style>

7
src/subpackage/authorization/js/api.js

@ -0,0 +1,7 @@
import { ORIGIN } from '@/js/api';
export const AUTHOR_API = {
wechatMiniAppLoginAndSync: `${ORIGIN}/assistant/WechatMiniAppGetToken`, // 小程序授权获取token,为空就登录
}
export default AUTHOR_API;

10
src/subpackage/authorization/js/server.js

@ -0,0 +1,10 @@
import { Server } from '@/js/server';
class _Server extends Server {
constructor(props){
super(props)
}
}
export default new _Server();

16
src/subpackage/authorization/pages/index.vue

@ -0,0 +1,16 @@
<template>
<!-- 需要定义一个页面以及在pagesjson里声明才能生成static文件夹 -->
<view>&nbsp;</view>
</template>
<script>
export default {
}
</script>
<style lang="scss">
page{
background: #fff;
}
</style>

BIN
src/subpackage/authorization/static/images/author_modal.png

After

Width: 488  |  Height: 416  |  Size: 14 KiB

Loading…
Cancel
Save