关键词搜索

源码搜索 ×
×

三步实现低代码框架之二 - 100 行代码实现原型

发布2021-08-08浏览749次

详情内容

继续标题党哈。老习惯,自己吹过的牛就算含着泪也要实现,自从上次初步分析过 三步实现PHP低代码框架  后,其实这两个月也在团队内小范围试用一些产品,主要试用对象是 Erupt,基于 Java Spring Boot 构建的一款框架,从开发效率上看还是效果很明显的。低代码的低,强调的是要大幅减少代码,从这个角度对比市面上一些商业化产品来看,Erupt 还有很大提升空间,尤其没有整合工作流引擎,但是相比于市面上另外一派主打代码生成器的产品来说,体验已经好了太多太多。而且非常佩服作者的产品性思维能力,整合的东西扩展性非常强,使用这套框架实在是干活时的利器。

但是,作为个人业余爱好,要想快速实现一些概念原型,个人还是喜欢用 PHP。所以继续基于 PHP 语言做了一次探索,续上文内容。

这次偷懒,先引入了完整的 ThinkPHP 框架作为起步,前端使用百度的 AMIS ,做整合。100 行代码真的没有吹牛,但是整到这个程度只是开了个头,还不具备真正的实用价值。

这里想提醒自己的是,积木式或者模块化或者还原论的思维方式,有助于真正解决好问题,对应在商业角度的思考还要再深入些。

 

知识点

 

路由定义

route/app.php

  1. // 构建基于前端低代码框架下的UI自动生成接口
  2. Route::post('/lc/build/table/:modelName', 'UIBuilder/table');
  3. Route::get('/lc/data/table/:modelName', 'UIData/table');

 

控制器

app/controller/UIBuilderController.php

  1. <!--?php
  2. namespace app\controller;
  3. use app\BaseController;
  4. use app\fe\amis\Crud;
  5. use think\helper\Str;
  6. class UIBuilderController extends BaseController
  7. {
  8. public function table($modelName)
  9. {
  10. $modelClass = '\\app\\model\\' . ucfirst($modelName);
  11. $model = new $modelClass(); /** @var \think\Model $model */
  12. $fields = $model--->db()->getFields();
  13. $view = new Crud();
  14. $view->api = url('/lc/data/table/' . $modelName)->suffix(false)->build();
  15. // TODO 调整 DAO 层和 ViewModel 层分工,然后从 ViewModel 取相关数据
  16. $view->columns = [];
  17. foreach ($fields as $field) {
  18. $view->columns[] = [
  19. 'name' => $field['name'],
  20. 'label' => Str::title(str_replace('_', ' ', $field['name'])),
  21. ];
  22. }
  23. return $this->toJson(0, $view);
  24. }
  25. }

app/controller/UIDataController.php

  1. <!--?php
  2. namespace app\controller;
  3. use app\BaseController;
  4. use app\fe\amis\Crud;
  5. use think\helper\Str;
  6. class UIDataController extends BaseController
  7. {
  8. public function table($modelName)
  9. {
  10. $modelClass = '\\app\\model\\' . ucfirst($modelName);
  11. $model = new $modelClass(); /** @var \think\Model $model */
  12. // TODO 实现按条件查询及分页
  13. $rows = $model--->select();
  14. $totalCount = 2104;
  15. return $this->dataToJson($rows, $totalCount);
  16. }
  17. protected function dataToJson($rows, $totalCount)
  18. {
  19. return $this->toJson(0, [
  20. 'items' => $rows,
  21. 'total' => $totalCount,
  22. ]);
  23. }
  24. }

 

编写脚本自动生成 DB Model

工具vb.net教程化思维,代码详c#教程见代码仓库。

 

前端入口

  1. <script type="text/javascript">
  2. (function () {
  3. var router = new RouteRecognizer();
  4. router.add([{
  5. path: "/table/:model/*pathVar",
  6. handler: function (args) {
  7. console.log('default handler', args)
  8. }
  9. }]);
  10. var hash = window.location.hash.split('#')[1];
  11. var result = router.recognize(hash);
  12. var defaultModel = 'Project';
  13. var currentModel = (result.length > 0) ? result[0].params.model : defaultModel;
  14. var schemaApi = "{:url('/lc/build/table/:model')->suffix(false)}".replace(/:\w+/g, function(model) {
  15. return currentModel;
  16. });
  17. let amis = amisRequire('amis/embed');
  18. // 通过替换下面这个配置来生成不同页面
  19. let amisJSON = {
  20. type: 'page',
  21. title: '数据管理',
  22. body: {
  23. type: 'service',
  24. schemaApi: schemaApi,
  25. },
  26. };
  27. let amisScoped = amis.embed('#root', amisJSON, {}, {
  28. theme: 'cxd'
  29. });
  30. })();
  31. </script>

完整代码:https://gitee.com/web3d/lowcode-demo

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载