JianghuJS-页面(Page)

学习目标

  • 理解jianghujs page:学习page的基础模板渲染。
  • 快速创建页面:根据指定的数据表快速生成模板页面。
  • Page的组成部分:学习page的代码、施工方案和配置。

1. JianghuJs page

Page即为HTML页面, JianghuJS主要使用以下技术构建页面

  • nunjucks模板引擎: include来复用代码/引入组件, extends用来指定模板继承
  • Vue.js框架
  • Vuetify UI库

在JianghuJS框架中,page文件存放在/app/view/page文件夹下,并且在项目数据库的_page表中有对应的配置。

2. 使用jianghu-init快速创建page

需求:有一张 student

  1. CREATE TABLE `student` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `studentId` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '学生ID',
  4. `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '学生名字',
  5. `gender` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '性别',
  6. `dateOfBirth` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '出生日期',
  7. `classId` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '班级ID',
  8. `level` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '年级',
  9. `bodyHeight` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '身高',
  10. `studentStatus` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '学生状态; 在校, 离校',
  11. `remarks` mediumtext COLLATE utf8mb4_bin COMMENT '备注',
  12. `operation` varchar(255) COLLATE utf8mb4_bin DEFAULT 'insert' COMMENT '操作; insert, update, jhInsert, jhUpdate, jhDelete jhRestore',
  13. `operationByUserId` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作者userId',
  14. `operationByUser` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作者用户名',
  15. `operationAt` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作时间; E.g: 2021-05-28T10:24:54+08:00 ',
  16. PRIMARY KEY (`id`) USING BTREE,
  17. KEY `studentId` (`studentId`) USING BTREE
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

现在创建一个页面管理student数据, 操作如下:

  1. $ cd my-project
  2. $ jianghu-init page
  3. ? Please select a page type (Use arrow keys)
  4. > 1table-page - generate pages from a table
  5. 初始化数据库连接成功
  6. 开始生成 CRUD
  7. ? 请选择你要生成 crud 的表 (Press <space> to select, <a> to toggle all, <i> to invert sele
  8. ? 请选择你要生成 crud 的表 student
  9. { tables: [ 'student' ] }
  10. 开始生成 student CRUD
  11. ? student】数据表pageId studentManagement
  12. 表字段
  13. 生成 student vue 文件完成
  14. 开始生成 student 的相关数据
  15. 正在执行 -- 创建 page
  16. 正在执行 -- 创建 resource
  17. 生成 student 的相关数据完成
  18. init crud is success
  19. jianghu init page is success
  20. $ npm run dev
  21. > my-project@0.0.1 dev
  22. > egg-bin dev --port=7001
  23. 2023-04-10 14:00:39,679 INFO 62582 [master] @jianghujs/jianghu started on <http://127.0.0.1:7001> (1523ms)

打开浏览器访问http://127.0.0.1:7001, 就会发现菜单上多了一个studentManagement页面

提示:使用jianghu-init命令生成Page的过程中,数据表需要遵循以下规范:

  • 表名应为小写,采用下划线分隔单词,例如:user_profile。
  • 所有表必须有一个自增长的id列作为主键,列名为:id。
  • 所有字段应使用驼峰标识,例如:userAvatar、contractId。
  • 字段应填写注释,例如: userAvatar COMMENT ‘头像’。如果是一些字典字段,可以在注释后加上一些开发人员需要了解的备注,例如:status COMMENT ‘状态; 启用,禁用’。这样生成的页面字段标题只会显示‘状态’。
  • 表格编码应使用utf8mb4。

例如:

  1. CREATE TABLE `student` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `studentId` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '学生ID',
  4. `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '学生名字',
  5. `gender` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '性别',
  6. `dateOfBirth` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '出生日期',
  7. `classId` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '班级ID',
  8. `level` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '年级',
  9. `bodyHeight` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '身高',
  10. `studentStatus` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '学生状态; 在校, 离校',
  11. `remarks` mediumtext COLLATE utf8mb4_bin COMMENT '备注',
  12. `operation` varchar(255) COLLATE utf8mb4_bin DEFAULT 'insert' COMMENT '操作; insert, update, jhInsert, jhUpdate, jhDelete jhRestore',
  13. `operationByUserId` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作者userId',
  14. `operationByUser` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作者用户名',
  15. `operationAt` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作时间; E.g: 2021-05-28T10:24:54+08:00 ',
  16. PRIMARY KEY (`id`) USING BTREE,
  17. KEY `studentId` (`studentId`) USING BTREE
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

3. 一个Page有哪几部分

一个Page文件通常由以下几部分构成:

  • 父页面:使用extends用来指定父页面, 例如: {% extends 'template/jhTemplateV4.html'%}
  • vueTemplate: 用于呈现页面结构和内容的HTML代码
  • vueScript:用于处理页面的数据和逻辑的JavaScript代码

my-project项目中的/page/backendSearchDemo.html为例

  1. {% extends 'template/jhTemplateV4.html'%}
  2. {% block vueTemplate %}
  3. <script type="text/html" id="app-template">
  4. <div>
  5. <v-app mobile-breakpoint="sm">
  6. <jh-menu />
  7. <v-main class="mt-15">
  8. ...
  9. </v-main>
  10. </v-app>
  11. <jh-toast />
  12. <jh-mask />
  13. <jh-confirm-dialog />
  14. </div>
  15. </script>
  16. <div id="app">
  17. </div>
  18. {% endblock %}
  19. {% block vueScript %}
  20. {% include 'common/jianghuJs/fixedTableHeightV4.html' %}
  21. <script type="module">
  22. new Vue({
  23. el: '#app',
  24. template: '#app-template',
  25. vuetify: new Vuetify(),
  26. data: () => ({}),
  27. async created() {},
  28. mounted() {},
  29. methods: {}
  30. })
  31. </script>
  32. <style scoped>
  33. </style>
  34. {% endblock %}

4. Page中doUiAction规范

doUiAction是一个页面中定义的js方法,在JianghuJS框架中,我们希望html上的 所有操作都调用 doUiAction方法.

在doUiAction规范中, 一个页面上的业务操作会被分成多个js方法执行, doUiAction管理了这些js方法。这样做的目的是为了增加 js代码的可读性, 使用方法名来增加可读性。

以下是一个新增学生的案例, 点击新增按钮时

  1. 准备好 学生表单数据
  2. 打开 学生表单所在抽屉
  1. <v-btn color="success" class="elevation-0 mr-2" @click="doUiAction('startCreateItem')" small>新增</v-btn>
  2. // doUiAction定义与实现
  3. methods: {
  4. // 定义doUiAction
  5. async doUiAction(uiActionId, uiActionData) {
  6. switch (uiActionId) {
  7. case 'startCreateItem':
  8. await this.prepareCreateFormData();
  9. await this.openCreateDrawer();
  10. break;
  11. default:
  12. console.error("[doUiAction] uiActionId not find", {uiActionId});
  13. break;
  14. }
  15. },
  16. // ---------- startCreateItem uiAction >>>>>>>>>> --------
  17. async prepareCreateFormData() {
  18. //do something...
  19. },
  20. async openCreateDrawer() {
  21. //do something...
  22. },
  23. // ---------- <<<<<<<<<<< startCreateItem uiAction ---------
  24. }

5. Page配置

以下内容了解即可

在Jianghu框架中页面可以通过项目数据库的_page表进行配置:

  • pageId: url上的路径
  • pageFile: 指定那个html文件,默认用的${pageId}.html
  • pageName: 展示在菜单上的名字
  • pageType: showInMenu, dynamicInMenu, seo
  • sort: 展示在菜单上的顺序,从小到大排
  • pageHook: 页面构建的前置操作
  • passcode: 页面认证密码, 需要结合对应的ui组件一起使用

小结

通过以上步骤,我们成功地了解了江湖JS中的页面的定义,和如何使用Jianghu-init工具快速创建页面。可以动手尝试一下以下练习:

  • 给定一个客户表,使用jianghu-init命令创建一个客户列表页面。