Skip to content

Commit

Permalink
feat: 个人中心增加打字记录
Browse files Browse the repository at this point in the history
  • Loading branch information
YasinChan committed May 12, 2024
1 parent 9fd9ee6 commit dbdee8d
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 4 deletions.
6 changes: 6 additions & 0 deletions src/request/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ export const getTodo = () => {
export const getLeaderBoard = () => {
return axios.get('/api/leaderboard');
};

// 获取某个用户的记录
export const getLeaderBoardByUserId = (params?: { id: string }) => {
return axios.get('/api/leaderboard/by-user-id', { params });
};

// 保存记录
export const saveLeaderBoard = (params: any) => {
return axios.post('/api/leaderboard/save', params);
Expand Down
123 changes: 119 additions & 4 deletions src/view/User.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
<script setup lang="ts">
import { reactive, watch, inject, computed } from 'vue';
import { useRouter } from 'vue-router';
import dayjs from 'dayjs';
// api
import { getUserInfo, setPersonalInfo, updatePassword } from '@/request';
import { getUserInfo, setPersonalInfo, updatePassword, getLeaderBoardByUserId } from '@/request';
// type
import type { LeaderBoardType } from '@/types';
// components
import YModal from '@/components/ui/Modal.vue';
Expand Down Expand Up @@ -42,7 +46,9 @@ const state = reactive({
newPassword: '' as any,
confirmNewPassword: '' as any,
newPasswordError: '' as any,
confirmNewPasswordError: '' as any
confirmNewPasswordError: '' as any,
userTimeLeaderBoardInfo: [] as LeaderBoardType[],
userCountdownLeaderBoardInfo: [] as LeaderBoardType[]
});
const router = useRouter();
Expand All @@ -58,6 +64,17 @@ watch(
getUserInfo({ userId: String(state.paramsId) }).then((res) => {
state.info = res.data?.result;
});
getLeaderBoardByUserId({ id: String(state.paramsId) }).then((res) => {
const userLeaderBoardInfo = res.data?.result?.leaderboard;
state.userTimeLeaderBoardInfo = userLeaderBoardInfo.filter(
(item: any) => item.type === 'time'
);
state.userCountdownLeaderBoardInfo = userLeaderBoardInfo.filter(
(item: any) => item.type === 'countdown'
);
console.log('state.userTimeLeaderBoardInfo', state.userTimeLeaderBoardInfo);
console.log('state.userCountdownLeaderBoardInfo', state.userCountdownLeaderBoardInfo);
});
},
{
immediate: true
Expand Down Expand Up @@ -196,6 +213,75 @@ const setResetAvatar = () => {
<div class="y-user__setting-set-item" @click="resetAvatar">重置密码</div>
</div>
</div>
<div
class="y-user__leaderboard"
v-if="state.userTimeLeaderBoardInfo || state.userCountdownLeaderBoardInfo"
>
<div class="y-user__leaderboard-title">打字记录</div>
<div class="y-user__leaderboard-info">
<div class="y-user__leaderboard-info-item" v-if="state.userTimeLeaderBoardInfo?.length">
<div class="y-user__leaderboard-info-item-title">限时模式</div>
<div class="y-user__leaderboard-info-item-list">
<table class="y-user__leaderboard-info-item-table">
<thead>
<tr>
<td>速度</td>
<td>准确率</td>
<td>时长</td>
<td class="y-leader-board__header-finish-time">完成时间</td>
</tr>
</thead>
<tbody>
<tr
class="y-leader-board-item"
v-for="item in state.userTimeLeaderBoardInfo"
:key="item.objectId"
>
<td class="y-leader-board-item__wpm">{{ item.wpm }}</td>
<td class="y-leader-board-item__accuracy">{{ item.accuracy }}</td>
<td class="y-leader-board-item__duration">{{ item.duration }}</td>
<td class="y-leader-board-item__created-at">
{{ dayjs(item.createdAt).format('YYYY-MM-DD HH:mm') }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div
class="y-user__leaderboard-info-item"
v-if="state.userCountdownLeaderBoardInfo?.length"
>
<div class="y-user__leaderboard-info-item-title">计时模式</div>
<div class="y-user__leaderboard-info-item-list">
<table class="y-user__leaderboard-info-item-table">
<thead>
<tr>
<td>速度</td>
<td>准确率</td>
<td>时长</td>
<td class="y-leader-board__header-finish-time">完成时间</td>
</tr>
</thead>
<tbody>
<tr
class="y-leader-board-item"
v-for="item in state.userCountdownLeaderBoardInfo"
:key="item.objectId"
>
<td class="y-leader-board-item__wpm">{{ item.wpm }}</td>
<td class="y-leader-board-item__accuracy">{{ item.accuracy }}</td>
<td class="y-leader-board-item__duration">{{ item.duration }}</td>
<td class="y-leader-board-item__created-at">
{{ dayjs(item.createdAt).format('YYYY-MM-DD HH:mm') }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<YModal
:show="state.showPasswordQuestion"
Expand Down Expand Up @@ -262,6 +348,9 @@ const setResetAvatar = () => {
</template>
<style lang="scss">
.y-user {
margin: 100px 0 !important;
}
.y-user__info {
display: flex;
}
Expand All @@ -287,10 +376,12 @@ const setResetAvatar = () => {
vertical-align: middle;
}
.y-user__setting {
.y-user__setting,
.y-user__leaderboard {
margin-top: 30px;
}
.y-user__setting-title {
.y-user__setting-title,
.y-user__leaderboard-title {
font-size: 24px;
font-weight: bold;
margin-bottom: 10px;
Expand Down Expand Up @@ -322,4 +413,28 @@ const setResetAvatar = () => {
padding-bottom: 10px;
}
}
.y-user__leaderboard-info-item-title {
color: $gray-06;
margin: 20px 0 10px;
font-weight: bold;
}
.y-user__leaderboard-info-item-table {
width: 100%;
max-width: 800px;
font-size: 14px;
border-collapse: collapse;
border-spacing: 0;
td {
padding: 4px 6px;
white-space: nowrap;
border-radius: 2px;
}
tbody {
position: relative;
tr:nth-child(2n + 1) {
background-color: $layout-background-gray;
}
}
}
</style>

0 comments on commit dbdee8d

Please sign in to comment.