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 意思这个配置和本地环境有关,即开发时的环境和部署目标的环境不一样就不同,所以通常是公用的数据库组件配置
    • models
      • 数据库表对应model,如 User.php
        因为通常 User 模型类应用中都有,所以我偷懒把一些公用函数作为它的静态方法提供了
    /**
     * 为指定文件名的文件生成完成路径
     * @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-app技术分享| uni-app插件使用前提

uni-app1 uniapp介绍 & 使用 + 小程序实时获取视频播放时间

Uni-app基础

半天时间写完一个案例,循序渐进的掌握uni-app,使用uni-app完成一个简单项目——新闻列表

如何使用 Yii2 的 PayPal 扩展在 yii2 中集成支付网关