vue2-client 1.8.92 → 1.8.94

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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,12 @@
1
1
  # Change Log
2
2
  > 所有关于本项目的变化都在该文档里。
3
3
 
4
+ **1.8.43 -2024-3-12 @江超**
5
+ - 兼容hideInMenu的写法
6
+
7
+ **1.8.93 -2024-3-12 @江超**
8
+ - 数据检索平台调整啊啊啊啊
9
+
4
10
  **1.8.92 -2024-3-9 @张振宇**
5
11
  - XTable 可以自定义禁止修改的行了
6
12
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.8.92",
3
+ "version": "1.8.94",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
@@ -1,12 +1,12 @@
1
1
  <template>
2
2
  <a-row class="data-content">
3
3
  <a-row>
4
- <DynamicTable :table-data="pane.content"></DynamicTable>
4
+ <DynamicTable v-if="pane.key" :title="pane.title" :table-data="pane.content"></DynamicTable>
5
5
  </a-row>
6
6
  <a-row>
7
7
  <ChartSelector :rawData="pane.content" v-if="pane?.content?.length"/>
8
8
  </a-row>
9
- <EvaluationArea :uuid="pane.key" v-if="pane.key"/>
9
+ <EvaluationArea :uuid="pane.key" v-if="pane.key && pane.content"/>
10
10
  </a-row>
11
11
  </template>
12
12
 
@@ -30,6 +30,7 @@ export default {
30
30
  }
31
31
  },
32
32
  mounted () {
33
+ this.pane = {}
33
34
  },
34
35
  methods: {
35
36
  show (obj) {
@@ -1,14 +1,35 @@
1
1
  <template>
2
2
  <div class="table-main">
3
- <a-table
4
- :scroll="{ x: scrollXWidth, y: scrollYHeight }"
5
- size="middle"
6
- :columns="tableColumns"
7
- :dataSource="tableData"
8
- :rowKey="record => record.id">
9
- </a-table>
10
- </div>
11
- </template>
3
+ <template v-if="title">
4
+ <a-table
5
+ v-if="tableData"
6
+ :scroll="{ x: scrollXWidth, y: scrollYHeight }"
7
+ size="middle"
8
+ :columns="tableColumns"
9
+ :dataSource="tableData"
10
+ :rowKey="record => record.id">
11
+ </a-table>
12
+ <a-result
13
+ v-else
14
+ status="error"
15
+ title="请求失败"
16
+ sub-title="这通常是因为网络波动或程序故障导致的"
17
+ >
18
+
19
+ <div class="desc">
20
+ <p style="font-size: 16px;">
21
+ <strong>我如何解决这个问题:</strong>
22
+ </p>
23
+ <p>
24
+ <a-icon :style="{ color: 'red' }" type="close-circle" /> 尝试重新发起请求
25
+ </p>
26
+ <p>
27
+ <a-icon :style="{ color: 'red' }" type="close-circle" /> 调整提问方式
28
+ </p>
29
+ </div>
30
+ </a-result>
31
+ </template>
32
+ </div></template>
12
33
 
13
34
  <script>
14
35
 
@@ -26,9 +47,13 @@ export default {
26
47
  this.initData()
27
48
  },
28
49
  props: {
50
+ title: {
51
+ type: String,
52
+ default: undefined
53
+ },
29
54
  tableData: {
30
55
  type: Array,
31
- default: () => ([])
56
+ default: () => null
32
57
  }
33
58
  },
34
59
  watch: {
@@ -42,8 +67,12 @@ export default {
42
67
  methods: {
43
68
  async initData () {
44
69
  try {
70
+ if (!this.tableData) {
71
+ return
72
+ }
45
73
  // 从数据第一项推断列信息
46
74
  if (this.tableData.length === 0) {
75
+ this.tableColumns = []
47
76
  return
48
77
  }
49
78
  const sample = this.tableData[0]
@@ -4,8 +4,9 @@
4
4
  <p>您对这次搜索结果满意吗?</p>
5
5
  <a-button-group>
6
6
  <a-space>
7
- <a-button type="primary" icon="like" @click="submitEvaluation(true)">满意</a-button>
8
- <a-button type="danger" icon="dislike" @click="submitEvaluation(false)">不满意</a-button>
7
+ <a-button type="primary" icon="like" @click="submitEvaluation(0)">满意</a-button>
8
+ <a-button type="danger" icon="dislike" @click="submitEvaluation(1)">不满意</a-button>
9
+ <a-button type="default" icon="frown" @click="submitEvaluation(2)">待改进</a-button>
9
10
  </a-space>
10
11
  </a-button-group>
11
12
  </div>
@@ -35,12 +36,16 @@ export default {
35
36
  const content = Object.assign(item, {
36
37
  evaluation: result
37
38
  })
38
- post('/api/af-system/logic/openapi/addCommonData', {
39
- type: 'ai-evaluation',
40
- content: content
39
+ // 保存到数据库中
40
+ post('/api/af-system/logic/openapi/updateCommonData', {
41
+ type: 'ai-question',
42
+ content: this.uuid,
43
+ newContent: content
41
44
  }).then(res => {
42
45
  this.action = true
43
46
  this.$message.success('评论成功')
47
+ indexedDB.delete(key)
48
+ indexedDB.add(key, content)
44
49
  })
45
50
  })
46
51
  }
@@ -5,7 +5,7 @@
5
5
  <a-list item-layout="horizontal" :data-source="questions">
6
6
  <a-list-item
7
7
  slot="renderItem"
8
- :class="item.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive'"
8
+ :class="item.sql ? (item.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive') : (item.uuid === currentuuid ? 'question-history-active-bug' : 'question-history-inactive-bug')"
9
9
  slot-scope="item,index"
10
10
  @click="handleOpenFavorite(item)">
11
11
  <a-list-item-meta
@@ -13,26 +13,36 @@
13
13
  :description="item.date"
14
14
  />
15
15
  <a-space>
16
- <a-icon
17
- type="delete"
18
- theme="filled"
19
- class="delClass"
20
- @click.stop="delQuestion(item,index)"
21
- />
16
+ <a-tooltip title="查看元数据">
17
+ <a-icon
18
+ v-if="item.data"
19
+ type="eye"
20
+ @click.stop="openMetaDataModal(item)"/>
21
+ </a-tooltip>
22
22
  <span>&emsp;</span>
23
- <a-icon
24
- v-if="item.data"
25
- type="star"
26
- :class="item.isFavorite ? 'startActive' : 'startInactive'"
27
- @click.stop="toFavorites(item,index)"
28
- :theme=" item.isFavorite ? 'filled': 'twoTone'"
29
- two-tone-color="#FFD700"/>
30
- <a-icon
31
- v-else
32
- @click.stop="reTrySearch(item)"
33
- type="sync"
34
- class="reSearch"
35
- title="重新查询"/>
23
+ <a-tooltip title="删除对话">
24
+ <a-icon
25
+ type="delete"
26
+ theme="filled"
27
+ class="delClass"
28
+ @click.stop="delQuestion(item,index)"/>
29
+ </a-tooltip>
30
+ <span>&emsp;</span>
31
+ <a-tooltip :title="item.isFavorite ? '取消收藏' : '收藏'" v-if="item.sql">
32
+ <a-icon
33
+ type="star"
34
+ :class="item.isFavorite ? 'startActive' : 'startInactive'"
35
+ @click.stop="toFavorites(item,index)"
36
+ :theme=" item.isFavorite ? 'filled': 'twoTone'"
37
+ two-tone-color="#FFD700"/>
38
+ </a-tooltip>
39
+ <a-tooltip title="重新查询" v-else>
40
+ <a-icon
41
+ @click.stop="reTrySearch(item, index)"
42
+ type="sync"
43
+ class="reSearch"
44
+ title="重新查询"/>
45
+ </a-tooltip>
36
46
  </a-space>
37
47
  </a-list-item>
38
48
  </a-list>
@@ -49,6 +59,13 @@
49
59
  :description="item.date"
50
60
  />
51
61
  <a-space>
62
+ <a-tooltip title="查看元数据">
63
+ <a-icon
64
+ v-if="item.data"
65
+ type="eye"
66
+ @click.stop="openMetaDataModal(item)"/>
67
+ </a-tooltip>
68
+ <span>&emsp;</span>
52
69
  <a-icon
53
70
  type="star"
54
71
  :class="item.isFavorite ? 'startActive' : 'startInactive'"
@@ -60,6 +77,42 @@
60
77
  </a-list>
61
78
  </a-tab-pane>
62
79
  </a-tabs>
80
+ <a-modal
81
+ width="1200px"
82
+ title="元数据"
83
+ @cancel="handleCancel"
84
+ :visible="metaDataModalVisible"
85
+ >
86
+ <a-descriptions :column="2" bordered>
87
+ <a-descriptions-item label="uuid">
88
+ {{ item.uuid }}
89
+ </a-descriptions-item>
90
+ <a-descriptions-item label="问题">
91
+ {{ item.question }}
92
+ </a-descriptions-item>
93
+ <a-descriptions-item label="类型">
94
+ {{ item.queryType }}
95
+ </a-descriptions-item>
96
+ <a-descriptions-item label="filterTable">
97
+ {{ item.filterTable }}
98
+ </a-descriptions-item>
99
+ <a-descriptions-item label="relationTable">
100
+ {{ item.relationTable }}
101
+ </a-descriptions-item>
102
+ <a-descriptions-item label="similarTable">
103
+ {{ item.similarTable }}
104
+ </a-descriptions-item>
105
+ <a-descriptions-item label="prompt">
106
+ {{ item.prompt }}
107
+ </a-descriptions-item>
108
+ <a-descriptions-item label="sql">
109
+ {{ item.sql }}
110
+ </a-descriptions-item>
111
+ <a-descriptions-item label="查询日期">
112
+ {{ item.date }}
113
+ </a-descriptions-item>
114
+ </a-descriptions>
115
+ </a-modal>
63
116
  </a-card>
64
117
  </template>
65
118
 
@@ -78,7 +131,10 @@ export default {
78
131
  return {
79
132
  activeKey: '1',
80
133
  questions: [], // 你的问题历史
81
- favorites: [] // 你的收藏问题
134
+ favorites: [], // 你的收藏问题
135
+ // 元数据窗口
136
+ metaDataModalVisible: false,
137
+ item: {}
82
138
  }
83
139
  },
84
140
  mounted () {
@@ -86,6 +142,8 @@ export default {
86
142
  },
87
143
  methods: {
88
144
  loadData () {
145
+ this.questions = []
146
+ this.favorites = []
89
147
  indexedDB.getAll((data) => {
90
148
  // 遍历data,将question和favorites分别赋值给questions和favorites
91
149
  for (const datum of data) {
@@ -103,7 +161,8 @@ export default {
103
161
  handleOpenFavorite (item) {
104
162
  this.$emit('handleOpenFavorite', item)
105
163
  },
106
- reTrySearch (item) {
164
+ reTrySearch (item, index) {
165
+ this.delQuestion(item, index)
107
166
  this.$emit('handleSearch', item.question, null, item.uuid)
108
167
  },
109
168
  add (question) {
@@ -119,14 +178,22 @@ export default {
119
178
  return
120
179
  }
121
180
  this.questions.push(question)
181
+ this.handleOpenFavorite(question)
122
182
  indexedDB.add('question-' + question.uuid, question)
183
+ this.loadData()
123
184
  },
124
185
  updateQuestion (question) {
125
186
  const questionKey = 'question-' + question.uuid
126
187
  indexedDB.delete(questionKey)
127
188
  indexedDB.add(questionKey, question)
128
189
  },
129
-
190
+ openMetaDataModal (item) {
191
+ this.item = item
192
+ this.metaDataModalVisible = true
193
+ },
194
+ handleCancel () {
195
+ this.metaDataModalVisible = false
196
+ },
130
197
  toFavorites (question, index) {
131
198
  this.questions[index].isFavorite = !this.questions[index].isFavorite
132
199
  if (this.questions[index].isFavorite) {
@@ -138,7 +205,7 @@ export default {
138
205
  this.$message.success('收藏成功')
139
206
  } else {
140
207
  // 根据 uuid 删除 favorites 中的对应项
141
- this.favorites = this.favorites.filter(item => item.uuid !== question.uuid)
208
+ this.favorites = this.favorites.filter(item => item.uuid !== question.uuid).sort((a, b) => new Date(b.date) - new Date(a.date))
142
209
  // 删除收藏的储存
143
210
  const key = 'favorites-' + question.uuid
144
211
  indexedDB.delete(key)
@@ -153,9 +220,6 @@ export default {
153
220
  // 删除收藏
154
221
  const favoritesKey = 'favorites-' + item.uuid
155
222
  indexedDB.delete(favoritesKey)
156
- // 删除收藏数组中的对应项
157
- this.favorites = this.favorites.filter(favorite => favorite.uuid !== item.uuid)
158
- this.$message.success('删除成功')
159
223
  },
160
224
  delFavorites (item, index) {
161
225
  this.favorites.splice(index, 1)
@@ -189,15 +253,28 @@ export default {
189
253
  height: 100%;
190
254
  border-radius: 8px;
191
255
 
256
+ .question-history-active-bug {
257
+ border-left: 4px solid #FF0036;
258
+ border-radius: 4px;
259
+ padding: 18px 18px 18px 14px;
260
+ background-color: rgba(#ff0000, 0.04);
261
+ }
262
+
192
263
  .question-history-active {
193
264
  border-left: 4px solid #1890FF;
194
- // 左上左下圆角
195
- border-radius: 4px 0 0 4px;
196
- padding-left : 14px;
265
+ border-radius: 4px;
266
+ padding: 18px 18px 18px 14px;
267
+ }
268
+
269
+ .question-history-inactive-bug {
270
+ border-radius: 4px;
271
+ padding : 18px;
272
+ background-color: rgba(#ff0000, 0.04);
197
273
  }
198
274
 
199
275
  .question-history-inactive {
200
- padding-left : 18px;
276
+ border-radius: 4px;
277
+ padding : 18px;
201
278
  }
202
279
 
203
280
  .ant-list-item-meta /deep/ {
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="search-bar">
3
- <a-select default-value="all" class="select" @change="handleChange">
3
+ <a-select default-value="all" class="select" @change="handleChange" :dropdownMatchSelectWidth="false">
4
4
  <a-select-option v-for="d in selectOption" :key="d.value">
5
5
  {{ d.text }}
6
6
  </a-select-option>
@@ -40,7 +40,7 @@
40
40
 
41
41
  <script>
42
42
  import FavoriteList from './FavoriteList.vue'
43
- import { post } from '@vue2-client/services/api'
43
+ import { get, post } from '@vue2-client/services/api'
44
44
  import { debounce } from 'ant-design-vue/lib/vc-table/src/utils'
45
45
 
46
46
  export default {
@@ -59,29 +59,28 @@ export default {
59
59
  favoriteListVisible: false,
60
60
  loading: false,
61
61
  dataSourceResults: [],
62
- selectOption: [
63
- { value: 'all', text: '全部' },
64
- { value: '合同', text: '合同类' },
65
- { value: '项目', text: '项目类' },
66
- { value: '人员', text: '人员类' },
67
- ]
62
+ selectOption: [],
63
+ queryType: 'all',
68
64
  }
69
65
  },
70
66
  computed: {
71
67
  },
68
+ created () {
69
+ this.selectOption = [
70
+ { value: 'all', text: '全部' }
71
+ ]
72
+ get('/ai/question_types', {}).then(res => {
73
+ for (const item of res) {
74
+ this.selectOption.push({ value: item, text: item })
75
+ }
76
+ })
77
+ },
72
78
  mounted () {
73
79
  this.init()
74
80
  },
75
81
  methods: {
76
82
  handleChange (value) {
77
- if (value === 'all') {
78
- this.searchInput = ''
79
- } else {
80
- this.searchInput = value
81
- }
82
- this.dataSourceResults = []
83
- this.fetchFunction(this.searchInput)
84
- this.$refs.autoComplete.focus()
83
+ this.queryType = value
85
84
  },
86
85
  fetchFunction (value) {
87
86
  this.dataSourceResults = []
@@ -101,7 +100,6 @@ export default {
101
100
  this.dataSourceResults = res.map(item => JSON.parse(item.f_json).question)
102
101
  .filter((item, index, arr) => arr.indexOf(item) === index)
103
102
  .map(item => ({ category: item }))
104
- console.warn(this.dataSourceResults)
105
103
  }
106
104
  }).finally(() => {
107
105
  this.searching = false
@@ -112,7 +110,7 @@ export default {
112
110
  onSearch (value) {
113
111
  this.loading = true
114
112
  // 触发父组件的搜索事件,传递搜索输入的值
115
- this.$emit('search', value, () => {
113
+ this.$emit('search', value, this.queryType, () => {
116
114
  this.loading = false
117
115
  })
118
116
  },
@@ -180,13 +178,13 @@ export default {
180
178
  font-size: 16px;
181
179
  }
182
180
  .select {
183
- width: 100px;
181
+ width: 160px;
184
182
  height: 48px;
185
183
  padding-right: 6px;
186
184
  font-size: 16px;
187
185
  text-align: center;
188
186
  :deep(.ant-select-selection-selected-value) {
189
- width: 100px;
187
+ width: 120px;
190
188
  height: 48px;
191
189
  line-height: 48px;
192
190
  }
@@ -29,6 +29,7 @@
29
29
  <a-spin :spinning="loading" tip="正在努力加载..." wrapperClassName="spingclass">
30
30
  <!-- 数据展示Tabs -->
31
31
  <data-tabs
32
+ v-show="!loading"
32
33
  ref="tabs"
33
34
  @tab-change="handleTabChange"
34
35
  @remove-cache="remove"
@@ -47,6 +48,7 @@ import DataTabs from './DataTabs.vue'
47
48
  import { formatDate } from '@vue2-client/utils/util'
48
49
  import QuestionHistoryAndFavorites from './QuestionHistoryAndFavorites.vue'
49
50
  import { post } from '@vue2-client/services/api'
51
+ import { indexedDB } from '@/utils/indexedDB'
50
52
 
51
53
  export default {
52
54
  name: 'DynamicStatistics',
@@ -65,13 +67,36 @@ export default {
65
67
  },
66
68
  methods: {
67
69
  // 处理搜索逻辑,这里简化为直接赋值,实际应调用API
68
- async handleSearch (value, callback, uuid) {
69
- this.loading = true
70
+ async handleSearch (value, queryType, callback, uuid) {
70
71
  if (!value) {
71
72
  this.$message.warn('请先输入查询的数据')
72
73
  callback()
73
74
  return
74
75
  }
76
+ const that = this
77
+ indexedDB.getAll((data) => {
78
+ let evaluation = true
79
+ for (const datum of data) {
80
+ if (datum.key.includes('question')) {
81
+ const item = datum.data
82
+ console.warn(item)
83
+ if (item.evaluation === undefined && item.sql) {
84
+ evaluation = false
85
+ break
86
+ }
87
+ }
88
+ }
89
+ if (evaluation) {
90
+ that.handleSearchMain(value, queryType, callback, uuid)
91
+ } else {
92
+ that.$message.warn('请先对已发起的对话进行评价!')
93
+ callback()
94
+ return false
95
+ }
96
+ })
97
+ },
98
+ handleSearchMain (value, queryType, callback, uuid) {
99
+ this.loading = true
75
100
  if (!uuid) {
76
101
  uuid = this.uuid()
77
102
  }
@@ -79,74 +104,51 @@ export default {
79
104
  this.$refs.qhaf.add({
80
105
  uuid: uuid,
81
106
  question: value,
107
+ queryType: queryType,
82
108
  isFavorite: false,
83
109
  date: formatDate('now')
84
110
  })
85
- post('/ai/question/', {
111
+ let url = '/ai/question/'
112
+ if (queryType !== 'all') {
113
+ url = url + queryType + '/'
114
+ }
115
+ post(url, {
86
116
  messages: [{
87
117
  content: value,
88
118
  role: 'user'
89
119
  }]
90
120
  }).then(res => {
91
121
  this.loading = false
92
- // res = [
93
- // {
94
- // name: '张三',
95
- // year: '2013',
96
- // money: Math.floor(Math.random() * 100) + 1,
97
- // age: Math.floor(Math.random() * 100) + 1
98
- // },
99
- // {
100
- // name: '张三2',
101
- // year: '2014',
102
- // money: Math.floor(Math.random() * 100) + 1,
103
- // age: Math.floor(Math.random() * 100) + 1
104
- // },
105
- // {
106
- // name: '张三3',
107
- // year: '2015',
108
- // money: Math.floor(Math.random() * 100) + 1,
109
- // age: Math.floor(Math.random() * 100) + 1
110
- // },
111
- // {
112
- // name: '张三3',
113
- // year: '2016',
114
- // money: Math.floor(Math.random() * 100) + 1,
115
- // age: Math.floor(Math.random() * 100) + 1
116
- // },
117
- // {
118
- // name: '张三3',
119
- // year: '2017',
120
- // money: Math.floor(Math.random() * 100) + 1,
121
- // age: Math.floor(Math.random() * 100) + 1
122
- // }
123
- // ]
122
+ const sql = res.sql ? res.sql.replace(/'/g, "''") : null
123
+ const questionInfo = {
124
+ uuid: uuid,
125
+ question: value,
126
+ queryType: queryType,
127
+ filterTable: res.filter_table,
128
+ prompt: res.prompt,
129
+ relationTable: res.relation_table,
130
+ similarTable: res.similar_table,
131
+ sql: sql,
132
+ date: formatDate('now'),
133
+ data: res.result,
134
+ isFavorite: false
135
+ }
124
136
  // 保存到数据库中
125
137
  post('/api/af-system/logic/openapi/addCommonData', {
126
138
  type: 'ai-question',
127
- content: {
128
- uuid: uuid,
129
- question: value,
130
- date: formatDate('now')
131
- }
139
+ content: questionInfo
132
140
  })
133
- if (Array.isArray(res)) {
134
- this.addTab(uuid, value, res, false)
135
- } else {
136
- this.$message.warning(res)
137
- }
141
+ this.addTab(questionInfo, false)
142
+ }).catch(e => {
143
+ this.$message.warning(e)
138
144
  }).finally(() => {
139
145
  callback()
146
+ this.loading = false
140
147
  })
141
148
  },
142
- addTab (uuid, question, searchResults, isFavorite) {
143
- this.cacheSearchArray[uuid] = {
144
- uuid: uuid,
145
- question: question,
146
- data: searchResults,
147
- isFavorite: isFavorite,
148
- date: formatDate('now')
149
- }
149
+ addTab (questionInfo) {
150
+ const { uuid } = questionInfo
151
+ this.cacheSearchArray[uuid] = questionInfo
150
152
  this.currentuuid = uuid
151
153
  this.$refs.tabs.show(this.cacheSearchArray[uuid])
152
154
  this.$refs.qhaf.add(this.cacheSearchArray[uuid])
@@ -163,7 +165,7 @@ export default {
163
165
  },
164
166
  // 处理从对话历史/收藏夹打开收藏项
165
167
  handleOpenFavorite (item) {
166
- this.addTab(item.uuid, item.question, item.data, item.isFavorite)
168
+ this.addTab(item)
167
169
  },
168
170
  uuid () {
169
171
  const tempUrl = URL.createObjectURL(new Blob())
@@ -253,6 +255,8 @@ export default {
253
255
 
254
256
  .spingclass {
255
257
  height: 100%;
258
+ background-color: #fff;
259
+ transition: none;
256
260
  }
257
261
 
258
262
  :deep(.ant-spin-container) {
@@ -64,7 +64,7 @@
64
64
  <a-col :span="17"><span>{{ details.resultrecord }}</span></a-col>
65
65
  </a-row>
66
66
  </a-tab-pane>
67
- <a-tab-pane key="2" tab="工单确认" v-show="this.details.status === 4">
67
+ <a-tab-pane key="2" tab="工单确认" v-show="this.details.status === 4">
68
68
  <a-row class="item">
69
69
  <a-form :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
70
70
  <!-- 是否完成 -->
@@ -350,6 +350,9 @@ function parsefunc (func) {
350
350
  route.router = row.link.split('$')[1]
351
351
  route.params = row.link.split('$')[0]
352
352
  }
353
+ if (row.router.includes('?hideInMenu')) {
354
+ route.router = row.router.replace('?hideInMenu', '')
355
+ }
353
356
  if (row.children && row.children.length > 0) {
354
357
  route.children = parsefunc(row.children)
355
358
  }