vue3.0加MongoDB加node的后台管理系统(四)

该博客介绍了如何在Vue3.0项目中结合MongoDB和Node.js实现后台管理系统。内容包括设计注册页面,使用Ant Design Vue的表单组件创建注册功能,实现文件上传接口,图片解析接口,以及登录判断和Token验证。此外,还涉及账号的修改、删除和列表API的定义。
摘要由CSDN通过智能技术生成

接下来到了设计注册页面的时候
首先第一步先定义用户头像上传的接口

引入文件上传模块formidable
引入fs模块用于与文件系统进行交互

npm install formidable
npm install fs
const fs = require('fs')
const formidable = require('formidable')

然后定义上传接口

//上传头像接口
router.post('/file_upload', AuthToken(), function (req, res) {
   
  var form = new formidable.IncomingForm();
  // form.uploadDir = path.join(__dirname, '../../static/'); //文件保存的临时目录为static文件夹(文件夹不存在会报错,一会接受的file中的path就是这个)
  form.maxFieldsSize = 2 * 1024 * 1024; //用户头像大小限制为最大1M    
  form.keepExtensions = true; //使用文件的原扩展名  
  form.parse(req, function (err, fields, file) {
   
    var filePath = '';
    //如果提交文件的form中将上传文件的input名设置为file,就从file中取上传文件。否则取for in循环第一个上传的文件。  
    if (file.file) {
   
      filePath = file.file.path;
    } else {
   
      for (var key in file) {
   
        if (file[key].path && filePath === '') {
   
          filePath = file[key].path;
          break;
        }
      }
    }
    var targetDir = path.join(__dirname, '../static/uploads');
    if (!fs.existsSync(targetDir)) {
   
      fs.mkdir(targetDir);
    }
    var fileExt = filePath.substring(filePath.lastIndexOf('.'));
    //判断文件类型是否允许上传  
    if (('.jpg.jpeg.png').indexOf(fileExt.toLowerCase()) === -1) {
   
      var err = new Error('此文件类型不允许上传');
      res.json({
   
        code: 1001,
        msg: '此文件类型不允许上传'
      });
    } else {
   
      // 以时间戳对当前的上传图片进行命名
      var fileName = new Date().getTime() + fileExt;
      var targetFile = path.join(targetDir, fileName);
      fs.copyFile(filePath, targetFile, 0, (err) => {
   
        if (err) {
   
          res.json({
   
            code: 1001,
            msg: '操作失败'
          });
        } else {
   
          var fileUrl = 'http://' + req.headers.host + '/static/uploads/' + fileName;
          res.json({
   
            code: 1000,
            fileUrl: fileUrl,
            msg: '上传成功'
          });
        }
      })
    }
  })
})

然后定义注册页面,我使用的是Ant Design Vue 使用表单组件加弹出框,进行注册

<template>
  <a-modal :title="title"
           :maskClosable='false'
           v-model:visible="visible"
           :destroyOnClose="true"
           :footer="null"
           :confirm-loading="confirmLoading">
    <a-form ref="ruleForm"
            :model="form"
            :rules="rules"
            :label-col="labelCol"
            :wrapper-col="wrapperCol">
      <a-form-item ref="username"
                   label="账号名称"
                   v-bind="validateInfos.username"
                   name="username">
        <a-input v-model:value="form.username" />
      </a-form-item>
      <a-form-item label="账号密码"
                   v-bind="validateInfos.password"
                   name="password">
        <a-input v-model:value="form.password"
                 placeholder="请输入账号密码" />
      </a-form-item>
      <a-form-item label="联系人"
                   v-bind="validateInfos.phonename"
                   name="phonename">
        <a-input v-model:value="form.phonename"
                 placeholder="请输入联系人" />
      </a-form-item>
      <a-form-item label="联系方式"
                   v-bind="validateInfos.phone"
                   name="phone">
        <a-input v-model:value="form.phone"
                 placeholder="请输入联系方式" />
      </a-form-item>
      <a-form-item label="权限"
                   v-bind="validateInfos.jurisdiction"
                   name="jurisdiction">
        <a-select v-model:value="form.jurisdiction">
          <a-select-option v-for="(item,index) in obj"
                           :key="index"
                           :value="item.key"
                           :label='item.value'>
            {
  {item.value}}
          </a-select-option>
        </a-select>
      </a-form-item>
      <a-form-item v-bind="validateInfos.img"
                   label="上传头像"
                   name='img'>
        <a-upload v-model:fileList="fileList"
                  name="avatar"
                  action='#'
                  list-type="picture-card"
                  class="avatar-uploader"
                  :show-upload-list="false"
                  :beforeUpload="beforeUpload"
                  @change="handleChanges">
          <img v-if="form.img"
               :src="form.img"
               class="img"
               alt="avatar" />
          <div v-else>
            <!-- todo -->
            <loading-outlined v-if="loading" />
            <plus-outlined v-else />
            <div class="ant-upload-text">Upload</div>
          </div>
        </a-upload>
      </a-form-item>
      <a-form-item :wrapper-col="{ span: 14, offset: 4 }">
        <a-button type="primary"
                  @click="onSubmit">
          确定
        </a-button>
        <a-button style="margin-left: 10px;"
                  @click="resetForm">
          取消
        </a-button>
      </a-form-item>
    </a-form>
  </a-modal>
  <a-button class="editable-add-btn"
            type="primary"
            @click="handleAdd">
    新增账号
  </a-button>
</template>
<script>
import {
    onMounted, reactive, toRefs, inject, getCurrentInstance } from 'vue'
import {
    useForm } from '@ant-design-vue/use';
import {
    PlusOutlined, LoadingOutlined } from '@ant-design/icons-vue';
import {
    message } from 'ant-design-vue';
import axios from 'axios'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值