给博客写一个后台

感觉是时候开始给博客写一个后端了.

一开始在考虑使用多页应用做后端还是单页应用做后端呢. 多页应用的话需要另开一个url做, 可以申请多一个域名或者用现用域名的新的资源路径. 但是我想这个博客也不大, 目前优化过后打包的大小才几十kb, 就干脆写在一个单页应用上好了.

然后我在博客的某一个私密的地方偷偷加了一个登录入口, 如果你找到了欢迎在contact页面联系我hhhhhh. 然后就是在路由上在加一个路由页面了, 这个路由url被看到了也无妨, 没有获得登录令牌的话是没有用处的.

# 那么以下是教程

# 1. 新建路由 修改router

如图, 新建新路由
该路由页面为管理主页面 同时新增子路由用于嵌套路由 (详见 vue-router : nested-routes (opens new window) )
avatar

# 2. 先编写主页面设计

还是使用element-ui的组件 作为布局容器, 做路由 aside 为导航栏 main 为子路由

  <div class="f">
    <el-container class="container">
      <el-aside width="70px" class="aside">
        <el-menu
          default-active="write"
          class="el-menu-vertical-demo"
          :collapse="true"
          :router="true">
          <el-menu-item index="write">
            <i class="el-icon-document"></i>
            <span slot="title">写博客</span>
          </el-menu-item>
          <el-menu-item index="edit">
            <i class="el-icon-setting"></i>
            <span slot="title">编辑博客</span>
          </el-menu-item>
        </el-menu>
      </el-aside>
      <el-main>
        <router-view></router-view>
      </el-main>
    </el-container>
  </div>

效果如图

avatar

# 3. 新建博客页面

想的是需要一个实时预览的markdown编辑器. 现在先自己做一个简陋的.

布局一分为二 一边做编辑器 , 一边做预览器 两边各使用<el-card>做容器

  <el-row :gutter="10">
    <el-col :span="12"></el-col>
    <el-col :span="12"></el-col>
  </el-row>

左边编辑器暂时使用表单作为编辑器

        <el-form class="edit-form">
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="标题">
                <el-input v-model="form.title"
                          placeholder="标题">>
                </el-input>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="分类">
                <el-input v-model="form.type"
                          placeholder="分类"></el-input>
              </el-form-item>
            </el-col>
          </el-row>
          <el-form-item label="正文">
            <el-input type="textarea"
                      :autosize="{ minRows: 5, maxRows: 10}"
                      placeholder="请输入内容"
                      v-model="form.content"></el-input>
          </el-form-item>
        </el-form>

然后添加监听器侦听form.content的变化 利用原来展示博客的markdown解析器解析内容并实时编译并显示

import HyperDown from 'hyperdown';

const parser = new HyperDown();

export default {
  name: 'Write',
  data() {
    return {
      htmlContent: '',
      form: {
        title: '',
        type: '',
        content: '',
      },
    };
  },
  watch: {
    'form.content': function updateView(content) {
      this.htmlContent = parser.makeHtml(content);
    },
  },
  }

最后是预览的代码

      <el-card class="card view-card" shadow="hover">
        <el-scrollbar class="scrollbar" ref="scrollBar">
          <div class="view-content">
            <h1 v-text="form.title"></h1>
            <p v-text="form.type === '' ? '' : '分类: '+ form.type"></p>
            <div class="html-content" v-html="htmlContent" v-highlight></div>
          </div>
        </el-scrollbar>
      </el-card>

使用了hightlight.js 作为高亮插件. 与vue 有冲突, 要用的话自行google解决

# 4. 最终效果图

final



# 现在一个比较大的问题是编辑器和预览器的滚动条不会自动匹配滚动, 但是滚动条用的是element-ui 的隐藏组件. 这个组件没有文档, 就有点难受了. 日后有机会再修改吧
# 图片放大我会琢磨一下怎么做的
# 后端因为不是本文重点, 就不做介绍了