nestjs学习day2

51 阅读2分钟

1.依赖安装

  • session 安装

cnpm i express-session --save

cnpm i @type/express-session -D

  • element-plus 安装

npm i element-plus --save

  • 验证码安装

cnpm i svg-captcha --save

2.代码设置

  • 后端代码
//main.js
import {NestFactory} from '@nestjs/core';
import {AppModule} from './app.module';
import {VersioningType} from "@nestjs/common";
import * as session from 'express-session'
async function bootstrap() {
    const app = await NestFactory.create(AppModule);
      app.enableVersioning({
        type:VersioningType.URI
      })
      app.use(session({secret:"xiaoman",rolling:true,
    name:"xiaoman.sid",cookie:{maxAge:99999}}))
      await app.listen(3000);
}
bootstrap();
//controller.js
import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Version,
  Request,
  Query,
  Headers,
  HttpCode, Req, Res, Session
} from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import * as svgCaptcha from 'svg-captcha';
import * as querystring from "querystring";
// @Controller({path:'user',version:"1"})
@Controller('user')

export class UserController {
  constructor(private readonly userService: UserService) {}
  @Get('code')
  createCode(@Req() req,@Res() res, @Session() session){
    const Captcha=svgCaptcha.create({
      size:4,
      fontSize:50,
      height:34,
      background:'#cc9966',
    })
    session.code=Captcha.text;
    res.type('image/svg+xml');
    res.send(Captcha.data);
  }
  @Post('create')
  createUser(@Body() body,@Session() session){
    console.log(body,session.code)
    if(session?.code?.toLocaleLowerCase()===body?.code?.toLocaleLowerCase()){
      return {
        code:200,
        message:"验证码正确"
      }
    }else{
      return {
        code:200,
        message:"验证码错误"
      }
    }
  }

  @Post()
  //@Request()
  create(@Body() body) {
    return {
      code:200,
      msg:body
    }
  }

  @Get()
  // @Version('1')
  // @Request
  findAll(@Query() req) {
    console.log(req);
    return {
      code: 200,
      msg:req.name
    }
  }

  @Get(':id')
  // @Param('id') id: string
  @HttpCode(500)
  findOne(@Request() req, @Headers() headers) {
    return {
      code: 200,
      msg: req.params,
      headers: headers
    };
  }

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
    return this.userService.update(+id, updateUserDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.userService.remove(+id);
  }
}
  • 前端代码
//main.js
import { createApp } from 'vue'
import App from './App.vue'
import {createPinia} from 'pinia'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// import router from './router'
const app=createApp(App)
app.use(createPinia())
app.use(ElementPlus)
app.mount('#app')
//vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  server:{
    port:3001,
    proxy:{
      '/api':{
        target:'http://localhost:3000/',
        changeOrigin:true,
        rewrite:path => path.replace(/^/api/,''),
      }
    }
  },
  plugins: [vue()]
})
<template>
  <el-form
      ref="ruleFormRef"
      :model="ruleForm"
      status-icon
      :rules="rules"
      label-width="120px"
      class="demo-ruleForm"
  >
    <el-form-item label="username" prop="username">
      <el-input v-model="ruleForm.username"  autocomplete="off" />
    </el-form-item>
    <el-form-item label="passowrd" prop="passowrd">
      <el-input
          v-model="ruleForm.password"
          type="password"
          autocomplete="off"
      />
    </el-form-item>
    <el-form-item label="img" prop="code">
      <el-input v-model="ruleForm.code" />
      <img :src="codeUrl" alt="code" @click="resetCode">
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm(ruleFormRef)"
      >Submit</el-button
      >
      <el-button @click="resetForm(ruleFormRef)">Reset</el-button>
    </el-form-item>
  </el-form>
</template>

<script lang="ts" setup>
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'

const ruleFormRef = ref<FormInstance>()
const codeUrl=ref<string>('/api/user/code')
const resetCode=()=>codeUrl.value=codeUrl.value+'?'+Math.random()
const checkAge = (rule: any, value: any, callback: any) => {
  if (!value) {
    return callback(new Error('Please input the age'))
  }
  setTimeout(() => {
    if (!Number.isInteger(value)) {
      callback(new Error('Please input digits'))
    } else {
      if (value < 18) {
        callback(new Error('Age must be greater than 18'))
      } else {
        callback()
      }
    }
  }, 1000)
}

const validatePass = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('Please input the password'))
  } else {
    if (ruleForm.checkPass !== '') {
      if (!ruleFormRef.value) return
      ruleFormRef.value.validateField('checkPass', () => null)
    }
    callback()
  }
}
const validatePass2 = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('Please input the password again'))
  } else if (value !== ruleForm.pass) {
    callback(new Error("Two inputs don't match!"))
  } else {
    callback()
  }
}

const ruleForm = reactive({
  username: '',
  password: '',
  code: '',
})

const rules = reactive<FormRules<typeof ruleForm>>({
  username: [{ validator: validatePass, trigger: 'blur' }],
  password: [{ validator: validatePass2, trigger: 'blur' }],
  code: [{ validator: checkAge, trigger: 'blur' }],
})

const submitForm = (formEl: FormInstance | undefined) => {
    fetch('/api/user/create',{
      method:'post',
      body:JSON.stringify(ruleForm),
      headers:{
        'content-type':'application/json'
      }
    }).then(res=>res.json()).then(res=>{
      console.log(res)
    })

  // if (!formEl) return
  // formEl.validate((valid) => {
  //   if (valid) {
  //     console.log('submit!')
  //   } else {
  //     console.log('error submit!')
  //     return false
  //   }
  // })
}

const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.resetFields()
}
</script>