Browse Source

add API

voice
刘嘉炜 5 years ago
parent
commit
b7097b54c2
  1. 5
      README.md
  2. 3
      package-lock.json
  3. 6
      package.json
  4. 3
      src/App.vue
  5. 2
      src/components/integral_order/integral_order.vue
  6. 2
      src/components/membership_order/membership_order.vue
  7. 4
      src/components/reservation_order/reservation_order.vue
  8. 10
      src/js/api.js
  9. 8
      src/js/server.js
  10. 4
      src/main.js
  11. 6
      src/pages.json
  12. 156
      src/pages/admin_bind/admin_bind.vue
  13. 140
      src/pages/index/index.vue
  14. 36
      src/pages/merchant_info/merchant_info.vue
  15. 17
      src/pages/order_list/order_list.vue
  16. 61
      src/pages/store_list/store_list.vue
  17. 13
      src/pages/write_off/list/list.vue
  18. 5
      src/store/actions.js
  19. 16
      src/store/index.js
  20. 10
      src/store/mutations.js
  21. 12
      src/utils/components.js
  22. 14
      src/utils/util.js

5
README.md

@ -36,4 +36,7 @@ npm run build:mp-weixin
padding-bottom: 0;
padding-bottom: calc( 0 + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */
padding-bottom: calc( 0 + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */
```
```
### [蓝湖](https://lanhuapp.com/web/#/item/project/board?pid=9ab56cc5-0b3b-4a9c-8cd0-0cf57751010a)

3
package-lock.json

@ -14095,7 +14095,8 @@
"vuex": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.5.1.tgz",
"integrity": "sha512-w7oJzmHQs0FM9LXodfskhw9wgKBiaB+totOdb8sNzbTB2KDCEEwEs29NzBZFh/lmEK1t5tDmM1vtsO7ubG1DFw=="
"integrity": "sha512-w7oJzmHQs0FM9LXodfskhw9wgKBiaB+totOdb8sNzbTB2KDCEEwEs29NzBZFh/lmEK1t5tDmM1vtsO7ubG1DFw==",
"dev": true
},
"w3c-hr-time": {
"version": "1.0.2",

6
package.json

@ -59,8 +59,7 @@
"core-js": "^3.6.5",
"flyio": "^0.6.2",
"regenerator-runtime": "^0.12.1",
"vue": "^2.6.11",
"vuex": "^3.2.0"
"vue": "^2.6.11"
},
"devDependencies": {
"@dcloudio/types": "*",
@ -83,7 +82,8 @@
"node-sass": "^4.14.1",
"postcss-comment": "^2.0.0",
"sass-loader": "^10.0.2",
"vue-template-compiler": "^2.6.11"
"vue-template-compiler": "^2.6.11",
"vuex": "^3.5.1"
},
"browserslist": [
"Android >= 4",

3
src/App.vue

@ -6,6 +6,9 @@
this.updateManager();
},
methods: {
isLogin(){
return !!uni.getStorageSync('token');
},
updateManager(){
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(res=>console.log('请求完新版本信息的回调-->',res.hasUpdate));

2
src/components/order/integral/integral.vue → src/components/integral_order/integral_order.vue

@ -47,7 +47,7 @@ export default {
</script>
<style lang="scss" scoped>
@import "../../../style/public.scss";
@import "../../style/public.scss";
.integral-order{
padding-bottom: 10upx;
border-radius: 10upx;

2
src/components/order/membership/membership.vue → src/components/membership_order/membership_order.vue

@ -62,7 +62,7 @@ export default {
</script>
<style lang="scss" scoped>
@import "../../../style/public.scss";
@import "../../style/public.scss";
.membership-order{
padding: 0 20upx;
background-color: #fff;

4
src/components/order/reservation/reservation.vue → src/components/reservation_order/reservation_order.vue

@ -57,8 +57,8 @@ export default {
}
</script>
<style lang="scss" scoped>
@import "../../../style/public.scss";
<style lang="scss" >
@import "../../style/public.scss";
.reservation-order{
padding: 0 24upx;
border-radius: 10upx;

10
src/js/api.js

@ -1,8 +1,14 @@
export const ORIGIN = ``; // 正式
export const ORIGIN = `http://testmanager.ouxuanzhineng.cn`; // 测试
export const API = {
wechatMiniAppLoginAndSync:`${ORIGIN}/user/wechatMiniAppLoginAndSync`, // 小程序授权
brandInfo:`${ORIGIN}/stadium/brand/get`, // 品牌信息
assistantAuth:`${ORIGIN}/assistant/auth`, // 授权绑定 - 获取用户信息
calc:`${ORIGIN}/admin/assistant/calc`, // 首页 统计页面
stadiumList:`${ORIGIN}/stadium/list`, // 店铺列表
stadiumDetail:`${ORIGIN}/stadium/detail`, // A店铺管理-店铺列表-店铺详情
}

8
src/js/server.js

@ -5,11 +5,9 @@ const islog = false
export class Server {
request(url,data,method,header,isDefaultGet,failMsg){
return new Promise(async (rs,rj)=>{
const _store = vm.$store;
let storeInfo = _store.state.storeInfo || null;
if(storeInfo)data['brand_id'] = storeInfo.brand_id;
// const _store = vm.$store;
// let storeInfo = _store.state.storeInfo || null;
// if(storeInfo)data['brand_id'] = storeInfo.brand_id;
const _token = uni.getStorageSync('token') || '';
if(_token)data['token'] = _token;

4
src/main.js

@ -1,11 +1,13 @@
import Vue from 'vue'
import App from './App'
import store from './store/index.js';
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
...App,
store
})
app.$mount()

6
src/pages.json

@ -6,6 +6,12 @@
}
},
{
"path": "pages/admin_bind/admin_bind",
"style": {
"navigationBarTitleText": "扫码绑定"
}
},
{
"path": "pages/turnover/turnover",
"style": {
"navigationBarTitleText": "营业额"

156
src/pages/admin_bind/admin_bind.vue

@ -0,0 +1,156 @@
<template>
<view class="admin-bind">
<image mode="aspectFit" src="/static/images/icon/success_tip.png"></image>
<view class="ab-tip">扫码成功</view>
<view class="ab-brand">品牌名称{{brandInfo.name || ''}}</view>
<view>请点击确认绑定按钮成为超级管理员</view>
<view>绑定后您将可以添加员工并查看品牌订单数据</view>
<button
plain
hover-class="hover-active"
open-type="getUserInfo"
lang="zh_CN"
@getuserinfo="getuserinfo">确认绑定</button>
</view>
</template>
<script>
import { API } from '../../js/api';
import { servers } from '../../js/server';
import util from '../../utils/util';
const uniLogin = util.promisify(uni.login);
export default {
data(){
return {
brandInfo: {},
sceneQuery: {
b:'37',
r:'1'
},
}
},
onLoad(options){
// console.log(options)
//
if (options.scene) {
// "r=%s&b=%d" -> rid brand_id ->
let sceneQuery = util.formatScene(options.scene);
this.sceneQuery = sceneQuery;
this.getBrandInfo(sceneQuery.b);
} else {
console.log("no scene");
}
},
methods: {
async getuserinfo(userRes){
if(!userRes.detail.userInfo){
return util.showNone('获取用户信息失败!请稍后重试');
}
let loginRes = await uniLogin();
if(!loginRes.code){
return util.showNone('获取登陆凭证失败!稍后重试');
}
const APPID = uni.getAccountInfoSync().miniProgram.appId;
let { sceneQuery } = this;
if(!sceneQuery.r)return util.showNone('缺少rid!');
util.showLoad();
//
servers.post({
url: API.assistantAuth,
data: {
appid: APPID,
code: loginRes.code,
encryptedData: userRes.detail.encryptedData,
iv: userRes.detail.iv,
// brand_id: sceneQuery.b,
// rid: sceneQuery.r,
brand_id: 37,
rid: '@ed8dcd',
// 'avatar_url': userRes.detail.userInfo.avatarUrl,
// ...userRes.detail.userInfo,
},
isDefaultGet: false,
})
.then(res=>{
util.hideLoad();
if(res.data.code == 0){
let _data = res.data.data;
// if(_data.user.role === '')return util.routeTo(`/pages/merchant_login/merchant_login`,'rT');
util.showNone(res.data.message || '操作成功!');
// uni.setStorageSync('token', _data.token);
// setTimeout(_=>{
// this.isLogin = app.isLogin();
// }, 1200);
}else{
util.showNone(res.data.message || '操作失败!');
}
}).catch(util.hideLoad)
},
getBrandInfo(brand_id){
util.showLoad();
servers.get({
url: API.brandInfo + '/' +brand_id,
data: {},
failMsg: '加载品牌信息失败!'
})
.then(res=>{
util.hideLoad();
this.brandInfo = res;
console.log(res)
})
.then(util.hideLoad)
}
}
}
</script>
<style lang="scss">
@import "../../style/public.scss";
page{
background-color: #fff;
}
.admin-bind{
padding-top: 150upx;
>image{
display: block;
margin: 0 auto;
margin-bottom: 30upx;
width: 150upx;
height: 150upx;
}
>view{
text-align: center;
font-size: 28upx;
color: #1a1a1a;
}
.ab-tip{
margin-bottom: 50upx;
font-size: 40upx;
font-weight: 500;
}
.ab-brand{
font-size: 32upx;
margin-bottom: 50upx;
@include textHide(1);
}
>button{
margin-top: 70upx;
width: 702upx;
height: 88upx;
line-height: 88upx;
text-align: center;
border: none;
border-radius: 10upx;
font-size: 32upx;
color: #fff;
background-color: $themeColor;
}
}
</style>

140
src/pages/index/index.vue

@ -2,21 +2,21 @@
<view class="index-container">
<view class="ic-content">
<view class="ic-header">
<view class="ih-address" v-if="true" @click="toStoreList">
<view>广州欧轩智能场馆(共6)</view>
<view class="ih-address" v-if="isLogin" @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>
<view class="ih-tip">今日总收入</view>
<view class="ih-price"><text>¥</text>0.00</view>
<view class="ih-price"><text>{{isLogin?'¥':''}}</text>{{isLogin?(indexData.amount || '0'):'***'}}</view>
<view class="ih-amount">
<view>
<view>收款笔数</view>
<view>10</view>
<view>{{isLogin?(indexData.in_count || '0'):'**'}}</view>
</view>
<view>
<view>收款笔数</view>
<view>10</view>
<view>{{isLogin?(indexData.out_count || '0'):'**'}}</view>
</view>
</view>
<image class="ih-bg-icon" style="left: 0;" mode="aspectFit" src="/static/images/icon/index/header_bg_a.png"></image>
@ -28,12 +28,12 @@
<text>消息中心</text>
</view>
<view class="in-right">
<view>99</view>
<view v-if="indexData.message_count>0">{{indexData.message_count || '0'}}</view>
<image src="/static/images/icon/arrow_b2.png" mode="aspectFit"></image>
</view>
</view>
<view class="ic-tabs">
<view class="it-item" v-for="e in tabList" :key="e.id" @click="toPageInfo(e.path)">
<view class="it-item" v-for="e in tabList" :key="e.id" @click="toPageInfo(e)">
<image mode="aspectFit" :src="'/static/images/icon/index/tab_'+ e.id + '.png'"></image>
<view>{{e.name}}</view>
</view>
@ -45,8 +45,14 @@
<view class="iam-tip">您的信息和数据将受到保护</view>
<image class="iam-pic" mode="aspectFit" src="/static/images/icon/author_modal.png"></image>
<view class="iam-btns">
<view hover-class="hover-active" @click="cancelAuthor">取消</view>
<view hover-class="hover-active" @click="confirmAuthor">授权并登录</view>
<button plain hover-class="hover-active" @click="cancelAuthor">取消</button>
<button
plain
hover-class="hover-active"
open-type="getUserInfo"
lang="zh_CN"
@getuserinfo="confirmAuthor"
>授权并登录</button>
</view>
</view>
</view>
@ -54,7 +60,10 @@
</template>
<script>
import util from '../../utils/util';
import util from '../../utils/util';
import { servers } from '../../js/server';
import { API } from '../../js/api';
const tabList = [
{
id: 0,
@ -102,18 +111,57 @@ import util from '../../utils/util';
path: ''
},
];
const uniGetSetting = util.promisify(uni.getSetting);
const uniLogin = util.promisify(uni.login);
const uniGetUserInfo= util.promisify(uni.getUserInfo);
const app = getApp();
export default {
computed: {
},
data() {
return {
tabList,
isShowAuthorModal: false,
isLogin: false,
indexData: {},
}
},
onLoad() {
async onLoad() {
await this.checkUserAuthor();
this.isLogin = app.isLogin();
if(!!app.isLogin())this.getIndexInfo();
},
methods: {
getIndexInfo(){
servers.get({
url: API.calc,
data: {},
failMsg: '加载数据失败!'
})
.then(res=>{
this.indexData = res;
this.$store.commit('setBrandInfo',res);
})
},
// token
async checkUserAuthor(){
try{
let setting;
try{setting = await uniGetSetting({})}catch(err){console.error(err)};
if(setting&&setting.authSetting&&setting.authSetting['scope.userInfo'] === true){
let [ loginRes, userRes ] = await Promise.all([uniLogin(), uniGetUserInfo()]);
console.log(codeRes);
console.log(userInfo);
}else{
uni.removeStorageSync('token');
}
}catch(err){
}
},
showAuthor(){
this.isShowAuthorModal = true
},
@ -123,17 +171,63 @@ import util from '../../utils/util';
cancelAuthor(){
this.closeAuthor();
},
confirmAuthor: util.debounce(function(){
this.closeAuthor();
async confirmAuthor(userRes){
if(!userRes.detail.userInfo){
this.closeAuthor();
return util.showNone('获取用户信息失败!请稍后重试');
}
let loginRes = await uniLogin();
if(!loginRes.code){
this.closeAuthor();
return util.showNone('获取登陆凭证失败!稍后重试');
}
const APPID = uni.getAccountInfoSync().miniProgram.appId;
util.showLoad();
servers.post({
url: API.wechatMiniAppLoginAndSync,
data: {
appid: APPID,
code: loginRes.code,
encryptedData: userRes.detail.encryptedData,
iv: userRes.detail.iv,
is_details: 1,
// 'avatar_url': userRes.detail.userInfo.avatarUrl,
// ...userRes.detail.userInfo,
},
isDefaultGet: false,
})
.then(res=>{
util.hideLoad();
if(res.data.code == 0){
let _data = res.data.data;
if(_data.user.role === '')return util.routeTo(`/pages/merchant_login/merchant_login`,'rT');
util.showNone(res.data.message || '登陆成功!');
uni.setStorageSync('token',_data.token);
setTimeout(_=>{
this.isLogin = app.isLogin();
this.closeAuthor();
}, 1200);
}else{
util.showNone(res.data.message || '后台登陆失败!');
setTimeout(_=>this.closeAuthor(), 1200);
}
}).catch(util.hideLoad)
}, 300, 300),
toPageInfo(path){
if(!path)return util.showNone('暂未开放!');
util.routeTo(path,'nT');
},
toPageInfo(tabInfo){
if(!tabInfo.path)return util.showNone('暂未开放!');
let { indexData } = this;
util.routeTo(tabInfo.path,'nT');
},
toStoreList(){
util.routeTo(`/pages/store_list/store_list`,'nT');
}
let { indexData } = this;
util.routeTo(`/pages/store_list/store_list?brand_id=${indexData.brand.id}`,'nT');
},
}
}
</script>
@ -340,7 +434,7 @@ import util from '../../utils/util';
}
.iam-btns{
@include centerFlex(center);
>view{
>button{
margin: 0 20upx;
width: 240upx;
height: 92upx;
@ -350,7 +444,7 @@ import util from '../../utils/util';
border: 2upx solid $themeColor;
font-size: 32upx;
color: $themeColor;
&+view{
&+button{
background-color: $themeColor;
color: #fff;
}

36
src/pages/merchant_info/merchant_info.vue

@ -1,31 +1,53 @@
<template>
<view class="merchant-info">
<view class="mi-list">
<view class="ml-item" v-for="e in 20" :key="e">
<view class="mi-title">欧轩智能羽毛球馆永泰店</view>
<view class="ml-item">
<view class="mi-title">{{storeInfo.name || '-'}}</view>
<view class="ml-line">
<view>微信商户号</view>
<view>17098768441</view>
<view>{{storeInfo.pay_wechat_mch_id || '-'}}</view>
</view>
<view class="ml-line">
<view>公户名称</view>
<view>广州欧轩网络科技有限公司</view>
<view>{{storeInfo.bank_account_name || '-'}}</view>
</view>
<view class="ml-line">
<view>银行账号</view>
<view>443**********69</view>
<view>{{storeInfo.bank_account || '-'}}</view>
</view>
<view class="ml-line">
<view>开户银行</view>
<view>中国建设银行</view>
<view>{{storeInfo.bank_name || '-'}}</view>
</view>
</view>
</view>
</view>
</template>
<script>
import { API } from '../../js/api'
import { servers } from '../../js/server'
export default {
data(){
return {
storeInfo: {}
}
},
onLoad(options){
this.getInfo(options.id)
},
methods: {
getInfo(id){
servers.get({
url: API.stadiumDetail + '/' + id,
data:{},
failMsg: '加载失败!'
})
.then(res=>{
console.log(res)
this.storeInfo = res;
})
}
}
}
</script>
<style lang="scss" scoped>

17
src/pages/order_list/order_list.vue

@ -81,18 +81,25 @@
</template>
<script>
import { order } from '../../utils/components';
import util from '../../utils/util';
// import { order } from '../../utils/components';
import reservation_order from '../../components/reservation_order/reservation_order';
import integral_order from '../../components/integral_order/integral_order';
import membership_order from '../../components/membership_order/membership_order';
import util from '../../utils/util';
export default {
components: {
'reservation-order': order.reservation,
'membership-order': order.membership,
'integral-order': order.integral,
// 'reservation-order': order.reservation,
'reservation-order': reservation_order,
'membership-order': membership_order,
'integral-order': integral_order,
},
methods: {
toSearch(){
util.routeTo(`/pages/order_search/order_search`,'nT');
}
},
onLoad(){
console.log(reservation_order)
}
}
</script>

61
src/pages/store_list/store_list.vue

@ -1,27 +1,72 @@
<template>
<view class="store-list">
<view class="sl-list">
<view class="sl-item" v-for="e in 10" :key="e">
<view class="si-tit">欧轩智能羽毛球馆永泰店</view>
<view class="sl-item" v-for="(e,i) in storeList" :key="i">
<view class="si-tit">{{e.name || '-'}}</view>
<view class="si-info">
<view>营业状态正常</view>
<view @click="toDetail">
<view>微信商户号17098768441</view>
<view>营业状态{{e.is_business == 1 ? '正常' : '非营业状态'}}</view>
<view @click="toDetail(e)">
<view>微信商户号{{e.pay_wechat_mch_id || '-'}}</view>
<image mode="aspectFit" src="/static/images/icon/arrow_b2.png"></image>
</view>
</view>
<view class="si-user">许大仙 | 18046809331</view>
<view class="si-user">{{e.contact_person || '-'}} | {{e.contact_mobile || '-'}}</view>
</view>
</view>
</view>
</template>
<script>
import { API } from '../../js/api';
import { servers } from '../../js/server';
import util from '../../utils/util'
export default {
data(){
return {
brand_id: '',
storeList: [],
page: 1,
}
},
onReachBottom(){
let { brand_id, page } = this;
this.getStoreList({
page: ++page,
brand_id
})
},
onLoad(options){
this.brand_id = options.brand_id;
this.getStoreList({
brand_id: options.brand_id
})
},
methods: {
toDetail(){
util.routeTo(`/pages/merchant_info/merchant_info`,'nT');
toDetail(e){
util.routeTo(`/pages/merchant_info/merchant_info?id=${e.id}`,'nT');
},
getStoreList({
page=1,
page_size=15,
brand_id=37,
}){
servers.get({
url: API.stadiumList,
data: {
page,
page_size,
brand_id,
},
failMsg: '获取列表失败!'
})
.then(res=>{
console.log(res)
let _list = res.list || [];
if(page == 1) return this.storeList = _list;
if(_list.length<=0)return util.showNone('没有更多!');
this.page = page;
this.storeList = [...this.storeList,..._list];
})
}
}
}

13
src/pages/write_off/list/list.vue

@ -61,7 +61,18 @@ import util from '../../../utils/util'
export default {
methods: {
scanCode(){
util.routeTo(`/pages/write_off/confirm/confirm`,'nT')
uni.scanCode({
success: res=>{
console.log(res);
util.routeTo(`/pages/write_off/confirm/confirm`,'nT');
},
fail: err=>{
if(err.errMsg&&err.errMsg.indexOf('cancel')!=-1)return;
console.log(err)
util.showNone('扫码失败!')
}
})
}
}
}

5
src/store/actions.js

@ -0,0 +1,5 @@
// 异步方法
export default {
}

16
src/store/index.js

@ -0,0 +1,16 @@
import Vue from 'vue';
import Vuex from 'vuex';
import mutations from './mutations';
import actions from './actions';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
// #ifdef MP-WEIXIN
APPID: uni.getAccountInfoSync().miniProgram.appId,
// #endif
brandInfo: {},
},
mutations,
actions,
});

10
src/store/mutations.js

@ -0,0 +1,10 @@
// 同步方法
export default {
// 设置品牌信息
setBrandInfo(state, brandInfo){
// console.log(storeInfo,'-----')
state.brandInfo = brandInfo
},
}

12
src/utils/components.js

@ -1,12 +0,0 @@
import reservation from '../components/order/reservation/reservation';
import membership from '../components/order/membership/membership';
import integral from '../components/order/integral/integral';
export const order = {
reservation,
membership,
integral
}
export default { order };

14
src/utils/util.js

@ -318,6 +318,17 @@ function getQueryStr({url,name}){
}
return '';
}
// 小程序码参数 -> '{}'
function formatScene(sceneStr = ''){
let scene = decodeURIComponent(sceneStr);
let queryArr = scene.split('&');
return queryArr.reduce((obj,e,i)=>{
let _arr = e.split('=');
obj[_arr[0]] = _arr[1];
return obj;
},{}) || {};
}
export default {
formatTime,
formatNumber,
@ -343,5 +354,6 @@ export default {
get_zh_date,
substrDate,
requestPayment,
getQueryStr
getQueryStr,
formatScene
}
Loading…
Cancel
Save