代码格式化

main
JayChou 7 months ago
parent 0cbec0df8a
commit d0ea2d0976
  1. 8
      .env.production
  2. 83
      README.md
  3. 1
      package.json
  4. 11
      src/Layout/footer/index.vue
  5. 40
      src/Layout/index.vue
  6. 8
      src/Layout/main/index.vue
  7. 106
      src/Layout/tabbar/components/item.vue
  8. 45
      src/Layout/tabbar/index.vue
  9. 12
      src/api/news.ts
  10. 141
      src/api/person.ts
  11. 10
      src/api/setting.ts
  12. 46
      src/api/user.ts
  13. 13
      src/directives/defaultImage.ts
  14. 6
      src/main.ts
  15. 4
      src/permissions.ts
  16. 8
      src/router/index.ts
  17. 17
      src/router/module/constRouter/defineRouter.ts
  18. 5
      src/router/module/constRouter/index.ts
  19. 3
      src/store/module/user.ts
  20. 101
      src/utils/asyncHint.ts
  21. 19
      src/utils/echarts.ts
  22. 226
      src/utils/rem.js
  23. 1
      src/utils/requset.ts
  24. 4
      src/utils/token.ts
  25. 11
      src/views/404/index.vue
  26. 11
      src/views/achievement/index.vue
  27. 11
      src/views/appraise/index.vue
  28. 2
      src/views/competition/index.vue
  29. 24
      src/views/home/index.vue
  30. 18
      src/views/login/index.vue
  31. 24
      src/views/login/registered.vue
  32. 11
      src/views/navigation/index.vue
  33. 56
      src/views/news/components/newsDetail.vue
  34. 63
      src/views/news/index.vue
  35. 296
      src/views/personalAbilityEvaluationCollectList/index.vue
  36. 302
      src/views/personalEvaluateList/index.vue
  37. 206
      src/views/personalReport/components/randerChart.vue
  38. 638
      src/views/personalReport/index.vue
  39. 281
      src/views/projectName/index.vue
  40. 63
      src/views/raceInfo/index.vue
  41. 25
      src/views/raceList/index.vue
  42. 134
      src/views/registrationGroup copy/components/dalog.vue
  43. 110
      src/views/registrationGroup copy/components/edit.vue
  44. 230
      src/views/registrationGroup copy/components/infoList.vue
  45. 996
      src/views/registrationGroup copy/index.vue
  46. 223
      src/views/registrationGroup/components/stuDialog.vue
  47. 265
      src/views/registrationGroup/components/stuList.vue
  48. 220
      src/views/registrationGroup/components/teaDialog.vue
  49. 372
      src/views/registrationGroup/components/teaList.vue
  50. 3
      src/views/registrationGroup/index.vue
  51. 29
      src/views/userInfo/components/awardeList.vue
  52. 9
      src/views/userInfo/index.vue
  53. 8
      src/vite-env-override.d.ts
  54. 7
      tsconfig.json
  55. 15
      vite.config.ts

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

@ -2,73 +2,73 @@
#### 目录
----`leachinontecration olattorm temolate` ----模板名称
----`leachinontecration olattorm temolate` ----模板名称
----`node modules` ----依赖包
----`node modules` ----依赖包
----`public` ----静态文件相关
----`public` ----静态文件相关
----`scripts` ----项目钩子脚本文件
----`scripts` ----项目钩子脚本文件
----`src` ----根目录开发主要文件
----`src` ----根目录开发主要文件
----`api` ----接口文件
----`api` ----接口文件
----assets ----静态资源(图片图标)
----assets ----静态资源(图片图标)
----`copmonents` ----全局组件
----`copmonents` ----全局组件
----Layout ----layout固定组件
----Layout ----layout固定组件
----`router` ----路由
----`router` ----路由
----`store` ----仓库`pinia`
----`store` ----仓库`pinia`
----styles ----全局样式文件
----styles ----全局样式文件
----`index.scss` ----全局样式
----`index.scss` ----全局样式
----`variable.scss` ----全局`scss`变量
----`variable.scss` ----全局`scss`变量
----`utils` -----封装工具文件
----`utils` -----封装工具文件
----`request.ts` ----封装的请求文件
----`request.ts` ----封装的请求文件
----`views` ----页面文件
----`views` ----页面文件
----`App.vue` ----项目根组件
----`App.vue` ----项目根组件
----`main.ts` ----项目入口文件
----`main.ts` ----项目入口文件
----`permission.ts` ----路由拦截器文件
----`permission.ts` ----路由拦截器文件
----`.env.development` ----开发环境变量
----`.env.development` ----开发环境变量
----`.env.production` ----生产环境变量
----`.env.production` ----生产环境变量
----`.env.test` ----测试环境变量
----`.env.test` ----测试环境变量
----` .eslintignore` ----代码校验排除文件
----` .eslintignore` ----代码校验排除文件
----`.eslintrc.cjs` ----代码校验文件
----`.eslintrc.cjs` ----代码校验文件
----`.gitignore` ----`git`提交排除文件
----`.gitignore` ----`git`提交排除文件
----`.prettierignore` ----代码美化排除文件
----`.prettierignore` ----代码美化排除文件
----` .prettierrc.json` ----代码美化配置文件
----` .prettierrc.json` ----代码美化配置文件
----`.stylelintignore` ----`css`校验排除文件
----`.stylelintignore` ----`css`校验排除文件
----` .stylelintrc.cjs` ----`css`校验文件
----` .stylelintrc.cjs` ----`css`校验文件
----`index.html` ----挂载点
----`index.html` ----挂载点
----`package.json` ----项目配置文件
----`package.json` ----项目配置文件
----`tsconfig.json` ----`TypeScript`配置文件
----`tsconfig.json` ----`TypeScript`配置文件
----`vite.config.ts` ----打包配置文件
----`vite.config.ts` ----打包配置文件
#### 图标组件
@ -77,7 +77,7 @@
用法:
```vue
<div><SvgIcon name="home" color="pink" width="50px" height="50px"/></div>
<div><SvgIcon name="home" color="pink" width="50px" height="50px"/></div>
<!--
name:图标名称
color:图标颜色
@ -87,7 +87,7 @@
-->
```
`svg`图标下载 https://www.iconfont.cn/
`svg`图标下载 https://www.iconfont.cn/
选择图标下载`svg`格式修改文件名引入文件即可使用
@ -161,7 +161,6 @@ let props = defineProps(["info",'money']);
</pre>
```
当前代码级给pre标签绑定原生DOM事件点击事件,默认会给事件回调注入event事件对象。当然点击事件想注入多个参数可以按照下图操作。但是切记注入的事件对象务必叫做$event.
```
@ -218,8 +217,6 @@ const handler = () => {
let $emit = defineEmits(["xxx",'click']);
```
### 1.3全局事件总线
全局事件总线可以实现任意组件通信,在vue2中可以根据VM与VC关系推出全局事件总线。
@ -252,8 +249,6 @@ v-model指令可是收集表单数据(数据双向绑定),除此之外它也
<Child v-model:pageNo="msg" v-model:pageSize="msg1"></Child>
```
### 1.5useAttrs
在Vue3中可以利用useAttrs方法获取组件的属性与事件(包含:原生DOM事件或者自定义事件),次函数功能类似于Vue2框架中$attrs属性与$listeners方法。
@ -273,12 +268,8 @@ let $attrs = useAttrs();
</script>
```
### 1.6ref与$parent
ref,提及到ref可能会想到它可以获取元素的DOM或者获取子组件实例的VC。既然可以在父组件内部通过ref获取子组件实例VC,那么子组件内部的方法与响应式数据父组件可以使用的。
比如:在父组件挂载完毕获取组件实例
@ -489,4 +480,4 @@ let todos = ref([
</style>
```
##
##

@ -7,6 +7,7 @@
"dev": "vite --open",
"build:test": "vite build",
"build:pro": "vue-tsc && vite build --mode production",
"build": " vite build --mode production",
"preview": "vite preview",
"lint": "eslint src",
"fix": "eslint src --fix",

@ -5,12 +5,9 @@
<div class="item">联系我们</div>
<div class="item">服务协议</div>
</div>
<div class="copyright">
源码自然版权所有@2023 湘豫CP备 19005950-1
</div>
<div class="copyright">源码自然版权所有@2023 湘豫CP备 19005950-1</div>
<div class="report">
违法和不良信息举报 举报电话0xxx-8xxxxxxx 举报邮箱xxxxxxxxx@qq.com
</div>
</div>
</template>
@ -50,11 +47,11 @@ import {} from 'vue'
color: #0bd7c6;
}
}
.copyright{
.copyright {
margin-top: 80px;
}
.report{
margin-top: .1042rem;
.report {
margin-top: 0.1042rem;
}
}
</style>

@ -37,19 +37,19 @@ const scrollToTop = () => {
}, 500)
}
const scrollTop = () => {
window.scrollTo({
top: 0,
left: 0,
behavior: 'smooth',
});
setTimeout(() => {
show.value = false
},1500);
setTimeout(() => {
show.value = true
flog.value = false
num = 800
},1600);
window.scrollTo({
top: 0,
left: 0,
behavior: 'smooth',
})
setTimeout(() => {
show.value = false
}, 1500)
setTimeout(() => {
show.value = true
flog.value = false
num = 800
}, 1600)
}
let num = 800
onMounted(() => {
@ -59,7 +59,7 @@ onMounted(() => {
// console.log(high,totop.value.offsetTop)
if (flog.value) {
num = num - 40
num = num - 40
totop.value.style.top = num + 'px'
return
}
@ -82,20 +82,20 @@ onMounted(() => {
.gotop {
display: none;
width: 45PX;
height: 45PX;
width: 45px;
height: 45px;
z-index: 999;
position: fixed;
bottom: 50px;
right: 50px;
background-image: url('../assets/images/jinglingtu.png');
background-position: -264PX -78PX;
background-position: -264px -78px;
transition: top 0.2s linear;
animation: show 0.5s ease-in-out;
}
.gotop:hover {
transition: background-image 0.2s ease-in;
background-position: -215PX -78PX;
background-position: -215px -78px;
}
.bian {
animation: bian 0.1s ease-in-out;
@ -116,10 +116,10 @@ onMounted(() => {
}
@keyframes bian {
0% {
background-position: -6PX -145PX;
background-position: -6px -145px;
}
100% {
background-position: -316PX -78PX;
background-position: -316px -78px;
}
}
// @keyframes fei {

@ -9,11 +9,9 @@
<script lang="ts" setup>
import {} from 'vue'
import {useRoute } from 'vue-router'
import { useRoute } from 'vue-router'
const $route = useRoute()
console.log( $route);
console.log($route)
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped></style>

@ -1,63 +1,63 @@
<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>
<!-- 根据路由动态生成菜单 -->
<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>
<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"
<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>
<el-icon>
<component :is="item.meta.icon"></component>
</el-icon>
<span>{{ item.meta.title }}</span>
<span>{{ item.children[0].meta.title }}</span>
</template>
<Item :menuList="item.children" />
</el-sub-menu>
</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>
<script lang="ts" setup>
import { useRouter } from 'vue-router'
//
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>
</template>
<script lang="ts" setup>
import { useRouter } from 'vue-router'
//
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>

@ -4,8 +4,12 @@
<div class="left">
<div class="logo-box">
<div class="lesson">
<img :src="setImageUrl(logoUrl)" alt="" v-default-image="'/src/assets/images/LOGO.png'">
<!-- <img src="../../assets/images/LOGO.png" alt=""> -->
<img
:src="setImageUrl(logoUrl)"
alt=""
v-default-image="'/src/assets/images/LOGO.png'"
/>
<!-- <img src="../../assets/images/LOGO.png" alt=""> -->
</div>
</div>
@ -16,8 +20,8 @@
mode="horizontal"
:ellipsis="false"
>
<Item :menu-list="constRouter.children"/>
</el-menu>
<Item :menu-list="constRouter.children" />
</el-menu>
<!-- <ul>
<li v-for="(item, index) in constRouter.children" :key="index">
{{ item.meta.title }}
@ -26,14 +30,20 @@
</div>
</div>
<div class="right" v-if="!useUserStore.token">
<div class="registered gradient" @click="$router.push('/login')">注册</div>
<div class="registered gradient" @click="$router.push('/login')">
注册
</div>
<div class="login" @click="$router.push('/login')">登录</div>
</div>
<div class="right" v-else>
<div class="avater">
<img :src="setImageUrl(useUserStore.userInfo.avatar)" alt="" v-default-image="'/src/assets/images/default.png'"/>
<img
:src="setImageUrl(useUserStore.userInfo.avatar)"
alt=""
v-default-image="'/src/assets/images/default.png'"
/>
</div>
<el-dropdown style="width:.625rem">
<el-dropdown style="width: 0.625rem">
<span class="el-dropdown-link">
{{ useUserStore.userInfo.realname }}
<el-icon class="el-icon--right">
@ -42,7 +52,9 @@
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="$router.push('/user-info')">个人中心</el-dropdown-item>
<el-dropdown-item @click="$router.push('/user-info')">
个人中心
</el-dropdown-item>
<el-dropdown-item @click="layout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
@ -58,7 +70,7 @@ import { useRouter, useRoute } from 'vue-router'
import { onMounted, ref } from 'vue'
import userStore from '@/store/module/user'
import Item from './components/item.vue'
import {getLogo} from '@/api/setting'
import { getLogo } from '@/api/setting'
const useUserStore = userStore()
const $router = useRouter()
const $route = useRoute()
@ -76,16 +88,15 @@ const layout = async () => {
useUserStore.layOut()
}
const setImageUrl = (url: string) => {
return import.meta.env.VITE_APP_BASE_API + "/sys/common/static/" + url
return import.meta.env.VITE_APP_BASE_API + '/sys/common/static/' + url
}
// logo
const logoUrl = ref<string>('')
const getLogoSetting = async() => {
const res:any = await getLogo()
console.log(res,'res');
const getLogoSetting = async () => {
const res: any = await getLogo()
console.log(res, 'res')
logoUrl.value = res.result.logo
}
getLogoSetting()
</script>
@ -108,7 +119,7 @@ getLogoSetting()
font-size: 30px;
font-weight: bolder;
color: #1d2129;
img{
img {
width: 40px;
height: 40px;
}
@ -273,11 +284,11 @@ getLogoSetting()
align-items: center;
}
}
:deep(.el-menu){
:deep(.el-menu) {
background-color: transparent;
border-bottom: none;
}
:deep(.el-menu-item){
:deep(.el-menu-item) {
background-color: transparent;
border-bottom: none;
}

@ -1,15 +1,15 @@
import request from '@/utils/requset'
//获取新闻栏目
export const getColumnListApi = () => {
return request({
url:'/cms/front/getColumnList'
})
return request({
url: '/cms/front/getColumnList',
})
}
//根据栏目id获取新闻列表
export function queryEssayListApi(columnId) {
return request.get(`/cms/front/getArticleListByColumn?columnId=${columnId}`);
return request.get(`/cms/front/getArticleListByColumn?columnId=${columnId}`)
}
//根据点击的新闻id获取新闻详细信息
export function queryEssayApi(id) {
return request.get(`/cms/front/getByArticleTitle?id=${id}`);
}
return request.get(`/cms/front/getByArticleTitle?id=${id}`)
}

@ -1,94 +1,103 @@
import req1 from '@/utils/requset';
import { AxiosInstance } from 'axios';
import req1 from '@/utils/requset'
import { AxiosInstance } from 'axios'
function copyRequest(req1: AxiosInstance, instanceConfig = {}) {
let request: AxiosInstance, copyStatus: boolean;
try {
// @ts-ignore
const req2 = req1.create(instanceConfig);
function acopyInterceptors(target: any, interceptorManager: any) {
const handlers = interceptorManager.handlers;
for (let index = 0; index < handlers?.length; index++) {
const { fulfilled, rejected, runWhen, synchronous } = handlers[index];
let options;
if (synchronous !== false || runWhen !== null) options = { synchronous, runWhen };
target.use(fulfilled, rejected, options)
}
}
acopyInterceptors(req2.interceptors.request, req1.interceptors.request);
acopyInterceptors(req2.interceptors.response, req1.interceptors.response);
request = req2;
copyStatus = true;
} catch (error) {
console.warn('拷贝失败,私有拦截器可能失效:\n', error);
request = req1;
copyStatus = false;
let request: AxiosInstance, copyStatus: boolean
try {
// @ts-ignore
const req2 = req1.create(instanceConfig)
function acopyInterceptors(target: any, interceptorManager: any) {
const handlers = interceptorManager.handlers
for (let index = 0; index < handlers?.length; index++) {
const { fulfilled, rejected, runWhen, synchronous } = handlers[index]
let options
if (synchronous !== false || runWhen !== null)
options = { synchronous, runWhen }
target.use(fulfilled, rejected, options)
}
}
acopyInterceptors(req2.interceptors.request, req1.interceptors.request)
acopyInterceptors(req2.interceptors.response, req1.interceptors.response)
request = req2
copyStatus = true
} catch (error) {
console.warn('拷贝失败,私有拦截器可能失效:\n', error)
request = req1
copyStatus = false
}
return { request, copyStatus };
return { request, copyStatus }
}
const { request, copyStatus } = copyRequest(req1);
const { request, copyStatus } = copyRequest(req1)
// 若拷贝成功,添加自己独有的拦截器
if (copyStatus) {
request.interceptors.response.use((response: any) => {
if (response.code >= 200 && response.code < 300) return response;
else return Promise.reject(response);
})
request.interceptors.response.use((response: any) => {
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', // 个人能力报告
competition = '/AnnualCompPoint/annualCompPoint/findcompp', // 比赛项目列表
competitionOne = '/AnnualCompPoint/annualCompPoint/findcomppxq', // 比赛项目单个
signUp = '/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/edit', // 年度比赛项目报名 POST
membersList = '/online/cgreport/api/getData/1696139786651197442', // 团队成员列表
adviserList = '/online/cgreport/api/getData/1828357196360998913', // 指导老师列表
listStudent = '/AnnualCompPoint/annualCompPoint/listStudent', // 比赛项目报名表
findndbswxq = '/annualcomp/annualComp/findndbswxq', // 年度比赛详情
findcomppxq = '/AnnualCompPoint/annualCompPoint/findcomppxq', // 年度比赛项目详情
liststu = '/abilityEvaluation/personalAbilityEvaluationCollect/liststu', // 个人能力评价列表
integral = '/annualScore/personalCompTotalScore/liststu', // 个人积分列表
PAGE_XSFXBG = '/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/xsfxbg', // 个人能力报告
competition = '/AnnualCompPoint/annualCompPoint/findcompp', // 比赛项目列表
competitionOne = '/AnnualCompPoint/annualCompPoint/findcomppxq', // 比赛项目单个
signUp = '/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/edit', // 年度比赛项目报名 POST
membersList = '/online/cgreport/api/getData/1696139786651197442', // 团队成员列表
adviserList = '/online/cgreport/api/getData/1828357196360998913', // 指导老师列表
listStudent = '/AnnualCompPoint/annualCompPoint/listStudent', // 比赛项目报名表
findndbswxq = '/annualcomp/annualComp/findndbswxq', // 年度比赛详情
findcomppxq = '/AnnualCompPoint/annualCompPoint/findcomppxq', // 年度比赛项目详情
}
// http://10.115.2.247:3300/jeecgboot/AnnualCompPoint/annualCompPoint/listStudent?column=createTime&order=desc&pageNo=1&pageSize=10&_t=1727422864387
interface SignUpData {
annualCompid: string,
entryFormat: '团队' | '个人',
id: string,
instructorSheetList?: any[],
teamManagementList?: any[],
annualCompid: string
entryFormat: '团队' | '个人'
id: string
instructorSheetList?: any[]
teamManagementList?: any[]
}
interface MembersOrAdviser {
pageNo: number,
pageSize: number,
onlRepUrlParamStr: `annualCompid=${string}`,
entryFormat: '团队' | '个人',
id: string,
column?: string,
order?: 'asc' | 'desc'
pageNo: number
pageSize: number
onlRepUrlParamStr: `annualCompid=${string}`
entryFormat: '团队' | '个人'
id: string
column?: string
order?: 'asc' | 'desc'
}
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 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 });
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 } });
export const getCompetitionApi = (id: string) =>
request.get(api.competition, { params: { id } })
export const getCompetitionOneApi = (id: string) =>
request.get(api.competitionOne, { params: { id } })
export const getSignUpApi = (data: SignUpData) => request.post(api.signUp, data);
export const getSignUpApi = (data: SignUpData) => request.post(api.signUp, data)
export const getMembersList = (params: MembersOrAdviser) => request.get(api.membersList, { params });
export const getAdviserList = (params: MembersOrAdviser) => request.get(api.adviserList, { params });
export const getMembersList = (params: MembersOrAdviser) =>
request.get(api.membersList, { params })
export const getAdviserList = (params: MembersOrAdviser) =>
request.get(api.adviserList, { params })
export const getNdbswxqList = (id:string) => request.get(api.findndbswxq, { params:{id} });
export const getComppxqList = (id:string) => request.get(api.findcomppxq, { params:{id} });
export const getNdbswxqList = (id: string) =>
request.get(api.findndbswxq, { params: { id } })
export const getComppxqList = (id: string) =>
request.get(api.findcomppxq, { params: { id } })

@ -1,8 +1,8 @@
import request from '@/utils/requset'
export const getLogo = () => {
return request({
url:'/sysconfiguration/sysConfiguration/findconfig',
method:'POST',
})
}
return request({
url: '/sysconfiguration/sysConfiguration/findconfig',
method: 'POST',
})
}

@ -1,33 +1,33 @@
import request from '@/utils/requset'
export const getCode = (time:any) => {
return request({
url:'/sys/randomImage/' + time,
})
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 loginApi = (data: any) => {
return request({
url: '/sys/login',
method: 'POST',
data,
})
}
export const getUserInfoApi = () => {
return request({
url:'/sys/user/getUserInfo'
})
return request({
url: '/sys/user/getUserInfo',
})
}
export const logOut = () => {
return request({
url:'/sys/logout'
})
return request({
url: '/sys/logout',
})
}
// 注册
export const sturegister = (data:any) => {
return request({
url:'/sys/user/sturegister',
method:"POST",
data
})
}
export const sturegister = (data: any) => {
return request({
url: '/sys/user/sturegister',
method: 'POST',
data,
})
}

@ -1,9 +1,8 @@
export default {
mounted(el:any, binding:any) {
el.onerror = () => {
// 当图片加载失败时,设置默认图片
el.src = binding.value ||'/src/assets/images/item.png'; // 默认图片
};
mounted(el: any, binding: any) {
el.onerror = () => {
// 当图片加载失败时,设置默认图片
el.src = binding.value || '/src/assets/images/item.png' // 默认图片
}
};
},
}

@ -18,13 +18,13 @@ import pinia from '@/store/index'
// 引入路由
import router from './permissions'
import '@/utils/rem.js'
import defaultImage from '@/directives/defaultImage';
import defaultImage from '@/directives/defaultImage'
// 创建vue实例
const app = createApp(App)
app.use(pinia)
// 注册全局指令
app.directive('default-image', defaultImage);
app.directive('default-image', defaultImage)
// 注册element plus组件库
app.use(ElementPlus, {
locale: zhCn,
@ -41,4 +41,4 @@ import * as ElementPlusIconsVue from '@element-plus/icons-vue'
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
}

@ -13,11 +13,11 @@ const asyncRouter = (path: string) => {
}
router.beforeEach(async (to, form, next) => {
const useuserStore = userStore()
document.title = to.meta.title ? '高赛通-' + to.meta.title : '高赛通'
document.title = to.meta.title ? '高赛通-' + to.meta.title : '高赛通'
if (useuserStore.token) {
if (to.path === '/login') {
next({ path: '/' })
} else {
} else {
if (!Object.keys(useuserStore.userInfo).length) {
useuserStore.getUserInfo()
next()

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

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

@ -107,7 +107,7 @@ export const constRouter: any = {
icon: '',
title: '新闻内容详情',
hidden: true,
}
},
},
{
path: '/user-info',
@ -122,7 +122,8 @@ export const constRouter: any = {
{
path: '/personalAbilityEvaluationCollectList',
name: 'PersonalAbilityEvaluationCollectList',
component: () => import('@/views/personalAbilityEvaluationCollectList/index.vue'),
component: () =>
import('@/views/personalAbilityEvaluationCollectList/index.vue'),
meta: {
icon: '',
title: '个人积分管理',

@ -32,9 +32,8 @@ const userStore = defineStore('defineStore', {
try {
const res: any = await getUserInfoApi()
this.userInfo = res.result.userInfo
} catch (error:any) {
} catch (error: any) {
this.layOut()
}
},
async layOut() {

@ -1,63 +1,62 @@
import { ElMessage, MessageOptions } from "element-plus";
import { ElMessage, MessageOptions } from 'element-plus'
enum indexs {
fulfilled,
Rejected
fulfilled,
Rejected,
}
interface Options {
onFulfilled?: Function;
onRejected?: Function;
onFinish?: Function;
// 是否需要提示:[ 成功时的 , 失败时的]。
// 默认:[true, true]
isNeedPrompts?: boolean[];
// 提示配置:[成功时的 , 失败时的]
msgObjs?: MessageOptions[];
// 提示配置的快捷message配置:[ 成功时的 , 失败时的]。
// 默认:['成功', '失败']
msgs?: string[];
[key: string]: any;
onFulfilled?: Function
onRejected?: Function
onFinish?: Function
// 是否需要提示:[ 成功时的 , 失败时的]。
// 默认:[true, true]
isNeedPrompts?: boolean[]
// 提示配置:[成功时的 , 失败时的]
msgObjs?: MessageOptions[]
// 提示配置的快捷message配置:[ 成功时的 , 失败时的]。
// 默认:['成功', '失败']
msgs?: string[]
[key: string]: any
}
export function getHint(pro: Promise<any>, options: Options = {}) {
const ful = indexs.fulfilled;
const rej = indexs.Rejected;
const { isNeedPrompts, msgs } = options;
const opt: Options = {
...options,
isNeedPrompts: Object.assign([true, true], isNeedPrompts),
msgs: Object.assign(['成功', '失败'], msgs),
}
const onFulfilled = (res: any) => {
if (opt.isNeedPrompts?.[ful]) {
ElMessage({
message: opt.msgs?.[ful],
type: 'success',
...opt.msgObjs?.[ful]
});
}
if (opt.onFulfilled) opt.onFulfilled(res);
const ful = indexs.fulfilled
const rej = indexs.Rejected
const { isNeedPrompts, msgs } = options
const opt: Options = {
...options,
isNeedPrompts: Object.assign([true, true], isNeedPrompts),
msgs: Object.assign(['成功', '失败'], msgs),
}
const onFulfilled = (res: any) => {
if (opt.isNeedPrompts?.[ful]) {
ElMessage({
message: opt.msgs?.[ful],
type: 'success',
...opt.msgObjs?.[ful],
})
}
const onRejected = (err: Error) => {
if (opt.isNeedPrompts?.[rej]) {
ElMessage({
message: opt.msgs?.[rej],
type: 'error',
...opt.msgObjs?.[rej]
});
}
if (opt.onRejected) opt.onRejected(err);
}
const onFinish = () => {
if (opt.onFinish) opt.onFinish();
if (opt.onFulfilled) opt.onFulfilled(res)
}
const onRejected = (err: Error) => {
if (opt.isNeedPrompts?.[rej]) {
ElMessage({
message: opt.msgs?.[rej],
type: 'error',
...opt.msgObjs?.[rej],
})
}
pro.then(onFulfilled).catch(onRejected).finally(onFinish);
if (opt.onRejected) opt.onRejected(err)
}
const onFinish = () => {
if (opt.onFinish) opt.onFinish()
}
pro.then(onFulfilled).catch(onRejected).finally(onFinish)
return pro;
}
return pro
}

@ -1,6 +1,13 @@
import * as echarts from 'echarts/core';
import * as echarts from 'echarts/core'
import { BarChart, LineChart, PieChart, MapChart, PictorialBarChart, RadarChart } from 'echarts/charts';
import {
BarChart,
LineChart,
PieChart,
MapChart,
PictorialBarChart,
RadarChart,
} from 'echarts/charts'
import {
TitleComponent,
@ -17,11 +24,11 @@ import {
TimelineComponent,
CalendarComponent,
GraphicComponent,
} from 'echarts/components';
} from 'echarts/components'
// TODO 如果想换成SVG渲染,就导出SVGRenderer,
// 并且放到 echarts.use 里,注释掉 CanvasRenderer
import { /*SVGRenderer*/ CanvasRenderer } from 'echarts/renderers';
import { /*SVGRenderer*/ CanvasRenderer } from 'echarts/renderers'
echarts.use([
LegendComponent,
@ -46,6 +53,6 @@ echarts.use([
TimelineComponent,
CalendarComponent,
GraphicComponent,
]);
])
export default echarts;
export default echarts

@ -1,118 +1,136 @@
;(function (win, lib) {
var doc = win.document
var docEl = doc.documentElement
var metaEl = doc.querySelector('meta[name="viewport"]')
var flexibleEl = doc.querySelector('meta[name="flexible"]')
var dpr = 0
var scale = 0
var tid
var flexible = lib.flexible || (lib.flexible = {})
;(function(win, lib) {
var doc = win.document;
var docEl = doc.documentElement;
var metaEl = doc.querySelector('meta[name="viewport"]');
var flexibleEl = doc.querySelector('meta[name="flexible"]');
var dpr = 0;
var scale = 0;
var tid;
var flexible = lib.flexible || (lib.flexible = {});
if (metaEl) {
console.warn('将根据已有的meta标签来设置缩放比例');
var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
if (match) {
scale = parseFloat(match[1]);
dpr = parseInt(1 / scale);
}
} else if (flexibleEl) {
var content = flexibleEl.getAttribute('content');
if (content) {
var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
if (initialDpr) {
dpr = parseFloat(initialDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
if (maximumDpr) {
dpr = parseFloat(maximumDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
}
if (metaEl) {
console.warn('将根据已有的meta标签来设置缩放比例')
var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/)
if (match) {
scale = parseFloat(match[1])
dpr = parseInt(1 / scale)
}
if (!dpr && !scale) {
var isAndroid = win.navigator.appVersion.match(/android/gi);
var isIPhone = win.navigator.appVersion.match(/iphone/gi);
var devicePixelRatio = win.devicePixelRatio;
if (isIPhone) {
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3;
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
dpr = 2;
} else {
dpr = 1;
}
} else {
// 其他设备下,仍旧使用1倍的方案
dpr = 1;
}
scale = 1 / dpr;
} else if (flexibleEl) {
var content = flexibleEl.getAttribute('content')
if (content) {
var initialDpr = content.match(/initial\-dpr=([\d\.]+)/)
var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/)
if (initialDpr) {
dpr = parseFloat(initialDpr[1])
scale = parseFloat((1 / dpr).toFixed(2))
}
if (maximumDpr) {
dpr = parseFloat(maximumDpr[1])
scale = parseFloat((1 / dpr).toFixed(2))
}
}
}
docEl.setAttribute('data-dpr', dpr);
if (!metaEl) {
metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
if (docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl);
} else {
var wrap = doc.createElement('div');
wrap.appendChild(metaEl);
doc.write(wrap.innerHTML);
}
if (!dpr && !scale) {
var isAndroid = win.navigator.appVersion.match(/android/gi)
var isIPhone = win.navigator.appVersion.match(/iphone/gi)
var devicePixelRatio = win.devicePixelRatio
if (isIPhone) {
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
dpr = 2
} else {
dpr = 1
}
} else {
// 其他设备下,仍旧使用1倍的方案
dpr = 1
}
scale = 1 / dpr
}
function refreshRem(){
var width = docEl.getBoundingClientRect().width;
if (width / dpr > 1920) {
width = 1920 * dpr;
}
var rem = width / 10;
docEl.style.fontSize = rem + 'px';
flexible.rem = win.rem = rem;
docEl.setAttribute('data-dpr', dpr)
if (!metaEl) {
metaEl = doc.createElement('meta')
metaEl.setAttribute('name', 'viewport')
metaEl.setAttribute(
'content',
'initial-scale=' +
scale +
', maximum-scale=' +
scale +
', minimum-scale=' +
scale +
', user-scalable=no',
)
if (docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl)
} else {
var wrap = doc.createElement('div')
wrap.appendChild(metaEl)
doc.write(wrap.innerHTML)
}
}
win.addEventListener('resize', function() {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
}, false);
win.addEventListener('pageshow', function(e) {
if (e.persisted) {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
}
}, false);
if (doc.readyState === 'complete') {
doc.body.style.fontSize = 12 * dpr + 'px';
} else {
doc.addEventListener('DOMContentLoaded', function(e) {
doc.body.style.fontSize = 12 * dpr + 'px';
}, false);
function refreshRem() {
var width = docEl.getBoundingClientRect().width
if (width / dpr > 1920) {
width = 1920 * dpr
}
var rem = width / 10
docEl.style.fontSize = rem + 'px'
flexible.rem = win.rem = rem
}
win.addEventListener(
'resize',
function () {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
},
false,
)
win.addEventListener(
'pageshow',
function (e) {
if (e.persisted) {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
}
},
false,
)
refreshRem();
if (doc.readyState === 'complete') {
doc.body.style.fontSize = 12 * dpr + 'px'
} else {
doc.addEventListener(
'DOMContentLoaded',
function (e) {
doc.body.style.fontSize = 12 * dpr + 'px'
},
false,
)
}
flexible.dpr = win.dpr = dpr;
flexible.refreshRem = refreshRem;
flexible.rem2px = function(d) {
var val = parseFloat(d) * this.rem;
if (typeof d === 'string' && d.match(/rem$/)) {
val += 'px';
}
return val;
refreshRem()
flexible.dpr = win.dpr = dpr
flexible.refreshRem = refreshRem
flexible.rem2px = function (d) {
var val = parseFloat(d) * this.rem
if (typeof d === 'string' && d.match(/rem$/)) {
val += 'px'
}
flexible.px2rem = function(d) {
var val = parseFloat(d) / this.rem;
if (typeof d === 'string' && d.match(/px$/)) {
val += 'rem';
}
return val;
return val
}
flexible.px2rem = function (d) {
var val = parseFloat(d) / this.rem
if (typeof d === 'string' && d.match(/px$/)) {
val += 'rem'
}
})(window, window['lib'] || (window['lib'] = {}));
return val
}
})(window, window['lib'] || (window['lib'] = {}))

@ -19,7 +19,6 @@ server.interceptors.request.use((config) => {
})
// 创建相应拦截器
server.interceptors.response.use((response) => {
return response.data
})

@ -5,5 +5,5 @@ export const removeToken = () => {
localStorage.removeItem('token')
}
export const getToken = () => {
return localStorage.getItem('token')
}
return localStorage.getItem('token')
}

@ -1,12 +1,9 @@
<template>
<h1>404</h1>
<h1>404</h1>
</template>
<script lang='ts' setup>
import { } from 'vue'
<script lang="ts" setup>
import {} from 'vue'
</script>
<style lang='scss' scoped>
</style>
<style lang="scss" scoped></style>

@ -1,14 +1,9 @@
<template>
<div>
成果
</div>
<div>成果</div>
</template>
<script lang='ts' setup>
<script lang="ts" setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
</script>
<style lang='scss' scoped>
</style>
<style lang="scss" scoped></style>

@ -1,14 +1,9 @@
<template>
<div>
评价
</div>
<div>评价</div>
</template>
<script lang='ts' setup>
<script lang="ts" setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
</script>
<style lang='scss' scoped>
</style>
<style lang="scss" scoped></style>

@ -129,7 +129,7 @@ function goProjectName(id: any) {
const yearRaceInfo = ref<any>({})
const getYearRaceInfoEvent = async () => {
const res: any = await getYearRaceInfo({id:route.query.id})
const res: any = await getYearRaceInfo({ id: route.query.id })
yearRaceInfo.value = res.result
console.log(res, 'yearRaceInfo.value ')
}

@ -49,14 +49,19 @@
:class="active === index ? 'item active gradient' : 'item'"
v-for="(item, index) in newList"
:key="index"
@click="toggleTab(item,index)"
@click="toggleTab(item, index)"
>
{{ item.name }}
</div>
</div>
<div class="newa-main">
<div class="left">
<img src="" alt="" v-default-image style="width: 100%;height: 100%;">
<img
src=""
alt=""
v-default-image
style="width: 100%; height: 100%"
/>
</div>
<div class="right">
<div class="title">{{ newInfo.name }}</div>
@ -68,7 +73,7 @@
<li v-for="item in childrenNewList" :key="item.id">
<div class="time">{{ item.createTime }}</div>
<div class="info">
{{ item.info }}
{{ item.info }}
</div>
</li>
</ul>
@ -85,7 +90,7 @@ import { ref } from 'vue'
import { getRaceList } from '@/api/race'
import { useRouter } from 'vue-router'
import { ElLoading } from 'element-plus'
import { getColumnListApi ,queryEssayListApi} from '@/api/news'
import { getColumnListApi, queryEssayListApi } from '@/api/news'
const router = useRouter()
const reacProjectList = ref<any>([])
const isLoading = ref(false)
@ -135,7 +140,7 @@ const getNewsList = async () => {
newList.value = res.result
console.log(newList.value, 'newList.value')
newInfo.value = newList.value[0]
getNewInfo( newList.value[0].id)
getNewInfo(newList.value[0].id)
}
getNewsList()
@ -143,18 +148,17 @@ getNewsList()
const newInfo = ref<any>({})
//
const childrenNewList = ref<any>([])
const getNewInfo = async (id:any) => {
const getNewInfo = async (id: any) => {
const res: any = await queryEssayListApi(id)
childrenNewList.value = res.result.records
console.log(childrenNewList,'childrenNewList');
childrenNewList.value = res.result.records
console.log(childrenNewList, 'childrenNewList')
}
// tab
const toggleTab = (item: any, index: number) => {
active.value = index
newInfo.value = item
getNewInfo( newInfo.value.id)
getNewInfo(newInfo.value.id)
}
</script>

@ -27,13 +27,14 @@
</div>
</el-form-item>
</el-form>
<div class="submit gradient" @click="submit">
登录
</div>
<div class="submit gradient" @click="submit">登录</div>
</div>
<div class="registered">
还没账号
<span @click="registered">立即注册</span>
</div>
<div class="registered">还没账号<span @click="registered">立即注册</span></div>
</div>
<RegisTered v-else @backLogin="backLoginEvent"/>
<RegisTered v-else @backLogin="backLoginEvent" />
</div>
</template>
@ -101,12 +102,11 @@ const keyDown = (e: any) => {
const status = ref(true)
const registered = () => {
console.log(111);
console.log(111)
status.value = false
}
const backLoginEvent = () => {
status.value = true
}
</script>
@ -169,12 +169,12 @@ const backLoginEvent = () => {
}
}
}
.registered{
.registered {
margin-top: 25px;
text-align: center;
color: #666666;
font-size: 12px;
span{
span {
color: #0bd7c6;
cursor: pointer;
}

@ -65,7 +65,6 @@
v-model="form.confirmPassword"
:prefix-icon="Lock"
type="password"
></el-input>
</el-form-item>
<el-form-item>
@ -162,25 +161,24 @@ const ragistered = async () => {
}
}
if (!(form.password === form.confirmPassword)) {
return ElMessage.warning(`两次密码不同`)
return ElMessage.warning(`两次密码不同`)
}
console.log(form)
let data = {
checkKey: 1629428467008,
departmentid:form.department,
password:form.password,
phone:form.mobile,
realname:form.realname,
smscode:form.smscode,
username:form.username,
workno:form.workno
departmentid: form.department,
password: form.password,
phone: form.mobile,
realname: form.realname,
smscode: form.smscode,
username: form.username,
workno: form.workno,
}
const res:any = await sturegister(data)
if(res.code === 200){
const res: any = await sturegister(data)
if (res.code === 200) {
ElMessage.success(`注册成功`)
$emits('backLogin')
}else{
} else {
ElMessage.warning(res.message)
getcodeinfo()
}

@ -1,14 +1,9 @@
<template>
<div>
导航
</div>
<div>导航</div>
</template>
<script lang='ts' setup>
<script lang="ts" setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
</script>
<style lang='scss' scoped>
</style>
<style lang="scss" scoped></style>

@ -1,43 +1,51 @@
<template>
<div class="container">
<el-button style="margin-left: 93%" @click="backHandle" type="success">返回</el-button>
<el-divider/>
<el-button style="margin-left: 93%" @click="backHandle" type="success">
返回
</el-button>
<el-divider />
<p class="list-title">{{ data.title }}</p>
<p class="list-summary" v-html="data.content"></p>
<div class="center-image">
<img class="list-image" :src="completeImageUrl" alt="News Image" v-default-image>
<img
class="list-image"
:src="completeImageUrl"
alt="News Image"
v-default-image
/>
</div>
<p class="list-time">{{ data.publishTime }}</p>
</div>
</template>
<script setup lang="ts">
import { ref,computed } from 'vue'
import {useRoute, useRouter} from "vue-router";
import {queryEssayApi} from "@/api/news";
import { ref, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { queryEssayApi } from '@/api/news'
const router = useRouter();
const route = useRoute();
const backHandle = ()=>{
router.go(-1);
const router = useRouter()
const route = useRoute()
const backHandle = () => {
router.go(-1)
}
const data = ref({});
const data = ref({})
//id
queryEssayApi(route.params.id).then(res=>{
queryEssayApi(route.params.id).then((res) => {
data.value = res.result[0]
console.log(`当前id为${route.params.id}新闻详细信息`,data.value)
console.log(`当前id为${route.params.id}新闻详细信息`, data.value)
})
//
const completeImageUrl = computed(() => {
if (data.value.comimg) {
return new URL(data.value.comimg, 'https://localhost:18085/jeecg-boot/').href;
return new URL(data.value.comimg, 'https://localhost:18085/jeecg-boot/')
.href
}
return '';
});
return ''
})
</script>
<style scoped>
.container{
.container {
width: 60%;
margin: auto;
height: 98vh;
@ -49,31 +57,31 @@ const completeImageUrl = computed(() => {
.container::-webkit-scrollbar {
width: 0;
}
.list-title{
.list-title {
font-size: 25px;
font-weight: 600;
text-align: center;
}
.list-summary{
.list-summary {
font-size: 20px;
color: #8c8b8b;
margin-top: 30px;
line-height: 1.9;
}
.center-image{
.center-image {
display: flex;
justify-content: center;
margin-top: 20px;
}
.list-image{
.list-image {
width: 500px;
height: 200px;
margin-top: 20px;
}
.list-time{
.list-time {
font-size: 16px;
color: #999999;
margin-top: 60px;
margin-left: 84%;
}
</style>
}
</style>

@ -1,21 +1,36 @@
<template>
<div class="main">
<el-tabs v-model="activeName" style="max-width: 70%; margin: auto" class="container" @tab-click="handleTabClick">
<el-tabs
v-model="activeName"
style="max-width: 70%; margin: auto"
class="container"
@tab-click="handleTabClick"
>
<el-tab-pane
v-for="category in categories"
:key="category.id"
:label="category.name"
:name="category.id"
v-for="category in categories"
:key="category.id"
:label="category.name"
:name="category.id"
>
<ul>
<li v-for="newsItem in getNewsItemsForCategory(category)" :key="newsItem.id">
<li
v-for="newsItem in getNewsItemsForCategory(category)"
:key="newsItem.id"
>
<div class="box-list" @click.stop="handleNewsClick(newsItem)">
<div class="left-box-list">
<p class="list-title">{{ newsItem.title }}</p>
<p class="list-summary">{{ stripHtmlTags(newsItem.summary) }}</p>
<p class="list-summary">
{{ stripHtmlTags(newsItem.summary) }}
</p>
<p class="list-time">{{ newsItem.date }}</p>
</div>
<img class="news-image" :src="newsItem.imageUrl" alt="News Image" v-default-image>
<img
class="news-image"
:src="newsItem.imageUrl"
alt="News Image"
v-default-image
/>
</div>
<el-divider />
</li>
@ -35,14 +50,16 @@ const router = useRouter()
//使html
function stripHtmlTags(html) {
return html.replace(/<[^>]*>/g, '');
return html.replace(/<[^>]*>/g, '')
}
//
const fetchColumnList = async () => {
const response = await getColumnListApi()
if (response.success && response.result) {
categories.value = response.result.filter(category => category.isShow === '1')
categories.value = response.result.filter(
(category) => category.isShow === '1',
)
//
if (categories.value.length > 0) {
await fetchNewsList(categories.value[0].id)
@ -58,12 +75,12 @@ const fetchNewsList = async (categoryId) => {
// console.log(response.success,'')
// console.log(response.result.records,'')
if (response.success && response.result.records) {
newsItems.value[categoryId] = response.result.records.map(data => ({
newsItems.value[categoryId] = response.result.records.map((data) => ({
id: data.id,
title: data.title,
date: data.publishTime,
summary: data.content,
imageUrl: data.comimg ? getAbsoluteImagePath(data.comimg) : ''
imageUrl: data.comimg ? getAbsoluteImagePath(data.comimg) : '',
}))
}
} catch (error) {
@ -73,9 +90,9 @@ const fetchNewsList = async (categoryId) => {
//
const getAbsoluteImagePath = (relativePath) => {
const baseImageUrl = 'https://localhost:18085/jeecg-boot/'; //
return baseImageUrl + relativePath;
};
const baseImageUrl = 'https://localhost:18085/jeecg-boot/' //
return baseImageUrl + relativePath
}
//
const getNewsItemsForCategory = (category) => {
@ -105,10 +122,10 @@ const handleNewsClick = (newsItem) => {
}
</script>
<style scoped>
.main{
.main {
margin-top: 100px;
}
.container{
.container {
margin: auto;
height: 98vh;
overflow-y: scroll;
@ -118,7 +135,7 @@ const handleNewsClick = (newsItem) => {
.container::-webkit-scrollbar {
width: 0;
}
.box-list{
.box-list {
display: flex;
width: 95%;
height: 100px;
@ -137,23 +154,23 @@ const handleNewsClick = (newsItem) => {
flex: 1;
padding-right: 10px;
}
.list-title{
.list-title {
font-size: 22px;
margin-left: 60px;
}
.list-summary{
.list-summary {
font-size: 16px;
margin-left: 60px;
margin-top: 15px;
color: #999999;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1 ;
-webkit-line-clamp: 1;
overflow: hidden;
text-overflow: ellipsis; /* 溢出部分显示为省略号 */
max-width: calc(100% - 130px); /* 减去右侧图片宽度和内边距 */
}
.list-time{
.list-time {
margin-left: 60px;
margin-top: 20px;
color: #999999;
@ -163,4 +180,4 @@ const handleNewsClick = (newsItem) => {
height: 80px;
margin-right: 30px;
}
</style>
</style>

@ -1,52 +1,64 @@
<template>
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">个人积分</div>
<!-- <div class="text">
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">个人积分</div>
<!-- <div class="text">
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
</div> -->
</div>
</div>
<div class="img-box">
<img src="../../assets/images/applyImg.png" alt="">
</div>
</div>
</div>
<div class="personalAbilityEvaluationCollectList container-1420">
<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 class="img-box">
<img src="../../assets/images/applyImg.png" alt="" />
</div>
</div>
</div>
<div class="personalAbilityEvaluationCollectList container-1420">
<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 { reactive, ref } from 'vue'
import { getlIntegralApi } from '@/api/person'
import { ElMessage } from 'element-plus'
// loading
@ -54,136 +66,138 @@ const isLoading = ref(true)
//
const pagInfo = reactive({
currentPage: 1,
pageSize: 10,
total: 0
currentPage: 1,
pageSize: 10,
total: 0,
})
//
const tableData = reactive<any[]>([]);
const tableData = reactive<any[]>([])
const setTableData = (arr: any[]) => {
tableData.length = 0;
tableData.push(...arr);
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;
}
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();
getTableList()
</script>
<style lang="scss" scoped>
.fill {
padding-top: 80px;
padding-top: 80px;
}
.banner {
width: 100%;
height: 289;
background: linear-gradient(90deg, #FFFFFF 0%, #F0F8FF 100%);
// padding: 21px 0 37px 225px;
padding: 0 320px;
.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;
}
}
width: 100%;
height: 289;
background: linear-gradient(90deg, #ffffff 0%, #f0f8ff 100%);
// padding: 21px 0 37px 225px;
padding: 0 320px;
.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 {
width: 100%;
height: 100%;
.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;
.table-list {
.table-box {
.table {
--el-table-header-bg-color: #fafafa;
width: 100%;
.pagination {
padding: 0 24px;
&.height {
height: 375px;
}
:deep() {
.el-pagination__total {
margin-right: auto;
}
.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;
}
}
}
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>
</style>

@ -1,54 +1,65 @@
<template>
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">个人能力</div>
<!-- <div class="text">
<div class="fill"></div>
<div class="banner">
<div class="box">
<div class="title-box">
<div class="title">个人能力</div>
<!-- <div class="text">
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
请仔细核对报名信息报名成功后无法修改请仔细核对报名信息报名成功后无法修改
</div> -->
</div>
</div>
<div class="img-box">
<img src="../../assets/images/applyImg.png" alt="">
</div>
</div>
</div>
<div class="personalAbilityEvaluationCollectList container-1420">
<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 class="img-box">
<img src="../../assets/images/applyImg.png" alt="" />
</div>
</div>
</div>
<div class="personalAbilityEvaluationCollectList container-1420">
<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 { reactive, ref } from 'vue'
import { getlEvaluateApi } from '@/api/person'
import { ElMessage } from 'element-plus'
// loading
@ -56,138 +67,139 @@ const isLoading = ref(true)
//
const pagInfo = reactive({
currentPage: 1,
pageSize: 10,
total: 0
currentPage: 1,
pageSize: 10,
total: 0,
})
//
const tableData = reactive<any[]>([]);
const tableData = reactive<any[]>([])
const setTableData = (arr: any[]) => {
tableData.length = 0;
tableData.push(...arr);
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;
}
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();
getTableList()
</script>
<style lang="scss" scoped>
.fill {
padding-top: 80px;
padding-top: 80px;
}
.banner {
width: 100%;
height: 289;
background: linear-gradient(90deg, #FFFFFF 0%, #F0F8FF 100%);
// padding: 21px 0 37px 225px;
padding: 0 320px;
.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;
}
}
width: 100%;
height: 289;
background: linear-gradient(90deg, #ffffff 0%, #f0f8ff 100%);
// padding: 21px 0 37px 225px;
padding: 0 320px;
.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 {
width: 100%;
height: 100%;
.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;
.table-list {
.table-box {
position: relative;
.table {
--el-table-header-bg-color: #fafafa;
width: 100%;
.pagination {
padding: 0 24px;
&.height {
height: 375px;
}
:deep() {
.el-pagination__total {
margin-right: auto;
}
.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;
}
}
}
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>
</style>

@ -1,102 +1,100 @@
<template>
<div id="rander-chart">
</div>
<div id="rander-chart"></div>
</template>
<script lang='ts' setup>
import echarts from '@/utils/echarts';
<script lang="ts" setup>
import echarts from '@/utils/echarts'
import { onMounted,nextTick } from 'vue'
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,
},
],
},
});
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;
let timer: any
return function () {
if (timer) {
return;
return
}
timer = setTimeout(() => {
fn();
clearTimeout(timer);
timer = null;
}, 1000);
};
};
fn()
clearTimeout(timer)
timer = null
}, 1000)
}
}
let Data = props.data
console.log(Data, props.data);
console.log(Data, props.data)
nextTick(() => {
// @ts-ignore
const myChart = echarts.init(document.getElementById("rander-chart"));
console.log(Data,1111);
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 indicator = Data.map((item) => {
return { name: item.capacityName, max: 100 }
})
var dataArr = [
{
value:Data.map(item => item.value),
value: Data.map((item) => item.value),
name: '年度维度分析',
itemStyle: {
normal: {
lineStyle: {
color: "#55d7f2",
color: '#55d7f2',
},
shadowColor: '#4A99FF',
shadowBlur: 10,
@ -106,7 +104,7 @@ nextTick(() => {
normal: {
//
color: {
type: "linear",
type: 'linear',
x: 1, //
y: 0, //
x2: 1, //
@ -114,11 +112,11 @@ nextTick(() => {
colorStops: [
{
offset: 0,
color: "#1890ff",
color: '#1890ff',
},
{
offset: 1,
color: "#1890ff",
color: '#1890ff',
},
],
globalCoord: false,
@ -127,10 +125,10 @@ nextTick(() => {
},
},
},
];
var colorArr = ["#fff", "#fff"]; //
const option :any= {
backgroundColor: "transparent",
]
var colorArr = ['#fff', '#fff'] //
const option: any = {
backgroundColor: 'transparent',
color: colorArr,
// legend: {
// orient: "vertical",
@ -148,14 +146,14 @@ nextTick(() => {
// },
// },
tooltip: {
trigger: 'item'
},
trigger: 'item',
},
radar: {
radius: "60%",
radius: '60%',
// shape: 'circle',
name: {
textStyle: {
color: "#9ca4a6",
color: '#9ca4a6',
fontSize: 12,
},
},
@ -165,47 +163,43 @@ nextTick(() => {
show: true,
areaStyle: {
//
color: ["rgba(255,255,255,0)", "rgba(255,255,255,0)"], //
color: ['rgba(255,255,255,0)', 'rgba(255,255,255,0)'], //
},
},
axisLine: {
//线
lineStyle: {
color: "#2a5f61",
color: '#2a5f61',
},
},
splitLine: {
lineStyle: {
color: "#2a5f61", // 线
color: '#2a5f61', // 线
width: 1, // 线线
},
},
},
series: [
{
type: "radar",
type: 'radar',
symbolSize: 6,
symbol: "circle",
symbol: 'circle',
data: dataArr,
},
],
};
myChart.setOption(option);
}
myChart.setOption(option)
let resize = throttle(() => {
myChart.resize();
});
window.addEventListener("resize", resize);
myChart.resize()
})
window.addEventListener('resize', resize)
})
onMounted(() => {
});
onMounted(() => {})
</script>
<style lang='scss' scoped>
#rander-chart{
width: 100%;
height:450px;
<style lang="scss" scoped>
#rander-chart {
width: 100%;
height: 450px;
}
</style>

@ -1,382 +1,398 @@
<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 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>
<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>
<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工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力具有终身学习和创新创业意识国际交流能力团队合作精神等良好素养能适应产业与社会变革的国际化应用型人
个人综合素质综述全面落实立德树人根本任务依据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>
</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>
<script lang="ts" setup>
// import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import randerChart from './components/randerChart.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
}[] | []
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
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;
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
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) => {
const cloLoading = () => {
if (loading) loading.close()
} //loading
getXsfxbgApi()
.then((res: any) => {
data.value = res.result
setLoading();
}).finally(cloLoading);
setLoading()
})
.finally(cloLoading)
const Rebuild = async () => {
setLoading();
const res: any = await getXsfxbgApi({ recreateFlag: true, annualid: annualid.value })
data.value = res.result
cloLoading();
setLoading()
const res: any = await getXsfxbgApi({
recreateFlag: true,
annualid: annualid.value,
})
data.value = res.result
cloLoading()
}
const annualid = ref('')
watch(() => annualid.value, () => {
watch(
() => annualid.value,
() => {
Rebuild()
})
},
)
</script>
<style lang='scss' scoped>
<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;
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;
font-size: 30px;
text-align: center;
padding-bottom: 30px;
line-height: initial;
}
.table{
font-size: 16px;
.table {
font-size: 16px;
}
.fill {
padding-top: 80px;
padding-top: 80px;
}
.loading {
width: 100%;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.rebuild {
display: flex;
justify-content: center;
display: flex;
justify-content: center;
div {
cursor: pointer;
}
div {
cursor: pointer;
}
}
.personage {
padding: 0 18.6vw 60px;
width: 100%;
margin: auto;
padding: 0 18.6vw 60px;
width: 100%;
margin: auto;
&>* {
margin: 50px 0;
}
& > * {
margin: 50px 0;
}
&>img {
margin: -50px 0;
}
& > img {
margin: -50px 0;
}
&>.title {
text-align: center;
font-size: 35px;
font-weight: bolder;
}
& > .title {
text-align: center;
font-size: 35px;
font-weight: bolder;
}
.paragraph {
font-size: 16px;
text-indent: 2em;
}
.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;
}
}
}
}
}
.card {
width: 100%;
.ec-box {
width: 100%;
border-radius: 2px 2px 2px 2px;
border: 1px solid #000;
.inner {
height: 0;
padding-top: 40%;
position: relative;
.title-box {
height: 58px;
border-radius: 2px 2px 0px 0px;
box-shadow: 0px 1px 2px 0px #707070;
.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;
.tit {
margin-left: 4%;
height: 58px;
line-height: 58px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
}
justify-content: space-between;
}
}
}
}
}
.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);
}
}
}
.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%;
/** */
.card1 {
--el-card-padding: 0;
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;
}
&,
* {
line-height: initial;
th:first-child {
text-align: center;
}
:deep() {
.el-card__body {
display: flex;
flex-direction: column;
justify-content: space-between;
}
td:last-child {
color: rgb(64, 51, 253);
}
}
}
}
width: 100%;
height: 182px;
// background-color: #ffffff00;
border: 1px solid #ccc;
padding: 20px;
/** */
.card1 {
--el-card-padding: 0;
.title {
display: flex;
width: 100%;
&,
* {
line-height: initial;
}
justify-content: space-between;
:deep() {
.el-card__body {
display: flex;
flex-direction: column;
justify-content: space-between;
}
}
.left {
font-size: 14px;
color: #fff;
color: rgba(0, 0, 0, 0.45);
}
}
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;
}
.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%;
}
}
.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>

@ -1,179 +1,190 @@
<!-- 比赛项目名称页面 -->
<template>
<div class="fill"></div>
<div class="banner">
<img src="../../assets/images/banner2.png" alt="">
<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="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-button class="btn" @click="handleSub">立刻报名</el-button>
</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-button class="btn" @click="handleSub">立刻报名</el-button>
</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';
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();
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 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>>({});
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;
}
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);
const checked = ref(false)
//
function handleSub() {
if (!checked.value) {
ElMessage({
message: '请先同意',
type: 'warning',
})
return
}
// Y: N:
let path;
if (data.value.entryForm === 'Y') path = '/registrationGroup';
else path = '/registrationPersonage';
router.push({ path, query: { id: route.query.id,objName:data.value.objName,bcId:route.query.bcId } })
if (!checked.value) {
ElMessage({
message: '请先同意',
type: 'warning',
})
return
}
// Y: N:
let path
if (data.value.entryForm === 'Y') path = '/registrationGroup'
else path = '/registrationPersonage'
router.push({
path,
query: {
id: route.query.id,
objName: data.value.objName,
bcId: route.query.bcId,
},
})
}
getData();
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;
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;
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;
}
.content {
.title {
text-align: center;
font-size: 42px;
color: #333333;
margin: 20px 0;
}
.text {
font-size: 18px;
color: #666666;
text-indent: 2em;
min-height: 500px;
}
.foot {
margin: 120px 0 20px;
display: flex;
align-items: center;
gap: 110px;
}
.text {
font-size: 18px;
color: #666666;
text-indent: 2em;
min-height: 500px;
}
.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);
}
}
.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;
padding-top: 80px;
}
.banner {
width: 100%;
height: 367px;
border-radius: 0px 0px 0px 0px;
width: 100%;
height: 367px;
border-radius: 0px 0px 0px 0px;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
</style>
</style>

@ -3,7 +3,12 @@
<div class="top-image">Banner</div>
<!-- 年度比赛列表 -->
<div class="race-list">
<div class="item" v-for="item in reacProjectList" :key="item.id" @click="goToCompetition(item.id)">
<div
class="item"
v-for="item in reacProjectList"
:key="item.id"
@click="goToCompetition(item.id)"
>
<div class="image">
<img
:src="setImageUrl(item.image)"
@ -57,9 +62,10 @@
<div class="left">
<el-image
:src="setImageUrl(raceInfo.compLogo)"
style="width: 1.5625rem;height: 100%;"
style="width: 1.5625rem; height: 100%"
:preview-src-list="[
setImageUrl(raceInfo.compLogo),setImageUrl(raceInfo.compImg),
setImageUrl(raceInfo.compLogo),
setImageUrl(raceInfo.compImg),
]"
></el-image>
</div>
@ -94,7 +100,7 @@
</div>
<div class="center">
<div class="label">比赛简介:</div>
<div class="deaceiption" >
<div class="deaceiption">
{{ raceInfo.compInfo }}
<!-- 亲爱的同学们老师们以及各位编程爱好者们
在这个充满创新与挑战的时代一场精彩纷呈的大学生编程大赛即将拉开帷幕
@ -106,7 +112,9 @@
</div>
<div class="label">附件:</div>
<div class="file">
<el-tag type="primary" @click="doLoadFile(raceInfo.compFile)">{{ raceInfo.compFile }}</el-tag>
<el-tag type="primary" @click="doLoadFile(raceInfo.compFile)">
{{ raceInfo.compFile }}
</el-tag>
</div>
</div>
</div>
@ -114,24 +122,27 @@
</el-card>
</div>
<div class="right-history">
<el-card style="padding: 0">
<el-card style="padding: 0">
<div class="title">历史比赛</div>
<div class="description">往年历史赛事</div>
<el-scrollbar height="650px">
<ul>
<li v-for="item in historyRaceList" :key="item.id">
<div class="year">2024年度</div>
<div class="name">{{ item.name }}</div>
<div class="time">报名时间:{{item.starttime}} - {{ item.endtime }}</div>
<div class="go-to" @click="goToCompetition(item.id)">前往查看</div>
<div class="icon">
<img src="../../assets/images/编组.png" alt="" srcset="" />
</div>
</li>
</ul>
<li v-for="item in historyRaceList" :key="item.id">
<div class="year">2024年度</div>
<div class="name">{{ item.name }}</div>
<div class="time">
报名时间:{{ item.starttime }} - {{ item.endtime }}
</div>
<div class="go-to" @click="goToCompetition(item.id)">
前往查看
</div>
<div class="icon">
<img src="../../assets/images/编组.png" alt="" srcset="" />
</div>
</li>
</ul>
</el-scrollbar>
</el-card>
</el-card>
</div>
</div>
</div>
@ -139,7 +150,7 @@
<script lang="ts" setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
import { getYearRaceList, getRaceInfo,getHistoryRaceList } from '@/api/race'
import { getYearRaceList, getRaceInfo, getHistoryRaceList } from '@/api/race'
import { useRouter, useRoute } from 'vue-router'
const Route = useRoute()
const Router = useRouter()
@ -162,7 +173,7 @@ const getRaceProjectListEvent = async () => {
}
getRaceProjectListEvent()
const setImageUrl = (url: string) => {
return import.meta.env.VITE_APP_BASE_API + "/sys/common/static/" + url
return import.meta.env.VITE_APP_BASE_API + '/sys/common/static/' + url
}
//
const raceInfo = ref<any>({})
@ -174,13 +185,13 @@ const getraceInfoEvent = async () => {
getraceInfoEvent()
//
const goToCompetition = (id:any) => {
const goToCompetition = (id: any) => {
Router.push({ path: '/competition', query: { id } })
}
const doLoadFile = (url:any) => {
const doLoadFile = (url: any) => {
// console.log( import.meta.env.VITE_APP_BASE_API + "/sys/common/static/" + url)
window.open( import.meta.env.VITE_APP_BASE_API + "/sys/common/static/" + url)
window.open(import.meta.env.VITE_APP_BASE_API + '/sys/common/static/' + url)
}
//
@ -244,9 +255,9 @@ getHistoryRaceListEvent()
line-height: 20px;
height: 60px;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.time {
font-size: 14px;

@ -13,7 +13,7 @@
@click="toDetail(item.id)"
>
<div class="image">
<img :src="setImageUrl(item.compImg)" alt="" v-default-image/>
<img :src="setImageUrl(item.compImg)" alt="" v-default-image />
</div>
<div class="reac-info">
<div class="reac-title">{{ item.compName }}</div>
@ -25,7 +25,12 @@
</div>
</div>
<div class="page">
<el-pagination background layout="prev, pager, next" :total="total" @change="handleSizeChange"/>
<el-pagination
background
layout="prev, pager, next"
:total="total"
@change="handleSizeChange"
/>
</div>
</div>
</template>
@ -65,7 +70,7 @@ const getRaceProjectListEvent = async () => {
}
getRaceProjectListEvent()
const setImageUrl = (url: string) => {
return import.meta.env.VITE_APP_BASE_API + "/sys/common/static/" + url
return import.meta.env.VITE_APP_BASE_API + '/sys/common/static/' + url
}
//
const toDetail = (id: number) => {
@ -77,9 +82,9 @@ const toDetail = (id: number) => {
})
}
//
const handleSizeChange = (e:any) => {
console.log(e);
splietArr.value = reacProjectList.value.slice((e-1) * 8 ,(e-1) * 8 + 8)
const handleSizeChange = (e: any) => {
console.log(e)
splietArr.value = reacProjectList.value.slice((e - 1) * 8, (e - 1) * 8 + 8)
}
</script>
@ -157,9 +162,9 @@ const handleSizeChange = (e:any) => {
margin-top: 10px;
}
}
.page{
display: flex;
justify-content: center;
margin-top: 25px;
.page {
display: flex;
justify-content: center;
margin-top: 25px;
}
</style>

@ -1,76 +1,102 @@
<template>
<el-dialog :modelValue="modelValue" @update:modelValue="(newValue: boolean) => $emit('update:modelValue', newValue)"
title="用户信息" width="800" draggable overflow>
<div class="table-box">
<el-table ref="multipleTableRef" border :data="tableData" class="table">
<el-table-column label="选择" width="55">
<template #default="scope">
<el-radio v-model="selectedRow" :value="scope.row" />
</template>
</el-table-column>
<el-table-column label="序号">
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column property="realname" label="真实姓名" sortable />
<el-table-column property="work_no" label="学号" sortable />
</el-table>
<div class="pagin-box">
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="params.pageNo"
v-model:page-size="params.pageSize" :page-sizes="[10, 20, 30, 40]"
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="total" @change="getList" />
</div>
</div>
<el-dialog
:modelValue="modelValue"
@update:modelValue="
(newValue: boolean) => $emit('update:modelValue', newValue)
"
title="用户信息"
width="800"
draggable
overflow
>
<div class="table-box">
<el-table ref="multipleTableRef" border :data="tableData" class="table">
<el-table-column label="选择" width="55">
<template #default="scope">
<el-radio v-model="selectedRow" :value="scope.row" />
</template>
</el-table-column>
<el-table-column label="序号">
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column property="realname" label="真实姓名" sortable />
<el-table-column property="work_no" label="学号" sortable />
</el-table>
<div class="pagin-box">
<el-pagination
class="pagination"
style="width: 100%"
v-model:current-page="params.pageNo"
v-model:page-size="params.pageSize"
:page-sizes="[10, 20, 30, 40]"
layout="slo, total,slot, sizes, prev, pager, next, jumper"
:total="total"
@change="getList"
/>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button type="primary"
@click="() => { $emit('update:modelValue', false); $emit('selected', selectedRow); }">确认</el-button>
</div>
</template>
</el-dialog>
<template #footer>
<div class="dialog-footer">
<el-button @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button
type="primary"
@click="
() => {
$emit('update:modelValue', false)
$emit('selected', selectedRow)
}
"
>
确认
</el-button>
</div>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { computed, reactive, ref, watch } from 'vue';
import { getMembersList } from '@/api/person';
import { useRoute } from 'vue-router';
import { computed, reactive, ref, watch } from 'vue'
import { getMembersList } from '@/api/person'
import { useRoute } from 'vue-router'
const props = defineProps(['modelValue']);
const $emit = defineEmits(['update:modelValue', 'selected']);
const route = useRoute();
const props = defineProps(['modelValue'])
const $emit = defineEmits(['update:modelValue', 'selected'])
const route = useRoute()
watch(() => props.modelValue, () => getList());
watch(
() => props.modelValue,
() => getList(),
)
//
const tableData = reactive<any[]>([]);
const selectedRow = ref();
const tableData = reactive<any[]>([])
const selectedRow = ref()
//
const total = ref(0);
const total = ref(0)
const params = reactive<any>({
pageNo: 1,
pageSize: 10,
onlRepUrlParamStr: `annualCompid=${route.query.objName}`,
entryFormat: '团队',
id: route.query.id,
pageNo: 1,
pageSize: 10,
onlRepUrlParamStr: `annualCompid=${route.query.objName}`,
entryFormat: '团队',
id: route.query.id,
})
const getList = async () => {
if (!props.modelValue) return
const res: any = await getMembersList(params);
tableData.length = 0;
tableData.push(...res.result.records);
total.value = res.result.total;
if (!props.modelValue) return
const res: any = await getMembersList(params)
tableData.length = 0
tableData.push(...res.result.records)
total.value = res.result.total
}
</script>
<style lang="scss" scoped>
.form-box {
padding: 0 60px;
padding: 0 60px;
}
</style>
</style>

@ -1,78 +1,86 @@
<template>
<el-dialog title="编辑" width="800" draggable>
<div class="form-box">
<el-form ref="ruleFormRef" style="max-width: 600px" :model="ruleForm" status-icon :rules="rules"
label-width="auto" class="demo-ruleForm">
<el-form-item label="年度比赛项目" prop="pass">
<el-input v-model="ruleForm.pass" type="text" autocomplete="off" />
</el-form-item>
<el-form-item label="参赛形式" prop="checkPass">
<el-input v-model="ruleForm.checkPass" type="text" autocomplete="off" />
</el-form-item>
<el-form-item label="队伍名称" prop="age">
<el-input v-model.number="ruleForm.age" />
</el-form-item>
</el-form>
</div>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="onCutTab">
<el-tab-pane label="团队成员表" name="members">
<info-list ref="memRef"></info-list>
</el-tab-pane>
<el-tab-pane label="指导老师表" name="adviser">
<info-list></info-list>
</el-tab-pane>
</el-tabs>
<div>
<el-button>关闭</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</div>
</el-dialog>
<el-dialog title="编辑" width="800" draggable>
<div class="form-box">
<el-form
ref="ruleFormRef"
style="max-width: 600px"
:model="ruleForm"
status-icon
:rules="rules"
label-width="auto"
class="demo-ruleForm"
>
<el-form-item label="年度比赛项目" prop="pass">
<el-input v-model="ruleForm.pass" type="text" autocomplete="off" />
</el-form-item>
<el-form-item label="参赛形式" prop="checkPass">
<el-input
v-model="ruleForm.checkPass"
type="text"
autocomplete="off"
/>
</el-form-item>
<el-form-item label="队伍名称" prop="age">
<el-input v-model.number="ruleForm.age" />
</el-form-item>
</el-form>
</div>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="onCutTab">
<el-tab-pane label="团队成员表" name="members">
<info-list ref="memRef"></info-list>
</el-tab-pane>
<el-tab-pane label="指导老师表" name="adviser">
<info-list></info-list>
</el-tab-pane>
</el-tabs>
<div>
<el-button>关闭</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</div>
</el-dialog>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import type { TabsPaneContext, FormInstance, FormRules } from 'element-plus';
import { useRoute } from 'vue-router';
import infoList from './infoList.vue';
const route = useRoute();
defineProps(['data']);
import { reactive, ref } from 'vue'
import type { TabsPaneContext, FormInstance, FormRules } from 'element-plus'
import { useRoute } from 'vue-router'
import infoList from './infoList.vue'
const route = useRoute()
defineProps(['data'])
const activeName = ref('members');
const activeName = ref('members')
const onCutTab = (tab: TabsPaneContext) => {
console.log(tab.props.name,)
console.log(tab.props.name)
}
// form
const ruleFormRef = ref<FormInstance>();
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive({
pass: route.query.objName,
checkPass: '团队赛',
age: '',
pass: route.query.objName,
checkPass: '团队赛',
age: '',
})
const rules = reactive<FormRules<typeof ruleForm>>({});
const rules = reactive<FormRules<typeof ruleForm>>({})
const memRef = ref<any>(null);
const memRef = ref<any>(null)
const submit = () => {
memRef.value.submit()
memRef.value.submit()
}
</script>
<style lang="scss" scoped>
.el-tabs--top {
flex-direction: column;
flex-direction: column;
}
.form-box {
padding: 0 60px;
padding: 0 60px;
}
</style>
</style>

@ -1,153 +1,163 @@
<template>
<el-button type="primary" icon="Plus" @click="add">新增</el-button>
<div class="table-box">
<el-table ref="multipleTableRef" border :data="tableData" class="table" height="276px">
<el-table-column type="selection" width="55" />
<el-table-column property="#" label="#" />
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">用户</span>
</template>
<template #default="scope">
<el-input @click="openDialog(scope.row)" v-model="scope.row['用户']" placeholder="请选择"
:prefix-icon="ClusterOutlined" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">是否队长</span>
</template>
<template #default="scope">
<el-cascader v-model="scope.row['是否队长']" :options="options" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">队员序号</span>
</template>
<template #default="scope">
<el-input v-model="scope.row['队员序号']" />
</template>
</el-table-column>
</el-table>
</div>
<!-- <div>
<el-button type="primary" icon="Plus" @click="add">新增</el-button>
<div class="table-box">
<el-table
ref="multipleTableRef"
border
:data="tableData"
class="table"
height="276px"
>
<el-table-column type="selection" width="55" />
<el-table-column property="#" label="#" />
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">用户</span>
</template>
<template #default="scope">
<el-input
@click="openDialog(scope.row)"
v-model="scope.row['用户']"
placeholder="请选择"
:prefix-icon="ClusterOutlined"
/>
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">是否队长</span>
</template>
<template #default="scope">
<el-cascader v-model="scope.row['是否队长']" :options="options" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">队员序号</span>
</template>
<template #default="scope">
<el-input v-model="scope.row['队员序号']" />
</template>
</el-table-column>
</el-table>
</div>
<!-- <div>
<el-button>关闭</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</div> -->
<dalog v-model="visible" @selected="handleSelected" />
<dalog v-model="visible" @selected="handleSelected" />
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import dalog from './dalog.vue';
import { ClusterOutlined } from '@ant-design/icons-vue';
import { ElMessage } from 'element-plus';
import { reactive, ref } from 'vue'
import dalog from './dalog.vue'
import { ClusterOutlined } from '@ant-design/icons-vue'
import { ElMessage } from 'element-plus'
const options = [
{
value: true,
label: '是',
},
{
value: false,
label: '否',
},
{
value: true,
label: '是',
},
{
value: false,
label: '否',
},
]
//
const tableData = reactive<any[]>([])
const add = () => {
const length = tableData.push({
'#': tableData.length + 1,
'用户': '',
'是否队长': '',
'队员序号': '',
row: undefined,
});
openDialog(tableData[length - 1]);
const length = tableData.push({
'#': tableData.length + 1,
用户: '',
是否队长: '',
队员序号: '',
row: undefined,
})
openDialog(tableData[length - 1])
}
// dialogdialog
const target = ref<any>();
const target = ref<any>()
const openDialog = (row: any) => {
visible.value = true;
target.value = row;
visible.value = true
target.value = row
}
const visible = ref(false);
const visible = ref(false)
//
const handleSelected = (row: any) => {
if (tableData.some(o => o?.row?.id === row.id)) {
ElMessage({
message: '用户不能多选!',
type: 'error'
})
return
}
target.value['用户'] = row.realname;
target.value.row = row;
if (tableData.some((o) => o?.row?.id === row.id)) {
ElMessage({
message: '用户不能多选!',
type: 'error',
})
return
}
target.value['用户'] = row.realname
target.value.row = row
}
//
const submit = () => {
console.log(tableData);
console.log(tableData)
}
defineExpose({submit})
defineExpose({ submit })
</script>
<style lang="scss" scoped>
.form-box {
padding: 0 60px;
padding: 0 60px;
}
.table-box {
.table {
width: 100%;
}
.table {
width: 100%;
}
.pagin-box {
width: 100%;
height: 64px;
display: flex;
align-items: center;
.pagination {
padding: 0 24px;
:deep() {
.el-pagination__total {
margin-right: auto;
}
.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;
}
}
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>
</style>

File diff suppressed because it is too large Load Diff

@ -1,118 +1,155 @@
<template>
<el-dialog :modelValue="modelValue" @update:modelValue="(newValue: boolean) => $emit('update:modelValue', newValue)"
title="用户信息" width="800" draggable overflow>
<div class="table-box">
<el-table ref="multipleTableRef" border :data="tableData" @row-click="(row: any) => selectedRowId = row.id"
append-to-body class="table" v-loading="loading">
<el-table-column label="选择" width="55">
<template #default="scope">
<el-radio v-model="selectedRowId" :value="scope.row.id" />
</template>
</el-table-column>
<el-table-column label="序号">
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column property="realname" label="真实姓名" sortable />
<el-table-column property="work_no" label="学号" sortable />
</el-table>
</div>
<template #footer>
<div class="pagin-box">
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="params.pageNo"
v-model:page-size="params.pageSize" :page-sizes="[10, 20, 30, 40]"
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="total" @change="getList" />
</div>
<div class="dialog-footer">
<el-button @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button type="primary"
@click="() => { $emit('update:modelValue', false); $emit('selected', tableData.find(o => o.id === selectedRowId) || {}); }">确认</el-button>
</div>
</template>
</el-dialog>
<el-dialog
:modelValue="modelValue"
@update:modelValue="
(newValue: boolean) => $emit('update:modelValue', newValue)
"
title="用户信息"
width="800"
draggable
overflow
>
<div class="table-box">
<el-table
ref="multipleTableRef"
border
:data="tableData"
@row-click="(row: any) => (selectedRowId = row.id)"
append-to-body
class="table"
v-loading="loading"
>
<el-table-column label="选择" width="55">
<template #default="scope">
<el-radio v-model="selectedRowId" :value="scope.row.id" />
</template>
</el-table-column>
<el-table-column label="序号">
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column property="realname" label="真实姓名" sortable />
<el-table-column property="work_no" label="学号" sortable />
</el-table>
</div>
<template #footer>
<div class="pagin-box">
<el-pagination
class="pagination"
style="width: 100%"
v-model:current-page="params.pageNo"
v-model:page-size="params.pageSize"
:page-sizes="[10, 20, 30, 40]"
layout="slo, total,slot, sizes, prev, pager, next, jumper"
:total="total"
@change="getList"
/>
</div>
<div class="dialog-footer">
<el-button @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button
type="primary"
@click="
() => {
$emit('update:modelValue', false)
$emit(
'selected',
tableData.find((o) => o.id === selectedRowId) || {},
)
}
"
>
确认
</el-button>
</div>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue';
import { getMembersList } from '@/api/person';
import { useRoute } from 'vue-router';
import { ElMessage } from 'element-plus';
import { reactive, ref, watch } from 'vue'
import { getMembersList } from '@/api/person'
import { useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const props = defineProps(['modelValue']);
const $emit = defineEmits(['update:modelValue', 'selected']);
const route = useRoute();
const props = defineProps(['modelValue'])
const $emit = defineEmits(['update:modelValue', 'selected'])
const route = useRoute()
watch(() => props.modelValue, () => getList());
watch(
() => props.modelValue,
() => getList(),
)
//
const tableData = reactive<any[]>([]);
const selectedRowId = ref();
const tableData = reactive<any[]>([])
const selectedRowId = ref()
//
const total = ref(0);
const total = ref(0)
const params = reactive<any>({
pageNo: 1,
pageSize: 10,
onlRepUrlParamStr: `annualCompid=${route.query.objName}`,
entryFormat: '团队',
id: route.query.id,
pageNo: 1,
pageSize: 10,
onlRepUrlParamStr: `annualCompid=${route.query.objName}`,
entryFormat: '团队',
id: route.query.id,
})
const loading = ref(false);
const loading = ref(false)
const getList = async () => {
if (!props.modelValue) return
loading.value = true;
try {
const res: any = await getMembersList(params);
tableData.length = 0;
tableData.push(...res.result.records);
total.value = res.result.total;
} catch (error: any) {
ElMessage({
message: error.message,
type: 'error'
})
} finally {
loading.value = false;
}
if (!props.modelValue) return
loading.value = true
try {
const res: any = await getMembersList(params)
tableData.length = 0
tableData.push(...res.result.records)
total.value = res.result.total
} catch (error: any) {
ElMessage({
message: error.message,
type: 'error',
})
} finally {
loading.value = false
}
}
</script>
<style lang="scss" scoped>
.form-box {
padding: 0 60px;
padding: 0 60px;
}
.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;
}
}
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>
</style>

@ -1,163 +1,186 @@
<template>
<div>
<el-button type="primary" icon="Plus" @click="add" class="btn">新增</el-button>
<el-button type="danger" icon="Delete" @click="del" class="btn" v-show="isSele">删除</el-button>
<div class="table-box">
<el-table ref="multipleTableRef" @select="(selection: any[]) => isSele = !!selection.length" border
:data="tableData" class="table" height="276px">
<el-table-column type="selection" width="55" />
<el-table-column label="#" width="55">
<template #default="{ $index }">
{{ $index + 1 }}
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">用户</span>
</template>
<template #default="{ row }">
<el-input @click="openDialog(row)" v-model="row.realname" placeholder="请选择"
:prefix-icon="ClusterOutlined" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">是否队长</span>
</template>
<template #default="{ row }">
<el-cascader :modelValue="row.captain" @update:modelValue="(arr: any[]) => row.captain = arr[0]"
:options="options" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">队员序号</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teamSeq" />
</template>
</el-table-column>
</el-table>
</div>
<stu-dialog v-model="visible" @selected="handleSelected" />
<div>
<el-button type="primary" icon="Plus" @click="add" class="btn">
新增
</el-button>
<el-button
type="danger"
icon="Delete"
@click="del"
class="btn"
v-show="isSele"
>
删除
</el-button>
<div class="table-box">
<el-table
ref="multipleTableRef"
@select="(selection: any[]) => (isSele = !!selection.length)"
border
:data="tableData"
class="table"
height="276px"
>
<el-table-column type="selection" width="55" />
<el-table-column label="#" width="55">
<template #default="{ $index }">
{{ $index + 1 }}
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">用户</span>
</template>
<template #default="{ row }">
<el-input
@click="openDialog(row)"
v-model="row.realname"
placeholder="请选择"
:prefix-icon="ClusterOutlined"
/>
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">是否队长</span>
</template>
<template #default="{ row }">
<el-cascader
:modelValue="row.captain"
@update:modelValue="(arr: any[]) => (row.captain = arr[0])"
:options="options"
/>
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">队员序号</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teamSeq" />
</template>
</el-table-column>
</el-table>
</div>
<stu-dialog v-model="visible" @selected="handleSelected" />
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import stuDialog from './stuDialog.vue';
import { ClusterOutlined } from '@ant-design/icons-vue';
import { ElMessage } from 'element-plus';
import { reactive, ref } from 'vue'
import stuDialog from './stuDialog.vue'
import { ClusterOutlined } from '@ant-design/icons-vue'
import { ElMessage } from 'element-plus'
const options = [
{
value: '1',
label: '是',
},
{
value: '0',
label: '否',
},
{
value: '1',
label: '是',
},
{
value: '0',
label: '否',
},
]
//
const tableData = reactive<any[]>([])
const add = () => {
const length = tableData.push({
realname: '', //
captain: '', //
teamSeq: '', //
userId: '', // id
});
openDialog(tableData[length - 1]);
const length = tableData.push({
realname: '', //
captain: '', //
teamSeq: '', //
userId: '', // id
})
openDialog(tableData[length - 1])
}
// dialogdialog
const target = ref<any>();
const target = ref<any>()
const openDialog = (row: any) => {
visible.value = true;
target.value = row;
visible.value = true
target.value = row
}
const visible = ref(false);
const visible = ref(false)
//
const handleSelected = (row: any = {}) => {
if (tableData.some(o => o.userId === row.id)) {
ElMessage({
message: '用户不能多选!',
type: 'error'
})
return
}
if (tableData.some((o) => o.userId === row.id)) {
ElMessage({
message: '用户不能多选!',
type: 'error',
})
return
}
target.value.realname = row.realname;
target.value.userId = row.id;
target.value.realname = row.realname
target.value.userId = row.id
}
//
defineExpose({ submit: () => tableData })
//
const multipleTableRef = ref<any>(null);
const isSele = ref(false);
const multipleTableRef = ref<any>(null)
const isSele = ref(false)
const del = () => {
const rows = multipleTableRef.value.getSelectionRows()
rows.forEach((row: any) => {
const index = tableData.indexOf(row);
if (index === -1) return;
tableData.splice(index, 1);
})
const rows = multipleTableRef.value.getSelectionRows()
rows.forEach((row: any) => {
const index = tableData.indexOf(row)
if (index === -1) return
tableData.splice(index, 1)
})
}
</script>
<style lang="scss" scoped>
.btn {
margin-bottom: 20px;
margin-bottom: 20px;
}
.table-box {
.table {
width: 100%;
}
.table {
width: 100%;
}
.pagin-box {
width: 100%;
height: 64px;
display: flex;
align-items: center;
.pagination {
padding: 0 24px;
:deep() {
.el-pagination__total {
margin-right: auto;
}
.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;
}
}
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>
</style>

@ -1,121 +1,159 @@
<template>
<el-dialog :modelValue="modelValue" @update:modelValue="(newValue: boolean) => $emit('update:modelValue', newValue)"
append-to-body title="用户信息" width="1000" draggable overflow>
<div class="table-box">
<el-table ref="multipleTableRef" border :data="tableData" @row-click="(row: any) => selectedRowId = row.user_id"
class="table" v-loading="loading">
<el-table-column label="选择" width="55">
<template #default="scope">
<el-radio v-model="selectedRowId" :value="scope.row.user_id" />
</template>
</el-table-column>
<el-table-column label="序号">
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column property="realname" label="名字" sortable />
<el-table-column property="exp_title" label="学历" sortable />
<el-table-column property="exp_zc" label="职称" sortable />
<el-table-column property="teamajor" label="专业" sortable />
<el-table-column property="exp_yjfx" 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="params.pageNo"
v-model:page-size="params.pageSize" :page-sizes="[10, 20, 30, 40]"
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="total" @change="getList" />
</div>
</div>
<el-dialog
:modelValue="modelValue"
@update:modelValue="
(newValue: boolean) => $emit('update:modelValue', newValue)
"
append-to-body
title="用户信息"
width="1000"
draggable
overflow
>
<div class="table-box">
<el-table
ref="multipleTableRef"
border
:data="tableData"
@row-click="(row: any) => (selectedRowId = row.user_id)"
class="table"
v-loading="loading"
>
<el-table-column label="选择" width="55">
<template #default="scope">
<el-radio v-model="selectedRowId" :value="scope.row.user_id" />
</template>
</el-table-column>
<el-table-column label="序号">
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column property="realname" label="名字" sortable />
<el-table-column property="exp_title" label="学历" sortable />
<el-table-column property="exp_zc" label="职称" sortable />
<el-table-column property="teamajor" label="专业" sortable />
<el-table-column property="exp_yjfx" 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="params.pageNo"
v-model:page-size="params.pageSize"
:page-sizes="[10, 20, 30, 40]"
layout="slo, total,slot, sizes, prev, pager, next, jumper"
:total="total"
@change="getList"
/>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button type="primary"
@click="() => { $emit('update:modelValue', false); $emit('selected', tableData.find(o => o.user_id === selectedRowId) || {}); }">确认</el-button>
</div>
</template>
</el-dialog>
<template #footer>
<div class="dialog-footer">
<el-button @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button
type="primary"
@click="
() => {
$emit('update:modelValue', false)
$emit(
'selected',
tableData.find((o) => o.user_id === selectedRowId) || {},
)
}
"
>
确认
</el-button>
</div>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue';
import { getAdviserList } from '@/api/person';
import { useRoute } from 'vue-router';
import { ElMessage } from 'element-plus';
import { reactive, ref, watch } from 'vue'
import { getAdviserList } from '@/api/person'
import { useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const props = defineProps(['modelValue', 'type']);
const $emit = defineEmits(['update:modelValue', 'selected']);
const route = useRoute();
const props = defineProps(['modelValue', 'type'])
const $emit = defineEmits(['update:modelValue', 'selected'])
const route = useRoute()
watch(() => props.modelValue, () => getList());
watch(
() => props.modelValue,
() => getList(),
)
//
const tableData = reactive<any[]>([]);
const selectedRowId = ref();
const tableData = reactive<any[]>([])
const selectedRowId = ref()
//
const total = ref(0);
const total = ref(0)
const params = reactive<any>({
pageNo: 1,
pageSize: 10,
onlRepUrlParamStr: `annualCompid=${route.query.objName}`,
entryFormat: '团队',
id: route.query.id,
pageNo: 1,
pageSize: 10,
onlRepUrlParamStr: `annualCompid=${route.query.objName}`,
entryFormat: '团队',
id: route.query.id,
})
const loading = ref(false);
const loading = ref(false)
const getList = async () => {
if (!props.modelValue) return
loading.value = true;
try {
const res: any = await getAdviserList(params);
tableData.length = 0;
tableData.push(...res.result.records);
total.value = res.result.total;
} catch (error: any) {
ElMessage({
message: error.message,
type: 'error'
})
} finally {
loading.value = false;
}
if (!props.modelValue) return
loading.value = true
try {
const res: any = await getAdviserList(params)
tableData.length = 0
tableData.push(...res.result.records)
total.value = res.result.total
} catch (error: any) {
ElMessage({
message: error.message,
type: 'error',
})
} finally {
loading.value = false
}
}
</script>
<style lang="scss" scoped>
.form-box {
padding: 0 60px;
padding: 0 60px;
}
.pagin-box {
width: 100%;
height: 64px;
display: flex;
align-items: center;
width: 100%;
height: 64px;
display: flex;
align-items: center;
.pagination {
padding: 0 24px;
.pagination {
padding: 0 24px;
:deep() {
.el-pagination__total {
margin-right: auto;
}
: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;
}
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;
}
}
span.el-pagination__jump {
background-color: #f3f3f3;
padding: 2px 8px;
}
}
}
}
</style>
</style>

@ -1,217 +1,239 @@
<template>
<div>
<el-button type="primary" icon="Plus" @click="add" class="btn">新增</el-button>
<el-button type="danger" icon="Delete" @click="del" class="btn" v-show="isSele">删除</el-button>
<div class="table-box">
<el-table ref="multipleTableRef" border :data="tableData"
@select="(selection: any[]) => isSele = !!selection.length" height="276px">
<el-table-column type="selection" width="55" />
<el-table-column label="#" width="55">
<template #default="{ $index }">
{{ $index + 1 }}
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">指导老师类型</span>
</template>
<template #default="{ row }">
<el-cascader :modelValue="row.teacherType"
@update:modelValue="(arr: any[]) => row.teacherType = arr[0]" :options="options" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">指导老师姓名</span>
</template>
<template #default="{ row }">
<el-input @click="openDialog(row)" v-model="row.teacherName" placeholder="请选择"
:prefix-icon="ClusterOutlined" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">学历</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherXl" placeholder="请输入学历" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">职称</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherZc" placeholder="请输入职称" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">专业</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherZy" placeholder="请输入专业" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">研究方向</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherYjfx" placeholder="请输入研究方向" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px;">手机号</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherPhone" placeholder="请输入手机号" />
</template>
</el-table-column>
</el-table>
</div>
<tea-dialog v-model="visible" @selected="handleSelected" />
<div>
<el-button type="primary" icon="Plus" @click="add" class="btn">
新增
</el-button>
<el-button
type="danger"
icon="Delete"
@click="del"
class="btn"
v-show="isSele"
>
删除
</el-button>
<div class="table-box">
<el-table
ref="multipleTableRef"
border
:data="tableData"
@select="(selection: any[]) => (isSele = !!selection.length)"
height="276px"
>
<el-table-column type="selection" width="55" />
<el-table-column label="#" width="55">
<template #default="{ $index }">
{{ $index + 1 }}
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">指导老师类型</span>
</template>
<template #default="{ row }">
<el-cascader
:modelValue="row.teacherType"
@update:modelValue="(arr: any[]) => (row.teacherType = arr[0])"
:options="options"
/>
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">指导老师姓名</span>
</template>
<template #default="{ row }">
<el-input
@click="openDialog(row)"
v-model="row.teacherName"
placeholder="请选择"
:prefix-icon="ClusterOutlined"
/>
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">学历</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherXl" placeholder="请输入学历" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">职称</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherZc" placeholder="请输入职称" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">专业</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherZy" placeholder="请输入专业" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">研究方向</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherYjfx" placeholder="请输入研究方向" />
</template>
</el-table-column>
<el-table-column>
<template #header>
<el-icon>
<Edit />
</el-icon>
<span style="margin-left: 10px">手机号</span>
</template>
<template #default="{ row }">
<el-input v-model="row.teacherPhone" placeholder="请输入手机号" />
</template>
</el-table-column>
</el-table>
</div>
<tea-dialog v-model="visible" @selected="handleSelected" />
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import teaDialog from './teaDialog.vue';
import { ClusterOutlined } from '@ant-design/icons-vue';
import { ElMessage } from 'element-plus';
import { reactive, ref } from 'vue'
import teaDialog from './teaDialog.vue'
import { ClusterOutlined } from '@ant-design/icons-vue'
import { ElMessage } from 'element-plus'
const options = [
{
value: '1',
label: '指导老师',
},
{
value: '2',
label: '领队老师',
},
{
value: '1',
label: '指导老师',
},
{
value: '2',
label: '领队老师',
},
]
//
const tableData = reactive<any[]>([])
const add = () => {
const length = tableData.push({
teacherName: '',
teacherPhone: '',
teacherType: '',
teacherXl: '',
teacherYjfx: '',
teacherZc: '',
teacherZy: '',
teacherid: '',
});
openDialog(tableData[length - 1]);
const length = tableData.push({
teacherName: '',
teacherPhone: '',
teacherType: '',
teacherXl: '',
teacherYjfx: '',
teacherZc: '',
teacherZy: '',
teacherid: '',
})
openDialog(tableData[length - 1])
}
// dialogdialog
const target = ref<any>();
const target = ref<any>()
const openDialog = (row: any) => {
visible.value = true;
target.value = row;
visible.value = true
target.value = row
}
const visible = ref(false);
const visible = ref(false)
//
const handleSelected = (row: any = {}) => {
if (tableData.some(o => o.teacherid === row.user_id)) {
ElMessage({
message: '用户不能多选!',
type: 'error'
})
return
}
target.value.teacherName = row.realname;
target.value.teacherXl = row.exp_title;
target.value.teacherZc = row.exp_zc;
target.value.teacherZy = row.teamajor;
target.value.teacherYjfx = row.exp_yjfx;
target.value.teacherPhone = row.phone;
target.value.teacherid = row.user_id;
if (tableData.some((o) => o.teacherid === row.user_id)) {
ElMessage({
message: '用户不能多选!',
type: 'error',
})
return
}
target.value.teacherName = row.realname
target.value.teacherXl = row.exp_title
target.value.teacherZc = row.exp_zc
target.value.teacherZy = row.teamajor
target.value.teacherYjfx = row.exp_yjfx
target.value.teacherPhone = row.phone
target.value.teacherid = row.user_id
}
//
const submit = () => tableData;
const submit = () => tableData
defineExpose({ submit })
//
const multipleTableRef = ref<any>(null);
const isSele = ref(false);
const multipleTableRef = ref<any>(null)
const isSele = ref(false)
const del = () => {
const rows = multipleTableRef.value.getSelectionRows()
rows.forEach((row: any) => {
const index = tableData.indexOf(row);
if (index === -1) return;
tableData.splice(index, 1);
})
const rows = multipleTableRef.value.getSelectionRows()
rows.forEach((row: any) => {
const index = tableData.indexOf(row)
if (index === -1) return
tableData.splice(index, 1)
})
}
</script>
<style lang="scss" scoped>
.btn {
margin-bottom: 20px;
margin-bottom: 20px;
}
.table-box {
.table {
width: 100%;
}
.table {
width: 100%;
}
.pagin-box {
width: 100%;
height: 64px;
display: flex;
align-items: center;
.pagination {
padding: 0 24px;
:deep() {
.el-pagination__total {
margin-right: auto;
}
.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;
}
}
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>
</style>

@ -226,10 +226,7 @@ const submit = () => {
})
})
.finally(() => (loading.value = false))
}
</script>
<style lang="scss" scoped>

@ -53,12 +53,7 @@
/>
<el-table-column align="center" label="操作">
<template #default="{ row }">
<el-button
link
type="primary"
size="small"
@click="uploadZs(row.id)"
>
<el-button link type="primary" size="small" @click="uploadZs(row.id)">
上传证书
</el-button>
</template>
@ -95,7 +90,7 @@
<script lang="ts" setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
import { getAwardslist, uploadFileZs,saveSz } from '@/api/race'
import { getAwardslist, uploadFileZs, saveSz } from '@/api/race'
const dialogVisible = ref(false)
const tableData = ref<any>([])
const getAwardListApi = async () => {
@ -117,8 +112,8 @@ const setImageUrl = (url: string) => {
const fileList = ref<any>([])
const zsUrl = ref('')
const zsId = ref(0)
const uploadZs = (id:any) => {
zsId.value = id
const uploadZs = (id: any) => {
zsId.value = id
dialogVisible.value = true
}
const uploadFileEvent = async () => {
@ -128,21 +123,19 @@ const uploadFileEvent = async () => {
zsUrl.value = res.message
}
const submit = async () => {
await uploadFileEvent()
let data = {
id:zsId.value,
sczs:zsUrl.value
}
await saveSz(data)
getAwardListApi()
await uploadFileEvent()
let data = {
id: zsId.value,
sczs: zsUrl.value,
}
await saveSz(data)
getAwardListApi()
dialogVisible.value = false
fileList.value = []
}
const handleClose = () => {
dialogVisible.value = false
fileList.value = []
}
watch(
() => fileList.value,

@ -7,7 +7,6 @@
</div>
</div>
<div class="container-1420">
<el-card>
<div class="user-info-main">
<div class="left">
@ -35,12 +34,14 @@
<div class="info-box">
<div class="label">姓名</div>
<div class="text">{{ useUserStore.userInfo.realname}}</div>
<div class="text">{{ useUserStore.userInfo.realname }}</div>
</div>
<div class="info-box">
<div class="label">姓别</div>
<div class="text">{{ useUserStore.userInfo.sex === 1 ? '男' : '女' }}</div>
<div class="text">
{{ useUserStore.userInfo.sex === 1 ? '男' : '女' }}
</div>
</div>
<div class="info-box">
<div class="label">生日</div>
@ -223,7 +224,7 @@ const submit = async () => {
await editUserInfoApi(data)
useUserStore.getUserInfo()
userInfo.value = useUserStore.userInfo
dialogVisible.value = false
}
onMounted(() => {})

@ -1,5 +1,5 @@
declare module '*.vue' {
import { DefineComponent } from "vue"
const component: ReturnType<typeof DefineComponent>
export default component
}
import { DefineComponent } from 'vue'
const component: ReturnType<typeof DefineComponent>
export default component
}

@ -26,6 +26,11 @@
},
"types": ["vite/client"]
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/utils/rem.js"],
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"src/utils/rem.js"
],
"references": [{ "path": "./tsconfig.node.json" }]
}

@ -3,12 +3,11 @@ import vue from '@vitejs/plugin-vue'
import path from 'path'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
//@ts-ignore
import postcssPluginPx2rem from "postcss-plugin-px2rem"; //引入插件
import postcssPluginPx2rem from 'postcss-plugin-px2rem' //引入插件
//配置参数
//配置参数
const px2remOptions = {
rootValue: 192, //换算基数, 默认100 ,也就是1440px ,这样的话把根标签的字体规定为1rem为50px,这样就可以从设计稿上量出多少个px直接在代码中写多少px了
rootValue: 192, //换算基数, 默认100 ,也就是1440px ,这样的话把根标签的字体规定为1rem为50px,这样就可以从设计稿上量出多少个px直接在代码中写多少px了
unitPrecision: 5, //允许REM单位增长到的十进制数字,其实就是精度控制
// propWhiteList: [], // 默认值是一个空数组,这意味着禁用白名单并启用所有属性。
// propBlackList: [], // 黑名单
@ -17,7 +16,7 @@ const px2remOptions = {
// ignoreIdentifier: false, //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。
// replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。
mediaQuery: false, //(布尔值)允许在媒体查询中转换px
minPixelValue: 0 , //设置要替换的最小像素值(3px会被转rem)。 默认 0
minPixelValue: 0, //设置要替换的最小像素值(3px会被转rem)。 默认 0
}
export default defineConfig({
plugins: [
@ -30,10 +29,9 @@ export default defineConfig({
symbolId: 'icon-[dir]-[name]',
}),
],
server:{
server: {
host: '0.0.0.0',
port: 8866,
},
resolve: {
alias: {
@ -51,8 +49,7 @@ export default defineConfig({
postcss: {
plugins: [
// 配置响应式插件
postcssPluginPx2rem(px2remOptions)
postcssPluginPx2rem(px2remOptions),
],
},
},

Loading…
Cancel
Save