# 基于 Laravel 5.5 开发的个人项目

## 项目概述
* 产品名称：LearnKu
* 项目代号：learnku
* 官方地址：https://www.learnku.net

## 功能如下
* 特别说明 —— 除站长外其他用户仅允许发表评论
* 用户认证 —— 注册、登录、退出；
* 个人中心 —— 用户个人中心，编辑资料；
* 上传图片 —— 修改头像时候上传图片；
* 表单验证 —— 使用表单验证类；
* 多角色权限管理 —— 允许站长，管理员权限的存在；
* 后台管理 —— 后台数据模型管理；
* 站内通知 —— 文章有新回复；
* 自定义中间件 —— 记录用户的最后登录时间；
* XSS 安全防御；
* 教程 —— 编辑教程，系统分享知识
* 微信支付 —— 优质教程收费系统 
* 七牛  —— 静态资源于图片均放在第三方七牛云服务器
* 自动备份 —— MySql 数据库自动备份

## 运行环境要求
* Nginx 1.8+
* PHP 7.0+
* Mysql 5.7+
* Redis 3.0+

## 开发环境部署/安装

本项目代码使用 PHP 框架 [Laravel 5.5](https://learnku.com/docs/laravel/5.5/) 开发，本地开发环境使用 [Laravel Homestead](https://learnku.com/docs/laravel/5.5/homestead)。
下文将在假定读者已经安装好了 Homestead 的情况下进行说明。如果您还未安装 Homestead，可以参照 [Homestead 安装与设置](https://learnku.com/docs/laravel/5.5/homestead#installation-and-setup) 进行安装配置。

### 基础安装

1. 克隆 learnku 源代码到本地：
```
git clone git@github.com:GucciLee/learnku.git
```

2. 配置本地的 Homestead 环境
编辑 Homestead.yaml 文件, 修改如下：
```
folders:
    - map: ~/my-path/learnku/ # 你本地的项目目录地址
      to: /home/vagrant/learnku

sites:
    - map: learnku.test
      to: /home/vagrant/learnku/public

databases:
    - learnku
```

修改完成后保存，然后执行以下命令应用配置信息修改：
```
vagrant provision && vagrant reload
```

3. 安装扩展包依赖
```
composer install      	// 进入到项目目录
```

4. 生成配置文件
```
cp .env.example .env    // 进入到项目目录
```

5. 生成数据表及生成测试数据
```
$ php artisan migrate --seed
```

6. 生成秘钥
```
php artisan key:generate

php artisan jwt:secret
```

7. 配置 hosts 文件
```
echo "192.168.10.10   learnku.test" | sudo tee -a /etc/hosts
```

### 前端框架安装
1). 安装 node.js 	// 直接去官网 https://nodejs.org/en/ 下载安装最新版本。

2). 安装 Yarn 		// 请安装最新版本的 Yarn —— http://yarnpkg.cn/zh-Hans/docs/install

3). 安装 Laravel Mix
```
yarn install
```

4). 编译前端内容
```
// 运行所有 Mix 任务...
npm run dev

// 运行所有 Mix 任务并缩小输出..
npm run production
```

5). 监控修改并自动编译
```
npm run watch

// 在某些环境中，当文件更改时，Webpack 不会更新。如果系统出现这种情况，请考虑使用 watch-poll 命令：

npm run watch-poll
```

### 链接入口
* 首页地址：http://www.learnku.net/

至此, 安装完成 ^_^。



## 扩展包使用情况
| 扩展包        | 一句话描述    |  本项目应用场景  |
| --------   | -----:   | ----: |
| [guzzlehttp/guzzle](https://github.com/guzzle/guzzle)	|	HTTP 请求套件 | 	请求百度翻译 API |
| [barryvdh/laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)	|	页面调试工具栏 (对 phpdebugbar 的封装) | 	开发环境中的 DEBUG |
| [spatie/laravel-permission](https://github.com/spatie/laravel-permission)	|	角色权限管理 | 	角色和权限控制 |
| [mewebstudio/Purifier](https://github.com/mewebstudio/Purifier)	|	用户提交的 Html 白名单过滤 | 	文章内容的 Html 安全过滤，防止 XSS 攻击 |
| [viacreative/sudo-su](https://github.com/viacreative/sudo-su)	|	用户切换	 | 开发环境中快速切换登录账号 |
| [predis/predis](https://github.com/nrk/predis.git)	| Redis 官方首推的 PHP 客户端开发包 | 	缓存驱动 Redis 基础扩展包 |
| [erusev/parsedown](https://github.com/erusev/parsedown)	| Markdown 转 Html | 文本编辑显示 |
| [laravel-lang](https://github.com/overtrue/laravel-lang)	| 中文语言包 |  翻译 Laravel 自带模板 |
| [qiniu/php-sdk](https://github.com/qiniu/php-sdk)	| 七牛云储存 |  用于存储上传图片 + 静态文件缓存加速 |
| [jwt-auth](https://github.com/tymondesigns/jwt-auth)	| JWT 令牌 |  Api 认证 |
| [intervention/image](https://github.com/Intervention/image)	| 裁剪图片 |  图片上传 |
| [summerblue/generator:~1.0](https://github.com/summerblue/generator)	|  代码生成器 |   代码生成器 |
| [hieu-le/active](https://github.com/letrunghieu/active)	|  为导航栏添加 `active` 类 |   导航的 Active 状态 |
| [Guzzle](https://github.com/guzzle/guzzle)	|  强大的 PHP HTTP 请求套件 |   使用 Guzzle 的 HTTP 客户端来请求 百度翻译 接口。 $ composer require "guzzlehttp/guzzle:~6.3" |
| [PinYin](https://github.com/overtrue/pinyin)	|  基于 CC-CEDICT 词典的中文转拼音工具 |  使用 PinYin 来作为翻译的后备计划 $ composer require "overtrue/pinyin:~3.0" |
| [Horizon](https://learnku.com/docs/laravel/5.5/horizon)	|  为 Laravel Redis 队列提供了一个漂亮的仪表板 |   查看和管理 Redis 队列任务执行的情况 |
| [spatie/laravel-backup](https://github.com/spatie/laravel-backup)	| 自动备份你的 Laravel 程序 | 每天自动备份和清理 MySql 数据库 |


## 自定义 Artisan 命令
| 命令行名字        | 说明    |  Cron  | 代码调用 |
| --------   | -----:   | :----: | :----: |
| learnku:generate-token   | 快速为用户生成 jwt token   | 开发调试使用 | postman api 测试 |

## 队列清单
| 名称        | 说明    |  调用时机  |
| --------   | -----:   | :----: |


## 生产环境部署

#### 0. [nginx]() 或者 [apache]() 配置

#### 1. 克隆 learnku 源代码到本地：
> $ git clone git@github.com:GucciLee/learnku.git learnku

#### 2. 安装扩展包依赖
> $ composer dump-autoload

> $ composer install      	// 进入到项目目录

#### 3. 生成配置文件
> $ cp .env.example .env    // 进入到项目目录

#### 4. 创建数据库
> learnku

#### 5. 生成数据表
> $ php artisan migrate

#### 6. 生成秘钥
> $ php artisan key:generate

> $ php artisan jwt:secret

#### 7. 赋予项目权限			// 一定要给与权限，否则会报 500 错误
> $ chmod 777 -R storage/

> $ chmod 777 -R public/uploads/

#### 8. 设置管理员
> $ php artisan tinker
> $ $user = App\Models\User::find(1)
> $ $user->assignRole('Founder');
> exit

#### 9. 程序优化
| 功能        | 缓存    |  清除  |  特殊说明  |
| :--------   | :-----   | :---- | :---- |
| 1. 配置信息缓存   | php artisan config:cache   | php artisan config:clear | ~ |
| 2. 路由缓存   | php artisan route:cache   | php artisan route:clear | ~ |
| 3. 类映射加载优化   | php artisan optimize --force   | php artisan clear-compiled | ~ |
| 4. 自动加载优化  | composer dumpautoload -o   | ~ | `注意：php artisan optimize --force 命令里已经做了这个操作。` |
| 5. 使用 Memcached 来存储会话   | 文件：`config/session.php` 修改=》 'driver' => 'memcached',   | ~ | ~ |
| 6. 使用专业缓存驱动器   | 文件：`config/session.php` 修改=》 'default' => 'redis',   | ~ | ~ |

