yii2+elementUI2+uni-app使用小结
Posted sjg20010414
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yii2+elementUI2+uni-app使用小结相关的知识,希望对你有一定的参考价值。
yii2 应用与git设置
我们在 advanced 模板基础上多了 api 这个app
5个应用与目录结构
5个应用如下
- common 我实际使用的就是2个目录:config 和 models
- config
- bootstrap.php 这是启动时必须加载的,注意我们多了别名
@api
的设置Yii::setAlias('@api', dirname(dirname(__DIR__)).'/api');
- codeception-local.php、test.php、test-local.php 这几个测试用的,我没用
- params.php 中包含我使用的kartik组件用的图标框架和bootstrap版本配置
'icon-framework' => 'fa','bsVersion' => '4.x',
、params-local.php (我是空的) - main.php 是各个应用公用的配置(所谓公用配置,就是frontend和backend等都会加载这些配置):语言、时区、组件、模块等;main-local.php 也是各个应用公用的,带 -local 意思这个配置和本地环境有关,即开发时的环境和部署目标的环境不一样就不同,所以通常是公用的数据库组件配置
- bootstrap.php 这是启动时必须加载的,注意我们多了别名
- models
- 数据库表对应model,如 User.php
因为通常 User 模型类应用中都有,所以我偷懒把一些公用函数作为它的静态方法提供了
- 数据库表对应model,如 User.php
- config
/**
* 为指定文件名的文件生成完成路径
* @param string $fileName 将生成(或使用)的文件名
* @param string $subPath 相对于基础目录的子目录,默认为 upload/ 目录
* @param bool $absolute true = 文件系统绝对路径 false = 网络URL
* @param string $alias Yii2别名,用于生成基础目录,默认为 @webroot 应用文档根
* @return string|string[] 完整的路径文件名
*/
public static function getFilePath($fileName, $subPath = 'upload/', $absolute = false, $alias = '@webroot')
{
$absolutePath = Yii::getAlias($alias).'/'.$subPath.$fileName;
$_SERVER['DOCUMENT_ROOT'] = rtrim($_SERVER['DOCUMENT_ROOT'], '/\\\\');
return $absolute ? $absolutePath : str_replace($_SERVER['DOCUMENT_ROOT'], '', $absolutePath);
}
/**
* 为指定的已上传文件生成 img 标签
* @param $imageUrls string 按分隔符分隔的图像URL列表
* @param string $delimiter 分隔符
* @return string html文本,包含若干个 <img /> 标签
*/
public static function htmlImages($imageUrls, $delimiter = '|')
{
$html = '';
foreach (explode('|', $imageUrls) as $filename) {
if (!empty($filename)) {
$html .= Html::img(User::getFilePath($filename, 'upload/', false, '@web'),
['style' => 'width:auto;height:auto;max-width:100%;max-height:100%']);
}
}
return $html ? $html : '(无)<br>';
}
/**
* 从上传目录删除指定文件名的脏文件
* @param $fileNames array 文件名数组
*/
public static function deleteDirtyImages($fileNames)
{
foreach ($fileNames as $fileName) {
$fullPath = User::getFilePath($fileName, 'upload/', true);
@unlink($fullPath);
}
}
/**
* 根据用户名和密码查找用户对象,返回该对象(若对象存在,但访问令牌access_token为空,则同步为该对象生成访问令牌)
* @param $username string 用户名
* @param $password string 密码
* @return User|null 用户对象
*/
public static function findByUsernamePassword($username, $password)
{
$model = User::findOne(['username' => $username,
'password_hash' => User::hashPassword($password), 'status' => User::STATUS_ACTIVE]);
if ($model !== null) {
if (empty($model->access_token)) {
$model->access_token = Yii::$app->security->generateRandomString();
if ($model->update(false, ['access_token']) == false)
return null; // save token failed, return null
}
}
return $model;
}
/**
* 重新生成访问令牌 access_token
* @return false|int
*/
public function refreshAccessToken()
{
$this->access_token = Yii::$app->security->generateRandomString();
return $this->update(false, ['access_token']);
}
-
-
- 非数据库表的model,如表单model LoginForm.php
- 非model类,我把用于Excel输出的 XLSXWriter 类放入这里(这个类就一个文件,可以用php5,这个类用到了ZipArchive类,所以composer.json添加
"ext-zip": "*"
且文件开头use ZipArchive;
),我在markMergedCell()
方法前添加了一个静态方法
static public function parseMergeRange($strMergeRange) { // 将 A1:B3 解析成 ['startCellRow' => 0, 'startCellColumn' => 0, 'endCellRow' => 1, 'endCellColumn' => 2] $result = []; list($leftTop, $rightBottom) = explode(':', $strMergeRange); $result['startCellColumn'] = ord($leftTop[0]) - ord('A'); // 最多支持26列! $result['startCellRow'] = substr($leftTop, 1) - 1; $result['endCellColumn'] = ord($rightBottom[0]) - ord('A'); // 最多支持26列! $result['endCellRow'] = substr($rightBottom, 1) - 1; return $result; }
-
` ``
- backend
我的backend主要是后台数据管理。目前没有完全前后端分离,如果彻底分离,那么应该这里只处理非公共的接口(局限与backend应用的请求)- 生成Excel文件并下载(控制器样例, XLSXWriter 支持php5,可以原生生成,支持大量数据,不过功能比较简单,phpoffice/phpspreadsheet 支持读取模板再修改,但需要 php7.2+)
public function actionExcel($ids) // XLSXWriter 支持 php5
{
$this->layout = false;
$models = DisinfectRecord::find()->where(['id' => explode(',', $ids)])->all(); // 数据
if (count($models) == 0) return; // 数据为空不下载
$date1 = $models[0]->date; $date2 = $models[count($models)-1]->date;
if (strcmp($date1, $date2) > 0) {
$dateFrom = $date2; $dateTo = $date1;
} else {
$dateFrom = $date1; $dateTo = $date2;
}
$downloadFileName = '消毒记录#'. $models[0]->address.'#'.$dateFrom.'至'.$dateTo.'.xlsx'; // 文件名
$writer = new XLSXWriter(); //writer 类
//设置 header,用于浏览器下载
header('Content-disposition: attachment; filename="'.XLSXWriter::sanitize_filename($downloadFileName).'"');
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
// 表头、每列标题、数据类型
$caption = [$models[0]->address . '消毒记录(橙区)'];
$thead = [
['A' => '日期', 'B' => '起止时间', 'C' => '', 'D' => '范围', 'E' => '消毒药', 'F' => '', 'G' => '',
'H' => '消毒剂量', 'I' => '用水量', 'J' => '比例', 'K' => '执行人', 'L' => '监督人', 'M' => '备注'],
['A' => '', 'B' => '起', 'C' => '止', 'D' => '', 'E' => '名称', 'F' => '厂家', 'G' => '批号',
'H' => '', 'I' => '', 'J' => '', 'K' => '', 'L' => '', 'M' => '']
];
$theadStyle = ['font' => '宋体','font-size' => 12,'font-style' => 'bold', 'fill' => '#eee',
'halign' => 'center', 'border' => 'left,right,top,bottom'];
$colDataType = ['A' => 'string', 'B' => 'string', 'C' => 'string', 'D' => 'string', 'E' => 'string',
'F' => 'string', 'G' => 'string', 'H' => 'string', 'I' => 'string', 'J' => 'string',
'K' => 'string', 'L' => 'string', 'M' => 'string'];
$colWidth = ['A' => '16', 'B' => '10', 'C' => '10', 'D' => '12', 'E' => '12',
'F' => '16', 'G' => '16', 'H' => '10', 'I' => '10', 'J' => '10',
'K' => '10', 'L' => '10', 'M' => '20'];
$dataRowStyle = ['height' => 20,'font-size' => 12, 'border' => 'left,right,top,bottom'];
// 工作簿名称
$sheet1 = 'sheet1';
$writer->writeSheetHeader($sheet1, array_values($colDataType), ['suppress_row'=>true,
'widths' => array_values($colWidth)] );
// 写入表头行
$writer->writeSheetRow($sheet1, $caption,
['height'=>32,'font-size'=>20,'font-style'=>'bold','halign'=>'center','valign'=>'center']);
// 写入标题行
$writer->writeSheetRow($sheet1, array_values($thead[0]), $theadStyle);
$writer->writeSheetRow($sheet1, array_values($thead[1]), $theadStyle);
// 写入数据
foreach ($models as $model) {
$tempRow = [$model->date, substr($model->time_begin, 0, 5), substr($model->time_end, 0, 5),
$model->area, $model->drug_name, $model->drug_manufacturer, $model->drug_batch_number,
$model->quantity, $model->ratio, $model->water_used, $model->implementer, $model->supervisor, $model->note];
$writer->writeSheetRow($sheet1, $tempRow, $dataRowStyle);
//unset($tempRow);
}
//合并单元格,第一行的大标题 和 标题行
$mergeSettings = ['A1:M1', 'A2:A3', 'B2:C2', 'D2:D3', 'E2:G2', 'H2:H3', 'I2:I3',
'J2:J3', 'K2:K3', 'L2:L3', 'M2:M3'];
foreach ($mergeSettings as $mergeSetting) {
$merge = XLSXWriter::parseMergeRange($mergeSetting) ;
$writer->markMergedCell($sheet1, $merge['startCellRow'], $merge['startCellColumn'], $merge['endCellRow'], $merge['endCellColumn']);
}
//输出文档
$writer->writeToStdOut();
exit(0);
}
public function actionExcel($ids) // phpoffice/PhpSpreadsheet 需要 php7.2+!
{
$this->layout = false;
$models = DisinfectRecord::find()->where(['id' => explode(',', $ids)])->all();
if (count($models) == 0) return;
// 根据模板文件创建工作簿对象 (模板文件必须存在)
$spreadsheet = IOFactory::load(User::getFilePath('tpl_disinfect_record.xlsx', '/', true));
$worksheet = $spreadsheet->getActiveSheet();
$rowNo = 4;
foreach ($models as $model) {
$worksheet->getCell('A' . $rowNo)->setValue($model->date);
$worksheet->getCell('B' . $rowNo)->setValue($model->time_begin);
$worksheet->getCell('C' . $rowNo)->setValue($model->uni-app技术分享| uni-app插件使用前提
uni-app1 uniapp介绍 & 使用 + 小程序实时获取视频播放时间