// Me.vue
<template>
<div class="container">
<div class="userinfo">
<img :src="userinfo.avatarUrl">
<p>{{userinfo.nickName}}</p>
</div>
<YearProgress></YearProgress>
<button v-if='userinfo.openId' @click='scanBook' class='btn'>添加圖書</button>
<button v-else open-type="getUserInfo" lang="zh_CN" class='btn' @getuserinfo='login' >點擊登錄</button>
</div>
</template>
<script>
import qcloud from 'wafer2-client-sdk'
import YearProgress from '@/components/YearProgress'
import {showSuccess, post} from '@/util'
import config from '@/config'
export default {
components: {
YearProgress
},
data () {
return {
userinfo: {
avatarUrl: 'http://image.shengxinjing.cn/rate/unlogin.png',
nickName: ''
}
}
},
methods: {
async addBook (isbn) {
console.log(isbn)
const res = await post('/weapp/addbook',{
isbn,
openid:this.userinfo.openId
})
// showModal('添加成功',`${res.title}添加成功`)
},
scanBook () {
wx.scanCode({
success: (res) => {
if (res.result) {
this.addBook(res.result)
}
}
})
},
getWxLogin: function ({encryptedData, iv, userinfo}) {
const self = this
wx.login({
success: function (loginResult) {
console.log('loginResult', loginResult)
var loginParams = {
code: loginResult.code,
encryptedData: encryptedData,
iv: iv
}
qcloud.setLoginUrl(config.loginUrl)
qcloud.requestLogin({
loginParams,
success () {
// 獲取用戶信息
qcloud.request({
url: config.userUrl,
login: true,
success (userRes) {
showSuccess('登錄成功')
wx.setStorageSync('userinfo', userRes.data.data)
self.userinfo = userRes.data.data
}
})
},
fail (error) {
console.log(error)
// showModal('登錄失敗', error)
}
})
},
fail: function (loginError) {
// showModal('登錄失敗', error)
console.log(loginError)
}
})
},
login (e) {
const self = this
// 查看是否授權
wx.getSetting({
success: function (res) {
// 授權信息里有用戶信息
if (res.authSetting['scope.userInfo']) {
// 檢查用戶登錄是否過期
wx.checkSession({
success: function () {
// 沒過期 直接成功
showSuccess('登錄成功')
},
fail: function () {
// 過期了 重新登錄 先清除登錄的狀態(tài)
qcloud.clearSession()
// 登錄狀態(tài)已過期 需要重新登錄
// 登錄需要的加密信息
var options = {
encryptedData: e.mp.detail.encryptedData,
iv: e.mp.detail.iv,
userinfo: e.mp.detail.userInfo
}
self.getWxLogin(options)
}
})
} else {
// showModal('用戶未授權', e.mp.detail.errMsg)
console.log('用戶未授權', e.mp.detail.errMsg)
}
}
})
}
},
onShow () {
let userinfo = wx.getStorageSync('userinfo')
if (userinfo) {
this.userinfo = userinfo
}
}
}
</script>
<style lang='scss'>
.container{
padding:0 30rpx;
.userinfo{
margin-top: 100rpx;
text-align: center;
img {
width: 150rpx;
height: 150rpx;
margin: 20rpx;
border-radius: 50%
}
}
}
</style>
wafer2-quickstart-nodejs-master插件的server目錄,my-project/server/routes/index.js
/**
* ajax 服務路由集合
*/
const router = require('koa-router')({
prefix: '/weapp'
})
const controllers = require('../controllers')
// 從 sdk 中取出中間件
// 這里展示如何使用 Koa 中間件完成登錄態(tài)的頒發(fā)與驗證
const { auth: { authorizationMiddleware, validationMiddleware } } = require('../qcloud')
// --- 登錄與授權 Demo --- //
// 登錄接口
router.get('/login', authorizationMiddleware, controllers.login)
// 用戶信息接口(可以用來驗證登錄態(tài))
router.get('/user', validationMiddleware, controllers.user)
// --- 圖片上傳 Demo --- //
// 圖片上傳接口,小程序端可以直接將 url 填入 wx.uploadFile 中
router.post('/upload', controllers.upload)
// --- 信道服務接口 Demo --- //
// GET 用來響應請求信道地址的
router.get('/tunnel', controllers.tunnel.get)
// POST 用來處理信道傳遞過來的消息
router.post('/tunnel', controllers.tunnel.post)
// --- 客服消息接口 Demo --- //
// GET 用來響應小程序后臺配置時發(fā)送的驗證請求
router.get('/message', controllers.message.get)
// POST 用來處理微信轉(zhuǎn)發(fā)過來的客服消息
router.post('/message', controllers.message.post)
router.get('/demo', controllers.demo)
router.post('/addbook', controllers.addbook)
module.exports = router
wafer2-quickstart-nodejs-master插件的server目錄,my-project/server/controllers/addbook.js
const https = require('https')
module.exports = async (ctx) => {
const { isbn, openid } = ctx.request.body
console.log('添加圖書', isbn, openid)
if (isbn && openid) {
let url = 'https://api.douban.com/v2/book/isbn/' + isbn
console.log(url)
const bookinfo = await getJSON(url)
const rate = bookinfo.rating.average
const { title, image, alt, publisher, summary, price } = bookinfo
console.log(bookinfo)
} else {
console.log(22222)
}
}
function getJSON (url) {
return new Promise((resolve, reject) => {
https.get(url, res => {
let urlData = ''
res.on('data', data => {
urlData += data
})
res.on('end', data => {
const bookinfo = JSON.parse(data)
if (bookinfo.title) {
resolve(bookinfo)
}
reject(bookinfo)
})
})
})
}
項目主配置json
{
"name": "mpvue-demo",
"version": "1.0.0",
"description": "A Mpvue project",
"author": "3581729170@qq.com",
"private": true,
"scripts": {
"dev": "node build/dev-server.js",
"start": "node build/dev-server.js",
"build": "node build/build.js",
"lint": "eslint --fix --ext .js,.vue src"
},
"dependencies": {
"mpvue": "^1.0.11",
"vuex": "^3.0.1",
"wafer2-client-sdk": "^1.1.3"
},
"devDependencies": {
"babel-core": "^6.22.1",
"babel-eslint": "^8.2.3",
"babel-loader": "^7.1.1",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chalk": "^2.4.0",
"connect-history-api-fallback": "^1.3.0",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^0.28.11",
"cssnano": "^3.10.0",
"eslint": "^4.19.1",
"eslint-config-standard": "^11.0.0",
"eslint-friendly-formatter": "^4.0.1",
"eslint-loader": "^2.0.0",
"eslint-plugin-html": "^4.0.3",
"eslint-plugin-import": "^2.11.0",
"eslint-plugin-node": "^6.0.1",
"eslint-plugin-promise": "^3.4.0",
"eslint-plugin-standard": "^3.0.1",
"eventsource-polyfill": "^0.9.6",
"express": "^4.16.3",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.11",
"friendly-errors-webpack-plugin": "^1.7.0",
"glob": "^7.1.2",
"html-webpack-plugin": "^3.2.0",
"http-proxy-middleware": "^0.18.0",
"mpvue-loader": "1.0.13",
"mpvue-template-compiler": "^1.0.11",
"mpvue-webpack-target": "^1.0.0",
"node-sass": "^4.9.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^2.0.0",
"portfinder": "^1.0.13",
"postcss-loader": "^2.1.4",
"postcss-mpvue-wxss": "^1.0.0",
"prettier": "~1.12.1",
"px2rpx-loader": "^0.1.10",
"rimraf": "^2.6.0",
"sass-loader": "^7.0.3",
"semver": "^5.3.0",
"shelljs": "^0.8.1",
"uglifyjs-webpack-plugin": "^1.2.5",
"url-loader": "^1.0.1",
"vue-style-loader": "^4.1.0",
"webpack": "^3.11.0",
"webpack-bundle-analyzer": "^2.2.1",
"webpack-dev-middleware-hard-disk": "^1.12.0",
"webpack-merge": "^4.1.0",
"webpack-mpvue-asset-plugin": "0.0.2"
},
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
項目的config.json
{
"description": "項目配置文件。",
"setting": {
"urlCheck": false,
"es6": false,
"postcss": true,
"minified": true,
"newFeature": true
},
"miniprogramRoot": "./dist/",
"qcloudRoot": "./server/",
"compileType": "miniprogram",
"appid": "wx73a95869c3086bce",
"projectname": "mpvue-demo",
"condition": {
"search": {
"current": -1,
"list": []
},
"conversation": {
"current": -1,
"list": []
},
"game": {
"currentL": -1,
"list": []
},
"miniprogram": {
"current": -1,
"list": []
}
}
}
完整代碼包在這里(包括可以識別的圖書二維碼)-----> 百度網(wǎng)盤
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構(gòu),發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。