有了之前的教学管理基础,在这个基础上做了些优化,摇身一变,又变出了一个新闻管理系统,并且进行了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
差点忘记说了,接口是使用restful api开发的,主要是在thinkphp中路由进行路由配置
使用方法:(:ver是版本号以便于版本升级)
Route::resource('api/:ver/news', 'api/:ver.news');
相关参考文档可以看:https://www.kancloud.cn/manual/thinkphp5/118035