有了之前的教学管理基础,在这个基础上做了些优化,摇身一变,又变出了一个新闻管理系统,并且进行了api接口的相关开发。首先可以利用之前学的搭出基本样式如:
在这里对验证码的使用进行了优化。
/**
* 设置验证码
*
* 参数 描述 默认
* codeSet 验证码字符集合 略
* expire 验证码过期时间(s) 1800
* useZh 使用中文验证码 false
* zhSet 中文验证码字符串 略
* useImgBg 使用背景图片 false
* fontSize 验证码字体大小(px) 25
* useCurve 是否画混淆曲线 true
* useNoise 是否添加杂点 true
* imageH 验证码图片高度,设置为0为自动计算 0
* imageW 验证码图片宽度,设置为0为自动计算 0
* length 验证码位数 5
* fontttf 验证码字体,不设置是随机获取 空
* bg 背景颜色 [243, 251, 254]
* reset 验证成功后是否重置 true
* @return \think\Response
*/
public function show_captcha()
{
$captcha = new Captcha();
$captcha->fontSize = 25;
$captcha->length = 4;
$captcha->imageH = 0;
$captcha->imageW = 0;
$captcha->expire = 30;
$captcha->useNoise = true;
$captcha->reset = true;
return $captcha->entry();
}
一、图片上传
图片的上传有两种方式,1、上传到本地服务器;2、上传到七牛云服务器;这两种方法网上都有教程;这里展示下上传到七牛云的代码:
/**
* 图片上传类库
* @return null|string
*/
public static function image()
{
if (empty($_FILES['file']['tmp_name'])) {
exception('您提交的图片数据不合法', 404);
}
$file = $_FILES['file']['tmp_name'];
$ext = pathinfo($_FILES['file']['name']);
$ext = $ext['extension'];
$auth = new Auth('ak的值', 'sk的值');
$token = $auth->uploadToken('bucket的值');
$key = date('Y') . "/" . date('m') . "/" . substr(md5($file), 0, 5) . date('YmdHis') . rand(0, 9999) . "." . $ext;
$uploadMgr = new UploadManager();
list($res,$err) = $uploadMgr->putFile($token, $key, $file);
if ($err != null) {
return null;
} else {
return $key;
}
}
二、layui的分页
在之前的教学管理系统中主要是使用自带的分页功能,而在这个系统中,主要是使用了layui的分页功能:
文档参考:http://www.layui.com/doc/modules/laypage.html
相关代码:
//layui分页功能的调用
layui.use(['laypage','layer'],function () {
var laypage = layui.laypage;
var layer = layui.layer;
var url = "{:url('admin/news/index')}" + "?{$query}";
laypage.render({
elem: 'laypage'
,count: '{$total}'
,limit: '{$size}'
, theme: '#1E9FFF'
,curr : '{$curr}'
,layout: ['prev', 'page', 'next', 'skip']
,jump: function(e, first){ //触发分页后的回调
if(!first){ //一定要加此判断,否则初始时会无限刷新
location.href = url + '&page='+e.curr;
}
}
});
});
三、AES加密
附上相关的类库,首先需要在自定义配置文件中写入AES的加密解密的密钥:
class Aes
{
private $key = null;
/**
* 构造方法获取 key
* Aes constructor.
*/
public function __construct() {
$this->key = config("app.aes_key");
}
/**
* 加密
* @param String input 加密的字符串
* @param String key 解密的key
* @return HexString
*/
public function encrypt($input = '') {
if(config('app_debug')) {
$iv=substr($this->key,0,16);
}else{
$iv=openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
}
$data=openssl_encrypt($input, "aes-256-cbc", $this->key, 0, $iv);
return base64_encode($iv.$data);
}
/**
* 解密
* @param String input 解密的字符串
* @param String key 解密的key
* @return String
*/
public function decrypt($input) {
$input=base64_decode($input);
$iv=substr($input,0,16);
$data=substr($input,16);
$return=openssl_decrypt($data, "aes-256-cbc", $this->key, 0, $iv);
return $return;
}
}
对一些重要的信息可以进行加密生成sign和解密;主要是验证信息的真实性,主要是服务端和客户端共同完成,客户端负责加密,服务端进行解密,验证传来信息的正确性。比如对手机的型号、用户名进行加密生成sign当服务端解密后与传入的手机型号和用户名进行比较,判断是否正确。同时还应该对sign设置过期时间。当超出时效时,应当不予返回信息;
服务端通过AES解密获取数据,有了这个逻辑就可以进行编写了。
四、性能优化
在编写api接口时,同数据库查询一样,尽量不要使用select *这样的语句,需要用到什么就查什么,就新闻接口开发来说,新闻有自己详细的内容,只有当用户查看详细内容时才需要显示,一般情况下内容所占的篇幅较大,在列出所有新闻时,可以先不查询,提示查询的效率;
五、restful api
使用方法:(:ver是版本号以便于版本升级)
Route::resource('api/:ver/news', 'api/:ver.news');
相关参考文档可以看:https://www.kancloud.cn/manual/thinkphp5/118035