|
|
|
@ -0,0 +1,296 @@
|
|
|
|
|
|
|
|
# 准备开发
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 开发环境
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* 推荐本地安装 `composer` 、 `php 7.3+`、 `pnpm`
|
|
|
|
|
|
|
|
* 本地必须安装 `node`
|
|
|
|
|
|
|
|
* 需要学会使用 `Laravel 8`、 `Vue 3`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* [Laravel 8 中文文档](https://learnku.com/docs/laravel/8.5)
|
|
|
|
|
|
|
|
* [IconPark](https://iconpark.oceanengine.com/official)
|
|
|
|
|
|
|
|
* 后台图标库
|
|
|
|
|
|
|
|
* [Naive UI](https://www.naiveui.com/zh-CN/os-theme/components/avatar)
|
|
|
|
|
|
|
|
* 后台 ui 组件库
|
|
|
|
|
|
|
|
* [Tailwind CSS](https://www.tailwindcss.cn/docs)
|
|
|
|
|
|
|
|
* 后台 css 框架
|
|
|
|
|
|
|
|
* [Vitesse Lite](https://github.com/antfu/vitesse-lite/blob/main/README.zh-CN.md)
|
|
|
|
|
|
|
|
* 后台是在这个模板基础上魔改的 js 版本
|
|
|
|
|
|
|
|
* 意味着它使用的黑魔法在后台都支持
|
|
|
|
|
|
|
|
* 基于文件的路由
|
|
|
|
|
|
|
|
* 组件自动化加载
|
|
|
|
|
|
|
|
* UnoCSS - 高性能且极具灵活性的即时原子化 CSS 引擎
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Nginx
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* 目录请指向 `/public`
|
|
|
|
|
|
|
|
* 追加伪静态配置
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
location / {
|
|
|
|
|
|
|
|
try_files $uri $uri/ /index.php$is_args$query_string;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 后台
|
|
|
|
|
|
|
|
* 代码仓库 [sa0ChunLuyu/LuCodeVueAdmin](https://gitee.com/sa0ChunLuyu/lu-code-vue-admin)
|
|
|
|
|
|
|
|
* `pnpm i`
|
|
|
|
|
|
|
|
* `pnpm dev`
|
|
|
|
|
|
|
|
* `pnpm build`
|
|
|
|
|
|
|
|
* `npm install -g pnpm`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Mix后台
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 仓库
|
|
|
|
|
|
|
|
* Gitea代码仓库 [sa0ChunLuyu/LuCodeAdminMix](http://gitea.pi.sa0.online:3000/sa0ChunLuyu/LuCodeAdminMix)
|
|
|
|
|
|
|
|
* Gitee代码仓库 暂不对外开放
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 部署流程
|
|
|
|
|
|
|
|
* 通过模板创建仓库
|
|
|
|
|
|
|
|
* 创建本地测试环境
|
|
|
|
|
|
|
|
* 本地clone项目
|
|
|
|
|
|
|
|
* `mysql.server start`
|
|
|
|
|
|
|
|
* 创建数据库 `utf8mb4_general_ci`
|
|
|
|
|
|
|
|
* 创建`.env`文件,修改内容
|
|
|
|
|
|
|
|
* `composer install`
|
|
|
|
|
|
|
|
* `php artisan key:generate`
|
|
|
|
|
|
|
|
* `php artisan storage:link`
|
|
|
|
|
|
|
|
* `php artisan migrate`
|
|
|
|
|
|
|
|
* `php artisan serve`
|
|
|
|
|
|
|
|
* 部署服务器
|
|
|
|
|
|
|
|
* 服务器clone项目
|
|
|
|
|
|
|
|
* 部署宝塔,创建数据库
|
|
|
|
|
|
|
|
* 创建`.env`文件,修改内容
|
|
|
|
|
|
|
|
* `composer install`
|
|
|
|
|
|
|
|
* `chown www.www storage/ -R`
|
|
|
|
|
|
|
|
* `php artisan storage:link`
|
|
|
|
|
|
|
|
* `php artisan migrate`
|
|
|
|
|
|
|
|
* 部署后台
|
|
|
|
|
|
|
|
* 本地修改后台域名
|
|
|
|
|
|
|
|
* `pnpm build`
|
|
|
|
|
|
|
|
* `git push`
|
|
|
|
|
|
|
|
* 配置Git
|
|
|
|
|
|
|
|
* `vim .git/config`
|
|
|
|
|
|
|
|
```angular2html
|
|
|
|
|
|
|
|
[credential]
|
|
|
|
|
|
|
|
helper = store
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 常用命令行
|
|
|
|
|
|
|
|
* `php artisan make:model User -mc` 创建 控制器 + 数据库
|
|
|
|
|
|
|
|
* 生成数据库
|
|
|
|
|
|
|
|
* `php artisan migrate` 追加
|
|
|
|
|
|
|
|
* `php artisan migrate:fresh` 初始化
|
|
|
|
|
|
|
|
* `php artisan make:controller YoController` 创建控制器
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 常用代码段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 接口
|
|
|
|
|
|
|
|
### Yo
|
|
|
|
|
|
|
|
#### return
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
|
|
Yo::echo($data = []);
|
|
|
|
|
|
|
|
Yo::create_echo($id);
|
|
|
|
|
|
|
|
Yo::update_echo($id);
|
|
|
|
|
|
|
|
Yo::delete_echo($id);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 输出
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"code": 200,
|
|
|
|
|
|
|
|
"message": "增加成功",
|
|
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
|
|
"id": 12
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### exit
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
|
|
Yo::exit($data); // 会以 JSON 的形式输出 $data 的内容。
|
|
|
|
|
|
|
|
Yo::error_echo($code, $replace = []);
|
|
|
|
|
|
|
|
// code 在 /config/code.php 中配置
|
|
|
|
|
|
|
|
// $replace 为 ? 替换字符
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Yo::error_echo(100001, ['替换内容']);
|
|
|
|
|
|
|
|
// 在 code.php 中 100001 => '?固定内容',
|
|
|
|
|
|
|
|
// 输出
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"code": 100001,
|
|
|
|
|
|
|
|
"message": "替换内容固定内容"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Yo::error_echo(100002);
|
|
|
|
|
|
|
|
// 输出
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"code": 100002,
|
|
|
|
|
|
|
|
"message": "错误信息"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
### Lu
|
|
|
|
|
|
|
|
* `Lu::ssl()` 返回是不是 HTTPS
|
|
|
|
|
|
|
|
* `Lu::ip()` 返回用户 IP
|
|
|
|
|
|
|
|
* `Lu::ge($str)` 去掉字符串空格
|
|
|
|
|
|
|
|
* `Lu::fp($path)` 返回当前域名完整路径
|
|
|
|
|
|
|
|
* `Lu::date($time = false, $format = "Y-m-d H:i:s")` 返回格式化时间
|
|
|
|
|
|
|
|
* `Lu::time()` 返回毫秒时间戳
|
|
|
|
|
|
|
|
* `Lu::post($url, $data, $type = 'json')` 发送 POST 请求
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Login
|
|
|
|
|
|
|
|
* `Login::admin($auth_id = 0)` 检查权限,在数据库 `db.auths` 中配置,没有权限会直接退出
|
|
|
|
|
|
|
|
* `Login::admin_check($auth_id = 0)` 检查权限,没有权限会 `return`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 增删改查
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use App\Http\Requests\EditUserInput;
|
|
|
|
|
|
|
|
use App\Models\User;
|
|
|
|
|
|
|
|
use Login;
|
|
|
|
|
|
|
|
use Yo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WordBankController extends Controller
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
public function create(EditUserInput $request)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Login::admin(1);
|
|
|
|
|
|
|
|
$name = $request->post('name');
|
|
|
|
|
|
|
|
$order = $request->post('order');
|
|
|
|
|
|
|
|
$user = new User();
|
|
|
|
|
|
|
|
$user->name = $name;
|
|
|
|
|
|
|
|
$user->order = $order;
|
|
|
|
|
|
|
|
$user->save();
|
|
|
|
|
|
|
|
return Yo::create_echo($user->id);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function delete()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Login::admin(11);
|
|
|
|
|
|
|
|
$id = request()->post('id');
|
|
|
|
|
|
|
|
User::where('id', $id)->delete();
|
|
|
|
|
|
|
|
return Yo::delete_echo($id);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function update(EditWordBankInput $request)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Login::admin(11);
|
|
|
|
|
|
|
|
$id = request()->post('id');
|
|
|
|
|
|
|
|
$name = $request->post('name');
|
|
|
|
|
|
|
|
$order = $request->post('order');
|
|
|
|
|
|
|
|
$user = User::find($id);
|
|
|
|
|
|
|
|
if (!$user) Yo::error_echo(100021, ['用户']);
|
|
|
|
|
|
|
|
$user->name = $name;
|
|
|
|
|
|
|
|
$user->order = $order;
|
|
|
|
|
|
|
|
$user->save();
|
|
|
|
|
|
|
|
return Yo::update_echo($user->id);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function list()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
$user_list = User::orderBy('order', 'desc')->get();
|
|
|
|
|
|
|
|
return Yo::echo(['list' => $list]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Requests
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Requests;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use Illuminate\Contracts\Validation\Validator;
|
|
|
|
|
|
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
|
|
|
|
|
|
use Yo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EditUserInput extends FormRequest
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Determine if the user is authorized to make this request.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return bool
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public function authorize()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Get the validation rules that apply to the request.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public function rules()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
|
|
|
'name' => ['required', 'between:1,30'],
|
|
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function messages()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
|
|
|
'name.required' => 100001,
|
|
|
|
|
|
|
|
'name.between' => 100002,
|
|
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function failedValidation(Validator $validator)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Yo::error_echo($validator->errors()->first());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 后台
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* 新建页面 `b` 时需要创建 `a.vue` 和 `a/b.vue` 两个文件
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### a.vue
|
|
|
|
|
|
|
|
```vue
|
|
|
|
|
|
|
|
<script setup></script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
|
|
|
|
<router-view></router-view>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<route>
|
|
|
|
|
|
|
|
{redirect: '/a/b',"meta":{"title":"多级菜单"}}
|
|
|
|
|
|
|
|
</route>
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### a/b.vue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```vue
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* name:
|
|
|
|
|
|
|
|
* user:sa0ChunLuyu
|
|
|
|
|
|
|
|
* date:2022年10月8日 16:56:44
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
|
|
|
<n-card title="多级菜单">
|
|
|
|
|
|
|
|
<div></div>
|
|
|
|
|
|
|
|
</n-card>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</style>
|
|
|
|
|
|
|
|
<route>
|
|
|
|
|
|
|
|
{"meta":{"title":"多级菜单"}}
|
|
|
|
|
|
|
|
</route>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|