From 3a987464e68126ad3f0a9103231c443486a82d1a Mon Sep 17 00:00:00 2001 From: eson <474420502@qq.com> Date: Mon, 24 Aug 2020 00:23:43 +0800 Subject: [PATCH] change some --- goserver/count_tag.go | 31 +++- goserver/go.mod | 1 + goserver/go.sum | 1 + goserver/main.go | 3 +- goserver/main_test.go | 33 +++- src/App.js | 2 +- src/ChartsCount.js | 84 ++++----- src/ContentTable.js | 3 - src/Table.js | 384 ++++++++++++++++++++++-------------------- src/Var.js | 5 + yarn.lock | 30 ++++ 11 files changed, 344 insertions(+), 233 deletions(-) create mode 100644 src/Var.js diff --git a/goserver/count_tag.go b/goserver/count_tag.go index 2c08068..a6e09c2 100644 --- a/goserver/count_tag.go +++ b/goserver/count_tag.go @@ -4,13 +4,14 @@ import ( "encoding/json" "fmt" "log" + "sync" "time" "github.com/474420502/focus/tree/heap" "github.com/gin-gonic/gin" ) -var tagCounter = make(map[string]*tagcounter) +var tagCounter = &sync.Map{} // make(map[string]*tagcounter) type taginfo struct { Name string @@ -28,12 +29,26 @@ func init() { } +func AllTag(cxt *gin.Context) { + countTagInfo(cxt, func(cxt *gin.Context, cw *tagcounter) { + cxt.JSON(200, cw.CountWord) + }) +} + func CountTag(cxt *gin.Context) { + countTagInfo(cxt, func(cxt *gin.Context, cw *tagcounter) { + cxt.JSON(200, cw.PQueue) + }) +} + +func countTagInfo(cxt *gin.Context, ret func(cxt *gin.Context, cw *tagcounter)) { platform := cxt.Query("platform") var cw *tagcounter - if cw, ok := tagCounter[platform]; ok { + + if icw, ok := tagCounter.Load(platform); ok { + cw = icw.(*tagcounter) if time.Now().Sub(cw.LastTime).Minutes() <= 10 { - cxt.JSON(200, cw.PQueue) + ret(cxt, cw) return } } @@ -49,7 +64,6 @@ func CountTag(cxt *gin.Context) { cw.CountWord = make(map[string]*taginfo) cw.Name = platform cw.LastTime = time.Now() - tagCounter[platform] = cw for rows.Next() { var stag string @@ -87,6 +101,11 @@ func CountTag(cxt *gin.Context) { i++ } + if heap.Size() == 0 { + cxt.JSON(200, nil) + return + } + // heap.Put(other) cw.PQueue = heap.Values() other.Value = cw.PQueue[len(cw.PQueue)-1].(*taginfo).Value - 1 @@ -95,6 +114,8 @@ func CountTag(cxt *gin.Context) { } cw.PQueue = append(cw.PQueue, other) - cxt.JSON(200, cw.PQueue) + // cxt.JSON(200, cw.PQueue) + ret(cxt, cw) cw.LastTime = time.Now() + tagCounter.Store(platform, cw) } diff --git a/goserver/go.mod b/goserver/go.mod index 3fdf871..3106f70 100644 --- a/goserver/go.mod +++ b/goserver/go.mod @@ -4,6 +4,7 @@ go 1.15 require ( github.com/474420502/focus v0.12.0 + github.com/Pallinder/go-randomdata v1.1.0 github.com/gin-gonic/gin v1.6.3 github.com/go-sql-driver/mysql v1.5.0 github.com/jinzhu/gorm v1.9.16 // indirect diff --git a/goserver/go.sum b/goserver/go.sum index 8cdfcf4..e38733f 100644 --- a/goserver/go.sum +++ b/goserver/go.sum @@ -1,5 +1,6 @@ github.com/474420502/focus v0.12.0 h1:+icbmj7IEOefvTegHt5EpcHt6WFbe2miIrceUJx2Evo= github.com/474420502/focus v0.12.0/go.mod h1:d0PMjtMxFz1a9HIhwyFPkWa+JF+0LgOrEUfd8iZka6s= +github.com/Pallinder/go-randomdata v1.1.0 h1:gUubB1IEUliFmzjqjhf+bgkg1o6uoFIkRsP3VrhEcx8= github.com/Pallinder/go-randomdata v1.1.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= diff --git a/goserver/main.go b/goserver/main.go index 8f6afd6..458eefb 100644 --- a/goserver/main.go +++ b/goserver/main.go @@ -52,7 +52,7 @@ func Cors() gin.HandlerFunc { // 允许跨域设置 可以返回其他子段 c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") // 跨域关键设置 让浏览器可以解析 c.Header("Access-Control-Max-Age", "172800") // 缓存请求信息 单位为秒 - c.Header("Access-Control-Allow-Credentials", "false") // 跨域请求是否需要带cookie信息 默认设置为true + c.Header("Access-Control-Allow-Credentials", "false") // 跨域请求是否需要带cookie信息 默认设置为true c.Set("content-type", "application/json") // 设置返回格式是json } @@ -185,5 +185,6 @@ func main() { engine.GET("openrec/query", OpenrecQuery) engine.GET("twitch/query", TwitchQuery) engine.GET("tag/count", CountTag) + engine.GET("tag/allcount", CountTag) engine.Run(":5500") } diff --git a/goserver/main_test.go b/goserver/main_test.go index 9b4ed43..08f1544 100644 --- a/goserver/main_test.go +++ b/goserver/main_test.go @@ -1,13 +1,44 @@ package main import ( + "encoding/json" + "log" + "regexp" "testing" + + "github.com/Pallinder/go-randomdata" ) func TestMain(t *testing.T) { main() } -func TestCountTag(t *testing.T) { +func estCountTag(t *testing.T) { + var a = `男人 女人 儿童 老人 母亲 父亲 爷爷 奶奶 老师 美女 帅哥 性格 善良 性格 品质 聪明 女儿 儿子 军人 坏蛋 心情 笑 哭 高兴 + 害怕 愤怒 激动 紧张 忧虑 着急 满足 眼睛 鼻子 嘴巴 头发 耳朵 牙齿 美 丑 眉毛 脸 手 脚 腰 腿 + 胖 瘦 矮 高 清明节 劳动节 端午节 七夕节 中秋节 重阳节 元宵节 服饰 鼠 牛 虎 兔 龙 蛇 马 羊 + 猴 狗 猪 鸡 颜色 聚会 时间短 时间 爱情 脚步声 水声 花 教堂 速度快 速度慢 桃花 幼苗 紫色 白色 + 黑色 红色 女性身材 男性身材 沙沙尘尘 猪甘蠢 猪 无脑 大唔透 玩世不恭 眼大无神 大细超 白鸽眼 咸湿 浪漫 靓仔 靓 + 女 猛男 咸猪手 西施 好色 色狼 色魔 畜牲 食碗面反碗底 抵死 恶死 曾眉凸眼 眉耒眼去 温柔体贴假细心 放荡 淫贱 荒唐 离谱 头尖额窄无厘贵格 肚满肠肥 两面三刀 反革命 红卫兵 + ` + tags := regexp.MustCompile("[^ \n\t]+").FindAllString(a, -1) + + for { + + var stags []string + for i := 0; i < randomdata.Number(1, 5); i++ { + tag := randomdata.StringSample(tags...) + stags = append(stags, tag) + } + + data, _ := json.Marshal(stags) + sql := "update streamer set tags = ?, operator = 20 where operator != 20 limit 1" + _, err := StoreStreamer.Exec(sql, data) + if err != nil { + log.Println(err) + break + } + + } } diff --git a/src/App.js b/src/App.js index bea031b..8d69c88 100644 --- a/src/App.js +++ b/src/App.js @@ -92,7 +92,7 @@ class App extends React.Component { break default: break; - } + } }} > diff --git a/src/ChartsCount.js b/src/ChartsCount.js index fefd1b3..5ce7597 100644 --- a/src/ChartsCount.js +++ b/src/ChartsCount.js @@ -1,38 +1,44 @@ - - import React from 'react'; import ReactEcharts from 'echarts-for-react'; +import apihost from './Var.js'; + +function parseData(cw = {}) { -function parseData(cw={}) { var legendData = []; var seriesData = []; var selected = {}; - for(var i =0; i < cw.length ; i++){ + if (cw == null) { + seriesData.push({ name: "没有数据", value: 1 }) + legendData.push(seriesData[0].name) + selected[seriesData[0].name] = true; + return { legendData: legendData, seriesData: seriesData, selected: selected } + } + + for (var i = 0; i < cw.length; i++) { // legendData.push(name); - var taginfo = cw[i]; + var taginfo = cw[i]; seriesData.push({ name: taginfo.Name, value: taginfo.Value }) selected[taginfo.Name] = false; - } + } - - seriesData.sort((a, b) => { + seriesData.sort((a, b) => { return b.value - a.value - }) + }) - for(var i = 0; i < seriesData.length ; i ++) { + for (var i = 0; i < seriesData.length; i++) { var o = seriesData[i]; legendData.push(o.name); selected[o.name] = i <= 20; - } + } - return { legendData: legendData, seriesData: seriesData, selected:selected } + return { legendData: legendData, seriesData: seriesData, selected: selected } } -function getOption(state={}) { +function getOption(state = {}) { const { platform, data } = state; const option = { title: { @@ -48,7 +54,7 @@ function getOption(state={}) { legend: { type: 'scroll', orient: 'vertical', - right: 10, + right: 10, top: 10, bottom: 10, data: data.legendData, @@ -74,7 +80,7 @@ function getOption(state={}) { return option; } -class ChartsCount extends React.Component { +class ChartsCount extends React.Component { state = { option: {}, @@ -83,57 +89,51 @@ class ChartsCount extends React.Component { } changePlatform = (p) => { - this.setState({platform: p}, ()=>{ + this.setState({ platform: p }, () => { this.updateData(); - } ); + }); }; - - updateData = () => { - const { platform } = this.state; - fetch(`http://192.168.16.130:5500/tag/count?platform=${platform}`, { + fetch(`${apihost}/tag/count?platform=${platform}`, { "mode": "cors" }).then( response => { - response.json().then( value => { - + response.json().then(value => { this.setState({ data: parseData(value) - }, ()=> { - + }, () => { var ins = this.echarts_react.getEchartsInstance(); - ins.setOption( getOption(this.state) ); + ins.setOption(getOption(this.state)); + }); - }); - - } ); + }); } ) - }; + }; - componentDidMount() { + componentDidMount() { this.updateData(); - } + } render() { - return (
- { this.echarts_react = e; }} - option={ getOption(this.state)} - style={{height: '600px', width: '100%'}} - className='react_for_echarts' /> - -
+ return (
+ { this.echarts_react = e; }} + option={getOption(this.state)} + style={{ height: '600px', width: '100%' }} + className='react_for_echarts' /> + +
); } }; export default ChartsCount; - + diff --git a/src/ContentTable.js b/src/ContentTable.js index 9ec58ae..9329910 100644 --- a/src/ContentTable.js +++ b/src/ContentTable.js @@ -4,9 +4,6 @@ import DataTable from './Table.js'; class ContentTable extends React.Component { changePlatform = (p) => { - // this.refs.table.firstPage(); - // this.setState({platform: p}); - // this.refs.table.setState({platform: p}) this.refs.table.updatePlatform(p); } diff --git a/src/Table.js b/src/Table.js index 66b27b6..d3ab455 100644 --- a/src/Table.js +++ b/src/Table.js @@ -1,212 +1,236 @@ import React, { useState } from 'react'; -import { Table, Input, InputNumber, Popconfirm, Form, Tag } from 'antd'; -import reqwest from 'reqwest'; -import './Table.less'; -import { useForm } from 'antd/lib/form/Form'; +import { Table, Input, Select, Tag, Row, Col } from 'antd'; +import './Table.less'; +import apihost from './Var'; + + const { Option } = Select; const columns = [ - { - title: '平台', - dataIndex: 'Platform', - editable: false, - key: 'Platform', + { + title: '平台', + dataIndex: 'Platform', + editable: false, + key: 'Platform', // width: "8%", - }, - { - title: 'userid', - dataIndex: 'UserId', - editable: false, - key: 'UserId', + }, + { + title: 'userid', + dataIndex: 'UserId', + editable: false, + key: 'UserId', // width: "7%", - }, - { - title: '名称', - dataIndex: 'UserName', - editable: false, - key: 'UserName', - // width: "7%", - }, - { - title: '标签', - dataIndex: 'Tags', - editable: false, - render: tags => ( - <> - { - tags != null ? - tags.map( tag => { - let color = "purple"; - if (tag.length < 3) { - color = 'green'; - } else if (tag.length < 6) { - color = 'geekblue'; - } else if (tag.length < 9) { - color = 'volcano'; - } - - return ( - - {tag} - - ); - } - - ) : null} - ) - }, - { - title: '粉丝数(关注)', - dataIndex: 'Followers', - key: 'Followers', - width: "8%", - }, - { - title: '礼物数(币|钱)', - dataIndex: 'Gratuity', - key: 'Gratuity', - width: "8%", - }, - { - title: '数据更新时间', - dataIndex: 'UpdateTime', - key: 'UpdateTime', - // width: "7%", - }, - ]; + }, + { + title: '名称', + dataIndex: 'UserName', + editable: false, + key: 'UserName', + // width: "7%", + }, + { + title: '标签', + dataIndex: 'Tags', + editable: false, + render: tags => ( + <> + { + tags != null ? + tags.map(tag => { + let color = "purple"; + if (tag.length < 3) { + color = 'green'; + } else if (tag.length < 6) { + color = 'geekblue'; + } else if (tag.length < 9) { + color = 'volcano'; + } + + return ( + + {tag} + + ); + } + + ) : null} + ) + }, + { + title: '粉丝数(关注)', + dataIndex: 'Followers', + key: 'Followers', + width: "8%", + }, + { + title: '礼物数(币|钱)', + dataIndex: 'Gratuity', + key: 'Gratuity', + width: "8%", + }, + { + title: '数据更新时间', + dataIndex: 'UpdateTime', + key: 'UpdateTime', + // width: "7%", + }, +]; - - const getRandomuserParams = params => { - return { - psize: params.pagination.pageSize, - page: params.pagination.current, - // ...params, - }; + +const getRandomuserParams = params => { + return { + psize: params.pagination.pageSize, + page: params.pagination.current, + // ...params, }; +}; + - class DataTable extends React.Component { - state = { - data: [], - platform: "openrec", - pagination: { - current: 1, - pageSize: 20, - position: ["topLeft"], - }, - loading: false, - }; + state = { + data: [], + platform: "openrec", + pagination: { + current: 1, + pageSize: 20, + position: ["topLeft"], + }, + loading: false, + }; - expandedRow = (record) => { + expandedRow = (record) => { - const ecolumns = [ - { - title: 'uid', - dataIndex: 'Uid', - key: 'Uid', - }, - { - title: '直播地址', - dataIndex: 'LiveUrl', - key: 'LiveUrl', - }, - { - title: '直播标题', - dataIndex: 'LiveTitle', - key: 'LiveTitle', - }, - { - title: '近直播开始时间', - dataIndex: 'LiveStartTime', - key: 'LiveStartTime', - }, - { - title: '近直播结束时间', - dataIndex: 'LiveEndTime', - key: 'LiveEndTime', - }, - ]; + const ecolumns = [ + { + title: 'uid', + dataIndex: 'Uid', + key: 'Uid', + }, + { + title: '直播地址', + dataIndex: 'LiveUrl', + key: 'LiveUrl', + }, + { + title: '直播标题', + dataIndex: 'LiveTitle', + key: 'LiveTitle', + }, + { + title: '近直播开始时间', + dataIndex: 'LiveStartTime', + key: 'LiveStartTime', + }, + { + title: '近直播结束时间', + dataIndex: 'LiveEndTime', + key: 'LiveEndTime', + }, + ]; - var data = [record]; - return ; - }; - - updatePlatform(p) { + var data = [record]; + return
; + }; - const { pagination } = this.state; - pagination.current = 1; - this.setState({platform:p}, ()=>{ - this.fetch({ - pagination - }); - }); - - } - - componentDidMount() { - const {platform} = this.state; - this.updatePlatform(platform); - } - - handleTableChange = (pagination, filters, sorter) => { - // console.log(filters, sorter); - this.fetch({ - sortField: sorter.field, - sortOrder: sorter.order, - pagination, - ...filters, - }); - }; - - fetch = (params = {}) => { - this.setState({ loading: true }); - const {platform} = this.state; - - reqwest({ - url: 'http://192.168.16.130:5500/' + platform + '/query', - method: 'get', - type: 'json', - data: getRandomuserParams(params), - }).then(data => { + updatePlatform(p) { + + const { pagination } = this.state; + pagination.current = 1; + this.setState({ platform: p }, () => { + this.fetch({ + pagination + }); + }); + + } + + componentDidMount() { + const { platform } = this.state; + this.updatePlatform(platform); + } + + handleTableChange = (pagination, filters, sorter) => { + // console.log(filters, sorter); + this.fetch({ + sortField: sorter.field, + sortOrder: sorter.order, + pagination, + ...filters, + }); + }; + + fetch = (params = {}) => { + this.setState({ loading: true }); + const { platform, pagination } = this.state; + + fetch(`${apihost}/${platform}/query?page=${pagination.current}&psize=${pagination.pageSize}`, { mode: "cors" }).then((response) => { + console.log(response); + response.json().then( + (data) => { var result = JSON.parse(data) this.setState({ loading: false, - data: result.Data?result.Data:[], + data: result.Data ? result.Data : [], pagination: { ...params.pagination, total: 100000, }, }); - }); - }; - - render() { - - const { data, pagination, loading } = this.state; - return ( -
- ); - } -}; + } + ) + }) + }; + render() { + + const { data, pagination, loading } = this.state; + return ( +
+ + +
+ + + + + + + + + + + + + +
+ + + + ); + } +}; export default DataTable; // \ No newline at end of file diff --git a/src/Var.js b/src/Var.js new file mode 100644 index 0000000..c24b4cc --- /dev/null +++ b/src/Var.js @@ -0,0 +1,5 @@ + + +var apihost = "http://192.168.31.208:5500" + +export default apihost; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index f351ed4..52ef599 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3936,6 +3936,21 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +echarts-for-react@^2.0.16: + version "2.0.16" + resolved "https://registry.npm.taobao.org/echarts-for-react/download/echarts-for-react-2.0.16.tgz#8134a53dff90882c1e6a95c45ceab21e00f6c9f5" + integrity sha1-gTSlPf+QiCweapXEXOqyHgD2yfU= + dependencies: + fast-deep-equal "^2.0.1" + size-sensor "^1.0.0" + +echarts@^4.8.0: + version "4.8.0" + resolved "https://registry.npm.taobao.org/echarts/download/echarts-4.8.0.tgz#b2c1cfb9229b13d368ee104fc8eea600b574d4c4" + integrity sha1-ssHPuSKbE9No7hBPyO6mALV01MQ= + dependencies: + zrender "4.3.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -4495,6 +4510,11 @@ extsprintf@^1.2.0: resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" @@ -9985,6 +10005,11 @@ sisteransi@^1.0.4: resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +size-sensor@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/size-sensor/download/size-sensor-1.0.1.tgz#f84e46206d3e259faff1d548e4b3beca93219dbb" + integrity sha1-+E5GIG0+JZ+v8dVI5LO+ypMhnbs= + slash@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -11502,3 +11527,8 @@ yargs@^13.3.0, yargs@^13.3.2: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^13.1.2" + +zrender@4.3.1: + version "4.3.1" + resolved "https://registry.npm.taobao.org/zrender/download/zrender-4.3.1.tgz?cache=0&sync_timestamp=1597683473479&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fzrender%2Fdownload%2Fzrender-4.3.1.tgz#baf8aa6dc8187a2f819692d7d5f9bedfa2b90fa3" + integrity sha1-uviqbcgYei+BlpLX1fm+36K5D6M=