fwb 8 months ago
commit 0efbfb66fb
  1. 2
      package.json
  2. 8
      pnpm-lock.yaml
  3. 10
      src/Layout/tabbar/index.vue
  4. 14
      src/api/person.ts
  5. 23
      src/api/race.ts
  6. 1
      src/assets/icons/荣誉资质.svg
  7. 21
      src/permissions.ts
  8. 80
      src/router/module/constRouter/index.ts
  9. 2
      src/store/module/user.ts
  10. 73
      src/views/competition/index.vue
  11. 11
      src/views/home/index.vue
  12. 2
      src/views/personalReport/components/randerChart.vue
  13. 174
      src/views/projectName/index.vue
  14. 13
      src/views/raceInfo/index.vue
  15. 22
      src/views/registrationPersonage/index.vue
  16. 583
      src/views/userInfo/index.vue

@ -19,7 +19,7 @@
"@element-plus/icons-vue": "^2.3.1",
"axios": "^1.6.8",
"echarts": "5.3.2",
"element-plus": "^2.6.2",
"element-plus": "^2.8.3",
"pinia": "^2.1.7",
"postcss-plugin-px2rem": "^0.8.1",
"px2rem-loader": "^0.1.9",

@ -11,8 +11,8 @@ dependencies:
specifier: 5.3.2
version: 5.3.2
element-plus:
specifier: ^2.6.2
version: 2.6.2(vue@3.4.21)
specifier: ^2.8.3
version: 2.8.3(vue@3.4.21)
pinia:
specifier: ^2.1.7
version: 2.1.7(typescript@5.2.2)(vue@3.4.21)
@ -1984,8 +1984,8 @@ packages:
resolution: {integrity: sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==}
dev: true
/element-plus@2.6.2(vue@3.4.21):
resolution: {integrity: sha512-WFMv1v83l437Xu+GeeM+ytxd9VUQpR4418BowvTVIPYItsoj6yK0ITIuSv19iCesF405FbAOaCIHXhJch0ilFA==}
/element-plus@2.8.3(vue@3.4.21):
resolution: {integrity: sha512-BXQOyDf0s7JHyNEV8iaO+iaOzTZPsBXVKMzMI967vLCodUBDLrtiY5vglAn1YEebQcUOEUMhGcttTpIvEkcBjQ==}
peerDependencies:
vue: ^3.2.0
dependencies:

@ -28,11 +28,11 @@
</div>
<div class="right" v-else>
<div class="avater">
<img src="../../assets/images/default.png" alt="" />
<img :src="setImageUrl(useUserStore.userInfo.avatar)" alt="" />
</div>
<el-dropdown style="width:.625rem">
<span class="el-dropdown-link">
{{ useUserStore.userInfo.username }}
{{ useUserStore.userInfo.realname }}
<el-icon class="el-icon--right">
<arrow-down />
</el-icon>
@ -71,6 +71,9 @@ onMounted(() => {
const layout = async () => {
useUserStore.layOut()
}
const setImageUrl = (url: string) => {
return import.meta.env.VITE_APP_BASE_API + "/sys/common/static/" + url
}
</script>
<style lang="scss" scoped>
@ -174,8 +177,11 @@ const layout = async () => {
.avater {
width: 35px;
height: 35px;
border-radius: 50%;
overflow: hidden;
img {
width: 100%;
height: 100%;
}
margin-right: 20px;
}

@ -1,15 +1,12 @@
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',
PAGE_XSFXBG = '/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/xsfxbg', // 个人能力报告
competition = '/AnnualCompPoint/annualCompPoint/findcompp', // 比赛项目列表
competitionOne = '/AnnualCompPoint/annualCompPoint/findcomppxq', // 比赛项目单个
}
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 });
@ -18,4 +15,7 @@ export const getXsfxbgApi = (params = {}) => {
const par = { recreateFlag: false, annualid: '' };
Object.assign(par, params);
return request.get(api.PAGE_XSFXBG, { params: par });
};
};
export const getCompetitionApi = (id: string) => request.get(api.competition, { params: { id } });
export const getCompetitionOneApi = (id: string) => request.get(api.competitionOne, { params: { id } });

@ -27,4 +27,27 @@ export const getRaceInfo = (params:any) => {
url:'/comp/comp/complistnoxq',
params
})
}
// 获取院系列表
export const getFaculties = (params:any) => {
return request({
url:'/sys/sysDepart/queryDepartStuTreeSync',
params
})
}
// 上传文件
export const uploadFile = (data:any) => {
return request({
url:'/sys/common/upload',
method:'POST',
data
})
}
// 修改用户信息
export const editUserInfoApi = (data:any) => {
return request({
url:'/sys/user/login/setting/userEdit',
method:'POST',
data
})
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 39 KiB

@ -1,6 +1,16 @@
import router from '@/router/index'
import userStore from './store/module/user'
// 定义要求登录访问的名单
const asyncRouterName = [
'UserInfo',
'RegistrationPersonage',
'RegistrationGroup',
]
const asyncRouter = (path: string) => {
return asyncRouterName.includes(path)
}
router.beforeEach(async (to, form, next) => {
const useuserStore = userStore()
@ -11,13 +21,16 @@ router.beforeEach(async (to, form, next) => {
if (!Object.keys(useuserStore.userInfo).length) {
useuserStore.getUserInfo()
next()
}else{
} else {
next()
}
}
}else{
next()
} else {
if (asyncRouter(to.name as string)) {
next('/login')
} else {
next()
}
}
})
export default router

@ -19,36 +19,36 @@ export const constRouter: any = {
hidden: false,
},
},
{
path: '/appraise',
name: 'Appraise',
component: () => import('@/views/appraise/index.vue'),
meta: {
icon: '',
title: '竞赛评价',
hidden: false,
},
},
{
path: '/navigation',
name: 'Navigation',
component: () => import('@/views/navigation/index.vue'),
meta: {
icon: '',
title: '竞赛导航',
hidden: false,
},
},
{
path: '/achievement',
name: 'Achievement',
component: () => import('@/views/achievement/index.vue'),
meta: {
icon: '',
title: '竞赛成果',
hidden: false,
},
},
// {
// path: '/appraise',
// name: 'Appraise',
// component: () => import('@/views/appraise/index.vue'),
// meta: {
// icon: '',
// title: '竞赛评价',
// hidden: false,
// },
// },
// {
// path: '/navigation',
// name: 'Navigation',
// component: () => import('@/views/navigation/index.vue'),
// meta: {
// icon: '',
// title: '竞赛导航',
// hidden: false,
// },
// },
// {
// path: '/achievement',
// name: 'Achievement',
// component: () => import('@/views/achievement/index.vue'),
// meta: {
// icon: '',
// title: '竞赛成果',
// hidden: false,
// },
// },
{
path: '/competition',
name: 'Competition',
@ -66,7 +66,7 @@ export const constRouter: any = {
meta: {
icon: '',
title: '报名信息确认/团队',
hidden: false,
hidden: true,
},
},
{
@ -76,7 +76,7 @@ export const constRouter: any = {
meta: {
icon: '',
title: '报名信息确认/个人',
hidden: false,
hidden: true,
},
},
{
@ -129,7 +129,7 @@ export const constRouter: any = {
meta: {
icon: '',
title: '个人积分管理',
hidden: false,
hidden: true,
},
},
{
@ -139,7 +139,7 @@ export const constRouter: any = {
meta: {
icon: '',
title: '个人能力评价',
hidden: false,
hidden: true,
},
},
{
@ -149,7 +149,7 @@ export const constRouter: any = {
meta: {
icon: '',
title: '个人能力报告',
hidden: false,
hidden: true,
},
},
{
@ -162,5 +162,15 @@ export const constRouter: any = {
hidden: true,
},
},
{
path: '/projectName',
name: 'ProjectName',
component: () => import('@/views/projectName/index.vue'),
meta: {
icon: '',
title: '比赛项目名称',
hidden: true,
},
},
],
}

@ -23,7 +23,7 @@ const userStore = defineStore('defineStore', {
this.userInfo = res.result.userInfo
ElNotification({
title: '登录成功',
message: '欢迎回来' + this.userInfo.username,
message: '欢迎回来' + this.userInfo.realname,
type: 'success',
})
}

@ -4,7 +4,7 @@
<div class="banner">
<img src="../../assets/images/banner2.png" alt="">
</div>
<div class="competition">
<div class="competition" v-loading="loading">
<!-- 简介 -->
<div class="synopsis">
<div class="name">年度比赛名称</div>
@ -27,32 +27,35 @@
</div>
<div class="card-list">
<template v-for="i in 16" :key="i">
<div v-if="(i + 4) % 4 == 1" class="card" type="yellow">
<div class="top">红色之旅赛道</div>
<template v-for="o, i in dataList" :key="o.id">
<div v-if="(i + 5) % 4 == 1" class="card" type="yellow">
<div class="top" :title="o.objName">{{ o.objName }}</div>
<div class="bottom">
<el-button class="btn">立即报名</el-button>
<el-button class="btn" @click="goProjectName(o.id)">立即报名</el-button>
<el-link :underline="false" class="link">详情</el-link>
</div>
</div>
<div v-if="(i + 4) % 4 == 2" class="card" type="purple">
<div class="top">红色之旅赛道</div>
<div v-else-if="(i + 5) % 4 == 2" class="card" type="purple">
<div class="top" :title="o.objName">{{ o.objName }}</div>
<div class="bottom">
<el-button class="btn">立即报名</el-button>
<el-button class="btn" @click="goProjectName(o.id)">立即报名</el-button>
<el-link :underline="false" class="link">详情</el-link>
</div>
</div>
<div v-if="(i + 4) % 4 == 3" class="card" type="cyan00">
<div class="top">红色之旅赛道</div>
<div v-else-if="(i + 5) % 4 == 3" class="card" type="cyan00">
<div class="top" :title="o.objName">{{ o.objName }}</div>
<div class="bottom">
<el-button class="btn">立即报名</el-button>
<el-button class="btn" @click="goProjectName(o.id)">立即报名</el-button>
<el-link :underline="false" class="link">详情</el-link>
</div>
</div>
<div v-if="(i + 4) % 4 == 0" class="card" type="orange">
<div class="top">红色之旅赛道</div>
<div v-else-if="(i + 5) % 4 == 0" class="card" type="orange">
<div class="top" :title="o.objName">{{ o.objName }}</div>
<div class="bottom">
<el-button class="btn">立即报名</el-button>
<el-button class="btn" @click="goProjectName(o.id)">立即报名</el-button>
<el-link :underline="false" class="link">详情</el-link>
</div>
</div>
@ -87,7 +90,44 @@
</div>
</template>
<script setup>
<script lang="ts" setup>
import { getCompetitionApi } from '@/api/person';
import { ref, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { ElMessage, ElLoading } from 'element-plus';
const route = useRoute();
const router = useRouter();
// loading
const loading = ref(false);
let loadingInstance: any;
watch(loading, newVal => {
if (newVal) loadingInstance = ElLoading.service({ fullscreen: true });
else if (loadingInstance) loadingInstance.close();
});
//
const dataList = ref<any[]>([]);
async function getList() {
try {
loading.value = true;
const res: any = await getCompetitionApi(route.query.id as string);
if (!res.result) return
dataList.value = res.result;
} catch (error) {
ElMessage.error('请求失败');
} finally {
loading.value = false;
}
}
getList();
//
function goProjectName(id: any) {
router.push(`/projectName?id=${id}`)
}
</script>
<style lang="scss" scoped>
@ -198,6 +238,9 @@
font-family: Microsoft YaHei UI, Microsoft YaHei UI;
font-weight: bold;
font-size: 24px;
text-wrap: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.bottom {

@ -5,7 +5,7 @@
<div class="description">
<div v-html="reacProjectList[0].compName"></div>
</div>
<div class="application gradient">立即报名</div>
<div class="application gradient" @click="toDetail(reacProjectList[0].id)">立即报名</div>
<div class="nav-title">
<div class="top">竞赛导航</div>
<div class="bottom">30+项目登陆后报名</div>
@ -71,6 +71,7 @@
import { ref } from 'vue'
import { getRaceList } from '@/api/race'
import { useRouter } from 'vue-router';
import { ElLoading } from 'element-plus'
const router = useRouter()
const reacProjectList = ref<any>([])
const isLoading = ref(false)
@ -81,12 +82,18 @@ const getRaceProjectListEvent = async () => {
pageNo: 1,
pageSize: 8,
}
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(255, 255, 255, 0.7)',
})
const res: any = await getRaceList(page)
console.log(res)
reacProjectList.value = res.result.slice(0, 8)
console.log(reacProjectList.value, 'reacProjectList.value ')
isLoading.value = true
loading.close()
}
getRaceProjectListEvent()
const active = ref(1)
@ -116,7 +123,7 @@ const toDetail = (id: number) => {
// rgba(255, 255, 255, 1) 50%
// );
background: url('../../assets/images/banner1.png') no-repeat;
background-size: contain;
background-size: cover;
display: flex;
flex-direction: column;
justify-content: center;

@ -203,7 +203,7 @@ onMounted(() => {
});
</script>
<style lang='less' scoped>
<style lang='scss' scoped>
#rander-chart{
width: 100%;
height:450px;

@ -0,0 +1,174 @@
<!-- 比赛项目名称页面 -->
<template>
<div class="fill"></div>
<div class="banner">
<img src="../../assets/images/banner2.png" alt="">
</div>
<div class="project-name">
<!-- 面包屑 -->
<div class="bread-box">
<el-breadcrumb separator-icon="ArrowRight">
<template v-for="r in route.matched" :key="r.path">
<el-breadcrumb-item v-if="r.path !== '/projectName'" :to="{ path: r.path }">
{{ r.meta.title }}
</el-breadcrumb-item>
<el-breadcrumb-item v-else>
{{ r.meta.title }}
</el-breadcrumb-item>
</template>
</el-breadcrumb>
</div>
<div class="content">
<div class="title">{{ data.objName }}</div>
<div class="text" v-html="data.introduce"></div>
<div class="foot">
<el-checkbox v-model="checked" label="我已完成阅读并全部知悉项目比赛规则" size="large" />
</div>
</div>
<div class="btn-box">
<el-btutton class="btn" @click="handleSub">立刻报名</el-btutton>
</div>
</div>
</template>
<script setup lang="ts">
import { getCompetitionOneApi } from '@/api/person';
import { ref, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { ElMessage, ElLoading } from 'element-plus';
const route = useRoute();
const router = useRouter();
// loading
const loading = ref(false);
let loadingInstance: any;
watch(loading, newVal => {
if (newVal) loadingInstance = ElLoading.service({ fullscreen: true });
else if (loadingInstance) loadingInstance.close();
});
//
const data = ref<Record<any, any>>({});
async function getData() {
if (!route.query.id) return
try {
loading.value = true;
const res: any = await getCompetitionOneApi(route.query.id as string);
if (!res.result) return
data.value = res.result;
} catch (error) {
ElMessage.error('请求失败');
} finally {
loading.value = false;
}
}
//
const checked = ref(false);
//
function handleSub() {
if (!checked.value) {
ElMessage({
message: '请先同意',
type: 'warning',
})
return
}
router.push({ path: '/registrationPersonage', query: { id: route.query.id } })
}
getData();
</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: 2;
}
.project-name {
margin: 0 auto;
width: $base-container-width;
.bread-box {
margin: 40px 0;
}
.content {
.title {
text-align: center;
font-size: 42px;
color: #333333;
margin: 20px 0;
}
.text {
font-size: 18px;
color: #666666;
text-indent: 2em;
}
.foot {
margin: 120px 0 20px;
display: flex;
align-items: center;
gap: 110px;
}
}
.btn-box {
display: flex;
justify-content: center;
margin-top: 80px;
.btn {
--color1: #00D0D0;
--color2: #42D9AC;
cursor: pointer;
text-align: center;
width: 470px;
height: 50px;
border-radius: 45px;
border: none;
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);
}
}
}
}
.fill {
padding-top: 80px;
}
.banner {
width: 100%;
height: 367px;
border-radius: 0px 0px 0px 0px;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
</style>

@ -75,11 +75,11 @@
</li>
<li>
<div class="label">负责部门:</div>
<div class="text">{{ raceInfo.dept }}</div>
<div class="text">{{ raceInfo.comporderc }}</div>
</li>
<li style="width: 33%">
<div class="label">比赛类型:</div>
<div class="text">A</div>
<div class="text">{{ raceInfo.compTypeId }}</div>
</li>
<li style="width: 33%">
<div class="label">比赛权重:</div>
@ -94,14 +94,15 @@
</div>
<div class="center">
<div class="label">比赛简介:</div>
<div class="deaceiption">
亲爱的同学们老师们以及各位编程爱好者们
<div class="deaceiption" >
{{ raceInfo.compInfo }}
<!-- 亲爱的同学们老师们以及各位编程爱好者们
在这个充满创新与挑战的时代一场精彩纷呈的大学生编程大赛即将拉开帷幕
本次大学生编程大赛是智慧与技能的激烈碰撞是创意与实践的完美结合它为广大有才华有梦想的大学生们提供了一个展现自我超越自我的广阔舞台
在这里你将与来自不同高校不同专业的编程高手们同场竞技大家将用代码编织梦想用算法开拓未来无论是擅长网页开发移动应用编程还是热衷于数据分析人工智能算法设计都能在这个舞台上找到属于自己的一片天地
大赛不仅考验选手们的编程技术水平更注重创新思维和解决实际问题的能力在比赛过程中选手们将面临各种复杂的问题和挑战需要运用所学知识发挥创造力提出独特而有效的解决方案
同时本次大赛也为同学们提供了一个与行业专家企业代表交流互动的机会他们将带来最前沿的技术资讯和行业动态为同学们的未来发展提供宝贵的建议和指导
来吧亲爱的大学生们加入这场编程的盛宴释放你的无限潜力用代码书写属于你们的辉煌篇章让我们一起见证新一代编程之星的诞生
来吧亲爱的大学生们加入这场编程的盛宴释放你的无限潜力用代码书写属于你们的辉煌篇章让我们一起见证新一代编程之星的诞生 -->
</div>
<div class="label">附件:</div>
<div class="file">
@ -158,7 +159,7 @@ const getRaceProjectListEvent = async () => {
}
getRaceProjectListEvent()
const setImageUrl = (url: string) => {
return import.meta.env.VITE_APP_BASE_API + url
return import.meta.env.VITE_APP_BASE_API + "/sys/common/static/" + url
}
//
const raceInfo = ref<any>({})

@ -84,22 +84,22 @@
</div>
<div class="info-box">
<div class="label">姓名</div>
<div class="text">王不留行</div>
<div class="text">{{ info.realname }}</div>
</div>
<div class="info-box">
<div class="label">姓别</div>
<div class="text"></div>
<div class="text">{{ pasSex(info.sex) }}</div>
</div>
<div class="info-box">
<div class="label">学号</div>
<div class="text">2023010236</div>
<div class="text">{{ info.workNo }}</div>
</div>
<div class="info-box">
<div class="label">手机号</div>
<div class="text">17725633652</div>
<div class="text">{{ info.phone }}</div>
</div>
<div class="info-box">
@ -137,6 +137,20 @@
</template>
<script lang="ts" setup>
import { toRef } from 'vue';
import userStore from '@/store/module/user';
const user = userStore();
const info = toRef(user.userInfo);
console.log("🚀 ~ info:", user.userInfo)
//
function pasSex(num: number) {
if (num == 1) return '男'
else if (num == 2) return '女'
else return '保密'
}
</script>
<style lang="scss" scoped>

@ -1,12 +1,587 @@
<template>
<div class="container-1420">1</div>
<div class="top-bg">
<h1 class="title">个人中心</h1>
<div class="desc">{{ userInfo.realname }}欢迎回来~</div>
<div class="icon">
<SvgIcon name="荣誉资质" width="300" height="300" />
</div>
</div>
<div class="container-1420">
<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>
<div class="user-info-main">
<div class="left">
<div class="personage-info">
<div class="head">
<div class="title">个人信息</div>
<div class="icon">
<el-button type="primary" link @click="editUserInfo">
编辑
</el-button>
</div>
</div>
<div class="info-box">
<div class="text">
<!-- <img style="width: 75px; height:75px ;" src="../../assets/images/item.png" alt="" srcset=""> -->
<el-image
style="width: 100px; height: 100px"
:src="setImageUrl(userInfo.avatar)"
:preview-src-list="[
setImageUrl(userInfo.avatar),
]"
/>
</div>
</div>
<div class="info-box">
<div class="label">姓名</div>
<div class="text">{{ userInfo.realname }}</div>
</div>
<div class="info-box">
<div class="label">姓别</div>
<div class="text">{{ userInfo.sex === 1 ? '男' : '女' }}</div>
</div>
<div class="info-box">
<div class="label">学号</div>
<div class="text">{{ userInfo.workNo }}</div>
</div>
<div class="info-box">
<div class="label">手机号</div>
<div class="text">{{ userInfo.phone }}</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">{{ userInfo.email }}</div>
</div>
</div>
</div>
<div class="right">
<div
class="personalAbilityEvaluationCollectList gradient"
@click="Router.push('/personalAbilityEvaluationCollectList')"
>
个人积分管理
</div>
<div
class="personalAbilityEvaluationCollectList gradient"
@click="Router.push('/personalEvaluateList')"
>
个人能力评价
</div>
<div
class="personalAbilityEvaluationCollectList gradient"
@click="Router.push('/personalReport')"
>
个人能力报告
</div>
</div>
</div>
</el-card>
</div>
<el-dialog
v-model="dialogVisible"
v-if="dialogVisible"
title="编辑"
width="35%"
:before-close="handleClose"
>
<el-form :model="form" label-width="80" style="padding-right: 30px">
<el-form-item label="头像">
<el-upload
v-model:file-list="fileList"
action="#"
list-type="picture-card"
:auto-upload="false"
>
<el-icon><Plus /></el-icon>
</el-upload>
</el-form-item>
<el-form-item label="姓名">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="部门">
<el-cascader
:props="props"
style="width: 100%"
v-model="form.facultiesId"
/>
</el-form-item>
<el-form-item label="生日">
<el-date-picker
v-model="form.birthday"
type="date"
placeholder="选择日期"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="性别">
<el-radio-group v-model="form.sex">
<el-radio :value="1" size="large"></el-radio>
<el-radio :value="0" size="large"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="邮箱">
<el-input v-model="form.email" />
</el-form-item>
<el-form-item label="手机号">
<el-input v-model="form.phone" type="number" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script lang='ts' setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
<script lang="ts" setup>
import { nextTick, onMounted, reactive, ref, toRefs, watch } from 'vue'
import { useRouter } from 'vue-router'
import userStore from '@/store/module/user'
import { getFaculties, uploadFile, editUserInfoApi } from '@/api/race'
import { id } from 'element-plus/es/locale/index.mjs'
const useUserStore = userStore()
const userInfo = ref<any>({})
console.log(useUserStore.userInfo, 'useUserStore')
userInfo.value = useUserStore.userInfo
const Router = useRouter()
const dialogVisible = ref(false)
//
const editUserInfo = () => {
form.name = userInfo.value.realname
form.birthday = userInfo.value.birthday
form.sex = userInfo.value.sex
form.email = userInfo.value.email
// form.facultiesId = userInfo.value.facultiesId
form.phone = userInfo.value.phone
dialogVisible.value = true
nextTick(() => {
fileList.value = [
{
url: setImageUrl(userInfo.value.avatar),
},
]
})
}
const handleClose = () => {
dialogVisible.value = false
}
const form = reactive({
name: '',
birthday: '',
sex: '',
email: '',
facultiesId: '',
phone: '',
})
//
const fileList = ref<any>([])
const avatar = ref<any>('')
const uploadFileEvent = async () => {
const fromData = new FormData()
fromData.append('file', fileList.value[0].raw)
const res: any = await uploadFile(fromData)
avatar.value = res.message
console.log(res, 'res')
}
//
const submit = async () => {
if (fileList.value[0].hasOwnProperty('raw')) {
await uploadFileEvent()
}
const data: any = {
id: userInfo.value.id,
realname: form.name,
birthday: form.birthday,
sex: form.sex,
email: form.email,
facultiesId: form.facultiesId,
phone: form.phone,
avatar: avatar.value,
}
for (const key in data) {
if (data[key] === '') {
delete data[key]
}
}
await editUserInfoApi(data)
useUserStore.getUserInfo()
dialogVisible.value = false
}
onMounted(() => {})
//
const FacultiesList = ref<any>([])
const getFacultiesList = async (data: any) => {
const res: any = await getFaculties(data)
console.log(res, 'res')
FacultiesList.value = res.result
}
//
const props = {
lazy: true,
checkStrictly: true,
emitPath: false,
async lazyLoad(node: any, resolve: any) {
await getFacultiesList({
primaryKey: 'key',
pid: node.value,
})
const nodes = FacultiesList.value.map((item: any) => ({
value: item.id,
label: item.title,
}))
resolve(nodes)
},
}
watch(
() => fileList.value,
(newVal, oldVal) => {
console.log(newVal, oldVal)
if (newVal.length === 1) {
;(document.querySelector('.el-upload') as HTMLElement).style.display =
'none'
} else {
setTimeout(() => {
;(document.querySelector('.el-upload') as HTMLElement).style.display =
'flex'
}, 0)
}
},
)
const setImageUrl = (url: string) => {
return import.meta.env.VITE_APP_BASE_API + '/sys/common/static/' + url
}
</script>
<style lang="scss" scoped>
.top-bg {
position: relative;
width: 100%;
height: 290px;
background-color: #fff;
background: linear-gradient(90deg, #ffffff 0%, #f0f8ff 100%);
margin-top: 80px;
padding: 20px 320px;
display: flex;
flex-direction: column;
justify-content: center;
.title {
font-size: 32px;
font-weight: 700;
}
.desc {
margin-top: 20px;
font-size: 16px;
}
.icon {
position: absolute;
right: 300px;
}
}
.top {
display: flex;
justify-content: space-between;
margin: 25px 0;
height: 300px;
.com {
width: 697px;
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;
}
}
}
}
}
.user-info-main {
width: 100%;
height: 300px;
display: flex;
.left {
flex: 1;
.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: 80px;
display: flex;
flex-direction: column;
justify-content: space-between;
<style lang='scss' scoped>
.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;
}
}
}
}
.right {
width: 300px;
padding: 25px;
// background-color: pink;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
.personalAbilityEvaluationCollectList {
width: 180px;
// background-color: pink;
height: 38px;
text-align: center;
line-height: 38px;
font-size: 16px;
border-radius: 10px;
color: #fff;
cursor: pointer;
transition: all 0.2s;
}
.personalAbilityEvaluationCollectList:hover {
transform: scale(1.1);
}
}
}
</style>

Loading…
Cancel
Save