# laravel封装的基础文件 **Repository Path**: yufeidaima/laravel ## Basic Information - **Project Name**: laravel封装的基础文件 - **Description**: 主要封装了一些常用的基础库 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-03 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 文件存放规则 以及 提示 ```angular2html 1、本文中考虑到 表与表之间的关系 复杂度,有部分使用了laravel封装的表表关系(多对多,一对多) 没有全部使用,大部分使用的纯sql语句以及视图来实现,视图命名规则是以第一个表的名称加上第二个表/第三个表的名称得到一个视图 ,考虑到速度影响。在开启了redis配置时(bf_wy_config文件里面 REDIS_OPEN 参数 为 true),查询基本如下:先使用mysql,然后再使用redis, 当使用了一次mysql查询出来数据(sql语句以及参数得到唯一md5值),立马存储在redis里面,然后第二次使用时就会使用redis查询, 使用的封装方法是 MyUtils::dbSelect来查询数据库;修改redis 要 重新退出登录界面才能生效。 2、配置文件在config文件夹中,数据库配置文件在database.php中,跨域配置文件在cors.php文件中 3、读取数据库就是用 MyUtils::dbSelect 自己封装的方法来实现,新增redis,将数据存在内存中,减少查询时间 4、写数据库就是用DB::table("tables")->insert()方法来实现 5、封装的公共类以及方法可以在http/common里面新增一个类文件,然后用单例模式来实现加载,然后再public文件里面引入 6、http/common/DayTimes.php文件是获取时间的类,单例为DayTimes::getInstance() 7、http/common/Globals.php文件是存放全局变量的类 8、http/common/MyUtils.php文件是工具类 9、发送到前端的数据使用 MyUtils::dealFD($data,$code) 来实现code=-1 代表失败 code=1 代表成功。 10、错误统一放在全局变量\Globals::$error中,然后返回到前端数据直接返回,比如MyUtils::dealFD(\Globals::$error,-1) 11、sql语句调试日志在public/logs/sql文件夹里面,当调试,以及数据库备份用 12、所有的基础配置都在.env文件中 13、使用的excel导入函数是使用maatwebsite/excel 文档在 https://docs.laravel-excel.com/3.1/imports/ 12.1、php artisan make:import UsersImport --model=User是生成import 文件的命令,在app/Imports文件夹下 14、mysql修改sql_mode 解决的办法可以执行sql:SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 这种方式的在mysql重启后还是会有问题, 建议修改mysql下my.cnf文件(linux:/etc/my.cnf;windows:mysql-*/my.ini), 找到#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 这个注释掉,改成下面的 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 暂时可以先不修改。 15、运行之前要先运行开启redis默认账号密码为空,启动之前必须安装redis,启动命令是 redis-server ./redis.conf,conf文件在当前文件夹中 16、php 需要7.1以上,没有需要升级 升级命令 查看当前 PHP 版本 php -v 更换 RPM 源 #Centos 5.X: rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm #CentOs 6.x: rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm #CentOs 7.X: rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm service php-fpm stop /usr/local/nginx/sbin/nginx -s stop yum remove php* yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-fpm php71w-gd php71w-mbstring php71w-mysqlnd php71w-opcache php71w-pdo php71w-xml php71w-ldap php71w-mcrypt service php-fpm start /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 命令为 redis-server ./redis.conf 17、添加相应的自动加载的文件 Strtopy.php所在目录   app/Lib/Strtopy.php               Lib目录是自己建的目录 在composer.json的autoload内的classmap项新增类包, "autoload": { "classmap": [ "database/seeds", "database/factories", "app/Lib" ], 确保引入路径的正确性。 在项目根目录,使用cmd命令: composer dump-autoload Package manifest generated successfully. 18、开启swoole的命令为 php artisan swoole:http start命令 会执行 Starting swoole http server... Swoole http server started: 的命令 18.1 因为产生的 定时生成订单需要很多的线程支持,所以本文使用了 swoole,所以linux需要使用swoole yum install php-devel git clone https://gitee.com/swoole/swoole.git cd swoole phpize ./configure make make install 开启swoole扩展 $ cd /etc/php.d/ $ sudo vim swoole.ini ; Enable xsl extension module extension=swoole.so 18.2 nginx配置如下才行,让其反向代理到swoole location ~ { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:1215; } 18.3 最新的安装步骤: composer require swooletw/laravel-swoole pecl install swoole php -i | grep php.ini # check the php.ini file location sudo echo "extension=swoole.so" > php.ini # add the extension=swoole.so to the end of php.ini php -m | grep swoole # check if the swoole extension has been enabled 修改:config/app.php [ 'providers' => [ SwooleTW\Http\LaravelServiceProvider::class, ], ] 如果你使用 Lumen ,请将下面的代码添加到 bootstrap/app.php: $app->register(SwooleTW\Http\LumenServiceProvider::class); 建立并运行起来 php artisan swoole:http start 19、通过 crontab -e 来新增定时任务 新增以下调度 * * * * * php /www/wwwroot/tcwy2.lwanqing.com/artisan schedule:run > /dev/null 2>&1 19.1 定时任务写在 Console/Commands/TaskCommand.php文件里面 20、redis存储规则,每次修改之后都要自动修改 表名 -table-updated = time(); time()为当前的时间戳。 21、其中商家、城市运营商与物业是分开的,数据库表也是分开的,物业的表名称是以 bf_wy_ 开头的,商家是以 bf_sj_ 开头, 城市运营商是以 bf_csyys_ 开头 22、商家控制器,应该使用 AdminBusiness/---Controller.php 的控制器;放在文件夹 AdminBusiness 下 城市运营商控制器,应该使用 AdminOperator/---Controller.php 的控制器;放在文件夹 AdminOperator 下 小程序端同城物业等综合,应该使用 FrontCity/---Controller.php 的控制器;放在文件夹 FrontCity 下 23、用户表是 wy_users表,里面存储了登录的用户表。 24、公共文件应该在Http/Common文件里面。 25、sql语句放在数据库文件里面(比如bf_positions的sql查询语句放在Positions文件里面), 默认查询详情以及列表以及删除功能已经集成在基类里面了,可以参照案列。 配置文件在bf_wy_config表里面,拿到配置通过 MyUtils::getSessionConfig('REDIS_OPEN') 的方法来获取。 26、CheckToken.php文件实现登录前检测 token 以及 路由等操作。 27、控制器基类是 BaseController.php。 28、数据库基类是Base.php(软删除,需要deleted_at字段),BaseHard.php(直接删除) 29、商家 的路由放在routes/adminBusiness 以及,运营商的路由放在 routes/adminOperator 里面 30、systemctl --force --force reboot 服务器重启命令 ``` #### 编写规则 ```angular2html 1、代码逻辑写在 controller里面,生成的命令是 art make:controller 命令 2、数据库等操作写在 models里面,生成的命令是 art make:model 命令 3、路由写在 routes里面,无生成的命令,需要在web.php文件内进行手动引入 4、提前预加载的请放在中间件 middleWare里面,生成的命令是 art make:middleware 命令 5、当需要监听某一个事件时可以将其写在provider里面,比如将sql操作的日志写在provider里面 6、视图层完全写在 前端(前后端分离) ``` #### 路由命名规则 ```angular2html 路由写在routes文件里面,当新增一个路由页面后请将其在web.php文件里面引入。 后端路由命名规则: 1、请用文件夹/方法名,比如admin/menu/list 2、当方法名是驼峰式的请用中间的-代替,比如admin/menu/all-list 路由写在routes文件里面,当新增一个路由页面后请将其在web.php文件里面引入。 小程序前端路由命名规则: 1、为了便于分开前后端的路由,我们把前端的路由命名规则定位为admin/menu/allList,与后端的命名规则有区别。 ``` #### 接口文档以及流程图、原型图 ```angular2html 1、原型图 用 蓝湖 https://lanhuapp.com/web/#/item 实现分享查看 2、接口文档请用 md 文件来进行编写,每个页面请用相应的文件夹进行分类。文件编写是用markdown文件编写 在线编写文档是在, https://easydoc.xyz/#/p/13912275/VZgPhqt6 用的 在线 易文档 实现分享。 ``` #### 测试以及预览服务器IP ```angular2html http://admin.tcwy2.lwanqing.com/ 账号密码可以问管理员 ``` #### 用phpstorm开发,要能够实现 postman能够断点,就需要新增 一个 本地地址的 服务器 配置文件。 ```angular2html 配置文件在File->setting->php->servers中 ``` #### 腾讯云对象存储的文件上传的接口在UploadFiles.php中 initTencent函数是设置配置文件的地方。 #### 部署规则 ```angular2html ``` #### 微小区 的参考 代码 逻辑 请参考如下网站: ```angular2html https://github.com/lanshanxiang/CMSys ``` #### 问题汇总 ```angular2html 当出现了 group by = ONLY_FULL_GROUP_BY的错误 就运行一下sql 语句:set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION '; 将ONLY_FULL_GROUP_BY的模式去掉。 出现微信登录不上 问题的源起是我修改了php-fpm的运行用户,处理完一些常见的目录权限之后,报了Failed to cache access token 这个错误,于是我去 overtrue/wechat/src/Kernel/AccessToken.php:141 看了下源码,发现是因为token缓存文件没写成功。 然后在文档( 缓存 )中找到了缓存方式。 overtrue/wechat 默认使用的是 symfony/cache 来进行缓存操作,ubuntu中,symfony/cache会在/tmp目录下建立symfony_cache来储存临时缓存。 ps:如果不是/tmp目录,可以使用 sys_get_temp_dir() 方法获取你的临时文件目录。 因为之前使用www-data用户运行的项目,所以symfony_cache目录已被www-data创建,且其他用户不可写,直接删掉这个目录或者修改权限就可以了! 当断点时间很短是,应该是由于apache IPCConnectTimeout 3000 IPCCommTimeout 3000 的参数导致的,加上这两个参数就行 \Closure::bind 能够实现将 闭包 封装成 某个类的 内部方法。大部分为对变量初始化。 所有的类库 方法 函数引入都是在 autoload_static.php这个文件实现的。 laravel的所有的 函数 都是在 helps.php 这个文件实现的。vendor\laravel\framework\src\Illuminate\Support\helpers.php laravel的所有的 函数 都是在 helps.php 这个文件实现的。vendor\laravel\framework\src\Illuminate\Support\helpers.php 查询 php有哪些进程 ps -ef |grep php ```