lambo-design-bi 0.0.228 → 0.0.230

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.
@@ -200,6 +200,25 @@ export default {
200
200
  link.click();
201
201
  document.body.removeChild(link);
202
202
  },
203
+ getRankIcon(rank) {
204
+ if (rank === 1) return '🥇'
205
+ if (rank === 2) return '🥈'
206
+ if (rank === 3) return '🥉'
207
+ return rank
208
+ },
209
+ getRankTableIndex(index, row) {
210
+ const rowIndex = typeof index === 'number' ? index : row._index
211
+ const table = this.$refs.table || {}
212
+ const pageSize = Number(table.limitNumber || this.widget.options.pageSize) || 0
213
+ const currentPage = table.currentPage || 1
214
+ return pageSize ? (currentPage - 1) * pageSize + rowIndex + 1 : rowIndex + 1
215
+ },
216
+ isRankTable() {
217
+ return String(this.widget.options.tableType) === '2'
218
+ },
219
+ isRankColumn(column) {
220
+ return this.isRankTable() && (column.type === 'index' || column.key === 'index' || column.title === '序号')
221
+ },
203
222
  renderCellContent(h, params) {
204
223
  const key = params.column.key
205
224
  const children = [params.row[key]]
@@ -222,6 +241,238 @@ export default {
222
241
  }
223
242
  return children
224
243
  },
244
+ isTrendChartsColumn(column) {
245
+ const isTrendCharts = column && (column.isTrendCharts === true || column.isTrendCharts === '1')
246
+ if (isTrendCharts) {
247
+ console.log("BiPagingTable -- isTrendChartsColumn -- 命中趋势图列:", column)
248
+ }
249
+ return isTrendCharts
250
+ },
251
+ stringifyTrendChartsValue(value) {
252
+ if (value === null || value === undefined) {
253
+ return ''
254
+ }
255
+ if (typeof value === 'object') {
256
+ try {
257
+ return JSON.stringify(value)
258
+ } catch (e) {
259
+ return String(value)
260
+ }
261
+ }
262
+ return String(value)
263
+ },
264
+ parseTrendChartsValue(value) {
265
+ if (Array.isArray(value)) {
266
+ return value
267
+ }
268
+ if (typeof value === 'string') {
269
+ const trimValue = value.trim()
270
+ if (trimValue.indexOf('[') === 0 && trimValue.lastIndexOf(']') === trimValue.length - 1) {
271
+ try {
272
+ const parseValue = JSON.parse(trimValue)
273
+ if (Array.isArray(parseValue)) {
274
+ console.log("BiPagingTable -- parseTrendChartsValue -- 字符串数组解析成功:", {
275
+ value,
276
+ parseValue
277
+ })
278
+ return parseValue
279
+ }
280
+ } catch (e) {
281
+ console.log("BiPagingTable -- parseTrendChartsValue -- 字符串数组解析失败:", {
282
+ value,
283
+ error: e
284
+ })
285
+ }
286
+ }
287
+ }
288
+ return value
289
+ },
290
+ renderTrendChartsCell(h, params) {
291
+ const key = params.column.key
292
+ const value = params.row[key]
293
+ const chartValue = this.parseTrendChartsValue(value)
294
+ console.log("BiPagingTable -- renderTrendChartsCell -- 渲染趋势图单元格:", {
295
+ key,
296
+ title: params.column.title,
297
+ rowIndex: params.index,
298
+ value,
299
+ chartValue,
300
+ isArray: Array.isArray(chartValue)
301
+ })
302
+ if (!Array.isArray(chartValue)) {
303
+ console.log("BiPagingTable -- renderTrendChartsCell -- 当前值不是数组,按字符串展示:", {
304
+ key,
305
+ value,
306
+ stringValue: this.stringifyTrendChartsValue(value)
307
+ })
308
+ return h('span', this.stringifyTrendChartsValue(value))
309
+ }
310
+
311
+ const width = Number(params.column.trendChartWidth) || 240
312
+ const height = Number(params.column.trendChartHeight) || 48
313
+ return h('canvas', {
314
+ class: 'bi-trend-canvas',
315
+ attrs: {
316
+ width,
317
+ height
318
+ },
319
+ style: {
320
+ display: 'block',
321
+ margin: '0',
322
+ width: width + 'px',
323
+ height: height + 'px'
324
+ },
325
+ hook: {
326
+ insert: vnode => {
327
+ console.log("BiPagingTable -- renderTrendChartsCell -- canvas 已插入DOM,准备绘制:", {
328
+ key: params.column.key,
329
+ rowIndex: params.index,
330
+ width,
331
+ height,
332
+ dataLength: chartValue.length
333
+ })
334
+ this.drawTrendCharts(vnode.elm, chartValue, width, height, params.column)
335
+ },
336
+ postpatch: (...args) => {
337
+ const vnode = args[1]
338
+ console.log("BiPagingTable -- renderTrendChartsCell -- canvas 更新,重新绘制:", {
339
+ key: params.column.key,
340
+ rowIndex: params.index,
341
+ width,
342
+ height,
343
+ dataLength: chartValue.length
344
+ })
345
+ this.drawTrendCharts(vnode.elm, chartValue, width, height, params.column)
346
+ }
347
+ }
348
+ })
349
+ },
350
+ getTrendChartsSmooth() {
351
+ return true
352
+ },
353
+ drawTrendChartsLine(ctx, points, smooth) {
354
+ ctx.beginPath()
355
+ points.forEach((point, index) => {
356
+ if (index === 0) {
357
+ ctx.moveTo(point.x, point.y)
358
+ } else if (smooth) {
359
+ const prevPoint = points[index - 1]
360
+ const midX = (prevPoint.x + point.x) / 2
361
+ ctx.bezierCurveTo(midX, prevPoint.y, midX, point.y, point.x, point.y)
362
+ } else {
363
+ ctx.lineTo(point.x, point.y)
364
+ }
365
+ })
366
+ },
367
+ drawTrendChartsArea(ctx, points, smooth, bottomY) {
368
+ ctx.beginPath()
369
+ ctx.moveTo(points[0].x, bottomY)
370
+ points.forEach((point, index) => {
371
+ if (index === 0) {
372
+ ctx.lineTo(point.x, point.y)
373
+ } else if (smooth) {
374
+ const prevPoint = points[index - 1]
375
+ const midX = (prevPoint.x + point.x) / 2
376
+ ctx.bezierCurveTo(midX, prevPoint.y, midX, point.y, point.x, point.y)
377
+ } else {
378
+ ctx.lineTo(point.x, point.y)
379
+ }
380
+ })
381
+ ctx.lineTo(points[points.length - 1].x, bottomY)
382
+ ctx.closePath()
383
+ },
384
+ drawTrendCharts(canvas, data, width, height, column) {
385
+ if (!canvas) {
386
+ console.log("BiPagingTable -- drawTrendCharts -- canvas 不存在,无法绘制", { data, width, height })
387
+ return
388
+ }
389
+
390
+ const chartData = data.map(item => Number(item))
391
+ if (!chartData.length || chartData.some(item => isNaN(item))) {
392
+ console.log("BiPagingTable -- drawTrendCharts -- 数据为空或存在非数字,无法绘制:", {
393
+ data,
394
+ chartData,
395
+ hasNaN: chartData.some(item => isNaN(item))
396
+ })
397
+ return
398
+ }
399
+
400
+ const ctx = canvas.getContext('2d')
401
+ console.log("BiPagingTable -- drawTrendCharts -- 开始绘制趋势图:", {
402
+ data,
403
+ chartData,
404
+ width,
405
+ height,
406
+ canvasClientWidth: canvas.clientWidth,
407
+ canvasClientHeight: canvas.clientHeight
408
+ })
409
+ const ratio = window.devicePixelRatio || 1
410
+ canvas.width = width * ratio
411
+ canvas.height = height * ratio
412
+ canvas.style.width = width + 'px'
413
+ canvas.style.height = height + 'px'
414
+ ctx.setTransform(ratio, 0, 0, ratio, 0, 0)
415
+ ctx.clearRect(0, 0, width, height)
416
+
417
+ const padding = { top: 6, right: 6, bottom: 6, left: 6 }
418
+ const chartW = width - padding.left - padding.right
419
+ const chartH = height - padding.top - padding.bottom
420
+ const max = Math.max(...chartData)
421
+ const min = Math.min(...chartData)
422
+ const range = max - min || 1
423
+ const points = chartData.map((val, index) => ({
424
+ x: chartData.length === 1 ? width / 2 : padding.left + (index / (chartData.length - 1)) * chartW,
425
+ y: padding.top + chartH - ((val - min) / range) * chartH
426
+ }))
427
+ const smooth = this.getTrendChartsSmooth()
428
+ console.log("BiPagingTable -- drawTrendCharts -- 趋势图线条类型:", {
429
+ key: column && column.key,
430
+ pointCount: points.length,
431
+ smooth
432
+ })
433
+
434
+ const gradient = ctx.createLinearGradient(0, padding.top, 0, height)
435
+ gradient.addColorStop(0, 'rgba(45, 140, 240, 0.25)')
436
+ gradient.addColorStop(0.5, 'rgba(45, 140, 240, 0.1)')
437
+ gradient.addColorStop(1, 'rgba(45, 140, 240, 0.02)')
438
+
439
+ this.drawTrendChartsArea(ctx, points, smooth, height - padding.bottom)
440
+ ctx.fillStyle = gradient
441
+ ctx.fill()
442
+
443
+ this.drawTrendChartsLine(ctx, points, smooth)
444
+ ctx.strokeStyle = '#2d8cf0'
445
+ ctx.lineWidth = 1.8
446
+ ctx.lineJoin = 'round'
447
+ ctx.lineCap = 'round'
448
+ ctx.stroke()
449
+
450
+ points.forEach((point, index) => {
451
+ if (index === 0 || index === points.length - 1 || index % 3 === 0) {
452
+ ctx.beginPath()
453
+ ctx.arc(point.x, point.y, 2.5, 0, Math.PI * 2)
454
+ ctx.fillStyle = '#fff'
455
+ ctx.fill()
456
+ ctx.strokeStyle = '#2d8cf0'
457
+ ctx.lineWidth = 1.5
458
+ ctx.stroke()
459
+ }
460
+ })
461
+
462
+ const lastPoint = points[points.length - 1]
463
+ ctx.beginPath()
464
+ ctx.arc(lastPoint.x, lastPoint.y, 4, 0, Math.PI * 2)
465
+ ctx.fillStyle = 'rgba(45, 140, 240, 0.2)'
466
+ ctx.fill()
467
+ ctx.strokeStyle = '#2d8cf0'
468
+ ctx.lineWidth = 2
469
+ ctx.stroke()
470
+ console.log("BiPagingTable -- drawTrendCharts -- 趋势图绘制完成", {
471
+ pointCount: points.length,
472
+ min,
473
+ max
474
+ })
475
+ },
225
476
  onClose() {
226
477
  this.boxShow = false
227
478
  },
@@ -262,7 +513,16 @@ export default {
262
513
  try {
263
514
  columns = JSON.parse(this.widget.options.columns)
264
515
  columns.forEach((column) => {
265
- if (column.detailName) {
516
+ if (this.isRankColumn(column)) {
517
+ column.type = 'index'
518
+ column.indexMethod = (row, index) => this.getRankIcon(this.getRankTableIndex(index, row))
519
+ }
520
+ if (this.isTrendChartsColumn(column)) {
521
+ let self = this
522
+ column.render = function (h, params) {
523
+ return self.renderTrendChartsCell(h, params)
524
+ }
525
+ } else if (column.detailName) {
266
526
  let self = this
267
527
  column.render = function (h, params) {
268
528
  return h(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lambo-design-bi",
3
- "version": "0.0.228",
3
+ "version": "0.0.230",
4
4
  "description": "Vue2 BI 数据可视化组件库",
5
5
  "main": "index.js",
6
6
  "author": "finch",
@@ -204,6 +204,9 @@ export default {
204
204
  </script>
205
205
  <style scoped lang="less">
206
206
  .ivu-number-info-value-lambo {
207
+ font-family: var("DIN Alternate", "Roboto Mono", Menlo, Consolas, monospace);
208
+ font-variant-numeric: tabular-nums;
209
+ font-feature-settings: "tnum";
207
210
  margin-top: 4px;
208
211
  overflow: hidden;
209
212
  font-size: 0;