V2.0版本
yoyocmf 2020-02-05 18:17:20

一、环境布署

1、解析域名时,请解析到根目录下的web目录

2、解析完成后,添加伪静态,如nginx规则:

C/C++ Code复制内容到剪贴板
  1. location / {  
  2.     try_files $uri $uri/ /index.php?$query_string;  
  3. }  
  4. location /admin {  
  5.     try_files $uri $uri/ /admin/index.php?$query_string;    
  6. }  
  7.    location /api {  
  8.     try_files $uri $uri/ /api/index.php?$query_string;    
  9. }  

 

 

二、系统安装

PHP Code复制内容到剪贴板
  1. php init          // 初始化,选择生产环境还是开发环境  
  2. composer install  // 安装vendor包  
  3.   
  4. //先去common/config/main-local.php修改数据库连接信息  
  5.   
  6. php yii migrate/up   // 导入数据表或者./yii  
  7. php ./yii password/init // 重置后台用户名密码  

 

PHP Code复制内容到剪贴板
  1. ## composer可以设置忽略版本匹配,命令是:    
  2. composer install --ignore-platform-reqs    
  3.     
  4. ## or    
  5. composer update --ignore-platform-reqs    

 

安装成功会生成一个安装文件:web/storage/install.txt,加载第三方模块 / 插件时会判断这个文件是否存在,所以如果有报错,请一定检查一下

 


 

安装xlswriter扩展,用于解析excel文件,替代PhpSpreadsheet

PHP Code复制内容到剪贴板
  1. pecl install xlswriter  
  2.   
  3. ##PECL 安装时将会提示是否开启读取功能,请键入 yes;  

 

安装完成后,修改php.ini,添加:

PHP Code复制内容到剪贴板
  1. extension = xlswriter.so  

 

安装完成后,可以输入命令查看已安装的扩展:php -m

 

用法示例可以参考【数据采集】扩展模块


 

 

 

1、安装成功后,先进入系统变量,修改相关参数:

基本属性——网站地址

基本属性——API地址

基本属性——附件地址

基本属性——附件URL

图片设置——图片存储方式(默认为本地存储,支持OSS存储)

 

2、更新缓存与栏目目录

右上角的头像——系统刷新,按顺序点

清除临时文件和数据 -> 恢复栏目目录 -> 更新栏目关系

 

 

二、view视图需在资源包的末尾添加js或css

PHP Code复制内容到剪贴板
  1. <?php $this->beginBlock('js') ?>  
  2. <script>  
  3.   
  4. </script>  
  5. <?php $this->endBlock() ?>  

 

三、安装成功后,会在/web/storage 目录创建一个install.txt

卸载时除了将数据库清空以外,还需要删除这个文件,否则会报错,用于加载扩展模块

 

 

关于a链接跳转说明:

XML/HTML Code复制内容到剪贴板
  1. <a href="javascript:void(0)">点我不动</a>  
  2.   
  3. <a href="/xxxx/url" data-ajax='1' data-target="_blank" data-width="" data-height="" data-title="">点我出弹出窗</a>  
  4.   
  5. <a href="/xxxx/url">在当前TAB内刷新并打开一个链接,TAB标题都会跟着换</a>  
  6.   
  7. <a href="/xxxx/url" target="_blank">创建一个新的TAB内容</a>  
  8.  
  9. <a href="/xxxx/url" data-frame="false">打开新链接</a>  
  10.  
  11.   
  12. <a href="/xxxx/url" data-location="1">在当前TAB打开一个链接,当前TAB标题等保持现状</a>  

 

如果发现加了target="_blank"不仅跳新标签页,当前页同时也更新了,注意一下是不是pjax影响了

 

 

四、获取下拉列表

 1.png

无限级下拉列表

PHP Code复制内容到剪贴板
  1. /** 
  2.  * 获取下拉树列表 
  3.  * 
  4.  * @param string $id 
  5.  * @return array 
  6.  */  
  7. public static function getDropDownList($id = '')  
  8. {  
  9.     $list = self::find()  
  10.         ->andFilterWhere(['<>''id'$id])  
  11.         ->select(['id''parent_id''title'])  
  12.         ->orderBy('sort asc,id asc')  
  13.         ->asArray()  
  14.         ->all();  
  15.     $tree = Tree::build($list,'id''parent_id''children', 0);  
  16.     return self::generationDropDown($tree);  
  17. }  
  18. /** 
  19.  * 生成下拉选择的列表结束 
  20.  * @param array $tree 
  21.  * @param array $result 
  22.  * @param int $deep 
  23.  * @param string $separator 
  24.  * @return array 
  25.  */  
  26. protected static function generationDropDown($tree = [], &$result = [], $deep = 0, $separator = '--'){  
  27.     $deep++;  
  28.     foreach ($tree as $list) {  
  29.         $result[$list['id']] = str_repeat($separator$deep - 1) . $list['title'];  
  30.         if (isset($list['children'])) {  
  31.             self::generationDropDown($list['children'], $result$deep);  
  32.         }  
  33.     }  
  34.     return $result;  
  35. }  

 

 

一维数组下拉列表:

PHP Code复制内容到剪贴板
  1. /** 
  2.  * 获取全部数据表的下拉列表 
  3.  * @param string $id 
  4.  * @return array 
  5.  */  
  6. public static function getDropDownList($id = ''){  
  7.     $res = self::find()->andFilterWhere(['<>''id'$id])->asArray()->all();  
  8.     return ArrayHelper::map($res"id""title");  
  9. }  

 

 

 

form调用:

PHP Code复制内容到剪贴板
  1. <?= $form->field($model'parent_id')->dropDownList($model::getDropDownList(), ['encode' => false, 'prompt' => '请选择''data-plugin' => 'selectpicker''data-style' => 'btn-select']) ?>  

 

输入身份证号,自动赋值出年月 + 性别

PHP Code复制内容到剪贴板
  1. <?php $this->beginBlock('js') ?>  
  2. <script>  
  3.     var $cardNoInput = $("#<?= Html::getInputId($model, 'card_no') ?>");  
  4.     var $birthdayInput = $("#<?= Html::getInputId($model, 'birthday') ?>");  
  5.     var url = "<?= \yii\helpers\Url::to(['generate-slug']) ?>";  
  6.     $cardNoInput.on('blur'function () {  
  7.         const idCard = $cardNoInput.val();  
  8.         const birth = getBirth(idCard);  
  9.         if (birth) {  
  10.             $birthdayInput.val(birth);  
  11.         }  
  12.         const sex = getSex(idCard);  
  13.         //循环单选按钮  
  14.         console.log(sex);  
  15.         $("input[name='OrganizationMemberForm[gender]']").each(function(index, element) {  
  16.             //判断当前按钮的值与input的值是否一致,一致则赋值  
  17.             // console.log($(this).val());  
  18.             if($(this).val()==sex){  
  19.                 $(this).prop("checked",true);  
  20.             }else{  
  21.                 $(this).prop("checked",false);  
  22.             }  
  23.         });  
  24.   
  25.     });  
  26.   
  27.     /** 
  28.      * @param idCard 
  29.      */  
  30.     function getBirth(idCard) {  
  31.         var birthday = "";  
  32.         if (idCard != null && idCard != "") {  
  33.             console.log(idCard.length)  
  34.             if (idCard.length == 15) {  
  35.                 birthday = "19" + idCard.slice(6, 10);  
  36.             } else if (idCard.length == 18) {  
  37.                 birthday = idCard.slice(6, 12);  
  38.             } else {  
  39.                 $.modal.alert("身份证号位数有误");  
  40.                 return false;  
  41.             }  
  42.             birthday = birthday.replace(/(.{4})(.{2})/, "$1-$2");  
  43.             //通过正则表达式来指定输出格式为:1990-01-01  
  44.         }  
  45.         return birthday;  
  46.     }  
  47.   
  48.     function getSex(idCard) {  
  49.         var sexStr = '';  
  50.         if (parseInt(idCard.slice(-2, -1)) % 2 == 1) {  
  51.             sexStr = 0;//'man';  
  52.         } else {  
  53.             sexStr = 1;//'woman';  
  54.         }  
  55.         return sexStr;  
  56.     }  
  57. </script>  
  58. <?php $this->endBlock() ?>  

 

输入身份证号,解析年/月/日

PHP Code复制内容到剪贴板
  1. /**  
  2.  * @param idCard  
  3.  */    
  4. function getBirth(idCard) {    
  5.     var birthday = "";    
  6.     if (idCard != null && idCard != "") {    
  7.         if (idCard.length == 15) {    
  8.                         birthday = "19"+idCard.substr(6,6);  
  9.                     } else if (idCard.length == 18) {    
  10.                         birthday = idCard.substr(6,8);  
  11.                     } else {    
  12.                         this.$baseJs.msg("身份证号位数有误");    
  13.                         return false;  
  14.                     }  
  15.     
  16.         birthday = birthday.replace(/(.{4})(.{2})/,"$1-$2-");    
  17.         //通过正则表达式来指定输出格式为:1990-01-01    
  18.     }    
  19.     return birthday;    
  20. }    

 

 

保存base64图片入库

PHP Code复制内容到剪贴板
  1. $picpath = $data['srcpic_data'];  
  2.         $saveDir = "/discern-helmet/" . date("Ymd") . "/";  
  3.         $base64Img = "data:image/jpg;base64,".$picpath//统一保存为jpg格式,由于前面没有这一串,所以手动拼接上  
  4.         $img_url = Attachment::uploadFromBase64($saveDir,$base64Img,"oss");  

 

API模块中,model中添加extraFields附加字段

api/models/Document.php

PHP Code复制内容到剪贴板
  1. class Document extends \common\modules\document\models\Document  
  2. {  
  3.   
  4.     public function fields()  
  5.     {  
  6.         return [  
  7.             'id',  
  8.             'title',  
  9.             'category' => function ($model) {  
  10.                 return $model->categoryTitle;  
  11.             },  
  12.             'category_id',  
  13.             'view',  
  14.             'description',  
  15.             'user_id',  
  16.             'published_at',  
  17.         ];  
  18.     }  
  19.   
  20.     /** 
  21.      * 附加字段 
  22.      * @return array|false 
  23.      */  
  24.     public function extraFields()  
  25.     {  
  26.         return [  
  27.             'module',  
  28.             'content' => function ($model) {  
  29.                 if($model->module == "article"){  
  30.                     return $model->data->content;  
  31.                 }else{  
  32.                     return "";  
  33.                 }  
  34.             },  
  35.         ];  
  36.     }  
  37.   
  38. }  

 

在控制器中使用:

PHP Code复制内容到剪贴板
  1. public function actionView($id)  
  2. {  
  3.     \Yii::$app->request->setQueryParams(['expand' => 'content,module']);  
  4.     $model = Document::find()->where(['id' => $id])->with("data")->one();  
  5.     if ($model === null) {  
  6.         throw new NotFoundHttpException('信息不存在,请联系管理员');  
  7.     }  
  8.     return $model;  
  9. }  

 

从post中保存图片入库

首先,数据需要是form-data,然后需要添加enctype=multipart/form-data

视图:

PHP Code复制内容到剪贴板
  1. <?php  
  2. use common\helpers\Html;  
  3. use backend\widgets\ActiveForm;  
  4. ?>  
  5.   
  6. <div class="page material-create">  
  7.     <div class="page-content">  
  8.         <?php $form = ActiveForm::begin([  
  9.             'options' => [  
  10.                 "enctype" => "multipart/form-data",  
  11.             ],  
  12.         ]); ?>  
  13.         <div class="panel">  
  14.             <div class="panel-body">  
  15.                 <div class="form-group form-material">  
  16.                     <label class="col-form-label" for="select">选择项目</label>  
  17.                     <?= Html::dropDownList("project_id", null, \common\models\Project::getDropDownList(), ['encode' => false, 'class' => 'form-control']) ?>  
  18.                 </div>  
  19.   
  20.                 <div class="form-group form-material">  
  21.                     <label class="col-form-label" for="inputFile">文件域</label>  
  22.                     <input type="text" class="form-control" placeholder="请选择文件.." readonly="">  
  23.                     <input type="file" id="inputFile" name="file">  
  24.                 </div>  
  25.             </div>  
  26.             <div class="panel-footer">  
  27.                 <button class="btn btn-primary">开始导入</button>  
  28.             </div>  
  29.         </div>  
  30.         <?php ActiveForm::end(); ?>  
  31.   
  32.     </div>  
  33. </div>  

 

控制器:

PHP Code复制内容到剪贴板
  1. public function actionUpload(){  
  2.     if (Yii::$app->request->isPost){  
  3.         $post = Yii::$app->request->post();  
  4.         $path = date("Ymd")."/"//后缀一定要加/  
  5.         $file = UploadedFile::getInstancesByName("file");  
  6.         $uploadFile = Attachment::uploadFromPost($path,$file[0],"local");  
  7.         p($uploadFile);  
  8.     }  
  9.     return $this->render('upload');  
  10. }  

 

 

JS插件初始化,应用场景,pjax请求后,页面需要重新加载JS:

JavaScript Code复制内容到剪贴板
  1. $(document).on('pjax:complete'function() {  
  2.     // init();  
  3.     $.components.init('switchery',window);  
  4.     // $.components.init(window); //初始化插件  
  5. })  

 

 

请求第三方URL,形成日志,记录回调以及传参 

PHP Code复制内容到剪贴板
  1. $api = "";  
  2. $params = [  
  3.     "key" => "value"  
  4. ];  
  5. $res = Yii::$app->services->logExternal->post(true,$api,$params);  

 

 


 

处理base64编码的图片转为本地或oss图片

PHP Code复制内容到剪贴板
  1.     public function beforeSave($insert)  
  2.     {  
  3.         parent::beforeSave($insert);  
  4.         if(!$this->id){  
  5.             $this->id = StringHelper::uuid('uniqid');  
  6. //            throw new Exception("ID不能为空");  
  7.         }  
  8.         // 筛出所有图片  
  9.         $this->tigan = $this->processingEditorContent($this->tigan);     // 题干  
  10.         $this->choices = $this->ProcessingEditorChoicesContent($this->choices); // 选择项  
  11.         return true;  
  12.     }  
  13.   
  14. // 这里选择项和题干单独处理,是由于题干只是由base64组合的一段string,而选择项它是由json字符串组合的,那么在转义的过程中,在src里面就要求格式是src=\"xxxx.jpg\",前后分别多两个反斜杠  
  15.   
  16.   
  17.     /** 
  18.      * 转换编辑器内容,将base64的内容替换为本地文件 
  19.      * @param $content 
  20.      * @return string|string[]|null 
  21.      */  
  22.     public static function ProcessingEditorContent($content){  
  23.         $text = preg_replace_callback('/<img.*?src="(.*?)".*?\/>/'function ($matches){  
  24.             $image = $matches[1];  
  25.             if (preg_match('/^(data:\s*image\/(\w+);base64,)/'$image$result)) {  
  26.                 $path = date("Ymd")."/"; 
  27.                 $url = Attachment::uploadFromBase64($path,$image,"local"); 
  28.                 return str_replace($image,$url,$matches[0]); 
  29.             }else{ 
  30.                 return $image[0]; 
  31.             } 
  32.         }, $content); 
  33.         return $text; 
  34.     } 
  35.  
  36.     /** 
  37.      * 选择项是json字符串,被转义了,所以需要重新处理一下格式 
  38.      * @param $content 
  39.      * @return array|string|string[]|null 
  40.      * @throws \yii\base\Exception 
  41.      */ 
  42.     public static function ProcessingEditorChoicesContent($content){ 
  43.         // 考虑到JSON传参,那么在src前面还有转义的反斜杠,这里一并加入规则处理 
  44.         $text = preg_replace_callback('/\<img.*?src=.*?"(.*?)".*?\/>/', function ($matches) { 
  45.             $image = $matches[1]; 
  46.             if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $image, $result)) { 
  47.                 $path = date("Ymd")."/"; 
  48.                 $url = Attachment::uploadFromBase64($path,$image,"local"); 
  49.                 // 考虑到JSON传参,在src前面有转义的反斜杠,那么在尾部也应该有一个反斜杠 
  50.                 return str_replace($image,$url . "\\",$matches[0]);  
  51.             }else{  
  52.                 return $image[0];  
  53.             }  
  54.         }, $content);  
  55.         return $text;  
  56.     }  

 

 

本文来自于:http://www.yoyo88.cn/note/yoyocmf/489.html

Powered by yoyo苏ICP备15045725号