• vue-koa-mongodb管理系统


    vue - node 前后端管理系统

    地址

    https://github.com/blazer233/try-mangerSystem
    

    启动

    npm i (安装)
    npm run server(启动后端)

    cd client (定位文件夹)
    npm i (安装)
    npm run serve(启动前端)

    前端技术点

    • 登陆校验:由 localstorage 密码保存,路由拦截vuex进行检测是否令牌过期,通过后端 jsonwebtoken 设置过期时间
    //路由守卫 
    router.beforeEach((to, from, next) => {
      const isLogin = localStorage.eleToken ? true : false
      if (to.path == "/login" || to.path == "/register") {
        next()
      } else {
        isLogin ? next() : next("/login")
      }
    })
    
    • 树状层级:通过vue函数式组件,对element-UI的树状图进行进一步分装
      return (
            <div>
              {data.type ?
               (node.expanded ? ( <i class="el-icon-folder-opened"></i>) : (<i class="el-icon-folder"></i>))
               : (<i class="el-icon-document"></i> )}
              {(this.isEdit && this.isSelect(data)) || data.isEdit ? (
                <input
                  placeholder="名称不能为空"
                  class="ly-edit__text"
                  on-keyup={() => this.labelChange()}
                  value={this.edit_label}
                />
              ) : ( <span>{data.label}</span>)}
    
              {this.$store.getters.user.identity ? (
                (this.isEdit && this.isSelect(data)) || data.isEdit ? (
                  <span class="ly-visible">
                    <el-button
                      size="mini"
                      type="text"
                      on-click={() => this.concal(data, node)}
                    >
                      取消
                    </el-button>
                    <el-button
                      size="mini"
                      type="text"
                      on-click={() => this.ok(data, node)}
                    >
                      确认
                    </el-button>
                  </span>
                ) : (
                  <span class="ly-visible">
                  </span>
                )
              ) : (
                ""
              )}
            </div>
          );
    
    • 状态管理:通过Vue插件原理,手写实现store效果
    function install(_Vue) {
        Vue = _Vue
        _Vue.mixin({
            beforeCreate() {
                // 在vue原型上注册$store
                if (this.$options && this.$options.store) {
                    Vue.util.defineReactive(this, "$store", this.$options.store)
                } else {
                    this.$store = this.$parent && this.$parent.$store;
                }
            }
        })
    }
    ...
    
    • 组件分离:通过组件化,将所有表单、表格进行抽离,
    <!-- 筛选表单 -->
    <koa-search
        :type_="0"    
        :search_all="tableSearch"
        :controlType="controlType"
        @getList="getProfile"
        size="mini"
        :isinline="true"
    />
    <!-- 内容表格 -->
    <koa-table
    :tableHeader="tableHeader"
    :tableData="tableData"
    :total="total"
    @pagination_size_change="set_getProfile"
    @delOne="onDeleteMoney"
    @editOne="onEditMoney"
    />
    
    • 自定指令:构建多个自定义指令,对代码进行优化
    //防抖 
    Vue.directive('debounce', {
      inserted: function (el, binding) {
        el.addEventListener("keyup", debounce(binding.value, 200))
      }
    })
    //节流 
    Vue.directive('throttle', {
      inserted: function (el, binding) {
        el.addEventListener("keyup", throttle(binding.value, 200))
      }
    })
    //时间戳转换
    Vue.directive('DateFormat', {
      inserted: function (el, binding) {
        el.innerHTML = DateFormat(binding.value)
      }
    })
    
    • 使用插件:使用vue-socket.io、vue-quill-editor、vue-schart等插件对项目进行维护
    • 请求拦截:对axios进行拦截和响应,对整体api进行抽离和封装

    后技术点

    • 文件读写:将文件读写独立封装为构造函数,支持 async await 操作(pdf文件上传、图片上传)
    module.exports = class FileUtils {
        constructor() {}
        checkFile(path) {
            return new Promise((resolve, reject) => {
                try {
                    let result = fs.existsSync(path);
                    if (result) {
                        resolve(true)
                    } else {
                        resolve(false)
                    }
                } catch (e) {
                    reject(e)
                }
            });
        }
        ...
    
    • 密码加密:使用bcrypt,将密码加盐加密
     let hash_ = bcrypt.compareSync(ctx.request.body.password_log, find_.password);
    if (!hash_) {
        ctx.body = {
            info: '密码错误',
            success: false
        }
    } else {
        let pay = {
            id: find_.id,
            name: find_.username,
            date: find_.date,
            avatar: find_.avatar,
            identity: find_.identity,
            email: find_.email
        }
        let token = jwt.sign(pay, 'art', {
            expiresIn: 10 * 60 * 60 * 2
        });
        ctx.body = {
            success: true,
            token: `Bearer ${token}`
        }
    
    • 数据查询:通过多种查询方法对数据进行模糊查询
    let find_ = await User.find({
        username: {
            $regex: ctx.request.query.userName
        },
        identity: true
    })
    
    • 数据保存:通过 mongoose 操纵数据库模型改变mongodb数据
    const mongoose = require('mongoose')
    const Schema = mongoose.Schema
    const newSchema = new Schema({
        username: {
            type: String,
            required: true
        },
        password: {
            type: String,
            required: true
        },
        email: {
            type: String,
            required: true
        },
        identity: {
            type: Boolean,
            required: true
        },
        avatar: {
            type: String
        },
        date: {
            type: Date,
            default: new Date().getTime()
        },
    })
    module.exports = User = mongoose.model('User', newSchema)
    
    • 权限控制:设置权限管理
  • 相关阅读:
    用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REM_addr
    Backbone源码分析-Backbone架构+流程图
    为什么我的SQL server 在附加数据库后,数据库总是变成了只读?
    js window.open()实现打印,如何在关闭打印窗口时刷新父窗口
    .NET获取不到js写的cookie解决方法
    网站安全狗”响应内容保护“网页错误返回页面优化功能介绍
    快钱支付与Sql Server的乐观锁和悲观锁
    RequiredFieldValidator 根据group组来触发验证
    DropDownList中显示无限级树形结构
    大量多风格多功能后台管理模板
  • 原文地址:https://www.cnblogs.com/GET-one/p/13511260.html
Copyright © 2020-2023  润新知