基于thinkphp开发的新闻管理后台和api接口开发

有了之前的教学管理基础,在这个基础上做了些优化,摇身一变,又变出了一个新闻管理系统,并且进行了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


猜你喜欢

转载自blog.csdn.net/dhywjx/article/details/80717239