eggjs配置mysql数据库
npm i egg-mysql --save
mysql:{
enable: true,
package: 'egg-mysql',
},
config.mysql={
client: {
// host
host: '127.0.0.1',
// 端口号
port: '3306',
// 用户名
user: 'root',
// 密码
password: 'root',
// 数据库名
database: 'nideshop',
},
// 是否加载到 app 上,默认开启
app: true,
// 是否加载到 agent 上,默认关闭
agent: false,
}
egg.js的调试技巧
1 怎么查询错误
停掉数据库配置 报错
2 关于运行egg的技巧
npm run start 命令 正式上线(production)的时候我们才会npm run start
egg-scripts start --daemon --title=egg-server-project
配置端口号
config.cluster = {
listen: {
path: '',
port: 7002,
hostname: '0.0.0.0',
}
}
npm run stop
停止start
测试的时候怎么办?
npm run dev
配置跨域
说明: 跨域主要有两种,一种是前端代理跨域,一种后端跨域
1 前端代理配置跨域
2 后端跨域
egg.js跨域
npm/cnpm install egg-cors --save
- 在egg项目中 config/plugins.js 添加以下配置
cors: {
enable: true,
package: 'egg-cors'
}
- 在egg项目中 config/config.default.js 添加以下配置
module.exports = {
const config = exports = {}
config.security = {
csrf: {
enable: false,
ignoreJSON: true
},
domainWhiteList: [ '*' ], // 白名单
};
config.cors = {
origin: '*', // 如果不写origin则会按照白名单中的域名允许跨域, * 代表允许所有的域名进行跨域请求
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
}
}
express跨域
egg.js解决跨域egg-cors的本质还是来自于设置跨域header头
//设置跨域访问
app.all('*', (req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
分页
sql
select *from 表名 limit 0,10;
select *from nideshop_goods limit 20,10;
select count(*) from nideshop_goods;
邮件
npm install nodemailer --save
短信(阿里云短信平台)
npm install @alicloud/sms-sdk --save
上传
如果想要用hbuilderx去运行微信小程序开发者端,需要安全的端口
设置》通用设置》安全》服务端口
1 普通上传
1.1 egg上传
普通上传
2 express上传
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<h3>文件上传:</h3>
选择一个文件上传: <br />
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="content" />
<br />
<input type="submit" value="上传文件" />
</form>
</body>
</html>
后端代码
var fs = require('fs');
var express = require('express');
var multer = require('multer');
var router = express.Router();
var upload = multer({dest: 'upload_tmp/'});
router.post('/', upload.any(), function(req, res, next) {
console.log(req.files[0]); // 上传的文件信息
var des_file = "./upload/" + req.files[0].originalname;
fs.readFile( req.files[0].path, function (err, data) {
fs.writeFile(des_file, data, function (err) {
if( err ){
console.log( err );
}else{
response = {
message:'File uploaded successfully',
filename:req.files[0].originalname
};
console.log( response );
res.end( JSON.stringify( response ) );
}
});
});
});
module.exports = router;
2 阿里云oss上传
为了节省服务器的空间 , 占带宽,思考:为了解决这个带宽问题
阿里云和七牛云提供一种服务, 叫对象存储oss
appid: LTAIC6ZMDHPvtv5K
appsecret: TsCBZKXlybXggr900DGqtLeN2QB17J
安装阿里oss上传相关的工具
npm install ali-oss -D
调试代码的技巧 要用外网的IP地址
ipconfig
android和微信小程序用本地127.0.0.1是不行的,需要用对外网的
3 base64图片上传
有些时候上传的图片是base64的图片,需要大家用js将原本的文件转成base64的图片, 前端的文件转成base64上传
引入自:https://www.cnblogs.com/juehai/p/9706141.html
后端:
app.post('/upload', function(req, res){
//接收前台POST过来的base64
var imgData = req.body.imgData;
//过滤data:URL
var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = new Buffer(base64Data, 'base64');
fs.writeFile("image.png", dataBuffer, function(err) {
if(err){
res.send(err);
}else{
res.send("保存成功!");
}
});
});
excel数据的读取
const Excel = require('exceljs');
excel的导入和导出
引自: https://www.jianshu.com/p/0f6a338c54f4
依赖库引入
const fs = require('fs')
const Excel = require('exceljs')
初始化Excel
const workbook = new Excel.Workbook()
workbook.creator = 'test'
workbook.lastModifiedBy = 'test'
workbook.created = new Date()
workbook.modified = new Date()
生成一个工作表
let sheet = workbook.addWorksheet('2018-10报表')
# Add column headers and define column keys and widths
sheet.columns = [
{header: '创建日期', key: 'create_time', width: 15},
{header: '单号', key: 'id', width: 15},
{header: '电话号码', key: 'phone', width: 15},
{header: '地址', key: 'address', width: 15}
]
const data = [{
create_time: '2018-10-01',
id: '787818992109210',
phone: '11111111111',
address: '深圳市'
}]
# Add an array of rows
sheet.addRows(data)
生成excel文件
return await workbook.xlsx.writeFile('attachement/用户报表.xlsx').then( async () => {
this.ctx.attachment(`用户报表.xlsx`)
this.ctx.type = '.xlsx'
this.ctx.body = fs.readFileSync(filePath)
}, function (err: any) {
console.log(err)
})
QQ第三方登录 微信第三方登录
在微信小程序开发者工具中,项目中的mainfest.json有App模块配置中有OAuth(登录鉴权),可以打开qq和微信的登录配置。
第一步 uniapp官网提供的文档
https://ask.dcloud.net.cn/article/192
第二步 找到qq第三方登录入口
https://connect.qq.com/index.html
腾讯官方提供的一些接口
https://wiki.connect.qq.com/api%E5%88%97%E8%A1%A8
腾讯官方提供的接口
https://wiki.connect.qq.com/js_sdk%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
单独的进行第三方登录静态页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script type="text/javascript" charset="utf-8"
src="http://connect.qq.com/qc_jssdk.js"
data-appid="101458871"
data-redirecturi="http://169.254.201.186:7002/callback"
></script>
</head>
<body>
<div>
<button id="qqLoginBtn">qq登录</button>
</div>
<script>
QC.Login({
btnId:"qqLoginBtn" //插入按钮的节点id
});
</script>
</body>
</html>
后端代码
async callback(){
const { ctx } = this;
//接收access_token
//console.log(location)
//console.log(JSON.stringify(ctx.query.access_token)+"--------------------")
//通过授权得到access_token 获取用户的openid
var access_token=ctx.query.access_token
var url="https://graph.qq.com/oauth2.0/me?access_token="+access_token
const result = await ctx.curl(url); //后端发送 http get请求
console.log(result.data.toString()) //callback( {"client_id":"101458871","openid":"BBB4A8B679A144168189DF4C27FA6132"} )
var call = result.data.toString()
var jsonz=JSON.parse(call.substring(9).substr(0,call.substring(9).indexOf(")")))
var clientid = jsonz.client_id
var openid = jsonz.openid
//再次再请求一次接口
var url="https://graph.qq.com/user/get_user_info?access_token="+access_token+"&oauth_consumer_key=101458871&openid="+openid
const res = await ctx.curl(url);
var user = res.data.toString()
console.log(user)
//将数据存储到数据库中
//var url="https://graph.qq.com/user/get_user_info?access_token="+access_token+"&openid=101458871"+"&oauth_consumer_key=12345"
//通过后端发送get post请求
var location = "<script>window.location.href='http://localhost:8080/#/</script>";
ctx.body = location ;
}
uniapp集成qq第三方登录的js-sdk的过程
1 在跟目录中新建一个index.html
2 需要配置
3 需要在
就已经在项目集成好了jssdk
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=101458871&response_type=token&scope=all&redirect_uri=http%3A%2F%2Fwww.jingkela.com%2Fqqlogin.php
可道云桌面
http://app.grfuwutong.com/kod/index.php?user/login
进入服务器端可道云 看到controllers 内包含所有的接口信息
账户密码
/www/wwwroot/app.grfuwutong.com/addons/zjhj_mall/core/modules/api/controllers/
客服系统
websocket的定义
阮一峰的教学日志: http://www.ruanyifeng.com/blog/2017/05/websocket.html
我的客服系统账号
http://kefu.jingkela.com/platform/passport/login.html
常用的第三方的客服系统,百度商桥,但是都要收费
基于nodeJS也有类似的客服系统(必须有redis内存数据库)
github: https://github.com/gytai/KeFu
使用 socket.io.js 实现 websocket 实时通讯
https://www.jianshu.com/p/725ff42c7af3
redis环境的搭建
小P面板
xxtea加密
XXTEA for Node.js
引入 https://github.com/xxtea/xxtea-nodejs/releases
var xxtea = require('xxtea-node');
var str = "Hello World! 你好,中国🇨🇳!";
var key = "1234567890";
var encrypt_data = xxtea.encryptToString(str, key);
console.log(encrypt_data);
var decrypt_data = xxtea.decryptToString(encrypt_data, key);
console.assert(str === decrypt_data);
微信公众号的开发
支付宝支付和微信支付
支付宝支付
微信支付
具体参见支付文档
egg.js集成微信微信支付 https://gitee.com/iteming/egg-wxpay/tree/master
抓包工具的使用
有没有另外一种办法,抓取数据包 , app跟服务器进行数据库 fiddler 抓包工具
wifi和手机相连 , 数据线跟手机相连
具体参照: https://www.cnblogs.com/yyhh/p/5140852.html
另外一个工具wireshark
常用的攻击的手段
sql注入
csrf
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,
XSS
跨站脚本攻击, 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
http和https的区别
1 理解域名解析的过程
2 http和https的概念
https微信小程序中必须要用的,接口必须是https , https相对于http更安全,防止流量劫持和篡改
3 怎么部署https
购买域名证书 SSL证书
关于部署https: https://blog.csdn.net/qq_29058883/article/details/81031660
总结: 购买免费的证书 - 部署到域名上 - 下载针对不同域名对应(NginxAapache)的证书 - 见证书部署线上
IPv4 全球有13台跟节点的DNS域名服务器
下表是这些机器的管理单位、设置地点及最新的IP地址:
名称 | 管理单位及设置地点 | IP地址 |
---|---|---|
A | INTERNIC.NET(美国,弗吉尼亚州) | 198.41.0.4 |
B | 美国信息科学研究所(美国,加利弗尼亚州) | 128.9.0.107 |
C | PSINet公司(美国,弗吉尼亚州) | 192.33.4.12 |
D | 马里兰大学(美国马里兰州) | 128.8.10.90 |
E | 美国航空航天管理局(美国加利弗尼亚州) | 192.203.230.10 |
F | 因特网软件联盟(美国加利弗尼亚州) | 192.5.5.241 |
G | 美国国防部网络信息中心(美国弗吉尼亚州) | 192.112.36.4 |
H | 美国陆军研究所(美国马里兰州) | 128.63.2.53 |
I | Autonomica公司(瑞典,斯德哥尔摩) | 192.36.148.17 |
J | VeriSign公司(美国,弗吉尼亚州) | 192.58.128.30 |
K | RIPE NCC(英国,伦敦) | 193.0.14.129 |
L | IANA(美国,弗吉尼亚州) | 198.32.64.12 |
M | WIDE Project(日本,东京) | 202.12.27.33 |
IPV6 国家有相应的预案
Restful接口
这是一种接口设计的理念
之前写接口的时候
域名?username=admin&password=123456
restful接口的规范 统一所有的接口一种写法 将接口全部都用 / 来去定义接口
域名 /username/admin/password/123456
参考:
阮一峰:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
restful接口
css3多出文字用省略号表示
https://blog.csdn.net/qq_39905409/article/details/109219766
怎么将markdown文件转成HTML
1 可以通过vscode的一个插件