프로젝트

38. 상세 페이지

uni5948 2022. 1. 22. 15:59

38. 상세 페이지

  • 상세 페이지 라우터 추가

1. 상세 페이지 파일 생성

상세 페이지 파일 생성

2. 라우터 추가(index.js)

상세 페이지는 App.vue에 등록하지 않는다.

import { createWebHistory, createRouter } from "vue-router";

import Home from '@/components/Home'
import Join from '@/components/Join'
import Login from '@/components/Login'
import Logout from '@/components/Logout'
import Registration from '@/components/Registration'
import PlayerList from '@/components/PlayerList'
import Player_One from '@/components/Player_One'

const routes = [
    {path:'/',  name:'Home', component:Home},
    {path:'/Join',  name:'Join', component:Join},
    {path:'/Login',  name:'Login', component:Login},
    {path:'/Logout',  name:'Logout', component:Logout},
    {path:'/Registration',  name:'Registration', component:Registration},
    {path:'/PlayerList',  name:'PlayerList', component:PlayerList},
    {path:'/Player_One',  name:'Player_One', component:Player_One},
]

const router = createRouter({
    history: createWebHistory(),
    routes,
});

export default router;

 

  • 상세 페이지 생성

1. playerlist 수정

선수 목록에서 선수 이름을 클릭하면 선수 상세 페이지로 이동하도록 한다.

<template>
    <div>
        <h3>선수 목록</h3>
        <input type="text" v-model="text"
            placeholder="검색" @keyup.enter="handleSearch" />
        <table border="1">
            <tr>
                <td>이름</td>
                <td>나이</td>
                <td>국적</td>
                <td>포지션</td>
                <td>몸 값</td>
            </tr>
            <tr v-for="player in players" v-bind:key="player">
                <td><a href="#" @click="nextPage(player.playerno)">{{player.playername}}</a></td> <- 선수이름에 a 태그를 이용해 상세 페이지로 이동할 수 있게 한다.
                <td>{{player.playerage}}</td>
                <td>{{player.playercountry}}</td>
                <td>{{player.playerposition}}</td>
                <td>{{player.playerprice}}</td>
            </tr>
        </table>
        <hr />
            <el-pagination
                background layout="prev, pager, next" :total="totalpage"
                @current-change="handleCurrentChange">
            </el-pagination>
       
    </div>
</template>

<script>
    import axios from 'axios';
    export default {
       
        methods:{
             //페이지 이동
            async handleCurrentChange(val){
                this.page = val;
                await this.handleSearch();
            },
            async handleSearch() {
                const url = `/REST/playerall?page=${this.page}`;
                const headers = {"Content-Type":"application/json"}
                const response = await axios.get(url, {headers});
                // console.log(response);
                this.players = response.data.player;
 
                const url1 = `/REST/playercount` //전체 선수 숫자 조회 주소 입력
                const response1 = await axios.get(url1);
                console.log(response1);
                //전체 선수 수를 통해 페이지네이션 숫자 생성
                this.totalpage = Number(response1.data.count);
            },
            async nextPage(playerno) { <- 클릭한 선수의 no를 이용해 해당 선수의 상세 페이지로 이동한다.
                this.$router.push({name: 'Player_One', query:{no:playerno}});
            }
        },
        async created(){
            await this.handleSearch();
        },
       
        data(){
            return{
                players : [],
                page : 1,
                totalpage : 0,
                text : ''
            }
        }
    }
</script>

<style >

</style>
선수 이름에 a 태그 사용

2. 상세 페이지 수정

2-1. 선택한 선수의 정보가 넘어오는지 확인

<template>
    <div>
        <h3>선수 상세 페이지</h3>
        {{no}}
        <hr />
        이름 : {{player.playername}} <br/>
        나이 : {{player.playerage}} <br/>
        신장 : {{player.playerheight}} <br/>
        몸무게 : {{player.playerweight}} <br/>
        포지션 : {{player.playerposition}} <br/>
        국적 : {{player.playercountry}} <br/>
        몸 값 : {{player.playerprice}} <br/>
        이름 : {{player.image}} <br/>

    </div>
</template>

<script>
    import axios from 'axios';
    export default {
        methods: {
            async handleContent(){
                const url = `/REST/playerone?no=${this.no}`;
                const headers = {"Content-Type":"application/json"};
                const response = await axios.get(url, headers);
                console.log(response);
            }
        },
        data(){
            return {
                player : '',
                no : this.$route.query.no
            }
        },
        async mounted(){
            await this.handleContent();
        }
       
    }
</script>

<style scoped>

</style>
선수 정보 확인

 

 

2-2. 백엔드에 선수 사진 조회 추가(PlayerController)

상세 페이지에 선수 사진을 나타내기 위해 백엔드에 선수 1명 사진 조회를 추가한다.

그리고 선수 1명 조회문에 사진 조회를 이용해 사진 url 정보도 함께 나타낸다.

    // 선수 1명 조회
    //127.0.0.1:8080/REST/playerone?no=
    @RequestMapping(value = "/playerone", method = {RequestMethod.GET},
    consumes = MediaType.ALL_VALUE,
    produces = MediaType.APPLICATION_JSON_VALUE)
    public Map<String, Object> playeroneGET(Player player,
    @RequestParam("no") long no) {
        Map<String, Object> map = new HashMap<>();
        try{
            Player player2 = pService.getPlayerOne(no);
            map.put("status", "200");
            map.put("player",player2 );
            map.put("playerimg","/REST/playeroneimg?no=" + no );    //선수 이미지 url

        }
        catch(Exception e){
            e.printStackTrace();
            map.put("status", e.hashCode());
        }
        return map;
    }

    // 선수 1명 사진 조회
    //127.0.0.1:8080/REST/playeroneimg?no=
    @RequestMapping(value = "/playeroneimg", method = RequestMethod.GET)
    public ResponseEntity<byte[]> playeroneimgGET(
    @RequestParam("no") long no) {
        try{
            Player player = pService.getPlayerOne(no);
            if(player.getImage() != null) {
                HttpHeaders headers = new HttpHeaders();
                if(player.getImagetype().equals("image/jpeg")){
                    headers.setContentType(MediaType.IMAGE_JPEG);
                }
                else if(player.getImagetype().equals("image/png")){
                    headers.setContentType(MediaType.IMAGE_PNG);
                }
                else if(player.getImagetype().equals("image/gif")){
                    headers.setContentType(MediaType.IMAGE_GIF);
                }
                ResponseEntity<byte[]> response =
                    new ResponseEntity<>(player.getImage(), headers, HttpStatus.OK);
                return response;
            }
            return null;
           
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

2-3. 상세 페이지 구현

 
<template>
    <div>
        <h3>선수 상세 페이지</h3>
        {{no}}
        <hr />
        이름 : {{player.playername}} <br/>
        나이 : {{player.playerage}} <br/>
        신장 : {{player.playerheight}} <br/>
        몸무게 : {{player.playerweight}} <br/>
        포지션 : {{player.playerposition}} <br/>
        국적 : {{player.playercountry}} <br/>
        몸 값 : {{player.playerprice}} <br/>
        <img :src="`${playerimg}`" style="width: 100px; height: 100px" />

    </div>
</template>

<script>
    import axios from 'axios';
    export default {
        methods: {
            async handleContent(){
                const url = `/REST/playerone?no=${this.no}`;
                const headers = {"Content-Type":"application/json"};
                const response = await axios.get(url, headers);
                console.log(response);
                this.player = response.data.player; <- 선수 정보
                this.playerimg = response.data.playerimg; <- 선수 사진 정보
            }
        },
        data(){
            return {
                player : '',
                playerimg : '',
                no : this.$route.query.no
            }
        },
        async mounted(){
            await this.handleContent();
        }
       
    }
</script>

<style scoped>

</style>

 

3. 상세 페이지 확인

'프로젝트' 카테고리의 다른 글

40. 리뷰 등록  (0) 2022.01.23
39. 상세 페이지 수정(element)  (0) 2022.01.22
37. 선수 목록 페이지네이션  (0) 2022.01.20
36. 선수 목록  (0) 2022.01.17
35. 팀, 에이전트 전체 조회  (0) 2022.01.13