fwb 8 months ago
commit 4f83f4f883
  1. 2
      .env.development
  2. 2
      package.json
  3. 6226
      pnpm-lock.yaml
  4. 6
      src/Layout/footer/index.vue
  5. 67
      src/Layout/tabbar/components/item.vue
  6. 78
      src/Layout/tabbar/index.vue
  7. 21
      src/api/person.ts
  8. 16
      src/api/race.ts
  9. 25
      src/api/user.ts
  10. BIN
      src/assets/images/applyImg.png
  11. BIN
      src/assets/images/banner1.png
  12. BIN
      src/assets/images/bg.png
  13. BIN
      src/assets/images/bg2.png
  14. BIN
      src/assets/images/card.png
  15. BIN
      src/assets/images/code.png
  16. BIN
      src/assets/images/ellipsis.png
  17. BIN
      src/assets/images/ellipsis@2x.png
  18. BIN
      src/assets/images/footer.png
  19. 10
      src/main.ts
  20. 23
      src/permissions.ts
  21. 3
      src/router/index.ts
  22. 11
      src/router/module/constRouter/defineRouter.ts
  23. 67
      src/router/module/constRouter/index.ts
  24. 45
      src/store/module/user.ts
  25. 4
      src/styles/index.scss
  26. 51
      src/utils/echarts.ts
  27. 7
      src/utils/requset.ts
  28. 9
      src/utils/token.ts
  29. 2
      src/views/competition/index.vue
  30. 169
      src/views/home/index.vue
  31. 146
      src/views/login/index.vue
  32. 188
      src/views/personalAbilityEvaluationCollectList/index.vue
  33. 192
      src/views/personalEvaluateList/index.vue
  34. 211
      src/views/personalReport/components/randerChart.vue
  35. 382
      src/views/personalReport/index.vue
  36. 626
      src/views/registrationGroup/index.vue
  37. 441
      src/views/registrationPersonage/index.vue
  38. 12
      src/views/userInfo/index.vue

@ -1,5 +1,5 @@
# 变量必须以 VITE_ 为前缀才能暴露给外部读取
NODE_ENV = 'development'
VITE_APP_TITLE = '教学一体化平台'
VITE_APP_BASE_API = 'http://39.106.16.162:8080'
VITE_APP_BASE_API = http://localhost:18085/jeecg-boot
# VITE_APP_BASE_API = 'http://127.0.0.1:8080'

@ -16,9 +16,9 @@
"preinstall": "node ./scripts/preinstall.js"
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"axios": "^1.6.8",
"echarts": "5.3.2",
"element-plus": "^2.6.2",
"pinia": "^2.1.7",
"postcss-plugin-px2rem": "^0.8.1",

File diff suppressed because it is too large Load Diff

@ -14,10 +14,12 @@ import {} from 'vue'
// bottom: 0;
height: 300px;
width: 100%;
background-color: #252527;
// background-color: #252527;
background: url('../../assets//images/footer.png') no-repeat;
background-size: cover;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
color: #000;
}
</style>

@ -0,0 +1,67 @@
<template>
<!-- 根据路由动态生成菜单 -->
<template v-for="item in menuList" :key="item.path">
<!-- 没有子路由 -->
<template v-if="!item.children">
<el-menu-item
v-if="!item.meta.hidden"
:index="item.path"
@click="goToRoute"
>
<!-- <el-icon>
<component :is="item.meta.icon"></component>
</el-icon> -->
<template #title>
<!-- <el-icon>
<component :is="item.meta.icon"></component>
</el-icon> -->
<span>{{ item.meta.title }}</span>
</template>
</el-menu-item>
</template>
<!-- 有子路由但是只有一个子路由 -->
<template v-if="item.children && item.children.length === 1">
<el-menu-item
v-if="!item.children[0].meta.hidden"
:index="item.children[0].path"
@click="goToRoute"
>
<el-icon>
<component :is="item.children[0].meta.icon"></component>
</el-icon>
<template #title>
<span>{{ item.children[0].meta.title }}</span>
</template>
</el-menu-item>
</template>
<!-- 有子路由且有多个 -->
<el-sub-menu
:index="item.path"
v-if="item.children && item.children.length > 1"
>
<template #title>
<el-icon>
<component :is="item.meta.icon"></component>
</el-icon>
<span>{{ item.meta.title }}</span>
</template>
<Item :menuList="item.children" />
</el-sub-menu>
</template>
</template>
<script lang="ts" setup>
import { useRouter } from 'vue-router'
// import { onMounted, reactive, ref, toRefs, watch } from 'vue'
//
defineProps(['menuList'])
const $router = useRouter()
const goToRoute = (vc: any) => {
$router.push(vc.index)
}
</script>
<script lang="ts">
export default {
name: 'app-Menu',
}
</script>
<style lang="scss" scoped></style>

@ -7,21 +7,43 @@
</div>
<div class="menu">
<ul>
<el-menu
:default-active="$route.path"
class="el-menu-demo"
mode="horizontal"
:ellipsis="false"
>
<Item :menu-list="constRouter.children"/>
</el-menu>
<!-- <ul>
<li v-for="(item, index) in constRouter.children" :key="index">
{{ item.meta.title }}
</li>
</ul>
<!-- <ul>-->
<!-- <router-link v-for="(item, index) in constRouter.children" :key="index" :to="item.path">-->
<!-- {{ item.meta.title }}-->
<!-- </router-link>-->
<!-- </ul>-->
</ul> -->
</div>
</div>
<div class="right">
<div class="right" v-if="!useUserStore.token">
<div class="registered gradient">注册</div>
<div class="login">登录</div>
<div class="login" @click="$router.push('/login')">登录</div>
</div>
<div class="right" v-else>
<div class="avater">
<img src="../../assets/images/default.png" alt="" />
</div>
<el-dropdown>
<span class="el-dropdown-link">
{{ useUserStore.userInfo.username }}
<el-icon class="el-icon--right">
<arrow-down />
</el-icon>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="$router.push('/user-info')">个人中心</el-dropdown-item>
<el-dropdown-item @click="layout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div>
@ -29,12 +51,13 @@
<script lang="ts" setup>
import { constRouter } from '@/router/module/constRouter'
// import { useRouter, useRoute } from 'vue-router'
import { useRouter, useRoute } from 'vue-router'
import { onMounted, ref } from 'vue'
// const $router = useRouter()
// const $route = useRoute()
console.log(constRouter, '111')
import userStore from '@/store/module/user'
import Item from './components/item.vue'
const useUserStore = userStore()
const $router = useRouter()
const $route = useRoute()
const flog = ref(false)
onMounted(() => {
window.addEventListener('scroll', () => {
@ -45,6 +68,9 @@ onMounted(() => {
}
})
})
const layout = async () => {
useUserStore.layOut()
}
</script>
<style lang="scss" scoped>
@ -137,13 +163,21 @@ onMounted(() => {
font-size: 14px;
cursor: pointer;
}
.registered{
.registered {
color: #fff;
}
.login{
color: #1D2129;
.login {
color: #1d2129;
margin-left: 20px;
border: 1px solid #E5E6EB;
border: 1px solid #e5e6eb;
}
.avater {
width: 35px;
height: 35px;
img {
width: 100%;
}
margin-right: 20px;
}
}
.menu {
@ -215,4 +249,12 @@ onMounted(() => {
align-items: center;
}
}
:deep(.el-menu){
background-color: transparent;
border-bottom: none;
}
:deep(.el-menu-item){
background-color: transparent;
border-bottom: none;
}
</style>

@ -0,0 +1,21 @@
import request from '@/utils/requset'
request.interceptors.response.use(response => {
// @ts-ignore
if (response.code >= 200 && response.code < 300) return response;
else return Promise.reject(response);
})
enum api {
liststu = '/abilityEvaluation/personalAbilityEvaluationCollect/liststu', // 个人能力评价列表
integral = '/annualScore/personalCompTotalScore/liststu', // 个人积分列表
PAGE_XSFXBG = '/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/xsfxbg',
}
export const getlEvaluateApi = (params: Record<'pageNo' | 'pageSize', number>) => request.get(api.liststu, { params });
export const getlIntegralApi = (params: Record<'pageNo' | 'pageSize', number>) => request.get(api.integral, { params });
export const getXsfxbgApi = (params = {}) => {
const par = { recreateFlag: false, annualid: '' };
Object.assign(par, params);
return request.get(api.PAGE_XSFXBG, { params: par });
};

@ -0,0 +1,16 @@
import request from '@/utils/requset'
// 获取年度比赛项目列表
export const getRaceProjectList = (params:any) => {
return request({
url:'/AnnualCompPoint/annualCompPoint/listStudent',
params
})
}
// 获取年度比赛列表
export const getRaceList = (params:any) => {
return request({
url:'/annualcomp/annualComp/schoollist',
params
})
}

@ -0,0 +1,25 @@
import request from '@/utils/requset'
export const getCode = (time:any) => {
return request({
url:'/sys/randomImage/' + time,
})
}
export const loginApi = (data:any) => {
return request({
url:'/sys/login',
method:"POST",
data
})
}
export const getUserInfoApi = () => {
return request({
url:'/sys/user/getUserInfo'
})
}
export const logOut = () => {
return request({
url:'/sys/logout'
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

@ -12,21 +12,25 @@ import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import gloablComponent from './components/index'
// 引入全局样式
import '@/styles/index.scss'
// 引入路由
import router from '@/router/index'
// 引入仓库
import pinia from '@/store/index'
// 引入路由
import router from './permissions'
import '@/utils/rem.js'
// 创建vue实例
const app = createApp(App)
app.use(pinia)
// 注册element plus组件库
app.use(ElementPlus, {
locale: zhCn,
})
// 注册全局组件
app.use(gloablComponent)
app.use(router)
app.use(pinia)
// app.use(G6)
// 挂载点
app.mount('#app')

@ -0,0 +1,23 @@
import router from '@/router/index'
import userStore from './store/module/user'
router.beforeEach(async (to, form, next) => {
const useuserStore = userStore()
if (useuserStore.token) {
if (to.path === '/login') {
next({ path: '/' })
} else {
if (!Object.keys(useuserStore.userInfo).length) {
useuserStore.getUserInfo()
next()
}else{
next()
}
}
}else{
next()
}
})
export default router

@ -1,8 +1,9 @@
import { createRouter, createWebHashHistory,createWebHistory } from 'vue-router'
import { constRouter } from './module/constRouter'
import defineRouter from './module/constRouter/defineRouter'
const router = createRouter({
history: createWebHashHistory(),
routes: [constRouter],
routes: [...defineRouter,constRouter],
scrollBehavior() {
return {
left: 0,

@ -0,0 +1,11 @@
const defineRouter = [
{
path:'/login',
component: () => import('@/views/login/index.vue'),
meta:{
title:'登录'
}
}
]
export default defineRouter

@ -60,6 +60,26 @@ export const constRouter: any =
hidden: false,
},
},
{
path: '/registrationGroup',
name: 'RegistrationGroup',
component: () => import('@/views/registrationGroup/index.vue'),
meta: {
icon: '',
title: '报名信息确认/团队',
hidden: false,
},
},
{
path: '/registrationPersonage',
name: 'RegistrationPersonage',
component: () => import('@/views/registrationPersonage/index.vue'),
meta: {
icon: '',
title: '报名信息确认/个人',
hidden: false,
},
},
{
path: '/news',
name: 'news',
@ -74,6 +94,11 @@ export const constRouter: any =
path: '',
name: 'newsList',
component: () => import('@/views/news/components/newsList.vue'), // 新闻列表组件
meta: {
icon: '',
title: '新闻列表',
hidden: false,
},
},
{
// path: '/newsDetail',
@ -83,11 +108,51 @@ export const constRouter: any =
meta: {
icon: '',
title: '新闻内容详情',
hidden: true,
hidden: false,
}
}
],
},
{
path: '/user-info',
name: 'UserInfo',
component: () => import('@/views/userInfo/index.vue'),
meta: {
icon: '',
title: '个人中心',
hidden: true,
},
},
{
path: '/personalAbilityEvaluationCollectList',
name: 'PersonalAbilityEvaluationCollectList',
component: () => import('@/views/personalAbilityEvaluationCollectList/index.vue'),
meta: {
icon: '',
title: '个人积分管理',
hidden: false,
},
},
{
path: '/personalEvaluateList',
name: 'personalEvaluateList',
component: () => import('@/views/personalEvaluateList/index.vue'),
meta: {
icon: '',
title: '个人能力评价',
hidden: false,
},
},
{
path: '/personalReport',
name: 'PersonalReport',
component: () => import('@/views/personalReport/index.vue'),
meta: {
icon: '',
title: '个人能力报告',
hidden: false,
},
},
],
}

@ -0,0 +1,45 @@
import { defineStore } from 'pinia'
import { loginApi,getUserInfoApi ,logOut} from '@/api/user'
import { ElNotification } from 'element-plus'
import { setToken, getToken ,removeToken} from '@/utils/token'
const userStore = defineStore('defineStore', {
state: (): any => ({
token: getToken() || '',
userInfo: {},
}),
actions: {
async login(parmas: any) {
const res: any = await loginApi(parmas)
if (res.code === 412) {
return 0
} else if (res.code === 500) {
return 1
} else {
console.log(res.result.userInfo)
this.token = res.result.token
setToken(this.token)
this.userInfo = res.result.userInfo
ElNotification({
title: '登录成功',
message: '欢迎回来' + this.userInfo.username,
type: 'success',
})
}
},
async getUserInfo(){
const res:any = await getUserInfoApi()
this.userInfo = res.result.userInfo
console.log(res);
},
async layOut(){
await logOut()
removeToken()
this.token = ''
this.userInfo = {}
}
},
})
export default userStore

@ -1,6 +1,8 @@
// 引入清除浏览器默认样式文件
@import './reset.scss';
:root {
--el-color-primary: #0BD7C6;
}
.container-1420{
width: 1420px;
margin: 0 auto;

@ -0,0 +1,51 @@
import * as echarts from 'echarts/core';
import { BarChart, LineChart, PieChart, MapChart, PictorialBarChart, RadarChart } from 'echarts/charts';
import {
TitleComponent,
TooltipComponent,
GridComponent,
PolarComponent,
AriaComponent,
ParallelComponent,
LegendComponent,
RadarComponent,
ToolboxComponent,
DataZoomComponent,
VisualMapComponent,
TimelineComponent,
CalendarComponent,
GraphicComponent,
} from 'echarts/components';
// TODO 如果想换成SVG渲染,就导出SVGRenderer,
// 并且放到 echarts.use 里,注释掉 CanvasRenderer
import { /*SVGRenderer*/ CanvasRenderer } from 'echarts/renderers';
echarts.use([
LegendComponent,
TitleComponent,
TooltipComponent,
GridComponent,
PolarComponent,
AriaComponent,
ParallelComponent,
BarChart,
LineChart,
PieChart,
MapChart,
RadarChart,
// TODO 因为要兼容Online图表自适应打印,所以改成 CanvasRenderer,可能会模糊
CanvasRenderer,
PictorialBarChart,
RadarComponent,
ToolboxComponent,
DataZoomComponent,
VisualMapComponent,
TimelineComponent,
CalendarComponent,
GraphicComponent,
]);
export default echarts;

@ -1,5 +1,8 @@
// 引入第三方请求库axios
import axios from 'axios'
import pinia from '@/store'
import userStore from '@/store/module/user'
// 创建axios实例
const server = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
@ -7,6 +10,10 @@ const server = axios.create({
})
// 创建请求拦截器
server.interceptors.request.use((config) => {
const useuserStore = userStore(pinia)
config.headers.Authorization = useuserStore.token
config.headers['x-access-token'] = useuserStore.token
return config
})

@ -0,0 +1,9 @@
export const setToken = (token: string) => {
localStorage.setItem('token', token)
}
export const removeToken = () => {
localStorage.removeItem('token')
}
export const getToken = () => {
return localStorage.getItem('token')
}

@ -1,4 +1,4 @@
<!-- 年度赛事 -->
<!-- 年度赛事页面 -->
<template>
<div class="fill"></div>
<div class="banner">

@ -1,9 +1,9 @@
<template>
<div class="container-1420">
<div class="container-1420" v-if="isLoading">
<div class="banner">
<div class="title">2024年度全国电子科技大赛火热报名中</div>
<div class="title">{{ reacProjectList[0].objName}}火热报名中</div>
<div class="description">
我是一段比赛简介我是一段比赛简介我是一段比赛简介我是一段比赛简介我是一段比赛简介我是一段比赛简介我是一段比赛简介我是一段比赛简介我是一段比赛简介
{{ reacProjectList[0].annualCompId_dictText }}
</div>
<div class="application gradient">立即报名</div>
<div class="nav-title">
@ -13,14 +13,14 @@
</div>
<!-- 比赛列表 -->
<div class="race-list">
<div class="item" v-for="i in 8" :key="i">
<div class="item" v-for="item in reacProjectList" :key="item.id">
<div class="image">
<img src="../../assets/images/item.png" alt="" />
<img :src="setImageUrl(item.image)" alt="" />
</div>
<div class="reac-info">
<div class="reac-title">全国计算机等级大赛</div>
<div class="reac-project">全国计算机等级大赛项目</div>
<div class="time">报名时间:2022-01-01 18:00-2022-01-01:18:00</div>
<div class="reac-title">{{ item.compname }}</div>
<div class="reac-project"><div v-html="item.introduce"></div></div>
<div class="time">报名时间:{{item.starttime}}-{{ item.endtime }}</div>
</div>
</div>
</div>
@ -32,7 +32,33 @@
</div>
<div class="newa-panel">
<div class="tab">
<div :class="active === i ? 'item active gradient' : 'item'" v-for="i in 5" :key="i" @click="active = i">全部</div>
<div
:class="active === i ? 'item active gradient' : 'item'"
v-for="i in 5"
:key="i"
@click="active = i"
>
全部
</div>
</div>
<div class="newa-main">
<div class="left"></div>
<div class="right">
<div class="title">新闻标题</div>
<div class="description">
我是新闻描述,我是新闻描述,我是新闻描述
</div>
<div class="newa-main-list">
<ul>
<li v-for="i in 6" :key="i">
<div class="time">2024-09-12</div>
<div class="info">
我是一段新闻描述,我是一段新闻描述,我是一段新闻描述
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
@ -41,7 +67,29 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { getRaceList } from '@/api/race'
const reacProjectList = ref<any>([])
const isLoading = ref(false)
const getRaceProjectListEvent = async () => {
let page = {
column: 'createTime',
order: 'desc',
pageNo: 1,
pageSize: 8,
}
const res:any = await getRaceList(page)
console.log(res)
reacProjectList.value = res.result.records
console.log(reacProjectList.value ,'reacProjectList.value ');
isLoading.value = true
}
getRaceProjectListEvent()
const active = ref(1)
const setImageUrl = (url:string) => {
return import.meta.env.VITE_APP_BASE_API +url
}
</script>
<style lang="scss" scoped>
@ -49,11 +97,13 @@ const active = ref(1)
position: relative;
width: 100%;
height: 692px;
background: radial-gradient(
circle,
rgba(131, 255, 197, 1) 0%,
rgba(255, 255, 255, 1) 50%
);
// background: radial-gradient(
// circle,
// rgba(131, 255, 197, 1) 0%,
// rgba(255, 255, 255, 1) 50%
// );
background: url('../../assets/images/banner1.png') no-repeat;
background-size: contain;
display: flex;
flex-direction: column;
justify-content: center;
@ -99,9 +149,10 @@ const active = ref(1)
}
.race-list {
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
// gap: 10px;
margin-top: 40px;
.item {
width: 340px;
@ -140,6 +191,8 @@ const active = ref(1)
}
.news-list {
margin-top: 170px;
background: url('../../assets/images/bg2.png') no-repeat;
background-size: cover;
.news-title {
.top {
font-size: 40px;
@ -159,7 +212,11 @@ const active = ref(1)
backdrop-filter: blur(10px);
box-shadow: 2px 6px 14px rgba(0, 0, 0, 0.25);
margin-top: 25px;
padding: 46px 180px 70px 180px;
// padding: 46px 180px 70px 180px;
padding-top: 46px;
display: flex;
flex-direction: column;
align-items: center;
.tab {
display: flex;
justify-content: space-between;
@ -175,14 +232,88 @@ const active = ref(1)
box-shadow: 7px 7px 22px -10px rgba(0, 0, 0, 0.22);
cursor: pointer;
transition: all 0.2s;
margin-right: 48px;
}
.item:hover{
.item:hover {
transform: scale(1.1);
}
.item:last-child {
margin: 0;
}
.active {
color: #fff;
}
}
.newa-main {
width: 1200px;
height: 465px;
padding: 58px 54px 19px 25px;
display: flex;
align-items: center;
justify-content: space-between;
.left {
width: 546px;
height: 388px;
background-color: #d9d9d9;
border-radius: 15px;
}
.right {
flex: 1;
height: 388px;
margin-left: 89px;
padding: 15px 0;
.title {
font-size: 24px;
font-weight: 600;
color: #1e2033;
}
.description {
font-size: 14px;
margin-top: 10px;
color: #1e2033;
}
.newa-main-list {
width: 100%;
height: 270px;
// background-color: pink;
margin-top: 38px;
ul {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
li {
width: 227px;
height: 65px;
.time {
position: relative;
font-size: 14px;
color: #1e2033;
padding-left: 13px;
}
.time::before {
content: ' ';
display: block;
position: absolute;
top: 0;
left: 0;
width: 6px;
height: 13px;
background-color: #319245;
}
.info {
margin-top: 12px;
font-size: 12px;
color: #1e2033;
line-height: 18px;
}
}
}
}
}
}
}
}
</style>

@ -0,0 +1,146 @@
<template>
<div class="login-content">
<div class="login-form">
<div class="login-title">登录</div>
<div class="form">
<el-form :model="form" label-width="80">
<el-form-item label="账号">
<el-input v-model="form.account" style="height: .2344rem" />
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" style="height: .2344rem" />
</el-form-item>
<el-form-item label="验证码">
<div class="captcha">
<el-input
v-model="form.captcha"
style="height: .2344rem"
maxlength="4"
/>
<div class="code" @click="getcodeinfo">
<img :src="codeUrl" alt="" srcset="" />
</div>
</div>
</el-form-item>
</el-form>
<div class="submit gradient" @click.enter="submit">登录</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
import { getCode } from '@/api/user'
import userStore from '@/store/module/user'
import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'
const useUserStore = userStore()
const form = ref({
account: '',
password: '',
captcha: '',
})
const codeUrl = ref('')
const getcodeinfo = async () => {
const res: any = await getCode(1629428467008)
codeUrl.value = res.result
console.log(codeUrl.value)
}
getcodeinfo()
const Router = useRouter()
const submit = async () => {
console.log(111, useUserStore)
let data = {
captcha: form.value.captcha,
checkKey: 1629428467008,
password: form.value.password,
username: form.value.account,
}
const res = await useUserStore.login(data)
console.log(res)
if (res === 0) {
ElMessage('验证码错误')
getcodeinfo()
} else if (res === 1) {
ElMessage('账号或密码错误')
getcodeinfo()
}else{
Router.push('/')
}
}
</script>
<style lang="scss" scoped>
.login-content {
width: 100%;
height: 100vh;
background: url('../../assets/images/bg.png') no-repeat;
background-size: cover;
display: flex;
align-items: center;
justify-content: center;
.login-form {
width: 640px;
height: 820px;
border-radius: 15px;
background-color: #ffffff1a !important;
padding: 70px 60px;
backdrop-filter: blur(10px);
box-shadow: 0 4px 8px 1px rgba(0, 0, 0, 0.2);
.login-title {
font-size: 32px;
font-weight: 700;
}
.form {
margin-top: 35px;
padding: 0 40px;
.captcha {
width: 100%;
height: 100%;
position: relative;
.code {
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
width: 105px;
height: 100%;
// background-color: pink;
display: flex;
align-items: center;
img{
width: 100%;
height: 100%;
}
}
}
.submit {
width: 399px;
height: 50px;
text-align: center;
line-height: 50px;
font-size: 20px;
font-weight: 600;
cursor: pointer;
color: #fff;
border-radius: 10px;
margin-top: 35px;
}
}
}
}
:deep(.el-form-item) {
display: flex;
flex-direction: column;
}
:deep(.el-input__wrapper) {
box-shadow: none;
}
:deep(.el-form-item__label) {
justify-content: start;
}
</style>

@ -0,0 +1,188 @@
<template>
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">报名信息确认</div>
<div class="text">
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
</div>
</div>
<div class="img-box">
<img src="../../assets/images/applyImg.png" alt="">
</div>
</div>
</div>
<div class="personalAbilityEvaluationCollectList">
<el-card body-class="table-list">
<div class="table-box">
<el-table v-loading="isLoading" ref="multipleTableRef" border :data="tableData" class="table"
:class="{ height: tableData.length > 8 }">
<el-table-column type="selection" width="55" />
<el-table-column prop="depet_dictText" label="院系" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="workOn" label="学号" />
<el-table-column prop="score" label="总积分" />
<el-table-column label="操作" width="120">
<template #default="scope"></template>
</el-table-column>
<template #empty>
<el-empty description="暂无数据" />
</template>
</el-table>
<div class="pagin-box">
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="pagInfo.currentPage"
v-model:page-size="pagInfo.pageSize" :page-sizes="[10, 50, 80, 100]"
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="pagInfo.total"
@change="getTableList" />
</div>
</div>
</el-card>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { getlIntegralApi } from '@/api/person';
import { ElMessage } from 'element-plus'
// loading
const isLoading = ref(true)
//
const pagInfo = reactive({
currentPage: 1,
pageSize: 10,
total: 0
})
//
const tableData = reactive<any[]>([]);
const setTableData = (arr: any[]) => {
tableData.length = 0;
tableData.push(...arr);
}
async function getTableList() {
try {
isLoading.value = true;
const res: any = await getlIntegralApi({ pageNo: pagInfo.currentPage, pageSize: pagInfo.pageSize })
pagInfo.total = res.result.total;
setTableData(res.result.records);
} catch (error) {
ElMessage.error('请求失败');
} finally {
isLoading.value = false;
}
}
getTableList();
</script>
<style lang="scss" scoped>
.fill {
padding-top: 80px;
}
.banner {
width: 100%;
height: 289;
background: linear-gradient(90deg, #FFFFFF 0%, #F0F8FF 100%);
padding: 21px 0 37px 225px;
.box {
width: 1515px;
height: 231px;
display: flex;
gap: 104px;
justify-content: space-between;
align-items: center;
.title-box {
width: 1151px;
.title {
height: 59px;
font-family: Open Sans, Open Sans;
font-weight: bold;
font-size: 42px;
color: #333333;
line-height: 59px;
}
.text {
margin-top: 20px;
font-family: Open Sans, Open Sans;
font-weight: 400;
font-size: 20px;
color: #666666;
line-height: 23px;
}
}
.img-box {
img {
object-fit: cover;
}
}
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.personalAbilityEvaluationCollectList {
.table-list {
.table-box {
.table {
--el-table-header-bg-color: #fafafa;
width: 100%;
&.height {
height: 375px;
}
}
.pagin-box {
width: 100%;
height: 64px;
display: flex;
align-items: center;
.pagination {
padding: 0 24px;
:deep() {
.el-pagination__total {
margin-right: auto;
}
li.number.is-active {
background-color: #42D9AC;
color: rgba(255, 255, 255, 0.9);
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
}
span.el-pagination__jump {
background-color: #F3F3F3;
padding: 2px 8px;
}
}
}
}
}
}
}
</style>

@ -0,0 +1,192 @@
<template>
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">报名信息确认</div>
<div class="text">
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
</div>
</div>
<div class="img-box">
<img src="../../assets/images/applyImg.png" alt="">
</div>
</div>
</div>
<div class="personalAbilityEvaluationCollectList">
<el-card body-class="table-list">
<div class="table-box">
<el-table v-loading="isLoading" ref="multipleTableRef" border :data="tableData" class="table"
:class="{ height: tableData.length > 8 }">
<el-table-column type="selection" width="55" />
<el-table-column prop="depetId_dictText" label="所属部门" />
<el-table-column prop="workOn" label="学号" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="capacityName" label="能力名称" />
<el-table-column prop="value" label="能力值" />
<el-table-column label="操作" width="120">
<template #default="scope"></template>
</el-table-column>
<template #empty>
<el-empty description="暂无数据" />
</template>
</el-table>
<div class="pagin-box">
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="pagInfo.currentPage"
v-model:page-size="pagInfo.pageSize" :page-sizes="[10, 50, 80, 100]"
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="pagInfo.total"
@change="getTableList" />
</div>
</div>
</el-card>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { getlEvaluateApi } from '@/api/person';
import { ElMessage } from 'element-plus'
// loading
const isLoading = ref(true)
//
const pagInfo = reactive({
currentPage: 1,
pageSize: 10,
total: 0
})
//
const tableData = reactive<any[]>([]);
const setTableData = (arr: any[]) => {
tableData.length = 0;
tableData.push(...arr);
}
async function getTableList() {
try {
isLoading.value = true;
const res: any = await getlEvaluateApi({ pageNo: pagInfo.currentPage, pageSize: pagInfo.pageSize })
pagInfo.total = res.result.total;
setTableData(res.result.records);
} catch (error) {
ElMessage.error('请求失败');
} finally {
isLoading.value = false;
}
}
getTableList();
</script>
<style lang="scss" scoped>
.fill {
padding-top: 80px;
}
.banner {
width: 100%;
height: 289;
background: linear-gradient(90deg, #FFFFFF 0%, #F0F8FF 100%);
padding: 21px 0 37px 225px;
.box {
width: 1515px;
height: 231px;
display: flex;
gap: 104px;
justify-content: space-between;
align-items: center;
.title-box {
width: 1151px;
.title {
height: 59px;
font-family: Open Sans, Open Sans;
font-weight: bold;
font-size: 42px;
color: #333333;
line-height: 59px;
}
.text {
margin-top: 20px;
font-family: Open Sans, Open Sans;
font-weight: 400;
font-size: 20px;
color: #666666;
line-height: 23px;
}
}
.img-box {
img {
object-fit: cover;
}
}
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.personalAbilityEvaluationCollectList {
.table-list {
.table-box {
position: relative;
.table {
--el-table-header-bg-color: #fafafa;
width: 100%;
&.height {
height: 375px;
}
}
.pagin-box {
width: 100%;
height: 64px;
display: flex;
align-items: center;
.pagination {
padding: 0 24px;
:deep() {
.el-pagination__total {
margin-right: auto;
}
li.number.is-active {
background-color: #42D9AC;
color: rgba(255, 255, 255, 0.9);
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
}
span.el-pagination__jump {
background-color: #F3F3F3;
padding: 2px 8px;
}
}
}
}
}
}
}
</style>

@ -0,0 +1,211 @@
<template>
<div id="rander-chart">
</div>
</template>
<script lang='ts' setup>
import echarts from '@/utils/echarts';
import { onMounted,nextTick } from 'vue'
const props = defineProps({
data: {
type: Array,
default: [
{
text: '前言探索',
value: 0,
},
{
capacityName: '奠定基础',
value: 0,
},
{
capacityName: '知识分析',
value: 0,
},
{
capacityName: '社会责任',
value: 0,
},
{
capacityName: '独立思考',
value: 0,
},
{
capacityName: '拓宽视野',
value: 0,
},
{
capacityName: '激发兴趣',
value: 0,
},
{
capacityName: '沟通协调',
value: 0,
},
{
capacityName: '设计开发',
value: 0,
},
{
capacityName: '研判分析',
value: 0,
},
{
capacityName: '创新能力',
value: 0,
},
{
capacityName: '团队协作',
value: 0,
},
],
},
});
const throttle = (fn: any) => {
let timer: any;
return function () {
if (timer) {
return;
}
timer = setTimeout(() => {
fn();
clearTimeout(timer);
timer = null;
}, 1000);
};
};
let Data = props.data
console.log(Data, props.data);
nextTick(() => {
// @ts-ignore
const myChart = echarts.init(document.getElementById("rander-chart"));
console.log(Data,1111);
// var legendData = ['']; //
var indicator =Data.map(item => {
return {name:item.capacityName,max:100}
});
var dataArr = [
{
value:Data.map(item => item.value),
name: '年度维度分析',
itemStyle: {
normal: {
lineStyle: {
color: "#55d7f2",
},
shadowColor: '#4A99FF',
shadowBlur: 10,
},
},
areaStyle: {
normal: {
//
color: {
type: "linear",
x: 1, //
y: 0, //
x2: 1, //
y2: 1, //
colorStops: [
{
offset: 0,
color: "#1890ff",
},
{
offset: 1,
color: "#1890ff",
},
],
globalCoord: false,
},
opacity: 1, //
},
},
},
];
var colorArr = ["#fff", "#fff"]; //
const option :any= {
backgroundColor: "transparent",
color: colorArr,
// legend: {
// orient: "vertical",
// // icon: 'circle', //
// // data: legendData,
// top: 0,
// left: 20,
// itemWidth: 8, // [ default: 25 ]
// itemHeight: 8, // [ default: 14 ]
// itemGap: 22, // [ default: 10 ]
// textStyle: {
// fontSize: 12,
// fontWeight: "bold",
// color: "#00E4FF",
// },
// },
tooltip: {
trigger: 'item'
},
radar: {
radius: "60%",
// shape: 'circle',
name: {
textStyle: {
color: "#9ca4a6",
fontSize: 12,
},
},
indicator: indicator,
splitArea: {
// grid
show: true,
areaStyle: {
//
color: ["rgba(255,255,255,0)", "rgba(255,255,255,0)"], //
},
},
axisLine: {
//线
lineStyle: {
color: "#2a5f61",
},
},
splitLine: {
lineStyle: {
color: "#2a5f61", // 线
width: 1, // 线线
},
},
},
series: [
{
type: "radar",
symbolSize: 6,
symbol: "circle",
data: dataArr,
},
],
};
myChart.setOption(option);
let resize = throttle(() => {
myChart.resize();
});
window.addEventListener("resize", resize);
})
onMounted(() => {
});
</script>
<style lang='less' scoped>
#rander-chart{
width: 100%;
height:450px;
}
</style>

@ -0,0 +1,382 @@
<template>
<div class="fill"></div>
<div style="padding: 30px 18.6vw 0; width: 100%;margin: auto;">
<!-- 年度<j-dict-select-tag placeholder="请选择年度" v-model:value="annualid" dictCode="annual,annual_name,id" /> -->
</div>
<div class="personage">
<h1 class="title">机电学院比赛个人报告</h1>
<div class="rebuild">
<div @click="Rebuild">重新生成报告</div>
</div>
<p class="paragraph">
我是比赛综述全面落实立德树人根本任务依据CDIO工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力具有终身学习和创新创业意识国际交流能力团队合作精神等良好素养能适应产业与社会变革的国际化应用型人
</p>
<el-row class="card-box" :gutter="16" type="flex" justify="space-between">
<el-col :span="12">
<el-card class="card1">
<div class="title">
<div class="left">参加比赛项目数量</div>
<div class="right">
<SvgIcon size="20" name="content" />
</div>
</div>
<div class="name">{{ data.cjbsxmsl }}</div>
<div class="total" style="margin-top: 10px">
<div class="two">国家级{{ data.gjj }}</div>
<div class="three">省级{{ data.shengj }}</div>
<div class="three">市级{{ data.shij }}</div>
<div class="three">校级{{ data.xj }}</div>
</div>
</el-card>
</el-col>
<el-col :span="12">
<el-card class="card1">
<div class="title">
<div class="left">获奖数</div>
<div class="right">
<SvgIcon size="20" name="content" />
</div>
</div>
<div class="name">{{ data.hjNumber }}</div>
<div class="total" style="grid-template-columns: repeat(5, 1fr)">
<div class="one">一等{{ data.ydjNumber }}</div>
<div class="two">二等{{ data.edjNumber }}</div>
<div class="three">三等{{ data.sdjNumber }}</div>
<div class="two">四等{{ data.sidjNumber }}</div>
<div class="three">五等{{ data.wdjNumber }}</div>
</div>
</el-card>
</el-col>
</el-row>
<p class="paragraph">
个人综合素质综述全面落实立德树人根本任务依据CDIO工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力具有终身学习和创新创业意识国际交流能力团队合作精神等良好素养能适应产业与社会变革的国际化应用型人
</p>
<img src="../../assets/images/card.png" alt="">
<el-row class="card-box" :gutter="[50, 50]" type="flex">
<el-col :xs="24" :xl="12">
<p class="paragraph">
个人综合素质综述全面落实立德树人根本任务依据CDIO工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力具有终身学习和创新创业意识国际交流能力团队合作精神等良好素养能适应产业与社会变革的国际化应用型人
</p>
</el-col>
<el-col :xs="24" :xl="12">
<div class="ec-box">
<div class="title-box">
<div class="tit">年度维度分析</div>
</div>
<randerChart></randerChart>
</div>
</el-col>
</el-row>
<img src="../../assets/images/card.png" alt="">
<p class="paragraph">
我是比赛参赛情况综述全面落实立德树人根本任务依据CDIO工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力具有终身学习和创新创业意识国际交流能力团队合作精神等良好素养能适应产业与社会变革的国际化应用型人
</p>
<div class="table-box" style="min-height: 500px;">
<h1 class="title-pons">个人比赛获奖情况</h1>
<el-table :data="data.allApList" class="table" :class="{ height: data.allApList.length > 8 }">
<el-table-column prop="jxname" label="奖项名称" />
<el-table-column prop="ndbs" label="年度比赛" />
<el-table-column prop="ndbsxm" label="年度比赛项目" />
<el-table-column prop="dwname" label="所在队伍名称" />
<el-table-column prop="jf" label="积分" />
<template #empty>
<el-empty description="暂无数据" />
</template>
</el-table>
</div>
</div>
</template>
<script lang='ts' setup>
// import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import randerChart from './components/randerChart.vue';
import { ElLoading } from 'element-plus'
import { getXsfxbgApi } from '@/api/person';
import { ref, watch } from 'vue';
type allApList = {
jxname: string
ndbs: string
ndbsxm: string
dwname: string
jf: string
}[] | []
const data = ref<any>({
cjbsxmsl: 0,
gjj: 0,
shengj: 0,
shij: 0,
xj: 0,
hjNumber: 0,
ydjNumber: 0,
edjNumber: 0,
sdjNumber: 0,
sidjNumber: 0,
wdjNumber: 0,
allApList: [] as allApList
})
let loading: any;
const setLoading = () => {
const col = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)',
})
loading = col;
setTimeout(() => { col.close() }, 3000); // 33
} // loading
const cloLoading = () => { if (loading) loading.close(); } //loading
getXsfxbgApi().then((res: any) => {
data.value = res.result
setLoading();
}).finally(cloLoading);
const Rebuild = async () => {
setLoading();
const res: any = await getXsfxbgApi({ recreateFlag: true, annualid: annualid.value })
data.value = res.result
cloLoading();
}
const annualid = ref('')
watch(() => annualid.value, () => {
Rebuild()
})
</script>
<style lang='scss' scoped>
@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap');
* {
font-family: "Roboto", sans-serif;
font-weight: 300;
font-style: normal;
line-height: 3;
}
.title-pons {
font-size: 30px;
text-align: center;
padding-bottom: 30px;
line-height: initial;
}
.table{
font-size: 16px;
}
.fill {
padding-top: 80px;
}
.loading {
width: 100%;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.rebuild {
display: flex;
justify-content: center;
div {
cursor: pointer;
}
}
.personage {
padding: 0 18.6vw 60px;
width: 100%;
margin: auto;
&>* {
margin: 50px 0;
}
&>img {
margin: -50px 0;
}
&>.title {
text-align: center;
font-size: 35px;
font-weight: bolder;
}
.paragraph {
font-size: 16px;
text-indent: 2em;
}
.card {
width: 100%;
.inner {
height: 0;
padding-top: 40%;
position: relative;
.container {
position: absolute;
inset: 0;
border-radius: 5px;
border: 1px solid;
line-height: 1;
display: flex;
.fl-box {
height: 80%;
margin: auto;
margin-left: 25px;
display: flex;
flex-direction: column;
justify-content: space-between;
.tit {
color: #a0a0a0;
}
.center {
font-size: 30px;
font-weight: bolder;
}
.info {
display: flex;
justify-content: space-between;
}
}
}
}
}
.ec-box {
width: 100%;
border-radius: 2px 2px 2px 2px;
border: 1px solid #000;
.title-box {
height: 58px;
border-radius: 2px 2px 0px 0px;
box-shadow: 0px 1px 2px 0px #707070;
display: flex;
.tit {
margin-left: 4%;
height: 58px;
line-height: 58px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
}
}
}
.table-box {
border: 1px solid;
padding: 40px 20px;
table {
width: 100%;
caption {
caption-side: top;
padding-bottom: 20px;
text-align: center;
color: #000;
font-size: 26px;
}
thead {
text-align: left;
color: rgb(160 160 160);
}
tr {
text-align: left;
border-bottom: 1px solid rgb(219, 216, 216);
th,
td {
padding: 10px 0;
}
th:first-child {
text-align: center;
}
td:last-child {
color: rgb(64, 51, 253);
}
}
}
}
/** */
.card1 {
--el-card-padding: 0;
&,
* {
line-height: initial;
}
:deep() {
.el-card__body {
display: flex;
flex-direction: column;
justify-content: space-between;
}
}
width: 100%;
height: 182px;
// background-color: #ffffff00;
border: 1px solid #ccc;
padding: 20px;
.title {
display: flex;
width: 100%;
justify-content: space-between;
.left {
font-size: 14px;
color: #fff;
color: rgba(0, 0, 0, 0.45);
}
}
.name {
font-size: 42px;
font-weight: 500;
color: #000;
margin: 10px 0;
}
.total {
font-size: 16px;
color: #000;
// display: flex;
width: 100%;
display: grid;
grid-template-columns: repeat(4, 1fr);
/* 创建两列,每列宽度相等 */
grid-template-rows: repeat(2, 10px);
/* 创建四行,每行高度固定为100px */
gap: 10px;
div {
// width: 25%;
}
}
}
}
</style>

@ -0,0 +1,626 @@
<template>
<!-- 报名信息确认页面 团队 -->
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">报名信息确认</div>
<div class="text">
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
</div>
</div>
<div class="img-box">
<img src="../../assets/images/applyImg.png" alt="">
</div>
</div>
</div>
<div class="registration-layout">
<div class="top">
<!-- 比赛信息 -->
<el-card class="com">
<div class="title">比赛信息</div>
<div class="content">
<div class="card-annual">
<div class="annual">2023年度</div>
<div class="title-box">
<div class="text">河南省大学生创新创业大赛</div>
<img src="../../assets/images/编组.png" alt="">
</div>
</div>
<div class="right">
<div class="info-box">
<div class="name">比赛年度</div>
<div class="title">2024年度</div>
<div class="name">比赛名称</div>
<div class="title">河南省大学生创新创业大赛</div>
<div class="date-box">
<div class="label">开始报名时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
<div class="date-box">
<div class="label">开始截至时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
</div>
</div>
</div>
</el-card>
<!-- 项目信息 -->
<el-card class="com">
<div class="title">项目信息</div>
<div class="content track">
<div class="card-annual">
<p>红色之旅赛道</p>
</div>
<div class="right">
<div class="info-box">
<div class="name">项目名称</div>
<div class="title">红色之旅赛道</div>
<div class="name">要求人数</div>
<div class="title">1</div>
<div class="date-box">
<div class="label">开始报名时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
<div class="date-box">
<div class="label">开始截至时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
</div>
</div>
</div>
</el-card>
</div>
<el-card class="center">
<div class="personage-info">
<div class="head">
<div class="title">个人信息</div>
<div class="icon">
<img src="../../assets/images/ellipsis.png" alt="">
</div>
</div>
<div class="info-box">
<div class="label">姓名</div>
<div class="text">王不留行</div>
</div>
<div class="info-box">
<div class="label">姓别</div>
<div class="text"></div>
</div>
<div class="info-box">
<div class="label">学号</div>
<div class="text">2023010236</div>
</div>
<div class="info-box">
<div class="label">手机号</div>
<div class="text">17725633652</div>
</div>
<div class="info-box">
<div class="label">院系</div>
<div class="text">国际教育学院</div>
</div>
<div class="info-box">
<div class="label">专业</div>
<div class="text">软件工程</div>
</div>
<div class="info-box">
<div class="label">指导老师</div>
<div class="text">令狐冲</div>
</div>
<div class="info-box">
<div class="label">所属团队</div>
<div class="text">王不留行的团队</div>
</div>
<div class="info-box remark">
<div class="label">其它备注</div>
<div class="text"></div>
</div>
</div>
</el-card>
<el-card class="list" :body-style="{ padding: 0 }">
<div class="head">
<div class="left">
<el-button class="btn" type="primary">添加队员</el-button>
<div class="text">已选2位</div>
</div>
<div class="right">
<el-input v-model="input" style="width: 280px" placeholder="请输入学号进行搜索" suffix-icon="Search" />
</div>
</div>
<div class="table-box">
<el-table ref="multipleTableRef" border :data="tableData" class="table">
<el-table-column type="selection" width="55" />
<el-table-column property="stuNum" label="学号" sortable />
<el-table-column property="name" label="姓名" sortable />
<el-table-column property="department" label="院系" sortable />
<el-table-column property="phone" label="手机号" sortable />
</el-table>
<div class="pagin-box">
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="pagInfo.currentPage"
v-model:page-size="pagInfo.pageSize" :page-sizes="[10, 20, 30, 40]"
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="pagInfo.total"
@change="handleChange" />
</div>
</div>
</el-card>
<div class="bottom">
<el-button class="btn">取消报名</el-button>
<el-button class="btn cyan">确认报名</el-button>
</div>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
const input = ref('');
interface User {
id: number // id
stuNum: string //
name: string //
department: string //
phone: string //
}
const tableData: User[] = [
{
id: 1,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 2,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 3,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 4,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 4,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 4,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 4,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 4,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
{
id: 4,
stuNum: '20230101',
name: '张三',
department: '软件工程',
phone: '13598664456',
},
]
//
const pagInfo = reactive({
currentPage: 1,
pageSize: 10,
total: 400
})
function handleChange(currentPage: number, pageSize: number) {
console.log(currentPage, pageSize);
}
</script>
<style lang="scss" scoped>
.fill {
padding-top: 80px;
}
.banner {
width: 100%;
height: 289;
background: linear-gradient(90deg, #FFFFFF 0%, #F0F8FF 100%);
padding: 21px 0 37px 225px;
.box {
width: 1515px;
height: 231px;
display: flex;
gap: 104px;
justify-content: space-between;
align-items: center;
.title-box {
width: 1151px;
.title {
height: 59px;
font-family: Open Sans, Open Sans;
font-weight: bold;
font-size: 42px;
color: #333333;
line-height: 59px;
}
.text {
margin-top: 20px;
font-family: Open Sans, Open Sans;
font-weight: 400;
font-size: 20px;
color: #666666;
line-height: 23px;
}
}
.img-box {
img {
object-fit: cover;
}
}
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.registration-layout {
margin-top: 20px;
margin: 0 auto;
width: 1397px;
&>* {
background: #FFFFFF;
}
.top {
display: flex;
justify-content: space-between;
margin: 25px 0;
height: 300px;
.com {
width: 685px;
height: 300px;
border-radius: 6px 6px 6px 6px;
padding-top: 22px;
padding-left: 32px;
.title {
height: 28px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 20px;
color: rgba(0, 0, 0, 0.9);
line-height: 28px;
margin-bottom: 18px;
}
margin-right: 22px;
.content {
display: flex;
gap: 22px;
.card-annual {
padding: 28px 0 0 28px;
width: 340px;
height: 182px;
background: linear-gradient(90deg, #21ACA5 0%, #42D9AC99 100%);
border-radius: 8px;
overflow: hidden;
.annual {
height: 19px;
font-family: Inter, Inter;
font-weight: bold;
font-size: 16px;
color: rgba(255, 255, 255, 0.8);
line-height: 19px;
}
.title-box {
margin-top: 13px;
display: flex;
align-items: center;
gap: 28px;
.text {
width: 202px;
font-family: Inter, Inter;
font-weight: normal;
font-size: 32px;
color: #FFFFFF;
line-height: 39px;
}
}
}
.right {
.info-box {
.name {
height: 20px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: #ACACAC;
line-height: 20px;
margin-bottom: 8px;
}
.title {
height: 20px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 20px;
color: #333333;
line-height: 20px;
margin-bottom: 12px;
}
.date-box {
margin-bottom: 12px;
display: flex;
align-items: center;
.label {
height: 20px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: #ACACAC;
line-height: 20px;
}
.date {
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 18px;
color: #333333;
}
}
}
}
}
.track {
.card-annual {
background: url(../../assets/images/item.png) no-repeat;
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
padding: 0;
p {
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 40px;
color: #76DAE5;
}
}
}
}
}
.center {
height: 388px;
border-radius: 6px 6px 6px 6px;
margin-bottom: 25px;
.personage-info {
margin: 30px 0 0 32px;
width: 780px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
row-gap: 32px;
.head {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
.title {
height: 28px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 20px;
color: rgba(0, 0, 0, 0.9);
line-height: 28px;
}
.icon {
padding: 5px;
cursor: pointer;
}
}
.info-box {
&.remark {
width: 377.333px;
}
width: 176px;
height: 60px;
display: flex;
flex-direction: column;
justify-content: space-between;
.label {
height: 22px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: rgba(0, 0, 0, 0.4);
line-height: 22px;
}
.text {
height: 22px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
line-height: 22px;
}
}
}
}
.list {
.head {
padding: 32px;
height: 96px;
background: #FFFFFF;
box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 0px 0px;
display: flex;
justify-content: space-between;
align-items: center;
&>* {
height: 32px;
}
.left {
display: flex;
gap: 12px;
align-items: center;
.btn {
height: 32px;
width: 88px;
background: #42D9AC;
border-radius: 3px 3px 3px 3px;
border: none;
}
.text {
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: rgba(0, 0, 0, 0.4);
}
}
}
.table-box {
.table {
width: 100%;
height: 276px;
}
.pagin-box {
width: 100%;
height: 64px;
display: flex;
align-items: center;
.pagination {
padding: 0 24px;
:deep() {
.el-pagination__total {
margin-right: auto;
}
li.number.is-active {
background-color: #42D9AC;
color: rgba(255, 255, 255, 0.9);
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
}
span.el-pagination__jump {
background-color: #F3F3F3;
padding: 2px 8px;
}
}
}
}
}
}
.bottom {
margin: 46px 0;
height: 70px;
display: flex;
gap: 106px;
justify-content: center;
align-items: center;
.btn {
--color1: #FFF4CE;
--color2: #FF6B6B;
width: 387px;
height: 69px;
border-radius: 69px;
border: none;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 24px;
color: #FFFFFF;
background: linear-gradient(to right, var(--color1), var(--color2));
box-shadow: 7px 7px 22px -10px rgba(0, 0, 0, 0.22);
transition: all 0.2s;
&:hover {
transform: scale(1.1);
}
&.cyan {
--color1: #00D0D0;
--color2: #42D9AC;
}
}
}
}
</style>

@ -0,0 +1,441 @@
<template>
<!-- 报名信息确认页面 个人 -->
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">报名信息确认</div>
<div class="text">
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
</div>
</div>
<div class="img-box">
<img src="../../assets/images/applyImg.png" alt="">
</div>
</div>
</div>
<div class="registration-layout">
<div class="top">
<!-- 比赛信息 -->
<el-card class="com">
<div class="title">比赛信息</div>
<div class="content">
<div class="card-annual">
<div class="annual">2023年度</div>
<div class="title-box">
<div class="text">河南省大学生创新创业大赛</div>
<img src="../../assets/images/编组.png" alt="">
</div>
</div>
<div class="right">
<div class="info-box">
<div class="name">比赛年度</div>
<div class="title">2024年度</div>
<div class="name">比赛名称</div>
<div class="title">河南省大学生创新创业大赛</div>
<div class="date-box">
<div class="label">开始报名时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
<div class="date-box">
<div class="label">开始截至时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
</div>
</div>
</div>
</el-card>
<!-- 项目信息 -->
<el-card class="com">
<div class="title">项目信息</div>
<div class="content track">
<div class="card-annual">
<p>红色之旅赛道</p>
</div>
<div class="right">
<div class="info-box">
<div class="name">项目名称</div>
<div class="title">红色之旅赛道</div>
<div class="name">要求人数</div>
<div class="title">1</div>
<div class="date-box">
<div class="label">开始报名时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
<div class="date-box">
<div class="label">开始截至时间</div>
<div class="date">2323.6.1 18:00</div>
</div>
</div>
</div>
</div>
</el-card>
</div>
<el-card class="center">
<div class="personage-info">
<div class="head">
<div class="title">个人信息</div>
<div class="icon">
<img src="../../assets/images/ellipsis.png" alt="">
</div>
</div>
<div class="info-box">
<div class="label">姓名</div>
<div class="text">王不留行</div>
</div>
<div class="info-box">
<div class="label">姓别</div>
<div class="text"></div>
</div>
<div class="info-box">
<div class="label">学号</div>
<div class="text">2023010236</div>
</div>
<div class="info-box">
<div class="label">手机号</div>
<div class="text">17725633652</div>
</div>
<div class="info-box">
<div class="label">院系</div>
<div class="text">国际教育学院</div>
</div>
<div class="info-box">
<div class="label">专业</div>
<div class="text">软件工程</div>
</div>
<div class="info-box">
<div class="label">指导老师</div>
<div class="text">令狐冲</div>
</div>
<div class="info-box">
<div class="label">所属团队</div>
<div class="text">王不留行的团队</div>
</div>
<div class="info-box remark">
<div class="label">其它备注</div>
<div class="text"></div>
</div>
</div>
</el-card>
<div class="bottom">
<el-button class="btn">取消报名</el-button>
<el-button class="btn cyan">确认报名</el-button>
</div>
</div>
</template>
<script lang="ts" setup>
</script>
<style lang="scss" scoped>
.fill {
padding-top: 80px;
}
.banner {
width: 100%;
height: 289;
background: linear-gradient(90deg, #FFFFFF 0%, #F0F8FF 100%);
padding: 21px 0 37px 225px;
.box {
width: 1515px;
height: 231px;
display: flex;
gap: 104px;
justify-content: space-between;
align-items: center;
.title-box {
width: 1151px;
.title {
height: 59px;
font-family: Open Sans, Open Sans;
font-weight: bold;
font-size: 42px;
color: #333333;
line-height: 59px;
}
.text {
margin-top: 20px;
font-family: Open Sans, Open Sans;
font-weight: 400;
font-size: 20px;
color: #666666;
line-height: 23px;
}
}
.img-box {
img {
object-fit: cover;
}
}
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.registration-layout {
margin-top: 20px;
margin: 0 auto;
width: 1397px;
&>* {
background: #FFFFFF;
}
.top {
display: flex;
justify-content: space-between;
margin: 25px 0;
height: 300px;
.com {
width: 685px;
height: 300px;
border-radius: 6px 6px 6px 6px;
padding-top: 22px;
padding-left: 32px;
.title {
height: 28px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 20px;
color: rgba(0, 0, 0, 0.9);
line-height: 28px;
margin-bottom: 18px;
}
margin-right: 22px;
.content {
display: flex;
gap: 22px;
.card-annual {
padding: 28px 0 0 28px;
width: 340px;
height: 182px;
background: linear-gradient(90deg, #21ACA5 0%, #42D9AC99 100%);
border-radius: 8px;
overflow: hidden;
.annual {
height: 19px;
font-family: Inter, Inter;
font-weight: bold;
font-size: 16px;
color: rgba(255, 255, 255, 0.8);
line-height: 19px;
}
.title-box {
margin-top: 13px;
display: flex;
align-items: center;
gap: 28px;
.text {
width: 202px;
font-family: Inter, Inter;
font-weight: normal;
font-size: 32px;
color: #FFFFFF;
line-height: 39px;
}
}
}
.right {
.info-box {
.name {
height: 20px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: #ACACAC;
line-height: 20px;
margin-bottom: 8px;
}
.title {
height: 20px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 20px;
color: #333333;
line-height: 20px;
margin-bottom: 12px;
}
.date-box {
margin-bottom: 12px;
display: flex;
align-items: center;
.label {
height: 20px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: #ACACAC;
line-height: 20px;
}
.date {
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 18px;
color: #333333;
}
}
}
}
}
.track {
.card-annual {
background: url(../../assets/images/item.png) no-repeat;
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
padding: 0;
p {
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 40px;
color: #76DAE5;
}
}
}
}
}
.center {
height: 388px;
border-radius: 6px 6px 6px 6px;
margin-bottom: 25px;
position: relative;
.personage-info {
margin: 30px 0 0 32px;
width: 780px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
row-gap: 32px;
.head {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
.title {
height: 28px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 20px;
color: rgba(0, 0, 0, 0.9);
line-height: 28px;
}
.icon {
padding: 5px;
cursor: pointer;
position: absolute;
right: 30px;
}
}
.info-box {
&.remark {
width: 377.333px;
}
width: 176px;
height: 60px;
display: flex;
flex-direction: column;
justify-content: space-between;
.label {
height: 22px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: rgba(0, 0, 0, 0.4);
line-height: 22px;
}
.text {
height: 22px;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: 400;
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
line-height: 22px;
}
}
}
}
.bottom {
margin: 46px 0;
height: 70px;
display: flex;
gap: 106px;
justify-content: center;
align-items: center;
.btn {
--color1: #FFF4CE;
--color2: #FF6B6B;
width: 387px;
height: 69px;
border-radius: 69px;
border: none;
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 24px;
color: #FFFFFF;
background: linear-gradient(to right, var(--color1), var(--color2));
box-shadow: 7px 7px 22px -10px rgba(0, 0, 0, 0.22);
transition: all 0.2s;
&:hover {
transform: scale(1.1);
}
&.cyan {
--color1: #00D0D0;
--color2: #42D9AC;
}
}
}
}
</style>

@ -0,0 +1,12 @@
<template>
<div class="container-1420">1</div>
</template>
<script lang='ts' setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
</script>
<style lang='scss' scoped>
</style>
Loading…
Cancel
Save