【全栈之巅】Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(3.21-3.22)
本项目是 学习Bilibili 全栈之巅 视频教程相关源码和体会
https://gitee.com/blaunicorn/node-vue-wangzherongyao
持续更新中…
3.21、 英雄详情页,后台编辑,增加缺少的英雄背景图和英雄关系
// server\models\Hero.js
// 3.21新增banner字段
banner: { type: String },
// admin\src\views\HeroEdit.vue
<el-form-item label="Banner">
<el-upload
class="avatar-uploader"
:action="$http.defaults.baseURL + '/upload'"
:show-file-list="false"
:headers="getAuthHeaders()"
:on-success="(res) => $set(model, 'banner', res.url)"
:before-upload="beforeAvatarUpload"
>
<img v-if="model.banner" :src="model.banner" class="avatar" />
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
...
<!-- 3.21 增加英雄关系 -->
<el-tab-pane label="最佳搭档" name="partners">
<el-button
type="primary"
size="small"
@click="model.partners.push({})"
><i class="el-icon-plus"></i> 添加英雄</el-button
>
<el-row type="flex" style="flex-wrap: wrap">
<el-col
:md="12"
v-for="(item, index) in model.partners"
:key="index"
>
<el-form-item label="英雄">
<el-select filterable v-model="item.hero">
<el-option
v-for="hero in heroes"
:key="hero._id"
:value="hero._id"
:label="hero.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="描述">
<el-input type="textarea" v-model="item.description"></el-input>
</el-form-item>
<el-form-item>
<el-button
type="warning"
size="small"
@click="model.parents.splice(index, 1)"
>删除</el-button
></el-form-item
>
<el-divider></el-divider>
</el-col>
</el-row>
</el-tab-pane>
3.22、 web端英雄详情页的实现 web\src\views\Hero.vue
<!-- 注意banner应该是个背景图 -->
<div class="top" :style="{ 'background-image': `url(${model.banner})` }">
<!-- 3.22 d-flex flex-column让背景上的info变成垂直布局, 加h-100 让info保持与背景一样高,再用justify-content:end(变成垂直布局,就不是靠右而是靠底部了) -->
<div class="info text-white p-3 h-100 d-flex flex-column jc-end">
<div class="fs-sm">{{ model.title }}</div>
<h2 class="my-2">{{ model.name }}</h2>
<!-- map 循环转成数组,在用/分割 -->
<div class="fs-sm">
{{ model.categories.map((v) => v.name).join('/') }}
</div>
<div class="d-flex jc-between">
<!-- 右边还有皮肤数据,所以要把它转成d-flex,变成左右对齐,上面再增加一层, -->
<!-- ai-center 让scores 垂直对齐 -->
<div class="scores d-flex ai-center pt-2" v-if="model.scores">
<span>难度</span>
<span class="badge bg-primary">{{ model.scores.difficult }}</span>
<span>技能</span>
<span class="badge bg-blue-1">{{ model.scores.skills }}</span>
<span>攻击</span>
<span class="badge bg-danger">{{ model.scores.attack }}</span>
<span>生存</span>
<span class="badge bg-dark">{{ model.scores.survive }}</span>
</div>
<router-link to="/" tag="div" class="text-grey fs-sm"
>皮肤: 2 ></router-link
>
</div>
</div>
</div>
</div>
<style lang="scss" scoped>
// 限制在hero页面内,防止样式冲突
.page-hero {
.top {
// 没有高度不会显示
height: 50vw;
// 背景图不要重复,垂直向上靠,水平居中
background: #fff no-repeat top center;
// 限制高度100%
background-size: auto 100%;
}
.info {
// 增加渐变效果,全透明变到全黑
background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 1));
.scores {
.badge {
margin: 0 0.25rem;
display: inline-block;
width: 1rem;
height: 1rem;
line-height: 0.9rem;
text-align: center;
border-radius: 50%;
font-size: 0.6rem;
border: 1px solid rgba(255, 255, 255, 0.2);
}
}
}
}
</style>