写了一个cms系统,免费使用,长期维护更新

zhezhebie

手搓了一个cms系统,大家给点建议:

ACMS 内容管理系统插件

ACMS(Advanced Content Management System)是基于 Webman 框架开发的内容管理系统插件,支持文章、分类、标签、评论等功能,适用于技术博客、资讯站点等内容型网站。

概述

ACMS 提供了一套完整的内容管理解决方案,集成 Webman Admin 和 Webman User,支持权限管理、菜单配置及前后台功能,适用于快速搭建内容型网站。

主要功能

  • 文章管理:支持发布、编辑、删除、置顶、推荐及状态切换。
  • 分类管理:支持多级分类,包含 SEO 字段配置。
  • 标签管理:支持标签增删改查及文章标签关联。
  • 评论管理:支持评论审核、回复、删除及点赞功能。
  • 前台展示:提供文章列表、详情、分类、标签、搜索及评论功能(需登录)。
  • 后台管理:基于 Webman Admin,集成权限与菜单管理。

安装步骤

环境要求

  • 已安装 Webman Admin 和 Webman User 插件。
  • 安装以下扩展(用于 Blade 模板和分页):
    composer require psr/container webman/blade jasongrimes/paginator

安装流程

直接在admin插件中心安装即可。这是最简单和方便的!(推荐)
翻到插件最后一页,直接安装即可。

截图

下面是手动安装的方法:

  1. 解压插件
    plugin/acms.zip 解压到 plugin/acms/ 目录,或直接将源码放入 plugin/acms/

  2. 导入数据库
    执行以下命令创建数据表和初始数据:

    php webman app-plugin:install acms

    或手动执行 plugin/acms/install.sql

  3. 注册路由
    插件自带路由文件 plugin/acms/config/route.php,Webman 会自动加载。

  4. 注册菜单(可选)
    插件自带菜单配置 plugin/acms/config/menu.php,安装时自动导入后台菜单。

  5. 访问系统

    • 后台地址:/app/admin/acms/article/index
    • 前台地址:/app/acms

目录结构

plugin/acms/
├── install.sql           // 数据库结构及初始数据
├── readme.md            // 插件说明文档
├── api/                // API 相关代码
├── app/                // 控制器、模型、服务等
├── config/             // 路由、菜单等配置
├── public/             // 静态资源
├── view/               // Blade 模板视图

路由说明

前台路由(前缀:/app/acms

  • 文章列表:/app/acms
  • 文章详情:/app/acms/article/{id}
  • 分类页:/app/acms/category/{id}
  • 标签页:/app/acms/tag/{id}
  • 搜索页:/app/acms/search
  • 评论提交:/app/acms/comment/add

后台路由(前缀:/app/admin/acms

  • 文章管理:/app/admin/acms/article/index
  • 分类管理:/app/admin/acms/category/index
  • 标签管理:/app/admin/acms/tag/index
  • 评论管理:/app/admin/acms/comment/index

常见问题

  1. 后台菜单或页面 404

    • 确保 plugin/acms/config/menu.phpplugin/acms/config/route.php 路径正确,均为 /app/admin/acms/xxx
    • 清理 Webman 缓存:删除 runtime/ 目录下的缓存文件。
    • 确认数据库表和初始数据已正确导入。
  2. 路由冲突或无效

    • 检查 config/route.php 是否存在同名路由冲突。
    • 确保插件目录名为 acms,并与路由、菜单配置一致。
  3. 数据库连接失败

    • 检查 config/database.php 数据库配置,确保与实际环境一致。
  4. MySQL 8.0 以下版本兼容性

    • install.sql 中,将 utf8mb4_0900_ai_ci 替换为 utf8mb4_general_ci
  5. CSRF 保护

    • 使用 csrf_tokencsrf_field
    • 已新增 autoload.phpfunctions.php,提供简化的自定义函数替代。
  6. 分页支持

    • 确保已安装分页扩展:
      composer require jasongrimes/paginator

二次开发建议

  • 扩展性:控制器、模型、视图遵循 Webman 规范,可直接扩展。
  • 菜单与权限:可通过修改 config/menu.php 自定义菜单和权限。
  • 前端页面:在 view/ 目录下自定义 Blade 模板。
  • 性能优化:支持批量查询,优化多数据查询性能。
  • 功能增强
    • 新增文章 ID 关联功能,便于内容聚合。
    • 支持多级分类和菜单,动态渲染层级。

贡献与反馈

欢迎提交 Issue 或 PR,提供建议或报告问题。
github: https://github.com/dbx192/acms

作者与协议

  • 作者:ouyangyi
  • 开源协议:MIT
1999 15 4
15个评论

artisan

👍

  • 暂无评论
wz_8849

👍

  • 暂无评论
张文远

直接在admin插件中心安装 异常:
点击完安装,提示安装成功,但是刷新后还是有刷新按钮。
进入 插件目录查看,cms的代码文件不在 "acms"目录内,在 插件的根目录

  • zhezhebie 2025-06-12

    我刚刚测试了一下,是正常可安装啊。

  • zhezhebie 2025-06-12

    我刚刚又更新了一下,你再试试,我卸载重装了几次都可以

zhezhebie

我刚刚试了一下安装是正常的啊 2025-06-12 19:46,我今天没有更新插件过呢。
截图
截图

  • 张文远 2025-06-13

    感谢您的解答。我用的linux环境宝塔面板,又重新安装了webman 和 webman-admin,还是显示一样的问题。然后换了windows的环境安装,显示可以了,在插件目录能正常显示acms的文件。不知道您有没有在Linux环境下部署过?

  • ZKFA 2025-06-17

    我用宝塔Linux跟楼上那个截图一样,应该是插件在服务器解压的时候出问题了

  • zhezhebie 2025-06-23

    我生产环境就是linux啊,直接在admin后台安装,宝塔性能差

  • zhezhebie 2025-06-23

    宝塔估计会把插件当完整项目,自动解压到根目录,试试在admin后台安装

  • zhezhebie 3小时前

    您说得对,linux下部署会因为路径分隔符导致解压没有目录结构,已经修复了这个问题。可以再试试

glitter

👍

  • 暂无评论
dj880

应该加一个内容模型,可以自由扩展各种数据类型

  • zhezhebie 3小时前

    具体点,我看看能不能抽空实现下

blue10

支持

  • 暂无评论
blue10

从应用商店下载的包压缩格式有问题,用7z解压:
github 的包正常

  • zhezhebie 3小时前

    正常了,在应用商店重新安装下就可以了。

xianrenqh

666

  • 暂无评论
qq851728853


有没有大佬,知道 安装以后显示这个 是什么原因啊

  • zhezhebie 27天前

    要看具体的错误日志信息

  • zhezhebie 27天前

    感觉你可能是依赖包没安装,仔细阅读下安装文档

SCTGO

优秀,围观一下

  • 暂无评论
zhezhebie

亲们,遇到问题提交到issue,我抽空都会处理的

  • dj880 19天前

    应该加个内容模型扩展自定义字段,这样就完美了

  • zhezhebie 4小时前

    啥意思?说具体点,我看看能不能实现下

wangsky522

截图

  • zhezhebie 14天前

    看清说明啊,亲,要先安装admin和user模块

掌柜

请教 这种如何把/指向/app/acms
比如分类页直接 www.domain.com/category

zhezhebie

更新下,官方的zip命令里面有个bug,打包压缩的时候路径替换不完整,windows下压缩windows下使用没问题,mac下压缩,linux上使用没问题,但是windows下开发打包,linux上用就会出问题。正确的方法:
F:\WWW\base_webman\vendor\webman\console\src\Commands\AppPluginZipCommand.php

    /**
     * @param $name
     * @param $sourceDir
     * @param $zipFilePath
     * @param array $excludePaths
     * @return bool
     * @throws Exception
     */
    protected function zipDirectory($name, $sourceDir, $zipFilePath, array $excludePaths = []): bool
    {
        $zip = new ZipArchive();

        if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
            throw new Exception("cannot open <$zipFilePath>\n");
        }

        $sourceDir = realpath($sourceDir);

        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($sourceDir, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::LEAVES_ONLY
        );

        foreach ($files as $file) {
            if (!$file->isDir()) {
                $filePath = $file->getRealPath();
                // 关键修复:统一使用正斜杠 '/',避免 Windows 反斜杠污染 ZIP
                $relativePath = $name . '/' . str_replace('\\', '/', substr($filePath, strlen($sourceDir) + 1));

                $shouldExclude = false;
                foreach ($excludePaths as $excludePath) {
                    $normalizedRelativePath = str_replace('\\', '/', $relativePath);
                    $normalizedExcludePath = str_replace('\\', '/', $excludePath);
                    if (preg_match('#/(?:' . preg_quote($normalizedExcludePath, '#') . ')(/|$)#i', $normalizedRelativePath)) {
                        $shouldExclude = true;
                        break;
                    }
                }
                if ($shouldExclude) {
                    continue;
                }

                $zip->addFile($filePath, $relativePath);
            }
        }

        return $zip->close();
    }
  • walkor 3小时前

    发个pr吧

  • zhezhebie 3小时前

    真快!我已经提交了,大佬合并下

  • walkor 3小时前

    已发版本

  • zhezhebie 3小时前
    嗯嗯,我刚刚拉取了,验证了是对的。大佬真高效!
    [root@VM-20-6-centos plugin]# unzip -l acms.zip
    head -20
    Archive: acms.zip
    Length Date Time Name
      115  06-05-2025 11:32   acms/.gitignore
     3085  04-28-2025 18:41   acms/api/Category.php
     4266  04-28-2025 16:50   acms/api/Install.php
    11384  04-28-2025 18:39   acms/app/admin/controller/ArticleController.php
     7662  04-28-2025 18:39   acms/app/admin/controller/CategoryController.php
     3368  04-29-2025 10:55   acms/app/admin/controller/CommentController.php
     1980  04-29-2025 16:27   acms/app/admin/controller/DashboardController.php
     7134  04-28-2025 18:38   acms/app/admin/controller/TagController.php
     1943  04-29-2025 15:31   acms/app/admin/controller/UploadController.php

zhezhebie

480
积分
0
获赞数
0
粉丝数
2023-03-30 加入
🔝