小程序语法缺点(我们为什么要使用vuejs)
- 不能使用npm,使用第三方包的方式太原始
- 需要为小程序单独开发代码,不能和web系统重用
- 开发效率和学习成本(小程序特有语法)
mpvue入门
npm install --global vue-cli
# 创建一个基于 mpvue-quickstart 模板的新项目
$ vue init mpvue/mpvue-quickstart my-project
# 安装依赖
$ cd my-project
$ npm install
# 启动构建
$ npm run dev
koa2入门
npm i koa --save
示例:
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'xxx';
});
app.listen(3000);
- Koa是基于nodejs平台的下一代web开发框架(Async await处理异步)
1 callback 回调地狱
function callbacks(fn) {
setTimeout(() => {
// console.log('你好');
fn();
}, 1000);
}
callbacks(() => {
console.log('执行结束');
callbacks(() => {
console.log('执行结束1');
});
});
2.Promise
function delay(world) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(world);
}, 5000);
});
}
delay('你好').then((res) => {
console.log(res);
return delay('王者');
}).then((res) => {
console.log(res);
});
3.async await
function delay(world) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(world);
}, 5000);
});
}
// async是声明一个函数,await是在函数内部用的
async function start() {
const word1 = await delay('你好');
console.log(word1);
const word2 = await delay('王者');
console.log(word2);
}
start();
koa-router入门
https://www.npmjs.com/package/koa-router
npm install koa-router --save
const Koa = require('koa');
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
router.get('/', (ctx, next) => {
// ctx.router available
ctx.body = 'wowoow'
});
app
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000)
腾讯云
- koa2+mysql+wafer-sdk
- 集成微信开发者工具一键上传部署
- 调试免费域名+环境
开通步骤
- 注册腾讯云 https://cloud.tencent.com/login?s_url=https%3A%2F%2Fconsole.cloud.tencent.com%2F,注意关联公众号
- 进入管理后台
- 下载nodejs demo ,熟悉开发工具,把文件夹server放到小程序代码与src平级中
开发工具管理代码
- server config.js
"miniprogramRoot": "dist/wx/",
"qcloudRoot":"./server/", //添加这行
"compileType": "miniprogram",
- npm install wafer2-client-sdk --save (腾讯云解决方案sdk)
腾讯云后台本地开发环境搭建
配置 config.js
将 Demo 代码 clone 到本地,用编辑器打开 server/config.js 添加以下配置:
qcloudAppId: ‘您的腾讯云 AppID’,
qcloudSecretId: ‘您的腾讯云 SecretId’,
qcloudSecretKey: ‘您的腾讯云 SecretKey’,
使用腾讯云的SecretId,SecretKey,AppID
https://console.cloud.tencent.com/developer
https://console.cloud.tencent.com/cam/capi
const CONF = {
// 其他配置 ...
serverHost: 'localhost',
tunnelServerUrl: '',
tunnelSignatureKey: '27fb7d1c161b7ca52d73cce0f1d833f9f5b5ec89',
// 腾讯云相关配置可以查看云 API 秘钥控制台:https://console.cloud.tencent.com/capi
qcloudAppId: '您的腾讯云 AppID',
qcloudSecretId: '您的腾讯云 SecretId',
qcloudSecretKey: '您的腾讯云 SecretKey',
wxMessageToken: 'weixinmsgtoken',
networkTimeout: 30000
}
1,安装brew
curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1
2 赋给/usr/local目录权限,执行
sudo chown -R $(whoami) /usr/local
但是这种方法对于高版本的OS来说,是解决不了的,会报chown: /usr/local: Operation not permitted错误。
先卸载已安装的homebrew,命令如下:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"然后重新安装:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
本地安装mysql
brew install mysql
启动服务
mysql.server start
报错
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/sunflowersdeMacBook-Pro.local.pid).
2、解决办法
打开错误提示所指文件所在的目录 [/usr/local/var/mysql] ,删除该文件 [sunflowersdeMacBook-Pro.local.pid] ,再次启动MySQL就可以了。
或者sudo chown -R mysql:mysql /usr/local/var/mysql
cd /usr/local/var/mysql/
//进去mysql命令环境
mysql -u root
创建一个表
create database cAuth;
切换到服务端代码目录
cd server
# 安装依赖
npm install
# 安装全局依赖
sudo npm install -g nodemon
server文件夹下初始化数据库 - 打开 CMD 输入如下命令:
node tools/initdb.js
本地启动调试环境
Demo 里已经内置了调试的脚本,在 CMD 中输入如下命令即可启动 Debug 模式:
npm run dev
项目骨架搭建
把图片放到目录static下,
在pages下面创建books,comments,me文件夹
项目初始化页面
代码封装
在src目录下新建config.js
// 配置项
const host = 'http://localhost:5757'
const config = {
host
}
export default config
在App.vue里面
<script>
import config from './config.js'
export default {
created () {
wx.request({
url: config.host + '/weapp/demo', // 仅为示例,并非真实的接口地址
// data: {
// x: '',
// y: ''
// },
header: {
'content-type': 'application/json' // 默认值
},
success (res) {
console.log(res)
}
})
// 调用API从本地缓存中获取数据
// const logs = wx.getStorageSync('logs') || []
// logs.unshift(Date.now())
// wx.setStorageSync('logs', logs)
// console.log('app created and cache logs by setStorageSync')
}
}
</script>
调接口的时候会有下面错误在开发的时候我们先打开小程序详情,钩上下面选项
当然这不符合我们的逼格
新建一个util/index.js文件,这样我们就封装了一个get请求函数
import config from '../config'
export function get (url, data) {
return new Promise((resolve, reject) => {
wx.request({
url: config.host + url,
data: {},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
// header: {}, // 设置请求的 header
success: function (res) {
if (res.data.code === 0) {
resolve(res)
} else {
reject(res)
}
},
fail: function () {
// fail
},
complete: function () {
// complete
}
})
})
}
App.vue里面更改如下
export default {
async created () {
await get('/weapp/demo').then((res) => {
console.log(res)
})
// 调用API从本地缓存中获取数据
// const logs = wx.getStorageSync('logs') || []
// logs.unshift(Date.now())
// wx.setStorageSync('logs', logs)
// console.log('app created and cache logs by setStorageSync')
}
}
</script>
个人中心开发
//微信授权
npm install wafer2-client-sdk --save
https://github.com/tencentyun/wafer2-client-sdk
<template>
<div id="persons">
<button open-type="getUserInfo" lang="zh_CN" @getuserinfo="doLogin">获取用户信息</button>
<!-- <open-data type="user" lang="zh_CN"></open-data> -->
</div>
</template>
<script>
import qcloud from 'wafer2-client-sdk'
import config from '../../config.js'
export default {
created () {
this.doLogin()
},
methods: {
doLogin: function (e) {
qcloud.setLoginUrl(config.loginUrl)
qcloud.login({
success: function (userInfo) {
console.log('登录成功', userInfo)
},
fail: function (err) {
console.log('登录失败', err)
}
})
}
}
}
</script>
<style>
</style>
初始化数据库
node tools/initdb.js
进入mysql语句
show tables;
//查表
select * from cSessionInfo;
如何确定用户已经在我们的数据库里面了呢
select * from cSessionInfo;
继续页面~
npm install sass-loader node-sass --save-dev
/ 判断是不是闰年
idLeapYear () {
let year = new Date().getFullYear()
if (year % 400 === 0) {
return true
} else if (year % 4 === 0 && year % 100 === 0) {
return true
} else {
return false
}
},
mysql语句
//进入mysql语句(123456是密码,没有密码mysql -u root )
mysql -u root -p123456
//查看数据库
show databases;
//进入某个数据库
use cAuth;
//查看有哪些表格
show tables;
//查找详情表
desc cSessionInfo
//查看表数据
select * from cSessionInfo;
//查找表中某个表头的数据
select open_id from cSessionInfo
//删除表格
drop table test;
//查看数据库版本
select version();
alter table user modify column name varchar(50) ; --修改字段长度
alter table test change column address address1 varchar(30)--修改表列名
alter table test add column name varchar(10); --添加表列
//更改表字符
ALTER TABLE `你的表名` DEFAULT CHARACTER set utf8mb4 COLLATE utf8mb4_general_ci ;
//修改字符
ALTER TABLE `cSessionInfo ` CHANGE `open_id` `open_id` CHAR( 100 ) CHARACTER
set utf8mb4 COLLATE utf8mb4_general_ci ;
ALTER TABLE `你的表名` DEFAULT CHARACTER set utf8mb4 COLLATE utf8mb4_general_ci ;
ALTER TABLE `books` CHANGE `id ` `id ` CHAR( 100 ) CHARACTER
set utf8mb4 COLLATE utf8mb4_general_ci ;
ALTER TABLE `cSessionInfo ` CHANGE `openid` `openid` CHAR( 100 ) CHARACTER
set utf8mb4 COLLATE utf8mb4_general_ci ;
ALTER TABLE `books` CHANGE `openid ` `openid ` CHAR( 100 ) CHARACTER
set utf8mb4 COLLATE utf8mb4_general_ci ;
新建server/controllers/addbook.js
// 新增图书
// 入库
// https://api.douban.com/v2/book/isbn/9787505735446
const https = require('https')
module.exports = async (ctx) => {
// ctx.state.data = {
// msg: 'hello 小程序后台2ddd2'
// }
const {isbn, openid} = ctx.request.body
if (isbn && openid) {
const url = 'https://api.douban.com/v2/book/isbn/' + isbn
// 获取数据
const bookinfo = await getJSON(url)
console.log(bookinfo)
const rate = bookinfo.rating.average
const { title, images, alt, publisher, summary, price } = bookinfo
const tags = bookinfo.tags.map(v => {
return `${v.title} ${v.count}`
}).join(',')
const author = bookinfo.author.join(',')
console.log({
rate, title, images, alt, publisher, summary, price, tags, author
})
}
}
// 获取图书信息
function getJSON (url) {
return new Promise((reslove, reject) => {
https.get(url, res => {
let urlDate = ''
res.on('data', data => {
urlDate += data
})
res.on('end', data => {
const bookInfo = JSON.parse(urlDate)
if (bookInfo.title) {
reslove(bookInfo)
}
reject(bookInfo)
})
})
})
}
server/routes/index.js添加路由
router.post('/addbook', controllers.addbook)
server/tools/snail.sql
-- 新建表
-- primary 主键
create table books(
id int not null auto_increment primary key,
isbn varchar(20) not null,
openid varchar(50) not null,
title varchar(100) not null,
image varchar(100),
alt varchar(100) not null,
publisher varchar(100) not null,
summary varchar(100) not null,
price varchar(100),
rate float,
tags varchar(100),
author varchar(100)
)
在mysql命令行输入
create table books(
id int not null auto_increment primary key,
isbn varchar(20) not null,
openid varchar(50) not null,
title varchar(100) not null,
image varchar(100),
alt varchar(100) not null,
publisher varchar(100) not null,
summary varchar(100) not null,
price varchar(100),
rate float,
tags varchar(100),
author varchar(100)
);
查看描述
// 入库
导入mysql
const {mysql} = require('../qcloud')
try {
await mysql('books').insert({
isbn, openid, rate, title, image, alt, publisher, summary, price, tags, author
})
ctx.state.data = {
title,
msg: 'sussess'
}
} catch (e) {
ctx.state.data = {
code: -1,
msg: '新增失败' + e.sqlMessage
}
}
现在查询数据select title from books;是有重复的数据的
// 判断是否存在,存在的话就不存库
// if (isbn && openid) {
// const findRes = await mysql('books').select().where('isbn', isbn)
// if (findRes.length) {
// ctx.state = {
// code: -1,
// data: {
// msg: '图书已存在'
// }
// }
// return
// }
// }
实现图书列表接口
首先去server/router/index添加路由
router.get('/booklist', controllers.booklist)
★★☆☆
评分组件
<template>
<div class="rate">
<span>☆☆☆☆☆</span>
<div class="star ext-primary" :style = style>
★★★★★
</div>
</div>
</template>
<script>
export default {
props: {
value: {type: [Number, String], default: '0'}
},
computed: {
style () {
return `width:${this.value / 2}em`
}
}
}
</script>
<style lang="scss" scoped>
.rate{
position: relative;
display: inline-block;
.star{
position: absolute;
display: inline-block;
top: 0;
left: 0;
width: 0;
overflow: hidden;
}
}
</style>
小程序如何实现下拉刷新
wx.showNavigationBarLoading(Object object)在当前页面显示导航条加载动画
wx.stopPullDownRefresh(Object object)基础库 1.5.0 开始支持,低版本需做兼容处理。停止当前页面下拉刷新。
wx.hideNavigationBarLoading(Object object)在当前页面隐藏导航条加载动画
在当前页面新建books/json文件
{
"enablePullDownRefresh": true
}
vue文件里面
onPullDownRefresh: function (e) {
// wx.startPullDownRefresh()
this.getList()
console.log('下拉')
}
这样就实现了局部下拉刷新。
上拉加载
需要传递哪一页page过去
select character_set_name,collation_name from information_schema.columns where table_schema='cAuth' and table_name='cSessionInfo' and column_name ='open_id';
如何上线
开通正式环境
购买域名和机器,修改config部署线上环境
发起代码审核,坐等审核
1 拷贝开发域名
将配置项改为https://p9yyip6f.qcloud.la
2
修改数据库密码
七天以内可以向用户推送一次