# hypercmf1.0 **Repository Path**: hypercmf/hypercmf1.0 ## Basic Information - **Project Name**: hypercmf1.0 - **Description**: 基于Hyperf v2.2和Layui开发的内容权限管理框架。 - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: http://www.hypercmf.com - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 1 - **Created**: 2023-06-02 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 前言 ## 项目介绍 Hypercmf 是基于Hyperf + layui 的内容、权限管理框架,使用前请先学习了解Hyperf。感谢Hyperf团队给phper提供了一个优雅与高性能共存的完美框架,让phper能够走上微服务的开发之路。 ## 初衷 本内容框架主要目的是让已经使用Hyperf的phper能够像以前使用其他php框架一样,方便开发后端页面和功能。之所以选择经典UI框架Layui,是因为Layui是大多数后端开发人员都熟知的UI框架,不管是前后端分离还是直接通过php渲染,Layui都是不错的选择;同时也降低了很多还没上手vue的phper的使用门槛。 ## 赞助 如果您享受 Hypercmf 带来的高开发效率或者学习参考价值,可以赞助一下来表示您对Hypercmf的认可。 ![支付宝](./public/static/images/zhi.png) ![微信](./public/static/images/wxpay.png) ## 参考文档 使用该内容框架时,可以参考Hyperf官方文档,本框架该版本请使用Hyperf2.2版本的文档。 [链接](https://hyperf.wiki/2.2/#/) Layui文档 [链接](https://layui.dev/) # 版本管理 ## 版本更新记录 | 版本 | 发布时间 | Hyperf版本 | | --- | --- | --- | | 1.0.0 | 2023年4月 | v2.2 | ## 版本说明 # 开始使用 ## 演示地址 [hypercmf演示地址](http://demo.hypercmf.com/admin/login.html) 账号:test 密码:test ## 联系我 微信:forpastime ## 安装 # Git安装 主要使用`git`版本库安装和更新。 ## \[ 码云 \] ``` git clone https://gitee.com/hypercmf/hypercmf1.0.git ``` # 环境要求 * PHP >=7.4 and <= 8.0 * Redis 必须 * Linux环境 Linux下需要安装PHP的swoole4.x 扩展并关闭了`Short Name` 另外,按照Hyperf官方文档还需要安装以下扩展 * JSON PHP 扩展 * Pcntl PHP 扩展 * OpenSSL PHP 扩展(如需要使用到 HTTPS) * PDO PHP 扩展 (如需要使用到 MySQL 客户端) * Redis PHP 扩展 (如需要使用到 Redis 客户端) * Protobuf PHP 扩展 (如需要使用到 gRPC 服务端或客户端) * Docker环境 如果你是在windows下开发,使用docker请参考下面启动容器代码,“ E:\projects\hypercmf”即从git仓库克隆下来存放到你电脑的项目的路径,“/data/hypercmf”为容器内项目存放路径,其中9512是注册到Nacos服务中心的端口号。 ``` docker run -it --name hypercmf \ -v E:\projects\hypercmf:/data/hypercmf \ -p 9501:9501 \ -p 9502:9502 \ -p 9512:9512 \ --privileged -u root \ --entrypoint /bin/sh \ hyperf/hyperf:7.4-alpine-v3.11-swoole ``` 如果是在Linux环境下使用Docker,则参考下面启动容器代码 ``` docker run -it --name hypercmf \ -v /www/hypercmf:/data/hypercmf \ -p 9501:9501 \ -p 9502:9502 \ -p 9512:9512 \ --privileged -u root \ --entrypoint /bin/sh \ hyperf/hyperf:7.4-alpine-v3.11-swoole ``` * Windows环境 windows环境下是无法使用swoole的,所以windows环境下无法运行Hyperf项目,只有通过Docker Desktop来运行Hypercmf。 ## 目录结构 ~~~ 目录结构基本上是Hyperf生成的目录结构。Restful接口统一有Controller注解生成,Controller内通过各业务Service调用Model层实现数据库查询。 ├── app │ ├── Aspect //切面 │ ├── Common │ │ └── Common.php // 常量函数库 │ ├── Constants │ │ └── StatusCode.php // 常量状态码,枚举类 │ ├── Controller // 通过目录划分应用 │ │ ├── Admin // 后台应用 │ │ │ ├── ArticleController.php // 文章控制器 │ │ │ ├── DataController.php // 数据备份管理控制器 │ │ │ ├── FileController.php // 附件控制器 │ │ │ ├── IndexController.php // 后台首页控制器 │ │ │ ├── LoginController.php // 后台登录控制器 │ │ │ ├── NodeController.php // 后台节点控制器 │ │ │ ├── SystemController.php // 系统配置控制器 │ │ │ ├── UserController.php // 管理员及用户控制器 │ │ ├── Api // 接口应用 │ │ │ ├── FilController.php // 文件管理控制器 │ │ │ ├── PayNotifyController.php // 支付回调通知 │ │ │ ├── UserController.php // 用户接口 │ │ │ ├── WxController.php // 微信应用接口 │ │ ├── Home // 前台应用,控制器目录 │ │ │ └── NotifyController.php // 接收通知控制器 │ │ ├── AdminBaseController.php // 后台使用模板引擎可以继承该类,封装了 返回方法和渲染模板方法 │ │ └── AbstractController.php //根据官方文档,不建议继承该类,建议使用Hypercmf封装的Result工具类 │ ├── │ ├── Exception // 异常 │ ├── │ ├── Listener // 监听 │ ├── Middleware // 中间件 │ ├── Models // 数据库模型 │ ├── Service //服务类 │ │ ├── AdminService.php //管理员业务服务层 │ │ ├── AdminServiceInterface.php // 管理员业务服接口 │ │ ├── FileService.php // 文件业务服务层 │ │ ├── SmsService.php // 短信业务服务层 │ │ ├── UserService.php // 客户端用户业务服务层 │ │ ├── UserServiceInterface.php // 客户端用户业务服务层接口 │ │ ├── WechatService.php // 微信应用业务服务层 │ ├── Utils //工具类库 │ │ └── Result.php // 统一返回方法封装,该类接管了Response上下文,不影响中间件使用 │ ├── View //视图模板 │ │ ├── admin //后台渲染模板 │ │ └── home //前端渲染模板 ├── bin │ └── hyperf.php // Hyperf启动文件 ├── config // 配置文件目录 │ ├── autoload // Hyperf各功能配置文件(主要的) │ │ ├── amqp.php │ │ ├── aspect.php │ │ ├── databases.php │ │ ├── file.php │ │ ├── logger.php │ │ ├── middlewares.php │ │ ├── redis.php │ │ ├── server.php │ │ ├── services.php │ │ ├── view.php │ │ ├── watcher.php │ ├── config.php // 主配置文件 │ ├── container.php // 容器入口文件 │ └── routes.php // 路由配置文件 ├── data //sql文件及备份文件 ├── public // 静态目录 │ │ ├── admin //后台管理系统页面 │ │ ├── uploads //上传到本地文件存储目录 │ │ └── static// 静态资源 ├── routes │ └── user.php // 分模块配置路由文件(示例) ├── runtime //缓存目录 ├── test // 单元测试 ├── vendor// 监听启动脚本文件 └── .env.example // 环境变量配置文件,在项目根目录创建“.env”后将该文件内容复制进去修改为自己的配置项 ~~~ ## 开发规范 * 目录名均首字母大写,类库、函数文件统一以`.php`为后缀。可以使用 hyperf命令生成部分,比如常见的Controller、Model、Middleware、Listener等。自动生成的文件无论是类名、方法名都是规范的驼峰法。 ``` gen:amqp-consumer gen:amqp-producer gen:aspect gen:command gen:constant gen:controller gen:job gen:kafka-consumer gen:listener gen:middleware gen:migration gen:model gen:nats-consumer gen:nsq-consumer gen:process gen:request gen:resource gen:seeder ``` * Hypercmf也将常用的一些函数进行了封装,存放在/app/Common/common.php内。建议创建新方法时,使用统一的`for_`前缀,有助于想使用方法是通过`for_`前缀可以快速根据提示选择方法。 * 数据表和字段采用小写加下划线方式命名,默认表前缀为`for_`。并注意字段名不要以下划线开头,例如`for_user`表和`user_name`字段,不建议使用驼峰和中文作为数据表及字段命名。如果表中有创建时间和更新时间,建议使用`created_at`和`updated_at`。然后通过使用 gen:model + 表名(如:php bin/hyperf gen:model user),生成后代码执行新增数据和更新数据时不传入created_at和updated_at的值也会默认匹配created_at和updated_at字段。 * Hyperf查询时select()中传入的值是数组,但是从编码角度['id','name']这样的写法可能很多会Thinkphp的phper觉得比较麻烦,所以我们封装了转换方法,传入的字段写法:'id,name',调用方法直接转换成数组再传进去 ~~~ for_field_str_to_array($field) //伪代码 class UserService { public function getVodOne($where=[],$field='id,name,age') { $field = for_field_str_to_array($field); return $this->userModel->getOne($where,$field); } } ~~~ # 特色功能 ## 代码注解生成后台菜单和权限节点 ### 节点 我们把 Module/Controller/action称之为一个“节点”,比如admin/UserController/login表示后台用户登录节点,这个节点是可以被后台管理分配给管理员权限的。当然“节点”是可以存着于任何模块,比如有一个Blog/FansController/ban(博客粉丝禁言)节点,我们完全可以给不同角色的博主通过节点权限控制是否能够禁言粉丝。 ### AdminNode注解 HyperCMF封装了自定义的AdminNode注解功能,只需要在每个控制器方法上添加该注解,再通过命令或后台管理更新注解菜单,即可将新增代码的注解节点添加到node数据表中去。 方法一:命令 `php bin/hyperf.php for:annotation-menu-into-node` 方法二:后台更新 系统管理->操作权限管理->更新注解菜单 ### AdminNode注解使用 文件位置:/app/Annotation/AdminNode.php 就像注入Controller和GetMapping类似,类级的注解为顶级节点,方法级的注解为顶级节点的子节点。 类级节点注解: ~~~ /** * @AdminNode(name="节点管理",isMenu=1,sort=20,style="layui-icon-radio") * * @Middlewares({ * @Middleware(AdminTokenMiddleware::class), * @Middleware(AdminPowerMiddleware::class) * }) * @Controller(prefix="admin/node") */ class NodeController{} ~~~ 方法级注解: ~~~ /** * @AdminNode(name="节点更新",isMenu=1,sort=30) * @GetMapping(path="update") * @return mixed */ ~~~ 注解的属性有:name节点名称、isMenu是否显示为后台菜单、sort节点排序值、style icon样式(顶级节点有效) ### 类注解节点和后台修改冲突时 * 如果顶级node(parent_id==0)记录的action_name则默认直接打开对应index页面,若action_name为“#”则表示有子菜单。 * 所以顶级节点通过后台手动修改为 index,在注解更新node时,如果顶级node 的action_name为"#"号时,会和顶级node同名control_name 且 action_name 为"index"的数据库记录使用同一条记录,所以不会将注解节点更新覆盖手动修改的节点记录信息。 ### 后台菜单管理 菜单管理功能对应的有admin、role、node三张表,其中管理员和角色对应的权限均在node表中。 node表数据组成是:后台手动添加菜单 + 代码注解菜单 ## 文件管理 HyperCMF已将文件管理完成。支持本地、阿里云OSS、七牛云Kodo。 在需要引用上传文件的地方弹出文件列表,双击可以选择传值到父页面。 ### 图片选择器 我们写了一个图片选择器,只需要通过layer.open打开 admin/public/image_list.html即可,在父页面监听该页面回传的值,在该页面下“使用选中图片”即可回传给父页面。 ### 富文本编辑器 富文本编辑器使用的是Ueditor,编辑器的文件上传也会将记录存储到文件管理,支持单图、多图、视频上传。