{"id":21726178,"url":"https://github.com/zgldh/scaffold","last_synced_at":"2025-04-05T22:06:13.015Z","repository":{"id":57090519,"uuid":"88958720","full_name":"zgldh/scaffold","owner":"zgldh","description":"Scaffold for laravel","archived":false,"fork":false,"pushed_at":"2024-10-24T19:04:35.000Z","size":4471,"stargazers_count":49,"open_issues_count":3,"forks_count":14,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-29T19:08:20.459Z","etag":null,"topics":["laravel","scaffold","spa","vuejs"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zgldh.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":"2017-04-21T08:05:16.000Z","updated_at":"2025-03-20T03:14:24.000Z","dependencies_parsed_at":"2024-12-24T03:08:22.683Z","dependency_job_id":"4f30481a-99c8-4120-9565-61a0d448c010","html_url":"https://github.com/zgldh/scaffold","commit_stats":{"total_commits":357,"total_committers":6,"mean_commits":59.5,"dds":"0.47619047619047616","last_synced_commit":"ce0cc002ae72512b4d4a8fb4cb5f3a35b0055b2b"},"previous_names":[],"tags_count":83,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zgldh%2Fscaffold","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zgldh%2Fscaffold/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zgldh%2Fscaffold/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zgldh%2Fscaffold/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zgldh","download_url":"https://codeload.github.com/zgldh/scaffold/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247406087,"owners_count":20933803,"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":["laravel","scaffold","spa","vuejs"],"created_at":"2024-11-26T03:22:23.105Z","updated_at":"2025-04-05T22:06:12.978Z","avatar_url":"https://github.com/zgldh.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# zgldh/Scaffold\n\n基于 Laravel 5.5， Vue 2， ElementUI 2， vueAdmin-template 制作的后台脚手架。\n\n升级指南: https://github.com/zgldh/scaffold/blob/master/UPDATE.md\n\n预制功能：\n================\n\n- 用户，角色，权限体系\n- 文件上传\n- 通知系统\n- 操作记录\n- 系统设置\n- 完全脱离 Cookie/Session 机制。全面拥抱 JWT。自动刷新 Token\n- 强化的前端数据表格，使用 datatables 协议。\n- 多语言\n\n路线图\n======\n \n- GraphQL 1.8\n- Simplified role/permission 1.9\n- D2Admin 2.0\n- Laradock 3.0\n\n开始使用\n=============\n\n1. `composer create-project zgldh/scaffold your-project-dir`\n2. 配置好 `.env` 数据库相关 \n3. `php artisan scaffold:init`\n  \n   会自动执行以下命令 \n   \n   - `migrate`\n   - `storage:link`\n   - `permission:auto-refresh`\n   - `db:seed --class=ScaffoldInitialSeeder`\n   - `lang:dump`\n  \n4. 配置好 `frontend/config/dev.env.js` 的 `BASE_API `\n5. `npm install`\n6. `npm run start`\n\n初始帐号密码： admin@email.com 123456\n\n注意：某些虚拟机中 php artisan storage:link 命令可能会失效，请在宿主主机中执行该命令。\n\n生成器\n==========\n\n|名称|命令\n|----|----|\n|模块初始化 | `scaffold:module {moduleName} {--force}` |\n|模型初始化 | `scaffold:model {modelStarterClass} {--only=*} {--force}` |\n|API 生成 | `scaffold:api {method} {route} {moduleName} {--controller=} {--action=}`|\n|权限生成|`permission:auto-refresh {type=api : set guard name}`\n|通知生成|`notifications:create {moduleName} {notificationName}`\n|语言文件导出|`lang:dump`|\n\n模块初始化 \n----------\n`scaffold:module {moduleName} {--force}`\n\n模块是指一个独立的功能领域。使用本命令将初始化一个模块。\n \n **Example**\n \n `scaffold:module Post`\n  \n  将创建好如下目录和文件:\n   \n   - `Modules/Post`\n   - `Modules/Post/routes.php`\n   - `Modules/Post/PostServiceProvider.php`\n   - `frontend/src/store/modules/post.js`\n   \n  并自动修改好如下文件：\n  \n   - `config/api.php`\n   - `routes/api.php`\n   - `frontend/src/store/index.js`\n \n模型初始化 \n----------\n`scaffold:model {modelStarterClass} {--only=*} {--force}`\n\n模型是指数据模型，对应着一个数据表。需要一个 Starter Class 来描述该模型。\n\n使用本命令将初始化该模型的`migration file`, `controller`, `model`,\n `request`, `repository`, `route`, `factory`, PHP 单元测试和前端脚手架文件。基本的 CRUD 都准备好了。\n \n如何编写 Starter Class 请参考源码: `Modules\\Post\\PostStarter.php`\n\n`--only` 取值： \n       controller,\n       request,\n       repository,\n       model,\n       migration,\n       api,\n       resource,\n       language,\n       route,\n       factory,\n       phpunit 将只生成对应文件。\n \n **Example**\n \n `scaffold:model Modules/Post/PostStarter.php`\n  \n  将创建好如下目录和文件:\n   \n   - `Modules/Post`\n   - `Modules/Post/Controllers/PostController.php`\n   - `Modules/Post/Repositories/PostRepository.php`\n   - `Modules/Post/Models/Post.php`\n   - `Modules/Post/Requests/CreatePostRequest.php`\n   - `Modules/Post/Requests/UpdatePostRequest.php`\n   - `resources/lang/en/post.php`\n   - `resources/lang/zh-CN/post.php`\n   - `database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php`\n   - `database/factories/PostFactory.php`\n   - `tests/Modules/Post`\n   - `tests/Modules/Post/Post/PostIndexTest.php`\n   - `tests/Modules/Post/Post/PostStoreTest.php`\n   - `tests/Modules/Post/Post/PostShowTest.php`\n   - `tests/Modules/Post/Post/PostUpdateTest.php`\n   - `tests/Modules/Post/Post/PostDestroyTest.php`\n   - `frontend/src/api/post.js`\n   - `frontend/src/views/post`\n   - `frontend/src/views/post/Post/List.vue`\n   - `frontend/src/views/post/Post/Editor.vue`\n   \n  并自动修改好如下文件：\n  \n   - `Modules/Post/routes.php`\n   - `frontend/src/router/dynamicRouterMap.js`\n   \n  并创建权限：\n  \n   - Post@index\n   - Post@store\n   - Post@show\n   - Post@update\n   - Post@destroy\n\nAPI 生成 \n----------\n`scaffold:api {method} {route} {moduleName} {--controller=} {--action=}`\n\n方便的生成一个单独的 API 和周边的各种类、单元测试、前台接口等。\n \n **Example**\n \n `scaffold:api put /post/{id}/like Post`\n  \n  将创建好如下目录和文件:\n   \n   - `Modules/Post/Requests/PutIdLikeRequest.php`\n   - `tests/Modules/Post/Post/PutIdLikeTest.php`\n   \n  并自动修改好如下文件：\n  \n   - `Modules/Post/Controllers/PostController.php`\n   - `Modules/Post/routes.php`\n   - `frontend/src/api/post.js`\n   \n  并创建权限：\n  \n   - Post@putIdLike\n   \n权限生成 \n----------\n`permission:auto-refresh {type=api : set guard name}`\n\n遍历 `Modules` 下所有的 `controller` 和 `repository`。 根据其公共函数生成一系列权限，并自动赋予超级管理员。\n \n如果函数的注释内，包含有 `@no-permission` 标记，则跳过该函数。\n \n **Example**\n \n `permission:auto-refresh`\n  \n  将自动修改对应 `model` 的语言文件的 `permissions` 数组，并创建一系列权限。\n  \n  会自动跳过重复权限。\n\n通知生成\n---------\n`notifications:create {moduleName} {notificationName}`\n\n创建一个 Notification 类，和 markdown 邮件模板。\n\n **Example**\n\n `notifications:create post newPost`\n\n  将创建好如下目录和文件:\n\n   - `Modules/Post/Notifications/NewPost.php`\n   - `Modules/Post/resources/views/newPost.blade.php`\n\n  并自动修改好语言文件，请记着调整后手动执行 lang:dump：\n\n   - `resources/lang/*/notification.php`\n\n语言文件导出\n-----------\n`lang:dump`\n\n将 PHP 语言文件导出为前端语言文件。使得前端 `vue-i18n` 组件也可使用。\n\n导出产物储存在 `frontend/src/lang/languages.js`\n\n组件说明\n====\n\n内置了一些常用组件。\n\n数据表格 zgldh-datatables\n---------------------\n改造自 `ElementUI` 的 `table` 组件。\n\n参数：\n\n参数名|类型|必填|默认值|说明\n------|---|----|----|---\nsource|[Array, Function]|true|null|数据源。通常定义为一个函数。后台请实现 [datatables 协议](https://www.datatables.net/manual/server-side)\ntitle|String|false|null|用于数据导出的文件标题\nautoLoad|Boolean|false|true|是否初始化完毕就立即执行载入\ncolumnSelection|Boolean|false|false| 暂时没用。 Show the column selection button\nenableSelection|Boolean|false|true| 允许选择行\nenableAddressBar|Boolean|false|true| 允许在地址栏储存请求条件\nactions|Array|false| [] | 行动作按钮。 \u003cpre\u003e [{Title: () =\u003e this.$i18n.t('global.terms.download'),\u003cbr\u003e    Handle: this.handleDownload  },\u003cbr\u003e  {    Title: () =\u003e this.$i18n.t('global.terms.edit'),\u003cbr\u003e    Handle: this.handleEdit  },\u003cbr\u003e  {    Title: () =\u003e this.$i18n.t('global.terms.delete'),\u003cbr\u003e    Handle: this.handleDelete  },\u003cbr\u003e  150  // Optional, the actions column width in px, or '10em' in custom width.  ]\u003c/pre\u003e\nmultipleActions|Array|false|[]| 表格顶部动作按钮。\nfilters|Array|false|[]| 高级过滤器的配置。\nexportColumns|Object|false|null|导出文件的列配置。\u003cpre\u003e{\u003cbr\u003e  \"name\": this.$t('upload.fields.name'),\u003cbr\u003e  \"description\": this.$t('upload.fields.description'),\u003cbr\u003e  \"disk\": this.$t('upload.fields.disk'),\u003cbr\u003e  \"path\": this.$t('upload.fields.path'),\u003cbr\u003e  \"size\": this.$t('upload.fields.size'),\u003cbr\u003e  \"type\": this.$t('upload.fields.type'),\u003cbr\u003e  \"created_at\": this.$t('global.fields.created_at'),\u003cbr\u003e}\u003c/pre\u003e\n\n图标组件 auto-icon\n--------------\n用法|描述\n---|---\n`\u003cauto-icon icon-class=\"eye\" /\u003e`|`frontend\\src\\icons` 里的图标\n`\u003cauto-icon icon-class=\"fa-bell\" /\u003e`|https://fontawesome.com/icons 的图标\n`\u003cauto-icon icon-class=\"el-icon-bell\" /\u003e`|http://element-cn.eleme.io/#/zh-CN/component/icon 的图标\n`\u003cauto-icon icon-class=\"ion-md-notifications\" /\u003e`|https://ionicons.com 的图标\n\n图片上传组件 image-uploader\n---------------------\n改造自 `ElementUI` 的 `el-upload` 组件\n\n用法|描述\n---|---\n`\u003cimage-uploader v-model=\"image\" :multiple=\"false\"\u003e\u003c/image-uploader\u003e`| 处理一个图片的上传\n`\u003cimage-uploader v-model=\"images\" :multiple=\"true\"\u003e\u003c/image-uploader\u003e`| 处理多个图片的上传\n`\u003cimage-uploader v-model=\"images\" :multiple=\"true\" :max=\"5\"\u003e\u003c/image-uploader\u003e`| 处理多个图片的上传，最多5个\n\nTODO\n\n预制功能说明\n===========\n\n1. 添加新的系统设置\n\n    比如我们要设置一个 `theme` 项，默认值是 `sunset`。\n    1. 在 `Modules\\Setting\\Bundles\\System` 的 `defaults`函数内设置该项：\n\n    ```\n    public function defaults()\n    {\n        return [\n            'site_name'         =\u003e '管理平台',\n            'site_introduction' =\u003e '\u003cb\u003e各种介绍\u003c/b\u003e',\n            'default_language'  =\u003e 'zh-CN',\n            'target_planets'    =\u003e [\n                'earth',\n                'mars'\n            ],\n            'theme'             =\u003e 'sunset' // 这是新增的设置项\n        ];\n    }\n    ```\n\n    2. 修改 `frontend\\src\\views\\Setting\\index.vue` 增加输入字段\n    ```\n        \u003cform-item :label=\"name('system','theme')\"\u003e\n          \u003cel-select\n            v-model=\"settings.theme\"\n            value-key=\"\"\n            reserve-keyword\u003e\n            \u003cel-option label=\"星空\" value=\"star\"/\u003e\n            \u003cel-option label=\"夕阳\" value=\"sunset\"/\u003e\n          \u003c/el-select\u003e\n        \u003c/form-item\u003e\n    ```\n\n    3. （可选）新增该配置项的语言配置 `resources\\lang\\*\\setting.php`。然后 `lang:dump` 如：\n\n    ```\n    'bundles' =\u003e [\n        'system' =\u003e [\n            ...\n            'theme'         =\u003e '主题',\n            ...\n        ]\n    ]\n    ```\n\n2. 使系统设置生效\n\n    初始化好以后，系统设置只会保存设置值，但目前版本不会有任何实际作用。请手工修改类 `Modules\\Setting\\Bundles\\System`\n\n    注意观察里面的 `setSiteName` 和 `setDefaultLanguage` 函数，他们是当设置项的值真正改变前的钩子函数。\n\n    你可以在这里做任何额外操作，然后将最终的设置项的值返回即可。\n\n\n3. 为某模型添加图片关联\n\n    比如想为`User`模型添加`images`属性作为该用户的相册。\n\n    首先在`User`模型添加关系：\n    ```\n    public function images()\n    {\n        return $this-\u003emorphMany(Upload::class, 'uploadable')-\u003ewhere('z_uploads.type', __FUNCTION__);\n    }\n    ```\n\n    然后在`frontend\\src\\views\\user\\Editor.vue`添加`images`参数以及`ImageUploader`。\n    ```\n    data() {\n      return {\n        ...\n        form: {\n          id: null,\n          ...\n          images:[] // 新添加的参数\n        }\n      };\n    }\n    ```\n    ```\n    _with=images\n    ```\n    ```\n    \u003cimage-uploader v-model=\"form.images\" :multiple=\"true\"\u003e\u003c/image-uploader\u003e\n    ```\n\n\n常用操作\n====\n\n1. 添加一个前端页面\n    1. 在 `frontend/views` 下创建该页面。 建议储存到合理的子文件夹下。\n    2. 在 `frontend\\src\\router\\dynamicRouterMap.js` 里添加路由。\n    3. 注意路由的 meta.title 可以设置成函数来实现多语言。\n2. ...\n\n感谢\n===========\n\nhttps://github.com/laravel/laravel\n\nhttp://element-cn.eleme.io/\n\nhttps://github.com/PanJiaChen/vueAdmin-template\n\nhttp://webpack.github.io/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzgldh%2Fscaffold","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzgldh%2Fscaffold","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzgldh%2Fscaffold/lists"}