# blog_init **Repository Path**: mowocc/blog_init ## Basic Information - **Project Name**: blog_init - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-03-18 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #考核说明 ``` 项目应基于laravel6完成开发【已完成】 ## API设计 1. 统一返回数据结构。(必须)【已完成】 2. 统一错误处理。(可选)【已完成】 ## 登录 1. 三种角色正常登录。(必须)【已完成】 2. 后续登录状态持续认证。(必须)【已完成】 3. 持久化登录方案。(必须)【已完成】 4. 统一封装认证逻辑。(可选)【已完成】 5. 与核心交互独立服务或类封装。(可选)【已完成】 ## 环境区分 1. 不同域名完成区分环境。(必须)【需求不明确,暂未实现】 2. 环境文件更新方案。(必须)【已完成】 ``` # 框架目录 - `app` 应用核心目录 - `bootstrap` 启动目录 - `config` 配置目录 - `database` 数据迁移目录 - `public` 入口及资源文件目录 - `resources` 未编译的资源文件目录 - `routes` 路由目录 - `storage` 缓存、日志、模板等目录 - `tests` 测试目录 - `vendor` Composer依赖包目录 # app 目录 应用的核心代码位于 app 目录下 ## Api 层级划分 - 路由层(路由划分)routes 目录 - 中间件层(权限认证、CSRF 保护)app\Http\Middleware 目录 - 表单验证层(参数的验证和过滤)app\Http\Requests 目录 - 控制器层(主逻辑的控制和调度)app\Http\Controllers 目录 - 业务逻辑层(处理主要业务逻辑)app\Services 目录 - 数据映射层(Post数据映射和格式化)app\Mappers 目录 - 模型层(数据库交互)app\Models 目录 - 数据转化层(格式化数据)app\Http\Resources 目录 - 数据反馈层(Response数据)app\Core\Response 目录 ## Api 异常处理 ### 系统异常 - Handler拦截层(拦截系统异常)app\Exceptions\Handler 类 - 系统信息转化层(格式化系统信息)app\Core\Entity\Message 目录 - 数据反馈层(Response数据)app\Core\Response 目录 ### 自定义异常 - Exception拦截层(拦截自定义异常)app\Exceptions 目录 - 自定义信息转化层(格式化自定义信息)app\Core\Entity\Message 目录 - 数据反馈层(Response数据)app\Core\Response 目录 #### 异常分类 - 系统异常 app\Exceptions\Response\System 目录 - 中间件异常 app\Exceptions\Response\Middleware 目录 - 数据验证异常 app\Exceptions\Response\Request 目录 - 业务逻辑异常 app\Exceptions\Response\Service 目录 - 模型异常 app\Exceptions\Response\Model 目录 # 项目初始化 ## 初始化数据库 `first_domain` 数据库 ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS first_domain DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建token持久化表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `first_domain`.`hs_auth_token`; CREATE TABLE `first_domain`.`hs_auth_token` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '用户ID', `user_type` tinyint(4) NOT NULL COMMENT '用户类型:1老师,2家长,3学生', `token` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'token', `created` int(11) NOT NULL COMMENT '创建时间', `updated` int(11) NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `idx_token`(`token`) USING BTREE, UNIQUE INDEX `idx_user_id_type`(`user_id`, `user_type`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1; ``` `second_domain` 数据库 ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS second_domain DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建token持久化表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `second_domain`.`hs_auth_token`; CREATE TABLE `second_domain`.`hs_auth_token` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '用户ID', `user_type` tinyint(4) NOT NULL COMMENT '用户类型:1老师,2家长,3学生', `token` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'token', `created` int(11) NOT NULL COMMENT '创建时间', `updated` int(11) NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `idx_token`(`token`) USING BTREE, UNIQUE INDEX `idx_user_id_type`(`user_id`, `user_type`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1; ``` ## 启动项目 - 部署代码到 Apache 或者 Nginx 运行目录 - 配置域名 `first.domain.com`, `second.domain.com` 同时指向laravel项目 `public` 目录 - 重启服务 Apache 或者 Nginx # Api接口测试 - 在项目根目录下,有一个 `blog.postman_collection.json` 文件,导入Postman工具 - 三种身份的接口已经初始化好参数,可以直接测试了 - 正确的调用顺序:1.登录;2.获取数据;3.退出。请注意对应身份 - 调用 `数据列表` 接口,如果使用其他账号的 `token` 或无效 `token`,接口将无法访问 # 自动刷新配置 - 根据域名调整配置,不建议通过刷新文件的方式实现 - 动态更新配置可以使用php实现,但由于时间原因,使用 shell 脚本方式 - 脚本 shell 文件在项目根目录 `blog.update_config.sh` - 配置 json 文件在项目根目录`blog.postman_collection.json` ```shell #!/bin/bash src=/data/test/blog.domain_config.json des=/data/test/.env URL=`grep app_url ${src} |sed -r 's/.*"(.+)".*/\1/'` HOST=`grep db_host ${src} |sed -r 's/.*"(.+)".*/\1/'` DATABASE=`grep db_name ${src} |sed -r 's/.*"(.+)".*/\1/'` PORT=`grep db_port ${src} |sed -r 's/.*"(.+)".*/\1/'` USERNAME=`grep db_username ${src} |sed -r 's/.*"(.+)".*/\1/'` PASSWORD=`grep db_password ${src} |sed -r 's/.*"(.+)".*/\1/'` ENV=`grep env ${src} |sed -r 's/.*"(.+)".*/\1/'` sed -i "s!^\(APP_URL=\).*!\1$URL!" $des sed -i "s/^\(DB_HOST=\).*/\1$HOST/" $des sed -i "s/^\(DB_DATABASE=\).*/\1$DATABASE/" $des sed -i "s/^\(DB_PORT=\).*/\1$PORT/" $des sed -i "s/^\(DB_USERNAME=\).*/\1$USERNAME/" $des sed -i "s/^\(DB_PASSWORD=\).*/\1$PASSWORD/" $des sed -i "s/^\(APP_ENV=\).*/\1$ENV/" $des ``` # 其他问题 - 为了节省时间,没有使用laravel数据迁移功能,直接使用sql创建数据库表。 - Postman配置文件默认域名是 `first.domain.com`,可以通过设置域名变量来实现动态切换 - 真实情况的权限验证会更复杂,项目内部有 `Policy` 相关模块,可以精确到具体操作的权限验证,因为没有具体需求,没有实现完整功能。