FIRST COMMIT

This commit is contained in:
曙光 2024-12-21 23:45:23 +08:00
commit dc1fc0a5bd
21 changed files with 19311 additions and 0 deletions

3
.browserslistrc Normal file
View File

@ -0,0 +1,3 @@
> 1%
last 2 versions
not dead

5
.editorconfig Normal file
View File

@ -0,0 +1,5 @@
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true

33
.eslintrc.js Normal file
View File

@ -0,0 +1,33 @@
const IS_PROD = process.env.NODE_ENV === 'production';
module.exports = {
root: true,
env: {
node: true,
},
extends: [
'plugin:vue/essential',
// '@vue/standard',
],
parserOptions: {
parser: 'babel-eslint',
},
rules: {
semi: ['error', 'always'], // 分号
camelcase: 'off',
'no-new': 'off',
'vue/no-unused-components': 'warn',
'no-console': IS_PROD ? 'warn' : 'off',
'no-debugger': IS_PROD ? 'error' : 'off',
'no-unreachable': IS_PROD ? 'error' : 'warn', // 提前return
'prefer-promise-reject-errors': 'off',
'standard/no-callback-literal': 'off',
'no-unused-vars': IS_PROD ? 'error' : 'warn',
'comma-dangle': ['error', 'always-multiline'], // 末尾逗号
'space-before-function-paren': ['error', {
anonymous: 'never',
named: 'never',
asyncArrow: 'always', // async箭头函数
}],
},
};

21
.gitignore vendored Normal file
View File

@ -0,0 +1,21 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

5
babel.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset',
],
};

BIN
dist.zip Normal file

Binary file not shown.

18
jsconfig.json Normal file
View File

@ -0,0 +1,18 @@
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": [
"src/*"
]
},
"target": "ES6",
"allowSyntheticDefaultImports": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules"
]
}

17741
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

59
package.json Normal file
View File

@ -0,0 +1,59 @@
{
"name": "competition-management-system",
"version": "1.0.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"inspect": "vue-cli-service inspect --mode production"
},
"dependencies": {
"@ant-design-vue/pro-layout": "^1.0.8",
"@tinymce/tinymce-vue": "^3.2.6",
"animate.css": "^4.1.1",
"ant-design-vue": "^1.7.4",
"axios": "^0.21.1",
"core-js": "^3.10.0",
"dayjs": "^1.10.4",
"element-ui": "^2.15.14",
"file-saver": "^2.0.5",
"js-cookie": "^2.2.1",
"lodash-es": "^4.17.21",
"markdown-it": "^14.1.0",
"nprogress": "^0.2.0",
"qiniu-js": "^3.1.2",
"tinymce": "^5.6.2",
"vue": "^2.6.12",
"vue-animate-number": "^0.4.2",
"vue-meta": "^2.4.0",
"vue-router": "^3.5.1",
"vuedraggable": "^2.24.3",
"vuex": "^3.6.2",
"webpack-theme-color-replacer": "^1.3.20",
"xlsx": "^0.16.9"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.5.12",
"@vue/cli-plugin-eslint": "^4.5.12",
"@vue/cli-plugin-router": "^4.5.12",
"@vue/cli-plugin-vuex": "^4.5.12",
"@vue/cli-service": "^4.5.12",
"@vue/eslint-config-standard": "^5.1.2",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.3.1",
"eslint-plugin-standard": "^4.1.0",
"eslint-plugin-vue": "^6.2.2",
"less": "^4.1.1",
"less-loader": "^6.2.0",
"style-resources-loader": "^1.3.2",
"stylus": "^0.54.8",
"stylus-loader": "^3.0.2",
"vue-cli-plugin-pug": "~2.0.0",
"vue-cli-plugin-style-resources-loader": "^0.1.5",
"vue-template-compiler": "^2.6.12"
}
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

141
public/four.html Normal file
View File

@ -0,0 +1,141 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta http-equiv="refresh" content="60;url=http://localhost:8080/screen.html">
<link rel="stylesheet" href="css/four.css">
<link rel="stylesheet" href="./fonts/iconfont.css">
<!-- <script src="js/echarts.min.js"></script> -->
<script src="js/jquery.min.js"></script>
<script src="js/macarons.js"></script>
<!-- <script src="js/china.js"></script> -->
<script src="js/countUp.js"></script>
</head>
<body>
<ul class="nav">
<li class="drop-down">
<a href="#"></a>
<ul class="drop-down-content">
<li>
<a href="./home.html">自动切换</a>
</li>
<li>
<a href="./screen.html">第一屏</a>
</li>
<li>
<a href="./thrid.html">第二屏</a>
</li>
<li>
<a href="./four.html">第三屏</a>
</li>
<li>
<a href="./index.html">回到主页</a>
</li>
</ul>
</li>
</ul>
<div class="first-screen root-wrap">
<header>
<p style="font-family: '楷体';">竞赛数据统计</p>
<!-- <img src="./img/cnonix.png" /> -->
<!-- <div class="title_img">
<img src="img/title_left_img.png" alt="">
</div> -->
<!-- <span class="month-tip">2017年1月</span> -->
</header>
<div class="main clearfix">
<!-- 同类图书 -->
<div class="aside-left fl">
<h3>优秀作品</h3>
<ul class="clearfix">
</ul>
</div>
<div class="middle_con fl">
<div class="middle_top">
<div class="con_left fl">
</div>
<div class="con_right fl clearfix">
<dl class="clearfix">
<dt>标签</dt>
<dd class="clearfix">
<ul class="bookLabel clearfix"></ul>
</dd>
</dl>
<dl class="clearfix">
<dt class="clearfix">主题词</dt>
<dd class="clearfix">
<ul class="themaWords clearfix"></ul>
</dd>
</dl>
</div>
<div class="con_link">
<h3>比赛简介</h3>
<div class="link_title link_con">
<!-- 钱锺书所著的《围城》是一幅栩栩如生的世井百态图,人生的酸甜苦辣千般滋味均在其中得到了淋漓尽致的体现。钱钟书先生将自己的语言天才并入极其渊博的知识,再添加上一些讽刺主义的幽默调料,以一书而定江山。《围城》显示给我们一个真正的聪明人是怎样看人生,又怎样用所有作家都必得使用的文字来表述自己的“观”和“感”的。 -->
</div>
</div>
<div class="con_link">
<h3>比赛流程</h3>
<ul class="link_ul">
<!-- <li>1.序</li>
<li>2.围城</li>
<li>3.围城</li>
<li>4.记钱钟书与《围城》——杨绛</li> -->
</ul>
</div>
<div class="con_link">
<h3>优秀团队介绍</h3>
<div class="link_title link_author"></div>
</div>
</div>
<div class="middle_button">
<div class="button_left">
<h3>更多比赛</h3>
<div class="button_con">
<div class="container purchase claefix">
</div>
</div>
</div>
<div class="button_right">
<h3>比赛推荐</h3>
<div class="button_con">
<div class="container jieyue claefix">
</div>
</div>
</div>
</div>
</div>
<div class="aside-right clearfix fl">
<div class="con_top clearfix">
<h3>选手评价</h3>
<div class="aside_con clearfix">
</div>
</div>
</div>
</div>
<div class="main-bottom">
<span class="line1"></span>
<span class="line2"></span>
<span class="line3"></span>
</div>
</div>
<script src="js/four.js"></script>
</body>
</html>

41
public/home.html Normal file
View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="js/jquery.min.js"></script>
<link rel="stylesheet" href="css/iframe.css">
<title>大屏</title>
</head>
<body>
<ul class="nav">
<li class="drop-down">
<a href="#"></a>
<ul class="drop-down-content">
<li>
<a href="./home.html">自动切换</a>
</li>
<li>
<a href="./screen.html">第一屏</a>
</li>
<li>
<a href="./thrid.html">第二屏</a>
</li>
<li>
<a href="./four.html">第三屏</a>
</li>
<li>
<a href="./index.html">回到主页</a>
</li>
</ul>
</li>
</ul>
<div class="home">
<iframe id="demo1" src="screen.html" frameborder="0" class="state-01 demo1"></iframe>
<iframe id="demo2" src="thrid.html" frameborder="0" class="state-01 demo2"></iframe>
<iframe id="demo3" src="four.html" frameborder="0" class="state-01 demo3"></iframe>
</div>
<script src="js/home.js"></script>
</body>
</html>

148
public/index.html Normal file
View File

@ -0,0 +1,148 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel='stylesheet' href='https://onlinephoto.oss-cn-chengdu.aliyuncs.com/hangtian/css/main.min.css' />
<link rel='stylesheet' href='https://onlinephoto.oss-cn-chengdu.aliyuncs.com/hangtian/css/style.min.css' />
<link rel='stylesheet' href='https://www.wenytao.com/zb_users/theme/cardslee/style/style.css' />
<!-- 引入样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<% if (htmlWebpackPlugin.options.cdn)
for (const path of htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= path %>" rel="stylesheet">
<% } %>
<title>Loading...</title>
<!-- 首屏动画 -->
<style>
.first-loading-wrp {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
min-height: 600px;
height: 100%
}
.first-loading-wrp>h1 {
font-size: 40px
}
.first-loading-wrp .loading-wrp {
padding: 98px;
display: flex;
justify-content: center;
align-items: center
}
.dot {
animation: antRotate 1.2s infinite linear;
transform: rotate(45deg);
position: relative;
display: inline-block;
font-size: 32px;
width: 32px;
height: 32px;
box-sizing: border-box
}
.dot i {
width: 14px;
height: 14px;
position: absolute;
display: block;
background-color: #1890ff;
border-radius: 100%;
transform: scale(.75);
transform-origin: 50% 50%;
opacity: .3;
animation: antSpinMove 1s infinite linear alternate
}
.dot i:nth-child(1) {
top: 0;
left: 0
}
.dot i:nth-child(2) {
top: 0;
right: 0;
-webkit-animation-delay: .4s;
animation-delay: .4s
}
.dot i:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: .8s;
animation-delay: .8s
}
.dot i:nth-child(4) {
bottom: 0;
left: 0;
-webkit-animation-delay: 1.2s;
animation-delay: 1.2s
}
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@-webkit-keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@keyframes antSpinMove {
to {
opacity: 1
}
}
@-webkit-keyframes antSpinMove {
to {
opacity: 1
}
}
</style>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app">
<!-- 首屏加载动画 -->
<div class="first-loading-wrp">
<h1 style="font-size: 60px;">校园信息化-竞赛管理系统</h1>
<div class="loading-wrp">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div>
<div style="display: flex; justify-content: center; align-items: center;font-size: 30px;">陕西科技大学镐京学院</div>
</div>
</div>
<style>
@media (min-width: 1240px){
.container {
max-width: none;
}
}
</style>
<!-- built files will be auto injected -->
<%
if (htmlWebpackPlugin.options.cdn)
for (const path of htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= path %>"></script>
<% } %>
</body>
</html>

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

405
public/screen.html Normal file
View File

@ -0,0 +1,405 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="css/index.css">
<script src="js/echarts.min.js"></script>
<script src="js/jquery.min.js"></script>
<script src="js/macarons.js"></script>
<script src="js/china.js"></script>
<script src="js/countUp.js"></script>
<script src="js/data01.js"></script>
</head>
<body>
<ul class="nav">
<li class="drop-down">
<a href="#"></a>
<ul class="drop-down-content">
<li>
<a href="./home.html">自动切换</a>
</li>
<li>
<a href="./screen.html">第一屏</a>
</li>
<li>
<a href="./thrid.html">第二屏</a>
</li>
<li>
<a href="./four.html">第三屏</a>
</li>
<li>
<a href="./index.html">回到主页</a>
</li>
</ul>
</li>
</ul>
<div class="first-screen root-wrap">
<header>
<!-- <img src="img/title1.png"> -->
<div class="gifImg">
<span class="month-tip">竞赛管理大数据平台</span>
</div>
<!-- <div class="title_img"><img src="img/title_left_img.png" alt=""> </div> -->
</header>
<div class="main clearfix">
<div class="aside-left fl">
<div class="top left-top">
<h3>作品排行</h3>
<div class="tit clearfix">
<span class="ranking fl"></span>
<span class="name fl">作品名</span>
<span class="company fl">制作团队</span>
<span class="hot fl">作品评分</span>
</div>
<div class="con-wrap">
<div class="over-wrap">
<ul class="con">
<li class="active">
<div class="book-rank clearfix">
<span class="ranking fl">1</span>
<span class="name fl">基于CNN的神经网络的农业小车</span>
<span class="company fl">陈冰</span>
<span class="hot fl">9.33</span>
</div>
<div class="book-show clearfix">
<div class="img-box fl">
<img src="" alt="">
</div>
<div class="content fl">
<p>
<span>作者:</span>
<span class="authors">(瑞典)林格伦</span>
</p>
<p>
<span>作品编号:</span>
<span class="isbn">9787544270878</span>
</p>
<p>
<span>参赛日期:</span>
<span class="pub-date">2014年05月</span>
</p>
<p>
<span>热度</span>
<span class="pricing">¥39.50</span>
</p>
</div>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">2</span>
<span class="name fl">窗边的小豆豆</span>
<span class="company fl">人民文学出版社</span>
<span class="hot fl">9.32</span>
</div>
<div class="book-show clearfix">
<div class="img-box fl">
<img src="" alt="">
</div>
<div class="content fl">
<p>
<span>作者:</span>
<span class="authors">(日)黑柳彻子</span>
</p>
<p>
<span>作品编号:</span>
<span class="isbn">9787208061644</span>
</p>
<p>
<span>参赛日期</span>
<span class="pub-date">2006年05月</span>
</p>
<p>
<span>热度</span>
<span class="pricing">¥29.00</span>
</p>
</div>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">3</span>
<span class="name fl">我的第一本地理启蒙书</span>
<span class="company fl">社会科学文献出版社</span>
<span class="hot fl">9.31</span>
</div>
<div class="book-show clearfix">
<div class="img-box fl">
<img src="" alt="">
</div>
<div class="content fl">
<p>
<span>作者:</span>
<span class="authors">郑利强</span>
</p>
<p>
<span>作品编号:</span>
<span class="isbn">9787550263932</span>
</p>
<p>
<span>参赛日期日期:</span>
<span class="pub-date">2016年01月</span>
</p>
<p>
<span>热度:</span>
<span class="pricing">¥39.80</span>
</p>
</div>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">4</span>
<span class="name fl">神奇校车·桥梁书版</span>
<span class="company fl">人民出版社</span>
<span class="hot fl">9.30</span>
</div>
<div class="book-show clearfix">
<div class="img-box fl">
<img src="" alt="">
</div>
<div class="content fl">
<p>
<span>作者:</span>
<span class="authors">乔安娜柯尔</span>
</p>
<p>
<span>作品编号:</span>
<span class="isbn">9787100077040</span>
</p>
<p>
<span>参数日期:</span>
<span class="pub-date">2011年06月</span>
</p>
<p>
<span>热度:</span>
<span class="pricing">¥24.90</span>
</p>
</div>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">5</span>
<span class="name fl">不一样的卡梅拉手绘本</span>
<span class="company fl">高等教育出版社</span>
<span class="hot fl">9.29</span>
</div>
<div class="book-show clearfix">
<div class="img-box fl">
<img src="" alt="">
</div>
<div class="content fl">
<p>
<span>作者:</span>
<span class="authors">法)克利斯提昂 约里波瓦著郑迪蔚</span>
</p>
<p>
<span>作品编号:</span>
<span class="isbn">21005473</span>
</p>
<p>
<span>参赛日期:</span>
<span class="pub-date">2011年01月</span>
</p>
<p>
<span>热度:</span>
<span class="pricing">¥132.00</span>
</p>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<!-- pressRanking -->
<div class="bottom left-bottom">
<div class="bottom-in">
<h3>中国大学生竞赛排行榜</h3>
<div class="tit clearfix">
<span class="ranking fl">排名</span>
<span class="short fl">竞赛名称</span>
<span class="hot fl">综合评分</span>
</div>
<ul class="con">
<li>
<div class="book-rank clearfix">
<span class="ranking fl">1</span>
<span class="short fl">全国大学生数学建模竞赛</span>
<span class="hot fl">9.85</span>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">2</span>
<span class="short fl">全国大学生电子设计竞赛</span>
<span class="hot fl">9.64</span>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">3</span>
<span class="short fl">中国大学生程序设计竞赛</span>
<span class="hot fl">9.57</span>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">4</span>
<span class="short fl">全国大学生机械创新设计大赛</span>
<span class="hot fl">9.43</span>
</div>
</li>
<li>
<div class="book-rank clearfix">
<span class="ranking fl">5</span>
<span class="short fl">全国大学生结构设计竞赛</span>
<span class="hot fl">9.26</span>
</div>
</li>
<!-- 更多竞赛排名 -->
</ul>
</div>
</div>
</div>
<div class="middle-map fl">
<div class="map-wrap">
<h3 class="clearfix">
<dl class="fl">
<dt>A类赛事</dt>
<dd id="book-data" class="unit-number">64</dd>
</dl>
<dl class="fl">
<dt>B类赛事</dt>
<dd id="varity-data" class="unit-type">125</dd>
</dl>
<dl class="fl">
<dt>销售码洋</dt>
<dd id="sales-data" class="unit-wanyuan">30,340</dd>
</dl>
<dl class="fl">
<dt>参赛人数</dt>
<dd>22</dd>
</dl>
<dl class="fl">
<dt>累计参赛</dt>
<dd id="stock-data" class="unit-wanyuan">12,710</dd>
</dl>
</h3>
<span class="title-map">全国竞赛热点图</span>
<div id="map" style="width: 100%;height: 100%;"></div>
</div>
</div>
<div class="aside-right fl">
<div class="pie clearfix">
<div class="pie1 fl" style="width: 100%;">
<h3>参赛领域占比</h3>
<div id="pie1" style="width: 100%;height: 80%;"></div>
</div>
</div>
<div class="area-rank">
<h3>参赛热省(市)</h3>
<div class="con">
<ul>
<li>
<span class="num">1</span>
<span class="city-name">湖南</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">1875万</span>
</li>
<li>
<span class="num">2</span>
<span class="city-name">陕西</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">1649万</span>
</li>
<li>
<span class="num">3</span>
<span class="city-name">云南</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">1396万</span>
</li>
<li>
<span class="num">4</span>
<span class="city-name">湖北</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">1225万</span>
</li>
<li>
<span class="num">5</span>
<span class="city-name">江苏</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">1203万</span>
</li>
<li>
<span class="num">6</span>
<span class="city-name">江西</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">1108万</span>
</li>
<li>
<span class="num">7</span>
<span class="city-name">内蒙古</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">740万</span>
</li>
<li>
<span class="num">8</span>
<span class="city-name">四川</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">695万</span>
</li>
<li>
<span class="num">9</span>
<span class="city-name">浙江</span>
<span class="bar">
<b class="bar-in"></b>
</span>
<span class="rank-value">667万</span>
</li>
</ul>
</div>
</div>
<div class="trend">
<h3>获奖折线图</h3>
<div id="trendBar1" style="width: 100%;height: 80%;"></div>
</div>
</div>
</div>
<div class="main-bottom">
<span class="line1"></span>
<span class="line2"></span>
<span class="line3"></span>
</div>
</div>
<script src="js/index.js"></script>
<script src="js/mapIndex.js"></script>
</body>
</html>

430
public/thrid.html Normal file
View File

@ -0,0 +1,430 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>index</title>
<meta http-equiv="refresh" content="60;url=http://localhost:8080/four.html">
<script type="text/javascript" src="ejs/jquery.js"></script>
<script type="text/javascript" src="ejs/echarts.min.js"></script>
<script type="text/javascript" src="ejs/area_echarts.js"></script>
<!-- <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=5ieMMexWmzB9jivTq6oCRX9j&callback"></script> -->
<script type="text/javascript" src="ejs/js.js"></script>
<link rel="stylesheet" href="ecss/style.css">
<style>
.nav {
position: fixed;
right: 0;
z-index: 20000;
width: 30%;
height: 10%;
font-size: 0.65625em; }
.nav ul {
list-style: none;
min-width: 500px;
width: 100%; }
.nav ul a {
display: block;
text-decoration: none;
width: 100%;
height: 100%;
text-align: center;
line-height: 4.5;
color: white;
/* background-color: #2f3e45; */ }
.drop-down {
width: 100%;
height: 100%; }
.drop-down-content li {
display: inline-block;
float: left;
width: 20%;
min-width: 100px;
height: 100%; }
.drop-down {
/*position: relative;*/
width: 100%; }
.drop-down-content {
padding: 0;
display: none;
position: absolute;
top: 0;
right: 0;
/*position: absolute;*/ }
h3 {
font-size: 30px;
clear: both; }
.drop-down-content li:hover a {
color: bisque; }
.nav .drop-down:hover .drop-down-content {
display: block; }
</style>
</head>
<script>
</script>
<body>
<ul class="nav">
<li class="drop-down">
<a href="#"></a>
<ul class="drop-down-content">
<li>
<a href="./home.html">自动切换</a>
</li>
<li>
<a href="./screen.html">第一屏</a>
</li>
<li>
<a href="./thrid.html">第二屏</a>
</li>
<li>
<a href="./four.html">第三屏</a>
</li>
<li>
<a href="./index.html">回到主页</a>
</li>
</ul>
</li>
</ul>
<div class="head clearfix">
<h1 class="">竞赛管理系统大数据平台</h1>
<div class="time" id="showTime">2024/6/12 17:00:12</div>
<!-- <div class="name">长沙双数科技有限公司</div> -->
<script>
var t = null;
t = setTimeout(time,1000);//開始运行
function time()
{
clearTimeout(t);//清除定时器
dt = new Date();
var y=dt.getFullYear();
var mt=dt.getMonth()+1;
var day=dt.getDate();
var h=dt.getHours();//获取时
var m=dt.getMinutes();//获取分
var s=dt.getSeconds();//获取秒
document.getElementById("showTime").innerHTML = y+"/"+mt+"/"+day+" "+h+":"+m+":"+s+"";
t = setTimeout(time,1000); //设定定时器,循环运行
}
</script>
</div>
<div class="mainbox">
<ul class="clearfix nav1">
<li style="width: 26%">
<div class="box">
<div class="tit"><span>当日情况</span><p></p></div>
<div class="boxnav" style="height: 320px;">
<ul class="drqk clearfix">
<li>
<div class="icon"><img src="images/icona.png"></div>
<div><span>今日报名人数</span>
<p><em>1358</em><i></i></p></div>
</li>
<li><div class="icon"><img src="images/icona.png"></div>
<div><span>昨日报名人数</span>
<p><em>1983</em><i></i></p></div></li>
<li><div class="icon"><img src="images/icona.png"></div>
<div><span>系统总报名人数</span>
<p><em>930</em><i></i></p></div></li>
<li><div class="icon"><img src="images/icona.png"></div>
<div><span>竞赛总数</span>
<p><em>371</em><i></i></p></div></li>
<li><div class="icon"><img src="images/icona.png"></div>
<div><span>获奖总数</span>
<p><em>1683</em><i></i></p></div></li>
<li><div class="icon"><img src="images/icona.png"></div>
<div><span>资料总数</span>
<p><em>1091</em><i></i></p></div></li>
</ul>
</div>
</div>
<div class="box">
<div class="tit"><span>获奖概率 </span><p></p></div>
<div class="boxnav" style="height:140px;">
<table class="table1" width="100%" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th>赛事名称</th>
<th>一等奖</th>
<th>二等奖</th>
<th>三等奖</th>
</tr>
<tr>
<td>获奖数</td>
<td>0.03<span class="text-b">↓0.01%</span></td>
<td>163.00<span class="text-d">↑4.01%</span></td>
<td>163.00<span class="text-d">↑4.01%</span></td>
</tr>
<tr>
<td>获奖率(%</td>
<td>0.3<span class="text-b">↓0.01%</span></td>
<td>100%<span class="text-d">↑4.01</span></td>
<td>81.92%<span class="text-d">↑4.01</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="box">
<div class="tit"><span>竞赛管理系统</span><p></p></div>
<div class="boxnav" style="height: 250px;">
<ul class="ylfw">
<li>
<div class="ylfwbox fora">
<p>报名总人数</p>
<ol><span>1500</span><em></em><i class="text-d">↑5.00%</i></ol>
<div class="forb"></div>
</div>
</li>
<li>
<div class="ylfwbox fora">
<p>已提交作品数</p>
<ol><span>1200</span><em></em><i class="text-d">↑4.50%</i></ol>
<div class="forb"></div>
</div>
</li>
<li>
<div class="ylfwbox fora">
<p>平均评分</p>
<ol><span>85.4</span><em></em><i class="text-d">↑3.20%</i></ol>
<div class="forb"></div>
</div>
</li>
<li>
<div class="ylfwbox fora">
<p>评审总数</p>
<ol><span>50</span><em></em><i class="text-d">↑2.00%</i></ol>
<div class="forb"></div>
</div>
</li>
<li>
<div class="ylfwbox fora">
<p>通过初审作品数</p>
<ol><span>800</span><em></em><i class="text-d">↑4.00%</i></ol>
<div class="forb"></div>
</div>
</li>
<li>
<div class="ylfwbox fora">
<p>入围决赛作品数</p>
<ol><span>200</span><em></em><i class="text-d">↑2.50%</i></ol>
<div class="forb"></div>
</div>
</li>
</ul>
</div>
</div>
</li>
<li style="width:48%">
<div class="box" style="position: relative">
<div class="map">
<div class="map1"><img src="images/lbx.png"></div>
<div class="map2"><img src="images/jt.png"></div>
<div class="map3"><img src="images/map.png"></div>
</div>
<div class="" id="map" style="height: 557px; position: relative; z-index: 100"></div>
<!-- <script>
// 百度地图API功能
var map = new BMap.Map("map"); // 创建Map实例
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地图,设置中心点坐标和地图级别
map.addControl(new BMap.MapTypeControl({
mapTypes:[
BMAP_NORMAL_MAP,
BMAP_HYBRID_MAP
]}));
var mapStyle={
style:"midnight"
};
map.setMapStyle(mapStyle);
map.setCurrentCity("北京"); // 设置地图显示的城市 此项是必须设置的
map.enableScrollWheelZoom(true);
</script>
-->
</div>
<div class="box">
<div class="tit"><span>系统用户</span><p></p></div>
<div class="boxnav" style="height: 250px;">
<ul class="jcjg">
<li>
<h3>管理员</h3>
<div class="jcnav">
<img src="images/icona.png">
<div class="jcnavp">
<div class="fora">
<ol>总用户数</ol>
<span>1200</span>
<i class="text-d">+4.50</i>
<div class="forb"></div>
</div>
<div class="fora">
<ol>活跃用户</ol>
<span>950</span>
<i class="text-d">+3.20</i>
<div class="forb"></div>
</div>
<div class="fora">
<ol>新增用户</ol>
<span>150</span>
<i class="text-d">+2.00</i>
<div class="forb"></div>
</div>
</div>
</div>
</li>
<li>
<h3>教师用户</h3>
<div class="jcnav">
<img src="images/icona.png">
<div class="jcnavp">
<div class="fora">
<ol>总数</ol>
<span>300</span>
<i class="text-s">-1.10</i>
<div class="forb"></div>
</div>
<div class="fora">
<ol>活跃数</ol>
<span>280</span>
<i class="text-d">+0.50</i>
<div class="forb"></div>
</div>
<div class="fora">
<ol>新增数</ol>
<span>30</span>
<i class="text-d">+1.20</i>
<div class="forb"></div>
</div>
</div>
</div>
</li>
<li>
<h3>学生用户</h3>
<div class="jcnav jcnav2">
<img src="images/icona.png">
<div class="jcnavp">
<div class="fora">
<ol>总人数</ol>
<span>5000</span>
<i class="text-d">+5.80</i>
<div class="forb"></div>
</div>
<div class="fora">
<ol>活跃人数</ol>
<span>4500</span>
<i class="text-d">+4.50</i>
<div class="forb"></div>
</div>
<div class="fora">
<ol>新增人数</ol>
<span>600</span>
<i class="text-d">+3.00</i>
<div class="forb"></div>
</div>
<div class="fora">
<ol>毕业人数</ol>
<span>500</span>
<i class="text-s">-2.50</i>
<div class="forb"></div>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
</li>
<li style="width: 26%">
<div class="box">
<div class="tit"><span>竞赛管理模块</span><p></p></div>
<div class="boxnav" id="" style="height: 280px;">
<ul class="tqdb">
<li>
<div id="echart1"></div>
<h3>报名人数百分比</h3>
</li>
<li>
<div id="echart2"></div>
<h3>作品提交百分比</h3>
</li>
<li>
<div id="echart3"></div>
<h3>初审通过百分比</h3>
</li>
<li>
<div id="echart4"></div>
<h3>决赛入围百分比</h3>
</li>
<li>
<div id="echart5"></div>
<h3>平均评分分布</h3>
</li>
<li>
<div id="echart6"></div>
<h3>评审参与百分比</h3>
</li>
</ul>
</div>
</div>
<div class="box">
<div class="tit"><span>竞赛动态</span><p></p></div>
<div class="boxnav" style="height: 180px;" id="echart7">
</div>
</div>
<div class="box">
<div class="tit"><span>竞赛构成</span><p></p></div>
<div class="boxnav" style="height: 250px;">
<ul class="jbgc">
<li>
<div class="jztxt">
<div>
<h3>1500<i></i></h3>
<span>总报名人数</span>
</div>
<div>
<h3>1200<i></i></h3>
<span>已提交作品</span>
</div>
<div>
<h3>800<i></i></h3>
<span>初审通过</span>
</div>
</div>
</li>
<li style="width:90%" id="echart8"></li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</body>
</html>

69
src/App.vue Normal file
View File

@ -0,0 +1,69 @@
<template>
<div id="app">
<router-view />
<Loading :loading="loading" />
</div>
</template>
<script>
import Loading from './components/common/Loading';
export default {
name: 'Root',
components: { Loading },
provide() {
return {
loadingStart: this.loadingStart,
loadingEnd: this.loadingEnd,
};
},
data() {
return {
loading: false,
};
},
methods: {
loadingStart() {
this.loading = true;
},
loadingEnd() {
this.loading = false;
},
},
metaInfo: {
title: '首页',
titleTemplate: '%s | 竞赛管理系统',
meta: [
{
name: 'keywords',
content: '南昌大学,软件学院,竞赛,管理系统',
},
{
name: 'description',
content: '南昌大学软件学院竞赛管理系统,用于管理竞赛数据。学生参赛报备、竞赛数据统计、数据导出。',
},
],
},
};
</script>
<style lang="stylus">
#app
font-family Avenir, Helvetica, Arial, sans-serif
-webkit-font-smoothing antialiased
-moz-osx-font-smoothing grayscale
color #2c3e50
::-webkit-scrollbar
width 5px
height 5px
cursor pointer
::-webkit-scrollbar-thumb
border-radius 5px
-webkit-box-shadow inset 0 0 5px rgba(0, 0, 0, 0.2)
background #e0e5eb
::-webkit-scrollbar-track
box-shadow inset 0 0 5px rgba(0, 0, 0, 0.1)
border-radius 0
</style>

39
src/main.js Normal file
View File

@ -0,0 +1,39 @@
import Vue from 'vue';
import App from './App.vue';
import router from '@/router';
import store from '@/store';
import * as API from '@/api';
import zhCn from 'ant-design-vue/lib/locale-provider/zh_CN';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import './permission'; // permission control
import '@/plugins';
import '@/tool';
import VueAnimateNumber from 'vue-animate-number'
Vue.use(VueAnimateNumber)
Vue.config.productionTip = false;
Vue.prototype.$api = API;
// 获取设备宽度
const deviceWidth = document.documentElement.clientWidth;
// 假设设计稿宽度为750pxrem基准值设置为75
const baseWidth = 750;
const baseFontSize = 30;
// 计算当前设备下的rem基准值
const fontSize = deviceWidth / baseWidth * baseFontSize;
// 设置html的font-size
document.documentElement.style.fontSize = fontSize + 'px';
const vm = new Vue({
router,
store,
render: function(createElement) {
return createElement('a-config-provider', { props: { locale: zhCn } }, [
createElement(App)
]);
}
});
vm.$mount('#app');

98
src/permission.js Normal file
View File

@ -0,0 +1,98 @@
import store from '@/store'; // 导入 Vuex store 实例
import router from '@/router'; // 导入 Vue Router 实例
import { notification } from 'ant-design-vue'; // 导入 ant-design-vue 的 notification 组件
import NProgress from 'nprogress'; // 导入进度条组件
import 'nprogress/nprogress.css'; // 导入进度条样式
NProgress.configure({ showSpinner: false }); // 配置进度条,隐藏加载动画
const loginPath = '/login'; // 登录路径
const defaultRoutePath = '/race/list'; // 默认路由路径
const whiteList = ['Login']; // 白名单,无需登录即可访问的页面
router.beforeEach(async(to, from, next) => {
NProgress.start(); // 开始进度条
const tokens = window.localStorage.getItem("token"); // 使用相同的键来获取token
/* 未登录情况下的路由拦截 */
if (!tokens) {
// alert(tokens)
if (whiteList.includes(to.name)) { // 如果在白名单中,直接放行
next();
} else { // 否则重定向至登录页面
next({
path: loginPath,
query: {
redirect: to.fullPath,
},
});
}
return;
}
/* 已登录情况下访问登录界面的处理 */
if (to.path === loginPath) { // 如果已登录且访问登录页面,则重定向至默认页面
next(defaultRoutePath);
return;
}
/* 已获取用户信息的情况 */
if (store.getters.permissions!=null && store.getters.permissions!=="") { // 如果已获取用户权限信息,则直接放行
next();
NProgress.done(); // 结束进度条
return;
}
/* 未获取用户信息的情况 */
try {
await store.dispatch('initUser'); // 异步获取用户信息
} catch (e) {
store.commit('logout'); // 获取失败时执行退出登录操作
next({ path: loginPath, query: { redirect: to.fullPath } }); // 重定向至登录页面
notification.error({
message: '错误',
description: '请求用户信息失败,请重试',
}); // 显示错误通知
NProgress.done(); // 结束进度条
return;
}
/* 成功获取用户信息的情况 */
// 检查路由权限
if (!checkAccess(to)) { // 如果当前路由无权限访问,则重定向至默认页面
next({ path: defaultRoutePath, replace: true });
NProgress.done(); // 结束进度条
return;
}
const redirect = decodeURIComponent(from.query.redirect || to.path); // 获取重定向地址
// 如果重定向地址与当前路径相同,则替换历史记录
if (redirect === to.path) {
next({...to, replace: true });
} else { // 否则正常重定向
next(redirect);
}
NProgress.done(); // 结束进度条
});
router.afterEach(() => {
NProgress.done(); // 结束进度条
});
/**
* 判断当前路由是否具有权限访问
* @param {Route} route 路由对象
* @returns {boolean} 是否具有权限
*/
function checkAccess(route) {
const userPrivileges = store.state.user.userPrivileges==null ? 1 : store.state.user.userPrivileges; // 获取用户权限信息
const requiredPrivileges = route.meta.auth; // 获取当前路由所需权限信息
console.log(userPrivileges)
// 如果路由未设置权限要求,则默认放行
if (!requiredPrivileges) {
return true;
}
// 检查用户的权限是否包含在所需权限中
return requiredPrivileges.includes(userPrivileges);
}

55
vue.config.js Normal file
View File

@ -0,0 +1,55 @@
const path = require('path'); // 导入 Node.js 中的 path 模块
// const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); // 导入 webpack-bundle-analyzer 插件
const resolve = dir => path.join(__dirname, '.', dir); // 定义一个函数用于解析路径
module.exports = {
parallel:false,
chainWebpack: config => {
if (process.env.NODE_ENV === 'production') {
config.plugins.delete('prefetch'); // 删除 webpack 配置中的 prefetch 插件,以便懒加载生效
}
}, // 配置别名
configureWebpack: {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'@/components': path.resolve(__dirname, 'src/components'), // 设置 @/components 别名
},
},
},
lintOnSave: false, // 关闭保存时的 eslint 检查
devServer: {
proxy: {
'/api': { // 配置代理规则,将请求转发至 http://localhost:8880
target: 'http://localhost:8887',
changeOrigin: true, // 是否改变源地址
},
},
},
pluginOptions: {
'style-resources-loader': { // 配置全局样式资源加载器
preProcessor: 'stylus', // 使用 stylus 预处理器
patterns: [
resolve('./src/style/mixins.styl'), // 导入全局混合文件
resolve('./src/style/variables.styl'), // 导入全局变量文件
],
injector: 'prepend', // 插入到文件的最前面
},
},
css: {
loaderOptions: {
less: {
lessOptions: {
javascriptEnabled: true, // 启用 Less 编译时的 JavaScript 支持
modifyVars: { // 自定义 Less 变量
'@primary-color': '#2f54eb', // 主题色
'@success-color': '#36b777', // 成功状态颜色
'@border-radius-base': '2px', // 边框圆角半径
},
},
},
},
},
};

0
webpack.config.js Normal file
View File