2024年 10月 大数据 可视化展示 作业

98 阅读5分钟

软件安装

安装 mysql

windows 安装

MySQL :: Begin Your Download

【手把手教你安装MySQL(最新版本安装)】 www.bilibili.com/video/BV1jc…

#net start mysql80
#net stop mysql80

linux 安装

【Ubuntu下安装MySQL数据库】 www.bilibili.com/video/BV12q…

sudo apk update
sudo apk install mysql-server
yes
sudo mysql_secure_installation
y
0
y
y
n
y
systemctl status mysql.service
sudo mysql -u root -p
123456
mysql 远程访问

为了开启MySQL的远程连接,你需要进行几个步骤来确保服务器配置正确,并且安全措施得当。以下是开启MySQL远程连接的基本步骤:

1. 确认MySQL服务运行状态

首先,确保MySQL服务正在运行。你可以在服务器上使用如下命令来检查MySQL服务状态:

sudo systemctl status mysql

或者使用老的系统V命令:

sudo service mysql status
2. 修改MySQL配置文件

编辑MySQL的配置文件(一般位于/etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf),修改bind-address参数。默认情况下,这个参数设置为127.0.0.1(只允许本地连接):

bind-address = 0.0.0.0

设置为0.0.0.0表示接受所有IPv4地址的连接。如果你想要更加精确地控制,可以设置为特定的IP地址。

3. 重启MySQL服务

修改配置后,需要重启MySQL服务使改动生效:

sudo systemctl restart mysql

或者使用老的命令:

sudo service mysql restart
4. 创建允许远程连接的用户

你需要创建一个用户并授权这个用户从远程访问数据库。可以使用MySQL命令行工具来完成:

CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

这里'username'@'%'中的%表示允许从任何IP地址连接。如果你想限制只能从特定IP地址连接,可以将%替换为具体的IP地址。

查看系统用户

select * from mysql.user \G;
5. 配置防火墙(如果有的话)

如果服务器运行了防火墙,你需要开放MySQL的默认端口(通常是3306)以允许外部访问:

sudo ufw allow 3306

或者,如果使用的是iptables:

sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
6. 测试远程连接

使用MySQL客户端软件或命令行工具测试远程连接是否成功:

mysql -h server_ip -u username -p

这里server_ip是MySQL服务器的IP地址。

确保在进行这些操作时考虑到安全性,尤其是在生产环境中。避免使用root用户远程访问,限制可访问IP,并使用强密码。这些步骤应该帮助你成功设置MySQL的远程连接。

安装 vscode

用vue作为网站的前端展示

- 两个vue插件
Vue - Official
Vue 3 Snippets

安装 node

vue 运行环境

用cmd运行

npm config set registry https://registry.npmmirror.com
npm cache clean --force
npm install -g yarn

新建后端项目

服务器安装 .net core 6

  1. ssh链接linux

  2. 【.Net6极速部署Linux(.Net Core发布技巧/Linux基础教学)】 www.bilibili.com/video/BV1pS…

    • Microsoft PPA命令配置:wget packages.microsoft.com/config/ubun…

    • sudo dpkg -i packages-microsoft-prod.deb 

    • sudo apt-get update

    • 安装.net core运行时: sudo apt install aspnetcore-runtime-6.0

    • 启动dotnet服务: nohup dotnet AuthServer.Host.dll &

  3. 守护进程防止 shell 关闭

    • nohup dotnet xxx.dll

新建前端项目

用管理员身份运行vscode

允许本地无签名脚本运行

Set-ExecutionPolicy RemoteSigned

vite

npm install -g npm

npm create vite@latest

npm install element-plus --save
npm install axios

cd my-project 
npm install npm run dev

axios 配置

Axios中文文档 | Axios中文网 (axios-http.cn)

server: {
    port: 8080,
    host: '0.0.0.0',
    proxy: {
      '/api': {
        target: 'http://serverip:8461', // 替换为你的后端服务器地址
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, 'api'),
      },
    },
  },
  

网页安装

表格展示

image.png

聚类展示

image.png

前端发送请求,后端生成图片并且发送回前端展示。

部分代码展示

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import font_manager
import pandas as pd
from sklearn.cluster import KMeans

font_path = "C:/Windows/Fonts/simsun.ttc"  # 在Windows系统上
font_prop = font_manager.FontProperties(fname=font_path)

# Load and preprocess data
df = pd.read_excel("高校评分数据集.xlsx")
k = [
    "办学层次",
    "学科水平",
    "办学资源",
    "师资规模与结构",
    "科学研究",
    "服务社会",
    "高端人才",
    "重大项目与成果",
    "国际竞争力",
    "人才培养",
]
df = df.loc[:, k]

# Perform clustering
estimator = KMeans(n_clusters=5)
estimator.fit(df.iloc[:, 0:10])
df["label"] = estimator.labels_

# Create pairplot
pairplot = sns.pairplot(data=df, hue="label", vars=k)

# Save each subplot
for i, x_var in enumerate(k):
    for j, y_var in enumerate(k):
        plt.figure(figsize=(5, 5))
        sns.scatterplot(data=df, x=x_var, y=y_var, hue="label")
        plt.title(f"{k[i]}-{k[j]}", fontproperties=font_prop)
        plt.xlabel(k[i], fontproperties=font_prop)  # Set x-axis label
        plt.ylabel(k[j], fontproperties=font_prop)  # Set y-axis label
        plt.savefig(f"{k[i]}-{k[j]}.png")
        plt.close()


聚类总图展示

image.png

省份分布展示

image.png

前端发送请求,后端汇总数据返回前端展示。

使用echarts做图表,echarts的cdn的引入在index.html中引入

部分代码如下

<template>
  <div><el-radio-group v-model="radio1">
      <el-radio value="办学层次" size="large">办学层次</el-radio>
      <el-radio value="师资规模与结构" size="large">师资规模与结构</el-radio>
      <el-radio value="人才培养" size="large">人才培养</el-radio>
      <el-radio value="国际竞争力" size="large">国际竞争力</el-radio>
      <el-radio value="办学资源" size="large">办学资源</el-radio>
      <el-radio value="学科水平" size="large">学科水平</el-radio>
      <el-radio value="科学研究" size="large">科学研究</el-radio>
      <el-radio value="服务社会" size="large">服务社会</el-radio>
      <el-radio value="高端人才" size="large">高端人才</el-radio>
      <el-radio value="重大项目与成果" size="large">重大项目与成果</el-radio>
    </el-radio-group></div>
  <div>
    <el-button type="primary" @click="handleClick">生成中国地图分布</el-button>
  </div>
  <div ref="chart" style="width: 800px; height: 800px;"></div>
</template>
<script setup>
import { onMounted, ref } from 'vue';
import axios from 'axios';

const radio1 = ref('办学层次');
const chart = ref(null);
const maxValue = ref()

let handleClick = () => {
  axios.get('/src/assets/bigdata.json')
    .then(response => {

      jsonData.value = response.data.map((a) => {
        return { "name": a.省市, "value": Number(a[radio1.value]) }
      })

      const groupedData = response.data.reduce((acc, curr) => {
        const 省市 = curr.省市
        const 总分 = curr[radio1.value]
        if (!acc[省市]) {
          acc[省市] = { name: 省市, value: 0 };
        }
        acc[省市].value += Number(总分);
        return acc;
      }, {});
      // 提取每个省市的总分数组
      const totalScores = Object.values(groupedData);
      // 找到最大总分
      maxValue.value = Math.max(...totalScores.map(item => item.value));

      initChart();
    })
    .catch(error => {
      console.log(error);
    });
}

let jsonData = ref()


const initChart = () => {
  const chartDom = chart.value;
  const myChart = echarts.init(chartDom);

  const option = {
    title: {
      text: radio1.value,
      left: 'center'
    },
    tooltip: {
      trigger: 'item'
    },
    visualMap: {
      min: 0,
      max: maxValue.value,
      left: 'left',
      top: 'bottom',
      text: ['高', '低'],
      calculable: true
    },
    series: [
      {
        name: radio1.value,
        type: 'map',
        map: 'china',
        roam: true,
        label: {
          show: true
        },
        data: jsonData.value
      }
    ]
  };

  myChart.setOption(option);
};

</script>