微信登录后台
public function login()
{
//接收参数
$params =request()->param();
//获取openID
$url=sprintf(config('wx.url'),config('wx.AppID'),config('wx.AppSecret'),$params['code']);
$data=getUrl($url);
//查询openID是否存在
$user=User::where('openid',$data['openid'])->find();
// dd($user);
//判断是否为空
if (empty($user)){
//添加
User::create([
'openid'=>$data['openid']
]);
}
//生成标识
$key = "example_key";
$payload =[
'uid'=>$user['id']
];
$jwt=JWT::encode($payload,$key,'HS256');
return json(['code'=>200,'msg'=>'登录成功','token'=>$jwt]);
}
封装
return[
'AppID' =>'wxa1f79edf42175e02',//微信公众平台获取
'AppSecret' => '5e7b75c47168b51084e4b9f63ec78495',
'url' => 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code'
];
封装http请求
import {config} from '../config.js'
import Cache from '../utils/Cache';
const tips={
1: '抱歉,出现了一个未知错误',
}
class Http{
request(params) {
if (!params.method) {
params.method = 'GET'
}
wx.request({
url: config.api_base_url + params.url,
method: params.method,
data: params.data,
header: {
'token':Cache.get('token')
},
success: (res) => {
let code = res.statusCode.toString()
// 判断状态码是否以2开头
if (code.startsWith('2')) {
// 回调函数
params.success(res.data)
} else {
let error_code = res.data.error_code
this._show_error(error_code)
}
},
fail: (err) => {
this._show_error(1)
}
})
}
// 错误处理函数
_show_error(error_code) {
if (!error_code) {
error_code = 1
}
wx.showToast({
title: tips[error_code],
icon: 'none',
duration: 2000
})
}
}
export {
Http
}
config封装
const config={
api_base_url:"http://www.week.com/index.php/api/",
appkey: ''
}
export {config}
封装缓存
// 缓存类
class Cache {
// 构造方法 单位秒
constructor({ expire = 3600 }) {
// 成员属性 过期时间
// 毫秒
this.expire = new Date().getTime() + expire * 1000;
}
// 设置
set(key, value) {
let data = { expire: this.expire, value };
// 设置缓存
wx.setStorageSync(key, data);
}
// 永久
forever(key, value) {
let expire = new Date().getTime() + 9999999999 * 1000;
let data = { expire, value };
// 设置缓存
wx.setStorageSync(key, data);
}
// 判断是否存在缓存
has(key) {
// 获取当前时间
let time = new Date().getTime();
// 缓存数据
let data = wx.getStorageSync(key);
if (data != '') {
if (time > data.expire) { // 缓存过期
// 删除过期缓存
wx.removeStorageSync(key);
return false;
}
return true;
}
return false;
}
// 获取
get(key) {
if (this.has(key)) {
return wx.getStorageSync(key).value;
}
return null;
}
// 删除
del(key) {
wx.removeStorageSync(key);
}
}
// 导出 有效期1小时
export default new Cache({ expire: 3600 });
app.js
import {Http} from './utils/request.js'
import Cache from './utils/Cache.js';
let http = new Http()
App({
onLaunch() {
// 登录
wx.login({
success: res => {
http.request({
url: 'login',
data:{
code:res.code
},
success(ret){
Cache.set('token',ret.token)
}
})
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
},
globalData: {
userInfo: null
}
})
解决生产环境中遇到的大量计划任务维护难问题,所有计划任务可实现后台管理,
即时记录计划任务执行结束,执行失败的计划定时发送报警邮件通知,
后台维护的计划任务会在五分钟内生效,可定义计划任务的开始时间,结束时间,
执行间隔,执行次数,基于http协议的计划任务,大大提高计划任务的灵活性。
可以通过组播的方式进行集群间的共享,比如tomcat目前就具备这样的功能,
优点是web容器自身支持,
配置简单,适合小型网站
还可以利用NFS等一些共享存储来共享Session数据,
还可以利用Memcache来存储共享Session数据
getdate() 可取得日期时间信息
time() 函数可返回当前的 时间戳
mktime() 也可取得一个日期的 UNIX 时间戳
被static修饰的变量就是静态变量
静态变量,简单的说,就是一种在特定范围内一直存在的变量,
你可以把全局变量当作一种静态变量,它的值在代码运行期间一直存在。
双引号解释变量,单引号不解释变量
双引号解释转义字符,单引号不解释转义字符
单引号表示的是一个字符,双引号表示的是一个字符串
双引号能嵌套单引号,但单引号不能嵌套双引号