图书馆系统从开发到部署--项目搭建

175 阅读4分钟

前言

这是某个课程的作业项目,虽然不难,但是也是实实在在搞了一个月(去掉划水摸鱼15天左右吧)。这里来记录总结一下。

基本展示

登录界面QQ截图20220429195349.png 借书页面 QQ截图20220429195432.png 因为项目需求是为图书馆服务的,所以需要扫码枪才能顺利使用借还书等功能.....

项目搭建

因为最开始没有搞清楚老师的需求,所以搭建的时候就有些小问题存在。我想的是要同时具有给管理员的后台功能以及给读者用的页面,我就想仿照后台项目进行基础搭建,然后往里面填页面就行了,虽然最后有点小违和但总体还是不错的。

技术栈还是老一套的vue全家桶element-plus

除vue-cli生成的以外,自己需要配置的文件有以下这些

├── src                             // 主目录
    ├── assets                      // 静态资源
    ├── components                  // 全局组件
    ├── store                       // vuex 配置
    ├── less                        // 基本的less样式
    ├── utils                       // 全局方法
    ├── views                       // 路由组件
    ├── App.vue                     // 页面主入口
    ├── main.ts                     // 脚本主入口
├── .eslintrc.js                    // eslint 相关配置
└── vue.config.js                   // vue-cli/webpack 配置

store

assets和components是开发的时候才会编辑,所以直接讲store。

├── store                            
    ├── index.js                   
    ├── getters.js                 
    ├── modules

mapGetters

首先是mapGetters、mapStatus等在vue3中的用法,因为vue3中computed是一个方法,不是像vue2写成一个对象了,所以用法有一些需要注意的地方,用法如下。

    const mapget = mapGetters(["name", "introduction", "avatar"])
    Object.keys(mapget).forEach((itemfn) => {
      const item = computed(mapget[itemfn].bind({ $store: store }))
      user[itemfn] = item
    })

理解起来并不算困难,通过mapGetters获取对应的对象存在mapget里,然后再把每一个对象的$store绑定为store即可。

自动导入

自动导入SVG一样,需要用到require.context。这里主要是省去了每次在modules里添加模块之后再回到index里修改的麻烦,当然router也可以用类似的方式导入,代码如下(这里用reduce还是很巧妙的)。

const Files = require.context("./modules", false, /\.js/)

const modules = Files.keys().reduce((modules, path) => {
  const name = path.replace(/^\.\/(.*)\.js$/, "$1")
  modules[name] = Files(path).default
  return modules
}, {})

less

├── store                            
    ├── index.less                  
    ├── layout.less                 
    ├── navbar.less
    ├── variables.less

index.less都是些全局样式,基本都是从以前的项目里CV过来的,不同项目之间也大同小异。剩下的都是layout相关的样式,其中需要注意的也就只有variablesless变量的用法。

@sidebarBg: white;

@menuActText: #409eff;
@menuText: #606266;

@menuBg: white;
@menuHover: #ecf5ff;

@subMenuBg: white;
@subMenuHover: #ecf5ff;
@subMenuActText: #409eff;

:export {
  menuText: @menuText;
  menuBg: @menuBg;
}

@变量给其他less文件用,要用在js里需要:export导出。

utils

封装的全局方法,这里有很多常用的不同项目之间可以直接CV,例如防抖节流、时间格式化、获取get参数等。具体内容见以后可能会出现的文章。

App.vue

像这种单页面应用,App.vue里基本没有任何内容。

<template>
  <div id="app">
    <router-view />
  </div>
</template>

main.js

这里引入该引入的就行。

eslint

eslint的配置本来是很麻烦的事情,但是因为有了vuecli这种一键自动全配置之后,自己需要改的东西就是rules了。这里就不贴了,很简单。主要是和vscode配合形成保存自动格式化有一点点麻烦。

首先需要下载ESLint和Vetur插件。然后在setting.json里写下

{
    // vscode默认启用了根据文件类型自动设置tabsize的选项
    "editor.detectIndentation": false,
    "editor.formatOnSave": true,
    // #让vue中的js按编辑器自带的ts格式进行格式化 
    "vetur.format.defaultFormatter.js": "none",
    "vetur.format.defaultFormatter.html": "js-beautify-html",
    "vetur.format.defaultFormatterOptions": {
        "js-beautify-html": {
            "wrap_attributes": "force-aligned",
        },
    },
    "workbench.colorTheme": "Default Light+",
    //"vetur.validation.template": false // 两个选择器中是否换行
    // 保存时自动修复 eslint 报错
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    },
    "eslint.options": {},
    "vetur.grammar.customBlocks": {
    
        "docs": "md",
        "i18n": "json"
    }
}

vue.config.js

这个部分也是往细了说能说好久的部分,但是大部分都属于打包部署阶段的事情,对于项目刚刚搭建时,需要注意的仅有引入element-plus,以及一些基础配置。

const { ElementPlusResolver } = require("unplugin-vue-components/resolvers")
module.exports = {
  publicPath: "/app",
  outputDir: "dist",
  assetsDir: "static",
  lintOnSave: process.env.NODE_ENV === "development",
  productionSourceMap: false,
  devServer: {
    port: port,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    }
  },
  configureWebpack: {
    name: name,
    resolve: {
      alias: {
        "@": resolve("src")
      }
    },
    plugins: [
      require("unplugin-auto-import/webpack")({
        resolvers: [ElementPlusResolver({ importStyle: false })]
      }),
      require("unplugin-vue-components/webpack")({
        resolvers: [ElementPlusResolver()]
      }),
      require("unplugin-element-plus/webpack")({
        // options
      })
    ]
  },
  chainWebpack(config) {
    config.module
      .rule("svg")
      .exclude.add(resolve("src/icons"))
      .end()
    config.module
      .rule("icons")
      .test(/\.svg$/)
      .include.add(resolve("src/icons"))
      .end()
      .use("svg-sprite-loader")
      .loader("svg-sprite-loader")
      .options({
        symbolId: "icon-[name]"
      })
      .end()
  }
}

注意下这里如果要用element的v-loading组件的话一定要加上这句话

ElementPlusResolver({ importStyle: false })

其他的部分就是以前说过的自动引入element以及自己内置的svg了。