ss.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <html lang="zh">
  2. <head>
  3. <meta charset="UTF-8">
  4. <!-- Import style -->
  5. <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"/>
  6. <!-- Import Vue 2.7 -->
  7. <script src="https://unpkg.com/vue@2"></script>
  8. <!-- Import element-ui -->
  9. <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  10. <!-- Import formCreate -->
  11. <script src="https://unpkg.com/@form-create/element-ui@super"></script>
  12. </head>
  13. <body>
  14. <div id="app">
  15. <form-create :rule="rule" :option="options" v-model:value="formData" v-model="api" @submit="onSubmit"></form-create>
  16. </div>
  17. <script>
  18. // ====== 自定义代码开始 ======
  19. var zkqyTable = {
  20. name: 'zkqyTable',
  21. template: `
  22. <div class="zkqy-table">
  23. <div class="table-container">
  24. <div class="zkqy-table-btn" style="margin-bottom: 10px;">
  25. <el-button type="primary" plain @click="add">新增</el-button>
  26. <el-button type="primary" plain @click="edit">修改</el-button>
  27. </div>
  28. <el-table :data="tableData" style="width: 100%" :fit="true" border>
  29. <el-table-column v-if="columns && columns.length > 0" :width="40">
  30. <template slot-scope="scope">
  31. <el-radio class="radio"
  32. :label="scope.row"
  33. v-model="radio"
  34. @change.native="getCurrentRow(scope.row)">
  35. &nbsp;
  36. </el-radio>
  37. </template>
  38. </el-table-column>
  39. <el-table-column
  40. v-for="column in columns"
  41. :key="column.prop"
  42. :prop="column.prop"
  43. :label="column.label"
  44. :width="column.width"
  45. flex="1">
  46. </el-table-column>
  47. <el-table-column label="操作" width="120" align="center" v-if="columns && columns.length > 0">
  48. <template slot-scope="scope">
  49. <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">
  50. 删除
  51. </el-button>
  52. </template>
  53. </el-table-column>
  54. </el-table>
  55. <el-pagination
  56. @size-change="handleSizeChange"
  57. @current-change="handleCurrentChange"
  58. :current-page="currentPage4"
  59. :page-sizes="[2, 5, 10, 15]"
  60. :page-size="100"
  61. layout="total, sizes, prev, pager, next, jumper"
  62. :total="tableList[0].total">
  63. </el-pagination>
  64. </div>
  65. </div>
  66. `,
  67. data() {
  68. return {
  69. zkqyTablePageJson:[{"type":"zkqyTable","field":"Fn0cm9m5s49wbec","title":"表格","$required":false,"props":{"addZkqyTableRow":55,"updateZkqyTableRow":56},"columns":[{"columnName":"主键","showValue":"id"},{"columnName":"名称","showValue":"name"},{"columnName":"年龄","showValue":"age"},{"columnName":"习惯","showValue":"habit_name"},{"columnName":"课程id","showValue":"cls_id"}],"_fc_id":"id_Fosrm9m5s49wbfc","name":"ref_Ff7sm9m5s49wbgc","display":true,"hidden":false,"_fc_drag_tag":"zkqyTable"}],
  70. tableData: [],
  71. columns: [{"prop":"id","label":"主键"},{"prop":"name","label":"名称"},{"prop":"age","label":"年龄"},{"prop":"habit_name","label":"习惯"},{"prop":"cls_id","label":"课程id"}],
  72. radio: '',
  73. policyData: {},
  74. currentPage4: 1,
  75. tableList: [{
  76. tableName: 'stu',
  77. total: 0,
  78. pageSize: 2,
  79. pageNum: 1
  80. }],
  81. baseUrl: 'http://192.168.10.103:8088',
  82. headers: {
  83. Accept: 'application/json',
  84. Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImI1ODdhZjdkLTQ0ZGMtNGMyMS05MmViLTE5YjIyMmFmNGY2MSJ9.dFMXetyerkB9Mc6yFetO2cWg64TQeeMW1EOmNQgWpKXCFBVpKfy2YUZjMdIuFxt_PnT5QlEQErRCIpLKgiypgQ',
  85. 'Content-Type': 'application/json'
  86. },
  87. };
  88. },
  89. methods: {
  90. // 方法实现...
  91. add() {
  92. let p = this.zkqyTablePageJson[0]?.props?.addZkqyTableRow
  93. if(p){
  94. this.queryMobileClickAddData(p)
  95. }
  96. },
  97. edit() {
  98. if (!this.radio) {
  99. this.$message.warning("请先选择一行数据");
  100. return;
  101. }
  102. let formId = this.zkqyTablePageJson[0]?.props?.updateZkqyTableRow
  103. let searchId = this.radio?.id
  104. if(!formId){
  105. this.$message.warning("请配置跳转页面");
  106. return
  107. }else if(!searchId) {
  108. this.$message.warning("id不存在");
  109. }else {
  110. let params = {
  111. formId,
  112. searchId
  113. }
  114. this.queryMobileClickUpdateData(params)
  115. }
  116. },
  117. getCurrentRow(val) {
  118. this.policyData = val;
  119. console.log('this.policyData', this.policyData)
  120. },
  121. handleSizeChange(val) {
  122. this.tableList[0].pageSize = val;
  123. this.getTableLimitInfo({
  124. pageNum: this.tableList[0].pageNum,
  125. pageSize: this.tableList[0].pageSize,
  126. tableName: this.tableList[0].tableName
  127. });
  128. },
  129. handleCurrentChange(val) {
  130. this.tableList[0].pageNum = val;
  131. this.getTableLimitInfo({
  132. pageNum: this.tableList[0].pageNum,
  133. pageSize: this.tableList[0].pageSize,
  134. tableName: this.tableList[0].tableName
  135. });
  136. },
  137. handleDelete(index, row) {
  138. this.$msgbox.confirm('确认删除id为' + row.id + '这行数据?', '提示', {
  139. confirmButtonText: '确定',
  140. cancelButtonText: '取消',
  141. type: 'warning'
  142. }).then(() => {
  143. this.tableData.splice(index, 1);
  144. let { tableName } = this.tableList[0];
  145. this.deleteTableData(row.id, tableName);
  146. }).catch(() => {
  147. this.$message.info("已取消删除");
  148. });
  149. },
  150. async deleteTableData(lineId, tableName) {
  151. const endpoint = '/system/mobilePageDesignData/normal/deleteData';
  152. try {
  153. const url = this.baseUrl + endpoint;
  154. const requestBody = {
  155. lineId: lineId,
  156. tableName: tableName
  157. };
  158. const response = await fetch(url, {
  159. method: 'POST',
  160. headers: this.headers,
  161. body: JSON.stringify(requestBody) // 将参数转为JSON字符串
  162. });
  163. if (!response.ok) {
  164. throw new Error('HTTP error! status: ' + response.status);
  165. }
  166. const result = await response.json();
  167. console.log('删除结果:', result);
  168. if (result.code == 200) {
  169. this.$message.success('删除成功');
  170. let {tableName,pageNum,pageSize} =this.tableList[0]
  171. // 删除成功后刷新表格数据
  172. this.getTableLimitInfo({tableName,pageNum,pageSize})
  173. return true;
  174. } else {
  175. this.$message.error(result.message || '删除失败');
  176. return false;
  177. }
  178. } catch (error) {
  179. console.error('删除数据出错:', error);
  180. this.$message.error('删除请求失败: ' + error.message);
  181. throw error;
  182. }
  183. },
  184. async getTableLimitInfo(params = {}) {
  185. const endpoint = '/system/mobilePageDesignData/tableLimitInfo';
  186. await this.fetchGet(endpoint, params, (data) => {
  187. if (data.code === 200) {
  188. this.tableData = data.rows;
  189. this.tableList[0].total = data.total
  190. } else {
  191. console.warn('接口返回非 200 状态:', data);
  192. }
  193. });
  194. },
  195. async queryMobileClickAddData(params = {}) {
  196. let formId = params;
  197. params ={}
  198. const endpoint = '/system/mobilePageDesignData/queryMobileClickAddData/'+ formId;
  199. await this.fetchGet(endpoint , params,(data) => {
  200. if (data.code === 200) {
  201. // let encodedHtml = data.data.htmlData;
  202. // let decodedHtml = decodeURIComponent(encodedHtml);
  203. // const newWindow = window.open(); // 打开一个新窗口
  204. // if (newWindow) {
  205. // newWindow.document.write(decodedHtml);
  206. // newWindow.document.close(); // 关闭文档流
  207. // } else {
  208. // console.warn('接口返回非 200 状态:', data);
  209. // }
  210. const decodedHtml = decodeURIComponent(data.data.htmlData);
  211. // 创建全屏 iframe
  212. const iframe = document.createElement('iframe');
  213. iframe.srcdoc = decodedHtml;
  214. iframe.style.width = '100%';
  215. iframe.style.height = '100vh';
  216. iframe.style.border = 'none';
  217. // 清空页面并插入 iframe
  218. document.body.innerHTML = '';
  219. document.body.appendChild(iframe);
  220. }
  221. });
  222. },
  223. async queryMobileClickUpdateData(params = {}) {
  224. let formId = params.formId;
  225. let searchId = params.searchId;
  226. params = {}
  227. const endpoint = '/system/mobilePageDesignData/queryMobileClickUpdateData/'+formId +'/'+searchId;
  228. await this.fetchGet(endpoint , params,(data) => {
  229. if (data.code === 200) {
  230. let encodedHtml = data.data.htmlData;
  231. let decodedHtml = decodeURIComponent(encodedHtml);
  232. const newWindow = window.open(); // 打开一个新窗口
  233. if (newWindow) {
  234. newWindow.document.write(decodedHtml);
  235. newWindow.document.close(); // 关闭文档流
  236. } else {
  237. console.warn('接口返回非 200 状态:', data);
  238. }
  239. }
  240. });
  241. },
  242. async fetchGet(endpoint, params = {}, successCallback) {
  243. try {
  244. // 构建查询字符串
  245. const queryString = Object.keys(params)
  246. .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(params[key]))
  247. .join('&');
  248. // 拼接完整的 URL
  249. const url = this.baseUrl + endpoint + (queryString ? '?' + queryString : '');
  250. // 发起 GET 请求
  251. const response = await fetch(url, {
  252. method: 'GET',
  253. headers: this.headers
  254. });
  255. // 检查响应状态
  256. if (!response.ok) {
  257. throw new Error('HTTP error! status: ' + response.status);
  258. }
  259. // 解析返回的数据
  260. const data = await response.json();
  261. // 调用成功回调函数
  262. if (successCallback && typeof successCallback === 'function') {
  263. successCallback(data);
  264. }
  265. } catch (error) {
  266. console.error('调用接口出错:', error);
  267. throw error; // 抛出错误以便上层捕获
  268. }
  269. }
  270. },
  271. mounted() {
  272. let { tableName, pageNum, pageSize } = this.tableList[0];
  273. this.getTableLimitInfo({ tableName, pageNum, pageSize });
  274. }
  275. };
  276. // 注册组件
  277. Vue.use(ELEMENT);
  278. Vue.use(formCreate);
  279. formCreate.component('zkqyTable', zkqyTable);
  280. new Vue({
  281. el: '#app',
  282. data() {
  283. return {
  284. rule: formCreate.parseJson('[{"type":"zkqyTable","field":"Fn0cm9m5s49wbec","title":"表格","$required":false,"props":{"addZkqyTableRow":55,"updateZkqyTableRow":56},"columns":[{"columnName":"主键","showValue":"id"},{"columnName":"名称","showValue":"name"},{"columnName":"年龄","showValue":"age"},{"columnName":"习惯","showValue":"habit_name"},{"columnName":"课程id","showValue":"cls_id"}],"_fc_id":"id_Fosrm9m5s49wbfc","name":"ref_Ff7sm9m5s49wbgc","display":true,"hidden":false,"_fc_drag_tag":"zkqyTable"}]'),
  285. options: formCreate.parseJson('{"form":{"inline":false,"hideRequiredAsterisk":false,"showMessage":true,"inlineMessage":false,"labelPosition":"right","labelWidth":"125px","validateOnRuleChange":false,"size":"small","formInDatabase":"stu","formName":"表格"},"resetBtn":{"show":false,"innerText":"重置"},"submitBtn":{"show":true,"innerText":"提交"}}'),
  286. formData: {},
  287. api: null,
  288. };
  289. },
  290. methods: {
  291. onSubmit(formData){
  292. console.log('submit', formData);
  293. }
  294. }
  295. })
  296. </script>
  297. </body>
  298. </html>