【全栈之巅】Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(3.11-3.12)

【全栈之巅】Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(3.11-3.12)

本项目是 学习Bilibili 全栈之巅 视频教程相关源码和体会
https://gitee.com/blaunicorn/node-vue-wangzherongyao
持续更新中…

3.11 web页继续优化card,抽象首页card的各个部分,形成listcard、nav、swiper组件

// web\src\components\ListCard.vue 理想是传入数据,直接展示新闻、英雄列表和图文攻略
<template>
  <a-card :icon="icon" :title="title">
    <!-- 应用插槽展示数据 -->
    <div class="nav jc-between">
      <div
        class="nav-item"
        :class="{ active: active === index }"
        v-for="(category, index) in categories"
        :key="index"
        @click="
          () => {
            active = index;
            $refs.list.$swiper.slideTo(index);
          }
        "
      >
        <div class="nav-link" v-text="category.name">热门</div>
      </div>
    </div>
    <div class="card-body pt-3">
      <swiper
        ref="list"
        @slide-change="() => (active = $refs.list.$swiper.realIndex)"
      >
        <swiper-slide v-for="(category, index) in categories" :key="index">
          <!-- 具名插槽,把子组件的数据再传递给父组件,便于后面区分新闻资讯、英雄列表、视频列表的不同样式展示 -->
          <slot name="items" :category="category"></slot>
        </swiper-slide>
      </swiper>
    </div>
  </a-card>
</template>

<script>
  export default {
    props: {
      icon: { type: String, required: true },
      title: {
        type: String,
        required: true,
      },
      // 分类
      categories: { type: Array, required: true },
    },
    data() {
      return {
        active: 0,
      };
    },
  };
</script>

<style>
</style>
// web\src\main.js
// 全局引用CardList组件
import ListCard from './components/ListCard.vue'
Vue.component('m-list-card', ListCard)
// Web界面中的swiper的点击和滑动控制样式功能
// 点击转跳区域
@click = "$refs.list.$swiper.slideTo(i)"
//区域改变,active的样式也跟随变化
@slide-change="() => active = $refs.list.$swiper.realIndex"
// web\src\views\Home.vue 引入ListCard组件
    <!-- 封装好的高级组件 -->
    <m-list-card
      icon="caidananniudianji"
      title="新闻资讯-ListCard组件"
      :categories="newsCats"
    >
      <!-- 在父组件里,不通过循环,直接拿到子组件里的具名slot的数据,
      这样的好处是 子组件的内容可以由父组件决定怎么展示 -->
      <template #items="{ category }">
        <div
          class="py-2"
          v-for="(item, index) in category.newsList"
          :key="index"
        >
          <span v-text="item.categoryName">[新闻]</span>
          <span>|</span>
          <span v-text="item.title + item._id"
            >春和景明柳垂莺娇,峡谷好礼随春报到</span
          >
          <span v-text="item.date">06/12</span>
        </div>
      </template>
      <!-- <template v-slot:heros="{ category }"></template> -->
    </m-list-card>

3.12 web页新闻资讯的数据录入

// web\src\components\ListCard.vue 理想是传入数据,直接展示新闻、英雄列表和图文攻略

web\src\views\Main.vue
<style lang="scss">
  //   增加吸顶效果
  .topbar {
    position: sticky;
    top: 0;
    z-index: 999;
  }
</style>
// console终端中输出html中的文字
$$('.news_list_cont a').map(el=>el.innerHTML)
$$('.news_list .title').map(el=>el.innerHTML).slice(5)
// 写一个接口去自动录入新闻资讯的标题
// 1.server端引入插件,可以直接读取文件夹下所有文件
npm install require-all --save

// server\plugins\db.js使用该插件
    // 2.()当成一个函数使用,再传入一个路径,回退到上级路径
    require('require-all')(__dirname + '/../models')
    //初始化数据

 // server\routes\web\index.js
module.exports = app => {
    const router = require('express').Router()
    //通过访问一个路径来写入数据,这样是数据能通过js的方式来写入数据库,不用自己在后台一个个添加
    // 初始化新闻数据

    // const Article = require('../../models/Article') // 这种要一个个引入相对麻烦些
    const mongoose = require('mongoose')// 另外一种方式是直接通过mongoose读取数据库
    // 使用模型
    const Artice = mongoose.model('Article')
    const Category = mongoose.model('Category')

    router.get('/news/init', async (req, res) => {
        const parent = await Category.findOne({
            name: '新闻分类'
        })
        console.log(parent)
        //获取分类,lean表示获取纯粹的json数组,用where限制分类新闻分类
        const cats = await Category.find().lean().where({
            parent: parent
        });
        // console.log(cats);
        const newsTitles = ["嫦娥皮肤设计大赛最终投票开启公告", "狄某有话说|姜子牙化身“象棋高手”?", "3月17日外挂专项打击公告", "3月17日“演员”惩罚名单", "3月17日净化游戏环境声明及处罚公告", "3月16日体验服停机更新公告", "老亚瑟的答疑时间:貂蝉-仲夏夜之梦海报优化计划,王昭君-凤凰于飞优化海报过程稿", "嫦娥皮肤设计大赛人气创意奖、优秀创意奖公布", "3月16日账号注销流程变更说明", "春和景明柳垂莺娇,峡谷好礼随春报到", "3月16日全服不停机更新公告", "3月13日体验服不停机更新公告", "3月12日体验服停机更新公告", "3月12日体验服停机更新公告", "狄某有话说|江湖规矩,对线不打“WiFi”牛", "第三届王者荣耀全国大赛赛事日历公布", "嫦娥皮肤设计大赛最终投票开启公告", "狄某有话说|姜子牙化身“象棋高手”?", "老亚瑟的答疑时间:貂蝉-仲夏夜之梦海报优化计划,王昭君-凤凰于飞优化海报过程稿", "嫦娥皮肤设计大赛人气创意奖、优秀创意奖公布", "超丰厚奖励等你赢!第三届王者荣耀全国大赛北京海选首站(北京丰科万达站)即将开赛!", "第三届王者荣耀全国大赛——安徽省再次启航!", "第三届王者荣耀全国大赛城市赛道——第一期海选赛赛点信息", "斗鱼新势力战队选拔赛", "狄某有话说|江湖规矩,对线不打“WiFi”牛", "老亚瑟的答疑时间:貂蝉-仲夏夜之梦及金色仲夏夜优化后海报展示", "王者荣耀·女神节 峡谷女神才艺showtime还不来围观!", "狄某有话说|春节回顾,2月对局环境数据盘点!", "嫦娥皮肤设计大赛首轮投票开启公告", "老亚瑟的答疑时间:皮肤优化沟通月历上线,公孙离-祈雪灵祝优化进度展示"]
        // 打算制造随机分类,slice是为了防止影响数据本身,复制一份数据去排序。Math.random()-0.5是让数据在正负0.5之间随机,slice(0,2)是取两个数
        const randomCats = cats.slice(0).sort((a, b) => Math.random() - 0.5).slice(0, 2)
        const newList = newsTitles.map(title => {
            return {
                categories: randomCats, // 打乱随机取2个分类
                title: title
            }
        })
        // 清空原有数据库,再插入数据
        await Artice.deleteMany({})
        await Artice.insertMany(newList)
        res.send(newList)
    })

    app.use('/web/api', router)
}

// server\index.js
// 导入web 路由
require('./routes/web')(app)

//3. http://localhost:3000/web/api/news/init  后端api可以访问到数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值