@utogether/udp-core 1.0.1-beta.32 → 1.0.1-beta.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/{403-DLYfAuxQ.js → 403-kwxf8yCK.js} +1 -1
  2. package/dist/{404-Dbia1q49.js → 404-HtCKNMVs.js} +1 -1
  3. package/dist/{500-D-lYtMVC.js → 500-ClrRGqKR.js} +1 -1
  4. package/dist/{AuthorityInfo-CzwPQkCw.js → AuthorityInfo-CtRBjzja.js} +1 -1
  5. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-Bfhd2bS5.js → AuthorityInfo.vue_vue_type_style_index_0_lang-DMwwnDTE.js} +1 -1
  6. package/dist/{Company-DCV5YuUr.js → Company-DTjplho_.js} +3 -3
  7. package/dist/{CompanyPanel-aHbBOEwl.js → CompanyPanel-Cjy6fVPj.js} +1 -1
  8. package/dist/{Department-Dr3h5Fmh.js → Department-CH6Yt7f4.js} +3 -3
  9. package/dist/{DepartmentPanel-D6hgPI7g.js → DepartmentPanel-rqSEit_s.js} +1 -1
  10. package/dist/{DesignPanel-aWfP0ky_.js → DesignPanel-DJ1RlhRO.js} +1 -1
  11. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-dHqOw_C8.js → DesignPanel.vue_vue_type_style_index_0_lang-Wb6xMGH-.js} +2 -2
  12. package/dist/{DictView-C6BZSW-5.js → DictView-BveOTSOM.js} +1 -1
  13. package/dist/{InvOrganization-Di4T9Yfv.js → InvOrganization-DWOGgrPo.js} +1 -1
  14. package/dist/{Org-B17U28sX.js → Org-BN2xMKd6.js} +1 -1
  15. package/dist/{Preview-DlJ0SVhC.js → Preview-DHjo8tzC.js} +1 -1
  16. package/dist/{ReportDefine-j6hxdlwz.js → ReportDefine-_dQiM9xA.js} +1 -1
  17. package/dist/{ReportDesign-CboMxsOv.js → ReportDesign-CdEO2lRV.js} +2 -2
  18. package/dist/{ReportQuery-DVT6Sf78.js → ReportQuery-BpkUbbK6.js} +1 -1
  19. package/dist/{ReportQueryFrom-BpuVqVb3.js → ReportQueryFrom-CbP80_sr.js} +1 -1
  20. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-C_I5wzcF.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-BVL6ZoEt.js} +1 -1
  21. package/dist/{ReportTemplate-DWFO4scM.js → ReportTemplate-DSusiJ71.js} +1 -1
  22. package/dist/{Role-Dwx6GFtP.js → Role-C6hy0KuJ.js} +3 -3
  23. package/dist/{RoleAssign-D76npmCu.js → RoleAssign-xKFsJ7Kx.js} +3 -3
  24. package/dist/{RolePanel-DQMplA4X.js → RolePanel-B7Q58kiG.js} +1 -1
  25. package/dist/{RolePanel-CvkGsh3U.js → RolePanel-DfD9rJzO.js} +1 -1
  26. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-VGjX0Dl_.js → RolePanel.vue_vue_type_script_setup_true_lang-Bv-uI4Dl.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Cj-TVMi3.js → RolePanel.vue_vue_type_script_setup_true_lang-CehA2NNV.js} +3 -3
  28. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-Bop3syHe.js → ScrollPanel.vue_vue_type_style_index_0_lang-Wk3ehyH5.js} +1 -1
  29. package/dist/{Staff-BVpoMX1g.js → Staff-BVUFcmsm.js} +3 -3
  30. package/dist/{StaffInfo-CWH7TI9s.js → StaffInfo-Do7TRY0M.js} +1 -1
  31. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-CEj5vyAQ.js → StaffInfo.vue_vue_type_script_setup_true_lang-baun5eMA.js} +1 -1
  32. package/dist/{StaffPanel-BwkqWADn.js → StaffPanel-5N37v8nE.js} +1 -1
  33. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-BxPzaa3W.js → StaffPanel.vue_vue_type_script_setup_true_lang-Du_AgvPd.js} +2 -2
  34. package/dist/{SysUser-CPOQdEDe.js → SysUser-DwbDMnb-.js} +2 -2
  35. package/dist/{SysUserPanel-BGgwJ_bN.js → SysUserPanel-CZOyQYb6.js} +1 -1
  36. package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-CvdwDd5f.js → SysUserPanel.vue_vue_type_script_setup_true_lang-w2cJYId_.js} +1 -1
  37. package/dist/{SystemMenu-CXuvLpQK.js → SystemMenu-Dt6G8ZoP.js} +2 -2
  38. package/dist/{UserInfo-DKJcPle2.js → UserInfo-DkqXLpcs.js} +1 -1
  39. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-PQykib4V.js → UserInfo.vue_vue_type_style_index_0_lang-CaynWglM.js} +1 -1
  40. package/dist/{childView-CMj_YAGv.js → childView-BFFWXXUx.js} +1 -1
  41. package/dist/{childView-g70n6Kcs.js → childView-BfeXnKqn.js} +1 -1
  42. package/dist/{childView.vue_vue_type_style_index_0_lang-CNmv6fzC.js → childView.vue_vue_type_style_index_0_lang-BJsDq027.js} +51 -44
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-BXtLCHP4.js → childView.vue_vue_type_style_index_0_lang-D3UswIrw.js} +1 -1
  44. package/dist/{code-rule-C1rsgSRN.js → code-rule-DG6acadZ.js} +1 -1
  45. package/dist/core.es.js +1 -1
  46. package/dist/{cron-task-ROksyptX.js → cron-task-BcSJarq3.js} +1 -1
  47. package/dist/{frameView-DcwD2TEs.js → frameView-D64-T4BV.js} +1 -1
  48. package/dist/{index-BKhbKGvC.js → index-1BOi1amY.js} +48 -48
  49. package/dist/{layoutView-CFo0E1DS.js → layoutView-CQJ9c3ZV.js} +1 -1
  50. package/dist/{log-in-DOv3qOBu.js → log-in-EOn9ci11.js} +1 -1
  51. package/dist/{log-out-BSNd2HVZ.js → log-out-Dw-n4tmS.js} +1 -1
  52. package/dist/{login-CHUYfjve.js → login-DHC4RPod.js} +1 -1
  53. package/dist/{login-log-BNRXLeMi.js → login-log-C0V-_l3F.js} +4 -3
  54. package/dist/{lov-view-BiXB86w3.js → lov-view-BG0lV86e.js} +2 -2
  55. package/dist/{menuInfo-Dq-wXWNe.js → menuInfo-CC5u9H-w.js} +1 -1
  56. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-D7fF5i_x.js → menuInfo.vue_vue_type_style_index_0_lang-vnxmY_ro.js} +1 -1
  57. package/dist/{pda-app-C_IKAhyR.js → pda-app-DU1gkWj4.js} +1 -1
  58. package/dist/{resource-MU1MeWNh.js → resource-B9x_rSE_.js} +1 -1
  59. package/dist/{su-welcome-WHp1Gzqh.js → su-welcome-DGOeEb4b.js} +1 -1
  60. package/dist/{sys-config-cYl1uX-X.js → sys-config-C1bZxKpe.js} +1 -1
  61. package/package.json +1 -1
  62. package/src/views/udev/dict/childView.vue +183 -182
  63. package/src/views/upms/user/login-log.vue +54 -54
@@ -1,182 +1,183 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2022-07-15 17:02:56
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-11-19 18:36:06
6
- * @Description: file contentu
7
- -->
8
- <template>
9
- <div class="u-dict-config_wrapper">
10
- <el-drawer
11
- :model-value="show"
12
- :before-close="handleClose"
13
- :title="$t('message.title.dictList', { name: record.dictName })"
14
- direction="rtl"
15
- destroy-on-close
16
- size="76%"
17
- >
18
- <ut-grid
19
- ref="xgrid"
20
- :columns="columns"
21
- :height="height"
22
- :default-params="{ parentId: record.id }"
23
- :buttons="[{ code: 'del', auth: '/' }]"
24
- :tree-config="{ childrenField: 'children', expandAll: true }"
25
- url="/upfm/v1/lov/children"
26
- mode="form"
27
- @buttonClick="onButtonClick"
28
- />
29
- <ut-modal-form
30
- v-if="showModal"
31
- ref="xmodal"
32
- :record="subRecord"
33
- :items="subItems"
34
- width="400"
35
- height="280"
36
- :data-status="modalType"
37
- :title="$t('message.title.dictInfo', { name: record.dictName })"
38
- @close="showModal = false"
39
- @confirm="onConfirm"
40
- />
41
- </el-drawer>
42
- </div>
43
- </template>
44
-
45
- <script setup lang="tsx">
46
- import { ref } from 'vue';
47
- import { useI18n } from 'vue-i18n';
48
- import to from 'await-to-js';
49
- import { VxeUI } from 'vxe-pc-ui';
50
- import { successMessage, useRender } from '@utogether/utils';
51
- import { getServiceApi } from '../../../api';
52
- import { useSystemStoreHook } from '../../../store/modules/system';
53
- import { clone } from 'xe-utils';
54
-
55
- interface IProps {
56
- record: IRecord;
57
- show: boolean;
58
- }
59
-
60
- const props = withDefaults(defineProps<IProps>(), {
61
- record: (): IRecord => {
62
- return {};
63
- },
64
- show: false
65
- });
66
- const renderHook = useRender();
67
- const { t } = useI18n();
68
-
69
- const URL = '/upfm/v1/lov';
70
- const showModal = ref(false);
71
- const xgrid = ref(null);
72
- const xmodal = ref(null);
73
- const subRecord = ref<IRecord>({});
74
- const modalType = ref('add');
75
-
76
- const height = window.innerHeight - 70;
77
-
78
- const columns = [
79
- { field: 'dictCode', title: 'message.udp.dictCode', required: true, treeNode: true },
80
- { field: 'dictName', title: 'message.udp.dictName', required: true },
81
- { field: 'dictDesc', title: 'message.remark' },
82
- { field: 'enabled', formatter: ['formatDict', 'SU.ENABLE'] },
83
- {
84
- field: 'operate',
85
- title: 'message.operate',
86
- width: 200,
87
- fixed: 'right',
88
- slots: {
89
- default: ({ row }) => {
90
- return [
91
- <>
92
- <ut-button
93
- content="add"
94
- status="warning"
95
- auth="edit"
96
- icon="ri-add-line"
97
- onTap={() => handleAddChild(row)}
98
- />
99
- <ut-button content="edit" status="primary" auth="edit" onTap={() => handleEdit(row)} />
100
- <ut-button content="del" status="danger" auth="del" onTap={() => handleDel(row)} />
101
- </>
102
- ];
103
- }
104
- }
105
- }
106
- ];
107
-
108
- const subItems = [
109
- { field: 'dictCode', title: 'message.udp.dictCode', required: true },
110
- { field: 'dictName', title: 'message.udp.dictName', required: true },
111
- { field: 'dictDesc', title: 'message.remark' },
112
- {
113
- field: 'enabled',
114
- itemRender: renderHook.renderSwitch({ openValue: '1', closeValue: '0', defaultValue: '1' })
115
- }
116
- ];
117
-
118
- const handleAdd = () => {
119
- showModal.value = true;
120
- modalType.value = 'add';
121
- subRecord.value = { enabled: '1', parentId: props.record.id };
122
- };
123
- const handleAddChild = row => {
124
- showModal.value = true;
125
- modalType.value = 'add';
126
- subRecord.value = { enabled: '1', parentId: row.id };
127
- };
128
- const handleDel = async row => {
129
- const type = await VxeUI.modal.confirm(t('message.delRecord'));
130
- if (type === 'confirm') {
131
- await getServiceApi().delete(URL, [row]);
132
- successMessage();
133
- xgrid.value.refreshData();
134
- }
135
- };
136
- const handleEdit = async row => {
137
- showModal.value = true;
138
- modalType.value = 'edit';
139
- subRecord.value = clone(row, true);
140
- console.log({ subRecord });
141
- };
142
-
143
- const onConfirm = async () => {
144
- const query = {
145
- ...subRecord.value,
146
- orgId: useSystemStoreHook().getOrgId,
147
- organizationId: useSystemStoreHook().getOrganizationId
148
- };
149
- xmodal.value.showLoading();
150
- const method = modalType.value === 'add' ? 'post' : 'put';
151
- const [err]: [Error, any] = await to(getServiceApi()[method](URL, [query]));
152
- xmodal.value.hiddenLoading();
153
- if (err) return;
154
- showModal.value = modalType.value !== 'edit';
155
- if (modalType.value === 'add') {
156
- subRecord.value = { enabled: '1' };
157
- }
158
- successMessage();
159
- xgrid.value.refreshData();
160
- };
161
-
162
- const onButtonClick = code => {
163
- code === 'add' && handleAdd();
164
- };
165
-
166
- const emit = defineEmits<{
167
- (e: 'onClose'): void;
168
- }>();
169
-
170
- // 抽屉关闭
171
- function handleClose() {
172
- emit('onClose');
173
- }
174
- </script>
175
-
176
- <style lang="scss">
177
- .u-dict-config_wrapper {
178
- .el-drawer__header {
179
- margin-bottom: 0;
180
- }
181
- }
182
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2022-07-15 17:02:56
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-11-24 13:44:45
6
+ * @Description: file contentu
7
+ -->
8
+ <template>
9
+ <div class="u-dict-config_wrapper">
10
+ <el-drawer
11
+ :model-value="show"
12
+ :before-close="handleClose"
13
+ :title="$t('message.title.dictList', { name: record.dictName })"
14
+ direction="rtl"
15
+ destroy-on-close
16
+ size="76%"
17
+ >
18
+ <ut-grid
19
+ ref="xgrid"
20
+ :columns="columns"
21
+ :height="height"
22
+ :default-params="{ parentId: record.id }"
23
+ :buttons="[{ code: 'del', auth: '/' }]"
24
+ :tree-config="{ childrenField: 'children', expandAll: true }"
25
+ url="/upfm/v1/lov/children"
26
+ mode="form"
27
+ @buttonClick="onButtonClick"
28
+ />
29
+ <ut-modal-form
30
+ v-if="showModal"
31
+ ref="xmodal"
32
+ :record="subRecord"
33
+ :items="subItems"
34
+ width="400"
35
+ height="280"
36
+ :data-status="modalType"
37
+ :title="$t('message.title.dictInfo', { name: record.dictName })"
38
+ @close="showModal = false"
39
+ @confirm="onConfirm"
40
+ />
41
+ </el-drawer>
42
+ </div>
43
+ </template>
44
+
45
+ <script setup lang="tsx">
46
+ import { ref } from 'vue';
47
+ import { useI18n } from 'vue-i18n';
48
+ import to from 'await-to-js';
49
+ import { VxeUI } from 'vxe-pc-ui';
50
+ import { successMessage, useRender } from '@utogether/utils';
51
+ import { getServiceApi } from '../../../api';
52
+ import { useSystemStoreHook } from '../../../store/modules/system';
53
+ import { clone } from 'xe-utils';
54
+
55
+ interface IProps {
56
+ record: IRecord;
57
+ show: boolean;
58
+ }
59
+
60
+ const props = withDefaults(defineProps<IProps>(), {
61
+ record: (): IRecord => {
62
+ return {};
63
+ },
64
+ show: false
65
+ });
66
+ const renderHook = useRender();
67
+ const { t } = useI18n();
68
+
69
+ const URL = '/upfm/v1/lov';
70
+ const showModal = ref(false);
71
+ const xgrid = ref(null);
72
+ const xmodal = ref(null);
73
+ const subRecord = ref<IRecord>({});
74
+ const modalType = ref('add');
75
+
76
+ const height = window.innerHeight - 70;
77
+
78
+ const columns = [
79
+ { field: 'dictCode', title: 'message.udp.dictCode', required: true, treeNode: true },
80
+ { field: 'dictName', title: 'message.udp.dictName', required: true },
81
+ { field: 'dictDesc', title: 'message.remark' },
82
+ { field: 'enabled', formatter: ['formatDict', 'SU.ENABLE'] },
83
+ {
84
+ field: 'operate',
85
+ title: 'message.operate',
86
+ width: 200,
87
+ fixed: 'right',
88
+ slots: {
89
+ default: ({ row }) => {
90
+ return [
91
+ <>
92
+ <ut-button
93
+ content="add"
94
+ status="warning"
95
+ auth="edit"
96
+ icon="ri-add-line"
97
+ onTap={() => handleAddChild(row)}
98
+ />
99
+ <ut-button content="edit" status="primary" auth="edit" onTap={() => handleEdit(row)} />
100
+ <ut-button content="del" status="danger" auth="del" onTap={() => handleDel(row)} />
101
+ </>
102
+ ];
103
+ }
104
+ }
105
+ }
106
+ ];
107
+
108
+ const subItems = [
109
+ { field: 'dictCode', title: 'message.udp.dictCode', required: true },
110
+ { field: 'dictName', title: 'message.udp.dictName', required: true },
111
+ { field: 'dictDesc', title: 'message.remark' },
112
+ {
113
+ field: 'enabled',
114
+ itemRender: renderHook.renderSwitch({ openValue: '1', closeValue: '0', defaultValue: '1' })
115
+ }
116
+ ];
117
+
118
+ const handleAdd = () => {
119
+ showModal.value = true;
120
+ modalType.value = 'add';
121
+ subRecord.value = { enabled: '1', parentId: props.record.id };
122
+ };
123
+ const handleAddChild = row => {
124
+ showModal.value = true;
125
+ modalType.value = 'add';
126
+ subRecord.value = { enabled: '1', parentId: row.id };
127
+ };
128
+ const handleDel = async row => {
129
+ const type = await VxeUI.modal.confirm(t('message.delRecord'));
130
+ if (type === 'confirm') {
131
+ await getServiceApi().delete(URL, [row]);
132
+ successMessage();
133
+ xgrid.value.refreshData();
134
+ }
135
+ };
136
+ const handleEdit = async row => {
137
+ showModal.value = true;
138
+ modalType.value = 'edit';
139
+ subRecord.value = clone(row, true);
140
+ console.log({ subRecord });
141
+ };
142
+
143
+ const onConfirm = async () => {
144
+ const query = {
145
+ ...subRecord.value,
146
+ orgId: useSystemStoreHook().getOrgId,
147
+ organizationId: useSystemStoreHook().getOrganizationId
148
+ };
149
+ xmodal.value.showLoading();
150
+ const method = modalType.value === 'add' ? 'post' : 'put';
151
+ const [err]: [Error, any] = await to(getServiceApi()[method](URL, [query]));
152
+ xmodal.value.hiddenLoading();
153
+ if (err) return;
154
+ showModal.value = modalType.value !== 'edit';
155
+ if (modalType.value === 'add') {
156
+ const parentId = subRecord.value.parentId;
157
+ subRecord.value = { enabled: '1', parentId };
158
+ }
159
+ successMessage();
160
+ xgrid.value.refreshData();
161
+ };
162
+
163
+ const onButtonClick = code => {
164
+ code === 'add' && handleAdd();
165
+ };
166
+
167
+ const emit = defineEmits<{
168
+ (e: 'onClose'): void;
169
+ }>();
170
+
171
+ // 抽屉关闭
172
+ function handleClose() {
173
+ emit('onClose');
174
+ }
175
+ </script>
176
+
177
+ <style lang="scss">
178
+ .u-dict-config_wrapper {
179
+ .el-drawer__header {
180
+ margin-bottom: 0;
181
+ }
182
+ }
183
+ </style>
@@ -1,54 +1,54 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-12-23 11:22:51
4
- * @LastEditors: wei.li
5
- * @LastEditTime: 2024-06-28 10:13:13
6
- * @Description: 用户登录日志
7
- -->
8
-
9
- <template>
10
- <div>
11
- <ut-grid ref="xgrid" :items="formItems" :columns="columns" url="/upfm/v1/userMonitor" :editable="false" />
12
- </div>
13
- </template>
14
- <script lang="tsx">
15
- export default {
16
- name: 'LoginLog'
17
- };
18
- </script>
19
- <script setup lang="tsx">
20
- import { ref } from 'vue';
21
- // import { useRouter } from 'vue-router';
22
- // import to from 'await-to-js';
23
- // import { clone } from 'xe-utils';
24
- // import { useRender } from '@utogether/utils';
25
-
26
- // const renderHook = useRender();
27
- // const renderOption = renderOptions();
28
-
29
- // const router = useRouter();
30
-
31
- const formItems = [
32
- { field: 'employeeName' },
33
- { field: 'userName' },
34
- { field: 'operatingSystem', title: 'message.udp.operatingSystem' },
35
- { field: 'browserVersion', title: 'message.udp.browserVersion' },
36
- {
37
- field: 'loginTime',
38
- title: 'message.udp.loginTime',
39
- itemRender: { name: '#SuDateRange', props: { type: 'daterange' } }
40
- }
41
- ];
42
-
43
- // 列字段
44
- const xgrid = ref(null);
45
- const columns = [
46
- { field: 'employeeName', minWidth: 120 },
47
- { field: 'userName', title: 'message.udp.userName', width: 150 },
48
- { field: 'loginTime', title: 'message.udp.loginTime', width: 160 },
49
- { field: 'operatingSystem', title: 'message.udp.operatingSystem', width: 120 },
50
- { field: 'browser', title: 'message.udp.browser', width: 110 },
51
- { field: 'browserVersion', title: 'message.udp.browserVersion', width: 110 },
52
- { field: 'ip', title: 'message.udp.ip', width: 150 }
53
- ];
54
- </script>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-12-23 11:22:51
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-11-21 18:35:50
6
+ * @Description: 用户登录日志
7
+ -->
8
+
9
+ <template>
10
+ <div>
11
+ <ut-grid ref="xgrid" :items="formItems" :columns="columns" url="/upfm/v1/userMonitor" :editable="false" />
12
+ </div>
13
+ </template>
14
+ <script lang="tsx">
15
+ export default {
16
+ name: 'LoginLog'
17
+ };
18
+ </script>
19
+ <script setup lang="tsx">
20
+ import { ref } from 'vue';
21
+ // import { useRouter } from 'vue-router';
22
+ // import to from 'await-to-js';
23
+ // import { clone } from 'xe-utils';
24
+ // import { useRender } from '@utogether/utils';
25
+
26
+ // const renderHook = useRender();
27
+ // const renderOption = renderOptions();
28
+
29
+ // const router = useRouter();
30
+
31
+ const formItems = [
32
+ { field: 'employeeName' },
33
+ { field: 'userName', title: 'message.udp.userName' },
34
+ { field: 'operatingSystem', title: 'message.udp.operatingSystem' },
35
+ { field: 'browserVersion', title: 'message.udp.browserVersion' },
36
+ {
37
+ field: 'loginTime',
38
+ title: 'message.udp.loginTime',
39
+ itemRender: { name: '#SuDateRange', props: { type: 'daterange' } }
40
+ }
41
+ ];
42
+
43
+ // 列字段
44
+ const xgrid = ref(null);
45
+ const columns = [
46
+ { field: 'employeeName', minWidth: 120 },
47
+ { field: 'userName', title: 'message.udp.userName', width: 150 },
48
+ { field: 'loginTime', title: 'message.udp.loginTime', width: 160 },
49
+ { field: 'operatingSystem', title: 'message.udp.operatingSystem', width: 120 },
50
+ { field: 'browser', title: 'message.udp.browser', width: 110 },
51
+ { field: 'browserVersion', title: 'message.udp.browserVersion', width: 110 },
52
+ { field: 'ip', title: 'message.udp.ip', width: 150 }
53
+ ];
54
+ </script>