{"_id":"@cary6414/swiftjs","_rev":"2-b98055b29ceba51c20d4d24c6184538e","name":"@cary6414/swiftjs","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@cary6414/swiftjs","version":"1.0.0","author":{"name":"cary"},"license":"ISC","_id":"@cary6414/swiftjs@1.0.0","maintainers":[{"name":"cary6414","email":"cary6414@gmail.com"}],"homepage":"https://github.com/cary1024/swiftjs#readme","bugs":{"url":"https://github.com/cary1024/swiftjs/issues"},"dist":{"shasum":"6f8a2b5a469eafe5b641ba4f4849bd312dc0377b","tarball":"https://registry.npmjs.org/@cary6414/swiftjs/-/swiftjs-1.0.0.tgz","fileCount":77,"integrity":"sha512-5z6lBihaN9ZK6U3lRwq7zhuKjCnD9Irz1tZQx/WTFN5/2lZNlzhN3JxcXDm9KGwzjtK8LHMehpqxeGL1d3MfNA==","signatures":[{"sig":"MEQCIGEZXiL+suJmB02MXli4eCJnGlIM2Baq4DvOSJ5kQY//AiAVh2BuHcbjX8DvabKQpcZ2hCjSsLfobczc0hWxQIQmZA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1054618},"main":"index.js","config":{"ghooks":{"commit-msg":"validate-commit-msg","pre-commit":"npm run lint"}},"gitHead":"e8f142404801a248fe773298a8f178fe2e27e5df","scripts":{"lint":"eslint --quiet --ext js,vue .","test":"_ENV='local' mocha 'test/**/*.js'"},"_npmUser":{"name":"cary6414","email":"cary6414@gmail.com"},"repository":{"url":"git+https://github.com/cary1024/swiftjs.git","type":"git"},"_npmVersion":"10.9.2","description":"SwiftJS ## 一个企业级应用框架，通过全栈实现","directories":{},"_nodeVersion":"22.15.0","dependencies":{"ajv":"^6.10.2","koa":"2.7.0","md5":"^2.2.1","vue":"^3.3.4","glob":"^7.1.4","knex":"^0.19.0","less":"^3.8.1","path":"^0.12.7","vuex":"^4.1.0","axios":"^0.19.2","mysql":"^2.18.1","pinia":"^2.1.6","lodash":"^4.17.21","log4js":"^6.9.1","moment":"^2.29.4","echarts":"^5.5.0","express":"^4.18.2","nodemon":"^1.19.2","webpack":"^5.88.1","consoler":"^0.2.0","happypack":"^5.0.1","koa2-cors":"^2.0.6","css-loader":"^0.23.1","koa-router":"^7.4.0","koa-static":"^5.0.0","superagent":"^8.1.2","url-loader":"^4.1.1","vue-loader":"^17.2.2","vue-router":"^4.2.4","@babel/core":"^7.24.0","file-loader":"^6.2.0","less-loader":"^11.1.3","babel-loader":"^8.0.4","element-plus":"^2.3.7","jsonwebtoken":"^9.0.2","style-loader":"^0.14.1","koa-useragent":"2.0.0","node-schedule":"^2.1.1","thread-loader":"^4.0.4","webpack-merge":"^4.2.1","koa-bodyparser":"^4.2.1","koa-nunjucks-2":"^3.0.2","vue-json-viewer":"^3.0.4","vue-style-loader":"^4.1.2","@babel/preset-env":"^7.4.5","generate-password":"^1.7.1","html-webpack-plugin":"^5.5.3","clean-webpack-plugin":"^0.1.19","terser-webpack-plugin":"^5.3.14","webpack-dev-middleware":"^6.1.1","webpack-hot-middleware":"^2.25.4","@element-plus/icons-vue":"^2.3.2","mini-css-extract-plugin":"^2.7.6","css-minimizer-webpack-plugin":"^5.0.1","directory-named-webpack-plugin":"^4.0.1","@babel/plugin-transform-runtime":"^7.1.0","html-webpack-inject-attributes-plugin":"^1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^6.1.4","assert":"^2.0.0","eslint":"^7.32.0","ghooks":"~1.0.3","supertest":"^4.0.2","babel-eslint":"^10.0.2","eslint-plugin-vue":"^9.17.0","validate-commit-msg":"~2.14.0","eslint-plugin-import":"^2.28.1"},"_npmOperationalInternal":{"tmp":"tmp/swiftjs_1.0.0_1758268797582_0.34973252970593793","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@cary6414/swiftjs","version":"1.0.1","description":"SwiftJS ## 一个企业级应用框架，通过全栈实现","main":"index.js","scripts":{"lint":"eslint --quiet --ext js,vue .","test":"_ENV='local' mocha 'test/**/*.js'"},"repository":{"type":"git","url":"git+https://github.com/cary1024/swiftjs.git"},"author":{"name":"cary"},"license":"ISC","dependencies":{"@babel/core":"^7.24.0","@element-plus/icons-vue":"^2.3.2","ajv":"^6.10.2","axios":"^0.19.2","echarts":"^5.5.0","element-plus":"^2.3.7","generate-password":"^1.7.1","glob":"^7.1.4","jsonwebtoken":"^9.0.2","knex":"^0.19.0","koa":"2.7.0","koa-bodyparser":"^4.2.1","koa-nunjucks-2":"^3.0.2","koa-router":"^7.4.0","koa-static":"^5.0.0","koa-useragent":"2.0.0","koa2-cors":"^2.0.6","less":"^3.8.1","lodash":"^4.17.21","log4js":"^6.9.1","md5":"^2.2.1","moment":"^2.29.4","mysql":"^2.18.1","node-schedule":"^2.1.1","nodemon":"^1.19.2","path":"^0.12.7","pinia":"^2.1.6","superagent":"^8.1.2","vue":"^3.3.4","vue-json-viewer":"^3.0.4","vue-router":"^4.2.4","vuex":"^4.1.0","@babel/plugin-transform-runtime":"^7.1.0","@babel/preset-env":"^7.4.5","babel-loader":"^8.0.4","clean-webpack-plugin":"^0.1.19","consoler":"^0.2.0","css-loader":"^0.23.1","css-minimizer-webpack-plugin":"^5.0.1","directory-named-webpack-plugin":"^4.0.1","express":"^4.18.2","file-loader":"^6.2.0","happypack":"^5.0.1","html-webpack-inject-attributes-plugin":"^1.0.1","html-webpack-plugin":"^5.5.3","less-loader":"^11.1.3","mini-css-extract-plugin":"^2.7.6","style-loader":"^0.14.1","terser-webpack-plugin":"^5.3.14","thread-loader":"^4.0.4","url-loader":"^4.1.1","vue-loader":"^17.2.2","vue-style-loader":"^4.1.2","webpack":"^5.88.1","webpack-dev-middleware":"^6.1.1","webpack-hot-middleware":"^2.25.4","webpack-merge":"^4.2.1"},"devDependencies":{"assert":"^2.0.0","babel-eslint":"^10.0.2","eslint":"^7.32.0","eslint-plugin-import":"^2.28.1","eslint-plugin-vue":"^9.17.0","ghooks":"~1.0.3","mocha":"^6.1.4","supertest":"^4.0.2","validate-commit-msg":"~2.14.0"},"config":{"ghooks":{"commit-msg":"validate-commit-msg","pre-commit":"npm run lint"}},"_id":"@cary6414/swiftjs@1.0.1","gitHead":"a888253068a2f49e6c2b9b10df020d8b01f361d6","bugs":{"url":"https://github.com/cary1024/swiftjs/issues"},"homepage":"https://github.com/cary1024/swiftjs#readme","_nodeVersion":"22.15.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-+e13hHEhFAlS9Frvg9fMamHQ6oRh1oA49ZCAVcyhCaUZ4U0xSntsB+HhZ+8GhFvvIBG+ZIsJY2+rMt5W8aj+Uw==","shasum":"c559be7bb9df1cfa3df9796978a297d4fa88b3e4","tarball":"https://registry.npmjs.org/@cary6414/swiftjs/-/swiftjs-1.0.1.tgz","fileCount":77,"unpackedSize":1054624,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDJI95j2IbbSm7u1FIfKpuEgj52T1rJrz2MrJNt4RuexQIgAm5MFz35co2lWh0PIomijFUi51WBl99Yqa3DQdi9vvg="}]},"_npmUser":{"name":"cary6414","email":"cary6414@gmail.com"},"directories":{},"maintainers":[{"name":"cary6414","email":"cary6414@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/swiftjs_1.0.1_1758268985189_0.4264124009301744"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-19T07:59:57.504Z","modified":"2025-09-19T08:03:05.614Z","1.0.0":"2025-09-19T07:59:57.812Z","1.0.1":"2025-09-19T08:03:05.423Z"},"bugs":{"url":"https://github.com/cary1024/swiftjs/issues"},"author":{"name":"cary"},"license":"ISC","homepage":"https://github.com/cary1024/swiftjs#readme","repository":{"type":"git","url":"git+https://github.com/cary1024/swiftjs.git"},"description":"SwiftJS ## 一个企业级应用框架，通过全栈实现","maintainers":[{"name":"cary6414","email":"cary6414@gmail.com"}],"readme":"## swiftjs\n## 一个企业级应用框架，通过全栈实现\n\n### model配置\n``` javascript\n{\n    mode: 'dashboard', // 模板类型，不同模板类型对应不一样的模板数据结构\n    name: '', // 名称\n    desc: '', // 描述\n    icon: '', // icon\n    homePage: '', // 首页（项目配置）\n    // 头部菜单\n    menu: [{\n        key: '', // 菜案唯一描述\n        name: '', // 菜单名称\n        menuType: '', // 菜单枚举值: group / module\n\n        // 当 menuType == group时，可填\n        subMenu: [{\n            // 可递归 menuItem\n        }, ...],\n\n        // 当 menuType == module时，可填\n        moduleType: '', // 模块枚举值：sider/iframe/custom/schema\n\n        // 当moduleType == sider时（侧边栏）\n        siderConfig: {\n            menu: [{\n                // 可递归 menuItem（除 moduleType === sider）\n            }, ...],\n        },\n        \n        // 当moduleType == iframe时，可填\n        iframeConfig: {\n            path: '', // iframe路径\n        },\n\n        // 当moduleType == custom时，可填\n        customConfig: {\n            path: '', // 自定义路由路径\n        },\n\n        // 当moduleType == schema时，可填\n        schemaConfig: {\n            api: '', // 数据源API （遵循 RESTFUL 规范）因为是全栈框架，api都是自己定制的，所以一个api可以表示增删改查\n            schema: { // 板块数据结构\n                type: 'object',\n                properties: {\n                    key: {\n                        ...schema, // 标准 schema 配置\n                        type: // 字段类型\n                        label: '', // 字段的中文名\n                        // 字段在 table 中的相关配置\n                        tableOption: {\n                            ...elTableColumnConfig, // 标准 el-table-column 配置\n                            visible: true, // 默认为true（false 或不配置时，表示不在表单中显示）\n                            toFixed: 0, //保留小数点后几位\n                        },\n                        // 字段在 search-bar 中的相关配置\n                        searchOption: {\n                            ...eleComponentConfig, // 标准 el-component 配置\n                            comType: '', // 配置组件类型 input/select/......\n                            default: '', // 默认值\n\n                            // comType === 'select'\n                            enumList: [], // 下拉框多选项\n\n                            // comType === 'dynamicSelect'\n                            api: ''\n\n                        },\n                        // 字段在不同动态 component 中的相关配置，前缀对应 componentConfig 中的键值\n                        // 如：componentConfig.createForm, 这里对应 createFormOption\n                        // 字段在 createForm 中相关配置\n                        createFormOption: {\n                            ...eleComponentConfig, // 标准 el-component 配置\n                            comType: '', // 控件类型 input/select/input-number\n                            visible: true, // 是否展示（true/false)，默认为 true\n                            disabled: false, // 是否禁用（true/false），默认为 false\n                            default: '', // 默认值\n\n                            // comType === 'select' 时生效\n                            enumList: [], // 枚举列表\n                        },\n                        // 字段在 edit-form 中相关配置\n                        editFormOption: {\n                            ...eleComponentConfig, // 标准 el-component 配置\n                            comType: '', // 控件类型 input/select/input-number\n                            visible: true, // 是否展示（true/false)，默认为 true\n                            disabled: false, // 是否禁用（true/false），默认为 false\n                            default: '', // 默认值\n\n                            // comType === 'select' 时生效\n                            enumList: [], // 枚举列表\n                        },\n                        // 字段在 detail-panel 中相关配置\n                        detailPanelOption: {\n                            ...eleComponentConfig, // 标准 el-component 配置\n                        },\n                        // 后续若要新增功能，先在DSL里定义好\n                    },\n                    ...\n                },\n                required: [], // 标记哪些字段是必填项\n            },\n             // table 相关配置\n            tableConfig: {\n                headerButtons: [{\n                    label: '', // 按钮中文名\n                    eventKey: '', // 按钮事件名\n                    eventOption: {\n                        // 当 eventKey === 'showComponent'\n                        comName: '' // 组件名称\n                    }, // 按钮事件具体配置\n                    ...elButtonConfig, // 标准的 el-button 配置\n                },...],\n                rowButtons: [{\n                    label: '', // 按钮中文名\n                    eventKey: '', // 按钮事件名\n                    eventOption: {\n                        // 当 eventKey === 'showComponent'\n\n                        comName: '', // 组件名称\n                        // 当 eventKey === 'remove'\n                        params: {\n                            // paramKey = 参数的键值\n                            // rowValueKey = 参数值（当格式为 schema::xxx ，到 table 中找相应的字段）\n                            paramKey: rowValueKey,\n                        }\n                    }, // 按钮事件具体配置\n                    ...elButtonConfig, // 标准的 el-button 配置\n                },...]\n            },\n            searchConfig: {}, // search-bar 相关配置\n            // 动态组件 相关配置\n            componentConfig: {\n                // create-form 表单相关配置\n                createForm: {\n                    title: '', // 表单标题\n                    saveBtnText: '', // 保存按钮文案\n                },\n                // edit-form 表单相关配置\n                editForm: {\n                    mainKey: '', // 表单主键，用于唯一标识要修改的数据对象\n                    title: '', // 表单标题\n                    saveBtnText: '', // 保存按钮文案\n                }\n                // ...支持用户动态拓展\n            },\n            // detail-panel 相关配置\n            detailPanel: {\n                mainKey: '', // 表单主键，用于唯一标识要修改的数据对象\n                title: '', // 表单标题\n            }\n        },\n    }, ...],\n}\n```\n\n### 服务端启动\n``` javascript\nconst { serverStart } = require('@cary6414/swiftjs');\n\n// 启动 swiftjs 服务\nconst app = serverStart({});\n```\n\n### 自定义服务端\n- router-schema\n- router\n- controller\n- service\n- extend\n- config\n\n### 前端构建\n```javascript\nconst { frontendBuild } = require('@cary6414/swiftjs');\n\n// 编译构建前端工程\nfrontendBuild(process.env._ENV);\n```\n\n### webpack config扩展\n* 配置在 app/webpack.config.js\n\n### 自定义页面扩展\n* 在 app/pages/ 目录下写入口 entry.xxx.js\n\n### dashboard / custom-view 自定义页面扩展\n* 在 app/pages/dashboard/xxx 下写页面\n\n### dashboard / schema-view / component 动态组件扩展\n1. 在 app/pages/dashboard/complex-view/schema-view/components/ 下写组件\n\n2. 配置到 app/pages/dashboard/complex-view/schema-view/components/components-config.js\n\n### schema-form 控件扩展\n1. 在 app/pages/widgets/schema-form/complex-view/ 下写控件\n2. 配置到 app/pages/widgets/schema-form/form-item-config.js\n\n### schema-search-bar 控件扩展\n\n1. 在 app/pages/widgets/schema-search-bar/complex-view/ 下写控件\n2. 配置到 app/pages/widgets/schema-search-bar/search-item-config.js","readmeFilename":"README.md"}