This commit is contained in:
zhouwentao 2024-07-03 17:20:48 +08:00
parent 082d0e44a1
commit 88b4f5e155
89 changed files with 18891 additions and 1358 deletions

View File

@ -1,7 +1,7 @@
# .env.production 和这个一样
# the APP baseURL
VITE_APP_BASE_URL = 'http://192.168.0.102:8080/jeecg-boot/'
# VITE_APP_BASE_URL = 'http://127.0.0.1:8080/jeecg-boot/'
VITE_APP_BASE_URL = 'https://www.yitisheng.vip/jbt/'
# the token key
VITE_APP_TOKEN_KEY = 'your_token_key'

12
.env.production Normal file
View File

@ -0,0 +1,12 @@
# .env.production 和这个一样
# the APP baseURL
VITE_APP_BASE_URL = 'https://www.yitisheng.vip/jbt/'
# the token key
VITE_APP_TOKEN_KEY = 'your_token_key'
# the upload url
VITE_UPLOAD_URL = '/'
# app title
VITE_APP_TITLE = '艺体志愿宝'

2
.gitignore vendored
View File

@ -7,7 +7,7 @@ yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
*node_modules*
dist
dist-ssr
*.local

View File

@ -2,12 +2,14 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue</title>
<title></title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3298682935034485"
crossorigin="anonymous"></script>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

5762
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,9 +9,16 @@
"preview": "vite preview"
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"@types/echarts": "^4.9.22",
"axios": "^1.3.2",
"echarts": "^5.5.0",
"el-table-infinite-scroll": "^3.0.3",
"element-plus": "^2.2.16",
"less": "^4.2.0",
"lodash": "^4.17.21",
"mitt": "^3.0.1",
"sass": "^1.75.0",
"swiper": "^7.4.1",
"vue": "^3.2.37",
"vue-i18n": "^9.2.2",
@ -23,6 +30,7 @@
"@vitejs/plugin-vue": "^3.1.0",
"unplugin-auto-import": "^0.11.5",
"unplugin-vue-components": "^0.22.12",
"vite": "^3.1.0"
"vite": "^3.1.0",
"vite-plugin-svg-icons": "^2.0.1"
}
}

3003
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

566
public/icon.svg Normal file
View File

@ -0,0 +1,566 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="132px" height="132px" viewBox="0 0 132 132" enable-background="new 0 0 132 132" xml:space="preserve"> <image id="image0" width="132" height="132" x="0" y="0"
xlink:href="data:image/png;base64,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
rkJggg==" />
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -11,66 +11,99 @@
</el-footer>
</el-container>
</div>
<div v-if="false">
<el-config-provider :locale="elLocale">
<div>
<a href="https://vitejs.dev" target="_blank">
<img src="/vite.svg" class="logo" alt="Vite logo" />
</a>
<a href="https://vuejs.org/" target="_blank">
<img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
</a>
</div>
<!--登录弹框-->
<el-dialog
v-model="state.loginDialogVisible"
title=" "
width="20em"
:closeOnClickModal="false"
:show-close="false"
>
<template #header>
<div style="display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin: 0;">登录</h3>
<el-icon @click="closeLoginDialog" class="el-dialog__headerbtn"><Close /></el-icon>
</div>
</template>
<!-- 在这里放置登录内 -->
<Login/>
</el-dialog>
<el-switch
v-model="langSwitch"
style="
--el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949;
margin: 10px auto 20px;
display: block;
"
inline-prompt
active-text="中"
inactive-text="英"
@change="handleChangeI18n"
/>
<el-color-picker v-model="colorPicker" />
<!-- <Login /> -->
<router-view></router-view>
</el-config-provider>
</div>
<!--更改成绩弹框-->
<el-dialog
v-model="state.editScoreDialogVisible"
title=" "
width="40em"
:closeOnClickModal="false"
:show-close="false"
>
<template #header>
<div style="display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin: 0;">请填写您的高考信息</h3>
<el-icon @click="closeLoginDialog" class="el-dialog__headerbtn"><Close /></el-icon>
</div>
</template>
<!-- 在这里放置登录内 -->
<EditScoreInfo/>
</el-dialog>
</template>
<script setup>
import { ref, computed } from "vue";
import { ref, computed ,provide, reactive} from "vue";
import { useRouter } from 'vue-router';
// i18n
import { useI18n } from "vue-i18n";
// Element Plus
import zhCn from "element-plus/dist/locale/zh-cn.mjs";
import en from "element-plus/dist/locale/en.mjs";
import Header from "@/components/Header.vue";
const state = reactive({
loginDialogVisible:false,//
editScoreDialogVisible:false,//
})
const router = useRouter();
const { locale } = useI18n({ useScope: "global" }); // vue-i18n useI18n(),locale
locale.value = localStorage.getItem("locale") || "zh_CN"; //
if (localStorage.getItem("locale") === undefined ||localStorage.getItem("locale") === null || localStorage.getItem("locale") === '') {
//
localStorage.setItem("locale",'zh_CN')
}
locale.value = localStorage.getItem("locale") || "zh_CN"; //
const elLocale = computed(() => (locale.value === "zh_CN" ? zhCn : en)); // Element Plus
//
const langSwitch = ref(locale.value === "zh_CN");
//
const handleChangeI18n = (val) => {
// console.log(val);
locale.value = val ? "zh_CN" : "en_US"; // truefalse
localStorage.setItem("locale", locale.value); //
};
//
const colorPicker = ref("#409EFF");
//
const openLogin = () => {
state.loginDialogVisible=true
};
provide('openLogin', openLogin);
//
const openEditScore = () => {
state.editScoreDialogVisible=true
};
provide('openEditScore', openEditScore);
//
const closeLoginDialog=()=>{
//
state.loginDialogVisible = false
state.editScoreDialogVisible = false
//console.log(router.currentRoute.value.path)
// let nowPath = router.currentRoute.value.path
// if(nowPath === '/fillVolunteer'){
// router.push({path: "/index"});
// }else if(nowPath === '/index'){
// }
}
// Element Plus
//import zhCn from "element-plus/dist/locale/zh-cn.mjs";
//import en from "element-plus/dist/locale/en.mjs";
// const elLocale = computed(() => (locale.value === "zh_CN" ? zhCn : en)); // Element Plus
// //
// const langSwitch = ref(locale.value === "zh_CN");
// //
// const handleChangeI18n = (val) => {
// locale.value = val ? "zh_CN" : "en_US"; // truefalse
// localStorage.setItem("locale", locale.value); //
// };
</script>
<style scoped>
@ -90,5 +123,6 @@ const colorPicker = ref("#409EFF");
margin: 0;
padding: 10px 0;
width: auto;
min-height: 700px;
}
</style>

View File

@ -1,71 +0,0 @@
<!-- src/App.vue -->
<template>
<el-config-provider :locale="elLocale">
<div>
<a href="https://vitejs.dev" target="_blank">
<img src="/vite.svg" class="logo" alt="Vite logo" />
</a>
<a href="https://vuejs.org/" target="_blank">
<img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
</a>
</div>
<el-switch
v-model="langSwitch"
style="
--el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949;
margin: 10px auto 20px;
display: block;
"
inline-prompt
active-text="中"
inactive-text="英"
@change="handleChangeI18n"
/>
<el-color-picker v-model="colorPicker" />
<!-- <Login /> -->
<router-view></router-view>
</el-config-provider>
</template>
<script setup>
// import Login from "./components/Login.vue";
import { ref, computed } from "vue";
// i18n
import { useI18n } from "vue-i18n";
// Element Plus
import zhCn from "element-plus/dist/locale/zh-cn.mjs";
import en from "element-plus/dist/locale/en.mjs";
const { locale } = useI18n({ useScope: "global" }); // vue-i18n useI18n(),locale
locale.value = localStorage.getItem("locale") || "zh_CN"; //
const elLocale = computed(() => (locale.value === "zh_CN" ? zhCn : en)); // Element Plus
//
const langSwitch = ref(locale.value === "zh_CN");
//
const handleChangeI18n = (val) => {
// console.log(val);
locale.value = val ? "zh_CN" : "en_US"; // truefalse
localStorage.setItem("locale", locale.value); //
};
//
const colorPicker = ref("#409EFF");
</script>
<style scoped>
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

View File

@ -0,0 +1,37 @@
//注意Sass定义私有成员是使用-或开头例如定义$--color-black-10这种是私有变量使用additionalData: `@use 引入时无法读取
//黑色
$color-black-10: #f7f8fa;
$color-black-20: #f2f3f5;
$color-black-23: #eeeff2;
$color-black-25: #ebecf0;
$color-black-30: #e5e6eb;
$color-black-35: #d7dae0;
$color-black-40: #c9cdd4;
$color-black-45: #b9bdc6;
$color-black-50: #a9aeb8;
$color-black-60: #86909c;
$color-black-70: #6b7785;
$color-black-80: #4e5969;
$color-black-90: #272e3b;
$color-black-100: #1d2129;
//蓝色
$color-blue-05:#eaf1f9;
$color-blue-10:#ecf5ff;
$color-blue-20:#d9ecff;
$color-blue-30:#c6e2ff;
$color-blue-40:#a0cfff;
$color-blue-50:#79bbff;
$color-blue-60:#409eff;
$color-blue-70:#337ecc;
//外边距
@for $i from 5 through 50 {
.margin-#{$i} {
margin: #{$i}px;
}
}
.a-button{
cursor: pointer;
}

View File

@ -1,21 +0,0 @@
.wrap {
width: 1210px;
}
.flexWrap {
display: flex;
flex-direction: row;
flex-wrap: wrap
}
.main-container {
margin: 0 auto;
}
.cms-back-to-top:before {
content: "\e903";
}
.margin-top-5 {
margin-top: 5px;
}

421
src/assets/css/base.scss Normal file
View File

@ -0,0 +1,421 @@
.wrap {
//width: 1210px;
width: 80%;
}
// 单行显示
.flex{
display: flex;
}
.flexWrap{
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.align-items{
align-items: center;
}
//悬浮有小手指
.pointer{
cursor: pointer;
}
.flex-item-03 {
width: 3%;
}
.flex-item-05 {
width: 5%;
}
.flex-item-06 {
width: 6%;
}
.flex-item-07 {
width: 7%;
}
.flex-item-09 {
width: 9%;
}
.flex-item-1 {
width: 10%;
}
.flex-item-12 {
width: 12%;
}
.flex-item-15 {
width: 15%;
}
.flex-item-17 {
width: 17%;
}
.flex-item-2 {
width: 20%;
}
.flex-item-21 {
width: 21%;
}
.flex-item-22 {
width: 22%;
}
.flex-item-25 {
width: 25%;
}
.flex-item-26 {
width: 26%;
}
.flex-item-28 {
width: 28%;
}
.flex-item-3 {
width: 30%;
}
.flex-item-33 {
width: 33%;
}
.flex-item-36 {
width: 36%;
}
.flex-item-38 {
width: 38%;
}
.flex-item-35 {
width: 35%;
}
.flex-item-4 {
width: 40%;
}
.flex-item-42 {
width: 42%;
}
.flex-item-45 {
width: 45%;
}
.flex-item-5 {
width: 50%;
}
.flex-item-55 {
width: 55%;
}
.flex-item-58 {
width: 58%;
}
.flex-item-6 {
width: 60%;
}
.flex-item-65 {
width: 65%;
}
.flex-item-7 {
width: 70%;
}
.flex-item-73 {
width: 73%;
}
.flex-item-75 {
width: 75%;
}
.flex-item-77 {
width: 77%;
}
.flex-item-8 {
width: 80%;
}
.flex-item-85 {
width: 85%;
}
.flex-item-87 {
width: 87%;
}
.flex-item-88 {
width: 88%;
}
.flex-item-9 {
width: 90%;
}
.flex-item-10 {
width: 100%;
}
.main-container {
margin: auto auto;
}
.cms-back-to-top:before {
content: "\e903";
}
.icon20 {
width: 20px;
}
.icon32 {
width: 32px;
}
.icon64 {
width: 64px;
}
//行高
.lh-30 {
line-height: 30px;
}
.lh-50 {
line-height: 50px;
}
/*-----------字体大小start---------*/
.font-size-10 {
font-size: 10px;
}
.font-size-13 {
font-size: 13px;
}
.font-size-14 {
font-size: 14px;
}
.font-size-15 {
font-size: 15px;
}
.font-size-16 {
font-size: 16px;
}
.font-size-17 {
font-size: 17px;
}
.fs-20 {
font-size: 20px;
}
.font-size-20 {
font-size: 20px;
}
.fs-25 {
font-size: 25px;
}
.font-size-25 {
font-size: 25px;
}
.font-size-30 {
font-size: 30px;
}
.fw-5 {
font-weight: 500;
}
.fw-52 {
font-weight: 520;
}
.fw-55 {
font-weight: 550;
}
.fw-6 {
font-weight: 600;
}
/*-----------字体大小end---------*/
/*-----------外边距start---------*/
.m-5 {
margin: 5px;
}
.m-10 {
margin: 10px;
}
.m-15 {
margin: 15px;
}
.m-20 {
margin: 20px;
}
.mt-5 {
margin-top: 5px;
}
.mt-10 {
margin-top: 10px;
}
.mt-15 {
margin-top: 15px;
}
.mt-20 {
margin-top: 20px;
}
.mt-30 {
margin-top: 30px;
}
.mb-5 {
margin-bottom: 5px;
}
.mb-10 {
margin-bottom: 10px;
}
.mb-15 {
margin-bottom: 15px;
}
.mb-30 {
margin-bottom: 30px;
}
.mr-2 {
margin-right: 2px;
}
.mr-5 {
margin-right: 5px;
}
.mr-10 {
margin-right: 10px;
}
/*-----------外边距end-----------*/
/*-----------内边距start-----------*/
.pt-5 {
padding-top: 5px;
}
.pt-10 {
padding-top: 10px;
}
.pb-5 {
padding-bottom: 5px;
}
.pb-10 {
padding-bottom: 10px;
}
.pl-5 {
padding-left: 5px;
}
.pl-10 {
padding-left: 10px;
}
.pl-20 {
padding-left: 20px;
}
.pr-5 {
padding-right: 5px;
}
.pr-10 {
padding-right: 10px;
}
.pd-5 {
padding: 5px;
}
.pd-15 {
padding: 15px;
}
.p-20 {
padding: 20px;
}
.pd-0-15{
padding: 0 15px;
}
/*-----------内边距end-----------*/
/*-----------颜色start-----------*/
.black {
color: black;
}
.black1 {
color: #111111;
}
/*-----------颜色end-----------*/
.trans3{
transition: all 0.3s;
}
.trans-10 {
transition: all 1s;
}
.textCenter {
text-align: center;
}
.showClick{
cursor: pointer;
}
/*通用上边框*/
.border-top {
border-top: 2px solid #f2f2f2;
}
.border-bottom {
border-bottom: 2px solid #f2f2f2;
}

168
src/assets/css/common.scss Normal file
View File

@ -0,0 +1,168 @@
@use "_global" as *;
.active-blue{
color: $color-blue-60;
font-weight: 600;
}
/*开设院校 start*/
//院校列表
.schoolList {
.schoolItem {
cursor: pointer;
border-bottom: 1px solid #e4e7ed;
padding: 15px 0;
.right {
padding-left: 10px;
}
.schoolName {
padding-top: 30px;
font-size: 25px;
transition: all 0.3s;
}
.schoolName-active {
color: $color-blue-60;
font-weight: 600;
}
.tags {
padding-top: 20px;
.tag {
height: 10px;
line-height: 10px;
border-right: 2px solid #e4e7ed;
padding-right: 10px;
margin-right: 10px;
}
.tag:last-child {
border: none;
}
}
}
.schoolItem:last-child {
border: none;
}
.schoolItem:hover .schoolName {
color: $color-blue-60;
}
}
/*开设院校 end */
/**专业列表 start*/
.majorList {
overflow-y: auto;
max-height: 300px;
.majorItem {
cursor: pointer;
// margin: 15px 0;
padding: 15px 0;
font-size: 15px;
border-bottom: 1px solid #ebeef5;
}
.majorItem:last-child{
border-bottom: none;
}
.majorItem .majorName {
font-size: 17px;
font-weight: 550;
transition: all 0.3s;
}
.majorItem:hover .majorName {
color: $color-blue-60;
}
}
/**专业列表 end*/
/**筛选栏 start*/
.filterBody {
background-color: white;
border-radius: 0 0 5px 0;
padding: 15px;
color: #86909c;
border-bottom: 1px solid #ebeef5;
line-height: 35px;
}
.filterBody .clearFilterButton {
cursor: pointer;
line-height: 50px;
color: $color-blue-60;
}
.filterBody .tags {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.filterBody .tags .tag {
cursor: pointer;
margin-bottom: 10px;
margin-right: 15px;
color: black;
font-size: 14px;
padding: 0 7px;
border-radius: 4px;
border: 1px solid white;
}
.filterBody .tags .tag-active {
color: $color-blue-60;
border: 1px solid $color-blue-60;
position: relative;
}
/**筛选栏 end*/
/**微信登录二维码 start*/
.w-qr-status-text {
text-align: center;
display: flex;
width: 250px;
height: 48px;
align-items: center;
justify-content: center;
color: #aaa;
margin-top: 10px;
}
.w-qr-dead:before {
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .9);
border-radius: 50%;
color: #fff;
content: '码已过期,点击刷新';
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.w-qr_message {
cursor: pointer;
position: absolute;
width: 15em;
height: 178px;
left: 160px;
top: 80px;
transform: translateX(-50%);
background: #fff;
opacity: .9;
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
}
/**微信登录二维码 end*/

View File

@ -1,6 +1,4 @@
//注意Sass定义私有成员是使用-或开头例如定义$--color-black-10这种是私有变量使用additionalData: `@use 引入时无法读取
//黑色
$color-black-10: #f7f8fa;
$color-black-20: #f2f3f5;
@ -18,6 +16,7 @@ $color-black-90: #272e3b;
$color-black-100: #1d2129;
//蓝色
$color-blue-05:#eaf1f9;
$color-blue-10:#ecf5ff;
$color-blue-20:#d9ecff;
$color-blue-30:#c6e2ff;

View File

@ -0,0 +1,70 @@
.border-t{
border-top: 1px solid #ebeef5;
}
.border-b{
border-bottom: 1px solid #ebeef5;
}
.border-l{
border-left: 1px solid #ebeef5;
}
.border-r{
border-right: 1px solid #ebeef5;
}
.border-eb{
border: 1px solid #e4e7ed;
border-radius: 4px;
}
.bgd-while{
background-color: white;
}
/*-----------颜色start-----------*/
.black{
color: black;
}
.black1{
color: #111111;
}
.while{
color: #ffffff;
}
.darkturquoise {
color: darkturquoise !important;
}
.blue {
color: #4975fd !important;
}
.green {
color: #3e8e43 !important;
}
.lightGreen {
color: #85e689 !important;
}
.red {
color: red !important;
}
.redBlack{
color: #bb0303 !important;
}
.orange {
color: #f9ca1b !important;
}
.redOrange2 {
color :#f2891b !important;
/*color: #f2891b !important;*/
}
.redOrange {
color :#f96543 !important;
/*color: #f2891b !important;*/
}
.royalBlue{
color: #4975fd;
}
/*-----------颜色end-----------*/

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1715146263108" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="20749" width="128" height="128" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M242.190871 182.705394h531.120332v658.589212H242.190871z" fill="#FFFFFF" p-id="20750"></path><path d="M509.985992 288.258124h-10.32498c-18.954622 0-36.855502 7.456929-50.396946 20.998374-13.541444 13.545693-20.998373 31.442324-20.998373 50.401195v103.262539h153.128365V359.657693c-0.004249-39.370888-32.037178-71.399568-71.408066-71.399569z m-1.427652-257.261941c-273.382506 0-495.004149 221.621643-495.004149 495.004149 0 273.386755 221.621643 495.004149 495.004149 495.004149 273.382506 0 495.004149-221.617394 495.00415-495.004149-0.004249-273.382506-221.621643-495.004149-495.00415-495.004149z m205.445843 734.067784H295.655568V462.924481h68.875685V359.657693c0-35.980216 14.085311-69.886938 39.664067-95.465693 25.578755-25.583004 59.485477-39.668315 95.465692-39.668315h10.32498c74.522556 0 135.138257 60.61995 135.138257 135.134008v103.262539h68.879934v302.143735z" fill="#F06262" p-id="20751"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1715144038215" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1680" width="128" height="128" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M352.814545 385.396364m-33.512727 0a33.512727 33.512727 0 1 0 67.025455 0 33.512727 33.512727 0 1 0-67.025455 0Z" fill="#2ccd1d" p-id="1681"></path><path d="M502.690909 384.465455m-33.512727 0a33.512727 33.512727 0 1 0 67.025454 0 33.512727 33.512727 0 1 0-67.025454 0Z" fill="#2ccd1d" p-id="1682"></path><path d="M576.232727 534.341818m-23.272727 0a23.272727 23.272727 0 1 0 46.545455 0 23.272727 23.272727 0 1 0-46.545455 0Z" fill="#2ccd1d" p-id="1683"></path><path d="M694.458182 536.203636m-23.272727 0a23.272727 23.272727 0 1 0 46.545454 0 23.272727 23.272727 0 1 0-46.545454 0Z" fill="#2ccd1d" p-id="1684"></path><path d="M512 0C229.003636 0 0 229.003636 0 512s229.003636 512 512 512 512-229.003636 512-512S794.996364 0 512 0z m-87.505455 630.225455c-26.996364 0-48.407273-5.585455-75.403636-11.17091l-75.403636 37.236364 21.410909-64.232727c-53.992727-37.236364-85.643636-85.643636-85.643637-145.221818 0-102.4 96.814545-182.458182 215.04-182.458182 105.192727 0 198.283636 64.232727 216.901819 150.807273-6.516364-0.930909-13.963636-0.930909-20.48-0.93091-102.4 0-182.458182 76.334545-182.458182 170.356364 0 15.825455 2.792727 30.72 6.516363 44.683636-7.447273 0-13.963636 0.930909-20.48 0.93091z m314.647273 75.403636l15.825455 53.992727-58.647273-32.581818c-21.410909 5.585455-42.821818 11.170909-64.232727 11.170909-102.4 0-182.458182-69.818182-182.458182-155.461818s80.058182-155.461818 182.458182-155.461818c96.814545 0 182.458182 69.818182 182.458182 155.461818 0 47.476364-31.650909 90.298182-75.403637 122.88z" fill="#2ccd1d" p-id="1685"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 765 B

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1587309384021" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1846" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1010.8 628c0-141.2-141.3-256.2-299.9-256.2-168 0-300.3 115.1-300.3 256.2 0 141.4 132.3 256.2 300.3 256.2 35.2 0 70.7-8.9 106-17.7l96.8 53-26.6-88.2c70.9-53.2 123.7-123.7 123.7-203.3zM618 588.8c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40c0 22-17.9 40-40 40z m194.3-0.3c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40z" fill="#00C800" p-id="1847"></path><path d="M366.3 106.9c-194.1 0-353.1 132.3-353.1 300.3 0 97 52.9 176.6 141.3 238.4l-35.3 106.2 123.4-61.9c44.2 8.7 79.6 17.7 123.7 17.7 11.1 0 22.1-0.5 33-1.4-6.9-23.6-10.9-48.3-10.9-74 0-154.3 132.5-279.5 300.2-279.5 11.5 0 22.8 0.8 34 2.1C692 212.6 539.9 106.9 366.3 106.9zM247.7 349.2c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z m246.6 0c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z" fill="#00C800" p-id="1848"></path></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

Before

Width:  |  Height:  |  Size: 496 B

119
src/axios/UserApi.ts Normal file
View File

@ -0,0 +1,119 @@
// src/axios/api.js
import ApiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http';
export const getScore = () =>{
axiosInstance({
url: ApiConstant.Score.getScore,
method: 'get',
params: {},
showLoading: false,//是否显示加载图标
}).then((response) => {
return response.data
}).then((data) => {
if(data.success){
//将成绩信息保存到缓存中
localStorage.setItem('scoreInfo',JSON.stringify(data.result.scoreInfo))
localStorage.setItem('fillVolunteer',JSON.stringify(data.result.fillVolunteer))
localStorage.setItem('volunteer',JSON.stringify(data.result.volunteer))
}
//有数据情况下
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
export const registerUser = (params:any) => {
return axiosInstance({
url: ApiConstant.User.register,
method: 'POST',
data: params,
showLoading:true
}).then((response) => {
return response.data;
}).catch((error: any) => {
console.log(error);
throw error;
});
};
export const passwordChanger = (params:any) => {
return axiosInstance({
url: ApiConstant.User.passwordChanger,
method: 'POST',
data: params,
showLoading:true
}).then((response) => {
return response.data;
}).catch((error: any) => {
console.log(error);
throw error;
});
};
// // 登录
// export const Login = (data) => {
// return service({
// url: "/login",
// method: "post",
// data,
// });
// };
// // Get请求
// export const Get = (url, data) => {
// return service({
// url,
// method: "get",
// params: data,
// });
// };
// // Delete请求
// export const Delete = (url) => {
// return service({
// url,
// method: "delete",
// });
// };
// // Post请求
// export const Post = (url, data) => {
// return service({
// url,
// method: "post",
// data,
// });
// };
// // 上传文件请求
// export const PostFile = (url, data, onUploadProgress) => {
// return service({
// url,
// method: "post",
// data,
// headers: {
// "Content-Type": "multipart/form-data",
// },
// onUploadProgress,
// });
// };
// // Put请求
// export const Put = (url, data) => {
// return service({
// url,
// method: "put",
// data,
// });
// };
// // Patch请求
// export const Patch = (url, data) => {
// return service({
// url,
// method: "patch",
// data,
// });
// };

View File

@ -1,68 +0,0 @@
// src/axios/api.js
import service from "./request";
// 登录
export const Login = (data) => {
return service({
url: "/login",
method: "post",
data,
});
};
// Get请求
export const Get = (url, data) => {
return service({
url,
method: "get",
params: data,
});
};
// Delete请求
export const Delete = (url) => {
return service({
url,
method: "delete",
});
};
// Post请求
export const Post = (url, data) => {
return service({
url,
method: "post",
data,
});
};
// 上传文件请求
export const PostFile = (url, data, onUploadProgress) => {
return service({
url,
method: "post",
data,
headers: {
"Content-Type": "multipart/form-data",
},
onUploadProgress,
});
};
// Put请求
export const Put = (url, data) => {
return service({
url,
method: "put",
data,
});
};
// Patch请求
export const Patch = (url, data) => {
return service({
url,
method: "patch",
data,
});
};

160
src/axios/api.ts Normal file
View File

@ -0,0 +1,160 @@
// src/axios/api.js
import ApiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http';
export const getScore = () =>{
axiosInstance({
url: ApiConstant.Score.getScore,
method: 'get',
params: {},
showLoading: false,//是否显示加载图标
}).then((response) => {
return response.data
}).then((data) => {
if(data.success){
//将成绩信息保存到缓存中
localStorage.setItem('scoreInfo',JSON.stringify(data.result.scoreInfo))
localStorage.setItem('fillVolunteer',JSON.stringify(data.result.fillVolunteer))
localStorage.setItem('volunteer',JSON.stringify(data.result.volunteer))
}
//有数据情况下
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
export const getRulesEnrollrobabilityMenuList =async (professionalCategory:string) =>{
try {
const response = await axiosInstance({
url: ApiConstant.Major.rulesEnrollrobabilityMenuList,
method: 'get',
params: { professionalCategory: professionalCategory },
showLoading: false, // 是否显示加载图标
});
const data = response.data;
if (data.success) {
// 将成绩信息保存到缓存中
return data.result;
} else {
return [];
}
} catch (error) {
console.log(error);
return [];
}
}
export const checkPhoneAvailable = (phone: any) => {
return axiosInstance({
url: ApiConstant.User.checkPhoneAvailable,
method: 'get',
params: { phone: phone },
showLoading: false, // 是否显示加载图标
}).then((response) => {
return response.data;
}).then((data) => {
if (data.success) {
// 将成绩信息保存到缓存中
return data.result;
}
// 有数据情况下
}).catch((error: any) => {
console.log(error);
throw error; // 抛出错误以便在调用处处理
});
};
// 获取资讯信息列表
export const getArticleList = async (type:any,pageNum:Number) =>{
if(!pageNum){
pageNum = 1;
}
try {
const response =await axiosInstance({
url: ApiConstant.Article.articlePage,
method: 'get',
params: {
type: type,
pageNum:pageNum,
pageSize:5
},
showLoading: false, // 是否显示加载图标
});
const data = response.data;
if (data.success) {
// 将成绩信息保存到缓存中
return data.result.records;
} else {
return [];
}
} catch (error) {
console.log(error);
return [];
}
}
// // 登录
// export const Login = (data) => {
// return service({
// url: "/login",
// method: "post",
// data,
// });
// };
// // Get请求
// export const Get = (url, data) => {
// return service({
// url,
// method: "get",
// params: data,
// });
// };
// // Delete请求
// export const Delete = (url) => {
// return service({
// url,
// method: "delete",
// });
// };
// // Post请求
// export const Post = (url, data) => {
// return service({
// url,
// method: "post",
// data,
// });
// };
// // 上传文件请求
// export const PostFile = (url, data, onUploadProgress) => {
// return service({
// url,
// method: "post",
// data,
// headers: {
// "Content-Type": "multipart/form-data",
// },
// onUploadProgress,
// });
// };
// // Put请求
// export const Put = (url, data) => {
// return service({
// url,
// method: "put",
// data,
// });
// };
// // Patch请求
// export const Patch = (url, data) => {
// return service({
// url,
// method: "patch",
// data,
// });
// };

113
src/axios/major/MajorApi.ts Normal file
View File

@ -0,0 +1,113 @@
// src/axios/api.js
import ApiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http';
//获取院校的专业列表
export const getSchoolMajorList =async (params:{schoolCode:string}) =>{
let scoreInfo = localStorage.getItem('scoreInfo')
let cognitioPolyclinic =JSON.parse(scoreInfo as string).cognitioPolyclinic
try {
const response = await axiosInstance({
url: ApiConstant.Major.schoolMajorList,
method: 'get',
params: {schoolCode:params.schoolCode,cognitioPolyclinic:cognitioPolyclinic},
showLoading: false, // 是否显示加载图标
});
const data = response.data;
if (data.success) {
return data.result;
} else {
return [];
}
} catch (error) {
console.log(error);
return [];
}
}
//获取院校的专业列表
export const getTestCultural =async (params:{schoolCode:string,year:string}) =>{
try {
const response = await axiosInstance({
url: ApiConstant.Major.testCultural,
method: 'get',
params: {schoolCode:params.schoolCode,year:params.year},
showLoading: false, // 是否显示加载图标
});
const data = response.data;
if (data.success) {
return data.result;
} else {
return [];
}
} catch (error) {
console.log(error);
return [];
}
}
// // 登录
// export const Login = (data) => {
// return service({
// url: "/login",
// method: "post",
// data,
// });
// };
// // Get请求
// export const Get = (url, data) => {
// return service({
// url,
// method: "get",
// params: data,
// });
// };
// // Delete请求
// export const Delete = (url) => {
// return service({
// url,
// method: "delete",
// });
// };
// // Post请求
// export const Post = (url, data) => {
// return service({
// url,
// method: "post",
// data,
// });
// };
// // 上传文件请求
// export const PostFile = (url, data, onUploadProgress) => {
// return service({
// url,
// method: "post",
// data,
// headers: {
// "Content-Type": "multipart/form-data",
// },
// onUploadProgress,
// });
// };
// // Put请求
// export const Put = (url, data) => {
// return service({
// url,
// method: "put",
// data,
// });
// };
// // Patch请求
// export const Patch = (url, data) => {
// return service({
// url,
// method: "patch",
// data,
// });
// };

View File

@ -0,0 +1,315 @@
<template>
<div class="container">
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="考生省份" prop="province">
<el-select v-model="form.province" placeholder="请选择省份">
<el-option v-for="(item,index) in state.provinceList" :key="index" :label="item.name" :value="item.code"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="考生科目" prop="cognitioPolyclinic">
<el-radio-group v-model="form.cognitioPolyclinic">
<el-radio label="文科">文科</el-radio>
<el-radio label="理科">理科</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="专业类别" prop="professionalCategory">
<el-select v-model="form.professionalCategory" placeholder="请选择专业类别" @change="handleProfessionalCateGoryChange">
<el-option v-for="(item,index) in state.professionalCategoryList" :key="index" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="state.subjectsList && state.subjectsList.length>0">
<el-form-item label="专业选课" prop="subjects">
<el-select v-model="form.subjects" multiple @change="handleSubjectsSelectChange">
<el-option v-for="(item,index) in state.subjectsList" :key="index" :label="item.label" :value="item.value" :disabled="item.exclude && form.subjects.includes(item.exclude)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="form.subjects && form.subjects.length>0">
<el-col :span="12" v-for="(item,index) in form.subjects" :key="index">
<!--音乐-->
<el-form-item label="音表声乐" :prop="convertSubjectToField(item)" v-if="item ==='音乐表演声乐'">
<el-input type="number" min="0" max="300" v-model="form.yybysy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item label="音表器乐" :prop="convertSubjectToField(item)" v-else-if="item ==='音乐表演器乐'">
<el-input type="number" min="0" max="300" v-model="form.yybyqy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item :label="item" :prop="convertSubjectToField(item)" v-else-if="item ==='音乐教育'">
<el-input type="number" min="0" max="300" v-model="form.yyjy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<!--表演-->
<el-form-item :label="item" :prop="convertSubjectToField(item)" v-else-if="item ==='服装表演'">
<el-input type="number" min="0" max="300" v-model="form.fzby" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item :label="item" :prop="convertSubjectToField(item)" v-else-if="item ==='戏剧影视导演'">
<el-input type="number" min="0" max="300" v-model="form.xjysdy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item :label="item" :prop="convertSubjectToField(item)" v-else-if="item ==='戏剧影视表演'">
<el-input type="number" min="0" max="300" v-model="form.xjysby" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12" v-if="form.professionalCategory!=='表演类'">
<el-form-item :label="dynamicProfessionalCategoryLabel()" prop="professionalScore">
<el-input type="number" min="0" max="300" v-model="form.professionalScore" :placeholder="'请输入'+dynamicProfessionalCategoryLabel()"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="文化成绩" prop="culturalScore">
<el-input type="number" min="0" max="300" v-model="form.culturalScore" placeholder="请输入文化成绩"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="语文成绩" prop="chineseScore">
<el-input type="number" min="0" max="300" v-model="form.chineseScore" placeholder="请输入语文成绩"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="英语成绩" prop="englishScore">
<el-input type="number" min="0" max="300" v-model="form.englishScore" placeholder="请输入英语成绩"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<el-button style="width: 300px;" type="primary" @click="submitForm">确定</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref} from 'vue';
import StaticConstant from '@/utils/StaticConstant';
import {SubjectsEntity} from '@/types/index'
import ApiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http';
import { getScore } from '@/axios/api';
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
const router = useRouter();
const state= reactive({
provinceList:[
{name: "河南", code: "河南"},
],
professionalCategoryList:StaticConstant.professionalCategoryList,
subjectsList:[] as Array<SubjectsEntity>,//
})
const form = reactive({
province: '河南',//
cognitioPolyclinic: '文科',//
professionalCategory: '',//
culturalScore: '',//
professionalScore: '',//
chineseScore: '',//
englishScore: '',//
subjects:[] as Array<string>,//
yybysy:'',//
yybyqy:'',//
yyjy:'',//
fzby:'',//
xjysdy:'',//
xjysby:'',//
});
const rules = ref({})
const formRef = ref<HTMLFormElement | any>({});
const submitForm = () => {
formRef.value.validate((valid: boolean) => {
if(!valid){
//
console.log('Validation failed');
return false
}
//
let submitForm = {
...form,
professionalCategoryChildren: form.subjects.join(',')
}
console.log('Form submitted:', submitForm);
axiosInstance({
url: ApiConstant.Score.scoreSave,
method: 'post',
data: submitForm,
/*showLoading: false,//是否显示加载图标*/
}).then((response) => {
return response.data
}).then((data) => {
console.log('qqq')
console.log(data)
if(data.success){
ElMessage.success('保存成功');
getScore()
setTimeout(function(){
router.push({
path: "/index"
});
window.location.reload()
}, 1000);
}else{
ElMessage.error(data.message);
}
//
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
});
};
onMounted(()=>{
try {
reloadScore()
} catch (error) {
getScore()
}
})
function reloadScore(){
let scoreInfoStr = localStorage.getItem('scoreInfo')
if(scoreInfoStr){
let scoreInfo = JSON.parse(scoreInfoStr)
form.professionalCategory = scoreInfo.professionalCategory
form.cognitioPolyclinic = scoreInfo.cognitioPolyclinic
form.province = scoreInfo.province
form.culturalScore = scoreInfo.culturalScore
form.professionalScore = scoreInfo.professionalScore
form.chineseScore = scoreInfo.chineseScore
form.englishScore = scoreInfo.englishScore
handleProfessionalCateGoryChange()
if(scoreInfo.professionalCategoryChildren){
form.subjects = scoreInfo.professionalCategoryChildren.split(',')
}
form.yybysy = scoreInfo.yybysy
form.yybyqy = scoreInfo.yybyqy
form.yyjy = scoreInfo.yyjy
form.fzby = scoreInfo.fzby
form.xjysdy = scoreInfo.xjysdy
form.xjysby = scoreInfo.xjysby
console.log(scoreInfo)
}
reloadRules()
}
//
const handleProfessionalCateGoryChange=()=>{
form.subjects = []
state.subjectsList = []
//
state.professionalCategoryList.forEach(item=>{
if(item.value === form.professionalCategory && item.children){
//
state.subjectsList = item.children as Array<SubjectsEntity>
}
})
reloadRules()
}
//
const handleSubjectsSelectChange=(value:string[])=>{
if (value.includes('a')) {
form.subjects = value.filter((item) => item !== 'b');
} else if (value.includes('b')) {
form.subjects = value.filter((item) => item !== 'a');
}
reloadRules()
}
//
const dynamicProfessionalCategoryLabel=()=>{
if(form.professionalCategory === '音乐类'){
return "主项成绩";
}
return "统考成绩";
}
//
const convertSubjectToField = (subjects: string) => {
switch (subjects) {
case '音乐表演声乐':
return 'yybysy';
case '音乐表演器乐':
return 'yybyqy';
case '音乐教育':
return 'yyjy';
case '服装表演':
return 'fzby';
case '戏剧影视导演':
return 'xjysdy';
case '戏剧影视表演':
return 'xjysby';
}
}
const validateInput = (subjects:any)=>{
if(subjects === '音乐表演声乐'){
form.yybysy = form.yybysy.replace(/\D/g, '')
}else if(subjects === '音乐表演器乐'){
form.yybyqy = form.yybyqy.replace(/\D/g, '')
}else if(subjects === '音乐教育'){
form.yyjy = form.yyjy.replace(/\D/g, '')
}else if(subjects === '服装表演'){
form.fzby = form.fzby.replace(/\D/g, '')
}else if(subjects === '戏剧影视导演'){
form.xjysdy = form.xjysdy.replace(/\D/g, '')
}else if(subjects === '戏剧影视表演'){
form.xjysby = form.xjysby.replace(/\D/g, '')
}
}
function reloadRules(){
if(state.subjectsList){
let ru = {
province: [{ required: true, message: '请选择省份', trigger: 'change' }],
professionalCategory: [{ required: true, message: '请选择专业类别', trigger: 'change' }],
cognitioPolyclinic: [{ required: true, message: '请选择考生科目', trigger: 'change' }],
professionalScore: [{ required: true, message: '请输入'+dynamicProfessionalCategoryLabel(), trigger: 'blur' }],
culturalScore: [{ required: true, message: '请输入文化成绩', trigger: 'blur' }],
chineseScore: [{ required: true, message: '请输入语文成绩', trigger: 'blur' }],
englishScore: [{ required: true, message: '请输入英语成绩', trigger: 'blur' }],
subjects: [{ required: true, message: '请选择专业选课', trigger: 'change' }],
}
if(form.subjects && form.subjects.length>0){
form.subjects.forEach(item=>{
ru[convertSubjectToField(item)] = [{ required: true, message: '请输入'+item, trigger: 'change' }]
})
}
rules.value = ru
}else{
rules.value = {
province: [{ required: true, message: '请选择省份', trigger: 'change' }],
professionalCategory: [{ required: true, message: '请选择专业类别', trigger: 'change' }],
cognitioPolyclinic: [{ required: true, message: '请选择考生科目', trigger: 'change' }],
professionalScore: [{ required: true, message: '请输入'+dynamicProfessionalCategoryLabel(), trigger: 'blur' }],
culturalScore: [{ required: true, message: '请输入文化成绩', trigger: 'blur' }],
chineseScore: [{ required: true, message: '请输入语文成绩', trigger: 'blur' }],
englishScore: [{ required: true, message: '请输入英语成绩', trigger: 'blur' }],
}
}
}
</script>
<style scoped lang="scss">
.container {
margin: 20px;
}
:deep(.el-form-item__content){
max-width: 80%;
}
</style>

View File

@ -2,18 +2,29 @@
<template>
<div class="footer">
<div class="message"></div>
<div class="copyright">版权所有<em>&copy;xxx.com</em>
<router-link tag="a" :to="'/feedback'" target="_blank">联系我们</router-link>
<div class="copyright">
</div>
<div class="copyright">
<a href="https://beian.mps.gov.cn/#/query/websearch?code=41140002800770" rel="noreferrer" target="_blank">
<img src="@/assets/images/1d192ed1f2bd061200df8b9122a0fd9.png" style="width: 16px;height: 16px;"/>
豫公网安备41140002000770号</a>
<a href="https://beian.miit.gov.cn/" target="_Blank">豫ICP备2024048033号</a>
</div>
<div class="copyright">版权所有<em style="margin: 0 5px;">河南及第生涯信息科技有限公司</em>
<!-- <router-link tag="a" :to="'/feedback'" target="_blank">联系我们</router-link> -->
</div>
</div>
</template>
<style scoped lang="scss">
/* 页脚 border-top: 1px solid #e1e1e1; */
.footer {
margin: 0 auto;
left: 0;
bottom: 0;
width: 100%;
margin: 0 auto;
background: #fff;
height: 90px;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, .02), 0 4px 8px 0 rgba(0, 0, 0, .02);
@ -40,10 +51,9 @@
}
.copyright {
margin: 0 auto;
margin: 5px auto;
color: $color-black-60;
text-align: center;
margin-top: 18px;
font-size: 14px;
em {

View File

@ -3,6 +3,9 @@
:class="{ 'collapsed': !state.isNavVisible && state.scrolledPastThreshold, 'animatable': state.isNavVisible || !state.isNavVisible }">
<div class="box">
<!--导航栏-->
<div style="padding: 10px 0">
<img :src="logo" alt="" style="width:130px;height: 36px;"/>
</div>
<div class="nav">
<ul>
<li v-for="column in state.columnList" :key="column.id">
@ -14,7 +17,7 @@
</div>
<!--登录菜单项-->
<div class="menu">
<ul>
<ul v-if="!state.userInfo || state.userInfo.id===null || !state.token">
<li>
<router-link tag="a" :to="'/register'">注册</router-link>
</li>
@ -22,67 +25,173 @@
<a @click="openLogin" class="a-button">登录</a>
</li>
</ul>
<ul v-else>
<!--有成绩-->
<li v-if="state.scoreInfo.culturalScore">
<div class="flexWrap">
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;">
{{ state.scoreInfo.professionalCategory }}
</span>
<span v-if="state.scoreInfo.professionalCategory==='音乐类'">
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;" v-show="state.scoreInfo.yybysy && state.scoreInfo.yybysy!==0">
声乐分·{{ state.scoreInfo.yybysy }}
</span>
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;" v-show="state.scoreInfo.yybysy && state.scoreInfo.yybyqy!==0">
器乐分·{{ state.scoreInfo.yybyqy }}
</span>
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;" v-show="state.scoreInfo.yybysy && state.scoreInfo.yyjy!==0">
音教分·{{ state.scoreInfo.yyjy }}
</span>
</span>
<span v-if="state.scoreInfo.professionalCategory==='表演类'">
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;" v-show="state.scoreInfo.xjysdy && state.scoreInfo.xjysdy!==0">
戏导分·{{ state.scoreInfo.xjysdy }}
</span>
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;" v-show="state.scoreInfo.xjysby && state.scoreInfo.xjysby!==0">
戏表分·{{ state.scoreInfo.xjysby }}
</span>
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;" v-show="state.scoreInfo.fzby && state.scoreInfo.fzby!==0">
服装表演分·{{ state.scoreInfo.fzby }}
</span>
</span>
<span class="pr-10 mr-10" style="border-right:2px solid #e4e7ed;">
文化成绩·{{ state.scoreInfo.culturalScore }}
</span>
<span class="mr-10">{{state.scoreInfo.professionalCategory==='音乐类'?'主项成绩':'统考成绩'}}·{{ state.scoreInfo.professionalScore }}</span>
<span @click="openEditScore" style="cursor: pointer;"><el-icon><EditPen /></el-icon></span>
</div>
</li>
<!--无成绩-->
<li v-else>
<div class="flexWrap">
<span @click="openEditScore" style="cursor: pointer;">创建分数<el-icon style="padding-left: 10px;"><EditPen /></el-icon></span>
</div>
</li>
<el-dropdown trigger="hover" @command="handleCommand" style="margin: 0 0 0 50px;">
<span class="el-dropdown-link">
我的<el-icon class="el-icon--right"><arrow-down /></el-icon>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="passwordChanger">更改密码</el-dropdown-item>
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</ul>
</div>
</div>
</nav>
<!--登录弹框-->
<el-dialog
v-model="state.loginDialogVisible"
title=" "
width="30%"
:closeOnClickModal="false"
width="20em"
:closeOnClickModal="false" :show-close="false"
>
<template #header>
<div style="display: flex; margin: 5px;justify-content: space-between; align-items: center;">
<el-icon @click="closeLoginDialog" class="el-dialog__headerbtn"><Close /></el-icon>
</div>
</template>
<Login/>
</el-dialog>
<!--修改成绩弹框-->
<el-dialog
v-model="state.editScoreDialogVisible"
title=" "
width="40em"
:closeOnClickModal="false" :show-close="false"
>
<template #header>
<div style="display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin: 0;">登录</h3>
<button @click="closeDialog" class="el-dialog__headerbtn">
<i class="el-icon-close"></i>
</button>
<h3 style="margin: 0;">请填写您的高考信息</h3>
<el-icon @click="closeEditScoreDialog" class="el-dialog__headerbtn"><Close /></el-icon>
</div>
</template>
<!-- 在这里放置登录内容 -->
<Login/>
<EditScoreInfo/>
</el-dialog>
</template>
<script setup lang="ts">
import {reactive, onMounted, ref} from "vue";
import {ElMessage} from 'element-plus'
import {useRouter} from 'vue-router';
import {ElMessage} from 'element-plus';
import axiosInstance from '@/utils/http';
import { clearUserIocalStorage } from "@/utils/tool";
import ApiConstant from "@/utils/ApiConstant";
import StaticConstant from "@/utils/StaticConstant";
import { RouterEntity, ScoreInfoEntity } from "@/types";
import EditScoreInfo from "./EditScoreInfo.vue";
import logo from '@/assets/images/logo.png';
import {
ArrowDown,
Plus,
} from '@element-plus/icons-vue'
const router = useRouter();
const state = reactive({
activeIndex: '/index',
columnList: [] as Array<Object>,
columnList: [] as Array<RouterEntity>,
isNavVisible: ref(true), //
prevScrollPos: ref(0), //
scrolledPastThreshold: ref(false), //
loginDialogVisible:ref(false),
editScoreDialogVisible:ref(false),//
loginDialogVisible:ref(false),//
userInfo:{
id:null,
phone:null,
} as any,//
scoreInfo:{
professionalCategory:null,
culturalScore:null,
professionalScore:null,
yybysy:null,
yybyqy:null,
yyjy:null,
xjysdy:null,
xjysby:null,
fzby:null,
},
token:'' as any,//token
})
// token
onMounted(() => {
let columnList = [{
"id": 1,
"name": "首页",
"parentId": 0,
"childColumn": [],
"sort": 100,
"linkMode": 3,
"url": "index"
},
{
"id": 2,
"name": "模拟报志愿",
"parentId": 0,
"childColumn": [],
"sort": 30,
"linkMode": 3,
"url": "fillVolunteer"
},
{"id": 3, "name": "找大学", "parentId": 0, "childColumn": [], "sort": 75, "linkMode": 3, "url": "school/search"},
{"id": 4, "name": "查专业", "parentId": 0, "childColumn": [], "sort": 75, "linkMode": 3, "url": "major/search"},
];
state.columnList = columnList
//
state.token = localStorage.getItem("X-Access-Token") as string;
let userInfo = localStorage.getItem('userInfo')
if(userInfo!==null){
state.userInfo = JSON.parse(userInfo)
let scoreInfo = localStorage.getItem('scoreInfo')
if(scoreInfo){
let a = JSON.parse(scoreInfo)
state.scoreInfo.culturalScore = a.culturalScore
state.scoreInfo.professionalScore = a.professionalScore
state.scoreInfo.professionalCategory = a.professionalCategory
state.scoreInfo.yybysy = a.yybysy
state.scoreInfo.yybyqy = a.yybyqy
state.scoreInfo.yyjy = a.yyjy
state.scoreInfo.xjysdy = a.xjysdy
state.scoreInfo.xjysby = a.xjysby
state.scoreInfo.fzby = a.fzby
userInfo = null
a = null
scoreInfo = null
}
}else{
state.token = ''
state.userInfo = null
}
state.columnList = StaticConstant.defaultRouterList
});
//
@ -106,15 +215,66 @@ window.addEventListener('scroll', () => {
state.prevScrollPos = currentScrollPos;
});
//
const handleCommand = (command: string | number | object) => {
if(command === 'logout'){
openLogout()
}else if(command === 'passwordChanger'){
//
router.push({
path: "/passwordChanger"
});
}
}
//
function openLogin(){
console.log('登录')
state.loginDialogVisible = true
}
function closeDialog() {
//退
function openLogout(){
axiosInstance({
url: ApiConstant.User.logout,
method: 'get',
params:{},
/*showLoading: false,//是否显示加载图标*/
}).then((response) => {
return response.data
}).then((data) => {
clearUserIocalStorage();
if(data.success){
ElMessage.success(data.message);
setTimeout(function(){
state.token=''
router.push({
path: "/index"
});
}, 1000);
}else{
clearUserIocalStorage();
ElMessage.error('已退出');
}
//
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
function openEditScore(){
state.editScoreDialogVisible = true
}
function closeLoginDialog() {
//
state.loginDialogVisible = false
}
function closeEditScoreDialog(){
state.editScoreDialogVisible = false
}
</script>
<style scoped lang="scss">
@ -129,11 +289,11 @@ function closeDialog() {
.navbar {
position: fixed;
left: 0;
right: 10;
width: 100%;
background-color: #ffffff;
color: #000000;
z-index: 1000; /* 可以根据需要调整 z-index 值 */
margin: 0;
padding: 0;
box-shadow: 0 0 3px rgba(0, 0, 0, .02), 0 4px 8px rgba(0, 0, 0, .02);
ul {
@ -149,7 +309,8 @@ function closeDialog() {
/*导航栏左侧*/
.box {
margin: 0 auto;
width: 1210px;
min-width: 710px;
max-width: 1510px;
display: flex;
flex-direction: row;
flex-wrap: wrap
@ -196,4 +357,16 @@ function closeDialog() {
border: none;
cursor: pointer;
}
//
.el-dropdown{
line-height: 24px;
color: #000000;
font-size: 16px;
.el-icon{
position: relative;
top: 2px;
}
}
</style>

View File

@ -1,73 +0,0 @@
<template>
<!-- 当前路由如果包含已登录字段则隐藏该按钮并显示已登录 -->
<el-button
type="danger"
@click="toLogin"
v-if="!isLogged"
style="width: 100%; margin: 20px auto"
>
{{ t("button.login") }}
</el-button>
<h1 v-else>{{ t("button.isLogged") }}</h1>
<!-- 退出登录 -->
<el-button
type="warning"
@click="toLogout"
v-if="isLogged"
style="width: 100%; margin: 20px auto"
>
{{ t("button.logout") }}
</el-button>
<!-- 打开抽屉 -->
<el-button
type="success"
@click="handleOpenChildrenDrawer"
style="width: 100%; margin: 20px auto"
>
{{ t("button.openDrawer") }}
</el-button>
<SideDrawer></SideDrawer>
</template>
<script setup>
import { onMounted, ref, provide } from "vue";
import { useRouter, useRoute } from "vue-router";
import { useI18n } from "vue-i18n";
import SideDrawer from "./SideDrawer.vue";
/**
* vue-router
*/
// t
const { t } = useI18n();
//
const router = useRouter();
//
const route = useRoute();
const isLogged = route.params.isLogged;
//
const toLogin = () => {
router.push("/login");
};
// 退
const toLogout = () => {
localStorage.removeItem("token");
router.push("/login");
};
// token
onMounted(() => {
localStorage.removeItem("token");
});
/**
* 自定义组件
*/
const isDrawerOpen = ref(false);
//
provide("isDrawerOpen", isDrawerOpen);
const handleOpenChildrenDrawer = () => {
isDrawerOpen.value = true;
};
</script>

View File

@ -0,0 +1,346 @@
<!--系统使用说明-->
<template>
<el-row :gutter="20">
<el-col :span="24">
<div class="hot_school" v-if="state.hotSchoolList && state.hotSchoolList.length > 0">
<div class="l_title clearfix">
<div class="left_title">热门院校</div>
<div class="right_tab clearfix">
<div class="hot_school_tab am_l set_hoverl" :class="{ 'active': 1 == state.hotTabActive }"
@click="switchHotTab(1)">河南本科院校
</div>
<div class="hot_school_tab am_l set_hoverl" :class="{ 'active': 2 == state.hotTabActive }"
@click="switchHotTab(2)">河南专科院校
</div>
<div class="hot_school_tab am_l set_hoverl" :class="{ 'active': 3 == state.hotTabActive }"
@click="switchHotTab(3)">省外本科院校
</div>
<div class="hot_school_tab am_l set_hoverl" :class="{ 'active': 4 == state.hotTabActive }"
@click="switchHotTab(4)">省外专科院校
</div>
</div>
</div>
<div class="hot_school_box clearfix">
<div class="left" style="background: rgb(255, 141, 66);">
<a :href="'/school/' + state.hotSchoolList[0].schoolCode" target="_blank">
<h3>{{ state.hotSchoolList[0].schoolName }}</h3>
<p class="tag">
<span v-for="item in state.hotSchoolList[0].tagsList">{{ item }}</span>
</p>
<div class="tuijian" v-if="state.hotSchoolList[0].schoolIcon">
<div class="school_tuijian">
<div class="school_img"><img :src="state.hotSchoolList[0].schoolIcon" alt=""></div>
</div>
</div>
</a>
</div>
<div class="right">
<div v-for="(item, index) in state.hotSchoolList">
<div class="school_item" data-growing-container="" v-if="index > 0">
<a :href="'/school/' + item.schoolCode" target="_blank">
<img :src="item.schoolIcon" alt="">
<div class="school_msg">
<h3>{{ item.schoolName }}</h3>
<div class="clearfix check_btn">
<span class="school_class">{{ item.institutionType + '类' }}</span>
<span>查看院校<i></i></span>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
</template>
<script setup lang="ts">
import { ref, reactive } from "vue";
import ApiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http'
//
const state = reactive({
hotSchoolList: [] as any,
hotTabActive: 1,
})
const hotSchoolList = reactive({
nowProvinceBenSchoolList: [],//
nowProvinceZhuanSchoolList: [],//
otherProvinceBenSchoolList: [],//
otherProvinceZhuanSchoolList: []//
})
getHotSchoolList()
//
function getHotSchoolList() {
axiosInstance({
url: ApiConstant.School.hotSchoolList,
method: 'get',
params: {},
showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
//console.log(data)
//
hotSchoolList.nowProvinceBenSchoolList = data.result.nowProvinceBenSchoolList
hotSchoolList.nowProvinceZhuanSchoolList = data.result.nowProvinceZhuanSchoolList
hotSchoolList.otherProvinceBenSchoolList = data.result.otherProvinceBenSchoolList
hotSchoolList.otherProvinceZhuanSchoolList = data.result.otherProvinceZhuanSchoolList
if (state.hotTabActive == 1) {
state.hotSchoolList = hotSchoolList.nowProvinceBenSchoolList
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
//
function switchHotTab(index: number) {
state.hotTabActive = index
//
if (index == 1) {
state.hotSchoolList = hotSchoolList.nowProvinceBenSchoolList
} else if (index == 2) {
state.hotSchoolList = hotSchoolList.nowProvinceZhuanSchoolList
} else if (index == 3) {
state.hotSchoolList = hotSchoolList.otherProvinceBenSchoolList
} else if (index == 4) {
state.hotSchoolList = hotSchoolList.otherProvinceZhuanSchoolList
}
}
</script>
<style scoped lang="scss">
//
.hot_school {
margin-bottom: 40px;
/*padding: 0 20px;*/
.l_title {
height: 44px;
line-height: 44px;
border-bottom: 2px solid var(--el-color-primary);
width: 100%;
.left_title {
font-size: 20px;
color: #000;
position: relative;
padding-left: 12px;
width: 330px;
float: left;
font-weight: 700;
.right_tab {
margin-left: 10px;
float: left;
width: 820px;
}
}
.right_tab .hot_school_tab.active {
color: var(--el-color-primary);
}
.right_tab .hot_school_tab {
float: left;
font-size: 18px;
color: #000;
margin-right: 32px;
cursor: pointer;
font-weight: 700;
}
.right_tab .hot_school_tab:hover {
color: var(--el-color-primary);
}
.am_l {
transition: all .4s;
}
.change_group {
float: right;
color: #f60;
font-size: 14px;
text-align: right;
cursor: pointer;
width: 68px;
height: 44px;
position: relative;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
}
.hot_school_box {
.left {
float: left;
width: 330px;
height: 332px;
background: #ffeaea;
text-align: center;
padding-top: 28px;
cursor: pointer;
h3 {
font-size: 24px;
color: #fff;
margin-bottom: 20px;
overflow: hidden;
/*text-overflow: ellipsis;*/
white-space: nowrap;
transition: all .4s;
padding: 0 10px;
font-weight: 700;
}
.tag {
margin-bottom: 54px;
span {
display: inline-block;
padding: 4px 5px;
margin-right: 10px;
border-radius: 4px;
border: 1px solid hsla(0, 0%, 100%, .4);
color: #fff;
}
span:last-child {
margin: 0;
}
}
.tuijian {
width: 195px;
height: 159px;
position: relative;
margin: 0 auto;
.school_tuijian {
width: 170px;
height: 187px;
background: #fff;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
}
.school_img {
height: 100%;
position: relative;
img {
width: 128px;
height: 128px;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
}
}
.right {
float: right;
width: 820px;
height: 350px;
margin: 10px 0 0 10px;
.school_item:hover {
top: -2px;
box-shadow: 0 10px 20px rgb(0 0 0 / 10%);
}
.school_item:hover .school_msg h3 {
color: var(--el-color-primary);
}
.school_item {
cursor: pointer;
float: left;
height: 110px;
width: 263px;
overflow: hidden;
margin-right: 10px;
margin-bottom: 10px;
position: relative;
transition: all .2s linear;
top: 0;
box-shadow: 0 0 15px #e6e6e6;
background-color: white;
img {
width: 65px;
height: 65px;
position: absolute;
left: 15px;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
border: 0;
vertical-align: top;
}
.school_msg {
margin-left: 100px;
margin-top: 21px;
padding-right: 16px;
h3 {
color: #000;
font-size: 16px;
margin-bottom: 23px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: all .4s;
font-weight: 700;
}
.check_btn {
.school_class {
display: inline-block;
padding: 0 6px;
border: 1px solid #eee;
}
span {
float: left;
font-size: 12px;
color: #999;
}
span + span {
margin-right: 12px;
float: right;
display: flex;
justify-content: center;
align-items: center;
}
span + span i {
display: inline-block;
width: 5px;
height: 9px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAASCAYAAABit09LAAAAoklEQVQoU43SsQ0CMQwFUPsaZqOlp4wLdDRQMAUVXBEzABWiSwkbMEX2+OgiOOlIHOL6+cuyPlPj8OhU9UpEDxG5WHsJeu9vRLTquq53zg0lnGAIYRFjvANYWjjBFjzBf3gGaziDFi7CAl6b8PPfAcCGiA4mVNUTgJ6ZzyKyLcJfNKZnsIQyaKEZrKEJquoRwO57uFkK7/2LmZ8isq/WrKW7b6OXhYE4bznBAAAAAElFTkSuQmCC);
background-size: cover;
margin: 0 0 0 5px;
}
}
}
}
}
}
}
</style>

109
src/components/LeftNav.vue Normal file
View File

@ -0,0 +1,109 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { useRouter } from 'vue-router';
//setup
const router = useRouter();
const state = reactive({
options: [
{
title: '省控线', img: 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/icons/menu/shengkongxian.png',
linkUrl: '/scoreControlLine'
},
{
title: '测文化', img: 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/icons/menu/cewenhua.png',
linkUrl: '/school/search'
},
{
title: '查位次', img: 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/icons/menu/chaweici.png',
linkUrl: '/checkRanking'
},
{
title: '算投档', img: 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/icons/menu/suantoudang.png',
linkUrl: '/calculateInvestment'
},
]
})
const flag = ref(false);
let flagStr = window.localStorage.getItem('leftNavFlag')
if (flagStr == null || flagStr == undefined || flagStr == 'true') {
flag.value = true
window.localStorage.setItem('leftNavFlag', 'true')
} else {
flag.value = false
}
const close = () => {
flag.value = false
//window.localStorage.setItem('leftNavFlag', 'false')
}
const open = () => {
flag.value = true
//window.localStorage.setItem('leftNavFlag', 'false')
}
const openPage = (e: string) => {
if(!window.location.href.includes(e)){
window.open(e, '_self')
}
}
</script>
<template>
<div class="left-nav-wrapper flexWrap" :class="flag ? '' : 'close'">
<div class="position-box">
<div class="item" @click="openPage(item.linkUrl)" v-for="(item, index) in state.options" :key="index">
<img :src="item.img" class="icon64" :alt="item.title" />
<div>{{ item.title }}</div>
</div>
<div class="open" v-show="!flag" @click="open">
<el-icon><Expand /></el-icon>
</div>
<div class="close" v-show="flag" @click="close">
<el-icon><Fold /></el-icon>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.left-nav-wrapper {
position: fixed;
width: 65px;
top: 25%;
left: 15px;
z-index: 999;
padding: 20px 0;
color: #595553;
line-height: 15px;
text-align: center;
border-radius: 50px;
background: $color-blue-10;
border: 1px solid $color-blue-40;
transition: all 0.3s;
.item {
cursor: pointer;
margin: 10px 0;
}
}
.open{
color: #595553;
text-align: right;
line-height: 15px;
padding: 10px 0;
border-radius: 50px;
background: $color-blue-10;
border: 1px solid $color-blue-40;
cursor: pointer;
z-index: 100;
position: relative;
left: 20px;
}
.close {
left: -67px;
cursor: pointer;
border-radius: 100%;
width: 50px;
height: 10px;
margin: 20px auto 0 auto;
}
</style>

View File

@ -1,44 +1,66 @@
<template>
<!-- <div style="padding: 50px 0 0">
<h1 style="font-size: 50px; font-weight: bolder">{{ t("title.login") }}</h1>
</div>-->
<el-form
ref="loginFormRef"
:model="loginForm"
status-icon
:rules="loginFormRules"
label-width="120px"
>
<el-form-item :label="t('label.phone')" prop="phone">
<el-input v-model="loginForm.phone"></el-input>
</el-form-item>
<el-form-item :label="t('label.password')" prop="pass">
<el-input v-model="loginForm.pass" type="password" autocomplete="off" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm(loginFormRef)">
{{ t("button.submit") }}
<div class="textCenter fs-25 mb-15">
<span class="mt-5">艺体生 更轻松的报志愿</span>
</div>
<div v-show="loginForm.type === 'pwd'" style="min-height: 250px;">
<el-form ref="loginFormRef" :model="loginForm" status-icon :rules="loginFormRules">
<el-form-item prop="phone">
<el-input v-model="loginForm.phone" style="height: 50px;font-size: 30px" :placeholder="t('label.phone')"></el-input>
</el-form-item>
<el-form-item prop="pass">
<el-input v-model="loginForm.pass" style="height: 50px;font-size: 30px" :placeholder="t('label.password')" type="password" autocomplete="off" />
</el-form-item>
<div style="padding: 10px;text-align: center">
<el-button type="primary" @click="submitForm(loginFormRef)">
{{ t("button.submit") }}
</el-button>
<el-button @click="resetForm(loginFormRef)">
{{ t("button.reset") }}
</el-button>
</div>
</el-form>
</div>
<div v-show="loginForm.type === 'weixin'" style="min-height: 250px;">
<div class="" style="text-align: center;">
<div class="w-img">
<el-avatar id="qrcode" :size="170" @click="getImgQrCode" style="border-radius: 0%"
class="">
<img :src="state.qrcode" alt=""/>
</el-avatar>
<div class="w-qr_message" @click="getImgQrCode" v-show="state.qrcode && state.qrcodeStatus !=='NOT_SCAN'">
<div >{{getQrCodeStatus(state.qrcodeStatus)}}</div>
</div>
</div>
<div class="w-qr-status-text" style="width: 100%;" v-if="state.qrcode">
<span class="textCenter">请确保使用微信移动客户端版本为6.7.2及以上进行扫描</span>
</div>
</div>
</div>
<!--loginType-->
<div style="padding: 10px;text-align: center">
<el-tooltip class="box-item" effect="light" content="微信登录" placement="bottom">
<el-button circle style="margin: 0 20px;" @click="switchType('weixin')" v-show="loginForm.type === 'pwd'">
<svg-icon icon-class="weixin" size="3" />
</el-button>
<el-button @click="resetForm(loginFormRef)">
{{ t("button.reset") }}
</el-tooltip>
<el-tooltip class="box-item" effect="light" content="密码登录" placement="bottom">
<el-button circle style="margin: 0 20px;" @click="switchType('pwd')" v-show="loginForm.type === 'weixin'">
<svg-icon icon-class="lock" size="3" />
</el-button>
</el-form-item>
</el-form>
</el-tooltip>
</div>
</template>
<script setup lang="ts">
import { ref, reactive} from "vue";
import { ref, reactive } from "vue";
import { useRouter } from "vue-router";
// t
import { useI18n } from "vue-i18n";
import ApiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http'
import { ElMessage } from "element-plus";
import { json } from "stream/consumers";
import { getScore } from "@/axios/api";
import { clearUserIocalStorage } from "@/utils/tool";
const { t } = useI18n();
// Element-Plus
// import { ElMessage } from "element-plus";
//
const router = useRouter();
//
@ -46,10 +68,16 @@ const loginFormRef = ref();
const loginForm = reactive({
phone: "",
pass: "",
type: 'pwd',
});
const state = reactive({
qrcode:'https://i.gifer.com/embedded/download/74H8.gif',//
qrcodeStatus:'START',//
uuid:'',//uuid
})
//
const validatePass = (rule, value, callback) => {
const validatePass = (rule: any, value: any, callback: any) => {
if (value === "") {
callback(new Error(t("placeholder.password")));
} else {
@ -83,32 +111,39 @@ const loginFormRules = reactive({
});
//
const submitForm = (formEl) => {
const submitForm = (formEl: any) => {
if (!formEl) return;
formEl.validate((valid) => {
if (valid) {
clearUserIocalStorage();
axiosInstance({
url: ApiConstant.User.login,
method: 'post',
data: {
username:loginForm.phone,
password:loginForm.pass
username: loginForm.phone,
password: loginForm.pass
},
/*showLoading: false,//是否显示加载图标*/
}).then((response) => {
return response.data
}).then((data) => {
console.log('q')
if(data.success){
if (data.success) {
//
localStorage.setItem('vipInfo',JSON.stringify(data.result.vipInfo))
localStorage.setItem('userInfo',JSON.stringify(data.result.userInfo))
localStorage.setItem("token", data.result.token);
localStorage.setItem('vipInfo', JSON.stringify(data.result.vipInfo))
localStorage.setItem('userInfo', JSON.stringify(data.result.userInfo))
localStorage.setItem("X-Access-Token", data.result.token);
getScore()
ElMessage.success(
localStorage.getItem("locale") === "zh_CN" ? "登录成功!" : "Submitted!"
);
//window.location.reload()
}else{
setTimeout(function () {
router.push({
path: "/index"
});
window.location.reload()
}, 1000);
} else {
ElMessage.error(data.message);
}
//
@ -116,42 +151,130 @@ const submitForm = (formEl) => {
console.log(error);
}).finally(() => {
});
// // axios
/*Login(loginForm).then((response) => {
const { code, msg, data: res } = response.data;
if (code === 0) {
localStorage.setItem("token", res.token);
ElMessage.success(msg ?? "Submitted!");
router.push({
path: "/", // HelloWorld.vue
params: {
isLogged: true,
},
});
} else {
ElMessage.error(msg);
}
});*/
// Demo
//localStorage.setItem("token", "test token");
/*router.push({
// path: "/", // HelloWorld.vue
name: "/index", // name params path query
params: {
isLogged: true,
},
});*/
//window.location.reload()
} else {
ElMessage.error(localStorage.getItem("locale") === "zh_CN" ? "登录失败!" : "Oops, error submit!");
//ElMessage.error(localStorage.getItem("locale") === "zh_CN" ? "" : "Oops, error submit!");
return false;
}
});
};
const resetForm = (formEl) => {
const resetForm = (formEl: any) => {
if (!formEl) return;
formEl.resetFields();
};
const switchType = (type: any) => {
if (loginForm.type !== type) {
loginForm.type = type
}
if(loginForm.type === 'weixin'){
getImgQrCode()
}
}
const time = ref()
//
function getImgQrCode(){
if(state.qrcodeStatus === 'NULL' || state.qrcodeStatus === 'START'){
axiosInstance({
url: "/wx/getQRCode",
method: 'get',
params: {},
showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
console.log(data)
if(data && data.result){
state.qrcode = data.result.img
state.uuid = data.result.scene
state.qrcodeStatus = 'NOT_SCAN'
clearTimeout(time.value)
getStatus()
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
}
function getQrCodeStatus(status:string){
if(!status){
return '';
}else if(status === 'SUCCESS'){
return '通过';
}else if(status === 'SCAN'){
return '扫码成功,请在手机确认';
}
// else if(status === 'NOT_SCAN'){
// return '使6.7.2';
// }
else if (status ==='NULL'){
return '已失效,点击刷新';
}
}
function getStatus(){
time.value = setInterval(() => {
axiosInstance({
url: "/wx/user/getQrCodeStatus/"+state.uuid,
method: 'get',
params: {},
showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if(data && data.result){
state.qrcodeStatus = data.result.qr_state
if ('NOT_SCAN' === data.result.qr_state) {
//
///document.querySelector('#qrcode')!.className = (`${document.querySelector('#qrcode')!.className} w-qr-dead`)
//clearTimeout(time.value)
}else if ('SCAN' === data.result.qr_state) {
//
}else if ('SUCCESS' === data.result.qr_state) {
//
clearTimeout(time.value)
//
localStorage.setItem('vipInfo',JSON.stringify(data.result.vipInfo))
localStorage.setItem('userInfo',JSON.stringify(data.result.userInfo))
localStorage.setItem("X-Access-Token", data.result.token);
setTimeout(function(){
getScore()
}, 100);
ElMessage.success(
localStorage.getItem("locale") === "zh_CN" ? "登录成功!" : "Submitted!"
);
setTimeout(function(){
window.location.reload()
}, 1000);
}else{
//
clearTimeout(time.value)
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}, 2000)
}
</script>
<style scoped lang="scss">
// start
.qrcode {
margin: 50px 0;
}
.qrcode .qrcode-item {
width: 135px;
text-align: center;
}
.qrcode .qrcode-item .qrcode-text {
font-weight: bold;
color: #000000;
}
// end
</style>

View File

@ -0,0 +1,331 @@
<template>
<div class="" style="background-color: #ffffff;height:500px;">
<el-form :model="form" :rules="rules" ref="formRef" label-width="80px" v-if="state.userFlag==='1'">
<div class="flexWrap" style="line-height: 30px;height: 30px;padding: 5px;">
<div class="flex-item-6">
<span class="fw-6 font-size-20">模拟报志愿</span>
</div>
<div class="flex-item-4">
<div style="line-height: 30px;">
<el-radio-group v-model="form.cognitioPolyclinic" size="small" style="margin: 0 0 0 auto;float: left;">
<el-radio-button label="文科" value="文科" />
<el-radio-button label="理科" value="理科" />
</el-radio-group>
</div>
</div>
</div>
<div class="flexWrap mt-10" style="line-height: 30px;height: 300px;padding: 5px 10px;">
<div class="flex-item-10">
<el-form-item label="专业类别" prop="professionalCategory">
<el-select v-model="form.professionalCategory" placeholder="请选择专业类别" @change="handleProfessionalCateGoryChange">
<el-option v-for="(item,index) in state.professionalCategoryList" :key="index" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</div>
<div class="flex-item-10">
<div v-if="state.subjectsList && state.subjectsList.length>0">
<el-form-item label="专业选课" prop="subjects">
<el-select v-model="form.subjects" multiple @change="handleSubjectsSelectChange" collapse-tags collapse-tags-tooltip>
<el-option v-for="(item,index) in state.subjectsList" :key="index" :label="item.label" :value="item.value" :disabled="item.exclude && form.subjects.includes(item.exclude)"></el-option>
</el-select>
</el-form-item>
</div>
</div>
<div class="flex-item-10" v-if="form.subjects && form.subjects.length>0">
<div v-for="(item,index) in form.subjects" :key="index">
<!--音乐-->
<el-form-item label="音表声乐" :prop="convertSubjectToField(item)" v-if="item ==='音乐表演声乐'">
<el-input type="number" min="0" max="300" v-model="form.yybysy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item label="音表器乐" :prop="convertSubjectToField(item)" v-else-if="item ==='音乐表演器乐'">
<el-input type="number" min="0" max="300" v-model="form.yybyqy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item :label="item" :prop="convertSubjectToField(item)" v-else-if="item ==='音乐教育'">
<el-input type="number" min="0" max="300" v-model="form.yyjy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<!--表演-->
<el-form-item :label="item" :prop="convertSubjectToField(item)" v-else-if="item ==='服装表演'">
<el-input type="number" min="0" max="300" v-model="form.fzby" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item label="影视导演" :prop="convertSubjectToField(item)" v-else-if="item ==='戏剧影视导演'">
<el-input type="number" min="0" max="300" v-model="form.xjysdy" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
<el-form-item label="影视表演" :prop="convertSubjectToField(item)" v-else-if="item ==='戏剧影视表演'">
<el-input type="number" min="0" max="300" v-model="form.xjysby" @input="validateInput(item)" :placeholder="'请输入'+item"></el-input>
</el-form-item>
</div>
</div>
<div class="flex-item-10" v-if="form.professionalCategory!=='表演类'">
<el-form-item :label="dynamicProfessionalCategoryLabel()" prop="professionalScore">
<el-input type="number" min="0" max="300" v-model="form.professionalScore" :placeholder="'请输入'+dynamicProfessionalCategoryLabel()"></el-input>
</el-form-item>
</div>
<div class="flex-item-10">
<el-form-item label="文化成绩" prop="culturalScore">
<el-input type="number" min="0" max="300" v-model="form.culturalScore" placeholder="请输入文化成绩"></el-input>
</el-form-item>
</div>
<div class="flex-item-5" style="">
<el-form-item label="语文成绩" prop="chineseScore">
<el-input type="number" min="0" max="300" v-model="form.chineseScore" placeholder="请输入语文成绩"></el-input>
</el-form-item>
</div>
<div class="flex-item-5" style="">
<el-form-item label="英语成绩" prop="englishScore">
<el-input type="number" min="0" max="300" v-model="form.englishScore" placeholder="请输入英语成绩"></el-input>
</el-form-item>
</div>
</div>
<div class="flexWrap mt-10" style="line-height: 30px;padding: 5px 10px;">
<div class="flex-item-10">
<el-button style="width: 100%;" type="primary" @click="submitForm">确定</el-button>
</div>
</div>
</el-form>
<div v-else-if="state.userFlag==='0'">
<div style="cursor: pointer;">
<div style="text-align: center;padding-top: 50px;color:#d3d3d3" class="font-size-25">
登录账号后
</div>
<div style="text-align: center;padding: 50px 0;color:#728090" class="font-size-30">
查看可报院校
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref} from 'vue';
import StaticConstant from '@/utils/StaticConstant';
import {SubjectsEntity} from '@/types/index'
import ApiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http';
import { getScore } from '@/axios/api';
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
const router = useRouter();
const state= reactive({
userFlag:'',
provinceList:[
{name: "河南", code: "河南"},
],
professionalCategoryList:StaticConstant.professionalCategoryList,
subjectsList:[] as Array<SubjectsEntity>,//
})
const form = reactive({
province: '河南',//
cognitioPolyclinic: '文科',//
professionalCategory: '',//
culturalScore: '',//
professionalScore: '',//
chineseScore: '',//
englishScore: '',//
subjects:[] as Array<string>,//
yybysy:'',//
yybyqy:'',//
yyjy:'',//
fzby:'',//
xjysdy:'',//
xjysby:'',//
});
const rules = ref({})
const formRef = ref<HTMLFormElement | any>({});
const submitForm = () => {
formRef.value.validate((valid: boolean) => {
if(!valid){
//
console.log('Validation failed');
return false
}
//
let submitForm = {
...form,
professionalCategoryChildren: form.subjects.join(',')
}
console.log('Form submitted:', submitForm);
axiosInstance({
url: ApiConstant.Score.scoreSave,
method: 'post',
data: submitForm,
showLoading:true,
/*showLoading: false,//是否显示加载图标*/
}).then((response) => {
return response.data
}).then((data) => {
console.log('qqq')
console.log(data)
if(data.success){
ElMessage.success('保存成功');
getScore()
setTimeout(function(){
router.push({
path: "/index"
});
window.location.reload()
}, 1000);
}else{
ElMessage.error(data.message);
}
//
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
});
};
onMounted(()=>{
try {
let userInfo = localStorage.getItem('userInfo')
if(!userInfo){
state.userFlag = '0'
return false
}else{
state.userFlag = '1'
}
reloadScore()
} catch (error) {
getScore()
}
})
function reloadScore(){
let scoreInfoStr = localStorage.getItem('scoreInfo')
if(scoreInfoStr){
let scoreInfo = JSON.parse(scoreInfoStr)
form.professionalCategory = scoreInfo.professionalCategory
form.cognitioPolyclinic = scoreInfo.cognitioPolyclinic
form.province = scoreInfo.province
form.culturalScore = scoreInfo.culturalScore
form.professionalScore = scoreInfo.professionalScore
form.chineseScore = scoreInfo.chineseScore
form.englishScore = scoreInfo.englishScore
handleProfessionalCateGoryChange()
if(scoreInfo.professionalCategoryChildren){
form.subjects = scoreInfo.professionalCategoryChildren.split(',')
}
form.yybysy = scoreInfo.yybysy
form.yybyqy = scoreInfo.yybyqy
form.yyjy = scoreInfo.yyjy
form.fzby = scoreInfo.fzby
form.xjysdy = scoreInfo.xjysdy
form.xjysby = scoreInfo.xjysby
console.log(scoreInfo)
}
//reloadRules()
}
//
const handleProfessionalCateGoryChange=()=>{
form.subjects = []
state.subjectsList = []
//
state.professionalCategoryList.forEach(item=>{
if(item.value === form.professionalCategory && item.children){
//
state.subjectsList = item.children as Array<SubjectsEntity>
}
})
reloadRules()
}
//
const handleSubjectsSelectChange=(value:string[])=>{
if (value.includes('a')) {
form.subjects = value.filter((item) => item !== 'b');
} else if (value.includes('b')) {
form.subjects = value.filter((item) => item !== 'a');
}
reloadRules()
}
//
const dynamicProfessionalCategoryLabel=()=>{
if(form.professionalCategory === '音乐类'){
return "主项成绩";
}
return "统考成绩";
}
//
const convertSubjectToField = (subjects: string) => {
switch (subjects) {
case '音乐表演声乐':
return 'yybysy';
case '音乐表演器乐':
return 'yybyqy';
case '音乐教育':
return 'yyjy';
case '服装表演':
return 'fzby';
case '戏剧影视导演':
return 'xjysdy';
case '戏剧影视表演':
return 'xjysby';
}
}
const validateInput = (subjects:any)=>{
if(subjects === '音乐表演声乐'){
form.yybysy = form.yybysy.replace(/\D/g, '')
}else if(subjects === '音乐表演器乐'){
form.yybyqy = form.yybyqy.replace(/\D/g, '')
}else if(subjects === '音乐教育'){
form.yyjy = form.yyjy.replace(/\D/g, '')
}else if(subjects === '服装表演'){
form.fzby = form.fzby.replace(/\D/g, '')
}else if(subjects === '戏剧影视导演'){
form.xjysdy = form.xjysdy.replace(/\D/g, '')
}else if(subjects === '戏剧影视表演'){
form.xjysby = form.xjysby.replace(/\D/g, '')
}
}
function reloadRules(){
if(state.subjectsList){
let ru = {
province: [{ required: true, message: '请选择省份', trigger: 'change' }],
professionalCategory: [{ required: true, message: '请选择专业类别', trigger: 'change' }],
cognitioPolyclinic: [{ required: true, message: '请选择考生科目', trigger: 'change' }],
professionalScore: [{ required: true, message: '请输入'+dynamicProfessionalCategoryLabel(), trigger: 'blur' }],
culturalScore: [{ required: true, message: '请输入文化成绩', trigger: 'blur' }],
chineseScore: [{ required: true, message: '请输入语文成绩', trigger: 'blur' }],
englishScore: [{ required: true, message: '请输入英语成绩', trigger: 'blur' }],
subjects: [{ required: true, message: '请选择专业选课', trigger: 'change' }],
}
if(form.subjects && form.subjects.length>0){
form.subjects.forEach(item=>{
ru[convertSubjectToField(item)] = [{ required: true, message: '请输入'+item, trigger: 'change' }]
})
}
rules.value = ru
}else{
rules.value = {
province: [{ required: true, message: '请选择省份', trigger: 'change' }],
professionalCategory: [{ required: true, message: '请选择专业类别', trigger: 'change' }],
cognitioPolyclinic: [{ required: true, message: '请选择考生科目', trigger: 'change' }],
professionalScore: [{ required: true, message: '请输入'+dynamicProfessionalCategoryLabel(), trigger: 'blur' }],
culturalScore: [{ required: true, message: '请输入文化成绩', trigger: 'blur' }],
chineseScore: [{ required: true, message: '请输入语文成绩', trigger: 'blur' }],
englishScore: [{ required: true, message: '请输入英语成绩', trigger: 'blur' }],
}
}
}
</script>
<style scoped lang="scss">
.container {
margin: 20px;
}
:deep(.el-form-item){
margin-bottom: 14px !important;
}
:deep(.el-form-item__content){
max-width: 80%;
}
</style>

View File

@ -1,21 +0,0 @@
<template>
<el-drawer
v-model="drawer"
title="I am the title"
direction="rtl"
:before-close="handleClose"
>
<span>Hi, there!</span>
</el-drawer>
</template>
<script setup>
import { inject } from "vue";
// 使
const drawer = inject("isDrawerOpen", false);
const handleClose = (done) => {
ElMessage("Drawer closed.");
done();
};
</script>

View File

@ -0,0 +1,63 @@
<!-- 注册自定义图标 -->
<template>
<svg :class="svgClass" aria-hidden="true" :style="svgStyle">
<use :xlink:href="iconName" :fill="color" />
</svg>
</template>
<script setup lang="ts">
import { computed } from 'vue';
const props = defineProps({
iconClass: { // assets/icon/svg使
type: String,
required: true
},
className: { // class
type: String,
default: ''
},
color: { //
type: String,
default: '#333'
},
size:{
type: String,
default: '2'
}
});
const iconName = computed(() => {
return `#icon-${props.iconClass}`;
});
const svgClass = computed(() => {
if (props.className) {
return `svg-icon ${props.className}`;
}
return 'svg-icon';
});
const svgStyle = computed(()=>{
try {
if(props.size && parseInt(props.size)>0){
return "width: "+props.size+"em;height: "+props.size+"em;";
}else{
return "width: 1em;height: 1em;";
}
} catch (error) {
return "width: 1em;height: 1em;";
}
})
</script>
<style>
.sub-el-icon,.nav-icon {
display: inline-block;
font-size: 35px;
margin-right: 12px;
position: relative;
}
.svg-icon {
position: relative;
fill: currentColor;
vertical-align: -2px;
}
</style>

View File

@ -0,0 +1,63 @@
<!-- 注册自定义图标 -->
<template>
<svg :class="svgClass" aria-hidden="true" :style="svgStyle">
<use :xlink:href="iconName" :fill="color" />
</svg>
</template>
<script setup lang="ts">
import { computed } from 'vue';
const props = defineProps({
iconClass: { // assets/icon/svg使
type: String,
required: true
},
className: { // class
type: String,
default: ''
},
color: { //
type: String,
default: '#333'
},
size:{
type: String,
default: '2'
}
});
const iconName = computed(() => {
return `#icon-${props.iconClass}`;
});
const svgClass = computed(() => {
if (props.className) {
return `svg-icon ${props.className}`;
}
return 'svg-icon';
});
const svgStyle = computed(()=>{
try {
if(props.size && parseInt(props.size)>0){
return "width: "+props.size+"em;height: "+props.size+"em;";
}else{
return "width: 1em;height: 1em;";
}
} catch (error) {
return "width: 1em;height: 1em;";
}
})
</script>
<style lang="scss">
.sub-el-icon,.nav-icon {
display: inline-block;
font-size: 35px;
margin-right: 12px;
position: relative;
}
.svg-icon {
position: relative;
fill: currentColor;
vertical-align: -2px;
}
</style>

View File

@ -0,0 +1,10 @@
// 注册所有 @element-plus/icons-vue 图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue';
import { App } from 'vue';
export default {
install: (app: App<Element>) => {
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component);
}
}
};

View File

@ -0,0 +1,106 @@
<!--系统使用说明-->
<template>
<el-row :gutter="20" class="mt-5">
<el-col :span="14">
<div class="school-footer_footerBox">
<div class="school-footer_leftIntroduce">
<div class="school-footer_useIntro"><h3>系统使用说明</h3>
</div>
<p>1本查询系统的信息仅供参考具体数据请以学校官网或考试院公布为准</p>
<p>2本站数据未经授权严禁转载违者将依法追究责任</p>
<p>3如有任何疑问可发送邮件至<a class="a-button hover_style"
style="color:var(--el-color-primary);">yitisheng@163.com</a></p>
<!-- <p>4志愿填报服务客服专线xxx-xxxx-xxx高校合作或其他商务客服电话xxx-xxxx-xxx</p> -->
<p class="school-footer_friendChain"><span>友情链接</span><a href="https://www.haeea.cn/"
target="_blank">河南教育考试院</a><a
href="https://pzwb.haeea.cn/" target="_blank">高校招生考生服务平台</a><a href="http://gaokao.chsi.com.cn"
target="_blank">阳光高考</a><a
href="http://jyt.henan.gov.cn/" target="_blank">河南省教育厅</a><a href="https://yz.chsi.com.cn/"
target="_blank">中国研究生招生信息网</a><a
href="https://www.chsi.com.cn/" target="_blank">学信网</a></p></div>
</div>
</el-col>
<el-col :span="2"></el-col>
<el-col :span="8">
<!-- <div class="qrcode">
<div class="qrcode-item">
<img src="@/assets/images/qrcode/wx_gh_cbefbadc1f1f_344.jpg" alt="" width="135">
<div class="qrcode-text" style="">微信小程序</div>
</div>
</div> -->
</el-col>
</el-row>
</template>
<script setup lang="ts">
</script>
<style scoped lang="scss">
//使
.school-footer_footerBox {
width: 1200px;
/*margin: 0 auto;*/
background: hsla(0, 0%, 98%, .96);
display: flex;
align-items: center;
justify-content: space-between;
.school-footer_leftIntroduce {
padding: 18px;
h3 {
font-size: 20px;
color: #000;
margin: 0 20px 0 0;
}
a {
color: #666;
text-decoration: none !important;
}
.school-footer_useIntro {
display: flex;
align-items: center;
margin-bottom: 30px;
}
.school-footer_friendChain a {
margin-right: 15px;
transition: all .3s;
}
.school-footer_friendChain a:hover {
color: var(--el-color-primary);
}
p {
font-size: 14px;
color: #000;
margin-bottom: 15px;
word-break: break-all;
a {
font-size: 14px;
color: #000;
}
}
p:last-child {
margin: 0;
}
}
}
// start
.qrcode {
margin: 50px 0;
}
.qrcode .qrcode-item {
width: 135px;
text-align: center;
}
.qrcode .qrcode-item .qrcode-text {
font-weight: bold;
color: #000000;
}
</style>

View File

@ -0,0 +1,191 @@
<!-- 院校硕士点列表 -->
<template>
<div class="flexWrap">
<div style="width: 40%;">
<Tip title="硕士专业学位授权点"/>
<el-table :data="state.professionalMasterDegreeList" border="false" style="width: 100%;margin: 30px 0">
<el-table-column type="expand">
<template #default="props">
<div style="padding:0 30px;">
<div class="flexWrap mt-10 mb-10" style="display: flex;flex-direction: row;flex-wrap: wrap;" v-for="(child,chi) in props.row.schoolGraduateDegreeList" :key="chi">
<div style="width: 50%;">
{{child.researchDirection }}
</div>
<div style="width: 10%;">
<a class="showClick" @click="selectMasterDegree(child.id)">详情</a>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="学科类别">
<template #default="scope">
({{ scope.row.subjectCode }}){{ scope.row.disciplineField }}
</template>
</el-table-column>
<el-table-column label="专业">
<template #default="scope">
{{ scope.row.majorName.replace('(专业学位)',"") }}
</template>
</el-table-column>
</el-table>
<Tip title="硕士学术学位授权点"/>
<el-table :data="state.academicMasterDegreeList" border="false" style="width: 100%;margin: 30px 0">
<el-table-column type="expand">
<template #default="props">
<div style="padding:0 30px;">
<div class="flexWrap mt-10 mb-10" style="display: flex;flex-direction: row;flex-wrap: wrap;" v-for="(child,chi) in props.row.schoolGraduateDegreeList" :key="chi">
<div style="width: 50%;">
{{child.researchDirection }}
</div>
<div style="width: 10%;">
<a class="showClick" @click="selectMasterDegree(child.id)">详情</a>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="学科类别">
<template #default="scope">
({{ scope.row.subjectCode }}){{ scope.row.disciplineField }}
</template>
</el-table-column>
<el-table-column label="专业">
<template #default="scope">
{{ scope.row.majorName.replace('(专业学位)',"") }}
</template>
</el-table-column>
</el-table>
</div>
<div style="width: 10%;"></div>
<div style="width: 50%;" v-if="state.detail">
<div class="flexWrap" style="background-color: #eeeef0;padding: 10px;border-radius: 10px;">
<div class="flex-item-3">
<div class="fw-6 font-size-20">{{ state.detail.disciplineField }}</div>
<div>学科类别</div>
</div>
<div class="flex-item-3" style="">
<div class="fw-6 font-size-20">{{ state.detail.majorNameLimit }}</div>
<div>专业</div>
</div>
<div class="flex-item-3" style="">
<div class="fw-6 font-size-20">{{state.detail.researchDirectionLimit}}</div>
<div>研究方向</div>
</div>
</div>
<!-- 信息 -->
<div class="flexWrap mt-10 mb-10 pb-10" style="font-size: 20px;" v-for="(key,index) in Object.keys(state.detailKeyList)" :class="index!==Object.keys(state.detailKeyList).length-1?'border-bottom':''" :key="index">
<div class="flex-item-3 darkGray">
<div class="float-right">{{state.detailKeyList[key]}}</div>
</div>
<div class="flex-item-7 margin-left-30">
<div>{{state.detail[key]||''}}</div>
</div>
</div>
<!-- 考试范围 -->
<Tip title="考试范围" class="mt-30 mb-30"/>
<div v-for="(item,index) in state.detail.schoolGraduateDegreeList" :key="index">
<div>({{ (index+1) }})</div>
<div class="flexWrap mt-10 mb-10 pb-10" style="font-size: 20px;" v-for="(k,iii) in Object.keys(state.categoryList)" :class="iii!==3?'border-bottom':''" :key="k">
<div class="flex-item-3 darkGray">
<div class="float-right">{{state.categoryList[k]}}</div>
</div>
<div class="flex-item-7 margin-left-30">
<div>{{item[k]||''}}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import Tip from '../tip.vue';
import { ref, onMounted, reactive } from 'vue';
import axiosInstance from '@/utils/http';
import { ElMessage } from 'element-plus';
import { useRouter } from 'vue-router';
import ApiConstant from '@/utils/ApiConstant';
const router = useRouter();
const props = defineProps({
schoolId: {
type: String,
default: ''
}
});
onMounted(() => {
getMasterDegreeList()
});
const state = reactive({
professionalMasterDegreeList:[] as any,//
academicMasterDegreeList:[] as any,//
detailKeyList:{
schoolName:'招生单位',
departmentsAndFaculties:'院系所',
majorName:'专业',
researchDirection:'研究方向',
teacher:'指导老师',
intendedEnrollment:'拟招人数'
} as any,
categoryList:{
politics:'政治',
foreignLanguage:'英语',
businessCourse1:'业务课一',
businessCourse2:'业务课二'
} as any,
detail:null as any,
})
//
const getMasterDegreeList=()=>{
if(props.schoolId){
axiosInstance({
url: ApiConstant.GraduateDegree.findSchoolGraduateDegreeList,
method: 'get',
params: {
schoolId: props.schoolId
},
// showLoading: false,//
}).then((response) => {
const data = response.data
if (data.success) {
state.professionalMasterDegreeList = data.result.professionalMasterDegreeList
state.academicMasterDegreeList = data.result.academicMasterDegreeList
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
}
//
const selectMasterDegree = (e:any)=>{
if(props.schoolId){
axiosInstance({
url: ApiConstant.GraduateDegree.getSchoolGraduateDegreeDetail,
method: 'get',
params: {
id: e
},
// showLoading: false,//
}).then((response) => {
const data = response.data
if (data.success) {
state.detail = data.result
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
}
</script>
<style lang="scss" scoped>
.flexWrap{
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
</style>

51
src/components/tip.vue Normal file
View File

@ -0,0 +1,51 @@
<template>
<div :style="styleObject">
<div :style="textStyleObject">
{{ title }}
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, computed } from 'vue';
//
const props = defineProps({
title: {
type: String,
default: ''
},
size: {
type: String,
default: '20px'
},
color: {
type: String,
default: '#409eff'
}
});
//
const styleObject = computed(() => {
let size = props.size
if(Number.isNaN(size)){
size+= 'px';
}
return {
height: size,
borderLeft: `3px solid ${props.color}`,
padding: '0 10px'
};
});
const textStyleObject = computed(() => {
let size = props.size
if(Number.isNaN(size)){
size+= 'px';
}
return {
lineHeight: size,
fontSize: `${props.size}`,
fontWeight: 600
};
});
</script>
<style scoped lang="scss"></style>

View File

@ -1,7 +1,8 @@
// src/main.js
// src/main.ts
import { createApp } from "vue";
import "./style.css";
import ElementPlus from "element-plus";
import * as ElementPlusIconsVue from '@element-plus/icons-vue';
//import VueAxios from 'vue-axios'
import 'element-plus/theme-chalk/el-message.css'//全局 Message 消息提示(js文件中使用不支持自动导入的样式)
import "element-plus/theme-chalk/el-message-box.css";// messageBox的样式
@ -13,11 +14,11 @@ import "element-plus/theme-chalk/el-notification.css";//Notification的样式
import 'element-plus/es/components/form/style/css'//script setup中使用组件时不支持自动导入的样式
import 'element-plus/theme-chalk/el-affix.css'//全局 固钉
import App from "./App.vue";
import ElTableInfiniteScroll from "el-table-infinite-scroll";
import App from "./App.vue";
// 引入Vue-Router
import Router from "./router";
// 引入Vue-i18n
import i18n from "./lang";
// Element Plus全局配置国际化
@ -27,31 +28,25 @@ import en from "element-plus/dist/locale/en.mjs";
import axiosInstance from '@/utils/http'//导入请求拦截器request
const app = createApp(App);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
//axios
app.config.globalProperties.$axios=axiosInstance;
// // 引入Axios
// import axios from "axios";
// // 后端接口域名
// axios.defaults.baseURL = "https://XXX.com";
// /**
// * 将axios挂载为app的全局自定义属性后每个组件可以通过this直接访问到全局挂载的自定义属性
// * e.g. this.$http.get('/login');
// * ===================================
// * 如果使用组合式API【setup()语法】由于vue3.0没有this需要使用getCurrentInstance来获取上下文
// * e.g.如下
// */
// // const { proxy } = getCurrentInstance();
// // proxy.$http.get("/api/getNewsList").then((response) => {
// // console.log(response);
// // });
// app.config.globalProperties.$http = axios; // 关键语句
// app.use(ElementPlus);
app.use(ElementPlus, {
// locale: zhCn,
locale: localStorage.getItem("locale") === "zh_CN" ? zhCn : en,
});
app.use(Router);
app.use(i18n);
app.use(ElTableInfiniteScroll);
// 注册所有图标
import 'virtual:svg-icons-register'; // 引入注册脚本
import SvgIcon from '@/components/SvgIcon/index.vue';
app.component('SvgIcon', SvgIcon);
//app.provide('$echarts', echarts);
app.mount("#app");

View File

@ -6,43 +6,48 @@ const routes = [
name: 'index',
component: () => import('@/views/index.vue')
},
/*{
{
path: '/fillVolunteer',//模拟填报
name: 'fillVolunteer',
component: () => import('@/views/fillVolunteer/index.vue')
},
{
path: '/myVolunteer',//我的志愿表
name: 'myVolunteer',
component: () => import('@/views/fillVolunteer/my.vue')
},*/
path: '/fillVolunteer/:rulesEnrollProbability',//模拟填报
name: 'fillVolunteer2',
component: () => import('@/views/fillVolunteer/index.vue')
},
// {
// path: '/myVolunteer',//我的志愿表
// name: 'myVolunteer',
// component: () => import('@/views/fillVolunteer/my.vue')
// },
{
path: '/school/search',//找大学
name: 'schoolSearch',
component: () => import('@/views/school/search.vue')
},
/*{
{
path: '/school/:schoolCode',//学校详情页
name: 'school',
component: () => import('@/views/school/schoolInfo.vue'),
component: () => import('@/views/school/detail.vue'),
meta:{
title:"学院介绍"
}
},*/
},
{
path: '/major/search',//查专业
name: 'majorSearch',
component: () => import('@/views/major/search.vue')
},
/*{
{
path: '/major/:majorCode',//专业详情页
name: 'major',
component: () => import('@/views/major/majorInfo.vue'),
meta:{
title:"专业概括"
}
},*/
/*{
},
{
path: '/scoreControlLine',//省控线
name: 'scoreControlLine',
component: () => import('@/views/other/historyScoreControlLine.vue'),
@ -50,14 +55,50 @@ const routes = [
title:"省控线"
}
},
{
path: '/checkRanking',//查位次
name: 'checkRanking',
component: () => import('@/views/other/checkRanking.vue'),
meta:{
title:"查位次"
}
},
{
path: '/calculateInvestment',//算投档
name: 'calculateInvestment',
component: () => import('@/views/other/calculateInvestment.vue'),
meta:{
title:"算投档"
}
},
{
path: '/testCultural',//测文化
name: 'testCultural',
component: () => import('@/views/other/testCultural.vue'),
meta:{
title:"测文化"
}
},{
path: '/article/search',//
name: 'articleSearch',
component: () => import('@/views/article/list.vue'),
meta:{
title:"资讯信息"
}
},{
path: '/article/:articleId',//资讯详情
name: 'article',
component: () => import('@/views/article/detail.vue'),
meta:{
title:"资讯详情"
}
},
/*{
path: '/search',//搜索
name: 'search',
component: () => import('@/views/search.vue')
},
{
path: '/membershipCardList',//会员卡列表
name: 'membershipCardList',
@ -82,12 +123,17 @@ const routes = [
path: '/login',//登录
name: 'login',
component: () => import('@/views/login.vue')
},
},*/
{
path: '/register',//注册
name: 'register',
component: () => import('@/views/register.vue')
},*/
},
{
path: '/passwordChanger',//更改密码
name: 'passwordChanger',
component: () => import('@/views/passwordChanger.vue')
},
// {path : '/:pathMatch(.*)*', redirect:{name:'index'}}//其余路由重定向至首页。
{ path: '/:pathMatch(.*)*', redirect: () => {

9
src/store/eventBus.ts Normal file
View File

@ -0,0 +1,9 @@
import mitt from "mitt";
type Events = {
sendMsg: string;
sendNum: number;
};
const bus = mitt<Events>();
export default bus;

View File

@ -1,12 +1,13 @@
:root {
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
/* font-family: Inter, Avenir, Helvetica, Arial, sans-serif; */
font-family:Microsoft Yahei, 微软雅黑, Arial, Helvetica, sans-serif !important;
font-size: 16px;
line-height: 24px;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
/* background-color: #242424; */
font-synthesis: none;
text-rendering: optimizeLegibility;
@ -53,22 +54,24 @@ h1 {
button {
border-radius: 8px;
border: 1px solid transparent;
/* border: 1px solid transparent; */
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
/* background-color: #1a1a1a; */
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
/* button 点击后移出按钮时增加边框 */
/* button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
} */
.card {
padding: 2em;

46
src/types/index.d.ts vendored
View File

@ -1,3 +1,14 @@
//路由参数
export interface RouterEntity{
id:number,
name:string,
url:string,
parentId:number,
childColumn:Array,
sort:number,
linkMode:number,
}
///艺考
export interface FillVolunteer{
type:string,
@ -35,6 +46,12 @@ export interface MajorEntity{
}
export interface SchoolEntity{
id:string,
arwuRanking:string,//软科排名
schoolResearchTeaching:any,//科研教学
femaleRatio:Number,//男生占比
maleRatio:Number,//女生占比
schoolName:string,
schoolCode:string,
schoolIcon:string,
@ -66,3 +83,32 @@ export interface ScoreControlLineEntity{
}
//========================================
//专业选课对象
export interface SubjectsEntity{
label:string,//名称
value:string,//值
exclude:string,//排斥选课
scoreMax:number,//最高分
children:Array,//子级
}
//用户成绩对象
export interface ScoreInfoEntity{
meBatchLevel:number,//我的批次等级
province:string,//省份
cognitioPolyclinic:string,//科类 文科/理科
professionalCategory:string,//报考方向 美术与设计类/音乐类....
batch:string,
culturalScore: number,//文化分
professionalScore: number,//统考分
chineseScore: number,//语文成绩
englishScore: number,//英语成绩
subjects:Array<string>,//专业选课
professionalCategoryChildren:string,//专业选课 strs 拼接
yybysy:number,//音乐表演声乐
yybyqy:number,//音乐表演器乐
yyjy:number,//音乐教育
fzby:number,//服装表演
xjysdy:number,//戏剧影视导演
xjysby:number,//戏剧影视表演
}

View File

@ -1,46 +1,79 @@
// @ts-ignore
const Major={
majorList:'/web/major/list',//获取专业信息表
majorTypeList:'/web/major/typeList',//专业类型列表
recommendMajorPage:'/art/recommendMajor/page',//获取推荐专业列表
recommendMajorList:'/art/recommendMajor/list',//获取学校的其他专业
schoolMajorDtoPage:'/yx/yxSchoolMajor/dtoPage',//获取学校开设专业分页数据
schoolHistoryMajorEnrollList:'/yx/yxHistoryMajorEnroll/list',//获取学校的分数计划
schoolMajorList:'/yx/yxSchoolMajor/list',//获取school_major 数据
majorList:'/yx/yxMajor/list',//获取专业信息表-分页列表查询
majorInfo:'/art/major/majorInfo',//获取专业详情
schoolMajorList:'/web/major/schoolMajorList',//获取school_major 数据
majorInfo:'/mini/major/majorInfo',//获取专业详情
rulesEnrollrobabilityMenuList: '/mini/major/rulesEnrollrobabilityMenuList',
testCultural:'/web/major/testCultural',//测文化
}
//用户类
const User={
exchangeVipCard:'/yx/yxVipCard/exchange',//兑换vip卡
login:'/web/user/login/passwd',//登录
register:'/web/user/register',//注册
logout:'/sys/logout',//退出
checkPhoneAvailable:'/web/user/checkPhoneAvailable',
passwordChanger:'/web/user/passwordChanger',//更改密码
}
const System={
findPassWord:'/sys/findPassWord',//找回密码
}
//高考分数类
const Score={
scoreList:'/web/user/score/scoreList',//用戶成績列表
scoreSave:"/yx/yxScore/save",//保存用户专业得分
getScore:"/yx/yxScore/getUserScoreInfo",//获取当前用户的高考分数信息
getScore:"/web/user/score/getUserScoreInfo",//获取当前用户的高考分数信息
todayOfEditScoreCount:'/web/user/score/todayOfEditScoreCount',//今天可编辑成绩次数
conversionScoreBatch:"/yx/yxHistoryScoreBatch/conversionScoreBatch",//获取分数批次段
historyScoreControlLineList:'/yx/yxHistoryScoreControlLine/list',//省控线分页列表
scoreSegmentSearchByScore: '/yx/yxScoreSegment/searchByScore',//获取五分一段信息
testCultural: '/art/recommendMajor/testCultural',//文化分测算
calculateInvestment: '/art/recommendMajor/calculateInvestment',//投档分测算
scoreSegmentList:'/web/scoreSegment/list',//五分一段表
}
//学校类
const School = {
searchSchoolList:"/art/school/search",//搜索 学校列表
schoolInfo:"/art/school/schoolInfo",//学校介绍详情
hotSchoolList:'/art/school/hotList',//热门院校 列表
searchSchoolList:"/web/school/search",//搜索 学校列表
schoolInfo:"/web/school/schoolInfo",//学校介绍详情
hotSchoolList:'/web/school/hotList',//热门院校 列表
doubleFirstPlan:'/mini/school/doubleFirstPlan',//院校双万计划
subjectEvaluation:'/mini/school/subjectEvaluation',//院校第四轮学科评估
}
//志愿
const Volunteer={
volunteerList:'/web/volunteer/volunteerList',//我的志愿表列表
volunteerSaveBatch:'/web/volunteer/saveBatch',//批量添加志愿明细信息
volunteerDeleteBatch:'/web/volunteer/deleteBatch',//批量删除志愿明细信息
switchVolunteer: '/art/volunteer/switchVolunteer',//切换志愿及成绩
volunteerDelete: '/art/volunteer/delete',//志愿表删除
editNowVolunteerName:'/web/volunteer/editNowVolunteerName',//更改当前志愿表名称
exchangeIndexs:'art/volunteer/exchangeIndexs',//切换志愿顺序
///========================
volunteerDetail:'/art/volunteer/artVolunteerDetail',//查看已报志愿信息
recommendMajorPage:'/web/major/recommendMajor/page',//推荐志愿专业列表
volunteerSave:"/art/volunteer/save",//保存用户的志愿
volunteerList:'/art/volunteer/list',
volunteerInfo:'/art/volunteer/info',
volunteerPage:'/art/volunteer/page',
volunteerRecordDel:'/art/volunteer/recordDel',//删除志愿明细
volunteerRecordReplace:'/art/volunteer/replaceVolunteer',//替换志愿明细
}
const Article={
articlePage: '/mini/article/page',//文章列表
articleContent: '/mini/article/articleContent',//文章详细内容
}
const GraduateDegree={
findSchoolGraduateDegreeList:'/mini/schoolGraduateDegree/findSchoolGraduateDegreeList',//获取院校下的研究生点列表
getSchoolGraduateDegreeDetail:'/mini/schoolGraduateDegree/getSchoolGraduateDegreeDetail',//获取院校下的研究生点列表
majorGroupAll:'/mini/schoolGraduateDegree/majorGroupAll',//艺考考研列表数据
}//研究生点信息
export default
{
Major,User,Score,School,Volunteer,System
Major,User,Score,School,Volunteer,System,Article,GraduateDegree
}

View File

@ -0,0 +1,16 @@
// @ts-ignore
import img1 from '@/assets/images/bao/较稳妥.png'
import img2 from '@/assets/images/bao/可保底.png'
import img3 from '@/assets/images/bao/可冲击.png'
import img4 from '@/assets/images/bao/难录取.png'
//录取概率图片
const enrollProbability={
jwt:img1,//较稳妥
kbd:img2,//可保底
kcj:img3,//可冲击
nan:img4,//难录取
}
export default{
enrollProbability
}

View File

@ -1,4 +1,14 @@
// @ts-ignore
//默认导航栏
const defaultRouterList = [
{id: 1,name: "首页",parentId: 0,childColumn: [],sort: 100,linkMode: 3,url: "index"},
{id: 2,name: "模拟报志愿",parentId: 0,childColumn: [],sort: 30,linkMode: 3,url: "fillVolunteer"},
{id: 3, name: "找大学", parentId: 0, childColumn: [], sort: 75, linkMode: 3, url: "school/search"},
{id: 4, name: "查专业", parentId: 0, childColumn: [], sort: 75, linkMode: 3, url: "major/search"},
]
/*就读地域编码列表*/
const addressList = [
{name: "北京", code: "北京"},
@ -49,21 +59,22 @@ const institutionTypeList = [
]
/*学校类型标签*/
const schoolTypeList = [
{name: "本科", code: "本科"},
{name: "专科", code: "专科"},
// {name: "本科", code: "本科"},
// {name: "专科", code: "专科"},
{name: "公办", code: "公办"},
{name: "民办", code: "民办"},
{name: "中外合作办学", code: "中外合作办学"},
{name: "内地与港澳台地区合作办学", code: "内地与港澳台地区合作办学"},
// {name: "内地与港澳台地区合作办学", code: "内地与港澳台地区合作办学"},
]
const tagsList = [
{name: "211", code: "211"},
{name: "985", code: "985"},
{name: "211", code: "211,"},
{name: "双一流", code: "双一流"},
{name: "教育部直属", code: "教育部直属"},
{name: "中央部委", code: "中央部委"},
{name: "强基计划", code: "强基计划"},
{name: "全国重点大学", code: "全国重点大学"},
// {name: "教育部直属", code: "教育部直属"},
// {name: "中央部委", code: "中央部委"},
// {name: "强基计划", code: "强基计划"},
]
const tagsList2 = [
@ -91,6 +102,7 @@ const hostoryYear = [
]
const allYear = [
{label: "2024"},
{label: "2023"},
{label: "2022"},
{label: "2021"},
@ -106,8 +118,33 @@ const batchOptions = [
]
//专业类型
const professionalCategoryList= [
{value: '美术与设计类', label: '美术与设计类', scoreMax: 300,},
{value: '播音与主持类', label: '播音与主持类', scoreMax: 300,},
{
value: '表演类', label: '表演类', scoreMax: 300, children: [
{label: '服装表演', value: '服装表演'},
{label: '戏剧影视导演', value: '戏剧影视导演'},
{label: '戏剧影视表演', value: '戏剧影视表演'}
]
},
{
value: '音乐类', label: '音乐类', scoreMax: 300, children: [
{label: '音乐表演声乐', value: '音乐表演声乐', exclude: '音乐表演器乐'},
{label: '音乐表演器乐', value: '音乐表演器乐', exclude: '音乐表演声乐'},
{label: '音乐教育', value: '音乐教育'}
]
},
{value: '舞蹈类', label: '舞蹈类', scoreMax: 300,},
{value: '书法类', label: '书法类', scoreMax: 300,},
{value: '戏曲类', label: '戏曲类', scoreMax: 300},
{value: '体育类', label: '体育类', scoreMax: 150,},
/*{value: '', label: '', scoreMax: 200},
{value: '国际标准舞类', label: '国际标准舞类', scoreMax: 200},*/
]
const zyOptions = [
{value: '美术类', label: '美术类', scoreMax: 300},
{value: '美术与设计类', label: '美术与设计类', scoreMax: 300},
{value: '体育类', label: '体育类', scoreMax: 150},
{value: '音乐类', label: '音乐类', scoreMax: 200},
{value: '艺术舞蹈类', label: '艺术舞蹈类', scoreMax: 200},
@ -150,5 +187,5 @@ const subjectCategorys = {
}
export default {
addressList, institutionTypeList, schoolTypeList, tagsList, tagsList2, hostoryYear, batchOptions, zyOptions, klOptions,subjectCategorys,allYear,rulesEnrollProbabilityList
professionalCategoryList,defaultRouterList,addressList, institutionTypeList, schoolTypeList, tagsList, tagsList2, hostoryYear, batchOptions, zyOptions, klOptions,subjectCategorys,allYear,rulesEnrollProbabilityList
}

View File

@ -5,7 +5,7 @@ import { LoadingInstance } from 'element-plus/lib/components/loading/src/loading
import createRouter from '@/router'
import debounce from "lodash/debounce";
import store from "@/store";
import {isNotNull, isNull} from "@/utils/tool";
import {clearUserIocalStorage, isNotNull, isNull} from "@/utils/tool";
//获取TOken
export const getAccessToken = ()=>{
@ -103,10 +103,8 @@ axiosInstance.interceptors.request.use((config: any) => {
if(config.isCorsDefaultHeaders == undefined || config.isCorsDefaultHeaders == false){
config.headers['X-Requested-With'] = 'XMLHttpRequest';
}
//判断当前请求是否设置了不显示Loading
if(config.showLoading !== false){
if(config.showLoading === undefined ||config.showLoading !== false){
showLoading(config.loadingTarget as string | HTMLElement,config.loadingMask as boolean);
}
if (config.method === 'get' && config.timestamp !== false){
@ -208,6 +206,7 @@ axiosInstance.interceptors.response.use((response: AxiosResponse) => {
},
// 请求失败
(error: any) => {
console.log('请求失败')
if(error.response){
switch (error.response.status) {
case 400:
@ -220,22 +219,35 @@ axiosInstance.interceptors.response.use((response: AxiosResponse) => {
break;
case 401:
console.log('登录失效')
let token = getAccessToken() as string
//有token情况
if (isNull(getAccessToken() as string)) {
if (isNotNull(token)) {
//如果没有登录过
//直接跳转到登录页
//删除会话token
removeAccessToken()
clearUserIocalStorage();
ElMessage({
showClose: true,
message: '登录状态失效',
type: 'error',
})
createRouter.push({
path : '/index'
});
setTimeout(function(){
window.location.reload()
}, 1000);
}else{
ElMessage({
showClose: true,
message: '请先登录',
type: 'error',
})
createRouter.push({
path : '/login'
path : '/index'
});
break;
}
break;
case 403:
ElMessage({
showClose: true,

View File

@ -1,5 +1,29 @@
import { number } from 'echarts';
import { ElMessageBox, MessageBoxState } from 'element-plus'
import type { Action } from 'element-plus'
/**
*
*/
export const clearUserIocalStorage = () =>{
localStorage.removeItem('vipInfo');
localStorage.removeItem('scoreInfo');
localStorage.removeItem('userInfo');
localStorage.removeItem('volunteer');
localStorage.removeItem('fillVolunteer');
localStorage.removeItem('X-Access-Token');
}
//判断vip等级
export const checkLevel = (level:number) =>{
if(level===0){
return true;
}
let vipInfo = localStorage.getItem('vipInfo') as any
if(vipInfo){
vipInfo = JSON.parse(vipInfo);
return vipInfo.vipLevel >= number
}
return false
}
/**
* Array null且其size不等于0
@ -74,3 +98,11 @@ export function convertToChinaNum(num: number) {
result = result.replace(/^一十/g, '十');
return result;
}
/**
*
*/
export function getSystemName(){
let systemName = '艺体志愿宝'
return systemName;
}

View File

@ -1,11 +0,0 @@
<script setup>
</script>
<template>
Major
</template>
<style scoped>
</style>

View File

@ -0,0 +1,83 @@
<template>
<div style="background-color: white">
<div class="main-container wrap main-fullScreen">
<div v-if="state.flag" class="rich-text" v-html="state.richTextContent"></div>
<div v-else>
<div class="not-found">
<h1>404 - 页面未找到</h1>
<p>抱歉您要访问的页面不存在</p>
</div>
</div>
</div>
<el-backtop :bottom="100" :visibility-height="100">
<el-icon color="#409efc" class="no-inherit">
<ArrowUpBold />
</el-icon>
</el-backtop>
</div>
</template>
<script lang="ts" setup>
import {onMounted, reactive} from 'vue';
import ApiConstant from '@/utils/ApiConstant';
import axiosInstance from '@/utils/http';
import { useRoute } from 'vue-router';
const { query, params } = useRoute();
document.title = '招生章程|艺体志愿宝';
//
let articleId = params.articleId
const state = reactive({
flag:true,
richTextContent: ''
})
onMounted(() => {
getArticleDetail()
})
function getArticleDetail(){
if(!articleId || articleId===undefined || articleId===null){
state.flag = false
return false
}
axiosInstance({
url: ApiConstant.Article.articleContent+'/'+articleId,
method: 'get',
params:{},
showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if(data.result){
state.richTextContent = data.result.content
document.title = data.result.title+'|艺体志愿宝';
}else{
state.flag = false
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
</script>
<style lang="scss" scoped>
*{
background-color: white;
}
.rich-text{
margin: 0 auto;
}
.not-found {
text-align: center;
margin-top: 50px;
}
.not-found h1 {
font-size: 2em;
margin-bottom: 20px;
}
.not-found p {
font-size: 1.2em;
}
</style>

202
src/views/article/list.vue Normal file
View File

@ -0,0 +1,202 @@
<template>
<div class="margin-5"></div>
<div class="main-container wrap main-fullScreen">
<!--筛选项-->
<div class="filterTable">
<div class="filterBody">
<div class="flexWrap">
<div class="flex-item-5 tags">
<span class="tag" :class="state.selectForm.type === item.type ? 'tag-active' : ''"
v-for="(item, index) in state.articleTypeList" :key="index" @click="selectArticleType(item)">
{{ item.name }}
</span>
</div>
<div class="flex-item-5">
<div class="searchSchool">
<el-input v-model="state.selectForm.title" maxlength="24" show-word-limit
style="max-width: 230px;height: 40px;line-height: 40px;" placeholder="输入院校名称"
class="input-with-select" clearable/>
<el-button :icon="Search" @click="reloadSearch"
style="border-left: none;height: 40px;line-height: 40px;" />
</div>
</div>
</div>
</div>
</div>
<div class="articleList" style="background-color: white">
<div class="item" v-for="(item,index) in state.articleList" :key="index">
<div class="">
<router-link :to="{ path: '/article/'+item.id, query: { } }" target="_blank">
<div class="item-title">{{ item.title }}</div>
<div class="item-other-info">{{ item.date||'' }}</div>
</router-link>
</div>
</div>
<div style="padding: 20px">
<el-pagination
@current-change="handleCurrentChange"
:current-page="state.articlePage.currentPage"
:page-size="state.selectForm.pageSize"
background
:total="state.articlePage.total"
layout="prev, pager, next"/>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive } from 'vue';
import { Search } from '@element-plus/icons-vue';
import ApiConstant from '@/utils/ApiConstant';
import axiosInstance from '@/utils/http';
import { useRoute } from "vue-router";
const route = useRoute();
const state = reactive({
selectForm: {
type: '1',
title:'',
pageNum: 1,
pageSize: 10
} as any,
articleTypeList: [{
type: '1',
name: '招生章程'
}, {
type: '2',
name: '高考动态'
}, {
type: '3',
name: '校内资讯'
}] as any,
articlePage:{
currentPage:0,
total:0,
} as any,
articleList:[] as any,
articleList2: [
{
id:'1765345402544730114',
title: "北京市2024年艺术类专业招生工作实施办法公布",
author: "圣达信教育",
date: "2024-05-08 18:27:33",
read_count: 7
},
{
title: "北京市2024年高校艺术类专业招生问答来了",
author: "圣达信教育",
date: "2024-05-08 18:27:25",
read_count: 1
},
{
title: "北京市2024年高招工作规定出炉本科普通批可填报30个志愿",
author: "圣达信教育",
date: "2024-05-08 18:22:15",
read_count: 0
},
{
title: "北京高招体检3月10日启动体检注意事项来啦",
author: "圣达信教育",
date: "2024-02-28 17:49:47",
read_count: 1
},
{
title: "北京市2024年艺术类统考合格分数线公布",
author: "圣达信教育",
date: "2024-01-08 11:33:52",
read_count: 2
},
{
title: "2024年北京美术类专业统考成绩查询开通",
author: "圣达信教育",
date: "2024-01-08 10:18:01",
read_count: 0
},
{
title: "2024年九大美院美术类校考专业有这些变化",
"category": "解读与指导",
author: "圣达信教育",
date: "2023-12-18 17:14:19",
read_count: 0
},
{
title: "北京明天9时起高考网上填报个人信息并缴费",
author: "圣达信教育",
date: "2023-10-31 17:26:58",
read_count: 0
},
{
title: "北京艺术类考试招生专业目录来了",
author: "圣达信教育",
date: "2023-10-30 20:10:39",
read_count: 0
},
{
title: "京籍考生明起报名,报名详细流程和注意事项请收藏",
author: "圣达信教育",
date: "2023-10-24 17:40:41",
read_count: 0
}
] as any
})
onMounted(()=>{
if(route.query.type && ['1','2','3'].includes(route.query.type as any)){
state.selectForm.type = route.query.type
}
getArticleList()
})
function getArticleList() {
axiosInstance({
url: ApiConstant.Article.articlePage,
method: 'get',
params: state.selectForm
}).then((res: any) => {
if(res.data.result){
console.log(res.data.result)
state.articlePage.currentPage = res.data.result.current
state.articlePage.total = res.data.result.total
state.articleList = res.data.result.records
}
})
}
function handleCurrentChange(val:any){
state.selectForm.pageNum = val;
getArticleList()
}
function reloadSearch(){
state.selectForm.pageNum = 1
getArticleList()
}
function selectArticleType(e: any) {
state.selectForm.type = e.type
state.selectForm.pageNum = 1
getArticleList()
}
</script>
<style scoped lang="scss">
.wrap {
width: 1210px;
}
.item{
padding: 10px 20px;
border-bottom: 1px solid #f4f4f4;
.item-title{
color: #111111;
font-weight: 700;
font-size: 16px;
line-height: 30px;
}
.item-other-info{
font-size: 14px;
color:#bbb;
cursor: text;
}
}
</style>

View File

@ -1,11 +0,0 @@
<script setup>
</script>
<template>
fillVolunteer
</template>
<style scoped>
</style>

File diff suppressed because it is too large Load Diff

179
src/views/index-bak.vue Normal file
View File

@ -0,0 +1,179 @@
<script lang="ts" setup>
import {ref, getCurrentInstance, ComponentInternalInstance, reactive} from 'vue'
import {ElMessage} from 'element-plus'
//
import image1 from '@/assets/images/gk/2023/sxznps.jpg';
import image2 from '@/assets/images/gk/2023/ddps.jpg';
import image3 from '@/assets/images/gk/2023/gzdz1200.jpg';
//=============
import {Swiper, SwiperSlide} from "swiper/vue";
import {Navigation, Pagination, Scrollbar, A11y, Autoplay} from 'swiper';
import "swiper/css";
import ApiConstant from "@/utils/ApiConstant";
import { getScore } from '@/axios/api';
import SystemHelp from '@/components/SystemHelp.vue';
document.title = '河南艺体考生专属VIP|艺体志愿宝';
//
const {proxy} = getCurrentInstance() as ComponentInternalInstance;
const modules = [Navigation, Pagination, Scrollbar, A11y, Autoplay];
const onSwiper = (swiper: any) => {
//console.log(swiper);
};
const navigation = ref({
nextEl: '.button-next',
prevEl: '.button-prev',
})
const prevEl = () => {
// console.log('' + index + item)
}
const nextEl = () => {
// console.log('')
}
</script>
<template>
<div class="margin-5"></div>
<div class="main-container wrap main-fullScreen">
<el-row :gutter="20">
<!-- 轮播图-->
<el-col :span="18">
<div class="header_swiper">
<Swiper
:modules="modules"
:pagination="true"
:mousewheel="true"
:keyboard="true"
@swiper="onSwiper"
:navigation="navigation"
:autoplay="{ delay: 3000, disableOnInteraction: false }"
:loop="true"
>
<swiper-slide style="width: 1200px">
<img :src="image1" alt="Image"/>
</swiper-slide>
<swiper-slide style="width: 1200px">
<img :src="image2" alt="Image"/>
</swiper-slide>
<swiper-slide style="width: 1200px">
<img :src="image3" alt="Image"/>
</swiper-slide>
</Swiper>
</div>
<div class="swiper-scrollbar"></div>
<div class='button-prev' @click.stop='prevEl'>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAwCAYAAAAPfWqeAAADpUlEQVRYR73YX2gcRRwH8N9v7vyDIiJSqtJaFEVRLBSs+CAotNogRZTs7s2sUEgFhQr1QR/aBxVsH3xRWvtQqf9Q4TZOdtOeOUOjbc4HoYpBQfClD75JIzHV9BrTO2/zlc3NJmtzyf3bu31clt9nfjO/mZ0Zph49ANjzRg4x0xDAR7kXDgAxPDxyAqAXovjM9HvqUIR4nv8JEfbESTDzgVQhrXUmDPlzACqBHFbKfj01qFQqZaen/8wDsGNECHpTSuetpe5LY4ympqauOX/+N01EzyaQg1I6by9n1i00Pj5+3dzcvA9g90osfs117XeSsbvKqFQqXT89PXMSoIGVMRGvKGW9d3UCHUNjY2M3lMsLBSLaWS9hBjNeltI53qiXOoImJiZuvHjxUhHAEyboohD8kpT2h2sNRdtQoVC4aX6+Mk5Ej8UIkdjrutan6413W5DW+uYwpNMAPWpmfEhEe5Ry8s2KqmWoWCzeUi7/MwHQdjMmNYCfd10rKuumT0vQ6OjorZVK+A2AbSbiv8yUU8o52VQwHzSFtNYbwpDPANhqMqkIwXYuZ421ijRdGfL5wkaiyiQRPWCCXiGi51zXOd0Osi7keYU7gCXkPjPwC0JknsnlBs+0i6wJBUGwqVoNSwDdY4LOM/NupexvO0EaQkEQbDHIXfWgXM5m8bTjON91iqyCgiC4u1JZnCTCFhP0UjZLA47jnOsG+R/k+/691SoiZJPJ5G8hxFNSDv7YLbIM+b5/v0FuN8isQX5KA1mC8nn/QebFswBtNNU1A4idrmv9khZiIP0DET1ikD8AscN1rV/TRPoN9anrorQaFQMzP6mU9XNaXbi8qK4ub/pLiMyuVMs7bnU0Yc2qcKcpjjnmzICUg993m9mq30RflqC41Z53ajNRdbKni+oK1offRIxprW+r1ehsT398CWyDwR6qFwhXmMmS0i62UyBN9wxRsL5sTuJW17dbC18DeNhkVmMmV0p7pJXMWsoo0Y2930DGWKMtsRA8JKX92XqZtZVRHCja5M/Ozn1FRI+bd4vM9KJSzkdrYR1BUbDo2HL58pUvAewwYwYi3qeU9X4jrGMoChYdxC5cmDlFRLtWgvN+17WPXY11BUXBGh0thaBXpXTeTWJdQ1EwrfW1tRp90dPDctzq+vF/xgPIit8x8xtK2YeWxrCVydbqN3250EhM6kytxh8nr2iEoIOpZhRj9Usn/wMAe+ul34NLpwTGw8P+YYCGiOjIf5yH1rQHeb5wAAAAAElFTkSuQmCC"
alt="">
</div>
<div class='button-next' @click.stop='nextEl'>
<img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAwCAYAAAAPfWqeAAADa0lEQVRYR9XYX4hUVRwH8O9v7zTjto5buy6N9OaDL0FQrJBQ0IzW2jbb6M7sae+CiSRhD/2hIHrQQHvopR4KCgp0Qejeu/fOmoTFmgoFPYQFgYIUiWIuqUREhKI1c74x3jPuqOvuzu6Zge7rDL8P5/x+55zfOeJ50RsifIXEuOuO7BIRogWf+H44TeL+WmwR7B0dHXlBRLRtS4IgfFNrvDMTWPa7bmmbbUxqgO9Hb5PcWcdExHccblFKVW2N7DpU+4IgfEtr7G7Aokxm5Vg2m63YwG5ABrtlGnFwzZrVqr+//9+lYjdBtWCeF70O8N2GkR3q7u4qDQ4OXlsKdhsU56z8Mqnfn8Ewlcn0bc5ms1cXi80KmWl8kZQPSdb/czSd7iwMDQ1dWQx2RyjGou1a82MAHfE6k697elbkBwYGLjeLzQnFOStvBfS+Ogbg266u1GChUPi7GWxeKM5ZOAZgPwnH7CDfOQ42KqX+Wii2IMiMTInwU5IJg32fTt89kM/n/1wItmDIjGwziQkAd5mc/ZhKOU8MDw//MR/WFFQLNjFRHtKaEcmUwU44DjcopX6fC2saMtX4lNY8AGCZCX4KSOXGxgqX7oQtCopHNrlB6+rnJDpN8J9FUjnXLfw2G7ZoKM5Z9DjJQwC6TIGcTiadbLFYnL4VWxJksMdIfAEwbbCzBjvXiC0ZqgULw3BdpYIpACvi4HIulerIFYvFM3XMChQXyORarfVXAO8x2HQyKblSqfTLdXq++m/m9yCYfJisHiHRY7ALBvvJKmR2kAdF9FESfSZnl8iO9dYhgz0goo+RuM/MyPH/L+R55dZPne+XHyJ5BGBvy4ohLu/qYQD3tqy8g2DyEbI6RaLbVNqvZnewt2DDMHy0UpEvW7oFzbapAsmc6246b21Tbcsx4XnhRgCfNR58iQTWK6UuWjv4giDKkyjXj3IAJw1i7yj3/bD1zUkQRCMkvJl2S35IpzuftNputaWBDILoOa053tKW2PfD50l80oB809vb/bTVJt/3yzsAflS/tojIseXLlz1j9driedFLAD9oWBOHV63q22T1IhYE4Wta470b3YuI/avl7W8OOJhI4Fml1D/NNClzdqq+H+0iuWdmJChnMn2u1et/Wx402vZE07ZHp9ozGoBXRTA+Olra2apntP8AQCOqBFQ0cxQAAAAASUVORK5CYII="
alt="">
</div>
</el-col>
<!-- 表单-->
<el-col :span="6" style="z-index: 5">
<div class="" style="background-color: #ffffff;height:420px"></div>
</el-col>
</el-row>
<HotSchool/>
<SystemHelp/>
</div>
<el-backtop :bottom="100" :visibility-height="100">
<el-icon color="#409efc" class="no-inherit">
<ArrowUpBold />
</el-icon>
</el-backtop>
<div class="margin-5"></div>
</template>
<style scoped lang="scss">
root {
width: 100%;
}
/*轮播图 start*/
.header_swiper {
z-index: -1;
width: 1200px !important;
height: 420px !important;
}
.swiper {
width: 100%;
height: 100%;
}
.swiper-wrapper {
position: relative;
width: 100%;
height: 100%;
z-index: 1;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-transition-property: -webkit-transform;
transition-property: -webkit-transform;
-o-transition-property: transform;
transition-property: transform;
transition-property: transform, -webkit-transform;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
.swiper-slide {
text-align: center;
font-size: 18px;
background: #fff;
/* Center slide text vertically */
display: flex;
justify-content: center;
align-items: center;
width: 1200px;
height: 420px !important;
}
.swiper-slide img {
-webkit-flex-shrink: 0;
flex-shrink: 0;
width: 100%;
height: 100%;
position: relative;
-webkit-transition-property: -webkit-transform;
transition-property: -webkit-transform;
-o-transition-property: transform;
transition-property: transform;
transition-property: transform, -webkit-transform;
}
swiper-slide img {
display: block;
margin: 0 auto;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.button-prev {
position: absolute;
top: 185px;
left: 10px;
z-index: 99;
cursor: pointer;
}
.button-next {
position: absolute;
top: 185px;
right: 300px;
z-index: 99;
cursor: pointer;
}
/*轮播图 end*/
</style>

View File

@ -1,23 +1,83 @@
<script lang="ts" setup>
import {ref, getCurrentInstance, ComponentInternalInstance, reactive} from 'vue'
import {ElMessage} from 'element-plus'
import { ref, ComponentInternalInstance, reactive } from 'vue';
import { useRouter } from "vue-router";
import { getArticleList } from '@/axios/api';
//
import image1 from '@/assets/images/gk/2023/sxznps.jpg';
import image2 from '@/assets/images/gk/2023/ddps.jpg';
import image3 from '@/assets/images/gk/2023/gzdz1200.jpg';
import image1 from 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/web-bakground/9af57e5023e220c08f9e746c48efd2c.png';
import image2 from 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/web-bakground/2f7805626e85d9fec0ea40573b86886.png';
import image3 from 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/web-bakground/42bf964bb240d8571c8d2258a1f74e5.png';
import cdx from '@/assets/images/options/chayuanxiao.png';//
import czy from '@/assets/images/options/chazhuanye.png';//
import skx from '@/assets/images/options/shengkongxian.png';//线
import cwh from '@/assets/images/options/cewenhua.png';//
import cwc from '@/assets/images/options/chaweici.png';//
import std from '@/assets/images/options/suantoudang.png';//
import ykky from '@/assets/images/options/tongji.png';//
import zszc from '@/assets/images/options/zhaoshengzhangcheng.png';//
//=============
import {Swiper, SwiperSlide} from "swiper/vue";
import {Navigation, Pagination, Scrollbar, A11y, Autoplay} from 'swiper';
import { Swiper, SwiperSlide } from "swiper/vue";
import { Navigation, Pagination, Scrollbar, A11y, Autoplay } from 'swiper';
import "swiper/css";
import {SchoolEntity} from "@/types";
import ApiConstant from "@/utils/ApiConstant";
import SystemHelp from '@/components/SystemHelp.vue';
import ImagesConstant from '@/utils/ImagesConstant';
import { onMounted } from 'vue';
document.title = '河南艺体考生专属VIP|艺体志愿宝';
const router = useRouter()
//
const {proxy} = getCurrentInstance() as ComponentInternalInstance;
const modules = [Navigation, Pagination, Scrollbar, A11y, Autoplay];
const images = [
{ url: 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/web-bakground/9af57e5023e220c08f9e746c48efd2c.png', link: '' },
// { url: 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/web-bakground/2f7805626e85d9fec0ea40573b86886.png', link: '' },
{ url: 'https://mp-7a4eecb1-2a04-4d36-b050-1c4a78cc31a4.cdn.bspapp.com/images/web-bakground/42bf964bb240d8571c8d2258a1f74e5.png', link: '' },
] as any
const homeOptions = [
{
title: "查大学",
icon: cdx,
link: "/school/search"
},
{
title: "查专业",
icon: czy,
link: "/major/search",
},
{
title: "省控线",
icon: skx,
link: "/scoreControlLine"
},
{
title: "测文化",
icon: cwh,
link: "/school/search"
},
{
title: "查位次",
icon: cwc,
link: "/checkRanking"
},
{
title: "算投档",
icon: std,
link: "/calculateInvestment"
},
{
title: "艺考考研",
icon: ykky,
link: "/"
},
{
title: "招生章程",
icon: zszc,
link: "/article/search"
}
] as any
const onSwiper = (swiper: any) => {
console.log(swiper);
//console.log(swiper);
};
const navigation = ref({
nextEl: '.button-next',
@ -30,73 +90,32 @@ const nextEl = () => {
// console.log('')
}
//
const state = reactive({
hotSchoolList: [] as Array<SchoolEntity>,
hotTabActive: 1
})
const hotSchoolList = reactive({
nowProvinceBenSchoolList: [],//
nowProvinceZhuanSchoolList: [],//
otherProvinceBenSchoolList: [],//
otherProvinceZhuanSchoolList: []//
})
getHotSchoolList()
//
function getHotSchoolList() {
proxy?.$axios({
url: ApiConstant.School.hotSchoolList,
method: 'get',
params: {},
showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
console.log(data)
//
hotSchoolList.nowProvinceBenSchoolList = data.result.nowProvinceBenSchoolList
hotSchoolList.nowProvinceZhuanSchoolList = data.result.nowProvinceZhuanSchoolList
hotSchoolList.otherProvinceBenSchoolList = data.result.otherProvinceBenSchoolList
hotSchoolList.otherProvinceZhuanSchoolList = data.result.otherProvinceZhuanSchoolList
if (state.hotTabActive == 1) {
state.hotSchoolList = hotSchoolList.nowProvinceBenSchoolList
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
function copyText(textToCopy) {
const textField = document.createElement('textarea');
textField.innerText = textToCopy;
document.body.appendChild(textField);
textField.select();
document.execCommand('copy');
textField.remove();
ElMessage({
message: '已复制.',
type: 'success',
})
}
//
function switchHotTab(index: number) {
state.hotTabActive = index
//
if (index == 1) {
state.hotSchoolList = hotSchoolList.nowProvinceBenSchoolList
} else if (index == 2) {
state.hotSchoolList = hotSchoolList.nowProvinceZhuanSchoolList
} else if (index == 3) {
state.hotSchoolList = hotSchoolList.otherProvinceBenSchoolList
} else if (index == 4) {
state.hotSchoolList = hotSchoolList.otherProvinceZhuanSchoolList
const openTab = (e: any) => {
if(e.link && e.link!==''){
window.open(e.link)
}
}
const articleData = reactive({
articleList1:[] as any,
articleList2:[] as any,
})
onMounted(() => {
getData()
})
const getData = async() => {
articleData.articleList1 =await getArticleList(1, 1)
articleData.articleList2 =await getArticleList(3, 1)
console.log(articleData.articleList1)
}
const open = (e: any) => {
router.push(e)
}
const openArticleDetail =(e:any) =>{
router.push('/article/'+e.id)
}
</script>
<template>
@ -106,143 +125,96 @@ function switchHotTab(index: number) {
<!-- 轮播图-->
<el-col :span="18">
<div class="header_swiper">
<Swiper
:modules="modules"
:pagination="true"
:mousewheel="true"
:keyboard="true"
@swiper="onSwiper"
:navigation="navigation"
:autoplay="{ delay: 3000, disableOnInteraction: false }"
:loop="true"
>
<swiper-slide style="width: 1200px">
<img :src="image1" alt="Image"/>
</swiper-slide>
<swiper-slide style="width: 1200px">
<img :src="image2" alt="Image"/>
</swiper-slide>
<swiper-slide style="width: 1200px">
<img :src="image3" alt="Image"/>
<Swiper :modules="modules" :pagination="true" :mousewheel="true" :keyboard="true" @swiper="onSwiper"
:navigation="navigation" :autoplay="{ delay: 3000, disableOnInteraction: false }" :loop="true">
<swiper-slide class="swiper-img" v-for="(item, index) in images" :key="index">
<img :src="item.url" alt="" @click="openTab(item)" />
</swiper-slide>
</Swiper>
</div>
<div class="swiper-scrollbar"></div>
<div class='button-prev' @click.stop='prevEl'><img
<div class='button-prev' @click.stop='prevEl'>
<img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAwCAYAAAAPfWqeAAADpUlEQVRYR73YX2gcRRwH8N9v7vyDIiJSqtJaFEVRLBSs+CAotNogRZTs7s2sUEgFhQr1QR/aBxVsH3xRWvtQqf9Q4TZOdtOeOUOjbc4HoYpBQfClD75JIzHV9BrTO2/zlc3NJmtzyf3bu31clt9nfjO/mZ0Zph49ANjzRg4x0xDAR7kXDgAxPDxyAqAXovjM9HvqUIR4nv8JEfbESTDzgVQhrXUmDPlzACqBHFbKfj01qFQqZaen/8wDsGNECHpTSuetpe5LY4ympqauOX/+N01EzyaQg1I6by9n1i00Pj5+3dzcvA9g90osfs117XeSsbvKqFQqXT89PXMSoIGVMRGvKGW9d3UCHUNjY2M3lMsLBSLaWS9hBjNeltI53qiXOoImJiZuvHjxUhHAEyboohD8kpT2h2sNRdtQoVC4aX6+Mk5Ej8UIkdjrutan6413W5DW+uYwpNMAPWpmfEhEe5Ry8s2KqmWoWCzeUi7/MwHQdjMmNYCfd10rKuumT0vQ6OjorZVK+A2AbSbiv8yUU8o52VQwHzSFtNYbwpDPANhqMqkIwXYuZ421ijRdGfL5wkaiyiQRPWCCXiGi51zXOd0Osi7keYU7gCXkPjPwC0JknsnlBs+0i6wJBUGwqVoNSwDdY4LOM/NupexvO0EaQkEQbDHIXfWgXM5m8bTjON91iqyCgiC4u1JZnCTCFhP0UjZLA47jnOsG+R/k+/691SoiZJPJ5G8hxFNSDv7YLbIM+b5/v0FuN8isQX5KA1mC8nn/QebFswBtNNU1A4idrmv9khZiIP0DET1ikD8AscN1rV/TRPoN9anrorQaFQMzP6mU9XNaXbi8qK4ub/pLiMyuVMs7bnU0Yc2qcKcpjjnmzICUg993m9mq30RflqC41Z53ajNRdbKni+oK1offRIxprW+r1ehsT398CWyDwR6qFwhXmMmS0i62UyBN9wxRsL5sTuJW17dbC18DeNhkVmMmV0p7pJXMWsoo0Y2930DGWKMtsRA8JKX92XqZtZVRHCja5M/Ozn1FRI+bd4vM9KJSzkdrYR1BUbDo2HL58pUvAewwYwYi3qeU9X4jrGMoChYdxC5cmDlFRLtWgvN+17WPXY11BUXBGh0thaBXpXTeTWJdQ1EwrfW1tRp90dPDctzq+vF/xgPIit8x8xtK2YeWxrCVydbqN3250EhM6kytxh8nr2iEoIOpZhRj9Usn/wMAe+ul34NLpwTGw8P+YYCGiOjIf5yH1rQHeb5wAAAAAElFTkSuQmCC"
alt="">
</div>
<div class='button-next' @click.stop='nextEl'><img
<div class='button-next' @click.stop='nextEl'>
<img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAwCAYAAAAPfWqeAAADa0lEQVRYR9XYX4hUVRwH8O9v7zTjto5buy6N9OaDL0FQrJBQ0IzW2jbb6M7sae+CiSRhD/2hIHrQQHvopR4KCgp0Qejeu/fOmoTFmgoFPYQFgYIUiWIuqUREhKI1c74x3jPuqOvuzu6Zge7rDL8P5/x+55zfOeJ50RsifIXEuOuO7BIRogWf+H44TeL+WmwR7B0dHXlBRLRtS4IgfFNrvDMTWPa7bmmbbUxqgO9Hb5PcWcdExHccblFKVW2N7DpU+4IgfEtr7G7Aokxm5Vg2m63YwG5ABrtlGnFwzZrVqr+//9+lYjdBtWCeF70O8N2GkR3q7u4qDQ4OXlsKdhsU56z8Mqnfn8Ewlcn0bc5ms1cXi80KmWl8kZQPSdb/czSd7iwMDQ1dWQx2RyjGou1a82MAHfE6k697elbkBwYGLjeLzQnFOStvBfS+Ogbg266u1GChUPi7GWxeKM5ZOAZgPwnH7CDfOQ42KqX+Wii2IMiMTInwU5IJg32fTt89kM/n/1wItmDIjGwziQkAd5mc/ZhKOU8MDw//MR/WFFQLNjFRHtKaEcmUwU44DjcopX6fC2saMtX4lNY8AGCZCX4KSOXGxgqX7oQtCopHNrlB6+rnJDpN8J9FUjnXLfw2G7ZoKM5Z9DjJQwC6TIGcTiadbLFYnL4VWxJksMdIfAEwbbCzBjvXiC0ZqgULw3BdpYIpACvi4HIulerIFYvFM3XMChQXyORarfVXAO8x2HQyKblSqfTLdXq++m/m9yCYfJisHiHRY7ALBvvJKmR2kAdF9FESfSZnl8iO9dYhgz0goo+RuM/MyPH/L+R55dZPne+XHyJ5BGBvy4ohLu/qYQD3tqy8g2DyEbI6RaLbVNqvZnewt2DDMHy0UpEvW7oFzbapAsmc6246b21Tbcsx4XnhRgCfNR58iQTWK6UuWjv4giDKkyjXj3IAJw1i7yj3/bD1zUkQRCMkvJl2S35IpzuftNputaWBDILoOa053tKW2PfD50l80oB809vb/bTVJt/3yzsAflS/tojIseXLlz1j9driedFLAD9oWBOHV63q22T1IhYE4Wta470b3YuI/avl7W8OOJhI4Fml1D/NNClzdqq+H+0iuWdmJChnMn2u1et/Wx402vZE07ZHp9ozGoBXRTA+Olra2apntP8AQCOqBFQ0cxQAAAAASUVORK5CYII="
alt="">
</div>
</el-col>
<!-- 表单-->
<el-col :span="6" style="z-index: 5">
<div class="" style="background-color: #ffffff;height:420px ">待补充</div>
<ScoreInfo />
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<div class="hot_school" v-if="state.hotSchoolList && state.hotSchoolList.length>0">
<div class="l_title clearfix">
<div class="left_title">热门院校</div>
<div class="right_tab clearfix">
<div class="hot_school_tab am_l set_hoverl" :class="{'active':1==state.hotTabActive}"
@click="switchHotTab(1)">河南本科院校
<!--跳转工具栏-->
<el-row class="quickList align-items"
style="background-color: white;padding-right: 10px;padding-left: 10px;margin-top: 20px">
<el-col :span="3" v-for="(item, index) in homeOptions" :key="index">
<a @click="open(item.link)">
<img class="icon" alt="" :src="item.icon" />
<p>{{ item.title }}</p>
</a>
</el-col>
</el-row>
<el-row class="news align-items" style="background-color: #fcfcfc;margin-top: 20px">
<el-col :span="12">
<div class="flexWrap" style="padding: 5px 15px;">
<div style="width: 20%;margin: auto 0;">
<Tip title="招生章程" size="15px" style="width: 80%;margin: auto 0" />
</div>
<div style="width: 13%;" class="showMore">
<span @click="open('/article/search?type=1')">查看更多</span>
</div>
</div>
<div class="flexWrap pt-5" style="background-color: #fff">
<div class="content" style="padding: 5px 15px;">
<div class="item flex align-items" v-for="(item,index) in articleData.articleList1" :key="index">
<div class="pointer" style="width:550px" @click="openArticleDetail(item)">
{{ item.title }}
</div>
<div class="hot_school_tab am_l set_hoverl" :class="{'active':2==state.hotTabActive}"
@click="switchHotTab(2)">河南专科院校
</div>
<div class="hot_school_tab am_l set_hoverl" :class="{'active':3==state.hotTabActive}"
@click="switchHotTab(3)">省外本科院校
</div>
<div class="hot_school_tab am_l set_hoverl" :class="{'active':4==state.hotTabActive}"
@click="switchHotTab(4)">省外专科院校
</div>
<!-- <div class="change_group">换一换<i></i></div>-->
</div>
</div>
<div class="hot_school_box clearfix">
<div class="left" style="background: rgb(255, 141, 66);">
<a :href="'/school/'+state.hotSchoolList[0].schoolCode" target="_blank">
<h3>{{ state.hotSchoolList[0].schoolName }}</h3>
<p class="tag">
<span v-for="item in state.hotSchoolList[0].tagsList">{{ item }}</span>
</p>
<div class="tuijian" v-if="state.hotSchoolList[0].schoolIcon">
<div class="school_tuijian">
<div class="school_img"><img :src="state.hotSchoolList[0].schoolIcon" alt=""></div>
</div>
</div>
</a></div>
<div class="right">
<div v-for="(item,index) in state.hotSchoolList">
<div class="school_item" data-growing-container="" v-if="index>0">
<a :href="'/school/'+item.schoolCode" target="_blank">
<img :src="item.schoolIcon" alt="">
<div class="school_msg"><h3>{{ item.schoolName }}</h3>
<div class="clearfix check_btn">
<span class="school_class">{{ item.institutionType + '类' }}</span>
<span>查看院校<i></i></span>
</div>
</div>
</a>
</div>
</div>
</el-col>
<el-col :span="12">
<div class="flexWrap" style="padding: 5px 15px;">
<div style="width: 20%;margin: auto 0">
<Tip title="校内资讯" size="15px" style="width: 80%;margin: auto 0" />
</div>
<div style="width: 13%;" class="showMore">
<span @click="open('/article/search?type=3')">查看更多</span>
</div>
</div>
<div class="flexWrap pt-5" style="background-color: #fff">
<div class="content" style="padding: 5px 15px;">
<div class="item flex align-items" v-for="(item,index) in articleData.articleList2" :key="index">
<div class="pointer" style="width:550px" @click="openArticleDetail(item)">
{{ item.title }}
</div>
</div>
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="20" class="margin-top-5">
<el-col :span="14">
<div class="school-footer_footerBox">
<div class="school-footer_leftIntroduce">
<div class="school-footer_useIntro"><h3>系统使用说明</h3>
</div>
<p>1本查询系统的信息仅供参考具体数据请以学校官网或考试院公布为准</p>
<p>2本站数据未经授权严禁转载违者将依法追究责任</p>
<p>3如有任何疑问可发送邮件至<a @click="copyText('yitisheng@163.com')" class="a-button hover_style"
style="color:var(--el-color-primary);">yitisheng@163.com</a></p>
<p>4志愿填报服务客服专线xxx-xxxx-xxx高校合作或其他商务客服电话xxx-xxxx-xxx</p>
<p class="school-footer_friendChain"><span>友情链接</span><a href="https://www.eol.cn/"
target="_blank">中国教育在线</a><a
href="https://gaokao.eol.cn/" target="_blank">高考频道</a><a href="https://www.kaoyan.cn/"
target="_blank">掌上考研</a><a
href="https://kaoyan.eol.cn/" target="_blank">考研频道</a><a href="https://www.zhijiao.cn/"
target="_blank">职教网</a><a
href="https://www.gaokao.cn/px/" target="_blank">掌上培训</a><a href="https://www.jiuyeqiao.cn/"
target="_blank">就业桥</a><a
href="https://yun.eol.cn/" target="_blank">数智云服</a></p></div>
<!-- <div class="school-footer_rightCode__3VuW7 clearfix">
<div class="school-footer_codeItem__1Spmk"><img src="/static/media/gzh.ab190311.jpg">
<p>掌上高考公众号</p></div>
<div class="school-footer_codeItem__1Spmk"><img src="/static/media/app.289cbf0b.png">
<p>掌上高考APP</p></div>
</div>-->
</div>
</el-col>
<el-col :span="2"></el-col>
<el-col :span="8">
<div class="qrcode">
<div class="qrcode-item">
<img src="@/assets/images/qrcode/wx_gh_cbefbadc1f1f_344.jpg" alt="" width="135">
<div class="qrcode-text" style="">微信小程序</div>
</div>
</div>
</el-col>
</el-row>
<HotSchool />
<SystemHelp />
</div>
<el-backtop :bottom="100" :visibility-height="100">
<el-icon color="#409efc" class="no-inherit">
<Share/>
<ArrowUpBold />
</el-icon>
</el-backtop>
<div class="margin-5"></div>
</template>
<style scoped lang="scss">
.wrap {
width: 1210px;
}
root {
width: 100%;
}
@ -250,8 +222,8 @@ root {
/*轮播图 start*/
.header_swiper {
z-index: -1;
width: 1200px !important;
height: 420px !important;
// width: 1005px !important;
height: 500px !important;
}
.swiper {
@ -259,6 +231,10 @@ root {
height: 100%;
}
.swiswiper-img {
width: 1200px
}
.swiper-wrapper {
position: relative;
width: 100%;
@ -285,7 +261,7 @@ root {
justify-content: center;
align-items: center;
width: 1200px;
height: 420px !important;
height: 500px !important;
}
.swiper-slide img {
@ -301,15 +277,17 @@ root {
transition-property: transform, -webkit-transform;
}
swiper-slide img {
display: block;
margin: 0 auto;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
// swiper-slide img {
// display: block;
// margin: 0 auto;
// position: absolute;
// top: 0;
// bottom: 0;
// left: 0;
// right: 0;
// }
.button-prev {
position: absolute;
@ -322,331 +300,66 @@ swiper-slide img {
.button-next {
position: absolute;
top: 185px;
right: 300px;
right: 320px;
z-index: 99;
cursor: pointer;
}
/*轮播图 end*/
//
.quickList {
height: 156px;
//
.hot_school {
margin-bottom: 40px;
/*padding: 0 20px;*/
.l_title {
height: 44px;
line-height: 44px;
border-bottom: 2px solid var(--el-color-primary);
width: 100%;
.left_title {
font-size: 20px;
color: #000;
position: relative;
padding-left: 12px;
width: 330px;
float: left;
font-weight: 700;
.right_tab {
margin-left: 10px;
float: left;
width: 820px;
}
}
.right_tab .hot_school_tab.active {
color: var(--el-color-primary);
}
.right_tab .hot_school_tab {
float: left;
font-size: 18px;
color: #000;
margin-right: 32px;
cursor: pointer;
font-weight: 700;
}
.right_tab .hot_school_tab:hover {
color: var(--el-color-primary);
}
.am_l {
transition: all .4s;
}
.change_group {
float: right;
color: #f60;
font-size: 14px;
text-align: right;
cursor: pointer;
width: 68px;
height: 44px;
position: relative;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
a {
text-align: center;
color: black;
background: 0 0;
text-decoration: none;
outline: 0;
cursor: pointer;
transition: color .2s ease;
}
.hot_school_box {
.left {
float: left;
width: 330px;
height: 332px;
background: #ffeaea;
text-align: center;
padding-top: 28px;
cursor: pointer;
h3 {
font-size: 24px;
color: #fff;
margin-bottom: 20px;
overflow: hidden;
/*text-overflow: ellipsis;*/
white-space: nowrap;
transition: all .4s;
padding: 0 10px;
font-weight: 700;
}
.tag {
margin-bottom: 54px;
span {
display: inline-block;
padding: 4px 5px;
margin-right: 10px;
border-radius: 4px;
border: 1px solid hsla(0, 0%, 100%, .4);
color: #fff;
}
span:last-child {
margin: 0;
}
}
.tuijian {
width: 195px;
height: 159px;
position: relative;
margin: 0 auto;
.school_tuijian {
width: 170px;
height: 187px;
background: #fff;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
}
.school_img {
height: 100%;
position: relative;
img {
width: 128px;
height: 128px;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
}
}
.right {
float: right;
width: 820px;
height: 350px;
margin: 10px 0 0 10px;
.school_item:hover {
top: -2px;
box-shadow: 0 10px 20px rgb(0 0 0 / 10%);
}
.school_item:hover .school_msg h3 {
color: var(--el-color-primary);
}
.school_item {
cursor: pointer;
float: left;
height: 110px;
width: 263px;
overflow: hidden;
margin-right: 10px;
margin-bottom: 10px;
position: relative;
transition: all .2s linear;
top: 0;
box-shadow: 0 0 15px #e6e6e6;
background-color: white;
img {
width: 65px;
height: 65px;
position: absolute;
left: 15px;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
border: 0;
vertical-align: top;
}
.school_msg {
margin-left: 100px;
margin-top: 21px;
padding-right: 16px;
h3 {
color: #000;
font-size: 16px;
margin-bottom: 23px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: all .4s;
font-weight: 700;
}
.check_btn {
.school_class {
display: inline-block;
padding: 0 6px;
border: 1px solid #eee;
}
span {
float: left;
font-size: 12px;
color: #999;
}
span + span {
margin-right: 12px;
float: right;
display: flex;
justify-content: center;
align-items: center;
}
span + span i {
display: inline-block;
width: 5px;
height: 9px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAASCAYAAABit09LAAAAoklEQVQoU43SsQ0CMQwFUPsaZqOlp4wLdDRQMAUVXBEzABWiSwkbMEX2+OgiOOlIHOL6+cuyPlPj8OhU9UpEDxG5WHsJeu9vRLTquq53zg0lnGAIYRFjvANYWjjBFjzBf3gGaziDFi7CAl6b8PPfAcCGiA4mVNUTgJ6ZzyKyLcJfNKZnsIQyaKEZrKEJquoRwO57uFkK7/2LmZ8isq/WrKW7b6OXhYE4bznBAAAAAElFTkSuQmCC);
background-size: cover;
margin: 0 0 0 5px;
}
}
}
}
}
.icon {
width: 80px;
height: 80px;
display: block;
margin: 0 auto 16px;
}
}
.l_title .change_group i {
display: inline-block;
width: 16px;
height: 13px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAaCAYAAADWm14/AAADS0lEQVRIS73WXYjUZRTH8c8ZV8ylV8J8IagwCqOiqKTwppIogjIMC40oQmdmV0zWCgyKll4IwcwybeeP0U0k1UUpRV70Kt3ZC3RRhGhZmVEWdtFW6848Mf9mZXVndnYd6H875/k93/Ob85xzwiS+1ONqNcsk84VzcJrksPCz5DMFO9W8G5nBicpGu8DUr+CgxVgjueaY+FCTFI7TOCRscIrnY70/2+mPC5BWOdWQbZKbc6HwHQaE3abYa4Yf/KLbsLOFa7FYckMj9hthaQz4YjyIlgCp1/mG7cA87FfQ53o74g7V8QRT2eWSTZIFwj+4LSp2tjrTFCCtMsOQLyWzhA8kd0bmUDs7R35Pr5vifU9IHsbfwo1RsavZ+eYAJTsktwhvWmhJu6xbgaWix9AvHDDdxbHR4eNjxwCksnvVvJzb3u2yZocm6kQ9Lo0kw9bIrGgP0K/LQbfi+6j4dDKXNYtNq830l32YquC8GHBgdFzbZ9gpQO5C0XO4X3gyKh79/wF6XKGau7k7MvNbAuTV+5ELYouvO8089TgDl+Y6Sb1lvYNpprgJR1RVI/PJ0b8gv/w9r+F2YW1UrOsEIpXdp+allhphWDg3B2i021ckS48eCA9FxfqOIEqekawZo1G/PFkWmTci1e0p5c/unjGBBWtiwLMdQmyUrB6lURXuikrutkhFW9AzjlXLozKOlROgSyUvSFbmlZDcHZlXR47VAdYJsxrFsgBzRd4264On/u3qGOA/lx/Ensi81foVlJXUDODFyPROILmOQ45pRKnsLDU/YtBUc2Oz3zq+oY3A2FlQslnKs69EptwpQD6eT/Jtq5kyFqBoNr7C6eiLzMYThUi9rlL1sSTpcmWzBtdqHC+S8mKpl8+KEynC1Guear5L1Av8qcg80iyR1htR0QNY33g6j5vj6eg3NBE3UklRyvtHt/C22RZFv9qkAPIOWbRc5G94mrAHGyTbIvPH8WKpz3SDlqB8dHmtL6fJ2sgcaQXedhynkouwddRGXN8JP8de4XfJzHpPx4WSkxsX/ST0RsX2do61BRgRSEXXYSUWNgp0jAnCh8IWs2yPfsPtLs9b8USCRsc0RvYlquYIZ0p+1WWfgv2xKd+CJ/X9Czm9FazO5CrrAAAAAElFTkSuQmCC);
position: absolute;
right: 0;
top: 36%;
margin-top: -6 px;
transition: all .4s;
-webkit-transform-origin: center;
transform-origin: center;
background-size: cover;
.a {
cursor: pointer;
color: #409eff;
}
.showMore {
font-size: 15px;
line-height: 30px;
cursor: pointer;
color: $color-blue-60;
float: right;
margin: 0 0 0 auto;
}
//使
.school-footer_footerBox {
width: 1200px;
/*margin: 0 auto;*/
background: hsla(0, 0%, 98%, .96);
display: flex;
align-items: center;
justify-content: space-between;
//
.news {
.content {
min-height: 210px;
font-size: 14px;
.school-footer_leftIntroduce {
padding: 18px;
h3 {
font-size: 20px;
color: #000;
margin: 0 20px 0 0;
}
a {
color: #666;
text-decoration: none !important;
}
.school-footer_useIntro {
display: flex;
align-items: center;
margin-bottom: 30px;
}
.school-footer_friendChain a {
margin-right: 15px;
transition: all .3s;
}
.school-footer_friendChain a:hover {
color: var(--el-color-primary);
}
p {
font-size: 14px;
color: #000;
.item {
margin-bottom: 15px;
word-break: break-all;
a {
font-size: 14px;
color: #000;
}
width: 100%;
overflow:hidden; //
text-overflow:ellipsis; //
white-space:nowrap; //
}
p:last-child {
margin: 0;
.item:hover>.pointer {
color: #409eff;
}
}
}
// start
.qrcode {
margin: 50px 0;
}
.qrcode .qrcode-item {
width: 135px;
text-align: center;
}
.qrcode .qrcode-item .qrcode-text {
font-weight: bold;
color: #000000;
}
// end
</style>

View File

@ -1,15 +1,645 @@
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
name: "MajorInfo"
})
</script>
<template>
<div class="main-container wrap">
<div></div>
<!--上部分-->
<div class="header">
<el-breadcrumb separator="/">
<el-breadcrumb-item :to="{ path: '/major/search' }">
专业大全
</el-breadcrumb-item>
<el-breadcrumb-item v-if="state.majorInfo.zyl"><a>{{ state.majorInfo.zyl }}</a></el-breadcrumb-item>
</el-breadcrumb>
<div class="majorName">
{{ state.majorInfo.majorName }}
</div>
<div class="flexWrap mt-10">
<el-space spacer="|">
<div>{{ state.majorInfo.educationalLevel === '1' ? '本科' : '专科' }}</div>
<div>专业代码{{ state.majorInfo.majorCode }}{{ state.majorInfo.majorCodeChar }}</div>
<div>学制{{ state.majorInfo.semester ? state.majorInfo.semester + '年' : '--' }}
</div>
<div>
学位{{ state.majorInfo.degree || '--' }}
</div>
</el-space>
</div>
</div>
<div class="paneTypes flexWrap">
<div class="panetype" :class="state.paneName === '专业概况' ? 'panetype-active' : ''" @click="switchPane('专业概况')">专业概况
</div>
<div class="panetype" :class="state.paneName === '开设院校' ? 'panetype-active' : ''" @click="switchPane('开设院校')">开设院校
</div>
</div>
<div class="bodyr">
<div v-show="state.paneName === '专业概况'">
<Tip :title="'专业简介'" :size="'18px'" />
<div class="text">
{{ state.majorInfo.ssm || '--' }}
</div>
<Tip :title="'学什么'" :size="'18px'" />
<div class="text">
{{ state.majorInfo.xsm || '--' }}
</div>
<Tip :title="'干什么'" :size="'18px'" />
<div class="text">
{{ state.majorInfo.gsm || '--' }}
</div>
<el-row :gutter="20" class="mt-10">
<!--男女比例-->
<el-col :span="12">
<div class="mt-15" ref="chartSexRef" :style="{ height: '400px' }"></div>
</el-col>
<!--就业岗位-->
<el-col :span="12">
<div class="mt-15" ref="chartJobDistributionRef" :style="{ height: '400px' }"></div>
</el-col>
<!--就业行业-->
<el-col :span="12">
<div class="mt-15" ref="chartIndustryDistributionRef" :style="{ height: '400px' }"></div>
</el-col>
<!--就业地区-->
<el-col :span="12">
<div class="mt-15" ref="chartRegionDistributionRef" :style="{ height: '400px' }"></div>
</el-col>
</el-row>
</div>
<div v-show="state.paneName === '开设院校'">
<!--筛选项-->
<div class="filterTable">
<div class="filterTitle flexWrap">
<div class="flex-item-75">
<div class="searchSchool">
<el-input v-model="state.selectForm.schoolName" maxlength="24" show-word-limit
style="max-width: 230px;height: 40px;line-height: 40px;" placeholder="请输入院校或专业名称"
class="input-with-select" />
<el-button :icon="Search" @click="reloadSchoolList"
style="border-left: none;height: 40px;line-height: 40px;" />
</div>
</div>
</div>
<div class="filterBody">
<div class="flexWrap">
<div class="flex-item-1">就读地域</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.selectForm.addressList.length === 0 ? 'tag-active' : ''"
@click="checkboxAddress('')">不限</span>
<span class="tag" :class="state.selectForm.addressList.includes(item.code) ? 'tag-active' : ''"
v-for="(item, index) in state.addressList" :key="index" @click="checkboxAddress(item.code)">
{{ item.name }}
</span>
</div>
</div>
<!-- <div class="flexWrap">
<div class="flex-item-1">科研教学</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.selectForm.kyjxList.length === 0 ? 'tag-active' : ''"
@click="checkboxKyjx('')">不限</span>
<span class="tag" :class="state.selectForm.kyjxList.includes(item) ? 'tag-active' : ''"
v-for="(item, index) in state.kyjxList" :key="index" @click="checkboxKyjx(item)">
{{ item }}
</span>
</div>
</div> -->
<div class="flexWrap">
<div class="flex-item-1">院校标签</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.selectForm.tagsList.length === 0 ? 'tag-active' : ''"
@click="checkboxSchoolTags('')">不限</span>
<span class="tag" :class="state.selectForm.tagsList.includes(item.code) ? 'tag-active' : ''"
v-for="(item, index) in state.tagsList" :key="index" @click="checkboxSchoolTags(item.code)">
{{ item.name }}
</span>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">办学类型</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.selectForm.schoolNatureList && state.selectForm.schoolNatureList.length === 0 ? 'tag-active' : ''"
@click="checkboxSchoolNature('')">不限</span>
<span class="tag" :class="state.selectForm.schoolNatureList.includes(item.code) ? 'tag-active' : ''"
v-for="(item, index) in state.schoolNatureList" :key="index" @click="checkboxSchoolNature(item.code)">
{{ item.name }}
</span>
</div>
</div>
<div class="border-b"></div>
<div class="flexWrap">
<span class="clearFilterButton" @click="clearFilter">重置已选</span>
</div>
</div>
<!--院校列表-->
<div ref="scrollContainer" style="height: 800px; overflow-y: scroll;" @scroll="handleScroll" class="scroll-container schoolList" v-show="state.schoolResult.list">
<div class="schoolItem" v-for="(item,index) in state.schoolResult.list" :key="index">
<div class="flexWrap" @click="showSchoolInfo(item.schoolCode)">
<div class="flex-item-13 left">
<img :src="item.schoolIcon" :alt="item.schoolName" style="width: 128px;border-radius: 50%"/>
</div>
<div class="flex-item-87 right">
<div class="flexWrap schoolName" style="">
{{ item.schoolName }}
</div>
<div class="flexWrap tags">
<span class="tag" v-for="(tag,i) in item.tagsList" :key="i">
{{ tag }}
</span>
</div>
</div>
</div>
</div>
<!-- 加载更多提示 -->
<p v-if="state.schoolResult.status==='loading'">加载中...</p>
<p v-if="state.schoolResult.status==='noMore'">没有更多数据了</p>
</div>
</div>
</div>
</div>
</div>
</template>
<style scoped>
<script setup lang="ts">
import { h, ref, onMounted, reactive } from 'vue';
import { useRoute } from 'vue-router';
import * as echarts from 'echarts';
import { Search } from '@element-plus/icons-vue';
import {ElMessage} from 'element-plus';
import ApiConstant from '@/utils/ApiConstant';
import StaticConstant from '@/utils/StaticConstant';
import axiosInstance from '@/utils/http';
const { query, params } = useRoute();
document.title = '专业介绍|艺体志愿宝';
//
let majorCode = params.majorCode
const state = reactive({
paneName: '专业概况',
addressList: [...StaticConstant.addressList] as any,//
kyjxList: ['硕士点', '博士点', '保研'] as Array<string>,//
rulesEnrollProbabilityList: [] as Array<any>,//
tagsList: StaticConstant.tagsList as Array<any>,//
schoolNatureList: [...StaticConstant.schoolTypeList] as Array<any>,//
majorInfo: {
majorName: '',
majorTypeName: '',
majorCode: '',
majorCodeChar: "",
educationalLevel: '',
semester: '',
degree: '',
zyl:'未知',
ssm: '',
xsm: '',//
gsm: '',//
sexRatio: '',
jobDistribution: '',//
industryDistribution: '',//
regionDistribution: '',//
},
schoolList:[] as any,
selectForm: {
schoolName: '',
current:1,
size:10,
addressList: [] as any,
kyjxList: [] as any,
tagsList: [] as any,
schoolNatureList:[] as any,
},
schoolResult:{
list:[] as any,
status:'more',
},
})
const chartSexRef = ref<HTMLDivElement | null>(null);
const chartJobDistributionRef = ref<HTMLDivElement | null>(null);
const chartIndustryDistributionRef = ref<HTMLDivElement | null>(null);
const chartRegionDistributionRef = ref<HTMLDivElement | null>(null);
const scrollContainer = ref<HTMLElement | null>(null);
onMounted(() => {
reloadMajorInfo()
getSchoolList()
})
const handleScroll = () => {
console.log(111);
const container = scrollContainer.value
if (container) {
const { scrollTop, scrollHeight, clientHeight } = container;
if (scrollTop + clientHeight >= scrollHeight) {
loadMore();
}
}
};
function loadMore(){
if(state.paneName ==='开设院校' && state.schoolResult.status === 'more'){
state.schoolResult.status = 'loading'
state.selectForm.current++;
getSchoolList();
}
}
//pane
function switchPane(e: string) {
if (state.paneName !== e) {
state.paneName = e
}
}
//
function setPeople() {
let sexRatio = state.majorInfo.sexRatio
console.log(sexRatio)
if (sexRatio) {
try {
let femaleRatio = ''
let maleRatio = ''
let ratios = sexRatio.replaceAll('%', '').split('、');
if (ratios) {
ratios.forEach(item => {
if (item.split('')[0] === '男生') {
femaleRatio = item.split('')[1]
} else if (item.split('')[0] === '女生') {
maleRatio = item.split('')[1]
}
})
if (chartSexRef.value && echarts && (femaleRatio && maleRatio)) {
const myChart = echarts.init(chartSexRef.value);
const option = {
title: {
text: '男女比例',
left: 'left'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'right'
},
series: [
{
type: 'pie',
radius: '60%',
data: [
{ value: femaleRatio, name: '男' },
{ value: maleRatio, name: '女' }
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
tooltip: {
trigger: 'item',
//formatter: '{a} <br/>{b}: {c} ({d}%)'
formatter: '{b}: {d}%'
}
}
]
};
//
myChart.setOption(option as any);
}
}
} catch (error) {
}
}
}
//
function setJobDistribution() {
let jobDistribution = state.majorInfo.jobDistribution
if (jobDistribution) {
try {
let ratios = jobDistribution.replaceAll('%', '').split('、');
if (ratios) {
let dataList = [] as any
ratios.forEach(item => {
dataList.push({ name: item.split('')[0], value: item.split('')[1] })
})
if (chartJobDistributionRef.value && echarts && dataList.length > 0) {
const myChart = echarts.init(chartJobDistributionRef.value);
const option = {
title: {
text: '就业岗位分布',
left: 'left'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'right'
},
series: [
{
type: 'pie',
radius: '60%',
data: dataList,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
tooltip: {
trigger: 'item',
//formatter: '{a} <br/>{b}: {c} ({d}%)'
formatter: '{b}: {d}%'
}
}
]
};
//
myChart.setOption(option as any);
}
}
} catch (error) {
}
}
}
//
function setIndustryDistribution() {
let industryDistribution = state.majorInfo.industryDistribution
if (industryDistribution) {
try {
let ratios = industryDistribution.replaceAll('%', '').split('、');
if (ratios) {
let dataList = [] as any
ratios.forEach(item => {
dataList.push({ name: item.split('')[0], value: item.split('')[1] })
})
if (chartIndustryDistributionRef.value && echarts && dataList.length > 0) {
const myChart = echarts.init(chartIndustryDistributionRef.value);
const option = {
title: {
text: '就业行业分布',
left: 'left'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'right'
},
series: [
{
type: 'pie',
radius: '60%',
data: dataList,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
tooltip: {
trigger: 'item',
//formatter: '{a} <br/>{b}: {c} ({d}%)'
formatter: '{b}: {d}%'
}
}
]
};
//
myChart.setOption(option as any);
}
}
} catch (error) {
}
}
}
//
function setRegionDistribution() {
let regionDistribution = state.majorInfo.regionDistribution
if (regionDistribution) {
try {
let ratios = regionDistribution.replaceAll('%', '').split('、');
if (ratios) {
let dataList = [] as any
ratios.forEach(item => {
dataList.push({ name: item.split('')[0], value: item.split('')[1] })
})
if (chartRegionDistributionRef.value && echarts && dataList.length > 0) {
const myChart = echarts.init(chartRegionDistributionRef.value);
const option = {
title: {
text: '就业地区分布',
left: 'left'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'right'
},
series: [
{
type: 'pie',
radius: '60%',
data: dataList,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
tooltip: {
trigger: 'item',
//formatter: '{a} <br/>{b}: {c} ({d}%)'
formatter: '{b}: {d}%'
}
}
]
};
//
myChart.setOption(option as any);
}
}
} catch (error) {
}
}
}
//
function reloadMajorInfo() {
axiosInstance({
url: ApiConstant.Major.majorInfo,
method: 'get',
params:{
majorCode: majorCode,
},
showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if(!data.success){
ElMessage.error(data.message);
return false
}
if(data.result){
state.majorInfo = data.result
setPeople()
setJobDistribution()
setIndustryDistribution()
setRegionDistribution()
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
function reloadSchoolList(){
state.selectForm.current = 1
state.schoolResult.list = []
getSchoolList()
}
//
function getSchoolList() {
state.schoolResult.status === 'loading'
axiosInstance({
url: ApiConstant.School.searchSchoolList,
method: 'get',
params:{
majorCode: majorCode,
schoolName: state.selectForm.schoolName,
pageNum: state.selectForm.current,
pageSize: state.selectForm.size,
addressList: state.selectForm.addressList,
tagsList:state.selectForm.tagsList,
schoolNatureList:state.selectForm.schoolNatureList
},
//showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if(!data.success){
ElMessage.error(data.message);
return false
}
if(data.result){
state.schoolResult.list = [...state.schoolResult.list, ...data.result.records]
if (data.result.current >= data.result.pages) {
state.schoolResult.status = 'noMore'
} else {
state.schoolResult.status = 'more'
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
//
function clearFilter() {
state.selectForm.schoolName = ''
state.selectForm.addressList = []
state.selectForm.kyjxList = []
state.selectForm.tagsList = []
state.selectForm.schoolNatureList = []
reloadSchoolList()
}
//
function checkboxAddress(addressCode: string) {
if (!addressCode) {
state.selectForm.addressList = []
} else if (state.selectForm.addressList.includes(addressCode)) {
state.selectForm.addressList = state.selectForm.addressList.filter((element:any) => element !== addressCode)
} else {
state.selectForm.addressList.push(addressCode)
}
reloadSchoolList()
}
//
function checkboxSchoolTags(schoolTag: string) {
if (!schoolTag) {
state.selectForm.tagsList = []
} else if (state.selectForm.tagsList.includes(schoolTag)) {
state.selectForm.tagsList = state.selectForm.tagsList.filter((element:any) => element !== schoolTag)
} else {
state.selectForm.tagsList.push(schoolTag)
}
reloadSchoolList()
}
//
function checkboxSchoolNature(schoolNature: string) {
if (!schoolNature) {
state.selectForm.schoolNatureList = []
} else if (state.selectForm.schoolNatureList.includes(schoolNature)) {
state.selectForm.schoolNatureList = state.selectForm.schoolNatureList.filter((element:any) => element !== schoolNature)
} else {
state.selectForm.schoolNatureList.push(schoolNature)
}
reloadSchoolList()
}
const showSchoolInfo = (schoolCode: string) => {
window.open('/school/'+schoolCode, '_self')
}
</script>
<style scoped lang="scss">
/* 上部分 start*/
.header {
background-color: white;
padding: 20px 30px;
.majorName {
width: 450px;
line-height: 80px;
font-size: 28px;
border-bottom: 1px solid #e4e7ed;
}
}
/* 上部分 end*/
/* 中间部分 start*/
.bodyr {
background-color: white;
padding: 20px 30px;
.text {
padding: 10px 0;
}
}
/* 中间部分 end*/
.paneTypes {
margin-top: 15px;
.panetype {
cursor: pointer;
border: 1px solid #ebeef5;
border-radius: 5px 5px 0 0;
width: 100px;
text-align: center;
padding: 5px 15px;
margin-right: 10px;
background-color: white;
color: $color-blue-60;
transition: all 0.3s;
}
.panetype-active {
background-color: $color-blue-60;
color: white;
}
}
</style>

View File

@ -1,15 +1,258 @@
<script lang="ts">
import {defineComponent} from 'vue'
<template>
<LeftNav/>
<div class="margin-5"></div>
<div class="main-container wrap main-fullScreen">
<el-row :gutter="20">
<el-col :span="18">
<!--筛选项-->
<div class="filterTable">
<div class="filterTitle flexWrap">
<div class="flex-item-75">
<el-input v-model="state.selectForm.majorName" maxlength="24" show-word-limit
style="max-width: 230px;height: 40px;line-height: 40px;" placeholder="请输入专业名称"
class="input-with-select" />
<el-button :icon="Search" @click="getData"
style="border-left: none;height: 40px;line-height: 40px;" />
</div>
</div>
<div class="filterBody">
<div class="flexWrap">
<div class="flex-item-1">专业层次</div>
<div class="flex-item-9 tags">
<span class="tag"
:class="state.selectForm.educationalLevel === item.value ? 'tag-active' : ''"
v-for="(item, index) in state.levelList" :key="index"
@click="checkboxLevel(item.value)">
{{ item.label }}
</span>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">专业类型</div>
<div class="flex-item-9 tags">
<span class="tag" :class="!state.selectForm.majorType ? 'tag-active' : ''"
@click="checkboxMajorType('')">不限</span>
<span class="tag" :class="state.selectForm.majorType === item ? 'tag-active' : ''"
v-for="(item, index) in state.majorTypeList" :key="index"
@click="checkboxMajorType(item)">
{{ item }}
</span>
</div>
</div>
<div class="border-b"></div>
<div class="flexWrap">
<span class="clearFilterButton" @click="clearFilter">重置已选</span>
</div>
</div>
</div>
<div class="majorDiv" v-if="state.majorList && state.majorList.length > 0">
<div class="item" v-for="(item, index) in state.majorList" :key="index">
<div class="flexWrap title">
# {{ item.majorTypeName }}
</div>
<div class="majorList" v-if="item.list">
<div class="majorItem border-b" v-for="(major, mi) in item.list" :key="mi" @click="openMajorDetail(major)">
<div class="flexWrap">
<div class="flex-item-9">
<div class="flexWrap majorName">{{ major.majorName }}</div>
<div class="flexWrap">
<el-space spacer="|">
<div>专业代码{{ major.majorCode }}{{ major.majorCodeChar }}</div>
<div>学制{{ major.semester ? major.semester + '年' : '--' }}
</div>
<div v-if="state.selectForm.educationalLevel == '1'">
学位{{ major.degree || '--' }}
</div>
<div v-if="state.selectForm.educationalLevel == '1'">
男女比例{{ major.sexRatio || '--' }}
</div>
</el-space>
export default defineComponent({
name: "search"
</div>
</div>
<div class="flex-item-1" style="height: 50px;line-height: 50px;">
<div class="" style="margin:0 5px 0 auto">
<el-button type="primary" @click="openMajorDetail(major)">查看</el-button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</template>
<script lang="ts" setup>
import {h, ref, defineComponent, onMounted, reactive } from 'vue';
import { InfoFilled, Search, Edit } from '@element-plus/icons-vue';
import { ElMessage,ElDivider } from 'element-plus';
import ApiConstant from '@/utils/ApiConstant';
import ImagesConstant from '@/utils/ImagesConstant';
import StaticConstant from '@/utils/StaticConstant';
import axiosInstance from '@/utils/http';
document.title = '查专业|艺体志愿宝';
const state = reactive({
selectForm: {
educationalLevel: '1',///
majorType: '',
majorName: '',//
current: 1,
pageSize: 10,
},
majorList: [] as any,//
majorTypeList: [],//
levelList: [
{ label: '本科', value: '1' }, { label: '专科', value: '2' },
]
})
const spacer = h(ElDivider, { direction: 'vertical' })
onMounted(() => {
getMajorTypeList()
getData()
})
//
function getMajorTypeList() {
axiosInstance({
url: ApiConstant.Major.majorTypeList,
method: 'get',
params: {
educationalLevel: state.selectForm.educationalLevel
},
showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if (!data.success) {
ElMessage.error(data.message);
} else {
state.majorTypeList = data.result
}
})
}
//
function getData() {
axiosInstance({
url: ApiConstant.Major.majorList,
method: 'get',
params: {
majorName: state.selectForm.majorName,
educationalLevel: state.selectForm.educationalLevel,
majorType: state.selectForm.majorType
},
//showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if (!data.success) {
ElMessage.error(data.message);
} else {
state.majorList = data.result
}
})
}
function clearFilter() {
state.selectForm.educationalLevel = "1"
state.selectForm.majorType = ''
state.selectForm.majorName = ''
getData()
}
//
function checkboxLevel(e: string) {
if (state.selectForm.educationalLevel !== e) {
state.selectForm.educationalLevel = e
state.selectForm.majorType = ''
getMajorTypeList()
getData()
}
}
//
function checkboxMajorType(e: string) {
if (state.selectForm.majorType !== e) {
state.selectForm.majorType = e
getData()
}
}
//
function openMajorDetail(e:any){
window.open('/major/'+e.majorCode,'_self')
}
</script>
<template>
<style scoped lang="scss">
/*筛选表格 start*/
.filterTable {
border: 1px 1px 0 1px solid #ebeef5;
border-radius: 5px 5px 5px 0px;
</template>
.filterTitle {
<style scoped>
//-
//
.searchSchool {
float: right;
margin: 3px 10px 3px 0;
}
}
//
.filterBody {
background-color: white;
border-radius: 0 0 5px 0;
padding: 15px 15px 0 15px;
color: $color-black-60;
border-bottom: 1px solid #ebeef5;
.tags {
display: flex;
flex-direction: row;
flex-wrap: wrap;
.tag {
cursor: pointer;
margin-bottom: 10px;
margin-right: 15px;
color: black;
font-size: 14px;
padding: 0 7px;
border-radius: 4px;
border: 1px solid white;
}
.tag-active {
color: $color-blue-60;
border: 1px solid $color-blue-60;
position: relative;
}
}
.clearFilterButton {
cursor: pointer;
line-height: 50px;
color: $color-blue-60;
}
}
}
/*筛选表格 end */
/*列表 start*/
.majorDiv {
.item {
background-color: white;
border: 1px solid #ebeef5;
border-radius: 5px;
margin: 10px 0;
padding: 15px;
}
.title {
font-size: 20px;
font-weight: 600;
}
}
/*列表 end*/
</style>

View File

@ -0,0 +1,241 @@
<template>
<LeftNav />
<div class="main-container wrap main-fullScreen">
<div class="filterBody">
<div class="flexWrap">
<div class="flex-item-1">省份</div>
<div class="flex-item-9 tags">
<div class="" style="color: black;">{{ state.scoreInfo.province }}</div>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">文理分科</div>
<div class="flex-item-9 tags">
<div class="" style="color: black;">{{ state.scoreInfo.cognitioPolyclinic }}</div>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">专业类别</div>
<div class="flex-item-9 tags" v-if="state.vipInfo.vipLevel>=9">
<el-select
v-model="state.selectForm.professionalCategory" placeholder="Select"
style="width: 150px"
>
<el-option
v-for="item in state.professionalCategoryList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="flex-item-9 tags" v-else>
<div class="" style="color: black;">{{ state.scoreInfo.professionalCategory }}</div>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">批次</div>
<div class="flex-item-9 tags" v-if="state.vipInfo.vipLevel>=9">
<el-select
v-model="state.selectForm.batch" placeholder="Select"
style="width: 150px"
>
<el-option
v-for="item in state.batchArray"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="flex-item-9 tags" v-else>
<div class="" style="color: black;">{{ state.scoreInfo.batch }}</div>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">文化分数</div>
<div class="flex-item-15 tags">
<el-input v-model="state.selectForm.culturalScore" :min="0" :max="600"
@input="filterCulturalScoreInput" />
</div>
<div class="flex-item-1">统考分数</div>
<div class="flex-item-15 tags">
<el-input v-model="state.selectForm.professionalScore" :min="0" :max="300"
@input="filterProfessionalScoreInput" />
</div>
<div class="flex-item-2 tags">
<el-button type="primary" :icon="Search" @click="getList">查询</el-button>
</div>
</div>
</div>
<div class="tableData">
<el-table :data="state.dataList" height="250" style="width: 100%">
<el-table-column prop="rulesEnrollProbability" label="类型" width="180" align="center"/>
<el-table-column prop="probabilityOperator" label="录取规则" width="180" align="center"/>
<el-table-column prop="score" label="综合分" align="center"/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button link type="primary" size="small" @click="handleClick(scope.row)">
<span>查看院校
<span class="ml-5 mr-5">{{ scope.row.schoolNum }}</span>
</span>
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script setup lang="ts">
import { inject, onMounted, reactive } from 'vue';
import LeftNav from "@/components/LeftNav.vue";
import { getSystemName, isNull } from '@/utils/tool';
import { getScore } from '@/axios/api';
import { Search } from '@element-plus/icons-vue';
import ApiConstant from '@/utils/ApiConstant';
import axiosInstance from '@/utils/http';
import { useRouter } from 'vue-router';
import StaticConstant from '@/utils/StaticConstant';
//setup
const router = useRouter();
document.title = '轻松算投档|' + getSystemName()
const state = reactive({
dataList: [] as any,
flag: true,
selectForm: {
batch:'',//
culturalScore: '',//
professionalScore: '',//
professionalCategory:'',
},
//
batchArray: [{label: '本科批', value: '本科'}, {label: '高职高专批', value: '高职高专'}],
batchIndex: 0,
scoreInfo: {} as any,
professionalCategoryList:StaticConstant.professionalCategoryList,//
vipInfo:{
vipLevel:0,
} as any,
})
const openEditScore = inject('openEditScore') as Function;
onMounted(() => {
if (getScoreInfo()) {
//vip
let vipInfo = localStorage.getItem('vipInfo') as any
if(vipInfo){
vipInfo = JSON.parse(vipInfo);
state.vipInfo.vipLevel = vipInfo.vipLevel
}
}
})
//
function getScoreInfo() {
//
if (ifLogin()) {
//
let scoreInfoStr = localStorage.getItem('scoreInfo') as string
if (isNull(scoreInfoStr)) {
//
getScore()
//
scoreInfoStr = localStorage.getItem('scoreInfo') as string
if (isNull(scoreInfoStr)) {
//
return oepnEditScoreInfo()
}
} else {
state.scoreInfo = JSON.parse(scoreInfoStr)
state.selectForm.batch = state.scoreInfo.batch
state.selectForm.culturalScore = state.scoreInfo.culturalScore
state.selectForm.professionalScore = state.scoreInfo.professionalScore
state.selectForm.professionalCategory = state.scoreInfo.professionalCategory
}
return true
}
return false
}
//
function ifLogin() {
let token = window.localStorage.getItem('X-Access-Token');
const openLogin = inject('openLogin') as Function;
if (!token && typeof openLogin === 'function') {
openLogin(); //
return false
}
return true
}
//
function oepnEditScoreInfo() {
if (typeof openEditScore === 'function') {
openEditScore(); //
return false
}
return true
}
function filterCulturalScoreInput(value: number | string) {
if (typeof value === 'string') {
state.selectForm.culturalScore = value.replace(/\D/g, ''); //
}
}
function filterProfessionalScoreInput(value: number | string) {
if (typeof value === 'string') {
state.selectForm.professionalScore = value.replace(/\D/g, ''); //
}
}
function getList() {
axiosInstance({
url: ApiConstant.Score.calculateInvestment,
method: 'get',
params: {
province: state.scoreInfo.province,
culturalScore: state.selectForm.culturalScore,//
professionalScore: state.selectForm.professionalScore,//
category: state.scoreInfo.cognitioPolyclinic,//this.categoryArray[this.categoryIndex].name
professionalCategory: state.selectForm.professionalCategory,
batch: state.batchArray[state.batchIndex].value
},
//showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
console.log(data)
if (data.result && data.result.length > 0) {
state.dataList = data.result
} else {
state.dataList = null
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
state.flag = false
});
}
function handleClick(e:any){
//router.push({name:'fillVolunteer2',params:{rulesEnrollProbability:e.rulesEnrollProbability}})
router.push({
path:'/fillVolunteer',
query:{rulesEnrollProbability:e.rulesEnrollProbability}
})
}
</script>
<style scoped lang="scss">
root {
width: 100%;
}
:deep(.el-input) {
width: 150px;
}
:deep(.el-input__inner) {
font-size: 20px;
}
.tableData{
background-color: white;
padding: 20px;
}
</style>

View File

@ -0,0 +1,326 @@
<script setup lang="ts">
import StaticConstant from "@/utils/StaticConstant";
import { reactive, ref, toRefs } from 'vue';
import axiosInstance from '@/utils/http';
import apiConstant from "@/utils/ApiConstant";
import { AxiosResponse } from "axios";
import { Search } from '@element-plus/icons-vue';
import LeftNav from "@/components/LeftNav.vue";
document.title = '轻松查排名|艺体志愿宝';
const state = reactive({
dataList: null as any,
categoryList: ['文科', '理科'] as any,
professionalCategoryList: [...StaticConstant.professionalCategoryList] as any,
yearList: ['2024', '2023', '2022'] as any,
selectForm: {
professionalScore: 0,//
professionalCategory: '美术与设计类',
category: '文科',
},//
flag: true,
queryForm: {
professionalCategory: '美术与设计类',
year: '2024',
},//
professionalCategoryList2: [
{value: '美术与设计类', label: '美术与设计类'},
{value: '播音与主持类', label: '播音与主持类'},
{value: '服装表演',label: '服装表演类'},
{value: '戏剧影视导演',label: '戏剧影视导演类'},
{value: '戏剧影视表演',label: '戏剧影视表演类'},
{value: '音乐表演声乐',label: '音乐表演声乐类'},
{value: '音乐表演器乐',label: '音乐表演器乐类'},
{value: '音乐教育',label: '音乐教育类'},
{value: '舞蹈类', label: '舞蹈类'},
{value: '书法类', label: '书法类'}
] as any,
scoreTableDialogVisible: false,//
fiveScoreTableData:[] as any,//
})
//
function checkboxCategory(e: string) {
if (state.selectForm.category !== e) {
state.selectForm.category = e
}
}
//
function checkboxProfessionalCategory(e: string) {
if (state.selectForm.professionalCategory !== e) {
state.selectForm.professionalCategory = e
}
}
//
function getList() {
axiosInstance({
url: apiConstant.Score.scoreSegmentSearchByScore,
method: 'get',
params: {
province: '河南',
score: state.selectForm.professionalScore,
professionalCategory: state.selectForm.professionalCategory
},
//showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
console.log(data)
if (data.result && data.result.length > 0) {
state.dataList = data.result
} else {
state.dataList = null
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
state.flag = false
});
}
function handleNumberChange(v: string) {
console.log(v)
}
//
const checkboxYear = (e: string) => {
if(state.queryForm.year != e){
state.queryForm.year = e
if (e === '2024') {
state.professionalCategoryList2 = [
{value: '美术与设计类', label: '美术与设计类'},
{value: '播音与主持类', label: '播音与主持类'},
{value: '服装表演',label: '服装表演类'},
{value: '戏剧影视导演',label: '戏剧影视导演类'},
{value: '戏剧影视表演',label: '戏剧影视表演类'},
{value: '音乐表演声乐',label: '音乐表演声乐类'},
{value: '音乐表演器乐',label: '音乐表演器乐类'},
{value: '音乐教育',label: '音乐教育类'},
{value: '舞蹈类', label: '舞蹈类'},
{value: '书法类', label: '书法类'},
]
} else if (e === '2023') {
state.professionalCategoryList2 = [
{ value: '美术与设计类', label: '美术与设计类' },
{value: '播音与主持类', label: '播音与主持类'},
{ value: '国际标准舞', label: '国际标准舞类' },
{ value: '艺术舞蹈', label: '艺术舞蹈类' },
{ value: '表演类', label: '表演类' },
{ value: '音乐类', label: '音乐类' },
{ value: '书法类', label: '书法类' }
]
} else if (e === '2022') {
state.professionalCategoryList2 = [
{ value: '美术与设计类', label: '美术与设计类' },
{ value: '播音与主持类', label: '播音与主持类' },
{ value: '国际标准舞', label: '国际标准舞类' },
{ value: '艺术舞蹈', label: '艺术舞蹈类' },
{ value: '表演类', label: '表演类' },
{ value: '音乐类', label: '音乐类' },
{ value: '书法类', label: '书法类' }
]
}
state.queryForm.professionalCategory = state.professionalCategoryList2[0].value
getScoreList()
console.log(state.professionalCategoryList2)
}
}
//
const checkboxProfessionalCategory2 = (e:string) =>{
if (state.queryForm.professionalCategory !== e) {
state.queryForm.professionalCategory = e
getScoreList()
}
}
//
const getScoreList = ()=>{
axiosInstance({
url: apiConstant.Score.scoreSegmentList,
method: 'get',
params: {
year:state.queryForm.year,
professionalCategory: state.queryForm.professionalCategory
},
//showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
state.fiveScoreTableData = data.result
console.log(data)
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
state.flag = false
});
}
//
const openScoreTableDialog = () => {
state.scoreTableDialogVisible = true
}
//
const closeScoreTableDialog = () => {
state.scoreTableDialogVisible = false
}
</script>
<template>
<LeftNav />
<div class="main-container wrap main-fullScreen">
<el-row :gutter="20">
<el-col :span="24">
<div class="filterBody">
<div class="flexWrap">
<div class="flex-item-1">专业类别</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.selectForm.professionalCategory === item.value ? 'tag-active' : ''"
v-for="(item, index) in state.professionalCategoryList" :key="index"
@click="checkboxProfessionalCategory(item.value)">
{{ item.label }}
</span>
<span style="padding: 0 30px">
<el-button type="primary" @click="openScoreTableDialog">五分一段表</el-button>
</span>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">统考分数</div>
<div class="flex-item-9 tags">
<el-input-number v-model="state.selectForm.professionalScore" :min="0" :max="600"
@change="handleNumberChange" />
<el-button type="primary" :icon="Search" @click="getList">查询</el-button>
</div>
</div>
</div>
<div class="dataList">
<div class="item" v-if="state.dataList && state.dataList.length > 0">
<div class="flexWrap" v-for="(item, index) in state.dataList" :key="index">
<div v-if="item.type == 1">
<div class="year">{{ item.year }}</div>
<div class="t1">
<span v-if="item.beginScore && item.endScore">
{{ item.beginScore }}~{{ item.endScore }}
</span>
<span v-else-if="item.beginScore">
{{ item.beginScore }}~{{ item.endScore }}
</span>
<span v-else>
最低分{{ item.endScore }}
</span>
</div>
<div class="t2">
超越全省<span class="orange fw-6">{{ item.rate }}%</span>的考生
</div>
<div class="t3">
排名
<span v-if="item.startRank && item.endRank">
介于{{ item.startRank }}~{{ item.endRank }}名之间
</span>
<span v-else-if="item.startRank">
大于{{ item.startRank }}&nbsp;
</span>
<span v-else>
小于{{ item.endRank }}
</span>
</div>
</div>
<div v-else>
您的分数已低于{{ item.year }}公布的最低分{{ item.beginScore }}
</div>
</div>
</div>
<div class="item" v-else-if="state.flag">
请输入统考成绩查询
</div>
<div class="item" v-else>
暂未查询到结果
</div>
</div>
</el-col>
</el-row>
</div>
<!--五分一段表弹框-->
<el-dialog v-model="state.scoreTableDialogVisible" title="" width="60em" :closeOnClickModal="false"
:show-close="false">
<template #header>
<div style="display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin: 0;">五分一段表</h3>
<el-icon @click="closeScoreTableDialog" class="el-dialog__headerbtn">
<Close />
</el-icon>
</div>
</template>
<!--筛选内容-->
<div class="filterBody">
<div class="flexWrap">
<div class="flex-item-1">年份</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.queryForm.year === item ? 'tag-active' : ''"
v-for="(item, index) in state.yearList" :key="index" @click="checkboxYear(item)">
{{ item }}
</span>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">专业类别</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.queryForm.professionalCategory === item.value ? 'tag-active' : ''"
v-for="(item, index) in state.professionalCategoryList2" :key="index"
@click="checkboxProfessionalCategory2(item.value)">
{{ item.label }}
</span>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-9 tags">
<el-button type="primary" :icon="Search" @click="getScoreList">查询</el-button>
</div>
</div>
</div>
<div>
<el-table :data="state.fiveScoreTableData" border style="width: 100%">
<el-table-column prop="year" label="年份" align="center"/>
<el-table-column prop="score" label="分数" align="center"/>
<el-table-column prop="num" label="人数" align="center"/>
<el-table-column prop="personNum" label="累计人数" align="center"/>
</el-table>
</div>
</el-dialog>
</template>
<style scoped lang="scss">
root {
width: 100%;
}
.dataList {
min-height: 650px;
background-color: white;
border-radius: 0 0 5px 0;
padding: 15px;
//color: $color-black-60;
border-bottom: 1px solid #ebeef5;
line-height: 30px;
font-size: 30px;
color: black;
.year {
font-weight: 600;
}
.item {
padding-bottom: 20px;
border-bottom: 1px solid #ebeef5;
}
}
</style>

View File

@ -0,0 +1,127 @@
<script setup lang="ts">
import StaticConstant from "@/utils/StaticConstant";
import {reactive} from 'vue';
import axiosInstance from '@/utils/http';
import apiConstant from "@/utils/ApiConstant";
import {AxiosResponse} from "axios";
import {ScoreControlLineEntity} from "@/types";
document.title = '省控线|艺体志愿宝';
const state = reactive({
scoreResult:{
size:0,
total:0,
current:1,
records:[] as Array<ScoreControlLineEntity>
},
loading:false,
professionalCategory:'',
category:'',
year:'2024',
pageNo:1,
pageSize:10,
})
scoreControlLineList()
//线
function scoreControlLineList(){
state.loading=true
axiosInstance({
url: apiConstant.Score.historyScoreControlLineList,
method: 'get',
params: {
pageNo:state.pageNo,
pageSize:state.pageSize,
year:state.year,
category:state.category,
professionalCategory:state.professionalCategory
},
showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
//
state.scoreResult = data.result
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
state.loading=false
});
}
//
const handlePage = (page: number) => {
if (page) {
state.pageNo = page
scoreControlLineList()
}
}
</script>
<template>
<LeftNav/>
<div class="main-container wrap main-fullScreen" style="min-height: 800px;">
<el-row :gutter="20">
<!-- 左侧 院校列表-->
<el-col :span="24">
<el-card class="box-card">
<div style="margin-bottom: 10px">
<el-form :inline="true" :model="state" class="demo-form-inline">
<el-row :gutter="20">
<el-col :xs="24">
<el-form-item label="年份">
<el-radio-group v-model="state.year" @change="scoreControlLineList">
<el-radio v-for="item in StaticConstant.allYear" :label="item.label" name="year">{{item.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :xs="24">
<el-form-item label="专业类别">
<el-radio-group v-model="state.professionalCategory" @change="scoreControlLineList">
<el-radio label="" name="professionalCategory">全部</el-radio>
<el-radio v-for="item in StaticConstant.zyOptions" :label="item.label" name="professionalCategory">{{item.value}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :xs="24">
<el-form-item label="文理分科">
<el-radio-group v-model="state.category" @change="scoreControlLineList">
<el-radio label="" name="state">全部</el-radio>
<el-radio label="文科" name="category">文科</el-radio>
<el-radio label="理科" name="category">理科</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider/>
<el-table :data="state.scoreResult.records" border style="width: 100%" v-loading="state.loading">
<el-table-column prop="year" label="年份" />
<el-table-column prop="professionalCategory" label="专业类别" width="180" />
<el-table-column prop="category" label="文理分科" width="180" />
<el-table-column prop="culturalScore" label="文化成绩分数" />
<el-table-column prop="specialScore" label="专业成绩分数" />
<el-table-column prop="batch" label="批次" />
</el-table>
</div>
<div class="page"><!--v-if="state.isShowPage"-->
<el-pagination background @current-change="handlePage" :current-page="state.scoreResult.current"
:page-size="state.scoreResult.size" :total="state.scoreResult.total"
layout="total, prev, pager, next,jumper"/>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<style scoped lang="scss">
root {
width: 100%;
}
</style>

View File

@ -0,0 +1,287 @@
<template>
<LeftNav />
<div class="main-container wrap main-fullScreen main-div" style="height: unset;">
<el-row :gutter="20">
<!-- 左侧 院校列表-->
<el-col :xs="12" :sm="12">
<el-card class="box-card">
<div class="filterTable">
<div class="filterTitle flexWrap">
<div class="flex-item-75">
<div class="searchSchool">
<el-input v-model="state.selectForm.schoolName" maxlength="24" show-word-limit
style="max-width: 230px;height: 40px;line-height: 40px;"
placeholder="请输入院校或专业名称" class="input-with-select" />
<el-button :icon="Search" @click="reloadSchoolList"
style="border-left: none;height: 40px;line-height: 40px;" />
</div>
</div>
</div>
</div>
<el-divider />
<!--clearable-->
<div class="schoolList">
<div class="schoolItem" v-for="item in state.schoolList"
@click="showSchoolInfo(item.schoolCode)">
<div class="schoolLogo">
<img :src="item.schoolIcon"
v-if="item.schoolIcon != null && item.schoolIcon != undefined" />
<img v-else src="@/assets/images/school/school_default.png">
</div>
<div class="schoolInfo">
<div class="schoolTitle">
<h3 class="schoolName">
{{ item.schoolName }}
<span class="province" v-if="item.province">{{ item.province }}{{ item.city }}{{
item.area }}</span>
</h3>
</div>
<div class="schoolTags">
<span v-for="tag in item.tagsList">{{ tag }}</span>
</div>
</div>
</div>
</div>
<el-skeleton :loading="state.loading" style="padding-top: 25px;"></el-skeleton>
<div class="page">
<el-pagination background @current-change="handlePage" :current-page="state.current"
:page-size="state.size" :total="state.total" layout="total, prev, pager, next,jumper" />
</div>
</el-card>
</el-col>
<!-- 右侧 功能广告-->
<el-col :xs="12" :sm="12">
<div class="page-right" style="width: 300px">
选择左侧院校
</div>
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
import { reactive } from 'vue'
import apiConstant from "@/utils/ApiConstant";
import axiosInstance from '@/utils/http';
import { SchoolEntity } from "@/types";
import { Search } from '@element-plus/icons-vue';
import LeftNav from "@/components/LeftNav.vue";
import StaticConstant from '@/utils/StaticConstant';
document.title = '找大学|艺体志愿宝';
//tabs
const state = reactive({
selectForm: {
schoolName: '',
current: 1,
pageSize: 10,
} as any,
schoolList: [] as Array<SchoolEntity>,
size: 10,
total: 0,
current: 1,
loading: false,//? true /false
})
getSchoolList()
//
function getSchoolList() {
state.loading = true;
state.schoolList = []
axiosInstance({
url: apiConstant.School.searchSchoolList,
method: 'get',
params: {
schoolName: state.selectForm.schoolName,
pageNum: state.selectForm.current,
pageSize: state.selectForm.pageSize,
addressList: state.selectForm.addressList,
tagsList: state.selectForm.tagsList,
schoolNatureList: state.selectForm.schoolNatureList
},
showLoading: false,//
}).then((response) => {
return response?.data
}).then((data) => {
state.loading = false;
if (data.success) {
let dataResult = data.result
console.log(dataResult)
let tags = []
if (dataResult.records != null && dataResult.records != undefined) {
for (let i = 0; i < dataResult.records.length; i++) {
tags = []
let dre = dataResult.records[i]
if (dataResult.records[i].tagsList != null && dataResult.records[i].tagsList != undefined) {
tags.push(...dre.tagsList)
}
dataResult.records[i].tagsList = tags
}
}
state.schoolList = dataResult.records
state.selectForm.current = data.result.current
state.selectForm.pageSize = data.result.size
state.total = data.result.total
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
function reloadSchoolList() {
state.selectForm.current = 1
state.schoolList = []
getSchoolList()
}
const handlePage = (page: number) => {
if (page) {
state.selectForm.current = page
getSchoolList()
}
}
const showSchoolInfo = (schoolCode: string) => {
window.open(schoolCode, '_self')
}
</script>
<style scoped lang="scss">
//
.demo-tabs>.el-tabs__content {
padding: 32px;
color: #6b778c;
font-size: 32px;
font-weight: 600;
}
//
/** 默认样式 */
.input-border-style {
border: 1px solid #eee !important;
border-radius: 6px !important;
}
:deep(.el-input__wrapper) {
background: none !important;
}
</style>
<!--学校列表-->
<style scoped lang="scss">
.schoolList {
.schoolItem:hover {
color: #3491FA
}
.schoolItem:last-child {
border-bottom: none;
}
.schoolItem {
display: flex;
justify-content: flex-start;
align-items: center;
padding: 20px;
cursor: pointer;
border-bottom: 1px solid #eee;
position: relative;
.schoolLogo {
margin-right: 20px;
img {
width: 60px;
height: 60px;
}
}
.schoolInfo {
.schoolTitle {
margin-bottom: 18px;
.schoolName {
color: #333;
font-size: 18px;
height: 25px;
line-height: 25px;
margin: 0 20px 0 0;
transition: all .3s;
display: flex;
align-items: center;
.province {
height: 26px;
line-height: 24px;
font-size: 12px;
border: 1px solid #eee;
color: #555;
display: inline-block;
padding: 0 10px;
margin: 0 20px 0 15px;
}
}
.schoolName:hover {
color: #3491FA
}
}
.schoolTags {
span {
display: inline-block;
color: #555;
padding-right: 10px;
margin-right: 10px;
border-right: 1px solid #c5c5c5;
line-height: 15px;
}
span:last-child {
border: none;
}
}
}
}
}
.page-right {
.box-card {
border-radius: 12px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
color: red;
}
:deep(.el-card__header) {
padding: 6px 12px 12px 12px;
background-color: #4cc8ff;
height: 30px;
span {
width: 100px;
height: 16px;
background-size: cover;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAfCAYAAACsyvxmAAAAAXNSR0IArs4c6QAADYhJREFUeF7lnOuxJMURhbssEFggsEDCArEWSGuBWAsEFggsEFggsIDFAoEFLBZosUB4UIqvIrPidHbWo2fuD0VoIjb2xkxPPbJOnnzWlCN51Vo/Oo7jX8dx8P+bUsq38bFa61+O4/jncRwfHMfxqpTyoz9Ta/37cRxfHsfx/jiOT0opv2XzJGPqvD+WUl7JmMzDv99m49naf7ZnvyqlsI6nX7InxvqilPL104Mex2HrfYmhTmOUUpD98FVr/fw4jn/cOaNaK5j49DiOr0spXzy66CDLiB0/5zvDN0yUAZg/M6DycQdErZWJ/mjfAbBsjBcH+4OMBcgBZjv44zje2d/vZ0I2BfnenmWBHwqYXZC8hYL4mKct1FoBL2vjdVKIO9KJz8pBvti4tVaV8zPLy7473XvYTwdUrZUz9XPVcX9/HAfr5QU5fZNMyvtvNxTp34KPTpaGL4jIsXNHJq9GYFZAtMlsIhYBoB99/VBKgdHTl7AFn78rpXwiYK7ypSZ8V65gFVCsv9mz0/nubKLW+h/Z+2ltd8bRZ2utKO5QHo+Ou6PItVZA48T0USnlVwMypPHM69tSypvZAEGWUZEenf/1CMwwq2uhg5mNI4BnXiu2SFnVQAuY/IXmsvaLOxEA8k0pBXM6Uh4Y6K8bG2K+yFZvjaFmX4epsGypmxXYEbcA65Y9+yeZn+e+21gzoBq6GgFQH7LGWutLnHHqlgYlvhATnyfKhCxSC2zj6ZmcmdmYEXOiAEAgHAjsDMDdBLgpZ1xMjh8CzO3MyGdfyUZSAZsP5YDx8ZkXwDA2Y3ZFKqWUIPjOBgEgU5+51qrmbgMfDz0yPNzAjmpuo5mFXNSly0x8W9zKxPsOaq0dUMhT3mfuzMxz9q74KNMljrJ4ZuT+gRfG5SzVGjkpsCeUib3yAk8fT4iAsTi/TnC6CSZwf/Vyarph0yIHwinIC+7I0mfdMG0oA8Glm5/mSwe27vOMAJLBUA/0IZjufel1KYUDu7wyc/sCrsfK+qEUgIbgz0FDXMP3GpNbUBoBDUE5CGOMxNeG8VCIhUZSQzl+3Y13Im7Ap4JZTXyckIV+rG8amNLsgn+2wxIbQdBr02bX2O6vChgUzOrbDoFkh6aWZgZNGEkPd+YS6DjILWOw9kxQJvdb1QTvqcv5qSGYF26Ek8SjQemQSUMsNNoTCoWMt+KdLL5SMDvFe1Dgk3IY31nAhTYPfdCJ5NkoGYjUhxP3hY14gAmbMe/bsPCMhfW91B97BBX+nUThTumkR8Y29utm0lwn9u6xQXPvNsdW338G5hlQG2HVWjWA3py+P9YUMn7JyA1WB6x/EIZ3/x98gDMIy9l/GO+EtDDTNRftFAAmJu7EyE/6mEsABKbSKFetRs9Q1FoRAKzpB3H1oxLh3j2hhFnSQ7szbjCTzooagHHAWKWd15+FZIbZBAMVsgRQ7oMDKNw45ApxaIYF/1dTrnEtyLsH0NEVzRY+S53uxDvJWbB+sPI+glnTNe5PdUYNYEMAs8R8dPSHuWEzucpKvNWfF9DyftdYTfwbq3BAPbWzI9wdpIQDIMhKs0A7Ywnb61pdGU/rvzOePLssFIX9nJ4PgFq5aUoep7rAaO2B+U+p0514JygbCg+QW9AZwaz+pq6HvCFmv6fHdg40gL+lfyabHLLqSGMlsMjAsCXcHcBEi7Wz99W4wXVprkF4rxUgVuOYWwaj9yLVqjoZAHWqZgZAsYZZ9VardVu591nqNATEqSIZgZGq/MUqkX190WeGmWFbFwwPsmB8NwSreeZevh4IXKuFSzbLolNhMbUYsWKE30nV6U0wQZegdWD2YMNZxYlUZSyJ41cizNELRZoCMbBjY6iw/mmOXCeutWpdYMqmZgXVlTg9HwC1oUv9kWXmyubWSm60ChrvLPcRF6dgdhMHZXsQCGB5P6bH7mySZ5fAiqVszIflLd8HX33oeweALJliIy14d5/6/Mqt0kCrATe6Mw9OvhObKKBib4QCinOfuZL4y+57Lyt/BmbN7ZNMgBR8Ds0b8x5Y3OnrQX7vFMzeeOIAZm4CLCJg35QmtFcmUBlvqbWD9I0HRlsZimDCduZ8NA21g7MVmJUdG0OF2GBnjuwZCg2rJqNLKduAdvKBZxkoe16zW1uWZMD8rBdX9tFSdlMkBbMzBZUYz/XxHiAHzGiIJ9qXPQ+ZTzgw87gjgIo5o7lvuUv11XkmS/+YcPWQdsDMfK6gj4In+95Pq269EAd4ywDr8TaCOK6mLSGcn5KJ2fPK/SO/rbFRj2WetFTDwFNSc8rkunwYmDzzo2BucyuYGQhgoSWe60NbOGzPd3oJG5AhtJkJYAzPGacmKLSaxrNpfQ02z6mUPVEK7d9Ygvkueu8Ug1Zjh0Cr+Yc2vssYpusMGwAYOxnT74zWMCllP5NNGbUKo6DeQ5MtiXP2dlIlFj/70Ta0a/OcZzZh4TpoUw2bA7QMfMoprg4rfJ5q7YQJ0FR8OZpfVMDDDEUy1haYrSr2gTOaAapZCG0zDeOnY8exZjIalLI1kFPAxkxPD46Cn730W0OxJtYR1O3iDGZ5bojKCZCtpr76osLbMylZ/tnkCSleKqkhjmquVWNmKXOiIWruMfE45dHNuIPlYfVPAAIDaZpHD/IkYG0L1UUklaslmIOf7n7rKHOi68jK++o/7uR6NQ6gb5v9ewDUCwEGPvxrrcx2vzgq+6w5x85aySFegDh1LS4qkKyXPbtrmMYIEth7B5wHjLFf/dK6G6yXukPaR9T34GD2D+kfdpPuwRemGw3KbptEE7I8xKgFMKEx8Khh2wNTvjor1cYOuJ1shgLXMwoKMmUOrc5lYNaAbsqQoUfC5axr0YKRZh6QwUXGs7xxIm8FcyxavHgp2xTIz3hITFn+OYsrbDyVSXdvHMxoJIyswZYXItzvzZryAbM67QgjvYGwujp1t5QdWDnrw52mA5MeaVKBmFb1u9Wcn/omksYrBcIKzBdmMUBSlkap+pUsYad2uyMLLG0vfg6sedbHrIA6rfOZjr2dQtLdUnbWkxPcltMZO5hhFQ6LgM9NnVelvJd4VlhYuR2r3tRbpWw7PHzaFoCGooGvZVoBDObZFTcqRczBdvZPWmK3LIitV835CvjeA+wAheWmqbeFr65ze+8x7PYuMOH0nmNmXVYgCBYkKtLFvUsIB7L1u6lMdwo6HcwcEg0lBICu4V6VeibC1f3N7u1tl7It24Kv1nxxU0LfIIfM++5fDkvoWeCUBJGnNKDmgRMwp37cIPOiLgkEQpDtKTkuixL4ensq7lLL6UvQo12Cns5DeZeXbAeKzxqQnd7dzHqWdTva3NSaolZpwUdK2UkvhnsIF5eTGxvOiphZ/vYGffcheQ9t/p3sJDYR6SaznoJfZoK+UcrWUjtz+kF6uRkXh2c8Hz7LSV+qYEnkfVIGNXsJmFUhVy6OshBsQ5qpX1OzPcwuI3Srs9sYZIGkzuNn5q2mL5FvXxWKdkvZ2jEZiY51p0kFwOzMS0SNQB0IqytH3n4ZyWe6oQFTKavttp2SYWENnsNsGQADuANhdmXJCwcKDHUVLv0kQeki0Kc+te87S43FNJOViB1cXR4BuH5vT89hluvVUnELpq1fnOtw01tGK/dBPl81k2mQrvHItHU3yVSl2HRm/tSS9pdb2RPw+W9mxEeWuc4kwh7+PEBytamVPu2yQHbx1lNc/J+WWIO/p/3Ruo6UXY29+exSaZPc8SwfrsBpFx8S1250sVddPr+Zkv4sRAiQTy6QZURO6w/3O2/gtz86rT7GywihxXfYujsorPU6hC40toCqll+6lqRCpbdNGFirhozf86Q7UgnMpOmwGBjiRnwpPqWzV8yXujkbFTeUgbULT/e/bI5KlLK7D6PoPvisWBKA5u0D/hMKM+Xms+4fB5CMKq3IkT2vAEes0e/5LVp23aefXg0TizTM048KY/a+JyeiuFtRR4Ph2U2T6LdQV0cgmqKDVT43cGV3CAEHJmGWKvJfP/LFakHAMykeuTY2Cdp6UZyZO2Df1wBMk/HRddJb5yO97DfOZwGiHGq/CGwXClwB1J1QWc5unLRLpGIRlj0zo00kDDhz0WJSYNqpl4AyZjIu+edaa7yiB9Y4f/XtOXvIrwXIEczqoLsZi0l7d8AB6Sl6nrQwpmmepFNuy0UJYB1VnvwHay7X1SV3Gxn95DPvWBVtbw2+3cV/jD+PYD0JntdWC7G7Ds84uRIuC0UTMCupTC1r8oNAsyajmO7MyCdWHgHuqU/D8+tJkN5dugjmUx418XNa4j52+Af/zDvR9Ac6RuZemRCtw2ws+1flLhtN+WmXmP+GW2YV5LYCh9B/5+HBn4eKaTIOAZBd0mQB7M0C2XtcAADMnjffze17LQDAAMZ2AXhTCftjyb53fshl62fQ4oUJO+PTb2vEq1TmpuJ6IQ/WctpTsCJdgUfMrAUTTDKD0nIIcy7BZqYcAcMwXJ4ENBchm5Z51WvZunj3kB593qL7eEt96Was5pODXfb+2oEhP02JxilaU/pq3tXnAczLtdn5qsLNblL7rX/qGC2HnsQapxjG3Al89yHepK0UMF/vALo/+kyFaSW4//fPvRflf00Oj7S3PvKdhc8+/YXXlcz+C9FpdooHgy/tAAAAAElFTkSuQmCC);
}
}
.item {
border-radius: 12px;
}
:deep(.el-card__body) {
padding: 0;
}
}
</style>

View File

@ -0,0 +1,132 @@
```html
<template>
<!-- 页面布局 -->
<div class="margin-5"></div>
<div class="main-container wrap main-fullScreen">
<div class="bgd-while textCenter p-20">
<div class="font-size-30">更改密码</div>
<div class="center">
<!-- 表单 -->
<el-form ref="ruleFormRef" style="max-width: 800px" :model="ruleForm" status-icon :rules="rules"
label-width="auto" class="demo-ruleForm">
<el-form-item label="密码" prop="oldPass">
<el-input v-model="ruleForm.oldPass" type="password" autocomplete="off" placeholder="请输入旧密码" />
</el-form-item>
<el-form-item label="新密码" prop="pass">
<el-input v-model="ruleForm.pass" type="password" autocomplete="off" placeholder="请输入新密码" />
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input v-model="ruleForm.checkPass" type="password" autocomplete="off" placeholder="请再次输入新密码" />
</el-form-item>
<el-form-item style="text-align: center">
<el-button type="primary" @click="submitForm(ruleFormRef)">
提交
</el-button>
<el-button @click="resetForm(ruleFormRef)">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
<div class="margin-5"></div>
</template>
<script lang="ts" setup>
import { ref, getCurrentInstance, ComponentInternalInstance, reactive } from 'vue'
document.title = '河南艺体考生专属VIP|艺体志愿宝';
import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
import { checkPhoneAvailable, getScore } from '@/axios/api';
import { passwordChanger, registerUser } from '@/axios/UserApi';
import { useRouter } from "vue-router";
const ruleFormRef = ref<FormInstance>()
const router = useRouter();
const validateOldPass = (rule: any, value: any, callback: any) => {
if (value === '') {
callback(new Error('请输入旧密码'))
} else {
callback()
}
}
const validatePass = (rule: any, value: any, callback: any) => {
if (value === '') {
callback(new Error('请输入密码'))
} else if (value.length < 6 || value.length > 20) {
callback(new Error('密码必须介于6到20位之间'))
} else {
if (ruleForm.checkPass !== '') {
if (!ruleFormRef.value) return
ruleFormRef.value.validateField('checkPass')
}
callback()
}
}
const validatePass2 = (rule: any, value: any, callback: any) => {
if (value === '') {
callback(new Error('请再次输入密码'))
} else if (value !== ruleForm.pass) {
callback(new Error("两次输入不一致"))
} else {
callback()
}
}
const ruleForm = reactive({
oldPass:'',
pass: '',
checkPass: '',
phone: '',
})
const rules = reactive<FormRules<typeof ruleForm>>({
oldPass: [{ validator: validateOldPass, trigger: 'blur' }],
pass: [{ validator: validatePass, trigger: 'blur' }],
checkPass: [{ validator: validatePass2, trigger: 'blur' }],
//phone: [{ validator: checkphone, trigger: 'blur' }],
})
const submitForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.validate(async (valid) => {
if (valid) {
console.log(ruleForm)
const data =await passwordChanger({oldPassword:ruleForm.oldPass,password:ruleForm.pass})
console.log(data)
if(data.success){
//
ElMessage.success('修改成功');
setTimeout(function () {
router.push({
path: "/index"
});
// setTimeout(function () {
// window.location.reload()
// }, 500);
}, 1000);
}else{
ElMessage.error(data.message);
}
}
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
</script>
<style scoped lang="scss">
.center {
display: flex;
justify-content: center;
align-items: center;
height: 20em; /* 可根据需要调整高度 */
}
.wrap {
width: 1210px
}
</style>
```

143
src/views/register.vue Normal file
View File

@ -0,0 +1,143 @@
```html
<template>
<!-- 页面布局 -->
<div class="margin-5"></div>
<div class="main-container wrap main-fullScreen">
<div class="bgd-while textCenter p-20">
<div class="font-size-30">账号注册</div>
<div class="center">
<!-- 表单 -->
<el-form ref="ruleFormRef" style="max-width: 800px" :model="ruleForm" status-icon :rules="rules"
label-width="auto" class="demo-ruleForm">
<el-form-item label="手机号" prop="phone">
<el-input v-model.number="ruleForm.phone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input v-model="ruleForm.pass" type="password" autocomplete="off" placeholder="请输入密码" />
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input v-model="ruleForm.checkPass" type="password" autocomplete="off" placeholder="请再次输入密码" />
</el-form-item>
<el-form-item style="text-align: center">
<el-button type="primary" @click="submitForm(ruleFormRef)">
提交
</el-button>
<el-button @click="resetForm(ruleFormRef)">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
<div class="margin-5"></div>
</template>
<script lang="ts" setup>
import { ref, getCurrentInstance, ComponentInternalInstance, reactive } from 'vue'
document.title = '河南艺体考生专属VIP|艺体志愿宝';
import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
import { checkPhoneAvailable, getScore } from '@/axios/api';
import { registerUser } from '@/axios/UserApi';
import { useRouter } from "vue-router";
const ruleFormRef = ref<FormInstance>()
const router = useRouter();
const checkphone = (rule: any, value: any, callback: any) => {
if (!value) {
return callback(new Error('请输入手机号'))
}
let reg = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
setTimeout(async () => {
if (!Number.isInteger(value)) {
callback(new Error('请输入数字'))
} else if (!reg.test(value)) {
callback(new Error('手机号格式有误'))
} else {
const result =await checkPhoneAvailable(value) as any;
if (!result) {
callback(new Error('手机号已使用'))
}else{
callback()
}
}
}, 600)
}
const validatePass = (rule: any, value: any, callback: any) => {
if (value === '') {
callback(new Error('请输入密码'))
} else {
if (ruleForm.checkPass !== '') {
if (!ruleFormRef.value) return
ruleFormRef.value.validateField('checkPass')
}
callback()
}
}
const validatePass2 = (rule: any, value: any, callback: any) => {
if (value === '') {
callback(new Error('请再次输入密码'))
} else if (value !== ruleForm.pass) {
callback(new Error("两次输入不一致"))
} else {
callback()
}
}
const ruleForm = reactive({
pass: '',
checkPass: '',
phone: '',
})
const rules = reactive<FormRules<typeof ruleForm>>({
pass: [{ validator: validatePass, trigger: 'blur' }],
checkPass: [{ validator: validatePass2, trigger: 'blur' }],
phone: [{ validator: checkphone, trigger: 'blur' }],
})
const submitForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.validate(async (valid) => {
if (valid) {
console.log(ruleForm)
const data =await registerUser({phone:ruleForm.phone,password:ruleForm.pass})
console.log(data)
if(data.success){
//
localStorage.setItem('vipInfo', JSON.stringify(data.result.vipInfo))
localStorage.setItem('userInfo', JSON.stringify(data.result.userInfo))
localStorage.setItem("X-Access-Token", data.result.token);
ElMessage.success('注册成功');
setTimeout(function () {
getScore()
router.push({
path: "/index"
});
setTimeout(function () {
window.location.reload()
}, 500);
}, 1000);
}else{
ElMessage.error(data.message);
}
}
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
</script>
<style scoped lang="scss">
.center {
display: flex;
justify-content: center;
align-items: center;
height: 20em; /* 可根据需要调整高度 */
}
.wrap {
width: 1210px
}
</style>
```

862
src/views/school/detail.vue Normal file
View File

@ -0,0 +1,862 @@
<template>
<div class="margin-5"></div>
<div class="main-container wrap main-fullScreen main-div" style="height: unset;">
<!--上部分-->
<div class="relative_box">
<div class="flexWrap">
<div class="flex-item-2">
<div class="flexWrap" style="height: 260px">
<div class="slogo" style="margin: auto;">
<img :src="state.schoolInfo.schoolIcon" width="160" height="160" alt="..">
</div>
</div>
</div>
<div class="flex-item-8" style="padding-top: 40px;">
<div class="sname">
<span class="">{{ state.schoolInfo.schoolName }}</span>
</div>
<!--院校地址-->
<div class="scity mt-10" v-if="state.schoolInfo.street">
<el-text>
<el-icon>
<LocationFilled />
</el-icon>
{{ state.schoolInfo.street }}
</el-text>
</div>
<!--院校标签-->
<div class="stags mt-10">
<span class="stag mr-10" v-for="(item, index) in state.schoolInfo.tagsList" :key="index">{{ item }}</span>
</div>
<div class="other mt-10">
<el-row>
<el-text>
<el-icon>
<View />
</el-icon>
官方网址<a v-for="item in state.schoolInfo.websiteAddressList" class="while" :href="item"
target="_blank">{{ item }}</a>
</el-text>
</el-row>
<el-row>
<el-text>
<el-icon>
<Phone />
</el-icon>
官方电话{{ state.schoolInfo.schoolPhone }}
</el-text>
</el-row>
<!-- <el-text>
<el-icon><Message /></el-icon>
电子邮箱暂未收录
</el-text> -->
</div>
</div>
</div>
</div>
<!--中间部分-->
<div class="mt-15">
<!--博士点...schoolResearchTeaching-->
<div class="flexWrap schoolResearchTeachingBox" v-if="state.schoolInfo.schoolResearchTeaching">
<div class="item mr-10 border-eb" v-if="state.schoolInfo.arwuRanking">
<span class="num">{{ state.schoolInfo.arwuRanking }}<span class="ming"></span></span><br />
<span class="text">软科排名</span>
</div>
<div class="item mr-10 border-eb" v-if="state.schoolInfo.schoolResearchTeaching.professionalMasterDegreePoint">
<span class="num">{{ state.schoolInfo.schoolResearchTeaching.professionalMasterDegreePoint }}<span
class="ming"></span></span><br />
<span class="text">专硕点</span>
</div>
<div class="item mr-10 border-eb" v-if="state.schoolInfo.schoolResearchTeaching.academicMasterDegreePoint">
<span class="num">{{ state.schoolInfo.schoolResearchTeaching.academicMasterDegreePoint }}<span
class="ming"></span></span><br />
<span class="text">学硕点</span>
</div>
<div class="item mr-10 border-eb" v-if="state.schoolInfo.schoolResearchTeaching.doctoralPoint">
<span class="num">{{ state.schoolInfo.schoolResearchTeaching.doctoralPoint }}<span
class="ming"></span></span><br />
<span class="text">博士点</span>
</div>
<div class="item mr-10 border-eb" v-if="state.schoolInfo.schoolResearchTeaching.zhx">
<span class="num"></span><br />
<span class="text">自划线</span>
</div>
<div class="item mr-10 border-eb" v-if="state.schoolInfo.schoolResearchTeaching.byl">
<span class="num">{{ state.schoolInfo.schoolResearchTeaching.byl }}%</span><br />
<span class="text">保研率</span>
</div>
<div class="item mr-10 border-eb" v-if="state.schoolInfo.schoolResearchTeaching.yjsy">
<span class="num"></span><br />
<span class="text">研究生院</span>
</div>
<div class="item mr-10 border-eb" v-if="state.schoolInfo.schoolResearchTeaching.byzg">
<span class="num"></span><br />
<span class="text">保研资格</span>
</div>
</div>
</div>
<el-card class="box-card mt-15">
<el-tabs v-model="state.activeTabsName">
<el-tab-pane label="学校概括" name="tabs1"></el-tab-pane>
<el-tab-pane label="分数/计划" name="tabs2"></el-tab-pane>
<el-tab-pane label="开设专业" name="tabs3"></el-tab-pane>
<el-tab-pane label="硕士点" name="tabs4"></el-tab-pane>
</el-tabs>
<el-row :gutter="20">
<el-col>
<div v-show="state.activeTabsName == 'tabs1'">
<el-row :gutter="20">
<el-col :span="17">
<div class="jbxx">
<el-divider content-position="left">相关信息</el-divider>
<el-card shadow="always" class="mb-10">
<el-row :gutter="20" class="other-line">
<el-col :span="9">
<i class="block-icon float_left"
style="background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAACrElEQVRYR82YPWgUQRTHf48oB6eSJkgOTCFqGo2doIVKGlHBxt7GOw9MUBArPyIhGkstgicIe42NnYX40Ug0jYVYKYIJqRRjITY5A5HknuzHfe1tbmf2Fu622uK9N7/5vzczb0bos0/6jAdrIL1ChjXGgXPAGMowQs6bmLKCsAJ8AV6QZV7mWLeZtDGQFsmxyRRwAWWn0SBCBXhKhhkp8cvEJxYoUMQFuYaSNQnaZiOsAQ/JcjdOsY5AOsEw6zxHOZoIJOwkfCDD+U5qbQmkBQ6jvETZkwpMLYjwgwHOyhM+R8WNBAqU+Zg6TDNUhiNRSrUBBTXzLrU0bSWvm74s4+GaagcqMEuVm8ZpEv6gZIAdxj4NpWbF4XazXwtQkKpl49UkrDLACDDEBktgua+5qy/DvubUtQLlKaFctpjpVylz0NsT8/w1nkirJI/FYaIhWvAX1M5v403P90sDqEKWoVot1RXSPKdRXluokw6QG0U4Iw5v/N+aQnkeoQ3pDMG6V8inKInDZBjoPcoJQ5CaWVpAC+JwshXoIovAgZ4AwZKUGQ0rtGpZ0GnWUEUcdnUPJCyLw35v2RfIU+U+sNtSZbeGIoCSpcwN9oARbsg0/7TIIBtMIVxF2W4BFpmyBZTjFkEapsI3YFIc3npqXWKUKnMop4ziCRFFnWzZt44nPEO5LmV+6jTb+M4iyt5YqC2WfZKNsX0s93yDGZRPiNfcDRoARWyMfvNue3TEjhVr4PbdUUeHl3v7wzV2vFgDIfpw9YD8Htq8/YgdLcYgrv0IVLqHcqvbsYz8hc4Nmgfk19I8yjGjoEmNTFvYptT1R5Nfm7AWGWOTV6nfPJJcg+pQ/XRRrEP5NdUfV+nmeg22hDs9f2wIL6LQc8whlFxPnmOSrm5bv9jnGNuA3dr/B+m6FjQK0kN/AAAAAElFTkSuQmCC');"></i>
<span class="float_left">创建时间
<span v-if="state.schoolInfo.schoolOpenDate">
{{ getYear(state.schoolInfo.schoolOpenDate) }}
</span>
</span>
</el-col>
<el-col :span="9">
<i class="block-icon float_left"
style="margin-left: 50px; background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAEd0lEQVRYR82XbYhUVRjHf8+dmUXbsuhFLd1At+31Q7lrb5a7e8+1XRMCDQKTtC8FFVKEBkFkK4VgiVBRfgosMwkJExF8mXuvK6hQ4Wwr5EtlWbRQaLFmKO7MPHHvuHfm7ow0uXfBAxdmzsv//zvPc8655wqXWZHLjIfaQJ7dBrIMdAYqt4JadYMLazH+srC/PpHCOzUAOhFkEOhHZAfStBZ7/blamtVAnr0aleX/C6JSWfgZ40+Lqjz7XZQX4+ZynIwsoN3tHwkVB/LNUor6ft3RuFjHjLTR7h0Mm/c491IoflXVNQBvtGZyv3sqPp/hf/u6JnIu/ytow6iBhFUY/7VIxzXHQFtqQL2H8V+qDeQ7T1Msrh81TCAgHMH4d5TT5qxAiyurtWUA405FRIfbyinznI/R4pJEgAKRjHUX7e53oZ7ffQvF89/X1K7sF85luHi2j9KZGBDyOo73VoX+AZQHqtOWmo/Jbq0RIXME1dsSAxL6MP6MSO9iG0asZRh3bQ0g+zTKVYkBBULpzHQ6dv0Uau599Aby5wZQ0jEPkXUY74U40LddjZwcOpMoTCgmr+B4a8ppM9tRnTcCaBfG644D9T7SQj5/bAyADuB4syJd1zwJ+lncR47jeM1xINe0g/YmDiQoDempPLx7INT+5rErOH3md5QrIy8hj3SMx+7JhzENG3xnIcXipsSBAkHLWortflCRtk9QXRzzshpasHf+UAby7JdRopWeLJj4OJ4pA83pRgs74usoNReT3VkRIfMORV2eLEi0KgpYjZOxt50Ma0o3gN9AJ5V6yClSPEunt6UiQmYjqovGBihM2zPY7keRvu/MDX9nrP5ofV1oLK0h13igdnJAUgCOEhyOSo60tZOO7KF69EtAnn0Y5fZ6BlT1Ec6icgjRHGLl0FQf467uZ9bms5eiNxyhQdAJ/y0gf4bGKn1YkiNFjtnXHkU2BxFJpEh4Ngye+ad65nICtA+RHKo5Mqk+Zmd/ScQ1fI0MtYK2lR7amGDdzczsoNDbNY1CfluY65J5Hw3jc8ze/lci5v68yejZ1tC09LSiNFVpp1N30pE9nOxXx34zhfO0UrhgHALoTXVNTNJzMLvdSwfq7WqiWCiFXMNZB78vnC11IYzoJEtwvA31A7mmC5FOKJbCr1x/KbYXHWPJq9je6jiQ9lj4vS2otDL+ui9jW9c1W0DnJwpRKSaEF35hj1lAAYOEH4X3gDaG/dKpVjqyuWiMa3pA3xg7INmE8RYJrvkRdHqVkWUtxHY/j+o9+3GUL8YMCPkUx1ssePbfsfvJsKOwAuO/WRGhZtDwijAmJVpDrgkOwJtrvBI2YvynonpVwTfBvbt8uUqMLHz3NeN4J4KUbQAtG0cm8jWOd1/M0zX7QR9MjKOcjehLNzipmygMHazexjKI410zAmgd6HOJAQXXV5WVmPZVSE8x0C1t+73dN5IfWoPSATolMhyXmcRDu/6oWEfPg344KqDgng0nUdlHSt6m0z0Q3/2jUk9+cP0ndfLeNRX/BeErjDT18wRjAAAAAElFTkSuQmCC')"></i>
<span class="float_left">占地面积未收录</span>
</el-col>
</el-row>
<el-row :gutter="20" class="other-line">
<el-col :span="9">
<i class="block-icon float_left"
style="background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAADyElEQVRYR+2YW2gcZRSAvzOJ2WSDF1AQDFgQr9matWSyogj6oC8KvkR8iGK1pcWlGpUiWCQYr4kaUNAqFJRab4gggjUYlEjUB2Vm1xuKJagEVARpuhLjJSQ5cuJsnW538s9uYumDBxaWnfOf8825/OewwnEmcpzx8D+QKyNrjdA1wFPAb8B24GOXQ9fzZoFOBJ4AtsYcLAGPAcPAgstx0vNmgK4A9gIbEox+AdwEfN4MVCNAHcAIMAjOZrAI3Q88CljkUktaoAKwDzgvteV/FD8BNgMH0p5zAZ0A3AfcA7SkNVqj90d03opfXTZWA7oQeBHIu4ykfP4+cAsws5p+PSCLxN1RDbSldJZWbQ64E3g+bZedA7wAXJLWQ5N6+4FtwM+15+MRsnA+DWSbdNLosYPAzYDBHZY40O+AtfaxlG+AC5KALLd201pnHQuxcbMFeD0JyH6/KLpvrMP+S/kgSpeVx3XAS8C35rBel1lnPRB1mrfOVH8C9wJPAsvAp1EQ3gOuSgKqMlwaddzZ6wRVimbc1zF7Nop2RpCPu4DseSdgisU1QC0CDwMPAfa9VjLAX9UfXaNjRa+7u/v6mZmZPfPz8yc3AuZ53oHl5eUbAItOklwJWMpWxAkUhuHFqvrG3NzcGWNjY4yPjzuZRISBgQGKxeIvbW1ttxcKhddWOWT7k33cQEEQ2AK2W1UtrCsyNTXFyMgIs7OzdX10dXUxPDxMPv/vCBSRN7PZbDGXyx11MwPvVgs6MUKqKkEQ7E6qnUqlwujoKJOTk0dA9ff3Mzg4SEfH0feriBwSkdt8338ldsjmpr3Z4VKom7Jyudy9uLj4lSs3ExMTWBrb29sZGhqiULC1KVkMyvf9U0WkuoacGU3/0wAbJck1FATBFlW1+8L250RZWFigpaVl5eOA+U5ENvu+/1FM7zLgQ2AT8JmzqMvl8oalpaW9qmp7dNMiInuy2ezOXC5n4yIuA8DLwLXAW04gU7B6CsPwDlV9pNHhKyI/eZ63tbe3952Et9kFmN0dwDOpgKqGwjA8X1X3qWpfmlCJyKuZTGZHT0/PoVX0nwVuBUYBg3PfQ3FjqtpaKpV2qeqQqiZtBQc9zyv6vn/EFE+Aehu4OkrbjQ0DVY0GQbBJVW3fztU42t/Z2bkt4b6px/QlsBGw6X9500B2cHp6OlOpVB604aiq8yJyV19f33Np0hnT+RU4CfgeOGtNQFWjpVKpp7W1dTafz//QIIytNnb3nGLvB5y7LkANQtSqG8zpwI/RHxaNFfUanac67pz2qayso9Lfe4j8JXHam58AAAAASUVORK5CYII=');"></i>
<span class="float_left">主管部门{{ state.schoolInfo.affiliation }}</span>
</el-col>
</el-row>
<el-row :gutter="20" class="other-line">
<el-col :span="24">
<i class="block-icon float_left"
style="background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAADv0lEQVRYR82YX2gcVRSHvzOb3awxNSbQLBbaqAQVKxSKGESkD9o+WERfrMVSIQ9WJKLgk82mdSQ7URAVqz6UPgimWAhCqQ+K+uAfVIKgqFhaKBKttDa0xiZR3O4mc+Ruu2q7M3fu7PSh92ng/M653zn33rlnRrjChlxhPKQHCrTEX9wPbAYGEVYBHspJhJ+BD4BDBPJrO8m6A/naT43dwA4gb51MCBH2k2MXz8vxNGBuQGN6HyHvAD1pgiNU8XiMcdnv6pcMVNYngddQPNegLTqPcSpiqps47EBlfQDlILSx1y6d2mMHFdmXRBQPVNYB4EeU7qQgjvY6cAcT8p1NbwN6G2W742Suso+ZkE3pgXy9iTpHMu2buFmFuwnki3hzlGVUdwITCUf7DMIYHXzGEnVC7kKooKxO8NtDIE+nBfoKuDM2sPAbedbjy6mLNC9qDwtMA7dYfGcI5Ma0QHNAb2zQHA8zLlOR9l26gWU+tVapQCe+1KI0rZva1yI1/rYGXEEfO+WPSM2U5vieBZQuS5WuJ5Bf3IBe0F4WMRWKG3UKdMdl2HAaVbOUpdgIHrdSkSNuQKpmq9ZQOiwZDhHI15H253QNdSKz/1dfYCW+nHEDMqqyHkW52VKlTwi4BxFt0YzqAWCrJZmzVOiL9I29Esq6F23c6vFDOEgXT1CW2YbInLBFXkUZTvAzrcmD6U7Zbt3IEh9ZAxujaTPA7AVzLdxmXeZmsBzbbbe/7eow99jaRKg0AuEUeQZsByIeaEw3EfJhmvkStcKjBDJp3wk266i+AYwkTuQmeJcJeShJau+HzCugzOuXAWqKAtvwZSkbUNO7rC+jPJMULNIuTLKOYbbIsot/cgv7H9Q24CWU61wCI8xd6Ab24os5jU7DHciE87WLGlsRnkJZF1ORY8AeVjDJszLvRPE/UTqgpuMrehW/8x7KvRdNKHxDNxtjL14HuvaATOBLoS4DzPl3bZbRhDK9U8bKNDGyATUrtdBouM5myc0ZaOqwFk5XWeOFlDRkpcI1ohRDpYhHp3kWEBWqGlIVj3NC43lRPE53wGy+n+PDN0jVBbilQvumtVQTHkHZAI2TNKCabWlFUIUTAj+I8nkuz4HHb4/+5m8BenNap1UZcsmmbY0wMzLEoEjr+6kF6K0ZLVZn2bx8vkLrEQYF+rNUSQTTHf4kwrcqfMnVHBpZK39GJeS0qd8/pp0n5lhVV/pCj2tlmR7xKF74LdP8NWN6oroo5zTHvCrzHR5zvSVOblkt9o+GzC/Gttcq2fEfQwsnNOzpMb4AAAAASUVORK5CYII=');"></i>
<span class="float_left">
学校地址{{ state.schoolInfo.province }}{{ state.schoolInfo.city }}{{ state.schoolInfo.area }}
</span>
</el-col>
</el-row>
</el-card>
<el-divider content-position="left">基本信息</el-divider>
<el-card shadow="always">
<span style="font-size: 16px;font-family: 'Microsoft YaHei'">
{{ state.schoolInfo.baseInfo || '暂无' }}
</span>
</el-card>
<br />
</div>
</el-col>
<el-col :span="7">
<!--招生章程-->
<div v-if="state.articleList && state.articleList.length > 0">
<el-divider content-position="right">招生章程</el-divider>
<div class="gjjylzy border-eb bgd-while">
<div class="item" :class="index === state.articleList.length - 1 ? 'item-last' : ''"
v-for="(item, index) in state.articleList" :key="index" @click="showArticle(item)">
<span>{{ item.title }}</span>
</div>
</div>
<div class="flexWrap">
<span class="showMore" @click="showArticleMore">查看更多</span>
</div>
</div>
<!--国家级一流专业-->
<div
v-if="state.doubleFirstPlan && state.doubleFirstPlan.gjjList && state.doubleFirstPlan.gjjList.length > 0">
<el-divider content-position="right">国家级一流专业</el-divider>
<div class="gjjylzy border-eb bgd-while">
<div class="item" :class="index === state.doubleFirstPlan.gjjList.length - 1 ? 'item-last' : ''"
v-for="(item, index) in state.doubleFirstPlan.gjjList" :key="index"
@click="showMajorInfo(item.majorCode)">
<span>{{ item.majorName }}</span>
<span class="item-right">详细查看</span>
</div>
</div>
</div>
<!--省级一流专业-->
<div
v-if="state.doubleFirstPlan && state.doubleFirstPlan.sjList && state.doubleFirstPlan.sjList.length > 0">
<el-divider content-position="right">省级一流专业</el-divider>
<div class="gjjylzy border-eb bgd-while">
<div class="item" :class="index === state.doubleFirstPlan.sjList.length - 1 ? 'item-last' : ''"
v-for="(item, index) in state.doubleFirstPlan.sjList" :key="index"
@click="showMajorInfo(item.majorCode)">
<span>{{ item.majorName }}</span>
<span class="item-right">详细查看</span>
</div>
</div>
</div>
<!--第四轮学科评估-->
<div v-if="state.subjectEvaluationList && state.subjectEvaluationList.length > 0">
<el-divider content-position="right">第四轮学科评估</el-divider>
<div class="dslxkpg border-eb bgd-while">
<div class="item" :class="index === state.subjectEvaluationList.length - 1 ? 'item-last' : ''"
v-for="(item, index) in state.subjectEvaluationList" :key="index">
<span>{{ item.subjectName }}</span>
<span class="item-right">{{ item.evaluationResult }}</span>
</div>
</div>
</div>
<!--男女比例-->
<div class="mt-15" ref="chartRef" :style="{ width: '330px', height: '400px'}"></div>
</el-col>
</el-row>
</div>
<div v-show="state.activeTabsName == 'tabs2'">
<el-divider content-position="left">分数/计划</el-divider>
<el-form :inline="true" :model="selectSchoolHistoryMajorEnrollForm" class="demo-form-inline">
<el-form-item label="年份">
<el-radio-group v-model="selectSchoolHistoryMajorEnrollForm.year" @change="historyMajorEnrollList">
<el-radio v-for="item in StaticConstant.allYear" :label="item.label" name="year">{{ item.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div class="majorList">
<el-table :data="state.schoolHistoryMajorEnrollResult.records" border style="width: 100%">
<el-table-column label="年份" width='100'>
<template v-slot="scope">
{{ scope.row.year }}
</template>
</el-table-column>
<el-table-column label="专业名称">
<template v-slot="scope">
<span v-if="scope.row.enrollmentCode">({{ scope.row.enrollmentCode }})</span>
{{ scope.row.majorName }}
<span v-if="scope.row.detail">({{ scope.row.detail }})</span>
</template>
</el-table-column>
<el-table-column label="录取批次" width='100'>
<template v-slot="scope">
<span v-if="scope.row.batch">{{ scope.row.batch }}</span>
</template>
</el-table-column>
<el-table-column label="文理分科" width='100'>
<template v-slot="scope">
{{ scope.row.category }}
</template>
</el-table-column>
<el-table-column label="计算方法" width="150">
<template v-slot="scope">
{{ scope.row.rulesEnrollProbability }}
</template>
</el-table-column>
<el-table-column label="最低分数线" width='100'>
<template v-slot="scope">
{{ scope.row.admissionLine }}
</template>
</el-table-column>
<el-table-column label="招生人数" width='100'>
<template v-slot="scope">
{{ scope.row.enrollNum }}
</template>
</el-table-column>
<el-table-column label="录取数" width='100'>
<template v-slot="scope">
{{ scope.row.admissionNum }}
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination background @current-change="handleHistoryMajorEnrollPage"
:current-page="state.schoolHistoryMajorEnrollResult.current"
:page-size="state.schoolHistoryMajorEnrollResult.size"
:total="state.schoolHistoryMajorEnrollResult.total" layout="total, prev, pager, next,jumper" />
</div>
</div>
</div>
<div v-show="state.activeTabsName == 'tabs3'">
<el-divider content-position="left">开设专业</el-divider>
<el-form :inline="true" :model="selectMajorForm" class="demo-form-inline">
<el-form-item :inline="true">
<el-input style="width: 70%" :input-style="{ background: 'none !important' }"
v-model="selectMajorForm.majorName" class="w-50 m-2 input-border-style" size="large"
placeholder="输入专业名称" />
<el-button size="large" type="primary" style="margin-left: 5px" plain @click="schoolMajorList">搜索
</el-button>
</el-form-item>
</el-form>
<div class="majorList">
<el-table :data="state.majorResult.records" border style="width: 100%">
<el-table-column label="专业名称">
<template v-slot="scope">
{{ scope.row.majorName }}
</template>
</el-table-column>
<el-table-column label="专业代码" width="150">
<template v-slot="scope">
{{ scope.row.majorCode }}{{ scope.row.majorCodeChar||'' }}
</template>
</el-table-column>
<el-table-column label="批次" width='100'>
<template v-slot="scope">
<span v-if="scope.row.batch">
{{ scope.row.batch}}
</span>
</template>
</el-table-column>
<el-table-column label="专业类别" width='155'>
<template v-slot="scope">
{{ scope.row.majorType }}
</template>
</el-table-column>
<el-table-column label="专业大类" width='180'>
<template v-slot="scope">
{{ scope.row.zyl || '' }}
</template>
</el-table-column>
<el-table-column label="学制" width='80'>
<template v-slot="scope">
<span v-if="scope.row.semester">
{{ scope.row.semester }}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width='120'>
<template v-slot="scope">
<el-button type="success" @click="showMajorInfo(scope.row.majorCode)">专业介绍</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div v-show="state.activeTabsName == 'tabs4'">
<SchoolNpee v-if="state.schoolInfo.id" :schoolId="state.schoolInfo.id"/>
</div>
</el-col>
</el-row>
</el-card>
</div>
</template>
<script setup lang="ts">
/*学校介绍详情页*/
import apiConstant from "@/utils/ApiConstant";
import { onMounted, reactive, ref } from 'vue'
import { useRoute,useRouter } from 'vue-router';
import { AxiosResponse } from "axios";
import { SchoolEntity } from "@/types";
import { isNotNull } from '@/utils/tool';
import axiosInstance from '@/utils/http';
import * as echarts from 'echarts';
import StaticConstant from "@/utils/StaticConstant";
import SchoolNpee from "@/components/npee/schoolNpee.vue";
const router = useRouter();
const { query, params } = useRoute(); //2.routerqueryparams
document.title = '院校介绍|艺体志愿宝';
//
let schoolCode = params.schoolCode
const selectSchoolHistoryMajorEnrollForm = reactive({
year: '2023',
pageNo: 1,
pageSize: 10
})
//
const selectMajorForm = reactive({
majorName: '',
disciplines: '',//
pageNo: 1,
pageSize: 10
})
const state = reactive({
activeTabsName: 'tabs1',
schoolInfo: {} as SchoolEntity,
disciplinesOptions: [] as any,//
doubleFirstPlan: {} as any,//
subjectEvaluationList: [] as any,//
majorResult: {
records: [] as any,
current: 1,
size: 0,
total: 0
} as any,
schoolHistoryMajorEnrollResult: {
records: [] as any,
current: 1,
size: 0,
total: 0
},
scoreInfo:{cognitioPolyclinic:''} as any,
articleList: [] as any,//
})
const chartRef = ref<HTMLDivElement | null>(null);
onMounted(()=>{
let scoreInfo = localStorage.getItem('scoreInfo')
if(scoreInfo){
state.scoreInfo = JSON.parse(scoreInfo)
}
getSchoolInfo()
schoolMajorList()
historyMajorEnrollList()
})
function getSchoolInfo() {
if (!schoolCode) {
return;
}
axiosInstance({
url: apiConstant.School.schoolInfo,
method: 'get',
params: {
schoolCode: schoolCode
},
// showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
let dataResult = data.result
if (dataResult != null && dataResult != undefined) {
console.log(dataResult)
state.schoolInfo = dataResult
document.title = dataResult.schoolName + '介绍|艺体志愿宝';
//
if (dataResult.schoolWebsiteAddress) {
let websiteAddressList = dataResult.schoolWebsiteAddress.split(',');
state.schoolInfo.websiteAddressList = websiteAddressList
}
//
getDoubleFirstPlan()
//
getSubjectEvaluation()
//
getArticleList()
//
setPeople()
} else {
//
router.push({
path: '/school/search'
});
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
function getDoubleFirstPlan() {
if (state.schoolInfo && state.schoolInfo.id) {
axiosInstance({
url: apiConstant.School.doubleFirstPlan,
method: 'get',
params: {
schoolId: state.schoolInfo.id
},
showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
state.doubleFirstPlan = data.result
//
if (arrayIsNotEmpty(data.result.gjjList) || arrayIsNotEmpty(data.result.sjList)) {
state.schoolInfo.tagsList.push('双万计划')
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
}
//
function getSubjectEvaluation() {
if (state.schoolInfo && state.schoolInfo.id) {
axiosInstance({
url: apiConstant.School.subjectEvaluation,
method: 'get',
params: {
schoolId: state.schoolInfo.id
},
showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
state.subjectEvaluationList = data.result
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
}
//
function getArticleList() {
axiosInstance({
url: apiConstant.Article.articlePage,
method: 'get',
params: {
type: 1,
schoolId: state.schoolInfo.id,
pageNum: 1,
pageSize: 10
},
showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
state.articleList = data.result.records
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
//
function historyMajorEnrollList() {
if (!schoolCode) {
return;
}
axiosInstance({
url: apiConstant.Major.schoolHistoryMajorEnrollList,
method: 'get',
params: {
schoolCode: schoolCode,
year: selectSchoolHistoryMajorEnrollForm.year,
pageNo: selectSchoolHistoryMajorEnrollForm.pageNo,
pageSize: selectSchoolHistoryMajorEnrollForm.pageSize
},
// showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
let dataResult = data.result
if (dataResult != null && dataResult != undefined) {
console.log(dataResult)
state.schoolHistoryMajorEnrollResult = data.result
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
//
function schoolMajorList() {
if (!schoolCode) {
return;
}
axiosInstance({
url: apiConstant.Major.schoolMajorList,
method: 'get',
params: {
schoolCode: schoolCode,
majorName: selectMajorForm.majorName,
cognitioPolyclinic:state.scoreInfo.cognitioPolyclinic
},
// showLoading: false,//
}).then((response: AxiosResponse) => {
return response?.data
}).then((data) => {
if (data.success) {
let dataResult = data.result
if (dataResult != null && dataResult != undefined) {
console.log(dataResult)
state.majorResult.records = data.result
}
}
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
const handleHistoryMajorEnrollPage = (page: number) => {
if (page) {
selectSchoolHistoryMajorEnrollForm.pageNo = page
historyMajorEnrollList()
}
}
const handleMajorPage = (page: number) => {
if (page) {
selectMajorForm.pageNo = page
schoolMajorList()
}
}
const getYear = (time: string) => {
if (isNotNull(time)) {
return time.split("-")[0]
}
}
//
function showMajorInfo(majorCode: string) {
window.open('/major/' + majorCode, '_self')
}
//
function showArticle(e: any) {
window.open('/article/' + e.id, '_self')
}
//
function showArticleMore() {
window.open('/article/search', '_self')
}
//
function setPeople() {
let femaleRatio = state.schoolInfo.femaleRatio
let maleRatio = state.schoolInfo.maleRatio
if (chartRef.value && echarts &&
(femaleRatio &&
maleRatio)) {
const myChart = echarts.init(chartRef.value);
const option = {
title: {
text: '男女比例',
left: 'right'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
type: 'pie',
radius: '60%',
data: [
{ value: femaleRatio, name: '男' },
{ value: maleRatio, name: '女' }
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
tooltip: {
trigger: 'item',
//formatter: '{a} <br/>{b}: {c} ({d}%)'
formatter: '{b}: {d}%'
}
}
]
};
//
myChart.setOption(option as any);
}
}
function arrayIsNotEmpty(sjList: any): any {
return sjList && sjList.length > 0;
}
</script>
<style scoped lang="scss">
.relative_box {
border-radius: 5px 5px 0 0;
height: 280px;
background: linear-gradient(131deg, rgb(52, 142, 250) 0%, rgb(122, 182, 249) 100%);
color: #fff;
.slogo {
border-radius: 30px;
background: #fff;
padding: 13px;
width: 160px;
height: 160px;
}
//
.sname {
flex-wrap: wrap;
width: 50%;
font-size: 25px;
color: white;
}
//
.el-text {
color: white;
}
//
.stags {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.stags .stag {
padding: 5px 10px;
border: 1px solid white;
min-width: 80px;
text-align: center;
border-radius: 15px;
}
}
/*专业列表*/
.majorList {
//
:deep(.el-table__header .el-table__cell) {
background: #fafafa;
text-align: center;
color: #000;
font-family: "Microsoft YaHei";
font-weight: 600;
}
//
:deep(.el-table__body .el-table__cell) {
text-align: center;
}
}
.jbxx {
.block-icon {
display: inline-block;
width: 18px;
height: 18px;
margin-right: 15px;
position: relative;
background-size: 100% 100% !important;
}
.float_left {
float: left;
}
.other-line {
margin: 0 30px 30px 0;
}
.other-line:last-child {
margin: 0;
}
}
img {
border: 0;
vertical-align: top;
}
* {
font-family: "Microsoft YaHei";
}
/*科研教学 box start */
.schoolResearchTeachingBox {
.item {
text-align: center;
padding: 10px 15px;
background-color: white;
//
.num {
font-size: 20px;
font-weight: 600;
color: $color-blue-60;
}
.ming {
font-size: 14px
}
//
.text {
color: #666;
font-size: 15px;
}
}
}
/*科研教学 box end */
/*国家级一流专业 start */
.gjjylzy {
padding: 10px;
.item {
cursor: pointer;
padding: 10px 0;
line-height: 20px;
border-bottom: 1px solid #e4e7ed;
}
.item:hover {
color: $color-blue-60;
}
.item-last {
border-bottom: none;
}
.item-right {
color: $color-blue-60;
float: right;
}
}
/*国家级一流专业 end */
/*第四轮学科评估 start */
.dslxkpg {
padding: 10px;
.item {
cursor: pointer;
padding: 10px 0;
line-height: 20px;
border-bottom: 1px solid #e4e7ed;
}
.item-last {
border-bottom: none;
}
.item-right {
float: right;
}
}
/*第四轮学科评估 end */
//
.showMore {
font-size: 15px;
line-height: 30px;
cursor: pointer;
color: $color-blue-60;
float: right;
margin: 0 0 0 auto;
}
</style>

View File

@ -1,46 +1,224 @@
<template>
<LeftNav />
<div class="main-container wrap main-fullScreen main-div" style="height: unset;background-color: white;">
<div class="filterTable">
<div class="filterTitle flexWrap">
<div class="flex-item-75">
<div class="searchSchool">
<el-input v-model="state.selectForm.schoolName" maxlength="24" show-word-limit
style="max-width: 230px;height: 40px;line-height: 40px;" placeholder="请输入院校或专业名称"
class="input-with-select" />
<el-button :icon="Search" @click="reloadSchoolList"
style="border-left: none;height: 40px;line-height: 40px;" />
</div>
</div>
</div>
<div class="filterBody">
<div class="flexWrap">
<div class="flex-item-1">就读地域</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.selectForm.addressList.length === 0 ? 'tag-active' : ''"
@click="checkboxAddress('')">不限</span>
<span class="tag" :class="state.selectForm.addressList.includes(item.code) ? 'tag-active' : ''"
v-for="(item, index) in state.addressList" :key="index" @click="checkboxAddress(item.code)">
{{ item.name }}
</span>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">院校标签</div>
<div class="flex-item-9 tags">
<span class="tag" :class="state.selectForm.tagsList.length === 0 ? 'tag-active' : ''"
@click="checkboxSchoolTags('')">不限</span>
<span class="tag" :class="state.selectForm.tagsList.includes(item.code) ? 'tag-active' : ''"
v-for="(item, index) in state.tagsList" :key="index" @click="checkboxSchoolTags(item.code)">
{{ item.name }}
</span>
</div>
</div>
<div class="flexWrap">
<div class="flex-item-1">办学类型</div>
<div class="flex-item-9 tags">
<span class="tag"
:class="state.selectForm.schoolNatureList && state.selectForm.schoolNatureList.length === 0 ? 'tag-active' : ''"
@click="checkboxSchoolNature('')">不限</span>
<span class="tag" :class="state.selectForm.schoolNatureList.includes(item.code) ? 'tag-active' : ''"
v-for="(item, index) in state.schoolNatureList" :key="index" @click="checkboxSchoolNature(item.code)">
{{ item.name }}
</span>
</div>
</div>
<div class="border-b"></div>
<div class="flexWrap">
<span class="clearFilterButton" @click="clearFilter">重置已选</span>
</div>
</div>
</div>
<div class="pd-15">
<el-row :gutter="20">
<!-- 左侧 院校列表-->
<el-col :xs="12" :sm="12">
<!--clearable-->
<div style="border: 1px solid #eee" class="pd-5">
<div class="schoolList">
<div class="schoolItem" v-for="(item, index) in state.schoolList" :key="index">
<div class="flexWrap">
<div class="flex-item-15 left" @click="showSchoolInfo(item.schoolCode)">
<img :src="item.schoolIcon" :alt="item.schoolName"
style="width: 80px;height: 80px;border-radius: 50%;margin: auto;" />
</div>
<div class="flex-item-8 right">
<div class="flexWrap" style="line-height: 30px;" @click="showSchoolInfo(item.schoolCode)">
<span class="schoolName"
:class="state.testCulturalSchoolCode === item.schoolCode ? 'schoolName-active' : ''">
{{ item.schoolName }}
</span>
<span class="province" v-if="item.province">{{ item.province }}{{ item.city }}{{
item.area }}</span>
</div>
<div class="flexWrap">
<div class="tags">
<span class="tag" v-for="(tag, i) in item.tagsList" :key="i">
{{ tag }}
</span>
</div>
<div class="" style="margin: 0 0 0 auto;z-index: 99;">
<el-button text bg type="primary" @click="handleClickTestCultural(item.schoolCode)">测文化</el-button>
</div>
</div>
</div>
</div>
</div>
</div>
<el-skeleton :loading="state.loading" style="padding-top: 25px;"></el-skeleton>
<div class="page pd-15">
<el-pagination small background @current-change="handlePage" :current-page="state.selectForm.current"
:page-size="state.size" :total="state.total" layout="total, prev, pager, next" />
<!-- jumper -->
</div>
</div>
</el-col>
<!-- 右侧 功能广告-->
<el-col :xs="12" :sm="12">
<div style="border: 1px solid #eee" v-if="state.schoolMajorList && state.schoolMajorList.length>0 && state.testCulturalSchoolCode">
<div class="majorList pd-0-15">
<div class="majorItem" v-for="(major, index) in state.schoolMajorList" :key="index">
<div class="flexWrap">
<div class="flex-item-8">
<div class="flexWrap majorName" :class="state.testCulturalMajorIndex===index+1?'active-blue':''">{{ major.majorName }}</div>
<div class="flexWrap">
<div class="mr-10">{{ major.batch }}</div>
<div class="mr-10">{{ major.category }}</div>
<div v-if="major.detail">
{{major.detail }}
</div>
</div>
</div>
<div class="flex-item-1" style="height: 50px;line-height: 50px;">
<div class="" style="margin:0 5px 0 auto">
<el-button type="primary" @click="handleClickTestCulturalMajor(major,(index+1))">查看</el-button>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="border: 1px solid #eee" v-show="state.testCulturalMajor && state.testCulturalMajor.majorName" class="trans3 mt-10 pd-15">
<div class="csTitle">测算结果</div>
<div class="csScore">
<span v-if="state.testCulturalMajor && state.testCulturalMajor.needScore && state.testCulturalMajor.needScore!==0">
当前需要超过{{ state.testCulturalMajor.needScore }}
</span>
<span v-else-if="state.testCulturalMajor.rulesEnrollProbability==='专过文排'">
文化分需超过{{ state.testCulturalMajor.score }}
</span>
<span v-else-if="state.testCulturalMajor.rulesEnrollProbability==='文过专排' || state.testCulturalMajor.rulesEnrollProbability==='文过专排主科'">
专业分需超过{{ state.testCulturalMajor.score }}
</span>
<span v-else>
文化分和专业分需要超过{{ state.testCulturalMajor.score }}
</span>
</div>
<div class="csHistory">
<div>{{ state.testCulturalMajor.year }}河南文化分控线为 <span class="score">{{state.testCulturalMajor.culturalScore}}</span></div>
<div>{{ state.testCulturalMajor.year }}河南专业分控线为 <span class="score">{{state.testCulturalMajor.specialScore}}</span></div>
</div>
<div class="border-t mt-10 mb-10"></div>
<div class="csLqfs">
<div class="title">录取方式</div>
<span class="detail">{{ state.testCulturalMajor.rulesEnrollProbability || '未知' }}</span>
<div class="title">院校限制</div>
<span class="detail">{{ state.testCulturalMajor.limitation||'暂无' }}</span>
</div>
</div>
<div class="textCenter" v-show="!state.testCulturalSchoolCode">
<span>选择院校点击测文化即可查看专业</span>
</div>
</el-col>
</el-row>
</div>
</div>
</template>
<script setup lang="ts">
import StaticConstant from "@/utils/StaticConstant";
document.title = '全国大学名单|排名排行榜';
import {ComponentInternalInstance, getCurrentInstance, reactive, ref} from 'vue'
import type {TabsPaneContext} from 'element-plus'
import { reactive } from 'vue'
import apiConstant from "@/utils/ApiConstant";
import {AxiosResponse} from "axios";
import {SchoolEntity} from "@/types";
const {proxy} = getCurrentInstance() as ComponentInternalInstance;
const selectForm = ref({
schoolName: '',
addressList: [],
institutionType: "",
schoolType: "",
tagsList: [],
pageNum: 1,
pageSize: 10,
})
import axiosInstance from '@/utils/http';
import { SchoolEntity } from "@/types";
import { Search } from '@element-plus/icons-vue';
import LeftNav from "@/components/LeftNav.vue";
import StaticConstant from '@/utils/StaticConstant';
import { getTestCultural } from '@/axios/major/MajorApi';
document.title = '找大学|艺体志愿宝';
//tabs
const activeTabsName = ref('yxk')
const state = reactive({
selectForm: {
schoolName: '',
addressList: [] as any,
kyjxList: [] as any,
tagsList: [] as any,
schoolNatureList: [] as any,
current: 1,
pageSize: 10,
} as any,
schoolList: [] as Array<SchoolEntity>,
size: 10,
total: 0,
current: 1,
loading: false,//? true /false
testCulturalMajor:{} as any,
testCulturalMajorIndex:null as any,//
testCulturalSchoolCode: '',//
addressList: [...StaticConstant.addressList] as any,//
kyjxList: ['硕士点', '博士点', '保研'] as Array<string>,//
rulesEnrollProbabilityList: [] as Array<any>,//
tagsList: StaticConstant.tagsList as Array<any>,//
schoolNatureList: [...StaticConstant.schoolTypeList] as Array<any>,//
schoolMajorList: [] as any,//
})
schoolList()
getSchoolList()
//
function schoolList() {
function getSchoolList() {
state.loading = true;
state.schoolList = []
proxy?.$axios({
axiosInstance({
url: apiConstant.School.searchSchoolList,
method: 'get',
params: selectForm.value,
params: {
schoolName: state.selectForm.schoolName,
pageNum: state.selectForm.current,
pageSize: state.selectForm.pageSize,
addressList: state.selectForm.addressList,
tagsList: state.selectForm.tagsList,
schoolNatureList: state.selectForm.schoolNatureList
},
showLoading: false,//
}).then((response: AxiosResponse) => {
}).then((response) => {
return response?.data
}).then((data) => {
state.loading = false;
@ -60,8 +238,8 @@ function schoolList() {
}
}
state.schoolList = dataResult.records
state.size = data.result.size
state.current = data.result.current
state.selectForm.current = data.result.current
state.selectForm.pageSize = data.result.size
state.total = data.result.total
}
}).catch((error: any) => {
@ -70,247 +248,138 @@ function schoolList() {
});
}
function reloadSchoolList() {
state.selectForm.current = 1
state.schoolList = []
getSchoolList()
}
const handlePage = (page: number) => {
if (page) {
selectForm.value.pageNum = page
schoolList()
state.selectForm.current = page
getSchoolList()
}
}
//
const handleTabsClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
//
function checkboxAddress(addressCode: string) {
if (!addressCode) {
state.selectForm.addressList = []
} else if (state.selectForm.addressList.includes(addressCode)) {
state.selectForm.addressList = state.selectForm.addressList.filter((element: any) => element !== addressCode)
} else {
state.selectForm.addressList.push(addressCode)
}
reloadSchoolList()
}
//
function checkboxKyjx(kyjx: string) {
if (!kyjx) {
state.selectForm.kyjxList = []
} else if (state.selectForm.kyjxList.includes(kyjx)) {
state.selectForm.kyjxList = state.selectForm.kyjxList.filter((element: any) => element !== kyjx)
} else {
state.selectForm.kyjxList.push(kyjx)
}
reloadSchoolList()
}
//
function checkboxSchoolTags(schoolTag: string) {
if (!schoolTag) {
state.selectForm.tagsList = []
} else if (state.selectForm.tagsList.includes(schoolTag)) {
state.selectForm.tagsList = state.selectForm.tagsList.filter((element: any) => element !== schoolTag)
} else {
state.selectForm.tagsList.push(schoolTag)
}
reloadSchoolList()
}
//
function checkboxSchoolNature(schoolNature: string) {
if (!schoolNature) {
state.selectForm.schoolNatureList = []
} else if (state.selectForm.schoolNatureList.includes(schoolNature)) {
state.selectForm.schoolNatureList = state.selectForm.schoolNatureList.filter((element: any) => element !== schoolNature)
} else {
state.selectForm.schoolNatureList.push(schoolNature)
}
reloadSchoolList()
}
const showSchoolInfo = (schoolCode: string) => {
window.open(schoolCode, '_blank')
window.open(schoolCode, '_self')
}
//
const handleClickTestCultural = async (schoolCode: string) => {
state.schoolMajorList = []
state.testCulturalSchoolCode = schoolCode
state.testCulturalMajorIndex = undefined
state.testCulturalMajor = {}
const result = await getTestCultural({ schoolCode: schoolCode, year: '2023' });
state.schoolMajorList = result
}
//
const handleClickTestCulturalMajor = (major:any,index:number)=>{
state.testCulturalMajorIndex = index
state.testCulturalMajor = major
}
//
function clearFilter() {
state.selectForm.schoolName = ''
state.selectForm.addressList = []
state.selectForm.tagsList = []
state.selectForm.schoolNatureList = []
reloadSchoolList()
}
</script>
<template>
<div class="main-container wrap main-fullScreen main-div" style="height: unset;">
<el-row :gutter="20">
<!-- 左侧 院校列表-->
<el-col :xs="17" :sm="17">
<el-card class="box-card">
<el-tabs v-model="activeTabsName" class="demo-tabs" @tab-click="handleTabsClick">
<el-tab-pane label="院校库" name="yxk">
<el-form :inline="true" :model="selectForm" class="demo-form-inline">
<el-form-item :inline="true">
<el-input style="width: 70%" :input-style="{background:'none !important'}"
v-model="selectForm.schoolName" class="w-50 m-2 input-border-style"
size="large" placeholder="输入院校名称"/>
<el-button size="large" type="primary" style="margin-left: 5px" plain @click="schoolList">搜索
</el-button>
</el-form-item>
<el-form-item label="院校所属">
<el-checkbox-group v-model="selectForm.addressList" @change="schoolList">
<el-checkbox v-for="item in StaticConstant.addressList" :label="item.code" name="address">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="院校类型">
<el-radio-group v-model="selectForm.institutionType" @change="schoolList">
<el-radio label="" name="address">不限</el-radio>
<el-radio v-for="item in StaticConstant.institutionTypeList" :label="item.code" name="institutionType">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="办学类型">
<el-radio-group v-model="selectForm.schoolType" @change="schoolList">
<el-radio label="" name="schoolType">不限</el-radio>
<el-radio v-for="item in StaticConstant.schoolTypeList" :label="item.code" name="schoolType">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="院校特色">
<el-checkbox-group v-model="selectForm.tagsList" @change="schoolList">
<el-checkbox v-for="item in StaticConstant.tagsList" :label="item.code" name="tags">{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<el-divider />
<!--clearable-->
<div class="schoolList">
<div class="schoolItem" v-for="item in state.schoolList" @click="showSchoolInfo(item.schoolCode)">
<div class="schoolLogo">
<img :src="item.schoolIcon" v-if="item.schoolIcon!=null && item.schoolIcon!=undefined"/>
<img v-else src="@/assets/images/school/school_default.png">
</div>
<div class="schoolInfo">
<div class="schoolTitle">
<h3 class="schoolName">
{{ item.schoolName }}
<span class="province"
v-if="item.province">{{ item.province }}{{ item.city }}{{ item.area }}</span>
</h3>
</div>
<div class="schoolTags">
<span v-for="tag in item.tagsList">{{ tag }}</span>
</div>
</div>
</div>
</div>
<el-skeleton :loading="state.loading" style="padding-top: 25px;"></el-skeleton>
<div class="page">
<el-pagination background @current-change="handlePage" :current-page="state.current"
:page-size="state.size" :total="state.total"
layout="total, prev, pager, next,jumper"/>
</div>
</el-tab-pane>
<!-- <el-tab-pane label="分数榜" name="fsb">Config</el-tab-pane>-->
</el-tabs>
</el-card>
</el-col>
<!-- 右侧 功能广告-->
<el-col :xs="7" :sm="7">
<div class="page-right" style="width: 300px">
<a><!--@click="router.push({path: '/school/search'})"-->
<img src="@/assets/images/pyxz.png" height="130" width="300">
</a>
<Mngk/>
</div>
</el-col>
</el-row>
</div>
</template>
<style scoped lang="scss">
//
.demo-tabs > .el-tabs__content {
padding: 32px;
color: #6b778c;
font-size: 32px;
font-weight: 600;
.schoolName {
padding-top: 0 !important;
}
//
/** 默认样式 */
.input-border-style {
border: 1px solid #eee !important;
border-radius: 6px !important;
.province {
height: 26px;
line-height: 24px;
font-size: 12px;
border: 1px solid #eee;
color: #555;
display: inline-block;
padding: 0 10px;
margin: 0 20px 0 15px;
}
:deep(.el-input__wrapper) {
background: none !important;
}
</style>
<!--学校列表-->
<style scoped lang="scss">
.schoolList {
.schoolItem:hover {
color: #3491FA
}
.schoolItem:last-child {
border-bottom: none;
}
.schoolItem {
display: flex;
justify-content: flex-start;
align-items: center;
padding: 20px;
cursor: pointer;
border-bottom: 1px solid #eee;
position: relative;
.schoolLogo {
margin-right: 20px;
img {
width: 60px;
height: 60px;
}
}
.schoolInfo {
.schoolTitle {
margin-bottom: 18px;
.schoolName {
color: #333;
font-size: 18px;
height: 25px;
line-height: 25px;
margin: 0 20px 0 0;
transition: all .3s;
display: flex;
align-items: center;
.province {
height: 26px;
line-height: 24px;
font-size: 12px;
border: 1px solid #eee;
color: #555;
display: inline-block;
padding: 0 10px;
margin: 0 20px 0 15px;
}
}
.schoolName:hover {
color: #3491FA
}
}
.schoolTags {
span {
display: inline-block;
color: #555;
padding-right: 10px;
margin-right: 10px;
border-right: 1px solid #c5c5c5;
line-height: 15px;
}
span:last-child {
border: none;
}
}
}
}
}
.page-right {
.box-card {
border-radius: 12px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
color: red;
}
:deep(.el-card__header) {
padding: 6px 12px 12px 12px;
background-color: #4cc8ff;
height: 30px;
span {
width: 100px;
height: 16px;
background-size: cover;
background-image: url(data:image/png;base64,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);
}
}
.item {
border-radius: 12px;
}
:deep(.el-card__body) {
padding: 0;
}
// start
.csTitle{
padding: 10px 0;
font-size: 20px;
text-align: center;
color: $color-blue-60;
}
.csScore{
padding: 10px 0;
text-align: center;
color:$color-black-60;
}
.csHistory{
text-align: center;
color:$color-black-60;
.score{
font-weight: 600;
color:$color-blue-50;
}
}
//
.csLqfs{
.title{
color:$color-black-60;
}
.detail{
font-weight: 600;
color:$color-blue-50;
}
}
// end
</style>

View File

@ -0,0 +1,207 @@
<template>
<div>
<el-table :data="state.tableData" style="width: 100%" height="500">
<el-table-column label="志愿表名称" width="230" align="center">
<template #default="scope">
<div class="top-align flexWrap">
<span class="font-size-16 fw-6 black1 main-container">{{ scope.row.volunteer.volunteerName }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="成绩信息" align="center">
<template #default="scope">
<div class="top-align">
<div class="flexWrap">
<div class="main-container">
<span>{{ scope.row.scoreInfo.professionalCategory }}/{{ scope.row.scoreInfo.cognitioPolyclinic }}</span>
<span v-if="scope.row.scoreInfo.professionalCategoryChildren">/{{ scope.row.scoreInfo.professionalCategoryChildren }}</span>
</div>
</div>
<div class="mt-5 flexWrap">
<div class="main-container">
<span>文化分·{{ scope.row.scoreInfo.culturalScore }}&nbsp;統考分·{{ scope.row.scoreInfo.professionalScore }}</span>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="创建时间" width="180" align="center">
<template #default="scope">
<div class="top-align flexWrap">
<div class="main-container">
<span>{{ scope.row.volunteer.createTime }}</span>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="志愿表状态" width="180" align="center">
<template #default="scope">
<div class="top-align flexWrap">
<div class="main-container">
<el-tag v-if="scope.row.volunteer.state==='1'">当前</el-tag>
<el-tag v-else type="info"></el-tag>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="操作" width="180" align="center">
<template #default="scope">
<div class="top-align flexWrap">
<div class="main-container" v-if="scope.row.volunteer.state!=='1'">
<el-popconfirm
confirm-button-text="确定"
cancel-button-text="取消"
:icon="InfoFilled"
icon-color="#626AEF"
title="确定使用该志愿吗?"
@confirm="switchVolunteer(scope.row.volunteer.id)"
>
<template #reference>
<el-button size="small">使用</el-button>
</template>
</el-popconfirm>
<el-popconfirm
confirm-button-text="确定"
cancel-button-text="取消"
:icon="InfoFilled"
icon-color="#626AEF"
title="确定删除该次志愿吗?"
@confirm="deleteVolunteer(scope.row.volunteer.id)"
>
<template #reference>
<el-button size="small" type="danger" align="center">删除</el-button>
</template>
</el-popconfirm>
</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
<!-- <el-button @click="returnClick">回调事件</el-button> -->
</template>
<script lang="ts" setup>
import bus from "@/store/eventBus";
import { onMounted, reactive } from 'vue';
import { ElMessage } from 'element-plus';
import ApiConstant from '@/utils/ApiConstant';
import StaticConstant from '@/utils/StaticConstant';
import {InfoFilled,Search,Edit} from '@element-plus/icons-vue';
import { getScore } from "@/axios/api";
import axiosInstance from '@/utils/http';
const state = reactive({
tableData: [] as any
})
onMounted(() => {
getVolunteerList()
})
function getVolunteerList() {
axiosInstance({
url: ApiConstant.Score.scoreList,
method: 'get',
params: {},
// showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if (!data.success) {
ElMessage.error(data.message);
return false
}
state.tableData = data.result
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
//
function switchVolunteer(volunteerId:string) {
axiosInstance({
url: ApiConstant.Volunteer.switchVolunteer,
method: 'post',
data: {id: volunteerId},
// showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if (!data.success) {
ElMessage.error(data.message);
return false
}
getScore()
//
ElMessage.success("操作成功");
//
setTimeout(function(){
window.location.reload()
}, 800);
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
//
function deleteVolunteer(volunteerId:string){
axiosInstance({
url: ApiConstant.Volunteer.volunteerDelete,
method: 'delete',
params: {id: volunteerId},
// showLoading: false,//
}).then((response) => {
return response.data
}).then((data) => {
if (!data.success) {
ElMessage.error(data.message);
return false
}
//
ElMessage.success("操作成功");
//
getVolunteerList()
}).catch((error: any) => {
console.log(error);
}).finally(() => {
});
}
function returnClick() {
bus.emit("closeOtherVolunteerChange" as any, sessionStorage.getItem("cityName"));//
}
</script>
<style lang="scss" scoped>
:deep(.cell) {
padding: 10px 15px;
}
:deep(.el-table__body) {
.cell {
min-height: 0 !important;
padding: 0;
}
.el-table__cell {
padding: 0;
}
}
:deep(.el-table) {
thead {
color: black;
th {
font-weight: 500;
}
}
th.el-table__cell {
background-color: #edeff7;
}
}
.top-align {
padding: 10px 15px;
vertical-align: top;
/* 设置内容顶部对齐 */
}
</style>

1
test.txt Normal file
View File

@ -0,0 +1 @@
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36npm

View File

@ -3,6 +3,7 @@ import vue from "@vitejs/plugin-vue";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
import path from 'path'
export default defineConfig({
@ -15,6 +16,12 @@ export default defineConfig({
Components({
resolvers: [ElementPlusResolver()],
}),
createSvgIconsPlugin({
// 指定需要缓存的图标文件夹
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
// 指定symbolId格式
symbolId: 'icon-[dir]-[name]'
})
],
server: {
host: "0.0.0.0", // 监听所有地址(局域网和公网)
@ -28,7 +35,7 @@ export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `@use "@/assets/css/base.css" as *;@use "@/assets/css/global.scss" as *;` //加载各模块样式
additionalData: `@use "@/assets/css/_global.scss" as *;@use "@/assets/css/my-color.scss" as *;@use "@/assets/css/base.scss" as *;@use "@/assets/css/common.scss" as *;` //加载各模块样式
},
}
},

View File

@ -0,0 +1,44 @@
// vite.config.ts
import { defineConfig } from "file:///D:/workspace_3/yitisheng/yitisheng-new-web/node_modules/.pnpm/vite@3.2.10_@types+node@20.12.7_less@4.2.0_sass@1.75.0/node_modules/vite/dist/node/index.js";
import vue from "file:///D:/workspace_3/yitisheng/yitisheng-new-web/node_modules/.pnpm/@vitejs+plugin-vue@3.2.0_vite@3.2.10_@types+node@20.12.7_less@4.2.0_sass@1.75.0__vue@3.4.23/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import AutoImport from "file:///D:/workspace_3/yitisheng/yitisheng-new-web/node_modules/.pnpm/unplugin-auto-import@0.11.5_@vueuse+core@9.13.0_vue@3.4.23__rollup@2.79.1/node_modules/unplugin-auto-import/dist/vite.js";
import Components from "file:///D:/workspace_3/yitisheng/yitisheng-new-web/node_modules/.pnpm/unplugin-vue-components@0.22.12_@babel+parser@7.24.4_rollup@2.79.1_vue@3.4.23/node_modules/unplugin-vue-components/dist/vite.mjs";
import { ElementPlusResolver } from "file:///D:/workspace_3/yitisheng/yitisheng-new-web/node_modules/.pnpm/unplugin-vue-components@0.22.12_@babel+parser@7.24.4_rollup@2.79.1_vue@3.4.23/node_modules/unplugin-vue-components/dist/resolvers.mjs";
import { createSvgIconsPlugin } from "file:///D:/workspace_3/yitisheng/yitisheng-new-web/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_vite@3.2.10_@types+node@20.12.7_less@4.2.0_sass@1.75.0_/node_modules/vite-plugin-svg-icons/dist/index.mjs";
import path from "path";
var __vite_injected_original_dirname = "D:\\workspace_3\\yitisheng\\yitisheng-new-web";
var vite_config_default = defineConfig({
plugins: [
vue(),
AutoImport({
resolvers: [ElementPlusResolver()]
}),
Components({
resolvers: [ElementPlusResolver()]
}),
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), "src/assets/icons/svg")],
symbolId: "icon-[dir]-[name]"
})
],
server: {
host: "0.0.0.0",
port: 5e3
},
resolve: {
alias: {
"@": path.resolve(__vite_injected_original_dirname, "src")
}
},
css: {
preprocessorOptions: {
scss: {
additionalData: `@use "@/assets/css/_global.scss" as *;@use "@/assets/css/my-color.scss" as *;@use "@/assets/css/base.scss" as *;@use "@/assets/css/common.scss" as *;`
}
}
}
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFx3b3Jrc3BhY2VfM1xcXFx5aXRpc2hlbmdcXFxceWl0aXNoZW5nLW5ldy13ZWJcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkQ6XFxcXHdvcmtzcGFjZV8zXFxcXHlpdGlzaGVuZ1xcXFx5aXRpc2hlbmctbmV3LXdlYlxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovd29ya3NwYWNlXzMveWl0aXNoZW5nL3lpdGlzaGVuZy1uZXctd2ViL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB2dWUgZnJvbSBcIkB2aXRlanMvcGx1Z2luLXZ1ZVwiO1xuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSBcInVucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGVcIjtcbmltcG9ydCBDb21wb25lbnRzIGZyb20gXCJ1bnBsdWdpbi12dWUtY29tcG9uZW50cy92aXRlXCI7XG5pbXBvcnQgeyBFbGVtZW50UGx1c1Jlc29sdmVyIH0gZnJvbSBcInVucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3Jlc29sdmVyc1wiO1xuaW1wb3J0IHsgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1zdmctaWNvbnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcGx1Z2luczogW1xuICAgIHZ1ZSgpLFxuICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NUVsZW1lbnQgUGx1c1xuICAgIEF1dG9JbXBvcnQoe1xuICAgICAgcmVzb2x2ZXJzOiBbRWxlbWVudFBsdXNSZXNvbHZlcigpXSxcbiAgICB9KSxcbiAgICBDb21wb25lbnRzKHtcbiAgICAgIHJlc29sdmVyczogW0VsZW1lbnRQbHVzUmVzb2x2ZXIoKV0sXG4gICAgfSksXG4gICAgY3JlYXRlU3ZnSWNvbnNQbHVnaW4oe1xuICAgICAgLy8gXHU2MzA3XHU1QjlBXHU5NzAwXHU4OTgxXHU3RjEzXHU1QjU4XHU3Njg0XHU1NkZFXHU2ODA3XHU2NTg3XHU0RUY2XHU1OTM5XG4gICAgICBpY29uRGlyczogW3BhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnc3JjL2Fzc2V0cy9pY29ucy9zdmcnKV0sXG4gICAgICAvLyBcdTYzMDdcdTVCOUFzeW1ib2xJZFx1NjgzQ1x1NUYwRlxuICAgICAgc3ltYm9sSWQ6ICdpY29uLVtkaXJdLVtuYW1lXSdcbiAgICB9KVxuICBdLFxuICBzZXJ2ZXI6IHtcbiAgICBob3N0OiBcIjAuMC4wLjBcIiwgLy8gXHU3NkQxXHU1NDJDXHU2MjQwXHU2NzA5XHU1NzMwXHU1NzQwXHVGRjA4XHU1QzQwXHU1N0RGXHU3RjUxXHU1NDhDXHU1MTZDXHU3RjUxXHVGRjA5XG4gICAgcG9ydDogNTAwMCwgLy8gXHU4MUVBXHU1QjlBXHU0RTQ5XHU3QUVGXHU1M0UzXHU1M0Y3XG4gIH0sXG4gIHJlc29sdmU6IHtcbiAgICBhbGlhczoge1xuICAgICAgJ0AnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnc3JjJylcbiAgICB9XG4gIH0sXG4gIGNzczoge1xuICAgIHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcbiAgICAgIHNjc3M6IHtcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IGBAdXNlIFwiQC9hc3NldHMvY3NzL19nbG9iYWwuc2Nzc1wiIGFzICo7QHVzZSBcIkAvYXNzZXRzL2Nzcy9teS1jb2xvci5zY3NzXCIgYXMgKjtAdXNlIFwiQC9hc3NldHMvY3NzL2Jhc2Uuc2Nzc1wiIGFzICo7QHVzZSBcIkAvYXNzZXRzL2Nzcy9jb21tb24uc2Nzc1wiIGFzICo7YCAvL1x1NTJBMFx1OEY3RFx1NTQwNFx1NkEyMVx1NTc1N1x1NjgzN1x1NUYwRlxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBd1QsU0FBUyxvQkFBb0I7QUFDclYsT0FBTyxTQUFTO0FBQ2hCLE9BQU8sZ0JBQWdCO0FBQ3ZCLE9BQU8sZ0JBQWdCO0FBQ3ZCLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsNEJBQTRCO0FBQ3JDLE9BQU8sVUFBVTtBQU5qQixJQUFNLG1DQUFtQztBQVF6QyxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixTQUFTO0FBQUEsSUFDUCxJQUFJO0FBQUEsSUFFSixXQUFXO0FBQUEsTUFDVCxXQUFXLENBQUMsb0JBQW9CLENBQUM7QUFBQSxJQUNuQyxDQUFDO0FBQUEsSUFDRCxXQUFXO0FBQUEsTUFDVCxXQUFXLENBQUMsb0JBQW9CLENBQUM7QUFBQSxJQUNuQyxDQUFDO0FBQUEsSUFDRCxxQkFBcUI7QUFBQSxNQUVuQixVQUFVLENBQUMsS0FBSyxRQUFRLFFBQVEsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0FBQUEsTUFFOUQsVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUNBLFFBQVE7QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUEsTUFDTCxLQUFLLEtBQUssUUFBUSxrQ0FBVyxLQUFLO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBQUEsRUFDQSxLQUFLO0FBQUEsSUFDSCxxQkFBcUI7QUFBQSxNQUNuQixNQUFNO0FBQUEsUUFDSixnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K