# huicmf_webman **Repository Path**: dingduan/huicmf_webman ## Basic Information - **Project Name**: huicmf_webman - **Description**: Huicmf基于 webman开发的 后台权限管理系统 - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 25 - **Created**: 2023-11-01 - **Last Updated**: 2023-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于webman+mysql 开发的php后台权限管理系统 # huicmf_webman 支持一键CURD 支持自定义域名绑定,可以隐藏后台地址 【新增】 博客插件,可以使用博客啦,默认博客前台访问地址: http://127.0.0.1:8787/blog ### 项目地址: #### **【gitee】** https://gitee.com/xianrenqh/huicmf_webman ### 使用文档地址: [https://gitee.com/xianrenqh/huicmf_webman/wikis/pages](https://gitee.com/xianrenqh/huicmf_webman/wikis/pages) --- ## 后台演示 http://webman.xiaohuihui.club/admin 账号:admin 密码:admin888 ## 运行环境~~!: > php: 8.0.2+ > > mysql: 5.5+ > > Redis ## 备注: > ## 后台登录做了登录错误安全限制: 1. N分钟内连续错误超过N次,限制此ip再次访问。(需要在后台设置里(或者数据库中)解除ip,然后清除缓存) 2. N分钟内连续N次输入密码错误,此账号将禁止登录。(过去N分钟之后才能再次登录) 3. 1和2中的N可以在环境变量.env中设置(默认均为10): ``` #允许登录失败几次 login_failure_times = 10 #登录失败超过N次则后,多久允许重写登录(分钟) login_failure_min = 10 ``` > 注意:如果自己把自己锁定了(一般测试时,自己把自己玩坏了),上面的1中,解决方案(2种): > > 1) 更换ip访问后台并解封ip > 2) 如果没有ip,可以在数据库配置中删除对应的ip,然后redis缓存中找到对应的缓存,清除掉 ## 安装: ### 1.首先clone代码到项目目录: ~~~ https://gitee.com/xianrenqh/huicmf_webman.git ~~~ ### 2.在项目根目录执行: > composer update ### 3.启动服务 在命令行中执行: ```shell # Windows php windows.php # Linux php start.php ``` ### 4.安装并设置后台账户密码: 浏览器访问: http://127.0.0.1:8787/install 进入数据库配置页面以及后台管理员账户密码设置 安装成功后会自动在根目录创建 .env 文件 ### 4.默认端口端口 默认端口:8787 > **更改默认端口方法:** > > 如果使用了.env文件,请在env文件中更改端口【APP_PORT】 > >---- > >如果没有使用.env文件: > > 请在\config\server.php 文件中更改: > >'listen' => 'http://0.0.0.0:8787', ### 5.执行启动命令 (不知道命令的可以继续往下看) ### 6.愉快的访问后台吧: > http://127.0.0.1:8787/admin > > 用户名:admin > > 密码: 123456 > > ---- ### 7.配置伪静态(nginx转发[需要配置nginx反代]): ```nginx location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Connection ""; if (!-f $request_filename){ proxy_pass http://webman; } } ``` ### 8.Nginx反向代理 官方案例: ``` upstream webman { server 127.0.0.1:8787; keepalive 10240; } server { server_name 站点域名; listen 80; access_log off; root /your/webman/public; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Connection ""; if (!-f $request_filename){ proxy_pass http://webman; } } } ``` 自己整理案例: ``` upstream webman { server 127.0.0.1:8787; keepalive 10240; } server { listen 80; listen [::]:80; server_name webman.xiaohuihui.net; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/webman.xiaohuihui.net/public; access_log off; #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; #SSL-END #ERROR-PAGE-START 错误页配置,可以注释、删除或修改 #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END #PHP-INFO-START PHP引用配置,可以注释或修改 include enable-php-74.conf; #PHP-INFO-END #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 include /www/server/panel/vhost/rewrite/webman.xiaohuihui.net.conf; #REWRITE-END #禁止访问的文件或目录 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) { return 404; } #一键申请SSL证书验证目录相关设置 location ~ \.well-known{ allow all; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; # 这里是重点 proxy_pass http://webman; error_log /dev/null; access_log /dev/null; } location ~ .*\.(js|css)?$ { expires 12h; # 这里是重点 proxy_pass http://webman; error_log /dev/null; access_log /dev/null; } } ``` 以上代码中, **_location ~_** 中的 一定要注意,如果没处理好这里, 可能会出现部分静态资源无法访问到情况 ### 8.配置网站的运行目录为:**public** ### 9.绑定域名 (不绑定域名请使用 ip+端口访问) ### 10. **开启自定义域名访问** #### 为何要配置自定义域名 > HuiCmf-webman 默认的后台地址为 ip:端口+/admin ,可能存在普遍性和不安全性,为了防止对外暴露的风险,开发人员可进行自定义域名配置 ### 配置提醒 * 请在后台管理系统成功安装后再进行自定义域名配置 * * 配置自定义域名访问后,原有的 ip:端口/admin 方式,以及index前端方式将自动失效 * * 绑定域名开启后,所有的模块都需要绑定域名才能访问 ### 如何配置自定义域名 进入 .env 文件中,修改 `ADMIN_DOMAIN_STATUS` 参数值为 true、 修改 `ADMIN_DOMAIN` 参数值为你要配置的域名,例如 admin18Ue7.xxx.com > 如果需要前台模块,以及api模块,请修改: > > INDEX_DOMAIN > > API_DOMAIN > > 如果框架还存在项目首页或者其他应用页面,请自行把每个应用对应的域名也配置上。 > 需要在 config/plugin/webman/domain/app.php 中配置 > domain/app.php参考配置案例: ```php Env::get('HUICMF.ADMIN_DOMAIN_STATUS', false), // 多应用绑定关系 'bind' => [ //例如:'网站默认地址,例如 www.baidu.com' => '', '127.0.0.1' => '', // 不属于任何应用 Env::get('HUICMF.INDEX_DOMAIN') => 'index', // 绑定到index应用 Env::get('HUICMF.ADMIN_DOMAIN') => 'admin', // 绑定到admin应用 Env::get('HUICMF.API_DOMAIN') => 'api', // 绑定到api应用 ], // 绑定关系,域名,应用的验证逻辑,返回true时认为符合绑定关系,反之不符合返回404 'check' => function ($bind, $domain, $app) { return isset($bind[$domain]) && $bind[$domain] === $app; } ]; ``` 然后在 Nginx 中配置域名的反向代理 [根据实际项目自行修改] ```shell # 如果需要SSL请自行配置证书即可 # admin18Ue7 这个参数可以自定义 upstream admin18Ue7 { server 127.0.0.1:8787; # 此端口对应 .env 中的 APP_PORT keepalive 10240; } server { listen 80; server_name admin18Ue7.xxx.com; # 此地址对应 .env 中的 EASYADMIN.ADMIN_DOMAIN access_log off; root /部署的项目地址/huicmf-webman/public; } ``` 对应的伪静态调整为: ``` location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Connection ""; if (!-f $request_filename){ # 主要增加了这里 rewrite ^/(.*)$ /$1 break; proxy_pass http://admin18Ue7; } } ``` 最后,你的后台访问地址为: `admin18Ue7.xxx.com/admin` > ip更换为域名访问,其他不变(仍然需要包含后面的 /admin) ### 11.可以愉快的使用绑定的域名访问啦啦啦 ## 忘记后台密码 如果忘记密码,或者密码不对,请修改数据库表:cmf_admin password: 4d934790841a4d8575c21e86b5b3eb71 salt: VkMJ27 对应的明文密码为:123456 ## 启动方式(命令) ### windows开发环境 ``` php windows.php start ``` ### Linux生产环境 ``` php start.php start php start.php start -d ``` ### 平滑重启 ``` php start.php reload ``` ### 更改redis配置 如需更改redis配置,需要更改以下2个地方: (个人如果另行安装其他带有redis的插件的,需要另行更改其配置) 1. 环境变量.env文件对应的redis配置 2. webman-redis-queue配置: config/plugin/webman/redis-queue/redis.php > **注意:** > > 如果没有使用.env环境变量,则另需更改以下3个地方的配置 > 1. \config\redis.php > 2. \config\session.php > 3. \config\thinkcache.php # .env环境 > 请复制或者重命名一份.example.env 为 .evn文件。并编辑里面的数据库配置 > 如果是使用命令行安装的,则无需复制并编辑数据 # orm使用think的。 数据库链接配置文件在: > config\thinkorm.php # nginx代理 ## 伪静态 ``` location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Connection ""; if (!-f $request_filename){ proxy_pass http://webman; } } ``` 当webman需要直接提供外网访问时,建议在webman前增加一个nginx代理,这样有以下好处。 * 静态资源由nginx处理,让webman专注业务逻辑处理 * 让多个webman共用80、443端口,通过域名区分不同站点,实现单台服务器部署多个站点 * 能够实现php-fpm与webman架构共存 * nginx代理ssl实现https,更加简单高效 * 能够严格过滤外网一些不合法请求 * ``` upstream webman { server 127.0.0.1:8787; keepalive 10240; } server { server_name 站点域名; listen 80; root /your/webman/public; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; if (!-f $request_filename){ proxy_pass http://webman; } } } ``` ## 代码输出json数据 > 可以有以下2种方式: ### 方法1: ```php # 全局均可使用 return success_json(); return error_json(); ``` ### 方法2: ```php # 需要公公控制器先继承 \app\BaseController; # 然后引入 public function __construct() # 默认后台模块(admin)已继承,可直接使用。其他模块需要自行继承 return $this->success(); return $this->error(); ``` > error输出,可以在msg位置输出数组:['code'=>204,'msg'=>'error'],此时输出的json code值为对应的204 --- # 鉴权和不鉴权 > 仅针对后台admin模块权限 > > 插件plugin里鉴权请使用方法一,不支持方法二 > > 鉴权和不鉴权有2中操作方法,任意一种都行 ## 方法一【推荐】: 在控制器代码中操作: ### 控制器不鉴权 > 控制器默认为鉴权状态 > 如果控制器不需要鉴权,请使用以下方法: 控制器添加一个 `$noNeedAuthController` 属性 (默认值:false,【鉴权】) 例如: ```php
选择图片
``` #### 参数说明: 1. 最顶部需要有class类名:huicmf-upload 2. input回调框的代码中,hui_img_preview 里面的值和id值需要相同 3. 点击按钮 a 标签 里面: 打开选择框属性:data-open-pic="{:__url('index/file_list',['type'=>'one','select_id'=>'avatar-select-input'])}",其中: **type=>'one'** 意思是:单张图 **select_id'** 意思是:需要传递回调数据表单的id字段 --- ### 多图上传: ```html
选择图片
(可拖拽图片调整显示顺序 )
``` > 注意:由于增加了多选图的数量判断(限制),需要注意以下代码: ```html
``` 其中:data-nums参数为多图的数量(如果是添加,默认为0,如果是编辑,请传递后台图片数量到此值) #### 参数说明: 1. 最顶部需要有class类名:huicmf-upload 2. input回调框的代码中,hui_img_preview 里面的值和id值需要相同 3. 点击按钮 a 标签 里面: 打开选择框属性:data-open-pic="{:__url('index/file_list',['type'=>'more','select_id'=>'uploader-list'])}",其中: **type=>'more'** 意思是:单张图 **select_id'** 意思是:需要传递回调数据的id ## API接口开发 > (如果不喜欢此接口开发,可以删掉api文件夹里的代码,自行开发自己的接口) ### 接口说明 接口的访问地址为:http://127.0.0.1:8787/api 请求方法: post 参数格式为:method 调用具体方法 其它参数:根据每个参数来定义。 需要登录的接口,可以用$this->userId获取当前访问用户id > $this->userId **需要登录的接口的接口必须传递参数 token ** 判断登录与否的标准就是是否在本地保存了token,如果保存了,就是登录状态,如果没有保存,就是未登录状态,需要登录的接口会自动带上token来进行请求数据。 ## api.php配置文件 config/api.php 新增接口均需要在此文件中增加接口配置 ### 新增一个接口 新增接口时,需要先在api模块中增加一个接口控制器,所有接口控制器均要继承\app\api\controller\ApiController 控制器,如: > 控制器名称需要使用完整名称,需要带上"Controller",如:TestController 例如: ```php namespace app\api\controller; class TestController extends ApiController{ public function list(){} } ``` 然后在接口配置文件 config\api.php 中定义下新增的接口 ```php 'test'=>[ 'code' => 'Test', 'method' => [ 'getlist' => [ 'code' => 'list', 'is_login' => false ] ] ] ``` > 最外面的test是url地址调用的第一个参数 > code对应的是接口控制器类名 > method里面定义的是参数 > getlist是外部访问的方法名,getlist里面code是Test控制器里面的具体方法名 > is_login 含义为是否需要登录,当is_login 为true时,必须传token。可使用$this->userId 获取当前登录用户 ### 公共接口 如果是一个公共数据接口,直接在 app\api\controller\CommonController.php 文件中写方法,任意请求方式访问: http://你的域名/api.html/common/test 即可。 ### 接口调用案例(以UserController为例): > 基本信息 * **接口URL:** `https://你的域名/api` * **请求方式:** `POST` * **Content-Type:** `multipart/form-data` > 请求参数: 接口请求参数见下表: **Body参数说明 (multipart/form-data)** | 参数名 | 示例值 | 是否必填 | 参数描述 | |----------|------------|------|------| | method | user.login | 必填 | 接口方法 | | username | admin | 必填 | 登录名 | | password | admin | 必填 | 密码 | > 响应示例 正确响应示例 ```json { "code": 200, "data": "c9d2343fd754ca12a9be33e957574cce", "msg": "" } ``` > 错误响应示例 ```json { "code": 0, "msg": "没有找到此账号", "data": "" } ``` --- # webman High performance HTTP Service Framework for PHP based on [Workerman](https://github.com/walkor/workerman). # Manual【文档】 https://www.workerman.net/doc/webman # Benchmarks https://www.techempower.com/benchmarks/#section=test&runid=9716e3cd-9e53-433c-b6c5-d2c48c9593c1&hw=ph&test=db&l=zg24n3-1r&a=2 ![image](https://user-images.githubusercontent.com/6073368/96447814-120fc980-1245-11eb-938d-6ea408716c72.png) ## LICENSE MIT --- # 特别感谢 以下项目排名不分先后 * Webman:[https://github.com/walkor/webman](https://github.com/walkor/webman) * Layuimini:[https://github.com/zhongshaofa/layuimini](https://github.com/zhongshaofa/layuimini) * Annotations:[https://github.com/doctrine/annotations](https://github.com/doctrine/annotations) * Layui:[https://github.com/sentsin/layui](https://github.com/sentsin/layui) * Jquery:[https://github.com/jquery/jquery](https://github.com/jquery/jquery) * JetBrains:[https://jb.gg/OpenSourceSupport](https://jb.gg/OpenSourceSupport) ![PhpStorm logo](https://resources.jetbrains.com/storage/products/company/brand/logos/PhpStorm.svg) ![PhpStorm logo](https://resources.jetbrains.com/storage/products/company/brand/logos/PhpStorm_icon.svg) ## 版权信息 HuiCMF遵循Apache2.0开源协议发布,并允许商业使用。 本项目包含的第三方源码和二进制文件之版权信息另行标注。 版权所有Copyright © 2019-2022 by xiaohuihui (https://xiaohuihui.net.cn) All rights reserved。 ## 免责声明1 > HuiCMF遵循Apache2.0开源协议发布,并允许商业使用。任何用户在使用`HuiCMF` > 后台框架前,请您仔细阅读并透彻理解本声明。您可以选择不使用`HuiCMF`后台框架,若您一旦使用`HuiCMF` > 后台框架,您的使用行为即被视为对本声明全部内容的认可和接受。 > > 仅供技术研究使用,请勿用于非法用途,否则产生的后果作者概不负责。 * `HuiCMF`后台框架是一款开源免费的后台快速开发框架 ,主要用于更便捷地开发后台管理;其尊重并保护所有用户的个人隐私权,不窃取任何用户计算机中的信息。更不具备用户数据存储等网络传输功能。 * 您承诺秉着合法、合理的原则使用`HuiCMF`后台框架,不利用`HuiCMF` 后台框架进行任何违法、侵害他人合法利益等恶意的行为,亦不将`HuiCMF`后台框架运用于任何违反我国法律法规的 Web 平台。 * 任何单位或个人因下载使用`HuiCMF`后台框架而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失 ( 包括但不限于直接、间接、附带或衍生的损失等),本开源项目不承担任何法律责任。 * 用户明确并同意本声明条款列举的全部内容,对使用`HuiCMF`后台框架可能存在的风险和相关后果将完全由用户自行承担,本开源项目不承担任何法律责任。 * 任何单位或个人在阅读本免责声明后,应在《MIT 开源许可证》所允许的范围内进行合法的发布、传播和使用`HuiCMF` 后台框架等行为,若违反本免责声明条款或违反法律法规所造成的法律责任(包括但不限于民事赔偿和刑事责任),由违约者自行承担。 * 如果本声明的任何部分被认为无效或不可执行,其余部分仍具有完全效力。不可执行的部分声明,并不构成我们放弃执行该声明的权利。 * 本开源项目有权随时对本声明条款及附件内容进行单方面的变更,并以消息推送、网页公告等方式予以公布,公布后立即自动生效,无需另行单独通知;若您在本声明内容公告变更后继续使用的,表示您已充分阅读、理解并接受修改后的声明内容。