关于yii:小编推荐Yii20Vue20前后端分离框架通用后台源码

yii-vue-cms 是一个yii2 + vue + element-ui的后盾极速开发框架,前后端拆散。 可通过gii实现主动生成页面(反对文本、富文本、单图、多图、生成),疾速开发。根底性能有: 权限治理(实现了页面路由 + 接口权限管制, 接口权限可随便敞开)、图片相册、图片上传、富文本、导出。网址: http://119.91.46.222:86/index.html 账号:test admin 明码:123456 装置教程接口服务部署装置依赖,因为家喻户晓的起因,国外的网站连贯速度很慢。因而装置的工夫可能会比拟长,咱们倡议应用国内镜像 (阿里云)。composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/根目录执行composer update导入数据库,创立yii-vue-cms_db数据库 将yii-vue-cms.sql导入数据库中配置接口域名,将配置的域名指向yii-vue-cms/admin/web目录 如果域名为yii-vue-cms.com (此时间接拜访此域名是没内容的这只是作为接口)前端vue我的项目部署cd vueadmin执行npm install install失败 1、删除node_modules 2、npm cache clean --force 3、npm installinstall失败 1、删除node_modules 2、删除package-lock.josn 3、npm install批改接口域名,将vueadmin/src/components/js/request.js里的域名换成下面配置好的域名装置胜利后 执行 npm run dev 关上http://localhost:8080 即可打包 执行npm run build 会生成一个dist文件 将dist文件放在yii-vue-cms/admin/web下, 此时拜访yii-vue-cms.com/dist/生成页面下面配置好之后 关上http://139.155.45.209:85/index.php/gii 或http://139.155.45.209:85/gii 到gii页面 生成Model如表fx_test 类名即为TestNamespace 填 commonmodels勾选 Use Table Prefix 、 Generate Labels from DB Comments 、 Use Schema Name模板 Code Template 抉择咱们自定义的模板 mymodel 生成 CRUD Generatormodel class 填 commonmodelsTestController Class 填 adminv1TestControllerview path 填 @vue/src/page/test 模板 Code Template 抉择咱们自定义的模板 mymodel点击生成后,会在对应目录下生成文件,此时先将index.php、 list.php等 改成.vue文件 保留, 而后格式化一下创立菜单在菜单权限--》 菜单列表 增加对应的路由,保留后,从新登录即可看到菜单分为路由 和 接口 须要填写对应的内容, 如果不须要接口权限,在admin/config/params.php 里敞开即可

April 28, 2023 · 1 min · jiezi

关于yii:Yii-实现乐观锁和悲观锁

一:在Yii中实现乐观锁乐观锁(optimistic locking)体现出大胆、求实的态度。应用乐观锁的前提是, 理论利用当中,发生冲突的概率比拟低。他的设计和实现间接而简洁。 目前Web利用中,乐观锁的应用占有绝对优势。因而在Yii为ActiveReocrd乐观锁反对 1:在yii中实现乐观锁步骤、1):给须要加锁的表增加一个字段,用于示意版本号,这里我个别选手version字段作为版本号字段,留神,如果你须要加锁的表曾经生成Model了,那么对应表的Model要将你增加的版本号字段(version)信息退出Model 2):在更新表中字段时,应用 try ... catch 看看是否能捕捉一个 yii\db\StaleObjectException 异样,如果捕捉到yii\db\StaleObjectException 异样,阐明在本次批改这个记录的过程中, 该记录曾经被批改过了,作出相应提醒 2:Yii中实现乐观锁1):在yii中申明指定字段为版本号 版本号是实现乐观锁的基本所在。所以第一步,咱们要通知Yii,哪个字段是版本号字段,申明版本号的办法由yii\db\BaseActiveRecord(vendor/yiisoft/yii2/db/BaseActiveRecord)中的optimisticLock办法负责 public function optimisticLock(){ return null;}这个办法返回 null ,示意不应用乐观锁,如果咱们须要应用乐观锁的话,咱们须要在咱们的须要加锁的表的Model中重载optimisticLock办法 public function optimisticLock(){ return 'version';}如上阐明以后的ActiveRecord中,有一个 version 字段,能够为乐观锁所用 2:实现乐观锁咱们在Model中设置了版本号后,这时候咱们的更新和删除都是乐观锁操作了,与失常操作数据库的形式统一 try { $crowd = Crowd::findOne(['crowd_id' => 12]); $crowd->status = 1; $crowd->save();} catch (\Exception $e) { return false;}在更新过程中,咱们会调用到 yii\db\BaseActiveRecord::updateInternal()办法,此办法外面就具备解决乐观锁的代码 protected function updateInternal($attributes = null) { if (!$this->beforeSave(false)) { return false; } // 获取等下要更新的字段及新的字段值 $values = $this->getDirtyAttributes($attributes); if (empty($values)) { $this->afterSave(false, $values); return 0; } // 把原来ActiveRecord的主键作为等下更新记录的条件,也就是说,等下更新的,最多只有1个记录。 $condition = $this->getOldPrimaryKey(true); // 获取版本号字段的字段名,比方 version $lock = $this->optimisticLock(); // 如果 optimisticLock() 返回的是 null,那么,不启用乐观锁。 if ($lock !== null) { // 这里的 $this->$lock ,就是 $this->version 的意思; 这里把 version+1 作为要更新的字段之一。 $values[$lock] = $this->$lock + 1; // 这里把旧的版本号作为更新的另一个条件 $condition[$lock] = $this->$lock; } $rows = static::updateAll($values, $condition);// 如果曾经启用了乐观锁,然而却没有实现更新,或者更新的记录数为0; // 那就阐明是因为 version 不匹配,记录被批改过了,于是抛出异样。 if ($lock !== null && !$rows) { throw new StaleObjectException('The object being updated is outdated.'); } if (isset($values[$lock])) { $this->$lock = $values[$lock]; } $changedAttributes = []; foreach ($values as $name => $value) { $changedAttributes[$name] = isset($this->_oldAttributes[$name]) ? $this->_oldAttributes[$name] : null; $this->_oldAttributes[$name] = $value; } $this->afterSave(false, $changedAttributes); return $rows; }在删除过程中,咱们会调用到 yii\db\BaseActiveRecord::delete()办法,此办法外面就具备解决乐观锁的代码 ...

November 1, 2022 · 2 min · jiezi

关于yii:php框架哪个好

php开发框架,罕用的大略是Yii、TP5、Laravel等等···· Yii是一个基于组件开发的用做大型web 利用的高性能PHP框架,它将 Web 编程中的可重用性施展到极致,可能显著减速开发过程。Yii(读作“易”),代表简略(easy)、高效(efficient)、可扩大(extensible)。 Codelgniter 以它的简略易用,性能和速度而闻名。这款PHP开发框架对于共享主机的用户而言很现实,如果你想有一个小型覆盖面的框架。它提供了简略的解决方案,还有扩大的知识库,通过视频教程,用户指南和wiki来提供反对。 ThinkPHP是一个性能卓越并且功能丰富的轻量级PHP开发框架,自身具备很多的原创个性,并且提倡大道至简,开发由我的开发理念,用起码的代码实现更多的性能,主旨就是让WEB利用开发更简略、更疾速。 框架就是用来开发的工具,大厂会有本人封装的框架,一些组件,包含公共办法能够不便复用,节约开发成本,那么你们感觉哪个框架好用呢??? 欢送大佬们留言探讨斧正~

August 24, 2021 · 1 min · jiezi

关于yii:yii-速查手册

生成urluse yii\helpers\Url;$url = Url::to(['post/view', 'id' => 100]);Url::to(['post/view', 'id' => 100, '#' => 'content'],true); 带域名http://yii.api.shanliwawa.top:80/post/view?id=100#content// 主页URL:/index.php?r=site%2Findexecho Url::home();// 根URL,如果程序部署到一个Web目录下的子目录时十分有用echo Url::base();申请$request = Yii::$app->request;$get = $request->get('id'); $id = $request->get('id', 1); 不存在为1$name = $request->post('name'); api中$params = $request->bodyParams;// 返回参数 "id"$param = $request->getBodyParam('id');if ($request->isAjax) { /* 该申请是一个 AJAX 申请 */ }if ($request->isGet) { /* 申请办法是 GET */ }if ($request->isPost) { /* 申请办法是 POST */ }if ($request->isPut) { /* 申请办法是 PUT */ }$userHost = Yii::$app->request->userHost;客户主机$userIP = Yii::$app->request->userIP;客户ip跳转yii\web\Response::redirect($url) $this->redirect('http://example.com/new', 301);//控制器中session$session = Yii::$app->session;// 获取session中的变量值,以下用法是雷同的:$language = $session->get('language');$language = $session['language'];$language = isset($_SESSION['language']) ? $_SESSION['language'] : null;// 设置一个session变量,以下用法是雷同的:$session->set('language', 'en-US');$session['language'] = 'en-US';$_SESSION['language'] = 'en-US';// 删除一个session变量,以下用法是雷同的:$session->remove('language');unset($session['language']);unset($_SESSION['language']);// 查看session变量是否已存在,以下用法是雷同的:if ($session->has('language')) ...if (isset($session['language'])) ...if (isset($_SESSION['language'])) ...// 遍历所有session变量,以下用法是雷同的:foreach ($session as $name => $value) ...foreach ($_SESSION as $name => $value) ...cookie// 从 "request" 组件中获取 cookie 汇合(yii\web\CookieCollection)$cookies = Yii::$app->request->cookies;// 获取名为 "language" cookie 的值,如果不存在,返回默认值 "en"$language = $cookies->getValue('language', 'en');// 另一种形式获取名为 "language" cookie 的值if (($cookie = $cookies->get('language')) !== null) { $language = $cookie->value;}// 可将 $cookies 当作数组应用if (isset($cookies['language'])) { $language = $cookies['language']->value;}// 判断是否存在名为"language" 的 cookieif ($cookies->has('language')) ...if (isset($cookies['language'])) ...// 从 "response" 组件中获取 cookie 汇合(yii\web\CookieCollection)$cookies = Yii::$app->response->cookies;// 在要发送的响应中增加一个新的 cookie$cookies->add(new \yii\web\Cookie([ 'name' => 'language', 'value' => 'zh-CN',]));// 删除一个 cookie$cookies->remove('language');// 等同于以下删除代码unset($cookies['language']);日志Yii::error('日志文件');数据库查问多条$posts = Yii::$app->db->createCommand('SELECT * FROM post')->queryAll();查问一条$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1')->queryOne();返回一列$titles = Yii::$app->db->createCommand('SELECT title FROM post')->queryColumn();返回标量$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post')->queryScalar();绑定参数$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')->bindValue(':id', $_GET['id'])->bindValue(':status', 1)->queryOne();非查问Yii::$app->db->createCommand('UPDATE post SET status=1 WHERE id=1') ->execute();Yii::$app->db->createCommand()->insert('user', ['name' => 'Sam','age' => 30,])->execute();Yii::$app->db->createCommand()->update('user', ['status' => 1], 'age > 30')->execute();Yii::$app->db->createCommand()->delete('user', 'status = 0')->execute();数据库模型操作one(): 依据查问后果返回查问的第一条记录。all(): 依据查问后果返回所有记录。count(): 返回记录的数量。sum(): 返回指定列的总数。average(): 返回指定列的平均值。min(): 返回指定列的最小值。max(): 返回指定列的最大值。scalar(): 返回查问后果的第一行中的第一列的值。column(): 返回查问后果中的第一列的值。exists(): 返回一个值,该值批示查问后果是否有数据。where(): 增加查问条件with(): 该查问应执行的关系列表。indexBy(): 依据索引的列的名称查问后果。asArray(): 以数组的模式返回每条记录。Customer::find()->one(); 此办法返回一条数据;Customer::find()->all(); 此办法返回所有数据;Customer::find()->count(); 此办法返回记录的数量;Customer::find()->average(); 此办法返回指定列的平均值;Customer::find()->min(); 此办法返回指定列的最小值 ;Customer::find()->max(); 此办法返回指定列的最大值 ;Customer::find()->scalar(); 此办法返回值的第一行第一列的查问后果;Customer::find()->column(); 此办法返回查问后果中的第一列的值;Customer::find()->exists(); 此办法返回一个值批示是否蕴含查问后果的数据行;Customer::find()->asArray()->one(); 以数组模式返回一条数据;Customer::find()->asArray()->all(); 以数组模式返回所有数据;Customer::find()->where($condition)->asArray()->one(); 依据条件以数组模式返回一条数据;Customer::find()->where($condition)->asArray()->all(); 依据条件以数组模式返回所有数据;Customer::find()->where($condition)->asArray()->orderBy('id DESC')->all(); 依据条件以数组模式返回所有数据,并依据ID倒序;rediscomposer require yiisoft/yii2-redis// 获取 redis 组件$redis = Yii::$app->redis;// 判断 key 为 username 的是否有值,有则打印,没有则赋值$key = 'username';if ($val = $redis->get($key);) { var_dump($val);} else { $redis->set($key, 'marko'); $redis->expire($key, 5);}

July 24, 2021 · 2 min · jiezi

关于yii:Yii2学习笔记

控制器控制器周期beforeAction/** * action 运行的前置操作 * * 比拟适宜统一化的数据验证,申请数据的承受等 * @param \yii\base\Action $action action 类 * @return bool 返回ture 控制器周期才会走上来 */public function beforeAction($action){ var_dump($action->id, $action->controller->id); return parent::beforeAction($action); // TODO: Change the autogenerated stub}afterAction/** * action 后置操作 * * 比拟适宜返回最初的日志收集 * @param \yii\base\Action $action action 类 * @param mixed $result * @return mixed */public function afterAction($action, $result){ return parent::afterAction($action, $result); // TODO: Change the autogenerated stub}模型AR 模型 罕用办法查问数据// 查问单条$one = Post::find()->where(['id' => 1])->one();// 或者$one = Post::finOne(1);// 查问多条$posts = Post::find()->where(['status' => 1])->all();// 或者$posts = Post::findAll(['status' => 1]);// 通过sql查问$posts = Post::findBySql('SELECT * FROM `posts` WHERE `status` = :status', [':status' => 1])->all();查问条件的设定where 查问反对的参数字符串格局 例如: 'status=1'// 对应的SQL: WHERE status = 1$query->where('status = 1');// 应用字符串形式,能够绑定参数$query->where('status = :status', [':status' => 1])哈希格局 例如: ['status' => 1, 'type' => 1]哈希格局最适宜用来指定多个 AND 串联起来的简略的"等于断言"子条件。 ...

September 25, 2020 · 7 min · jiezi

关于yii:从零开始搭建完整的电影全栈系统四restfulApi用户的认证授权及用户注册

在配置文件main.php中设置用户认证类,并正文掉cookies和session配置,因为Api客户端和WEB网站不同,通常不能应用cookies和session维持登录状态。 'user' => [ 'identityClass' => 'common\models\User', 'enableAutoLogin' => true, 'enableSession' => false, //'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true], ], /*'session' => [ // this is the name of the session cookie used for login on the backend 'name' => 'advanced-backend', ],*/实现Api用户认证(登录性能)复制一份common/models/UserLoginForm到common/models中并改名为ApiLoginForm,同时将remember me 和vitifyCode等相干性能勾销,并重写login办法。代码如下: <?phpnamespace api\models;use common\models\User;use Yii;use yii\base\Model;/** * Login form */class ApiLoginForm extends Model{ public $username; public $password; //public $rememberMe = true; public $vitifyCode; private $_user; public function attributeLabels() //属性labels { return [ 'username' => '用户名', 'password' => '明码', //'rememberMe' => '记住我', //'vitifyCode' => '验证码', ]; } /** * {@inheritdoc} */ public function rules() { return [ // username and password are both required [['username', 'password'], 'required'], // rememberMe must be a boolean value //['rememberMe', 'boolean'], // password is validated by validatePassword() ['password', 'validatePassword'], //['vitifyCode', 'captcha'], //验证码验证 ]; } /** * Validates the password. * This method serves as the inline validation for password. * * @param string $attribute the attribute currently being validated * @param array $params the additional name-value pairs given in the rule */ public function validatePassword($attribute, $params) { if (!$this->hasErrors()) { $user = $this->getUser(); if (!$user || !$user->validatePassword($this->password)) { $this->addError($attribute, 'Incorrect username or password.'); } } } /** * Logs in a user using the provided username and password. * * @return bool whether the user is logged in successfully */ public function login() { if ($this->validate()) {// return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); $access_token = $this->_user->generateAccessToken(); $this->_user->expire_at=time()+3600*7*24;//设定access_token过期工夫 $this->_user->save(); Yii::$app->user->login($this->_user,3600*7*24); return $access_token; } else { return false; } } /** * Finds user by [[username]] * * @return User|null */ protected function getUser() { if ($this->_user === null) { $this->_user = User::findByUsername($this->username); } return $this->_user; }}在common/models User中实现generateAccessToken,代码如下: ...

September 11, 2020 · 3 min · jiezi

关于yii:Yii实现微信公众号的场景二维码

在Yii中实现场景二维码这里我应用的是easywechat插件,装置easywechat插件 composer require jianyan74/yii2-easy-wechatgithub地址:https://github.com/jianyan74/yii2-easy-wechat easywechat文档地址:https://www.easywechat.com/docs/master/overview 生成场景二维码前提: 微信的场景二维码性能次要是生成一个微信二维码,而后在手机应用微信扫描此二维码时,会触发微信告诉,所以咱们在生成场景二维码之前进行微信的服务端验证 1:服务端验证 $app = Yii::$app->wechat->getApp(); $server = $app->server; $response = $server->serve(); $response->send(); exit(); 服务端验证代码实现之后在微信公众号进行服务端验证即可 2:生成场景二维码 $app = Yii::$app->wechat->getApp();$app->server->push(function ($message) use ($app) { switch ($message['MsgType']){ case 'event': //扫码事件:SCAN 订阅事件:subscribe if (isset($message['Event']) && ($message['Event'] == 'SCAN' || $message['Event'] == 'subscribe')) { $openId = $message['FromUserName'];//扫面用户的openID //获取参数 if ($message['Event'] == 'SCAN') { $code= $message['EventKey']; } else { $code= str_replace('qrscene_', '', $message['EventKey']); } //发送图文音讯 $items = [ new NewsItem([ 'title'=> '图文题目', 'description' => '图文形容', 'url' => '图文链接', 'image'=> '图文图片, ]), ]; return new News($items); } break; default: break; }});$server = $app->server;$response = $server->serve();$response->send();exit();依据如上就能够实现场景二维码 ...

August 28, 2020 · 1 min · jiezi