分类 laravel 下的文章

API下载 组装的 word 文档


Word文档生成有很多种方式,图简单,其实可以就按html排版,一键导出
网页直接导出,记得加上导出word约束的头($fileName,导出的文件名)

header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$fileName");

这种导出呢,样式和原生网页是有点问题,但注意单位和尺寸,就没有多大问题了,具体的要自己尝试

但现在的开发,基本上都是前后端分离,API方式调用,那怎么实现呢?

同样是调用地址就OK了吗?
不是的,直接调用网页的地址,发现没有反应,第一反应是不是API头部约束了什么,导致了不能直接下载原格式的word文档

琢磨了好久,没有成功,我换了一种思路,先把word文档保存起来,返回文档下载路径给API
期间我请求了一下API,居然可以正常返回了,但只是html代码,情况是我在准备保存word文档到本地的时候,去掉了头部约束,是header的影响

那能正常返回就好办了,两种方式
第一种,就是直接保存为word文档下载。
第二种,正常返回后,转为word文档保存。
第一种没有什么可谈的,容易理解也好办
第二种以Axios为例

function apiRequestDownload(url, filename, type, formData, config = {}) {
    return new Promise((resolve, reject) => {
        Axios({ url, responseType: "blob", method: type, data: formData,config })
            .then(result => {
                let fileURL = window.URL.createObjectURL(
                    new Blob([result.data], { type: '' })
                );
                let fileLink = document.createElement("a");

                fileLink.href = fileURL;
                fileLink.setAttribute("download", filename);
                document.body.appendChild(fileLink);

                fileLink.click();
                resolve(result);
            })
            .catch(err => {
                reject(err);
            });
    });
}

网站上线与迁移踩坑日志 class memcached not found


源起于,阿里云服务器快到期了,考虑服务器已运行多年,需要更新维护一下,再考虑续费费用问题,决定重新购买,进行项目的整体无差别移植。
看是简单的一件事,还是挺折磨人的。

1.首先要登录服务器吧,这里要注意,购买成功后,服务器没有设置密码,需要到控制台<重置实例密码>修改密码,其实就是设置密码,再进行登录。

2.进行软件安装,这里千万要注意了,要开启相应的端口,在控制台,服务器实例里面的安全组列表

这里的协议类型一般都是TCP,目的就是需要开启的端口段,如只开放8080就写8080/8080 ,授权对象就是指定可访问此端口的IP地址,若任意IP可以访问,则填写0.0.0.0/0

成功踩坑:阿里云没有默认开启80端口
问题是这样的,我最后上线了代码,发现只有SSL网站才可以正常访问。我是这样考虑的:以为是文件权限的问题,SSL比较安全嘛,文件权限高应该也可以正常访问。没有SSL的可能要放低权限,我就这样,就一直在权限上徘徊,一直报不能访问,ping又是可以ping通的,真是奇怪了。后面实在放心不下,再去看一看阿里云是不是默认就没有开启80端口。最后差点吐血,还真是这样的。
3.这些都可以了,上线laravel lumen项目时,可把我愁坏了,可以正常访问,但就是有错。
3.1这里要注意一点,是文件权限问题,linux系统对文件、目录权限敏感。由于lumen 要写运行日志,要把storage目录设置为www 的可写文件。由于laravel 直接访问public ,也要把public 放开www权限。
3.2配置这些你觉得应该是可以了,但告诉你,不是这样的,还早着呢。
你会发现,访问老是出错,什么错能,找不到相关数据库
成功踩坑:记得要加载env文件
踩坑开始,以为是数据库没有正确导入,数据库名称,用户名、密码没有填写正确,我还删除数据库,从新创建了两次,也特别对了.env文件多次。不是的,这些都是徒劳。
踩坑继续,后续突然发现,报错为,始终为找到forge用户,我思考再三,突然恍悟,我压根没有配置此用户呀!那什么情况会导致这样的情况发生呢,应该是默认配置文件,我全局搜一下DB_USERNAME,还真是的,在库文件vendorlaravellumen-frameworkconfigdatabase.php下,有这样的默认配置,forge用户就是在这的。
'mysql' => [

 'driver'    => 'mysql',
 'host'      => env('DB_HOST', 'localhost'),
 'port'      => env('DB_PORT', 3306),
 'database'  => env('DB_DATABASE', 'forge'),
 'username'  => env('DB_USERNAME', 'forge'),
 'password'  => env('DB_PASSWORD', ''),
 'charset'   => env('DB_CHARSET', 'utf8'),
 'collation' => env('DB_COLLATION', 'utf8_unicode_ci'),
 'prefix'    => env('DB_PREFIX', ''),
 'timezone'  => env('DB_TIMEZONE', '+00:00'),
 'strict'    => env('DB_STRICT_MODE', false),

],
百度查一下 结果是要清理缓存,语句是 php artisan config:clear 或直接php artisan clear。运行呢,报错误了。

咋!这怎么可能,还好我第一次丢过代码,否则只有继续踩坑了。如果你不知道,那你肯定会继续搜索,则出现的情况,好多同胞会热心回复你,安装memcached,咋咋的。这可不得了,问题就多了。
后续我才想到,应该是php配置文件不能正常加载env文件了。去php配置文件看一下,还真禁用了getenv方法,或putenv,放开就OK 了

关系到问题,服务器迁移应该选择再服务器用户不用的时间段,而且使用备用域名进行生产测试。必要时加上代码强制更新手段,发现Chrome浏览器缓存太严重,切换DNS后,浏览器反应总是迟钝,强制性刷新也不起作用。

可能关系到的语句
一台服务器进入另外一台服务器ssh root@ip地址
数据库备份 mysqldump -hlocalhost -uroot -p 需备份的数据库 > /... 备份位置
远程拷贝 scp -r root@IP地址:/远程地址 /现地址
编辑文件 vi .env 保存退出 :wq 不保存退出 :q! 未修改直接退出 :q
查找文件 find / -name 查找内容 /代表从跟目录开始查找
重启服务器 reboot
重启Apache service httpd start 或 stop | restart
查找进程 ps -ef | grep 进程名 杀死进程 kill -9 某进程


laravel 打开debug也不报明细错误,只报500错误


larave 你可能遇到过这样的问题,线下运行时没有错误的,拿到网上去就不可以了

就报个服务器500错误,其他什么也没有报,对,你就是从本地拿上去的

你可能开始各种怀疑,是不是APP_KEY没有更新呀,是不是vender没有上传完整呀,是不是少传了什么呀!

告诉你,这些应该都不是

遇到这样的问题,你可以去看一下storage 下的 logs文件,是不是不能正常的写入,就是是不是权限不够

还要一个framework文件也一样,但只要把logs文件权限放开就有错误提示了,神不神奇,对你惊不惊喜,意不意外,反正我是纠结了好一会才找到


lumen 添加用户访问权限 ,根据用户类型来


laravel 有一套严谨的用户权限管理,在这就不讨论了,比较难缕

对于一些简单的,这一套好像有点太过了点,比如我就明确的分个端,同一个端访问的内容是一样的,其实我只需要把路由分一下就OK了,不需要太多处理。

那怎样办呢?

先去看一下中间件

https://learnku.com/docs/lumen/5.7/middleware/2405

看完就知道中间件的作用了,其实就是把路由分三组,每组中间不同,不同的用户判断规则,就OK了

P如我的加入了Auth认证,是这样控制的

public function handle($request, Closure $next, $guard = null)
    {
        $user = $this->auth->guard()->user();
        if (@$user[' *_token'] != ' *** ') {
            $control = new Controller();
            return $control->error('授权未通过!请重新登录',401);
        }

        return $next($request);
    }

其他的定义中间件和路由怎样去实现呢?
P如:定义了两个中间件(bootstrap/app.hph)

'hcwAuth' => App\Http\Middleware\HcwAuthenticate::class,
'hcbAuth' => App\Http\Middleware\HcbAuthenticate::class,

路由分配:路由分组

$router->group(['middleware' => 'hcwAuth'],function () use ($router){
    $router->get('welcome', 'HomeController@index');
});
$router->group(['middleware' => 'hcbAuth'],function () use ($router){
    $router->get('welcome', 'HomeBoosController@index');
});