From 4f8300fd1a637ed33c62b70dc80928efaa94ed55 Mon Sep 17 00:00:00 2001 From: xiaowen <372193233@qq.com> Date: Tue, 5 Jul 2022 16:18:01 +0800 Subject: [PATCH] cxw-010203 --- components/word-cloud/WordCloud.js | 789 +++++++++++++++++++++++++++++ components/word-cloud/index.js | 50 ++ components/word-cloud/index.json | 4 + components/word-cloud/index.wxml | 8 + components/word-cloud/index.wxss | 1 + images/carSide.png | Bin 0 -> 33518 bytes pages/insight/index.js | 34 +- pages/insight/index.json | 2 +- pages/insight/index.wxml | 5 +- 9 files changed, 890 insertions(+), 3 deletions(-) create mode 100644 components/word-cloud/WordCloud.js create mode 100644 components/word-cloud/index.js create mode 100644 components/word-cloud/index.json create mode 100644 components/word-cloud/index.wxml create mode 100644 components/word-cloud/index.wxss create mode 100644 images/carSide.png diff --git a/components/word-cloud/WordCloud.js b/components/word-cloud/WordCloud.js new file mode 100644 index 0000000..305db49 --- /dev/null +++ b/components/word-cloud/WordCloud.js @@ -0,0 +1,789 @@ +/*! + * wordcloud2.js + * http://timdream.org/wordcloud2.js/ + * + * Copyright 2011 - 2013 Tim Chien + * Released under the MIT license + */ + +'use strict'; +let drawSpan = []; +// Find out if the browser impose minium font size by +// drawing small texts on a canvas and measure it's width. +function getMinFontSize(ctx) { + + // start from 20 + var size = 20; + + // two sizes to measure + var hanWidth, mWidth; + + while (size) { + ctx.setFontSize(size) + if ((ctx.measureText('\uFF37').width === hanWidth) && + (ctx.measureText('m').width) === mWidth) { + return (size + 1); + } + + hanWidth = ctx.measureText('\uFF37').width; + mWidth = ctx.measureText('m').width; + + size--; + } + + return 0; +}; + +// Based on http://jsfromhell.com/array/shuffle +var shuffleArray = function shuffleArray(arr) { + for (var j, x, i = arr.length; i; j = Math.floor(Math.random() * i), + x = arr[--i], arr[i] = arr[j], + arr[j] = x) {} + return arr; +}; + +function WordCloud(ctx, mycanvas, options, self, callback) { + + var minFontSize = getMinFontSize(ctx) + + /* Default values to be overwritten by options object */ + var settings = { + list: [], + fontFamily: '"Trebuchet MS", "Heiti TC", "微軟正黑體", ' + + '"Arial Unicode MS", "Droid Fallback Sans", sans-serif', + fontWeight: 'normal', + color: 'random-dark', + minSize: 0, // 0 to disable + weightFactor: 1, + clearCanvas: true, + backgroundColor: '#fff', // opaque white = rgba(255, 255, 255, 1) + + gridSize: 8, + drawOutOfBound: false, + shrinkToFit: false, + origin: null, + + maskColor: 'rgba(255,0,0,0.3)', + maskGapWidth: 0.3, + + wait: 0, + abortThreshold: 0, // disabled + abort: function noop() {}, + + minRotation: -Math.PI / 2, + maxRotation: Math.PI / 2, + rotationSteps: 0, + + shuffle: true, + rotateRatio: 0.1, + + shape: 'circle', + ellipticity: 0.65, + + classes: null, + + hover: null, + click: null + }; + + if (options) { + for (var key in options) { + if (key in settings) { + settings[key] = options[key]; + } + } + } + + /* Convert weightFactor into a function */ + if (typeof settings.weightFactor !== 'function') { + var factor = settings.weightFactor; + settings.weightFactor = function weightFactor(pt) { + return pt * factor; //in px + }; + } + + /* Convert shape into a function */ + if (typeof settings.shape !== 'function') { + switch (settings.shape) { + case 'circle': + /* falls through */ + default: + // 'circle' is the default and a shortcut in the code loop. + settings.shape = 'circle'; + break; + + case 'cardioid': + settings.shape = function shapeCardioid(theta) { + return 1 - Math.sin(theta); + }; + break; + + /* + To work out an X-gon, one has to calculate "m", + where 1/(cos(2*PI/X)+m*sin(2*PI/X)) = 1/(cos(0)+m*sin(0)) + http://www.wolframalpha.com/input/?i=1%2F%28cos%282*PI%2FX%29%2Bm*sin%28 + 2*PI%2FX%29%29+%3D+1%2F%28cos%280%29%2Bm*sin%280%29%29 + Copy the solution into polar equation r = 1/(cos(t') + m*sin(t')) + where t' equals to mod(t, 2PI/X); + */ + + case 'diamond': + // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+ + // %28t%2C+PI%2F2%29%29%2Bsin%28mod+%28t%2C+PI%2F2%29%29%29%2C+t+%3D + // +0+..+2*PI + settings.shape = function shapeSquare(theta) { + var thetaPrime = theta % (2 * Math.PI / 4); + return 1 / (Math.cos(thetaPrime) + Math.sin(thetaPrime)); + }; + break; + + case 'square': + // http://www.wolframalpha.com/input/?i=plot+r+%3D+min(1%2Fabs(cos(t + // )),1%2Fabs(sin(t)))),+t+%3D+0+..+2*PI + settings.shape = function shapeSquare(theta) { + return Math.min( + 1 / Math.abs(Math.cos(theta)), + 1 / Math.abs(Math.sin(theta)) + ); + }; + break; + + case 'triangle-forward': + // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+ + // %28t%2C+2*PI%2F3%29%29%2Bsqrt%283%29sin%28mod+%28t%2C+2*PI%2F3%29 + // %29%29%2C+t+%3D+0+..+2*PI + settings.shape = function shapeTriangle(theta) { + var thetaPrime = theta % (2 * Math.PI / 3); + return 1 / (Math.cos(thetaPrime) + + Math.sqrt(3) * Math.sin(thetaPrime)); + }; + break; + + case 'triangle': + case 'triangle-upright': + settings.shape = function shapeTriangle(theta) { + var thetaPrime = (theta + Math.PI * 3 / 2) % (2 * Math.PI / 3); + return 1 / (Math.cos(thetaPrime) + + Math.sqrt(3) * Math.sin(thetaPrime)); + }; + break; + + case 'pentagon': + settings.shape = function shapePentagon(theta) { + var thetaPrime = (theta + 0.955) % (2 * Math.PI / 5); + return 1 / (Math.cos(thetaPrime) + + 0.726543 * Math.sin(thetaPrime)); + }; + break; + + case 'star': + settings.shape = function shapeStar(theta) { + var thetaPrime = (theta + 0.955) % (2 * Math.PI / 10); + if ((theta + 0.955) % (2 * Math.PI / 5) - (2 * Math.PI / 10) >= 0) { + return 1 / (Math.cos((2 * Math.PI / 10) - thetaPrime) + + 3.07768 * Math.sin((2 * Math.PI / 10) - thetaPrime)); + } else { + return 1 / (Math.cos(thetaPrime) + + 3.07768 * Math.sin(thetaPrime)); + } + }; + break; + } + } + + /* Make sure gridSize is a whole number and is not smaller than 4px */ + settings.gridSize = Math.max(Math.floor(settings.gridSize), 4); + + /* shorthand */ + var g = settings.gridSize; + var maskRectWidth = g - settings.maskGapWidth; + + /* normalize rotation settings */ + var rotationRange = Math.abs(settings.maxRotation - settings.minRotation); + var rotationSteps = Math.abs(Math.floor(settings.rotationSteps)); + var minRotation = Math.min(settings.maxRotation, settings.minRotation); + + /* information/object available to all functions, set when start() */ + var grid, // 2d array containing filling information + ngx, ngy, // width and height of the grid + center, // position of the center of the cloud + maxRadius; + + /* timestamp for measuring each putWord() action */ + var escapeTime; + + /* function for getting the color of the text */ + var getTextColor; + + function random_hsl_color(min, max) { + return 'rgb(' + + (Math.random() * 255).toFixed() + ',' + + (Math.random() * 30 + 70).toFixed() + ',' + + (Math.random() * (max - min) + min).toFixed() + ')'; + } + switch (settings.color) { + case 'random-dark': + getTextColor = function getRandomDarkColor() { + return random_hsl_color(10, 50); + }; + break; + + case 'random-light': + getTextColor = function getRandomLightColor() { + return random_hsl_color(50, 90); + }; + break; + + default: + if (typeof settings.color === 'function') { + getTextColor = settings.color; + } + break; + } + + /* function for getting the font-weight of the text */ + var getTextFontWeight; + if (typeof settings.fontWeight === 'function') { + getTextFontWeight = settings.fontWeight; + } + + /* function for getting the classes of the text */ + var getTextClasses = null; + if (typeof settings.classes === 'function') { + getTextClasses = settings.classes; + } + + /* Interactive */ + var interactive = false; + var infoGrid = []; + var hovered; + + /* Get points on the grid for a given radius away from the center */ + var pointsAtRadius = []; + var getPointsAtRadius = function getPointsAtRadius(radius) { + if (pointsAtRadius[radius]) { + return pointsAtRadius[radius]; + } + + // Look for these number of points on each radius + var T = radius * 8; + + // Getting all the points at this radius + var t = T; + var points = []; + + if (radius === 0) { + points.push([center[0], center[1], 0]); + } + + while (t--) { + // distort the radius to put the cloud in shape + var rx = 1; + if (settings.shape !== 'circle') { + rx = settings.shape(t / T * 2 * Math.PI); // 0 to 1 + } + + // Push [x, y, t]; t is used solely for getTextColor() + points.push([ + center[0] + radius * rx * Math.cos(-t / T * 2 * Math.PI), + center[1] + radius * rx * Math.sin(-t / T * 2 * Math.PI) * + settings.ellipticity, + t / T * 2 * Math.PI + ]); + } + + pointsAtRadius[radius] = points; + return points; + }; + + /* Return true if we had spent too much time */ + var exceedTime = function exceedTime() { + return ((settings.abortThreshold > 0) && + ((new Date()).getTime() - escapeTime > settings.abortThreshold)); + }; + + /* Get the deg of rotation according to settings, and luck. */ + var getRotateDeg = function getRotateDeg() { + if (settings.rotateRatio === 0) { + return 0; + } + + if (Math.random() > settings.rotateRatio) { + return 0; + } + + if (rotationRange === 0) { + return minRotation; + } + + if (rotationSteps > 0) { + // Min rotation + zero or more steps * span of one step + return minRotation + + Math.floor(Math.random() * rotationSteps) * + rotationRange / (rotationSteps - 1); + } else { + return minRotation + Math.random() * rotationRange; + } + }; + + function getTextInfo(word, weight, rotateDeg) { + // calculate the acutal font size + // fontSize === 0 means weightFactor function wants the text skipped, + // and size < minSize means we cannot draw the text. + var debug = false; + var fontSize = settings.weightFactor(weight); + if (fontSize <= settings.minSize) { + return Promise.resolve(false); + } + + // Scale factor here is to make sure fillText is not limited by + // the minium font size set by browser. + // It will always be 1 or 2n. + var mu = 1; + if (fontSize < minFontSize) { + mu = (function calculateScaleFactor() { + var mu = 2; + while (mu * fontSize < minFontSize) { + mu += 2; + } + return mu; + })(); + } + + // Get fontWeight that will be used to set fctx.font + var fontWeight; + if (getTextFontWeight) { + fontWeight = getTextFontWeight(word, weight, fontSize); + } else { + fontWeight = settings.fontWeight; + } + + + + var fctx = wx.createCanvasContext("canvas",self); + fctx.setFontSize(fontSize * mu) + fctx.font = fontWeight + ' ' + + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily; + + // Estimate the dimension of the text with measureText(). + var fw = fctx.measureText(word).width / mu; + var fh = Math.max(fontSize * mu, + fctx.measureText('m').width, + fctx.measureText('\uFF37').width) / mu; + + // Create a boundary box that is larger than our estimates, + // so text don't get cut of (it sill might) + var boxWidth = fw + fh * 2; + var boxHeight = fh * 3; + var fgw = Math.ceil(boxWidth / g); + var fgh = Math.ceil(boxHeight / g); + boxWidth = fgw * g; + boxHeight = fgh * g; + + // Calculate the proper offsets to make the text centered at + // the preferred position. + + // This is simply half of the width. + var fillTextOffsetX = -fw / 2; + // Instead of moving the box to the exact middle of the preferred + // position, for Y-offset we move 0.4 instead, so Latin alphabets look + // vertical centered. + var fillTextOffsetY = -fh * 0.4; + + // Calculate the actual dimension of the canvas, considering the rotation. + var cgh = Math.ceil((boxWidth * Math.abs(Math.sin(rotateDeg)) + + boxHeight * Math.abs(Math.cos(rotateDeg))) / g); + var cgw = Math.ceil((boxWidth * Math.abs(Math.cos(rotateDeg)) + + boxHeight * Math.abs(Math.sin(rotateDeg))) / g); + var width = cgw * g; + var height = cgh * g; + + // Scale the canvas with |mu|. + fctx.scale(1 / mu, 1 / mu); + fctx.translate(width * mu / 2, height * mu / 2); + fctx.rotate(-rotateDeg); + + // Once the width/height is set, ctx info will be reset. + // Set it again here. + fctx.font = fontWeight + ' ' + + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily; + + // Fill the text into the fcanvas. + // XXX: We cannot because textBaseline = 'top' here because + // Firefox and Chrome uses different default line-height for canvas. + // Please read https://bugzil.la/737852#c6. + // Here, we use textBaseline = 'middle' and draw the text at exactly + // 0.5 * fontSize lower. + fctx.fillStyle = '#000'; + fctx.textBaseline = 'middle'; + fctx.fillText(word, fillTextOffsetX * mu, + (fillTextOffsetY + fontSize * 0.5) * mu); + fctx.draw(); + // Get the pixels of the text + var imageData; + return new Promise(resolve => { + wx.canvasGetImageData({ + canvasId: 'canvas', + x: 0, + y: 0, + width: width, + height: height, + success(res) { + imageData = res.data; + + if (exceedTime()) { + return false; + } + + if (debug) { + // Draw the box of the original estimation + fctx.strokeRect(fillTextOffsetX * mu, + fillTextOffsetY, fw * mu, fh * mu); + fctx.restore(); + } + + // Read the pixels and save the information to the occupied array + var occupied = []; + var gx = cgw, + gy, x, y; + var bounds = [cgh / 2, cgw / 2, cgh / 2, cgw / 2]; + while (gx--) { + gy = cgh; + while (gy--) { + y = g; + singleGridLoop: { + while (y--) { + x = g; + while (x--) { + if (imageData[((gy * g + y) * width + + (gx * g + x)) * 4 + 3]) { + occupied.push([gx, gy]); + + if (gx < bounds[3]) { + bounds[3] = gx; + } + if (gx > bounds[1]) { + bounds[1] = gx; + } + if (gy < bounds[0]) { + bounds[0] = gy; + } + if (gy > bounds[2]) { + bounds[2] = gy; + } + + if (debug) { + fctx.fillStyle = 'rgba(255, 0, 0, 0.5)'; + fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5); + } + break singleGridLoop; + } + } + } + if (debug) { + fctx.fillStyle = 'rgba(0, 0, 255, 0.5)'; + fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5); + } + } + } + } + + if (debug) { + fctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + fctx.fillRect(bounds[3] * g, + bounds[0] * g, + (bounds[1] - bounds[3] + 1) * g, + (bounds[2] - bounds[0] + 1) * g); + } + + resolve({ + mu: mu, + occupied: occupied, + bounds: bounds, + gw: cgw, + gh: cgh, + fillTextOffsetX: fillTextOffsetX, + fillTextOffsetY: fillTextOffsetY, + fillTextWidth: fw, + fillTextHeight: fh, + fontSize: fontSize + }) + }, + fail(error){ + console.log(word, error) + } + },self) + }) + }; + + /* Determine if there is room available in the given dimension */ + var canFitText = function canFitText(gx, gy, gw, gh, occupied) { + // Go through the occupied points, + // return false if the space is not available. + var i = occupied.length; + while (i--) { + var px = gx + occupied[i][0]; + var py = gy + occupied[i][1]; + + if (px >= ngx || py >= ngy || px < 0 || py < 0) { + if (!settings.drawOutOfBound) { + return false; + } + continue; + } + + if (!grid[px][py]) { + return false; + } + } + return true; + }; + + /* Actually draw the text on the grid */ + var drawText = function drawText(gx, gy, info, word, weight, + distance, theta, rotateDeg, attributes) { + var transformRule = ''; + transformRule = 'rotate(' + (-rotateDeg / Math.PI * 180) + 'deg) '; + if (info.mu !== 1) { + transformRule += + 'translateX(-' + (info.fillTextWidth / 4) + 'px) ' + + 'scale(' + (1 / info.mu) + ')'; + } + + var fontSize = info.fontSize; + var color; + if (getTextColor) { + color = getTextColor(word, weight, fontSize, distance, theta); + } else { + color = settings.color; + } + + var fontWeight; + if (getTextFontWeight) { + fontWeight = getTextFontWeight(word, weight, fontSize); + } else { + fontWeight = settings.fontWeight; + } + + var classes; + if (getTextClasses) { + classes = getTextClasses(word, weight, fontSize); + } else { + classes = settings.classes; + } + + callback({ + g, + gx, + gy, + info, + word, + weight, + color, + fontWeight, + fontSize, + distance, + theta, + rotateDeg, + transformRule, + attributes + }) //将要绘制的span参数通过回调函数传出 + }; + + /* Help function to updateGrid */ + var fillGridAt = function fillGridAt(x, y, dimension, item) { + if (x >= ngx || y >= ngy || x < 0 || y < 0) { + return; + } + + grid[x][y] = false; + + if (interactive) { + infoGrid[x][y] = { + item: item, + dimension: dimension + }; + } + }; + + /* Update the filling information of the given space with occupied points. + Draw the mask on the canvas if necessary. */ + var updateGrid = function updateGrid(gx, gy, gw, gh, info, item) { + var occupied = info.occupied; + var dimension; + if (interactive) { + var bounds = info.bounds; + dimension = { + x: (gx + bounds[3]) * g, + y: (gy + bounds[0]) * g, + w: (bounds[1] - bounds[3] + 1) * g, + h: (bounds[2] - bounds[0] + 1) * g + }; + } + + var i = occupied.length; + while (i--) { + var px = gx + occupied[i][0]; + var py = gy + occupied[i][1]; + + if (px >= ngx || py >= ngy || px < 0 || py < 0) { + continue; + } + + fillGridAt(px, py, dimension, item); + } + }; + + /* putWord() processes each item on the list, + calculate it's size and determine it's position, and actually + put it on the canvas. */ + function putWord(item) { + var word, weight, attributes; + if (Array.isArray(item)) { + word = item[0]; + weight = item[1]; + } else { + word = item.word; + weight = item.weight; + attributes = item.attributes; + } + var rotateDeg = getRotateDeg(); + // get info needed to put the text onto the canvas + return new Promise(resolve => { + getTextInfo(word, weight, rotateDeg).then(res => { + resolve(res) + }) + }).then(res => { + let info = res; + // not getting the info means we shouldn't be drawing this one. + if (!info) { + return false; + } + + if (exceedTime()) { + return false; + } + + // If drawOutOfBound is set to false, + // skip the loop if we have already know the bounding box of + // word is larger than the canvas. + if (!settings.drawOutOfBound) { + var bounds = info.bounds; + if ((bounds[1] - bounds[3] + 1) > ngx || + (bounds[2] - bounds[0] + 1) > ngy) { + return false; + } + } + + // Determine the position to put the text by + // start looking for the nearest points + var r = maxRadius + 1; + + var tryToPutWordAtPoint = function(gxy) { + var gx = Math.floor(gxy[0] - info.gw / 2); + var gy = Math.floor(gxy[1] - info.gh / 2); + var gw = info.gw; + var gh = info.gh; + + // If we cannot fit the text at this position, return false + // and go to the next position. + if (!canFitText(gx, gy, gw, gh, info.occupied)) { + return false; + } + + // Actually put the text on the canvas + drawText(gx, gy, info, word, weight, + (maxRadius - r), gxy[2], rotateDeg, attributes); + // Mark the spaces on the grid as filled + updateGrid(gx, gy, gw, gh, info, item); + + // Return true so some() will stop and also return true. + return true; + }; + + while (r--) { + var points = getPointsAtRadius(maxRadius - r); + + if (settings.shuffle) { + points = [].concat(points); + shuffleArray(points); + } + + // Try to fit the words by looking at each point. + // array.some() will stop and return true + // when putWordAtPoint() returns true. + // If all the points returns false, array.some() returns false. + var drawn = points.some(tryToPutWordAtPoint); + + if (drawn) { + return true; + } + } + // we tried all distances but text won't fit, return false + return false; + }) + }; + + /* Start drawing on a canvas */ + function start() { + // For dimensions, clearCanvas etc., + // we only care about the first element. + ngx = Math.ceil(mycanvas.width / g); + ngy = Math.ceil(mycanvas.height / g); + + // Determine the center of the word cloud + center = (settings.origin) ? [settings.origin[0] / g, settings.origin[1] / g] : [ngx / 2, ngy / 2]; + + // Maxium radius to look for space + maxRadius = Math.floor(Math.sqrt(ngx * ngx + ngy * ngy)); + + /* Clear the canvas only if the clearCanvas is set, + if not, update the grid to the current canvas state */ + grid = []; + + var gx, gy, i; + if (settings.clearCanvas) { + ctx.fillStyle = settings.backgroundColor; + ctx.clearRect(0, 0, ngx * (g + 1), ngy * (g + 1)); + ctx.fillRect(0, 0, ngx * (g + 1), ngy * (g + 1)); + + /* fill the grid with empty state */ + gx = ngx; + while (gx--) { + grid[gx] = []; + gy = ngy; + while (gy--) { + grid[gx][gy] = true; + } + } + } + + i = 0; + var loopingFunction, stoppingFunction; + + loopingFunction = setTimeout; + stoppingFunction = clearTimeout; + + var timer = loopingFunction(function loop() { + if (i >= settings.list.length) { + stoppingFunction(timer); + return; + } + escapeTime = (new Date()).getTime(); + putWord(settings.list[i]).then(res => { + if (exceedTime()) { + stoppingFunction(timer); + settings.abort(); + return; + } + i++; + timer = loopingFunction(loop, settings.wait); + }).catch(error => console.log(error)) + }, settings.wait); + }; + + // All set, start the drawing + start(); +}; + +exports.WordCloud = WordCloud \ No newline at end of file diff --git a/components/word-cloud/index.js b/components/word-cloud/index.js new file mode 100644 index 0000000..56ccb88 --- /dev/null +++ b/components/word-cloud/index.js @@ -0,0 +1,50 @@ +// word-cloud/index.js +const { + WordCloud +} = require("./WordCloud.js") +Component({ + /** + * 组件的属性列表 + */ + properties: { + list: { + type: Array, + value: [], + }, + height: { + type: String, + value: "200" + }, + width: { + type: String, + value: "" + }, + color: { + type: String, + value: "random-light" + }, + }, + + data: { + spans: [] + }, + + ready() { + let that = this; + this.ctx = wx.createCanvasContext('canvas', this); + let query = this.createSelectorQuery(); + query.select("#canvas").boundingClientRect(function (res) { + WordCloud(that.ctx, res, { + minSize: 8, + list: that.data.list, + color: that.data.color + }, that, function (val) { + that.data.spans.push(val) + // w.to_file("../../images/carSide.png") + that.setData({ + spans: that.data.spans + }) + }) + }).exec(); + } +}) diff --git a/components/word-cloud/index.json b/components/word-cloud/index.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/components/word-cloud/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/components/word-cloud/index.wxml b/components/word-cloud/index.wxml new file mode 100644 index 0000000..c66c247 --- /dev/null +++ b/components/word-cloud/index.wxml @@ -0,0 +1,8 @@ + + + + + + {{item.word}} + + \ No newline at end of file diff --git a/components/word-cloud/index.wxss b/components/word-cloud/index.wxss new file mode 100644 index 0000000..9ed5446 --- /dev/null +++ b/components/word-cloud/index.wxss @@ -0,0 +1 @@ +/* word-cloud/index.wxss */ \ No newline at end of file diff --git a/images/carSide.png b/images/carSide.png new file mode 100644 index 0000000000000000000000000000000000000000..d64215564a5d7edcd5638418c149a337bbec8856 GIT binary patch literal 33518 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 { + item[1] = item[1] + 12 + return item; + }) }, onShow() { this.getTabBar().init(); diff --git a/pages/insight/index.json b/pages/insight/index.json index 6cdce25..0ccfa0d 100644 --- a/pages/insight/index.json +++ b/pages/insight/index.json @@ -1,5 +1,5 @@ { "usingComponents": { - + "word-cloud": "../../components/word-cloud/index" } } \ No newline at end of file diff --git a/pages/insight/index.wxml b/pages/insight/index.wxml index c1a4fe5..9fccf07 100644 --- a/pages/insight/index.wxml +++ b/pages/insight/index.wxml @@ -1,3 +1,6 @@ - 洞察 + + + +