# vue+echarts+springboot
**Repository Path**: qishang777/vue-echarts-springboot
## Basic Information
- **Project Name**: vue+echarts+springboot
- **Description**: vue+echarts+springboot数据可视化
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 3
- **Created**: 2022-03-20
- **Last Updated**: 2022-03-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# vue+echarts+springboot
#### 介绍
vue+echarts+springboot数据可视化
#### 软件架构
软件架构说明
vue2.0+springboot+echarts+mysqlc
所有数据均为模拟数据,从mysql查询
#### 安装教程
1. npm run install
2. npm run serve
3. 后端运行在8001端口
### 封装组件渲染图表
所有的 ECharts 图表都是基于 `components/chart/charts.vue` 封装组件创建的,已经对数据和屏幕改动进行了监听,能够动态渲染图表数据和大小
```vue
```
### 屏幕适配
使用vw和vh实现屏幕自适应
```scss
//使用scss的math函数,https://sass-lang.com/documentation/breaking-changes/slash-div
@use "sass:math";
//默认设计稿的宽度
$designWidth:1920;
//默认设计稿的高度
$designHeight:1080;
//px转为vw的函数
@function vw($px) {
@return math.div($px , $designWidth) * 100vw;
}
//px转为vh的函数
@function vh($px) {
@return math.div($px , $designHeight) * 100vh;
}
```
### 请求数据
基于vuex+websocket实现数据传输,组件之间数据互不影响通过watch监听vuex数据实时的变化进行数据更新
```vue
```
### 后端数据websocket配置
通过sendMessageSercice把多个Sercice整合在一起,使用定时time类5秒查询一次数据库,
```java
@Slf4j
@Component
@ServerEndpoint(value = "/websocket/{id}",encoders = {ServerEncoder.class})
public class WebSocketServer{
//在线连接数,应该把它设计成线程安全的
private static int onlineCount = 0;
@Autowired
private static SendMessageSercice sendMessageSercice;
@Autowired
public void setSendMessageSercice(SendMessageSercice sendMessageSercice){
this.sendMessageSercice = sendMessageSercice;
}
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
//虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。
public static CopyOnWriteArraySet webSocketSet
= new CopyOnWriteArraySet<>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
//会话窗口的ID标识
private String id = "";
/**
* 链接成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("id") String id) {
log.info("onOpen >> 链接成功");
this.session = session;
//将当前websocket对象存入到Set集合中
webSocketSet.add(this);
//在线人数+1
addOnlineCount();
log.info("有新窗口开始监听:" + id + ", 当前在线人数为:" + getOnlineCount());
this.id = id;
// sendMessageSercice = applicationContext.getBean(SendMessageSercice.class);
try {
// sendMessage("有新窗口开始监听:" + id + ", 当前在线人数为:" + getOnlineCount());
sendMessageSercice.sendDataToWeb();
} catch (Exception e) {
log.error(e.toString());
}
}
/**
* 链接关闭调用的方法
*/
@OnClose
public void onClose() {
log.info("onClose >> 链接关闭");
//移除当前Websocket对象
webSocketSet.remove(this);
//在内线人数-1
subOnLineCount();
log.info("链接关闭,当前在线人数:" + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message
* @param session
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("接收到窗口:" + id + " 的信息:" + message);
//发送信息
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage("接收到窗口:" + id + " 的信息:" + message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@OnError
public void onError(Session session, Throwable e) {
e.printStackTrace();
}
/**
* 推送消息
*
* @param message
*/
private void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
private void sendObject(Object object) throws IOException, EncodeException {
this.session.getBasicRemote().sendObject(object);
}
// * id为null时是群发
// * @param map
// * @param id
// */
public static void sendData(String id, Object map) {
for (WebSocketServer item : webSocketSet) {
try {
if (id == null) {
item.sendObject(map);
} else if (item.id.equals(id)) {
item.sendObject(map);
}
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
private void subOnLineCount() {
WebSocketServer.onlineCount--;
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
private void addOnlineCount() {
WebSocketServer.onlineCount++;
}
}
```