{"id":18859304,"url":"https://github.com/emacle/vue3-admin-php","last_synced_at":"2025-04-14T12:14:08.764Z","repository":{"id":234209529,"uuid":"786163268","full_name":"emacle/vue3-admin-php","owner":"emacle","description":"RBAC通用角色权限管理系统, 前后端分离架构, 基于 v3-admin-vite 和 PHP CodeIgniter4 实现","archived":false,"fork":false,"pushed_at":"2025-02-12T03:28:26.000Z","size":1570,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-14T12:14:03.433Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://vv.774433.xyz/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emacle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-13T16:00:44.000Z","updated_at":"2025-02-12T03:28:30.000Z","dependencies_parsed_at":"2024-06-11T18:00:31.635Z","dependency_job_id":"4c0e5026-56a7-4ce5-85bf-bb5b0cbcd7c4","html_url":"https://github.com/emacle/vue3-admin-php","commit_stats":null,"previous_names":["emacle/vue3-admin-php"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacle%2Fvue3-admin-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacle%2Fvue3-admin-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacle%2Fvue3-admin-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacle%2Fvue3-admin-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emacle","download_url":"https://codeload.github.com/emacle/vue3-admin-php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248877960,"owners_count":21176244,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T04:17:13.207Z","updated_at":"2025-04-14T12:14:08.733Z","avatar_url":"https://github.com/emacle.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [vue3-admin-php-demo](https://vv.774433.xyz)\n\n# vue3-admin-php 项目说明\n通用后台角色权限管理系统, 基于 [v3-admin-vite](https://github.com/un-pany/v3-admin-vite) 和 [PHP CodeIgniter 4.5.0](https://github.com/codeigniter4/framework) RESTful 实现，采用前后端分离架构的权限管理系统，PHP快速开发平台，目标是搭建一套简洁易用的快速解决方案，可以帮助用户有效降低项目开发难度和成本。\n\n以 [v3-admin-vite](https://github.com/un-pany/v3-admin-vite) 前端模板为基础，修改动态路由部分，实现菜单路由可根据后端角色进行动态加载。\n后端路由权限基于 php-jwt 使用 PHP CI4 AuthFilter 作token及权限认证。\n\nV3 Admin Vite 基于 Vue3、TypeScript、Element Plus、Pinia 和 Vite 等主流技术。\n\n## 主要功能\n- [x] 1. 系统登录：系统用户登录，`jwt token方式`\n- [x] 2. 用户管理：新建用户，修改用户，删除用户，查询用户\n- [x] 3. 角色管理：新建角色，修改角色，删除角色，查询角色\n- [x] 4. 菜单管理：新建菜单，修改菜单，删除菜单，查询菜单\n- [x] 5. 部门管理：新建部门，修改部门，删除部门，查询部门\n- [x] 6. **JWT生成访问与刷新token， access_token过期后，根据refreshtoken刷新访问token，实现无缝刷新功能。refreshtoken 加入计数器,在有效期内接口调用超过一定次数自动续期** \n- [x] 7. 图标管理：加入svg图标\n- [ ] 8. 图形验证码（`gregwar/captcha` 包生成）\n- [ ] 9. 系统日志\n- [x] 10. 简易请假审批流程\n \n## 使用说明\n### 目录结构\nv3-admin-vite/ 前端模板\n\n**CodeIgniter4 Config文件：** \n```\nCodeIgniter4/app/Config\n├── App.php\n├── Cors.php      #配置跨域\n├── Database.php  #数据库配置\n├── Filters.php   #定义路由白名单，'AuthCheck'=\u003e'except'里面路由不会进行权限验证\n├── Routes.php    #定义路由\n\nCodeIgniter4/app/Filters/\n└── AuthCheckFilter.php  # 动态权限认证\n\nCodeIgniter4/writable/logs/\n├── index.html\n└── log-2024-05-12.log   # 查看错误日志\n```\n\n**CodeIgniter4 RESTful API：**\n```\nCodeIgniter4/app/Controllers/\n├── Api\n│   └── V2\n│       └── Sys\n│           ├── Dept.php\n│           ├── Employee.php\n│           ├── Menu.php\n│           ├── Role.php\n│           └── User.php\n├── BaseController.php\n└── Home.php\n```\n\n### 前端\n\n  1. 一键安装 .vscode 目录中推荐的插件\n  2. node 版本 18.x 或 20+\n  3. pnpm 版本 8.x 或最新版\n\n进入项目目录\n```sh\ncd v3-admin-vite\n```\n  安装依赖\n```sh\npnpm i\n```\n\n启动服务\n\n```sh\npnpm dev\n```\n\n### 后端\n   **php 8.1+**\n\n1. composer 安装PHP依赖包\n\n```sh\ncd CodeIgniter4\n\n# 根据composer.json 初始安装所有插件包\ncomposer install\n\n# 根据实际修改 app.baseURL , postman测试 http://{app.baseURL} API配置正确\ncp env .env\n```\n2.创建数据库 vueadminv2, 使用root用户导入 vueadminv2-{date}.sql 文件\n\n3.后端数据库连接配置 修改配置文件\n\n`cat CodeIgniter4\\app\\Database.php`\n\n```php\npublic array $medoodb = [\n    'type' =\u003e 'mysql',\n    'host' =\u003e 'localhost',\n    'database' =\u003e 'vueadminv2',\n    // 根据实际配置\n    'username' =\u003e 'vueadmin',\n    'password' =\u003e 'vueadmin',\n    'error' =\u003e PDO::ERRMODE_EXCEPTION,\n    // ERRMODE_EXCEPTION PDO will throw a PDOException, and all following codes will be terminated, \n    // quickly pointing the finger at potential problem areas in your code.\n];\n```\n\n### 生产环境部署\n**Nginx配置**\n```sh\nserver {\n    listen 10000;\n    server_name pocoyo.rr.nu;\n\n    root /var/www/vue3-admin-php/v3-admin-vite/dist/;\n    index index.html;\n\n    location ^~ /api/v2 {\n        proxy_pass http://pocoyo.rr.nu:10001;\n    }\n    location / {\n        # 防止直接刷新页面(地址栏回车)服务端会直接报 404 错误。\n        try_files $uri $uri/ /index.html;\n    }\n}\n\nserver {\n    listen  10001;\n    server_name pocoyo.rr.nu;\n\n    root  /var/www/vue3-admin-php/CodeIgniter4/public;\n    index index.php index.html index.htm;\n\n    location / {\n        try_files $uri $uri/ /index.php$is_args$args;\n    }\n\n    location ~ \\.php$ {\n        include snippets/fastcgi-php.conf;\n\n        fastcgi_pass unix:/run/php/php8.1-fpm.sock;\n    }\n    # Enable browser caching of static assets\n    location ~* \\.(js|css|png|jpg|jpeg|gif|ico)$ {\n        expires max;\n        log_not_found off;\n    }\n\n    error_page 404 /index.php;\n\n    # deny access to hidden files such as .htaccess\n    location ~ /\\. {\n        deny all;\n    }\n\n}\n```\n\n## 角色权限说明\n1. 这里将权限抽象成三种权限（可扩展更多），菜单类权限（包括控件按钮），角色类权限（用户可分配的角色），部门数据类权限（用户可查看的部门数据），参考 [角色权限组+资源分配](https://blog.csdn.net/qiuziqiqi/article/details/65437123)\n2. 前端添加菜单，角色，部门的时候，后端生成对应的权限，写入 `sys_perm` 表，系统的超级管理员角色自动拥有了所有权限（也可根据具体业务需要进行设计）\n3. 用户-\u003e角色-\u003e权限\n4. 数据权限： 实际开发中，需要设置用户只能查看哪些部门的数据，这种情况一般称为数据权限。数据权限需要在对应的业务类型表里加入部门数据字段来进行sql条件限制\n   在（系统管理-角色管理）设置需要数据权限的角色, 添加了角色授权范围 \n   全部数据权限/部门数据权限/部门及以下数据权限/仅本人数据权限/自定数据权限\n   业务代码逻辑可先根据授权范围，来处理来判断角色拥有的部门数据权限，全部数据权限则sql语句不做限制，\n   部门数据及以下数据权限，及本人数据需要对sql语句做限制，自定义数据权限，则sql语句加入自定义的部门限制条件即可\n\n ![角色权限](CodeIgniter4/public/role_perm.png)\n\n这里设计控件按钮操作权限与sys_menu表中path字段为一一对应，也即与route一一对应，通过前置过滤器 AuthCheckFilter.php 进行权限判断认证，`不必在每个路由前添加权限字符判断` eg\n\n```sh\n/sys/user/get\t\t2  控件按钮类型为2\n/sys/user/post\t\t2\n/sys/user/put\t\t2\n/sys/user/delete\t2\n\n用户拥有接口 /sys/user/get 的权限则会拥有/sys/user/**/get 的所有的权限，\n// 'api/v2/sys/user/repasswd',  put ,如果有 /sys/user/put 权限则也会拥有 /sys/user/repasswd/put 重置密码的权限\n// 'api/v2/sys/user/roleoptions', get\n```\n\n权限判断逻辑:\n\n1. 先获取token，为空，返回401错误；不为空继续\n2. JWT解析token获取userId,根据userId获取用户所属的角色拥有的控件权限即sys_menu表中 path字段\n3. 根据当前请求uri,获取接口URI，$request-\u003egetUri()-\u003egetPath();  // string(19) \"/apix/v2/sys/user/1\"\n4. 步骤2、3的值进行比较 str_contains 判断是否拥有权限，无权限则返回401错误，有则继续进入路由函数执行代码逻辑\n5. 接步骤2，token解析出错，超时、异常等，返回前端，前面可根据refreshtoken继续进行新accesstoken获取，获取成功后前端实现无缝刷新；如果refreshtoken也过期，则前端跳转至登录页面，强制重新登录。（refreshtoken一般比 accesstoken 过期时间要长）\n\n这里比较粗略，见 AuthCheckFilter.php `str_contains($uri_short, $uri_db)` 也可以限制更精确，缺点是用前端角色权限勾选过多。\n\n同时针对不需要进行权限认证的route，可以 app/Config/Filters.php 里指定例外\n```sh\n 'AuthCheck' =\u003e ['except' =\u003e [\n                '/',\n                'api/v2/sys/user/login',\n                'api/v2/sys/user/logout',\n                'api/v2/sys/user/info',\n                'api/v2/sys/user/refreshtoken',  // 此接口必须为例外\n```\n\n\n## 简易请假审批流程\n完成STAFF请假流程审批，其余流程需要根据实际情况进行代码补充\n参考 [OA审批系统 oa审批流程数据库设计](https://blog.51cto.com/u_13539/8490872)\n\n## 数据库表说明\n\n| Tables_in_vueadminv2 | 说明                                      |\n|---------------------:|----------------------------------------- |\n| sys_user             | 系统用户表                                 |\n| sys_menu             | 系统菜单表                                 |\n| sys_role             | 系统角色表                                 |\n| sys_dept             | 系统部门表                                 |\n| sys_perm             | 系统权限表                                 |\n| sys_role_perm        | 角色权限关系表                              |\n| sys_user_role        | 用户角色对应关系（可一对多）                  |\n| sys_perm_type        | 权限类型（暂时未用到）                       |\n| adm_audit_role       | 审批角色表                                 |\n| adm_leave_form       | 请假流程表单                               |\n| adm_process_flow     | 审批任务流程表                              |\n| adm_notice           | 消息通知表                                 |\n| keys                 | 未用                                      |\n| logs                 | 未用                                      |\n| article              | 测试                                      |\n\n## RESTful\n - 使用 catfan/medoo 实现 **复杂分页过滤排序**\n    \n    前端GET请求参数与使用的 table 组件有关\n\n```\nGET /articles?currentPage=1\u0026limit=30\u0026sort=-id\u0026fields=id,title,author\u0026query=~author,title\u0026author=888\u0026title=world\n\nsize:  每页记录数，后台会配置默认值\ncurrentPage: 第几页，后台会配置默认值\nsort:   支持多个参数 \u0026sort=-id,+author =\u003e id降序 author 升序\nfileds: 指定要获取的显示字段 =\u003e 降低网络流量\nquery:  支持多个参数 \u0026query=~author,title =\u003e author like 模糊查询， title精确查询 \u0026author=888\u0026title=world 需要配合query参数才有意义\n```\n\n## 前端目录树\n## 多级菜单配置\n\n## 特性\n  - Vue3：采用 Vue3 + script setup 最新的 Vue3 组合式 API\n  - Element Plus：Element UI 的 Vue3 版本\n  - Pinia: 传说中的 Vuex5\n  - Vite：真的很快\n  - Vue Router：路由路由\n  - TypeScript：JavaScript 语言的超集\n  - PNPM：更快速的，节省磁盘空间的包管理工具\n \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femacle%2Fvue3-admin-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femacle%2Fvue3-admin-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femacle%2Fvue3-admin-php/lists"}