Innovative Content Management System. 轻量级企业官网CMS. QQ交流群: 960062283
| Files | Last commit | Last update |
|---|---|---|
refactor: move theme boot into FrontServiceProvider, drop ThemeBootProvider - innopacks/front: add bootTheme() + loadThemeRoutes() aligned with InnoShop Bundle - delete app/Providers/ThemeBootProvider.php - bootstrap/providers.php: remove ThemeBootProvider registration | 1 month ago | |
fix: restore mcp package wiring broken by upstream cleanup - remove orphan Feature testsuite from phpunit.xml (directory was intentionally deleted, caused "Test directory not found") - restore InnoCMS\Mcp PSR-4 autoload entries in composer.json - restore McpServiceProvider registration in bootstrap/providers.php - fix stale RestAPI namespace in mcp routes after Restapi rename - document providers.php FQCN style rule in CLAUDE.md | 1 month ago | |
feat: add ProductController, routes, and seeder for software products - Create ProductController with index/show actions - Add /products and /product-{slug} routes - Create ProductSeeder with 5 products (InnoCMS/Shop/CRM/Card/TianfuTrade) - Add product index/show blade views - Add product section to homepage with 4-card grid - Add product page typography and card CSS - Add product language keys (en/zh-cn) - Force about page through standard pages/show layout - Fix news content max-width causing sidebar overflow fix: remove double json_encode from product images in seeder feat: link product name in panel list to frontend page feat: add external link icon to product name in panel list feat: clean up panel product edit UI - remove spu_code and viewed fields revert: restore spu_code and viewed fields in product edit form fix: syntax error in product link field - extra closing paren fix: enable SQLite WAL mode and busy_timeout to prevent database lock fix: articles 7,8 referenced non-existent catalog_id=5 fix: remove invalid string fallback from __() calls in product views | 1 month ago | |
feat: upgrade to Laravel 13 and rebrand as B2B standalone site system - Upgrade Laravel 12 -> 13 (framework v13.29, tinker v3, laravel/ai, laravel/mcp); re-add debugbar v4.4 under the new Fruitcake namespace - Introduce larastan + phpstan.neon; phpstan now passes with 0 errors - Remove dead e-commerce leftovers: restapi test stubs, country/state commands, MiniApp library, product import service, checkout resources - Fix real bugs: translation model namespaces, PluginResource getDirname(), PhpZip migration, private modelQuery(), env() outside config - Rebrand positioning copy to lightweight B2B standalone site system (seeders + README) | 21 days ago | |
fix: locale primary input and primary-locale validation Refactor: reorganize the language system and unify translation loading 1. Locale: fix primary-locale input and validation; add multilingual locale management API (panel + restapi CRUD) and new locale config files 2. Front copy unified under the single front::common.* namespace in innopacks/front/lang/{locale}/ (universal UI + default-theme copy merged, 10 locales incl. 8 newly translated); remove MultiPathFileLoader and the lang/front/ + lang/{locale}/front/ layers; merge shared front/backend common files into lang/{locale}/common/base.php; drop obsolete helpers 3. Refactor front_lang_path_codes to keep only lang dirs that actually contain common/base.php 4. Form validation: remove redundant Trait classes, validate required fields against the current panel language 5. Front URLs: align with enterprise — models resolve URLs via front_route() (drop slug-or-id fallbacks), add categories front routes/controller/views, drop Product front_url/getUrlAttribute alias 6. Rename service providers to lowercase camelCase convention 7. docs: standardize front copy addressing in theme-development.md | 26 days ago | |
chore: bump version to 0.5.0 (build 20260826) | 21 days ago | |
fix: locale primary input and primary-locale validation Refactor: reorganize the language system and unify translation loading 1. Locale: fix primary-locale input and validation; add multilingual locale management API (panel + restapi CRUD) and new locale config files 2. Front copy unified under the single front::common.* namespace in innopacks/front/lang/{locale}/ (universal UI + default-theme copy merged, 10 locales incl. 8 newly translated); remove MultiPathFileLoader and the lang/front/ + lang/{locale}/front/ layers; merge shared front/backend common files into lang/{locale}/common/base.php; drop obsolete helpers 3. Refactor front_lang_path_codes to keep only lang dirs that actually contain common/base.php 4. Form validation: remove redundant Trait classes, validate required fields against the current panel language 5. Front URLs: align with enterprise — models resolve URLs via front_route() (drop slug-or-id fallbacks), add categories front routes/controller/views, drop Product front_url/getUrlAttribute alias 6. Rename service providers to lowercase camelCase convention 7. docs: standardize front copy addressing in theme-development.md | 26 days ago | |
upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 Add themes directory with gitkeep to preserve empty folder Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> update innocms update innocms update innocms update innocms update theme update ignore list | 4 months ago | |
style: refresh InnoCMS logo assets and unify front/panel branding | 21 days ago | |
panel: add row_actions hook to pages list and honor sidebar blank flag Pages index had no hook point for plugins to inject row actions (unlike articles). The sidebar component tracked a child 'blank' flag but never rendered target=_blank. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> front: add themed 404/500 error pages (borrowed from innoshop bundle) Two-layer setup mirroring innoshop bundle: themed views in innopacks/front (extend layouts.app, inherited by all themes) plus root resources/views/errors copies for Laravel's errors:: namespace fallback (500 and other statuses via minimal). Also fixes two blockers that prevented themed error pages from rendering at all: - equal_route_name()/equal_route_param() fataled on null current route during 404; now null-safe like innoshop's version - $menus was only shared by GlobalDataMiddleware which never runs when route matching fails; a layouts.header view composer now backfills menus on error pages Error page copy added to common/base lang files for all 10 locales. docs: add git workflow rules to CLAUDE.md fix: loosen fire_hook_action data type and add swiper/placeholder assets fire_hook_action required an Illuminate\Http\Request, but both core (SmsService) and plugins fire it with array payloads; match InnoShop's untyped signature. Adds vendor/swiper bundle and images/placeholder.png that the PageBuilder front views reference. feat: port aicore and mcp innopacks from innoshop bundle - Add aicore pack: Tool contract/registry, 6 CMS tools (article, catalog, page, tag, locale), agents, provider registry, panel AI routes - Add mcp pack: /mcp endpoint (Streamable HTTP + Sanctum + origin check, opt-in via mcp_enabled), welcome page, settings card - Replace legacy Common\Agents and Common\Services\AI with aicore - Split has_install_lock() (route registration) from installed() (DB check) so routes register before tests run migrations - Merge AI settings into Tools tab with provider management UI - Add laravel/mcp ^0.9.1, bump laravel/ai to ^0.10.1 feat: add entity link picker to theme slideshow settings Slideshow link field now uses a Vue3+ElementPlus popup picker scoped to the themes/settings page, supporting page/article/catalog/product/ category plus custom URL. Reuses Bundle's standalone picker JS plus InnoCMS's existing EntityLinkPayload/EntityLinkEnricher backend. - Add 5 Name resources + ArticleRepo/PageRepo/CatalogRepo autocomplete - Extend EntityLinkEnricher to handle product/category - Add entity_link_* and panel_link_parse helpers - Wire Product/Category autocomplete endpoints to Name resources - Inject urls.panel_api into panel layout for picker autocomplete calls - Rewrite slideshow tab with hidden JSON input + Vue-mounted picker - Copy ElementPlus vendor assets and picker JS modules - Add EntityLinkTest covering repos, helpers, enricher, resources fix: cap entity picker thumbnail size with inline CSS Picker dialog thumbnails were rendering at natural size because the .entity-picker SCSS from Bundle was never ported. Add the layout CSS inline in the settings page header (no SCSS build needed), and shrink the backend thumbnail resize from 200x150 to 88x88 (picker renders at 44x44, 2x DPI is enough) to cut payload. refactor: move entity picker CSS out of blade into _entity-picker.scss Inline <style> block in the settings blade was a stop-gap. Move the picker styles into a proper SCSS partial imported by app.scss so they ship through the panel CSS build like every other panel style. fix: route slideshow image upload through panel file manager New slide rows were using a hand-rolled ajax uploader (inno.imgUploadAjax) while the initial-render rows already used x-common-form-image which opens the file manager. Switch the delegated click handler to window.inno.fileManagerIframe so both paths behave consistently. feat: port Bundle media library, rename file_manager → media Replaces the minimal file_manager stub with Bundle's full media library: MediaFile model + media_files migration, MediaUrlResolver service, FileListCriteria, four new endpoints (detail/update/stats), and the upgraded media views. All URL/route/view/lang/JS renamed file_manager→media. - Add MediaFile model + MediaUrlResolver + migration + FileListCriteria - Add 'media' disk alias in filesystems.php (public/static/media) - Extend FileManagerController with getMediaDetail/updateMedia/getMediaStats - Sync MediaFile DB layer in FileManagerService (upload/rename/move/copy/delete) - Replace file_manager/ views with Bundle's media/ views - Rename JS panel-file-manager.js → panel-media.js (fileManagerIframe alias kept) - Rename panel web controller FileManagerController → MediaController - Rename routes panel.file_manager.* → panel.media.* (+ 3 new API endpoints) - Rename lang file_manager.php → media.php across 10 locales - Rename setting key file_manager_driver → media_driver - Sidebar/MenuSearch use new media.* route + prefix OSSService kept (already ported). Cloud storage still flows through InnoCMS's existing StorageService. fix: load Vue/ElementPlus in media index page, not just iframe The Vue script tags lived in iframe.blade.php, so opening /panel/media (non-iframe index mode) hit 'Vue is not defined' as soon as the 1700-line _footer Vue app booted. Move the Vue/ElementPlus/icons loading and the mediaConfig init up into media/main.blade.php (shared by both modes), and drop the duplicate from iframe.blade.php. Also wrap the iframe bottom-buttons Vue mount in DOMContentLoaded for ordering safety. fix: port Bundle media.scss to fix folder-tree and path styling The upgraded media views use classes (.folder-tree, .file-list, .file-toolbar, .custom-tree-node, drag-state, …) that the legacy file-manager.scss didn't define, so the folder icons and current-path indicators rendered unstyled. Replace file-manager.scss with Bundle's media.scss and update the app.scss import. fix: honor include_directories param in media getFiles endpoint The 'show folders' toggle in the upgraded media UI sends ?include_directories=1 to /media/files, but the InnoCMS FileManagerService always merged folders into the response, so the toggle was dead. Mirror Bundle: only merge collectFolders() into the list when $includeDirectories is true. Thread the flag from controller through FileManagerService + FileManagerInterface + OSSService. style: rename File Manager strings to Media Library | 1 month ago | |
init innocms code | 2 years ago | |
update plugins and panel UI update plugins update plugin list update panel UI update panel UI update file manager | 3 months ago | |
add zip folder to git ignore list | 2 years ago | |
feat: align media library and object storage stack with InnoShop Bundle - Rename FileManager* to Media* (via git mv to preserve history); port MediaService/Controller/OSSService wholesale from Bundle (lazy-loading directory tree, show-folders toggle, expand-follow, path memory, media_files registry integration, getCloudMeta), keeping InnoCMS-only downloadRemoteFile - Unify the upload pipeline: add security policies to common Requests (mimes whitelist with SVG banned; differentiated size limits - panel reads php.ini, front reads settings); add the missing UploadImageRequest to fix the front upload API; remove dead legacy Requests from the front pack; add panel UploadController + routes + tests - PanelServiceProvider switches the OSSService/MediaService binding by media_driver so S3-family object storage actually takes effect; introduce league/flysystem-aws-s3-v3 - Port the hardened ImageService (file validation/size checks/memory DoS protection/pad/cover modes, adapted to intervention v3) - StorageService supports media://{id} reference resolution with placeholder.svg fallback for missing images | 22 days ago | |
fix: locale primary input and primary-locale validation fix: locale primary input and primary-locale validation fix: locale primary input and primary-locale validation refactor: rename service providers to use lowercase camelCase convention Refactor (Product model): Remove the getUrlAttribute property accessor The redundant product frontend URL retrieval method has been removed, as it can be replaced by other routing logic refactor: align front URL generation and category routes with enterprise - Models (Article/Catalog/Category/Product/Tag): drop slug-or-id fallbacks and direct path-building, resolve via front_route() like enterprise - Page: keep try/catch returning '' to match enterprise - EntityLinkPayload: simplify urlFromRow to enterprise form (drop brand branch, CMS has no brands) - Add categories front routes + CategoryController + index/show views - PageController::show: route-model binding (Page $page) like enterprise - ProductController::index: drop ?cat= filter (category storefront moved to /categories) - Update EntityLinkTest assertions to new URL shapes refactor: drop Product front_url alias, use url uniformly update theme git ignore refactor: merge PanelLocaleHelper into PrimaryLocaleRequiredTrait fix: restore correct casing for DevtoolsServiceProvider in devtools composer.json | 1 month ago | |
init innocms code | 2 years ago | |
fix app default local language to zh_cn in .env.example file (#2) * fix app default local language to zh_cn in .env.example file * reconstruct the homepage for more information | 2 years ago | |
init innocms code | 2 years ago | |
feat: multilingual system settings, slideshow text and theme boot provider - panel/settings: add company info fields (name/description/address/phone/email); multilingual editing for store_name/store_description/address and meta_title/meta_keywords/meta_description via x-common-form-locale-input - panel/themes: add per-locale main title and subtitle to each slideshow item - common/helpers: add system_setting_translations(); harden system_setting_locale() with legacy single-string fallback so front <title> never prints "Array" - front/mcp: read meta_* via system_setting_locale() - seeders: defaults for the new multilingual/company settings - add ThemeBootProvider, registered last in bootstrap/providers.php, to load themes/{theme}/setup/boot.php | 1 month ago | |
docs: add theme development guide docs/theme-development.md Covers theme structure, config.json, view overrides, helper functions, data models, activation switching and validation/publishing. Adds a Theme Development pointer to CLAUDE.md so developers no longer need to reverse-engineer the source. | 1 month ago | |
add Envoy deployment config - envoy run pull: 主仓库 git fetch + reset - envoy run pull_themes: 遍历 themes/* 子仓库 + view:clear - envoy run deploy / deploy_full: 备份 + 拉代码 + migrate + cache Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> | 2 months ago | |
add install service provider fixed installer fixed install fixed installation fixed locale update installer 优化安装引导 fixed language fixed database checked. wip fixed checked fixed connected fixed connected fixed checker wip code format complete install 提交数据 update install update installed wip update creator fixed creator fixed innocms installation 优化pre样式 隐藏安装消息显示 | 2 years ago | |
feat: upgrade to Laravel 13 and rebrand as B2B standalone site system - Upgrade Laravel 12 -> 13 (framework v13.29, tinker v3, laravel/ai, laravel/mcp); re-add debugbar v4.4 under the new Fruitcake namespace - Introduce larastan + phpstan.neon; phpstan now passes with 0 errors - Remove dead e-commerce leftovers: restapi test stubs, country/state commands, MiniApp library, product import service, checkout resources - Fix real bugs: translation model namespaces, PluginResource getDirname(), PhpZip migration, private modelQuery(), env() outside config - Rebrand positioning copy to lightweight B2B standalone site system (seeders + README) | 21 days ago | |
feat: upgrade to Laravel 13 and rebrand as B2B standalone site system - Upgrade Laravel 12 -> 13 (framework v13.29, tinker v3, laravel/ai, laravel/mcp); re-add debugbar v4.4 under the new Fruitcake namespace - Introduce larastan + phpstan.neon; phpstan now passes with 0 errors - Remove dead e-commerce leftovers: restapi test stubs, country/state commands, MiniApp library, product import service, checkout resources - Fix real bugs: translation model namespaces, PluginResource getDirname(), PhpZip migration, private modelQuery(), env() outside config - Rebrand positioning copy to lightweight B2B standalone site system (seeders + README) | 21 days ago | |
init innocms code | 2 years ago | |
chore: clean up cms to align with upstream InnoCMS - remove orphaned tests/Feature/Tenant/CloudflareSaaSServiceTest.php (tests a tenant module that doesn't exist in cms) - revert bootstrap/app.php WeComChannel exception handler (references InnoCMS\Tenant which cms doesn't have, would crash) - remove resources/views/errors/403.blade.php (portal-specific, no tenant here) - remove alipaysdk/easysdk from composer.json (payment is portal-specific) - keep laravel/mcp + innopacks/mcp (cms tracks upstream, mcp is part of it) - keep namespace renames RestAPI->Restapi, DevTools->Devtools for consistency - remove tests/Feature/ExampleTest.php boilerplate - restore tests/Traits/CreatesAdmin.php (needed by mcp tests) Note: MCP tests have 9 pre-existing failures (multi-locale routing issue, upstream InnoCMS bug, not introduced by this change). | 1 month ago | |
feat: upgrade to Laravel 13 and rebrand as B2B standalone site system - Upgrade Laravel 12 -> 13 (framework v13.29, tinker v3, laravel/ai, laravel/mcp); re-add debugbar v4.4 under the new Fruitcake namespace - Introduce larastan + phpstan.neon; phpstan now passes with 0 errors - Remove dead e-commerce leftovers: restapi test stubs, country/state commands, MiniApp library, product import service, checkout resources - Fix real bugs: translation model namespaces, PluginResource getDirname(), PhpZip migration, private modelQuery(), env() outside config - Rebrand positioning copy to lightweight B2B standalone site system (seeders + README) | 21 days ago | |
feat: upgrade to Laravel 13 and rebrand as B2B standalone site system - Upgrade Laravel 12 -> 13 (framework v13.29, tinker v3, laravel/ai, laravel/mcp); re-add debugbar v4.4 under the new Fruitcake namespace - Introduce larastan + phpstan.neon; phpstan now passes with 0 errors - Remove dead e-commerce leftovers: restapi test stubs, country/state commands, MiniApp library, product import service, checkout resources - Fix real bugs: translation model namespaces, PluginResource getDirname(), PhpZip migration, private modelQuery(), env() outside config - Rebrand positioning copy to lightweight B2B standalone site system (seeders + README) | 21 days ago | |
upgrade from shopan.cn | 3 months ago | |
feat: upgrade to Laravel 13 and rebrand as B2B standalone site system - Upgrade Laravel 12 -> 13 (framework v13.29, tinker v3, laravel/ai, laravel/mcp); re-add debugbar v4.4 under the new Fruitcake namespace - Introduce larastan + phpstan.neon; phpstan now passes with 0 errors - Remove dead e-commerce leftovers: restapi test stubs, country/state commands, MiniApp library, product import service, checkout resources - Fix real bugs: translation model namespaces, PluginResource getDirname(), PhpZip migration, private modelQuery(), env() outside config - Rebrand positioning copy to lightweight B2B standalone site system (seeders + README) | 21 days ago | |
test: add Plugins testsuite to phpunit.xml covering all *Test.php under plugins/, consistent with InnoShop | 22 days ago | |
upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 upgrade to version 0.4.0 Add themes directory with gitkeep to preserve empty folder Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> update innocms update innocms update innocms update innocms update theme update ignore list | 4 months ago | |
upgrade from shopan.cn | 3 months ago |
InnoCMS
InnoCMS - 轻量级 B2B 独立站系统
InnoCMS 是一个基于 Laravel 13 的轻量级 B2B 独立站系统,采用模块化架构,内置商品管理,支持 Hook 插件扩展、多语言管理、GeoIP2 访客追踪和主题模板开发。
介绍
- 轻量级 B2B 独立站系统,内置商品与多语言,专为快速开发和上线设计。
- 模块化
innopacks架构,基于 Hook 的插件扩展机制。 - 多语言支持,内置语言管理。
- 访客追踪,集成 GeoIP2 地理位置。
- 主题系统,支持在线预览和一键导入。
- Vite 驱动的前端构建。
开发文档
InnoCMS 底层架构与 InnoShop 一致,开发方式和插件机制基本通用。
Demo 演示站
- 前台: https://demo.innocms.com/
- 后台: https://demo.innocms.com/panel
- 账号: admin@innocms.com
- 密码: 123456
Demo 前台截图
Demo 后台截图
环境要求
- PHP >= 8.3
- MySQL >= 5.7 或 8.0
- Node.js >= 18
- Composer >= 2.0
安装说明
git clone https://github.com/innocms/innocms.git
cd innocms
composer install
npm install
cp .env.example .env
php artisan key:generate
# 编辑 .env 填写数据库配置
php artisan migrate
php artisan db:seed
npm run prod
访问 your-domain.com/panel 进入后台管理。
- 邮箱: admin@innocms.com
- 密码: 123456
插件开发
所有功能应以插件形式实现,通过 Hook 机制扩展。请参考 /plugins/PartnerLink 插件示例。
// plugins/YourPlugin/Boot.php
class Boot
{
public function init(): void
{
listen_hook_filter('component.sidebar.plugin.routes', function ($data) {
$data[] = ['route' => 'your_plugin.index', 'title' => 'Your Plugin'];
return $data;
});
}
}
- 如果您发现
InnoCMS对您有所帮助,请不吝赐给我们一个星星(star)。 - 您的每一次点赞都是我们不断进步的动力。
贡献者
感谢各位开发者的支持与贡献! Contributors
