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

有了之前的教学管理基础,在这个基础上做了些优化,摇身一变,又变出了一个新闻管理系统,并且进行了api接口的相关开发。首先可以利用之前学的搭出基本样式如:

在这里对验证码的使用进行了优化。

/** %20%20%20%20%20*%20设置验证码 %20%20%20%20%20* %20%20%20%20%20*%20参数 %20%20%20%20%20%20%20%20描述 %20%20%20%20默认 %20%20%20%20%20*%20codeSet 验证码字符集合 略 %20%20%20%20%20*%20expire 验证码过期时间(s) 1800 %20%20%20%20%20*%20useZh 使用中文验证码 false %20%20%20%20%20*%20zhSet 中文验证码字符串 略 %20%20%20%20%20*%20useImgBg 使用背景图片 false %20%20%20%20%20*%20fontSize 验证码字体大小(px) 25 %20%20%20%20%20*%20useCurve 是否画混淆曲线 true %20%20%20%20%20*%20useNoise 是否添加杂点 true %20%20%20%20%20*%20imageH 验证码图片高度,设置为0为自动计算 0 %20%20%20%20%20*%20imageW 验证码图片宽度,设置为0为自动计算 0 %20%20%20%20%20*%20length 验证码位数 5 %20%20%20%20%20*%20fontttf 验证码字体,不设置是随机获取 空 %20%20%20%20%20*%20bg 背景颜色 [243,%20251,%20254] %20%20%20%20%20*%20reset 验证成功后是否重置 true %20%20%20%20%20*%[email protected]%20\think\Response %20%20%20%20%20*/ %20%20%20%20public%20function%20show_captcha() %20%20%20%20{ %20%20%20%20%20%20%20%20$captcha%20=%20new%20Captcha(); %20%20%20%20%20%20%20%20$captcha->fontSize%20=%2025; %20%20%20%20%20%20%20%20$captcha->length%20=%204; %20%20%20%20%20%20%20%20$captcha->imageH%20=%200; %20%20%20%20%20%20%20%20$captcha->imageW%20=%200; %20%20%20%20%20%20%20%20$captcha->expire%20=%2030; %20%20%20%20%20%20%20%20$captcha->useNoise%20=%20true; %20%20%20%20%20%20%20%20$captcha->reset%20=%20true; %20%20%20%20%20%20%20%20return%20$captcha->entry(); %20%20%20%20}

一、图片上传

图片的上传有两种方式,1、上传到本地服务器;2、上传到七牛云服务器;这两种方法网上都有教程;这里展示下上传到七牛云的代码:

/** %20*%20图片上传类库 %20*%[email protected]%20null|string %20*/ public%20static%20function%20image() { %20%20%20%20if%20(empty($_FILES['file']['tmp_name']))%20{ %20%20%20%20%20%20%20%20exception('您提交的图片数据不合法',%20404); %20%20%20%20} %20%20%20%20$file%20=%20$_FILES['file']['tmp_name']; %20%20%20%20$ext%20=%20pathinfo($_FILES['file']['name']); %20%20%20%20$ext%20=%20$ext['extension']; %20%20%20%20 %20%20%20%20$auth%20=%20new%20Auth('ak的值',%20'sk的值'); %20%20%20%20$token%20=%20$auth->uploadToken('bucket的值'); %20%20%20%20$key%20=%20date('Y')%20.%20"/"%20.%20date('m')%20.%20"/"%20.%20substr(md5($file),%200,%205)%20.%20date('YmdHis')%20.%20rand(0,%209999)%20.%20"."%20.%20$ext; %20%20%20%20$uploadMgr%20=%20new%20UploadManager(); %20%20%20%20list($res,$err)%20=%20$uploadMgr->putFile($token,%20$key,%20$file); %20%20%20%20if%20($err%20!=%20null)%20{ %20%20%20%20%20%20%20%20return%20null; %20%20%20%20}%20else%20{ %20%20%20%20%20%20%20%20return%20$key; %20%20%20%20} }

二、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


文章来源: 基于thinkphp开发的新闻管理后台和api接口开发

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:基于thinkphp开发的新闻管理后台和api接口开发