b42d99dc by 杨炀

add: 个人中心-机构-个人信息

1 parent 86c06939
...@@ -72,7 +72,16 @@ export function getCodeImg() { ...@@ -72,7 +72,16 @@ export function getCodeImg() {
72 timeout: 20000 72 timeout: 20000
73 }) 73 })
74 } 74 }
75 75 export function forgetPassword(data) {
76 return request({
77 url: '/forgetPassword',
78 headers: {
79 isToken: false
80 },
81 method: 'post',
82 data: data
83 })
84 }
76 // 代退图形认证的获取手机验证码 85 // 代退图形认证的获取手机验证码
77 export function captchaSmsWithCaptchaImage(data) { 86 export function captchaSmsWithCaptchaImage(data) {
78 return request({ 87 return request({
......
...@@ -93,9 +93,9 @@ export function getMyGroupList() { ...@@ -93,9 +93,9 @@ export function getMyGroupList() {
93 } 93 }
94 94
95 // 根据Id获取我的团队 95 // 根据Id获取我的团队
96 export function getGroupById(groupId) { 96 export function getGroupInfo() {
97 return request({ 97 return request({
98 url: `ztx-match/league/group/getMyGroup/${groupId}`, 98 url: `/league/group/getMyGroup`,
99 method: 'get' 99 method: 'get'
100 }) 100 })
101 } 101 }
...@@ -110,7 +110,7 @@ export function regionsList() { ...@@ -110,7 +110,7 @@ export function regionsList() {
110 // 新建团队 110 // 新建团队
111 export function saveMyGroup(data) { 111 export function saveMyGroup(data) {
112 return request({ 112 return request({
113 url: `ztx-match/league/group/saveMyGroup`, 113 url: `/league/group/saveMyGroup`,
114 method: 'post', 114 method: 'post',
115 data: data 115 data: data
116 }) 116 })
......
...@@ -221,3 +221,32 @@ aside { ...@@ -221,3 +221,32 @@ aside {
221 .pt30{padding-top: 30px;} 221 .pt30{padding-top: 30px;}
222 .d-form-border{ 222 .d-form-border{
223 border: 1px solid #E5E5E5;margin: 20px 0;padding: 20px} 223 border: 1px solid #E5E5E5;margin: 20px 0;padding: 20px}
224
225
226 .dlbox{background: url("@/assets/dance/ds_bg.png") no-repeat left;background-size: 100% 100%;
227 padding: 0 0 20px;margin: 0 0 20px;
228 dl{height: 120px;margin: 0;
229 dt{
230 height: 30px;
231 font-size: 16px;margin: 0 0 18px;
232 font-weight: 600;line-height: 30px;display: inline-block;padding:0 20px 0 14px;
233 background: linear-gradient(90deg, #8623FC, #453DEA);
234 border-radius: 0px 0px 15px 0px;color: #fff;}
235 }
236 dd{
237 font-size: 14px;line-height: 1.6;
238 color: #29343C;}
239 }
240 .xzbox{border: 2px solid #DDECFB;padding: 20px;line-height: 2;
241 color: #29343C;
242 font-size: 16px;}
243 .funcBtn{width: 100%;cursor: pointer;
244 background:url("@/assets/dance/funcBg.png") no-repeat left;
245 background-size: cover;
246 border-radius: 16px;box-shadow:var(--el-box-shadow-light);
247 text-align: center;position: relative;
248 margin: 24px 0 24px;padding: 0 0 1px;
249 img{margin: auto;position: relative;top: -20px}
250 h4{font-size: 18px;margin-top: -10px;}
251 &:hover{box-shadow:var(--el-box-shadow-dark);}
252 }
......
...@@ -486,10 +486,16 @@ export const constantRoutes = [ ...@@ -486,10 +486,16 @@ export const constantRoutes = [
486 meta: { title: '个人中心' } 486 meta: { title: '个人中心' }
487 }, 487 },
488 { 488 {
489 path: 'myTeam', 489 path: 'myPassword',
490 component: () => import('@/viewsPc/center/teamInfo'), 490 component: () => import('@/viewsPc/center/myPassword'),
491 name: 'myTeam', 491 name: 'myPassword',
492 meta: { title: '我的团队' } 492 meta: { title: '修改密码' }
493 },
494 {
495 path: 'myCertification',
496 component: () => import('@/viewsPc/center/myCertification'),
497 name: 'myCertification',
498 meta: { title: '团队认证' }
493 }, 499 },
494 { 500 {
495 path: 'myMatch', 501 path: 'myMatch',
......
...@@ -126,7 +126,7 @@ service.interceptors.response.use( ...@@ -126,7 +126,7 @@ service.interceptors.response.use(
126 const msg = errorCode[code] || res.data.msg || errorCode['default'] 126 const msg = errorCode[code] || res.data.msg || errorCode['default']
127 // 二进制数据则直接返回 127 // 二进制数据则直接返回
128 // debugger 128 // debugger
129 129
130 if ( 130 if (
131 res.request.responseType === 'blob' || 131 res.request.responseType === 'blob' ||
132 res.request.responseType === 'arraybuffer' 132 res.request.responseType === 'arraybuffer'
......
...@@ -3,15 +3,25 @@ ...@@ -3,15 +3,25 @@
3 <div class="box"> 3 <div class="box">
4 <el-row :gutter="20"> 4 <el-row :gutter="20">
5 <el-col :span="6"> 5 <el-col :span="6">
6 <el-card class="mt30"> 6 <el-card>
7 <div class="center-menu"> 7 <div class="center-menu">
8 <!-- <el-avatar :size="100" :src="fillImgUrl(myform.avatar)" />--> 8 <ul v-if="user.utype=='2'">
9 <h3>{{ myform.nickName }}</h3>
10 <ul>
11 <li 9 <li
12 v-for="(m, i) in menus" 10 v-for="(m, i) in menus"
13 :key="i" 11 :key="i"
14 :class="{ active: m.isActive }" 12 :class="{ active: m.isActive }"
13 >
14 <a href="javascript:void(0)" @click="toInfo(m)">
15 <img :src="m.isActive ? m.picUrl2 : m.picUrl1">
16 {{ m.name }}
17 </a>
18 </li>
19 </ul>
20 <ul v-if="user.utype=='1'">
21 <li
22 v-for="(m, i) in menusPersonal"
23 :key="i"
24 :class="{ active: m.isActive }"
15 > 25 >
16 <a href="javascript:void(0)" @click="toInfo(m)"> 26 <a href="javascript:void(0)" @click="toInfo(m)">
17 <img :src="m.isActive ? m.picUrl2 : m.picUrl1"> 27 <img :src="m.isActive ? m.picUrl2 : m.picUrl1">
...@@ -24,7 +34,7 @@ ...@@ -24,7 +34,7 @@
24 34
25 </el-col> 35 </el-col>
26 <el-col :span="18"> 36 <el-col :span="18">
27 <router-view /> 37 <router-view :user="user"/>
28 </el-col> 38 </el-col>
29 </el-row> 39 </el-row>
30 </div> 40 </div>
...@@ -32,48 +42,107 @@ ...@@ -32,48 +42,107 @@
32 </template> 42 </template>
33 43
34 <script setup> 44 <script setup>
35 import { ref } from 'vue' 45 import {ref} from 'vue'
36 import { useRoute, useRouter } from 'vue-router' 46 import {useRoute, useRouter} from 'vue-router'
37 import { onMounted } from '@vue/runtime-core' 47 import {onMounted} from '@vue/runtime-core'
38 import useUserStore from '@/store/modules/user' 48 import useUserStore from '@/store/modules/user'
39 import _ from 'lodash' 49 import _ from 'lodash'
50
40 const route = useRoute() 51 const route = useRoute()
41 const router = useRouter() 52 const router = useRouter()
42 53
43 const myform = ref({}) 54 const user = ref({})
44 const menus = ref([ 55 const menus = ref([
45 { 56 {
46 name: '基础信息', 57 name: '基础信息',
47 routeName: 'myInfo', 58 routeName: 'myInfo',
48 picUrl1: '/img/tool01.png', 59 picUrl1: '/img/nav_26.png',
49 picUrl2: '/img/tool01_dwn.png', 60 picUrl2: '/img/nav_26_dwn.png',
50 isActive: false 61 isActive: false
51 }, 62 },
52 { 63 {
53 name: '修改密码', 64 name: '修改密码',
54 routeName: 'myTeam', 65 routeName: 'myPassword',
55 picUrl1: '/img/tool02.png', 66 picUrl1: '/img/nav_27.png',
56 picUrl2: '/img/tool02_dwn.png', 67 picUrl2: '/img/nav_27.png',
68 isActive: false
69 },
70 {
71 name: '团队认证',
72 routeName: 'myCertification',
73 picUrl1: '/img/nav_32.png',
74 picUrl2: '/img/nav_32_dwn.png',
57 isActive: false 75 isActive: false
58 }, 76 },
59 { 77 {
60 name: '我的赛事', 78 name: '选手管理',
61 routeName: 'myMatch', 79 routeName: 'myMatch',
62 picUrl1: '/img/tool03.png', 80 picUrl1: '/img/nav_31.png',
63 picUrl2: '/img/tool03_dwn.png', 81 picUrl2: '/img/nav_31_dwn.png',
64 isActive: false 82 isActive: false
65 }, 83 },
66 { 84 {
67 name: '我的培训', 85 name: '我的报名',
86 routeName: 'myMatch',
87 picUrl1: '/img/nav_28.png',
88 picUrl2: '/img/nav_28_dwn.png',
89 isActive: false
90 },
91 {
92 name: '我的预定',
93 routeName: 'myMatch',
94 picUrl1: '/img/nav_29.png',
95 picUrl2: '/img/nav_29_dwn.png',
96 isActive: false
97 },
98 {
99 name: '系统消息',
68 routeName: 'myTrain', 100 routeName: 'myTrain',
69 picUrl1: '/img/tool04.png', 101 picUrl1: '/img/nav_30.png',
70 picUrl2: '/img/tool04_dwn.png', 102 picUrl2: '/img/nav_30_dwn.png',
71 isActive: false 103 isActive: false
72 } 104 }
73 ]) 105 ])
106 const menusPersonal = ref([
107 {
108 name: '基础信息',
109 routeName: 'myInfo',
110 picUrl1: '/img/nav_26.png',
111 picUrl2: '/img/nav_26_dwn.png',
112 isActive: false
113 },
114 {
115 name: '修改密码',
116 routeName: 'myPassword',
117 picUrl1: '/img/nav_27.png',
118 picUrl2: '/img/nav_27.png',
119 isActive: false
120 },
121 {
122 name: '我的报名',
123 routeName: 'myMatch',
124 picUrl1: '/img/nav_28.png',
125 picUrl2: '/img/nav_28_dwn.png',
126 isActive: false
127 },
128 {
129 name: '我的预定',
130 routeName: 'myMatch',
131 picUrl1: '/img/nav_29.png',
132 picUrl2: '/img/nav_29_dwn.png',
133 isActive: false
134 },
135 {
136 name: '系统消息',
137 routeName: 'myTrain',
138 picUrl1: '/img/nav_30.png',
139 picUrl2: '/img/nav_30_dwn.png',
140 isActive: false
141 }
142 ])
74 143
75 onMounted(() => { 144 onMounted(() => {
76 myform.value = useUserStore().user || {} 145 user.value = useUserStore().user || {}
77 146
78 const currMenu = _.find(menus.value, (m) => { 147 const currMenu = _.find(menus.value, (m) => {
79 return m.routeName === route.name 148 return m.routeName === route.name
...@@ -108,19 +177,24 @@ const toInfo = (item) => { ...@@ -108,19 +177,24 @@ const toInfo = (item) => {
108 padding: 0 15px; 177 padding: 0 15px;
109 } 178 }
110 179
111 .center-menu{ 180 .center-menu {
112 text-align: center; 181 text-align: center;
113 li{margin-bottom: 15px;} 182
183 li {
184 margin-bottom: 15px;
185 }
114 } 186 }
115 li img{ 187
188 li img {
116 display: inline-block; 189 display: inline-block;
117 vertical-align:middle; 190 vertical-align: middle;
118 margin-right: 20px; 191 margin-right: 20px;
119 padding: 5px; 192 padding: 5px;
120 } 193 }
121 .active{ 194
122 color:var(--el-color-primary); 195 .active {
123 background-color: #f9e7e8; 196 color: #fff;
197 background: linear-gradient(90deg, #8623FC, #453DEA);
124 border-radius: 20px; 198 border-radius: 20px;
125 } 199 }
126 </style> 200 </style>
......
1 <template>
2 <el-card :body-style="{'padding':'0'}">
3 <div class="indexTitle"><h3 class="leftboderTT">团队认证</h3></div>
4 </el-card>
5 </template>
6
7 <script setup>
8
9 </script>
10
11 <style scoped lang="scss">
12 .indexTitle{margin: 20px 0 12px;padding: 0 20px 15px;border-bottom: 1px solid #e5e5e5;
13 h3{
14 font-size: 16px;
15 color:var(--el-color-primary);
16 }
17 }
18
19
20 </style>
1 <template> 1 <template>
2 <div class="grid-content"> 2 <div>
3 <el-tabs v-model="activeName"> 3 <el-card :body-style="{'padding':'0'}">
4 <el-tab-pane label="个人基本信息" name="first"> 4 <div class="indexTitle"><h3 class="leftboderTT">机构基础信息</h3></div>
5 <el-form ref="myformRef" :model="myform" label-width="120px"> 5 <!-- uType字段 1 是个人 2是团体-->
6 <el-row v-if="labelArr?.length>0"> 6 <!-- {{user}}-->
7 <el-col :span="14"> 7 <team-info :form="myform" v-if="user.utype=='2'"/>
8 <el-form-item label="姓名">
9 <el-input v-model="myform.realName" />
10 </el-form-item>
11 <el-form-item label="性别" prop="sex">
12 <el-radio-group v-model="myform.sex">
13 <el-radio label="0" size="large"></el-radio>
14 <el-radio label="1" size="large"></el-radio>
15 </el-radio-group>
16 </el-form-item>
17 <!-- <el-form-item label="身份标签">-->
18 <!-- <el-checkbox-group v-model="myform.labelArr" size="small">-->
19 <!-- <el-checkbox-button label="0">运动员</el-checkbox-button>-->
20 <!-- <el-checkbox-button label="1">教练</el-checkbox-button>-->
21 <!-- <el-checkbox-button label="2">领队</el-checkbox-button>-->
22 <!-- <el-checkbox-button label="4">队医</el-checkbox-button>-->
23 <!-- <el-checkbox-button label="5">翻译</el-checkbox-button>-->
24 <!-- <el-checkbox-button label="6">官员</el-checkbox-button>-->
25 <!-- <el-checkbox-button label="3">其他</el-checkbox-button>-->
26 <!-- </el-checkbox-group>-->
27 <!-- </el-form-item>-->
28 8
29 <el-form-item label="证件类型"> 9 </el-card>
30 <el-select v-model="myform.idcType" placeholder="请选择证件类型" style="width: 100%">
31 <el-option
32 v-for="item in certificates"
33 :key="item.value"
34 :label="item.label"
35 :value="item.value"
36 />
37 </el-select>
38 </el-form-item>
39 <el-form-item label="证件号码">
40 <el-input v-model="myform.idcCode" @blur="checkCode" />
41 </el-form-item>
42 <el-form-item label="出生日期">
43 <el-date-picker
44 v-model="myform.birth"
45 style="width: 100%"
46 type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
47 placeholder="请选择出生日期"
48 />
49 </el-form-item>
50 <el-form-item label="国籍" @change="changeCountryId">
51 <el-select v-model="myform.countryId" style="width: 100%" :disabled="myform.idcType==0">
52 <el-option v-for="item in countryList" :key="item.id" :label="item.name" :value="item.id" />
53 </el-select>
54 </el-form-item>
55 <el-form-item label="民族">
56 <el-select v-model="myform.nation" style="width: 100%;">
57 <el-option
58 v-for="item in nationList"
59 :key="item.name"
60 :label="item.name"
61 :value="item.name"
62 />
63 </el-select>
64 </el-form-item>
65 <el-form-item label="联系方式">
66 <el-input v-model="myform.phone" />
67 </el-form-item>
68 </el-col>
69 <el-col :span="6">
70 <el-form-item label="头像" prop="picUrl">
71 <ImageUpload v-model="myform.picUrl" :limit="1" />
72 </el-form-item>
73 </el-col>
74 </el-row>
75 <el-row v-else>
76 <el-col :span="14">
77 <!-- <el-form-item label="身份标签">-->
78 <!-- <el-checkbox-group v-model="myform.labelArr" size="small">-->
79 <!-- <el-checkbox-button label="0">运动员</el-checkbox-button>-->
80 <!-- <el-checkbox-button label="1">教练</el-checkbox-button>-->
81 <!-- <el-checkbox-button label="2">领队</el-checkbox-button>-->
82 <!-- <el-checkbox-button label="4">队医</el-checkbox-button>-->
83 <!-- <el-checkbox-button label="5">翻译</el-checkbox-button>-->
84 <!-- <el-checkbox-button label="6">官员</el-checkbox-button>-->
85 <!-- <el-checkbox-button label="3">其他</el-checkbox-button>-->
86 <!-- </el-checkbox-group>-->
87 <!-- </el-form-item>-->
88 <el-form-item label="性别" prop="sex">
89 <el-radio-group v-model="myform.sex">
90 <el-radio label="0" size="large"></el-radio>
91 <el-radio label="1" size="large"></el-radio>
92 </el-radio-group>
93 </el-form-item>
94 <el-form-item label="国籍" @change="changeCountryId">
95 <el-select v-model="myform.countryId" style="width: 100%" :disabled="myform.idcType==0">
96 <el-option v-for="item in countryList" :key="item.id" :label="item.name" :value="item.id" />
97 </el-select>
98 </el-form-item>
99 <el-form-item label="民族">
100 <el-select v-model="myform.nation" style="width: 100%;">
101 <el-option
102 v-for="item in nationList"
103 :key="item.name"
104 :label="item.name"
105 :value="item.name"
106 />
107 </el-select>
108 </el-form-item>
109 </el-col>
110 </el-row>
111 </el-form>
112 <div class="text-center">
113 <el-button type="primary" round @click="save">保存</el-button>
114 </div>
115 <el-divider />
116 <h3 style="padding: 0 20px;">所属参赛队信息</h3>
117 <el-row :gutter="20" style="padding: 0 20px">
118 <el-col v-for="(g,index) in groupList" :key="index" :span="8">
119 <div class="matchItem">
120 <div class="flex">
121 <div class="leftImg">
122 <img class="roundImg" :src="g.imgUrl" mode="aspectFill">
123 </div>
124 <div class="rightWen">
125 <div class="name">{{ g.name }}</div>
126 <div class="pp">地区:{{ g.regionStr }}
127 </div>
128 <div class="pp">类型:
129 <span>{{ g.typeStr }}</span>
130 </div>
131 </div>
132 </div>
133 <view class="bottomFunc">
134 <view class="textButtom" @click="exitGroup(g)">退出参赛队</view>
135 </view>
136 </div>
137 </el-col>
138 </el-row>
139 <el-empty v-if="groupList.length==0" description="还没有所属参赛队" />
140 10
141 </el-tab-pane>
142 </el-tabs>
143 </div> 11 </div>
144 </template> 12 </template>
145 13
...@@ -150,9 +18,18 @@ import { getCurrentInstance, onMounted } from '@vue/runtime-core' ...@@ -150,9 +18,18 @@ import { getCurrentInstance, onMounted } from '@vue/runtime-core'
150 import * as match from '@/apiPc/match' 18 import * as match from '@/apiPc/match'
151 import { ElMessage, ElMessageBox } from 'element-plus' 19 import { ElMessage, ElMessageBox } from 'element-plus'
152 import { nationList } from '@/assets/js/data' 20 import { nationList } from '@/assets/js/data'
21 import {getGroupInfo} from "@/apiPc/match";
22 import TeamInfo from "@/viewsPc/center/teamInfo";
153 23
154 const router = useRouter() 24 const router = useRouter()
155 const { proxy } = getCurrentInstance() 25 const { proxy } = getCurrentInstance()
26 const props = defineProps({
27 user:{
28 type:Object,
29 required:true
30 }
31 })
32
156 const activeName = ref('first') 33 const activeName = ref('first')
157 const myform = ref({ 34 const myform = ref({
158 idcType: 0, 35 idcType: 0,
...@@ -161,8 +38,7 @@ const myform = ref({ ...@@ -161,8 +38,7 @@ const myform = ref({
161 }) 38 })
162 const labelArr = ref([]) 39 const labelArr = ref([])
163 const groupList = ref([]) 40 const groupList = ref([])
164 const countryList = ref([]) 41
165 const regionsList = ref([])
166 const certificates = ref([ 42 const certificates = ref([
167 { 43 {
168 value: '0', 44 value: '0',
...@@ -179,27 +55,14 @@ const certificates = ref([ ...@@ -179,27 +55,14 @@ const certificates = ref([
179 ]) 55 ])
180 56
181 onMounted(() => { 57 onMounted(() => {
182 match.regionsList().then(res => {
183 regionsList.value = res.data
184 })
185 getCountryList()
186 getData() 58 getData()
187 }) 59 })
188 60
189 function getData() { 61 function getData() {
190 match.getMyPersonInfo().then(res => { 62 match.getGroupInfo().then(res => {
191 myform.value = res.data 63 myform.value = res.data
192 myform.value.labelArr = myform.value.label ? myform.value.label.split(',') : []
193 labelArr.value = myform.value.label ? myform.value.label.split(',') : []
194 groupList.value = myform.value.groups || []
195 // if (labelArr.value.length <= 0)proxy.$modal.msgError('请维护身份标签信息!')
196 }) 64 })
197 } 65 }
198 function changeCountryId() {
199 if (myform.value.countryId != 240) {
200 myform.value.nation = '其他'
201 }
202 }
203 function checkCode() { 66 function checkCode() {
204 if (myform.value.idcType == 0 && myform.value.idcCode) { 67 if (myform.value.idcType == 0 && myform.value.idcCode) {
205 if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(myform.value.idcCode))) { 68 if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(myform.value.idcCode))) {
...@@ -228,47 +91,18 @@ function checkCode() { ...@@ -228,47 +91,18 @@ function checkCode() {
228 } 91 }
229 } 92 }
230 } 93 }
231 function getCountryList() {
232 match.countryList().then(res => {
233 countryList.value = res.data
234 })
235 }
236 94
237 function save() { 95
238 myform.value.label = myform.value.labelArr.toString() 96
239 match.saveMyBaseInfo(myform.value).then(res => {
240 ElMessage({
241 message: '保存成功',
242 type: 'success'
243 })
244 getData()
245 })
246 }
247 function exitGroup(g) {
248 ElMessageBox.confirm('确定退出这个参赛队吗?', '提示', {
249 confirmButtonText: '确定',
250 cancelButtonText: '取消',
251 type: 'warning'
252 }).then(() => {
253 match.leaveGroup(g.id).then(response => {
254 ElMessage.success('操作成功')
255 getData()
256 })
257 })
258 }
259 </script> 97 </script>
260 98
261 <style scoped lang="scss"> 99 <style scoped lang="scss">
262 .app-container { 100 .indexTitle{margin: 20px 0 12px;padding: 0 20px 15px;border-bottom: 1px solid #e5e5e5;
263 background: #F5F7F9; 101 h3{
264 } 102 font-size: 16px;
265 103 color:var(--el-color-primary);
266 .grid-content { 104 }
267 background: #fff;
268 } 105 }
269 106
270 :deep(.el-tabs__nav-wrap) {
271 padding: 0 15px;
272 }
273 107
274 </style> 108 </style>
......
1 <template>
2 <div>
3 <el-card :body-style="{'padding':'0'}">
4 <div class="indexTitle"><h3 class="leftboderTT">修改密码</h3></div>
5
6 <div class="pd20">
7 <div class="d-form-border" style="margin-top: 0">
8 <el-form class="d-form" ref="pwdRef" :model="user" :rules="rules" label-width="120px"
9 style="max-width: 500px;margin: auto">
10 <el-form-item label="旧密码" prop="oldPassword">
11 <el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/>
12 </el-form-item>
13 <el-form-item label="新密码" prop="newPassword">
14 <el-input v-model="user.newPassword" placeholder="请设置8位以上大小写字母、数字、特殊符号" type="password"
15 show-password/>
16 </el-form-item>
17 <el-form-item label="确认密码" prop="confirmPassword">
18 <el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password/>
19 </el-form-item>
20
21 </el-form>
22 </div>
23 <el-row justify="center">
24 <el-button type="primary" class="btn-lineG" @click="submit">保存</el-button>
25 </el-row>
26 </div>
27 </el-card>
28 </div>
29 </template>
30
31 <script setup>
32 import {updateUserPwd} from '@/api/system/user'
33 import useUserStore from '@/store/modules/user'
34 import {reactive, ref, getCurrentInstance} from 'vue'
35 import {validPassword} from '@/utils/validate'
36
37 const show = ref(false)
38 const {proxy} = getCurrentInstance()
39 const userStore = useUserStore()
40
41 const user = reactive({
42 oldPassword: undefined,
43 newPassword: undefined,
44 confirmPassword: undefined
45 })
46
47 const equalToPassword = (rule, value, callback) => {
48 if (user.newPassword !== value) {
49 callback(new Error('两次输入的密码不一致'))
50 } else {
51 callback()
52 }
53 }
54
55 const validPwd = (rule, value, callback) => {
56 if (import.meta.env.DEV) {
57 callback()
58 } else {
59 if (!validPassword(value)) {
60 callback(new Error('请设置8位以上大小写字母、数字、特殊符号组合的密码'))
61 } else {
62 callback()
63 }
64 }
65 }
66
67 const rules = ref({
68 oldPassword: [{required: true, message: '旧密码不能为空', trigger: 'blur'}],
69 newPassword: [
70 {required: true, message: '新密码不能为空', trigger: 'blur'},
71 {validator: validPwd, trigger: 'blur'}
72 ],
73 confirmPassword: [
74 {required: true, message: '确认密码不能为空', trigger: 'blur'},
75 {required: true, validator: equalToPassword, trigger: 'blur'}
76 ]
77 })
78
79 /** 提交按钮 */
80 function submit() {
81 proxy.$refs['pwdRef'].validate(valid => {
82 if (valid) {
83 updateUserPwd(user.oldPassword, user.newPassword).then(response => {
84 proxy.$modal.msgSuccess('修改成功')
85
86 userStore.logOut().then(() => {
87 setTimeout(() => {
88 location.reload()
89 }, 1000)
90 })
91 })
92 }
93 })
94 };
95
96 </script>
97
98 <style scoped lang="scss">
99 .indexTitle {
100 margin: 20px 0 12px;
101 padding: 0 20px 15px;
102 border-bottom: 1px solid #e5e5e5;
103
104 h3 {
105 font-size: 16px;
106 color: var(--el-color-primary);
107 }
108 }
109
110
111 </style>
...@@ -79,8 +79,8 @@ ...@@ -79,8 +79,8 @@
79 </div> 79 </div>
80 <!--赛事日历--> 80 <!--赛事日历-->
81 <el-card :body-style="{'padding':'20px 20px'}"> 81 <el-card :body-style="{'padding':'20px 20px'}">
82 <!-- <el-calendar v-model="calendarValue" :range="calendarRange">--> 82 <el-calendar v-model="calendarValue" :range="calendarRange">
83 <el-calendar> 83 <!-- <el-calendar>-->
84 <template #date-cell="data"> 84 <template #date-cell="data">
85 <div v-if="data.data.day.slice(8,10)==22" class="primaryDate date">22</div> 85 <div v-if="data.data.day.slice(8,10)==22" class="primaryDate date">22</div>
86 <div v-else class="date"> 86 <div v-else class="date">
...@@ -417,8 +417,8 @@ const scores = ref([]) ...@@ -417,8 +417,8 @@ const scores = ref([])
417 const nowscores = ref([]) 417 const nowscores = ref([])
418 const livelist = ref([]) 418 const livelist = ref([])
419 const picList = ref([]) 419 const picList = ref([])
420 // const calendarValue = ref('2024-07-22') 420 const calendarValue = ref('2024-07-22')
421 // const calendarRange = ref(['2024-07-21','2024-07-27']) 421 const calendarRange = ref(['2024-07-21','2024-07-27'])
422 const showgg = ref(true) 422 const showgg = ref(true)
423 onMounted(() => { 423 onMounted(() => {
424 init() 424 init()
......
...@@ -88,7 +88,7 @@ ...@@ -88,7 +88,7 @@
88 <el-input 88 <el-input
89 v-model.trim="changePasswordForm.username" 89 v-model.trim="changePasswordForm.username"
90 size="large" 90 size="large"
91 auto-complete="off" 91 auto-complete="off" @change="changePasswordFormUsername"
92 placeholder="注册时使用的邮箱/手机号码" 92 placeholder="注册时使用的邮箱/手机号码"
93 > 93 >
94 94
...@@ -113,9 +113,9 @@ ...@@ -113,9 +113,9 @@
113 </el-button> 113 </el-button>
114 </template> 114 </template>
115 </el-input> 115 </el-input>
116 <div class="vcodeBox" :style="isShow?'height:240px':'height:0'"> 116 <!-- <div class="vcodeBox" :style="isShow?'height:240px':'height:0'">-->
117 <Vcode :show="isShow" type="inside" @success="codeSuccess" @close="codeClose" @fail='codeFail'></Vcode> 117 <Vcode :zIndex="9999" :show="isShow" @success="codeSuccess"></Vcode>
118 </div> 118 <!-- </div>-->
119 </el-form-item> 119 </el-form-item>
120 120
121 <el-form-item prop="password"> 121 <el-form-item prop="password">
...@@ -129,7 +129,7 @@ ...@@ -129,7 +129,7 @@
129 > 129 >
130 </el-input> 130 </el-input>
131 </el-form-item> 131 </el-form-item>
132 <el-form-item prop="password"> 132 <el-form-item prop="confirmPassword">
133 <el-input 133 <el-input
134 v-model.trim="changePasswordForm.confirmPassword" 134 v-model.trim="changePasswordForm.confirmPassword"
135 type="password" 135 type="password"
...@@ -146,7 +146,7 @@ ...@@ -146,7 +146,7 @@
146 size="large" 146 size="large"
147 type="primary" 147 type="primary"
148 style="width:100%;" 148 style="width:100%;"
149 @click.prevent="handleLogin" 149 @click.prevent="handleChangePassword"
150 > 150 >
151 <span>确定</span> 151 <span>确定</span>
152 </el-button> 152 </el-button>
...@@ -159,7 +159,7 @@ ...@@ -159,7 +159,7 @@
159 <script setup> 159 <script setup>
160 import Vcode from "vue3-puzzle-vcode" 160 import Vcode from "vue3-puzzle-vcode"
161 import CountDown from '@chenfengyuan/vue-countdown' 161 import CountDown from '@chenfengyuan/vue-countdown'
162 import { getCodeImg } from '@/api/login' 162 import {forgetPassword, getCodeImg} from '@/api/login'
163 import * as match from '@/apiPc/match' 163 import * as match from '@/apiPc/match'
164 import Cookies from 'js-cookie' 164 import Cookies from 'js-cookie'
165 import useUserStore from '@/store/modules/user' 165 import useUserStore from '@/store/modules/user'
...@@ -183,6 +183,12 @@ const loginRules = { ...@@ -183,6 +183,12 @@ const loginRules = {
183 password: [{ required: true, trigger: 'change', message: '请输入您账号密码' }], 183 password: [{ required: true, trigger: 'change', message: '请输入您账号密码' }],
184 code: [{ required: true, trigger: 'change', message: '请输入验证码' }] 184 code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
185 } 185 }
186 const changePasswordRules = {
187 username: [{ required: true, trigger: 'change', message: '请输入您的账号' }],
188 password: [{ required: true, trigger: 'change', message: '请输入您的密码' }],
189 confirmPassword: [{ required: true, trigger: 'change', message: '请再次输入您的密码' }],
190 code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
191 }
186 192
187 const show = ref(false) 193 const show = ref(false)
188 const loginStatus = ref(0) 194 const loginStatus = ref(0)
...@@ -284,7 +290,7 @@ function getCookie() { ...@@ -284,7 +290,7 @@ function getCookie() {
284 } 290 }
285 } 291 }
286 function sendsmsMsg() { 292 function sendsmsMsg() {
287 if(!changePasswordForm.value.account){ 293 if(!changePasswordForm.value.username){
288 ElMessage.error('请填写手机/邮箱') 294 ElMessage.error('请填写手机/邮箱')
289 return 295 return
290 } 296 }
...@@ -294,6 +300,30 @@ function sendsmsMsg() { ...@@ -294,6 +300,30 @@ function sendsmsMsg() {
294 isShow.value = true 300 isShow.value = true
295 } 301 }
296 } 302 }
303 function codeSuccess() {
304 isShow.value = false
305 isCodeTrue.value = true
306 counting.value = true
307 }
308 function changePasswordFormUsername() {
309 isCodeTrue.value = false
310 }
311 function handleChangePassword() {
312 proxy.$refs.changePasswordRef.validate(valid => {
313 if (valid) {
314 if(isCodeTrue.value){
315 delete changePasswordForm.value.confirmPassword
316 forgetPassword(changePasswordForm.value).then(res=>{
317 ElMessage.success('操作成功,请登录')
318 close()
319 })
320 } else {
321 ElMessage.error('请发送验证码')
322 }
323 }
324 })
325
326 }
297 </script> 327 </script>
298 328
299 <style lang="scss" scoped> 329 <style lang="scss" scoped>
......
1 <template> 1 <template>
2 <div style="padding: 0 20px 20px"> 2 <div style="padding: 0 20px 20px">
3 <!-- 赛事详情--> 3 <!--赛事详情-->
4 <div class="indexTitle"><h3 class="leftboderTT">组织机构</h3></div> 4 <div class="indexTitle"><h3 class="leftboderTT">组织机构</h3></div>
5 <el-row :gutter="20">
6 <el-col :lg="8">
7 <div class="dlbox">
8 <dl>
9 <dt>主办单位</dt>
10 <dd>世界体育舞蹈联合会(WDSF)</dd>
11 <dd>亚洲体育舞蹈联合会(DSA)</dd>
12 <dd>中国体育联合会(CDSF)</dd>
13 </dl>
14 </div>
15 </el-col>
16 <el-col :lg="8">
17 <div class="dlbox">
18 <dl>
19 <dt>承办单位</dt>
20 <dd>江苏省体育总会</dd>
21 <dd>无锡市人民政府</dd>
22 </dl>
23 </div>
24 </el-col>
25 <el-col :lg="8">
26 <div class="dlbox">
27 <dl>
28 <dt>协办单位</dt>
29 <dd>无锡市体育局</dd>
30 <dd>江苏无锡经济开发区管理委员会</dd>
31 <dd>江苏省体育舞蹈运动协会</dd>
32 </dl>
33 </div>
34 </el-col>
35 <el-col :lg="8">
36 <div class="dlbox">
37 <dl>
38 <dt>运营单位</dt>
39 <dd>吉金无锡运动健康有限公司</dd>
40 </dl>
41 </div>
42 </el-col>
43
44 </el-row>
45 <div class="indexTitle"><h3 class="leftboderTT">报名须知</h3></div>
46 <div class="xzbox"> 5 <div class="xzbox">
47 1.各单位限报1支队伍,每队需报领队1名(运动员可兼任),运动员限报4名<br> 6 1.各单位限报1支队伍,每队需报领队1名(运动员可兼任),运动员限报4名<br>
48 2.参赛运动员必须是参赛企业的员工(包括劳务派遣和外籍员工)<br> 7 2.参赛运动员必须是参赛企业的员工(包括劳务派遣和外籍员工)<br>
49 3.参赛运动员必须年满18至50周岁,50周岁以上者不建议参加此次比赛<br> 8 3.参赛运动员必须年满18至50周岁,50周岁以上者不建议参加此次比赛<br>
50 4.参赛运动员必须身体健康 9 4.参赛运动员必须身体健康
51 </div> 10 </div>
11 <div class="indexTitle"><h3 class="leftboderTT">报名须知</h3></div>
12 <div class="xzbox" v-html="form.signKnow">
52 13
53 <div class="indexTitle"><h3 class="leftboderTT">竞赛项目</h3></div> 14 </div>
54 <div class="collapsebox"> 15 <div class="indexTitle" v-if="form.type==0"><h3 class="leftboderTT">赛事规程</h3></div>
55 <el-collapse v-model="activeNames" @change="handleChange"> 16 <div class="xzbox" v-if="form.type==0" v-html="form.ruleUrl"></div>
56 <el-collapse-item title="霹雳舞" name="1"> 17 <div class="indexTitle" v-if="form.type==1"><h3 class="leftboderTT">竞赛项目</h3></div>
18 <div class="collapsebox" v-if="form.type==1">
19 <el-collapse v-if="form.cptProjectList?.length > 0">
20 <el-collapse-item :title="p.name" :name="index" :key="index" v-for="(p,index) in form.cptProjectList">
57 <div class="pd20"> 21 <div class="pd20">
58 <table class="table"> 22 <table class="table">
59 <tr> 23 <tr>
...@@ -135,171 +99,39 @@ ...@@ -135,171 +99,39 @@
135 </table> 99 </table>
136 </div> 100 </div>
137 </el-collapse-item> 101 </el-collapse-item>
138 <el-collapse-item title="拉丁舞" name="2">
139 <div class="pd20">
140 <table class="table">
141 <tr>
142 <td>日期</td>
143 <td>单元</td>
144 <td>组别</td>
145 <td>时间</td>
146 <td>阶段</td>
147 </tr>
148 <tr>
149 <td rowspan="4">2023/10/6(星期五)</td>
150 <td rowspan="4">BRK01</td>
151 <td>男子</td>
152 <td>14:30 - 15:30</td>
153 <td>资格赛</td>
154 </tr>
155 <tr>
156 <td>女子</td>
157 <td>14:30 - 15:30</td>
158 <td>资格赛</td>
159 </tr>
160 <tr>
161 <td>男子</td>
162 <td>14:30 - 15:30</td>
163 <td>循环赛</td>
164 </tr>
165 <tr>
166 <td>女子</td>
167 <td>14:30 - 15:30</td>
168 <td>循环赛</td>
169 </tr>
170 <tr>
171 <td rowspan="8">2023/10/7(星期六)</td>
172 <td rowspan="8">BRK02</td>
173 <td>男子</td>
174 <td>14:30 - 15:30</td>
175 <td>四分之一决赛</td>
176 </tr>
177 <tr>
178 <td>男子</td>
179 <td>14:30 - 15:30</td>
180 <td>四分之一决赛</td>
181 </tr>
182 <tr>
183 <td>女子</td>
184 <td>14:30 - 15:30</td>
185 <td>半决赛</td>
186 </tr>
187 <tr>
188 <td>女子</td>
189 <td>14:30 - 15:30</td>
190 <td>半决赛</td>
191 </tr>
192 <tr>
193 <td>男子</td>
194 <td>14:30 - 15:30</td>
195 <td>季军赛</td>
196 </tr>
197 <tr>
198 <td>女子</td>
199 <td>14:30 - 15:30</td>
200 <td>季军赛</td>
201 </tr>
202 <tr>
203 <td>男子</td>
204 <td>14:30 - 15:30</td>
205 <td>决赛</td>
206 </tr>
207 <tr>
208 <td>女子</td>
209 <td>14:30 - 15:30</td>
210 <td>决赛</td>
211 </tr>
212
213 </table>
214 </div>
215 </el-collapse-item>
216 <el-collapse-item title="国际舞" name="3">
217 <div class="pd20">
218 <table class="table">
219 <tr>
220 <td>日期</td>
221 <td>单元</td>
222 <td>组别</td>
223 <td>时间</td>
224 <td>阶段</td>
225 </tr>
226 <tr>
227 <td rowspan="4">2023/10/6(星期五)</td>
228 <td rowspan="4">BRK01</td>
229 <td>男子</td>
230 <td>14:30 - 15:30</td>
231 <td>资格赛</td>
232 </tr>
233 <tr>
234 <td>女子</td>
235 <td>14:30 - 15:30</td>
236 <td>资格赛</td>
237 </tr>
238 <tr>
239 <td>男子</td>
240 <td>14:30 - 15:30</td>
241 <td>循环赛</td>
242 </tr>
243 <tr>
244 <td>女子</td>
245 <td>14:30 - 15:30</td>
246 <td>循环赛</td>
247 </tr>
248 <tr>
249 <td rowspan="8">2023/10/7(星期六)</td>
250 <td rowspan="8">BRK02</td>
251 <td>男子</td>
252 <td>14:30 - 15:30</td>
253 <td>四分之一决赛</td>
254 </tr>
255 <tr>
256 <td>男子</td>
257 <td>14:30 - 15:30</td>
258 <td>四分之一决赛</td>
259 </tr>
260 <tr>
261 <td>女子</td>
262 <td>14:30 - 15:30</td>
263 <td>半决赛</td>
264 </tr>
265 <tr>
266 <td>女子</td>
267 <td>14:30 - 15:30</td>
268 <td>半决赛</td>
269 </tr>
270 <tr>
271 <td>男子</td>
272 <td>14:30 - 15:30</td>
273 <td>季军赛</td>
274 </tr>
275 <tr>
276 <td>女子</td>
277 <td>14:30 - 15:30</td>
278 <td>季军赛</td>
279 </tr>
280 <tr>
281 <td>男子</td>
282 <td>14:30 - 15:30</td>
283 <td>决赛</td>
284 </tr>
285 <tr>
286 <td>女子</td>
287 <td>14:30 - 15:30</td>
288 <td>决赛</td>
289 </tr>
290
291 </table>
292 </div>
293 </el-collapse-item>
294 </el-collapse> 102 </el-collapse>
103 <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="form.cptProjectList?.length == 0" description=" "/>
295 </div> 104 </div>
296 </div> 105 </div>
297 </template> 106 </template>
298 107
299 <script setup> 108 <script setup>
300 109 const props = defineProps({
110 form:{
111 type:Object,
112 required:true
113 }
114 })
301 </script> 115 </script>
302 116
303 <style scoped> 117 <style scoped lang="scss">
304 118 .indexTitle{margin: 20px 0 12px;
119 h3{
120 font-size: 20px;
121 color:var(--el-color-primary);
122 }
123 }
124 .table{width: 100%;border-left: 1px solid #e1e1e1;border-top:1px solid #e1e1e1;
125 th{background: #eee;padding: 6px 10px;
126 border-right: 1px solid #e1e1e1;
127 border-bottom:1px solid #e1e1e1;
128 font-size: 15px;
129 }
130 td{padding: 6px 10px;border-right: 1px solid #e1e1e1;font-size: 15px;
131 border-bottom:1px solid #e1e1e1;vertical-align: middle;text-align: center;
132 span{margin-right: 10px}
133 span::after{content: ','}
134 span:last-child::after{content: ''}
135 }
136 }
305 </style> 137 </style>
......
1 <template>
2 <el-card :body-style="{padding: '10px'}" class="mb20">
3 <div>
4 <div class="liveImgbox" @click="goDetail(newsList[0])">
5 <i class="ii">直播中</i>
6 <img :src="fillImgUrl_webSite(newsList[0]?.picUrl)">
7 </div>
8 </div>
9
10 <div class="indexTitle">
11 <h3 class="leftboderTT">赛事报道</h3>
12 <a class="more" @click="goList(query2.sortId,'专题报道')">MORE</a>
13 </div>
14 <div>
15 <div class="item" v-for="n in newsList2" :key="n.id">
16 <p class="esp">{{ n.name }}</p>
17 </div>
18 </div>
19
20 <div class="indexTitle"><h3 class="leftboderTT">赛事视频</h3>
21 <a class="more" @click="goList(10000006,'赛事视频')">MORE</a>
22 </div>
23 <div>
24 <div class="videoImgbox" @click="goDetail(newsList[1])">
25 <img :src="fillImgUrl_webSite(newsList[1]?.picUrl)">
26 </div>
27 </div>
28 <div class="indexTitle"><h3 class="leftboderTT">赛事图片</h3>
29 <a class="more" @click="goList(10000007,'赛事图片')">MORE</a>
30 </div>
31 <div>
32 <div class="picbox" @click="goDetail(newsList[0])"><img :src="fillImgUrl_webSite(newsList[0]?.picUrl)"/></div>
33 </div>
34 </el-card>
35 </template>
36
37 <script setup>
38 import {getNewsListById} from "@/apiPc/webSite";
39 import {onMounted, ref} from "vue";
40 const newsList = ref([])
41 const newsList2 = ref([])
42 const query1 = ref({
43 pageSize: 5,
44 pageNum: 1,
45 sortId: '10000006'
46 })
47 const query2 = ref({
48 pageSize: 3,
49 pageNum: 1,
50 sortId: '10000003'
51 })
52 onMounted(() => {
53 getList(query1.value)
54 getList2(query2.value)
55 })
56 const getList = (obj) => {
57 getNewsListById(obj).then(res => {
58 newsList.value = res.rows
59 })
60 }
61 const getList2 = (obj) => {
62 getNewsListById(obj).then(res => {
63 newsList2.value = res.rows
64 })
65 }
66 const goList = (sortId,name) => {
67 router.push({
68 path: `/news/list/${sortId}`,
69 query:{
70 kindName:name
71 }
72 })
73 }
74 </script>
75
76 <style scoped lang="scss">
77 .indexTitle{margin: 20px 0 12px;
78 h3{
79 font-size: 20px;
80 color:var(--el-color-primary);
81 }
82 }
83 .item:hover{cursor: pointer;color: var(--el-color-primary)}
84 .indexTitle a.more{top: 0;}
85 </style>
1 <template>
2 <div style="padding: 0 20px 20px">
3 <!--日程-->
4 <el-timeline>
5 <el-timeline-item
6 v-for="s in matchData.cptScheduleList"
7 :key="s.id" hide-timestamp
8 placement="top"
9 >
10 <p style="font-size: 16px;margin: 0">
11 {{ s.timeRange?.split(',')[0].substring(0, 16) }}
12 ~
13 {{ s.timeRange?.split(',')[1].substring(0, 16) }}
14 </p>
15
16 <p style="font-size: 16px;">{{ s.name }}</p>
17 <p v-if="s.introduction" v-html="s.introduction"></p>
18 <div class="time-address">
19 <el-icon>
20 <Position />
21 </el-icon>
22 {{ s.address }}
23 </div>
24 </el-timeline-item>
25 </el-timeline>
26
27 <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="matchData.cptScheduleList?.length==0" description=" " />
28
29 </div>
30 </template>
31
32 <script setup>
33 const props = defineProps({
34 matchData:{
35 type:Object,
36 required:true
37 }
38 })
39 </script>
40
41 <style scoped lang="scss">
42 .indexTitle{margin: 20px 0 12px;
43 h3{
44 font-size: 20px;
45 color:var(--el-color-primary);
46 }
47 }
48 .table{width: 100%;border-left: 1px solid #e1e1e1;border-top:1px solid #e1e1e1;
49 th{background: #eee;padding: 6px 10px;
50 border-right: 1px solid #e1e1e1;
51 border-bottom:1px solid #e1e1e1;
52 font-size: 15px;
53 }
54 td{padding: 6px 10px;border-right: 1px solid #e1e1e1;font-size: 15px;
55 border-bottom:1px solid #e1e1e1;vertical-align: middle;text-align: center;
56 span{margin-right: 10px}
57 span::after{content: ','}
58 span:last-child::after{content: ''}
59 }
60 }
61 </style>
...@@ -33,16 +33,16 @@ ...@@ -33,16 +33,16 @@
33 33
34 <div class="funcBtns"> 34 <div class="funcBtns">
35 <div> 35 <div>
36 <img src="@/assets/dance/ds01.png"/> 36 <img src="@/assets/dance/btn01.png"/>
37 <h4>TICKET BOOKING</h4> 37 <h4>酒店预约</h4>
38 </div> 38 </div>
39 <div> 39 <div>
40 <img src="@/assets/dance/ds02.png"/> 40 <img src="@/assets/dance/btn02.png"/>
41 <h4>HOTEL RESERVATIONS</h4> 41 <h4>接送预约</h4>
42 </div> 42 </div>
43 <div> 43 <div>
44 <img src="@/assets/dance/ds03.png"/> 44 <img src="@/assets/dance/btn03.png"/>
45 <h4>MAKEUP APPOINTMENTS</h4> 45 <h4>餐饮预约</h4>
46 </div> 46 </div>
47 </div> 47 </div>
48 </el-col> 48 </el-col>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!