vue3+axios+vite+ts前后端联动

有错误欢迎大家给我指正

说明:本文vue3+vite+ts+elementui,,联动后端接口,db first模式(手动创建数据库)

1.netcore webapi+net6+EF Core版本,db first模式(手动创建数据库)见:使用EF Core创建webapi接口(一)-CSDN博客

2.netcore webapi+net6+EF Core版本,codefirst模式(代码生成数据库)见:使用EF Core创建webapi接口(二)-CSDN博客

3.netcore webapi+net6+sqlsugar+vue2前后端联动版本,见:Sqlsugar+vue2实现增删改查,分页查询,net6实现_.net core 6.0 sqlsugar-CSDN博客

页面预览

1.创建项目

创建一个空文件夹用vs code打开,进入集成终端

输入vue create vue@latest

输入项目名称todo

只有TypeScript语法选是,其余都选否

cd todo

npm install

npm run dev查看是否配置成功

删除多余文件:src/assets、src/components、main.ts的第一句

2.准备

npm i axios

npm install element-plus --save

在main.ts引入element

import { createApp } from 'vue'
import App from './App.vue'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app=createApp(App)
app.use(ElementPlus)
app.mount('#app')

创建文件useAxios.ts引用axios

//导入axios
import axios from 'axios'

const API = axios.create({
	baseURL:'http://localhost:5220/api', //请求后端数据的基本地址
	timeout: 2000                   //请求超时设置,单位ms
})

//导出
export default API

3.主页面编写

<template>
  <div class="about">
    <div>总数据数:{{ totalCount }}</div>
    <!-- 添加框 -->
    <input @keyup.enter="addTodo" v-model="inputValue" placeholder="你要输入什么?" autofocus
      style="width: 400px;height: 30px;" />
    <el-button @click="addTodo" type="primary">添加</el-button>
    <!-- 数据展示 -->
    <el-table :data="testData.list" style="width: 100%">
      <el-table-column prop="id" label="ID" width="180" />
      <el-table-column prop="title" label="Title" width="180" />
      <el-table-column label="btn">
        <template #default="{ row }">
          <el-button @click="deleteTodo(row.id)" type="primary">删除</el-button>
          <el-button @click="showInput(row.id)" type="primary">修改</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 上一页\下一页\指定页数跳转 -->
    <el-button @click="lastPage()" type="primary">上一页</el-button>
    <el-select @change="gotoPage" v-model="pageNumber" placeholder="1" style="width: 100px">
      <el-option v-for="item in totalPage" :key="item" :label="item" :value="item" />
    </el-select>
    <el-button @click="nextPage()" type="primary">下一页</el-button>

    <div>{{ pageNumber }}/{{ totalPage }}</div>
    <!-- 修改框 -->
    <div v-show="boolShowUInput">
      <input @keyup.enter="addTodo" v-model="updateValue" placeholder="输入要修改的值" autofocus
        style="width: 150px;height: 30px;" />
      <el-button @click="updateTodo" type="primary">确认</el-button>
      <el-button @click="hideInput" type="primary">取消</el-button>
    </div>

  </div>
</template>

<script setup lang="ts">
import { reactive, onMounted, ref } from 'vue'
import API from "./hook/useAxios"

const testData = reactive({
  list: []
});
let pageNumber = ref(1)//初始页数
let PageSize = ref(5)//每页数据数
let totalPage = ref(0)//总页数
let totalCount = ref(0)//总数据数
let inputValue = ref("")//添加输入框的值
let updateValue = ref("")//修改输入框的值
let boolShowUInput = ref(false)//是否展示修改输入框
let updateId = ref(0)//修改列id

// 按页查询所有数据
function GetByPage() {
  API({
    url: '/Todo/GetByPage?PageIndex=' + pageNumber.value + '&PageSize=' + PageSize.value,
    method: 'get'
  }).then((res: any) => {
    testData.list = res.data.data
    totalCount.value = res.data.totalCount;//数据总数量
    totalPage.value = Math.ceil(res.data.totalCount / PageSize.value); // 总页数=数据总数/单页数据数,并向上取整
  }).catch((error) => {
    console.error(error);
  });;
}
// 上一页
function lastPage() {
  if (pageNumber.value > 1) {
    pageNumber.value--;
    GetByPage();
  }
}
// 下一页
function nextPage() {
  if (pageNumber.value < totalPage.value) {
    pageNumber.value++;
    GetByPage();
  }
}
// 点击下拉框选中的页数跳转
function gotoPage() {
  API({
    url: '/Todo/GetByPage?PageIndex=' + pageNumber.value + '&PageSize=' + PageSize.value,
    method: 'get'
  }).then((res: any) => {
    testData.list = res.data.data
  }).catch((error) => {
    console.error(error);
  });
}
// 删除指定行数据
function deleteTodo(id: number) {
  API({
    url: '/Todo/Delete?id=' + id,
    method: 'delete'
  }).then((res: any) => {
    GetByPage()
  }).catch((error) => {
    console.error(error);
  });
}
// 添加数据
function addTodo() {
  const title = inputValue.value.trim();//获取输入框的值并去除字符串两端的空白字符
  //检查title是否有值,为空停止
  if (!title) {
    return;
  }
  API({
    url: '/Todo/Create?Title=' + title,
    method: 'post'
  }).then((res: any) => {
    if (res.data) {
      //添加后清空输入框的值
      inputValue.value = "";
      GetByPage()
    } else {
      console.log("error");
      return false;
    }
  }).catch((error) => {
    console.error(error);
  });
}
// 修改数据
function updateTodo() {
  const title = updateValue.value.trim();//获取输入框的值并去除字符串两端的空白字符
  if (!title) {
    return;
  }
  API({
    url: '/Todo/Update?id=' + updateId.value,
    method: 'put',
    data: {
      title: title
    }
  }).then((res: any) => {
    //添加后清空
    updateValue.value = "";
    boolShowUInput.value = false;
    GetByPage()

  }).catch((error) => {
    console.error(error);
  });
}
// 展示修改框
function showInput(id: number) {
  boolShowUInput.value = true;
  updateId.value = id
}
// 隐藏修改框
function hideInput() {
  boolShowUInput.value = false;
}
onMounted(() => {
  GetByPage();
});
</script>

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值