使用vue2和vue-router移植一个博客页面

开始

使用vue脚手架创建一个项目

请移步此处————创建vue项目

创建完成之后在public/index.html目录下引入项目中需要的bootstrapCDN

<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap-theme.min.css" rel="stylesheet">
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  • </body>后引入bootstrap.js文件
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

删除原有src/components/Hello.vue文件夹

移植

创建Header.vue,把头部代码写入

<template>
  <header class="navbar navbar-inverse navbar-fixed-top bs-docs-nav" role="banner">
			<div class="container">
				<div class="navbar-header">
					<button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
						<span class="sr-only">响应式导航</span>
						<span class="icon-bar"></span>
						<span class="icon-bar"></span>
						<span class="icon-bar"></span>
					</button>
					<a href="" class="navbar-brand">我的小屋</a>
				</div>
				<nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
					<ul class="nav navbar-nav">
						<li role="presentation" class="active"><a href="/">首页</a></li>
						<li role="presentation"><router-link to="/contact">联系</router-link></li>
						<li role="presentation"><router-link to="/about">关于我</router-link></li>
					</ul>
					<form class="navbar-form navbar-right" role="search">
						<div class="form-group">
							<input type="text" class="form-control" placeholder="请输入文章标题或者作者名称">
						</div>
						<button type="submit" class="btn btn-default">搜索</button>
					</form>
				</nav>
			</div>
		</header>
</template>

<script>

  export default {
    name: 'Header',
    data() {
      return {
        
      }
    },
    components: {
      
    }
  }
</script>

<style scoped lang='scss'>
  
</style>

把底部代码写入Footer.vue

<template>
  <footer>
    <div class="container">
      <hr />
      <p class="text-center">Copyright &copy; Powered by Bruce</p>
    </div>
  </footer>
</template>

<script>
export default {
  name: "Footer",
  data() {
    return {};
  },
  components: {},
};
</script>

<style scoped lang='scss'>
</style>

新建Context把内容区域填充

<template>
  <div id="body" class="container">
    <div class="row">
      <router-view></router-view>
      <div class="col-md-4">
        <!-- RSS订阅,最新文章(5),分类,标签云,最新评论 -->
        <div class="well text-center">
          <p class="lead">不想错过好文章,赶紧订阅吧</p>
          <button type="button" class="btn btn-primary btn-lg">
            订阅我的博客
          </button>
        </div>

        <!--最新文章 -->
        <div class="panel panel-primary" id="mypanel">
          <!-- Default panel contents -->
          <div class="panel-heading">
            <h4>最新文章</h4>
          </div>
          <!-- List group -->
          <ul class="list-group">
            <li class="list-group-item"><a href="">1. 最新文章8月27日</a></li>
            <li class="list-group-item"><a href="">2. 最新文章8月26日</a></li>
            <li class="list-group-item"><a href="">3. 最新文章8月25日</a></li>
            <li class="list-group-item"><a href="">4. 最新文章8月24日</a></li>
            <li class="list-group-item"><a href="">5. 最新文章8月23日</a></li>
          </ul>
        </div>

        <!-- 分类目录 -->
        <div class="panel panel-primary">
          <!-- Default panel contents -->
          <div class="panel-heading">
            <h4>分类目录</h4>
          </div>
          <!-- List group -->
          <ul class="list-group">
            <li class="list-group-item"><a href="">水果</a></li>
            <li class="list-group-item"><a href="">蔬菜</a></li>
            <li class="list-group-item"><a href="">电脑3C</a></li>
            <li class="list-group-item"><a href="">明星八卦</a></li>
            <li class="list-group-item"><a href="">政治事件</a></li>
          </ul>
        </div>

        <!-- 标签云 -->
        <div class="panel panel-primary">
          <!-- Default panel contents -->
          <div class="panel-heading">
            <h4>标签云</h4>
          </div>
          <!-- List group -->
          <div class="panel-body">
            <ul class="list-inline">
              <li><a href="">子鼠</a></li>
              <li><a href="">丑牛</a></li>
              <li><a href="">寅虎</a></li>
              <li><a href="">卯兔</a></li>
              <li><a href="">申龙</a></li>
              <li><a href="">巳蛇</a></li>
            </ul>
          </div>
        </div>

        <!-- 最新评论 -->
        <div class="panel panel-primary">
          <!-- Default panel contents -->
          <div class="panel-heading">
            <h4>最新评论</h4>
          </div>
          <!-- List group -->
          <ul class="list-group">
            <li class="list-group-item"><a href="">1. 最新文章8月27日</a></li>
            <li class="list-group-item"><a href="">2. 最新文章8月26日</a></li>
            <li class="list-group-item"><a href="">3. 最新文章8月25日</a></li>
            <li class="list-group-item"><a href="">4. 最新文章8月24日</a></li>
            <li class="list-group-item"><a href="">5. 最新文章8月23日</a></li>
          </ul>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "Context",
  data() {
    return {};
  },
  components: {},
};
</script>

<style scoped>

</style>

新建Article.vue文件,把文章列表页迁移

<template>
<div class="col-md-8">
        <h1>最新发布</h1>
        <!-- 标题,标签,分类,留言总数,发布时间 -->
        <article>
          <h2><router-link to="/detail">这是我第一篇文章</router-link></h2>
          <div class="row">
            <div class="col-md-6 col-sm-6">
              <span class="glyphicon glyphicon-folder-open"></span
              >&nbsp;&nbsp;<a href="">标签</a> &nbsp;&nbsp;<span
                class="glyphicon glyphicon-tags"
              ></span
              >&nbsp;&nbsp;<a href="">分类1</a>,<a href="">分类2</a>,<a
                href=""
                >分类3</a
              >
            </div>
            <div class="col-md-6 col-sm-6">
              <span class="glyphicon glyphicon-comment"></span>&nbsp;&nbsp;<a
                href=""
                >200条评论</a
              >
              &nbsp;&nbsp;<span class="glyphicon glyphicon-time"></span
              >&nbsp;&nbsp;<a href="">2020年8月27日上午10点03分</a>
            </div>
          </div>
          <hr />

          <img src="http://placekitten.com/900/300" class="img-responsive" />
          <br />
          <p class="lead">一言是创建于 2016 年的项目,起初是用于个人目的</p>
          <p>
            一言是创建于 2016
            年的项目,起初是用于个人目的。目前已经转为公益项目,由萌创团队运营,为大家提供服务。
            所谓一言(ヒトコト),即一句话。这句话可以是传达了感动,可以是博人一笑,可以是发人深思。总之,一言,代表着言语的触动,灵魂的交流。
          </p>
          <p class="text-right">
            <a href="single_article.html">阅读全文...</a>
          </p>
          <hr />
        </article>

        <article>
          <h2><a href="#">这是我的第一篇文章</a></h2>
          <div class="row">
            <div class="col-md-6 col-sm-6">
              <span class="glyphicon glyphicon-folder-open"></span
              >&nbsp;&nbsp;<a href="">标签</a> &nbsp;&nbsp;<span
                class="glyphicon glyphicon-tags"
              ></span
              >&nbsp;&nbsp;<a href="">分类1</a>,<a href="">分类2</a>,<a
                href=""
                >分类3</a
              >
            </div>
            <div class="col-md-6 col-sm-6">
              <span class="glyphicon glyphicon-comment"></span>&nbsp;&nbsp;<a
                href=""
                >200条评论</a
              >
              &nbsp;&nbsp;<span class="glyphicon glyphicon-time"></span
              >&nbsp;&nbsp;<a href="">2020年8月27日上午10点03分</a>
            </div>
          </div>
          <hr />

          <img src="http://placekitten.com/900/300" class="img-responsive" />
          <br />
          <p class="lead">一言是创建于 2016 年的项目,起初是用于个人目的</p>
          <p>
            一言是创建于 2016
            年的项目,起初是用于个人目的。目前已经转为公益项目,由萌创团队运营,为大家提供服务。
            所谓一言(ヒトコト),即一句话。这句话可以是传达了感动,可以是博人一笑,可以是发人深思。总之,一言,代表着言语的触动,灵魂的交流。
          </p>
          <p class="text-right">
            <a href="single_article.html">阅读全文...</a>
          </p>
          <hr />
        </article>

        <article>
          <h2><a href="#">这是我的第一篇文章</a></h2>
          <div class="row">
            <div class="col-md-6 col-sm-6">
              <span class="glyphicon glyphicon-folder-open"></span
              >&nbsp;&nbsp;<a href="">标签</a> &nbsp;&nbsp;<span
                class="glyphicon glyphicon-tags"
              ></span
              >&nbsp;&nbsp;<a href="">分类1</a>,<a href="">分类2</a>,<a
                href=""
                >分类3</a
              >
            </div>
            <div class="col-md-6 col-sm-6">
              <span class="glyphicon glyphicon-comment"></span>&nbsp;&nbsp;<a
                href=""
                >200条评论</a
              >
              &nbsp;&nbsp;<span class="glyphicon glyphicon-time"></span
              >&nbsp;&nbsp;<a href="">2020年8月27日上午10点03分</a>
            </div>
          </div>
          <hr />

          <img src="http://placekitten.com/900/300" class="img-responsive" />
          <br />
          <p class="lead">一言是创建于 2016 年的项目,起初是用于个人目的</p>
          <p>
            一言是创建于 2016
            年的项目,起初是用于个人目的。目前已经转为公益项目,由萌创团队运营,为大家提供服务。
            所谓一言(ヒトコト),即一句话。这句话可以是传达了感动,可以是博人一笑,可以是发人深思。总之,一言,代表着言语的触动,灵魂的交流。
          </p>
          <p class="text-right">
            <a href="single_article.html">阅读全文...</a>
          </p>
          <hr />
        </article>

        <!-- 分页 -->
        <ul class="pager">
          <li class="previous">
            <a href="#"><span aria-hidden="true">&larr;</span> 上一页</a>
          </li>
          <li class="next">
            <a href="#">下一页 <span aria-hidden="true">&rarr;</span></a>
          </li>
        </ul>
      </div>
</template>

<script>

    export default {
        name: 'Article',
        data() {
            return {
                
            }
        },
        components: {
            
        }
    }
</script>

<style scoped lang='scss'>
    
</style>

新建Detail.vue文件,把详情页面迁移

<template>
  <div class="col-md-8">
    <h1>最新发布</h1>
    <!-- 标题,标签,分类,留言总数,发布时间 -->
    <article>
      <h2>
        <a href="#">这是我的第一篇文章</a>
      </h2>
      <div class="row">
        <div class="col-md-6 col-sm-6">
          <span class="glyphicon glyphicon-folder-open"></span>&nbsp;&nbsp;
          <a href>标签</a>
          &nbsp;&nbsp;
          <span class="glyphicon glyphicon-tags"></span>&nbsp;&nbsp;
          <a href>分类1</a>,
          <a href>分类2</a>,
          <a href>分类3</a>
        </div>
        <div class="col-md-6 col-sm-6">
          <span class="glyphicon glyphicon-comment"></span>&nbsp;&nbsp;
          <a href>200条评论</a>
          &nbsp;&nbsp;
          <span class="glyphicon glyphicon-time"></span>&nbsp;&nbsp;
          <a href>2020年8月27日上午10点03分</a>
        </div>
      </div>
      <hr />

      <img src="http://placekitten.com/900/300" class="img-responsive" />
      <br />
      <p class="lead">一言是创建于 2016 年的项目,起初是用于个人目的</p>
      <p>一言是创建于 2016 年的项目,起初是用于个人目的。目前已经转为公益项目,由萌创团队运营,为大家提供服务。 所谓一言(ヒトコト),即一句话。这句话可以是传达了感动,可以是博人一笑,可以是发人深思。总之,一言,代表着言语的触动,灵魂的交流。</p>
      <ul class="pager">
        <li class="previous">
          <a href="/">返回主页</a>
        </li>
      </ul>
      <div class="well">
        <h4>评论区</h4>
        <form class="clearfix">
          <div class="form-group col-md-6">
            <label for="username">用户名字</label>
            <input type="text" class="form-control" id="username" placeholder="名字" />
          </div>
          <div class="form-group col-md-6">
            <label for="exampleInputEmail1">邮箱</label>
            <input type="email" class="form-control" id="exampleInputEmail1" placeholder="邮箱" />
          </div>
          <div class="form-group col-md-12">
            <textarea class="form-control" id="comment" placeholder="评论内容..."></textarea>
          </div>
          <div class="form-group text-right">
            <button type="submit" class="btn btn-primary">提交</button>
          </div>
        </form>
      </div>

      <hr />
    </article>
  </div>
</template>

<script>
export default {
  name: "Detail",
  data() {
    return {};
  },
  components: {},
};
</script>

<style scoped lang='scss'>
</style>

新建Contact.vue文件,把联系我页面迁移

<template>
  <div class="container" id="body">
    <h1>联系我</h1>
    <div class="well">有问题联系我呀</div>
    <form>
      <div class="form-group">
        <label for="username">用户名字</label>
        <input type="text" class="form-control" id="username" placeholder="名字" />
      </div>
      <div class="form-group">
        <label for="exampleInputEmail1">邮箱</label>
        <input type="email" class="form-control" id="exampleInputEmail1" placeholder="邮箱" />
      </div>
      <div class="form-group">
        <label for="subject">主题</label>
        <input type="text" class="form-control" id="subject" placeholder="主题" />
      </div>
      <div class="form-group">
        <label for="message">消息内容</label>
        <textarea class="form-control" id="message" placeholder="评论内容..."></textarea>
      </div>
      <div class="form-group text-right">
        <button type="submit" class="btn btn-primary btn-lg">提交你的消息</button>
      </div>
    </form>
  </div>
</template>

<script>
export default {
  name: "Contact",
  data() {
    return {};
  },
  components: {},
};
</script>

<style scoped lang='scss'>
</style>

新建About.vue页面把关于我页面迁移

<template>
		<div class="container" id="body">
			<h1>关于我</h1>
			<div class="row" style="margin-bottom: 10px;">
				<div class="col-md-3 col-sm-3">
					<img src="http://placekitten.com/300/350" class="img-thumbnail img-responsive">
				</div>
				<div class="col-md-9 col-sm-9">
					<p>
						任贤齐,1966年6月23日出生于台湾省彰化县,祖籍湖北省武汉市江夏区,中国台湾流行乐男歌手、演员、赛车手、导演 。
					</p>
					<p>
						1990年发行音乐合辑《奔向彩虹》,以歌手身份正式出道。1991年首次出演电影《官兵捉强盗》,进入影视圈。1997年因演唱歌曲《心太软》获得广泛关注 [3]  ,并凭借该歌曲荣获香港电台十大劲爆国语金曲铜奖、香港新城精选104电台国语金奖等奖项 [4]  。1998年发行专辑《爱像太平洋》,专辑中的歌曲《对面的女孩看过来》获得HITFM台北之音音乐网100单曲票选活动的第一名,该歌曲也成为了他在歌唱事业上的代表作品;同年出演古装剧《神雕侠侣》饰演杨过。
					</p>
					<p>
						1999年主演的电影《星愿》上映;同年参加马来西亚越野摩托车比赛中夺得季军 [5]  。2000年发行专辑《为爱走天涯》 [6]  。2001年获得亚洲越野摩托车拉力赛冠军 [7]  。2005年主演的动作片《韩城攻略》在中国和韩国同期上映。2010年凭借电影《火龙对决》获得富川电影节最佳男主角。
					</p>
					<p>
						2013年出演剧情片《下午茶》,该片入围第63届柏林电影节“电影大观”单元 [8]  。2014年执导的纪录片《妈祖迺台湾》在台湾上映,该片打破台湾纪录片上映戏院数量 [1]  ;同年导演并主演爱情喜剧电影《落跑吧爱情》 [2]  。2016年出演警匪片《树大招风》 [9]  ;同年再次回归小荧幕,出演饮食类电视剧《深夜食堂》 [10]  。2019年主演犯罪动作电影《沉默的证人》。
					</p>
				</div>
			</div>
			<div class="row text-center photo">
				<img  src="http://placekitten.com/200/200" >
				<img  src="http://placekitten.com/200/200" >
			</div>
			<p class="lead text-center">以下是我的视频课资源</p>
			<div class="row">
				<div class="col-md-4">
					<div class="thumbnail">
						<a href="#">
							<img src="http://placekitten.com/300/450" class="img-responsive">
						</a>
						<div class="caption text-center">
							<h4>Python基础</h4>
							<p>课程简介</p>
							<button type="button" class="btn btn-primary">立即购买</button>
						</div>
					</div>
				</div>
				<div class="col-md-4">
					<div class="thumbnail">
						<a href="#">
							<img src="http://placekitten.com/300/450" class="img-responsive">
						</a>
						<div class="caption text-center">
							<h4>Django实战开发</h4>
							<p>课程简介</p>
							<button type="button" class="btn btn-primary">立即购买</button>
						</div>
					</div>
				</div>
				<div class="col-md-4">
					<div class="thumbnail">
						<a href="#">
							<img src="http://placekitten.com/300/450" class="img-responsive">
						</a>
						<div class="caption text-center">
							<h4>Flask实战开发</h4>
							<p>课程简介</p>
							<button type="button" class="btn btn-primary">立即购买</button>
						</div>
					</div>
				</div>
			</div>
		</div>
</template>

<script>

    export default {
        name: 'About',
        data() {
            return {
                
            }
        },
        components: {
            
        }
    }
</script>

<style scoped lang='scss'>
    
</style>

在src/App.vue文件下导入刚才写好的组件并在components下注册

  • 其中<router-view />是路由出口
<template>
  <div id='app'>
    <Header></Header>
    <router-view />
    <Footer></Footer>
  </div>
</template>

<script>
import Header from './components/Header';
import Footer from './components/Footer';

export default {
  name: 'App',
  components: {
    Header,
    Footer,
  }
}
</script>

<style>
#body{
    padding-top: 75px;
}
</style>

安装vue-router实现路由切换

使用npm安装

npm install vue-router --save-dev

在src下创建routes.js文件

/* jshint esversion: 6 */
import VueRouter from 'vue-router';
import Vue from 'vue';
import Context from '@/components/Context';
import About from '@/components/About';
import Contact from '@/components/Contact';
import Detail from '@/components/Detail';
import Article from '@/components/Article';

Vue.use(VueRouter);

const router = new VueRouter({
    routes: [
        {
            path: '/',
            name: 'index',
            component: Context,
            children: [
                {
                    path: '',
                    name: '',
                    component: Article
                },
                {
                    path: 'detail',
                    name: 'detail',
                    component: Detail,
                }
            ]
        },
        {
            path: '/about',
            name: 'about',
            component: About,
        },
        {
            path: '/contact',
            name: 'contact',
            component: Contact,
        },
    ]
});

export default router;

在main.js文件中注册写好的路由

/* jshint esversion: 6 */
import Vue from 'vue';
import App from './App.vue';
import router from './routes';

Vue.config.productionTip = false;

new Vue({
  render: h => h(App),
  router
}).$mount('#app');

博客用vue搭建成功!

效果预览

文章列表页

文章详情页

联系我页

关于我页

Vue3不同之处

vue-router路由需在src/route/index.js下写路由切换

/* jshint esversion: 6 */
import { createRouter, createWebHashHistory } from "vue-router";

import Context from '@/components/Context';
import About from '@/components/About';
import Contact from '@/components/Contact';
import Detail from '@/components/Detail';
import Article from '@/components/Article';

const routes = [
    {
        path: "/",
        name: "home",
        component: Context,
        children: [
            {
                path: '',
                name: 'index',
                component: Article
            },
            {
                path: 'detail',
                name: 'detail',
                component: Detail,
            }
        ],
    },
    {
        path: '/about',
        name: 'about',
        component: About,
    },
    {
        path: '/contact',
        name: 'contact',
        component: Contact,
    },
];

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

main.js文件有略微更改

/* jshint esversion: 6 */
import { createApp } from 'vue';
import App from './App.vue';
import {router} from './route';

const app = createApp(App);
app.use(router);
app.mount('#app');

end!

posted @ 2020-12-26 16:31  一文g  阅读(163)  评论(0编辑  收藏  举报