Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

service-register-config.component.ts 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. import { Component, AfterViewInit, inject } from '@angular/core';
  2. import { ConfigMetaService } from '../../services/config-meta.service';
  3. import { AuthService } from '../../services/auth.service';
  4. import { TabulatorMapper } from '../../utils/tabulator-mapper.util';
  5. import { ConfigService, StickyHeaderComponent, StickyHeaderButton } from 'base-core';
  6. import { CommonModule } from '@angular/common';
  7. // 声明全局类型
  8. declare var Tabulator: any;
  9. @Component({
  10. imports: [CommonModule, StickyHeaderComponent],
  11. selector: 'app-service-register-config',
  12. templateUrl: './service-register-config.component.html',
  13. styleUrl: './service-register-config.component.scss'
  14. })
  15. export class ServiceRegisterConfigComponent implements AfterViewInit {
  16. private tabulator!: any;
  17. private totalCount: number = 0;
  18. private configMetaService = inject(ConfigMetaService);
  19. private config = inject(ConfigService);
  20. private authService = inject(AuthService);
  21. title = '注册服务配置';
  22. hintText = '点击"注册"按钮将同步所有配置元信息到数据库,并显示配置列表。';
  23. headerButtons: StickyHeaderButton[] = [
  24. { title: '注册', name: 'register', icon: 'add', color: 'primary' },
  25. { title: '刷新', name: 'refresh', icon: 'refresh', color: 'accent' }
  26. ];
  27. registering = false;
  28. ngAfterViewInit(): void {
  29. console.log('ServiceRegisterConfigComponent ngAfterViewInit');
  30. console.log('Tabulator global available:', typeof Tabulator !== 'undefined');
  31. console.log('ConfigService状态:', {
  32. useMockData: this.config.useMockData,
  33. apiBaseUrl: this.config.apiBaseUrl
  34. });
  35. console.log('ConfigMetaService API URL:', this.configMetaService.getListUrl());
  36. // 使用 setTimeout 确保 DOM 已渲染
  37. setTimeout(() => {
  38. console.log('Initializing Tabulator...');
  39. this.initTabulator();
  40. }, 100);
  41. }
  42. /**
  43. * 初始化表格 - 标准远程分页版本
  44. */
  45. private initTabulator(): void {
  46. console.log('initTabulator called');
  47. console.log('Table element exists:', document.getElementById('tabulator-table'));
  48. // 获取Basic认证信息
  49. const basicAuth = this.authService.getBasicAuth();
  50. console.log('Basic认证信息:', basicAuth ? '有' : '无');
  51. this.tabulator = new Tabulator('#tabulator-table', {
  52. // 列定义 - 使用现有列配置
  53. columns: [
  54. {
  55. title: 'ID',
  56. field: 'id',
  57. sorter: 'number',
  58. headerFilter: 'input',
  59. width: 80
  60. },
  61. {
  62. title: '配置名称',
  63. field: 'configName',
  64. sorter: 'string',
  65. headerFilter: 'input',
  66. headerFilterFunc: 'like'
  67. },
  68. {
  69. title: '字段名',
  70. field: 'fieldName',
  71. sorter: 'string',
  72. headerFilter: 'input',
  73. headerFilterFunc: 'like'
  74. },
  75. {
  76. title: '字段类型',
  77. field: 'fieldType',
  78. sorter: 'string',
  79. headerFilter: 'input',
  80. headerFilterParams: {
  81. values: ['string', 'number', 'boolean', 'array', 'object']
  82. }
  83. },
  84. {
  85. title: '描述',
  86. field: 'fieldDesc',
  87. sorter: 'string',
  88. headerFilter: 'input',
  89. headerFilterFunc: 'like',
  90. width: 300
  91. }
  92. ],
  93. // 标准远程分页配置
  94. pagination: true,
  95. paginationMode: 'remote',
  96. paginationSize: 20,
  97. paginationSizeSelector: [10, 20, 50, 100],
  98. sortMode: 'remote',
  99. filterMode: 'remote',
  100. // 使用标准AJAX配置,通过代理调用后端API
  101. ajaxURL: '/api/config/meta/list',
  102. ajaxConfig: {
  103. method: 'POST',
  104. headers: {
  105. 'Authorization': basicAuth ? `Basic ${basicAuth}` : '',
  106. 'Content-Type': 'application/json'
  107. }
  108. },
  109. ajaxContentType: 'json',
  110. // // 参数生成器,将Tabulator参数转换为后端期望格式
  111. // ajaxParamsGenerator: (url: string, config: any, params: any) => {
  112. // console.log('Tabulator AJAX参数生成器被调用', { url, config });
  113. // console.log('原始params类型:', typeof params);
  114. // console.log('原始params完整结构:', params);
  115. // // 详细分析params对象
  116. // if (params) {
  117. // console.log('params所有键:', Object.keys(params));
  118. // console.log('page:', params.page);
  119. // console.log('size:', params.size);
  120. // console.log('sort类型:', typeof params.sort);
  121. // console.log('sort值:', params.sort);
  122. // console.log('filter类型:', typeof params.filter);
  123. // console.log('filter值:', params.filter);
  124. // // 检查可能的别名
  125. // console.log('sorters存在?:', 'sorters' in params);
  126. // console.log('filters存在?:', 'filters' in params);
  127. // }
  128. // // 处理params为undefined的情况
  129. // if (!params) {
  130. // params = {};
  131. // }
  132. // // 构建请求参数,使用TabulatorMapper转换为后端期望格式
  133. // // Tabulator 6.x发送的是 sort/filter(单数),但后端期望 sorters/filters(复数)
  134. // const request = TabulatorMapper.buildServerRequest(
  135. // params.page || 1,
  136. // params.size || 20,
  137. // params.sorts || [], // Tabulator使用单数'sort'
  138. // params.filters || [] // Tabulator使用单数'filter'
  139. // );
  140. // console.log('生成的请求参数:', request);
  141. // return request;
  142. // },
  143. // 响应处理,将后端响应转换为Tabulator期望格式
  144. // ajaxResponse: (url: string, params: any, response: any) => {
  145. // console.log('Tabulator AJAX响应处理', { url, params, response });
  146. // // 检查响应格式
  147. // if (response && typeof response === 'object') {
  148. // // 后端返回格式:{success: true, data: [...], totalCount: N, last_page: N}
  149. // const data = response.data || [];
  150. // const totalCount = response.totalCount || 0;
  151. // const pageSize = params.size || 20;
  152. // const lastPage = response.last_page || Math.ceil(totalCount / pageSize);
  153. // return {
  154. // data: data,
  155. // last_page: lastPage
  156. // };
  157. // }
  158. // // 如果响应格式不符合预期,返回空数据
  159. // console.warn('响应格式不符合预期:', response);
  160. // return {
  161. // data: [],
  162. // last_page: 0
  163. // };
  164. // },
  165. tableAjaxError: (error: any) => {
  166. console.error('Tabulator AJAX错误:', error);
  167. if (error.status === 401 || error.status === 403) {
  168. console.warn('认证失败,跳转到登录页面');
  169. this.authService.logout();
  170. }
  171. },
  172. // 表格样式
  173. layout: 'fitColumns',
  174. responsiveLayout: 'collapse',
  175. height: '800px',
  176. // 初始加载
  177. ajaxInitialLoad: true,
  178. // 分页位置
  179. paginationCounter: 'rows',
  180. paginationButtonCount: 5
  181. });
  182. }
  183. onRegister() {
  184. console.log('注册按钮被点击');
  185. this.registering = true;
  186. this.headerButtons[0].loading = true;
  187. this.configMetaService.initConfigMeta().subscribe({
  188. next: (result: any) => {
  189. this.registering = false;
  190. this.headerButtons[0].loading = false;
  191. //this.errorMessage = null;
  192. if (result.success) {
  193. console.log('注册完成:', result.data);
  194. // 注册后切换到真实API数据
  195. //this.debugInfo.useMockData = false;
  196. //this.updateDataConfig();
  197. // 重新加载数据
  198. //this.loadData(1);
  199. console.log('注册成功,数据已重新加载');
  200. } else {
  201. console.error('注册失败:', result);
  202. }
  203. },
  204. error: (error) => {
  205. this.registering = false;
  206. this.headerButtons[0].loading = false;
  207. console.error('注册请求失败:', error);
  208. }
  209. });
  210. }
  211. onHeaderButtonAction(name: string) {
  212. console.log(`头部按钮点击: ${name}`);
  213. switch (name) {
  214. case 'register':
  215. this.onRegister();
  216. break;
  217. case 'refresh':
  218. this.refresh();
  219. break;
  220. default:
  221. console.warn(`未知按钮操作: ${name}`);
  222. }
  223. }
  224. /**
  225. * 刷新表格 - 重新加载数据
  226. */
  227. refresh(): void {
  228. if (this.tabulator) {
  229. this.headerButtons[1].loading = true;
  230. this.tabulator.replaceData();
  231. // 简单延迟后清除loading状态
  232. setTimeout(() => {
  233. this.headerButtons[1].loading = false;
  234. }, 500);
  235. }
  236. }
  237. /**
  238. * 重置筛选和排序
  239. */
  240. reset(): void {
  241. if (this.tabulator) {
  242. this.tabulator.clearFilter();
  243. this.tabulator.clearSort();
  244. }
  245. }
  246. /**
  247. * 刷新表格 - 模板别名
  248. */
  249. refreshTable(): void {
  250. this.refresh();
  251. }
  252. /**
  253. * 重置表格 - 模板别名
  254. */
  255. resetTable(): void {
  256. this.reset();
  257. }
  258. /**
  259. * 导出数据
  260. */
  261. exportData(): void {
  262. if (this.tabulator) {
  263. this.tabulator.download('csv', 'config-meta-data.csv');
  264. }
  265. }
  266. }