layui Layui 自定义打印 # 基础应用 Layui 的 table 模块提供了基础的打印功能,能够满足大部分的基本打印需求。只需要两行简单代码,即可开启Layui table模块提供的打印功能: ```javascript layui.use('table', function() { const table = layui.table; table.render({ elem: '#default_table', ... toolbar: true, // 开启表格头部工具栏 defaultToolbar: ['filter', 'print'], // 指定工具栏内容为列配置,打印 cols: ... }) }) ``` 以上配置渲染的列表:  点击上图中1的按钮,可以选择只显示部分列表。  点击上图中的按钮2,Layui 构建一个新页面,仅包含内部的表格内容。  至此 Layui table 模块介绍的简单打印功能说明完毕。 # 扩展 Layui table的打印功能 在打印时,经常会要在打印的表格前面或后面增加一些统计信息或签名信息,而Layui table提供的打印功能不支持添加自定义信息。为了实现这个需求,我们需要修改 Layui table 的源码。 1. 首先从码云上下载 Layui 的源码 ``` git clone https://gitee.com/sentsin/layui.git ``` 2. 安装依赖 ``` yarn install ``` 3. 修改代码(增加start-end之间内容),修改思路为增加table打印参数,允许在初始化 table 时传入打印参数,自定义的打印参数最后介绍。 ```javascript 文件:src/lay/modules/table.js ... //默认配置 Class.prototype.config = { limit: 10 //每页显示的数量 ,loading: true //请求数据时,是否显示loading ,cellMinWidth: 60 //所有单元格默认最小宽度 ,defaultToolbar: ['filter', 'exports', 'print'] //工具栏右侧图标 ,autoSort: true //是否前端自动排序。如果否,则需自主排序(通常为服务端处理好排序) ,text: { none: '无数据' }, // start // 增加默认自定义打印参数 print: { func: undefined, preHtml: '', suffixHtml: '', } // end }; ... case 'LAYTABLE_PRINT': //打印 // start // 若自定义打印函数存在,则直接调用 if ((typeof options.print.func) === 'function') { options.print.func(that); break; } // end var printWin = window.open('打印窗口', '_blank') ,style = [''].join('') ,html = $(that.layHeader.html()); //输出表头 html.append(that.layMain.find('table').html()); //输出表体 html.append(that.layTotal.find('table').html()) //输出合计行 html.find('th.layui-table-patch').remove(); //移除补丁 html.find('.layui-table-col-special').remove(); //移除特殊列 // start // 若配置打印表格头部信息,则拼接 if (options.print.preHtml) { html.prepend(options.print.preHtml instanceof $ ? options.print.preHtml.html() : options.print.preHtml); } // 若配置打印表格后部信息,则拼接 if (options.print.suffixHtml) { html.prepend(options.print.suffixHtml instanceof $ ? options.print.suffixHtml.html() : options.print.suffixHtml); } // end printWin.document.write(style + html.prop('outerHTML')); printWin.document.close(); printWin.print(); printWin.close(); break; } ``` 4. 打包构建 ``` gulp ``` 你可以在 `release/zip/layui-v2.5.6/layui/lay/modules` 文件夹下找到新构建的 `table.js`。你可以使用此文档替换掉你所使用的 `table.js`。若你使用的是 `layui.all.js`,而不是模块化的引用方式,则可以使用 `release/zip/layui-v2.5.6/layui` 文件夹下的 `layui.all.js`。 若你不熟悉构建流程,或不想操作这么麻烦,可以直接使用我打包好的文件。下面这个压缩包里包含了魔改后的`table.js`和`layui.all.js`[print.zip](https://chenlijun.com/usr/uploads/2020/11/3642218465.zip) 5. 参数说明 以上修改为table的基本参数追加以下参数 | 参数 | 类型 | 说明 | 默认值 | | ------------ | ------------ | ------------ | ------------ | | print | Object | 打印参数配置对象 | {func: undefined,preHtml: '',suffixHtml: ''} | | print.func | Function | 自定义的打印函数,若配置此参数,则会替换掉Layui的打印行为 | undefined | | print.preHtml | String/JqueryObject | 表格前面的内容,可以是html字符串,也可以是$(selector)返回的jquery对象。因为打印页面的css样式传导比较麻烦,建议要打印的头部内容的样式采用行内样式(即style=""的形式) | '' | | print.suffixHtml | String/JqueryObject | 表格后面的内容,与print.preHtml仅位置不同 | '' | 如果你只需要在表格前后追加一些统计信息和签名信息,则使用print.preHtml和print.SuffixHtml即够使用,否则,你需要使用print.func模仿 layui的打印方式,完全自定义重写打印方法,为简化代码,调用print.func时传入了table的上下文this,你可以通过他引用layHeader,layMain和layTotal等内容。 # 打印统计页面 有时候可能要打印页面内容,如统计页。而这种打印与layui无关。但打印时,管理后台页面的菜单等内容往往是不需要打印的,但直接调用浏览器的打印功能,又会把这些打出来。 这时候就可以使用css的媒体查询符,在打印时隐藏不需要打印的内容,如: ```css @media print { .layui-header {display:none} .layui-side {display:none} .layui-footer {display:none} } ``` 以上样式仅提供一个思路,具体实现需要自己想哦。 阅读全文 2020-11-23 dogify 3 条评论 24178 次浏览
默认分类 manjaro 滚动升级20.0.3后 electron-ssr 无法启动 # 问题描述 今天,我随手滚动升级了一下我的 manjaro,也就是从 20.0.2 升级到了 20.0.3,结果我的 electron-ssr 就无法启动了,运行程序后,它的启动框一闪而过,一如从未来过。 于是,我用命令行运行了下它,结果他打印了如下错误: ``` electron4: error while loading shared libraries: libre2.so.7: cannot open shared object file: No such file or directory ``` 于是我就开始查了,查了一圈,并没有完全一样的错误场景,提出的修复方案感觉与我的问题也不搭嘎。经过了十分钟的挣扎后,我开始了自我救赎之路。 首先,根据报错信息,搜索系统中是否存在 libre.so 之类的文件,为了避免漏查,名字不输全,采用模糊搜索。 ```bash [dogify@dogify-pc ~]$ sudo find / -name libre2* /usr/lib/libre2.so /usr/lib/libre2.so.8.0.0 /usr/lib/libre2.so.8 find: ‘/run/user/1000/doc’: 权限不够 find: ‘/run/user/1000/gvfs’: 权限不够 ``` 根据搜索结果可知,系统中并不存在 `libre2.so.7` 的文件,但存在 `libre2.so`,`libre2.so.8.0.0` 和 `libre2.so.8`。 猜测是因为系统升级时,把这个依赖库给同步升级了,而 electron4 依赖的版本号是7。而运行时找不到版本号为 7 的运行库,导致报错。 ## 解决方案一: 1. 找到 electron-ssr 的执行文件 ``` [dogify@dogify-pc ~]$ whereis electron-ssr electron-ssr: /usr/bin/electron-ssr /usr/share/electron-ssr ``` 1. 查看其使用的 electron 版本 ``` [dogify@dogify-pc ~]$ cat /usr/bin/electron-ssr #!/bin/bash exec electron4 /usr/share/electron-ssr/app.asar "$@" ``` 1. 将 `electron4` 改为 `electron6` 保存(因为我本地没有 5 的环境,所以就提到6) 1. 保存修改,再次运行,软件正常启动。 ## 解决方案二(未验证): 从网上下载 libre2.so.7 文件。 因为 linux 桌面版本太多,我找了一圈也没有找到为 manjaro 编译的 libre2.so.7 文件,且出于系统库统一版本的角度,我最终放弃了此方法。 ## 后续 在经过方案一的操作后,我的软件启动了,也可以正常的执行代理。但在我需要修改订阅地址时,我发现软件打开是白屏的,无法进行任何操作。 猜测大概是因为 electron-ssr 是基于electron4开发的,相对于现在,版本过于老旧,导致兼容性问题。解决办法估计要去获取其源码,做针对兼容性修改,重新编译发布。但是这超出了我的知识范围,且现阶段无此精力。最后我选择转战了 shadowscoks-qt5。 ## 后续的后续 经过我的查找,我发现了新的支持ssr订阅的linux客户端 -[qv2ray](https://github.com/Qv2ray/Qv2ray "qv2ray")。 v2ray 是一个协议簇,包含了之前很多的协议,比如ss、ssr等。 该软件同时支持 macos、linux和windows,经过简单的适用,完美符合我的需求。安装过程参考其文档介绍,在此记录下,你可以查看以下我的安装流程,也可以查看 [文档](https://qv2ray.net/ "文档")。 manjaro 可以直接通过包管理工具安装,还需要安装其依赖的v2ray-core。其他 linux 发行版可以使用其提供的 AppImage封装包。 安装完成后,还需要下载配套的ssr插件,使软件支持ssr功能。请根据系统版本下载对应的插件文件,linux和macos下载so文件,windows下载dll文件,置于软件的plugins目录下。插件目录可以通过点击软件页面上的插件-打开本地插件目录按钮打开。  插件拷贝进插件目录后,重启软件,正常情况下你会看到如上图提示的插件已加载页面。 然后添加订阅信息,点击分组,打开以下页面。  1. 随便填个分组名 1. 选择订阅设置标签页,勾选此分组是一个订阅 1. 填写你的订阅地址,点击下方的更新订阅 1. 更新完成后就获得了所有节点 1. 关闭对话框,开始使用 正常配置的情况下,你可以在软件主页面左侧看到订阅的分组,双击该分组可以看到所有的订阅节点,右键节点可以连接此节点。  阅读全文 2020-07-18 dogify 4 条评论 7246 次浏览
Laravel laravel 定时任务生成root权限日志导致应用崩溃 # 问题 开发一个培训报名系统,需要定时关闭订单,发送上课通知等操作,于是接入了 Laravel 的定时任务。但实际运行时,出现 Laravel 无权限写入日志问题,导致应用异常崩溃的问题。 # 原因 服务器采用的是 linux,Laravel 定时任务是直接以 root 用户的身份执行的,而定时任务执行时创建了新日志文件,新文件的权限是 `-rw-r--r-- 1 root root`,这样的权限配置使得正常运行项目的 www 用户无法写入此日志文件,导致错误。 # 解决方法 经过多方查询,最后采用命令 `sudo crontab -u www -e` 以 www 用户身份配置定时任务解决问题。 阅读全文 2020-05-27 dogify 0 条评论 7874 次浏览
Laravel Laravel 利用 doctrine/annotations 在注解中实现角色权限控制 [TOC] ## 基本术语 项目中基于常见的角色和权限方式实现权限控制,下面介绍一些术语。 - 用户 - 登录使用系统的自然人 - 角色 - 系统中用户的身份,比如管理员,普通用户,不同的角色权限不同,同一用户可以有任意多个角色 - 权限 - 用户行为,具体为做某件事的能力,有权限即能做此事。一个角色可以有任意项权限,拥有多个角色的用户即拥有这些所有权限的并集。 ## 简单用法 本文实现的权限控制只要是针对API进行权限控制,控制力度分3级。具体的实现方法是在控制器的方法注释中添加注解。注解会在 Laravel 的中间件中被读取,然后判断是否有权限。没有权限则会返回统一的报错。 阅读全文 2020-05-09 dogify 2 条评论 6162 次浏览
php php获取3天内生日人员 # 需求 项目中遇到需要显示3天内生日的人员的需求,查了一波资料,在此作个记录,方便以后查询。 # BiuBiuBiu 数据库中人员信息字段如下所示 | name | birthday | | ------------ | ------------ | | 张三 | 1991-04-19 | | 李四 | 1992-04-20 | | 王五 | 1993-04-21 | | 赵六 | 1994-04-22 | | 孙七 | 1994-04-23 | 假定今日为2020-04-20,我们期望返回生日在04-20到04-22的人员。月和日的判断比较好处理,但是每个人出生的年是不一样的,无法简单的筛选某3天就返回结果。 好在,mysql 提供了类似php格式化日期格式的函数 [`DATE_FORMAT(date,format)`](https://www.w3school.com.cn/sql/func_date_format.asp "`DATE_FORMAT(date,format)`"),第一个参数是要格式化的列名,第二个参数是格式字符串。 以下 SQL 可以将年份统一为2020,且保留日月信息。 `SELECT name,birthday, DATE_FORMAT(birthday, "2020-%m-%d") as format_birthday FROM users` | name | birthday | format_birthday| | ------------ | ------------ | ------ | | 张三 | 1991-04-19 | 2020-04-19 | | 李四 | 1992-04-20 | 2020-04-20 | | 王五 | 1993-04-21 | 2020-04-21 | | 赵六 | 1994-04-22 | 2020-04-22 | | 孙七 | 1994-04-23 | 2020-04-23 | 剩下的问题就很简单了,只要format_birthday在2020-04-20与2020-04-22之间的人就很简单了。 以下是 Laravel 中通过模型查询的代码: ```php $year = date('Y'); User::whereBetween(DB::raw("date_format(birthday, '{$year}-%m-%d')"), [Carbon::now()->toDateString(), Carbon::parse("+3 days")->toDateString()] )->get(); ``` 阅读全文 2020-04-18 dogify 0 条评论 4320 次浏览