什么是Vdata?

vdata是青锋自定义功能模块的核心实现代码,前面讲解的拖拽表单和自定义菜单模块,最终生成的规则信息,会创建一个动态的功能模块,这个动态的、公用的动态模块的核心方法及实现类命名为:Vdata
自定义VData前端逻辑代码 - 图1

Vdata前端代码实现

Edit.vue:前端表单页面,新增表单和编辑表单。
Index.vue:前端主页。
Info.vue:前端详情页。
PEdit.vue:工作流编辑页面(工作流会讲解)
PInfo.vue:工作流详情页面(工作流会讲解)
image.png

首页核心代码

查询字段解析

1、如果字段开启查询,并且字段类型为:select、CheckBox、radio。统一采用下的方式进行查询。
image.png
2、如果查询字段开启查询,并且类型为:input,textarea,number,rate,slider,editor,switch,date,time,则使用输入框进行查看。
image.png
3、如果开启了状态查询
image.png
4、如果开启了时间段查询
image.png

操作按钮权限及控制

image.png
image.png

页面注入刷新

inject: [“reload”],
image.png
案例:
provider/inject:简单的来说就是在父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量。
这种方式可以避免在使用props传值时,必须将每一个属性都传递给子组件的写法,当使用的公共组件不确定会被传递什么值的时候,使用这种写法非常方便。

  1. 在父组件中APP.Vue
  2. <template>
  3. <div id="app" style="height:100%;">
  4. <router-view v-if="isRouterAlive"></router-view>
  5. </div>
  6. </template>
  7. <script>
  8. import axios from 'axios';
  9. export default {
  10. name: 'App',
  11. provide(){
  12. return{
  13. reload:this.reload
  14. }
  15. },
  16. data(){
  17. return{
  18. isRouterAlive:true
  19. }
  20. },
  21. methods:{
  22. reload(){
  23. this.isRouterAlive = false;
  24. this.$nextTick(function(){
  25. this.isRouterAlive = true;
  26. })
  27. }
  28. }
  29. }
  30. </script>
  31. 在子组件中注入父组件中的变量在data()之前注入
  32. inject:['reload'],
  33. 在哪里引用就调用
  34. this.reload()

核心方法findVMenuData

  1. //查询菜单功能信息,根据菜单功能信息初始化页面信息(查询字段、展示字段等)
  2. findVMenuData(menu_id) {
  3. const columns = [];
  4. findVMenuInfo({ menu_id: menu_id }).then((response) => {
  5. this.menu_data = response.data;
  6. if (this.menu_data.open_process == "0") {
  7. this.process_key = this.menu_data.process_id;
  8. }
  9. this.menu_data.fieldPdList.forEach((item) => {
  10. if (item.field_query == "true" || item.field_list == "true") {
  11. if (item.dynamic == "false") {
  12. let options = JSON.parse(item.options);
  13. item.options = options;
  14. } else if (item.dynamic == "true") {
  15. findDictionaryList({ parent_code: item.dynamicKey }).then(
  16. (response) => {
  17. item.options = response.data.data;
  18. item.options.forEach((op) => {
  19. op.label = op.name;
  20. op.value = op.id;
  21. });
  22. this.dynamicData[item.dynamicKey] = item.options;
  23. }
  24. );
  25. }
  26. }
  27. if (item.field_list == "true") {
  28. if (
  29. "input,textarea,number,rate,slider,editor,switch,date,time".indexOf(
  30. item.field_type
  31. ) != -1
  32. ) {
  33. let data = {
  34. title: item.field_comment,
  35. dataIndex: item.field_name,
  36. ellipsis: true,
  37. };
  38. if (
  39. item.field_width != "" &&
  40. item.field_width != undefined &&
  41. isNumber(item.field_width)
  42. ) {
  43. data.width = item.field_width + "px";
  44. }
  45. if (item.field_link == "true") {
  46. data.scopedSlots = { customRender: "name" };
  47. }
  48. columns.push(data);
  49. } else if ("select,checkbox,radio".indexOf(item.field_type) != -1) {
  50. let data = {
  51. title: item.field_comment,
  52. dataIndex: item.field_name,
  53. ellipsis: true,
  54. customRender: (text, row, index) => {
  55. let label = "";
  56. if (Array.isArray(item.options)) {
  57. item.options.forEach((op) => {
  58. if (op.value == text) {
  59. label = op.label;
  60. }
  61. });
  62. }
  63. return label;
  64. },
  65. };
  66. if (
  67. item.field_width != "" &&
  68. item.field_width != undefined &&
  69. isNumber(item.field_width)
  70. ) {
  71. data.width = item.field_width + "px";
  72. }
  73. if (item.field_link == "true") {
  74. data.scopedSlots = { customRender: "name" };
  75. }
  76. columns.push(data);
  77. }
  78. }
  79. });
  80. let dealStatus = {
  81. title: "当前办理状态",
  82. dataIndex: "dealStatus",
  83. ellipsis: true,
  84. };
  85. let assignee = {
  86. title: "当前办理人",
  87. dataIndex: "assignee",
  88. ellipsis: true,
  89. };
  90. let dealTime = {
  91. title: "起办时间",
  92. dataIndex: "dealTime",
  93. ellipsis: true,
  94. };
  95. if (
  96. this.menu_data.status_type == "1" ||
  97. this.menu_data.status_type == "2"
  98. ) {
  99. let status = {
  100. title: "状态",
  101. dataIndex: "status",
  102. customRender: (text, row, index) => {
  103. if (text == "0") {
  104. return "启用";
  105. } else {
  106. return "停用";
  107. }
  108. },
  109. };
  110. columns.push(status);
  111. }
  112. let time = {
  113. title: "创建时间",
  114. dataIndex: "create_time",
  115. };
  116. let width = 200;
  117. if (
  118. this.menu_data.status_type == "1" ||
  119. this.menu_data.status_type == "2"
  120. ) {
  121. width = 250;
  122. }
  123. let operate = {
  124. title: "操作",
  125. dataIndex: "operation",
  126. scopedSlots: { customRender: "operation" },
  127. width: width + "px",
  128. };
  129. if (this.menu_data.open_process == "0") {
  130. columns.push(dealStatus);
  131. columns.push(assignee);
  132. columns.push(dealTime);
  133. } else {
  134. columns.push(time);
  135. }
  136. columns.push(operate);
  137. //查询初始化关联表信息
  138. this.initLinkFormList(this.menu_data.table_id);
  139. this.columns = columns;
  140. this.fetch({ pageSize: 10 });
  141. });
  142. },

关联表查询:

  1. initLinkFormList(table_id) {
  2. //查询关联表-处理关联表的动态数据信息
  3. findLinkFormList({ table_id: table_id }).then((response) => {
  4. let linkFormData = response.data;
  5. linkFormData.forEach((form_data) => {
  6. form_data.vfields.forEach((item) => {
  7. if ("select,checkbox,radio".indexOf(item.field_type) != -1) {
  8. if (item.dynamic == "true") {
  9. findDictionaryList({ parent_code: item.dynamicKey }).then(
  10. (response) => {
  11. item.options = response.data.data;
  12. item.options.forEach((op) => {
  13. op.label = op.name;
  14. op.value = op.id;
  15. });
  16. this.dynamicData[item.dynamicKey] = item.options;
  17. this.$forceUpdate();
  18. }
  19. );
  20. }
  21. }
  22. });
  23. });
  24. });
  25. },
  26. handleTableChange(paginat

新增/编辑页面核心代码

k-form-design表单初始化

动态展示拖拽的表单信息。

  1. <k-form-build
  2. ref="kfb"
  3. :value="jsonData"
  4. :dynamicData="dynamicData"
  5. />
  6. mounted() {
  7. this.form = this.record;
  8. //查询菜单配置信息
  9. // this.initData(this.record.menu_id);
  10. this.jsonData = JSON.parse(this.record.table_content);
  11. },

image.png

数据获取及保存方法

image.png

详情页面初始化及展现

  1. <k-form-build
  2. ref="kfb"
  3. :value="jsonData"
  4. :dynamicData="dynamicData"
  5. :disabled="true"
  6. v-show="initStatus"
  7. />
  8. this.form = this.record;
  9. //查询菜单配置信息
  10. this.jsonData = JSON.parse(this.record.table_content);
  11. this.initStatus = true;

image.png

更多k-form-design的API请查阅

http://kcz66.gitee.io/k-form-design/#/zh-cn/guide/start