基于ASP.NET+MySQL实现待办任务清单系统

基于ASP.NET的ToDoList的设计与实现

一、前言

1.1 实验目的

使学生综合使用所学过的ASP.NET网络编程知识,掌握网络环境程序设计的基本概念;结合实际的操作和设计,巩固课堂学习内容,掌握网络环境编程的特点、原理和技术;将理论与实际相结合,应用现有的网络编程软件,结合数据库管理系统软件,规范、科学地完成一个小型网站的设计与实现。在此基础上强化学生的实践意识、提高其实际动手能力和创新能力。

1.2 设备与环境

软件环境

  1. ASP.NET Core v3.1
  2. Mysql v8.x
  3. VUE v2.x
  4. Element-UI
  5. git/github
  6. NodeJS/npm
  7. Dotnet

开发环境

  1. Macbook(苹果系统)
  2. vscode(安装c#插件)

开发环境也可以使用Windows系统,此项目开发时我用的mac环境~

二、项目内容

2.1 项目简介

基于ASP.NET Core API 和 VUE实现的ToDoList(待办事项),前后端分离实现(使用RESTFUL规范)

2.2 项目展示

2.3 如何运行此项目

1.下载本项目

下载之后修改todos-Server/DBConnection.cs路径下的数据库配置文件,且自行导入sql文件/todos-Server/todoList.sql

2.安装前端依赖/运行前端

cd todos-fe
npm install # 安装前端依赖
npm run serve # 运行前端项目

3.安装服务端依赖

cd todos-Server
dotnet restore # 安装服务端依赖
dotnet run # 运行服务端项目

三、实验内容

3.1 数据库相关

数据表结构

CREATE TABLE `items` (`id` int(11) NOT NULL AUTO_INCREMENT,`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '待办事项内容',`createTime` datetime NOT NULL COMMENT '创建时间',`overTime` datetime DEFAULT NULL COMMENT '实际完成时间',`expectTime` datetime DEFAULT NULL COMMENT '预期完成时间',`isComplete` enum('true','false') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'false' COMMENT '完成状态',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

数据库操作代码单例封装

详情代码参考/todos-Server/DBConnection.cs文件

// 连接数据库
string connstring ="Server=127.0.0.1;" +"Database=todoList;" +"User ID=root;" +"Password=123456789;";
connection = new MySqlConnection(connstring);
connection.Open();
// 数据库操作关键语句
DBConnection db = DBConnection.Instance ();
if (db.IsConnect ()) { // 连接数据库try {string sql = "DELETE FROM todoList.items WHERE id=" + id;MySqlCommand cmd = new MySqlCommand (sql, db.Connection);MySqlDataReader rdr = cmd.ExecuteReader ();rdr.Close ();} catch (Exception ex) {Console.WriteLine (ex.ToString ());}
}

3.2 接口Sql语句

新建待办事项

string sql = "INSERT INTO todoList.items (title,expectTime,createTime) VALUES (\"" +title + "\",\"" +expectTime.ToString ("yyyy-MM-dd HH:mm:ss") + "\",\"" +DateTime.Now.ToString ("yyyy-MM-dd HH:mm:ss") + "\")";Console.WriteLine ("sql is => " + sql);

获取待办事项

string sql = "SELECT * FROM todoList.items ORDER BY id DESC LIMIT " + (page - 1) * size + "," + size;

完成事项

string sql = "UPDATE todoList.items SET isComplete=\"true\", overTime=\""+ DateTime.Now.ToString ("yyyy-MM-dd HH:mm:ss") + "\""+ "WHERE id=" + id;

删除事项

string sql = "DELETE FROM todoList.items WHERE id=" + id;

3.3 难点重点

前后端分离导致的跨域问题

因为浏览器出于安全考虑,有同源策略。也就是说,如果协议、域名或者端口有一个不同就是跨域,Ajax 请求会失败。

那么是出于什么安全考虑才会引入这种机制呢? 其实主要是用来防止 CSRF 攻击的。简单点说,CSRF 攻击是利用用户的登录态发起恶意请求。

也就是说,没有同源策略的情况下,A 网站可以被任意其他来源的 Ajax 访问到内容。如果你当前 A 网站还存在登录态,那么对方就可以通过 Ajax 获得你的任何信息。当然跨域并不能完全阻止 CSRF。

然后我们来考虑一个问题,请求跨域了,那么请求到底发出去没有? 请求必然是发出去了,但是浏览器拦截了响应。你可能会疑问明明通过表单的方式可以发起跨域请求,为什么 Ajax 就不会。因为归根结底,跨域是为了阻止用户读取到另一个域名下的内容,Ajax 可以获取响应,浏览器认为这不安全,所以拦截了响应。但是表单并不会获取新的内容,所以可以发起跨域请求。同时也说明了跨域并不能完全阻止 CSRF,因为请求毕竟是发出去了。

解决方法: CORS

CORS 需要浏览器和后端同时支持。IE 8 和 9 需要通过 XDomainRequest 来实现。

浏览器会自动进行 CORS 通信,实现 CORS 通信的关键是后端。只要后端实现了 CORS,就实现了跨域。

服务端设置 Access-Control-Allow-Origin 就可以开启 CORS。 该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。

C#中通过中间件CORS解决,具体代码如下:
// Startup.cs文件public void ConfigureServices(IServiceCollection services) {services.AddCors(option=>option.AddPolicy("cors", policy => policy.AllowAnyHeader().AllowAnyMethod().AllowCredentials().WithOrigins(new []{"http://127.0.0.1:8080"})));
}public void Configure() {app.UseCors("cors");
}

虽然设置 CORS 和前端没什么关系,但是通过这种方式解决跨域问题的话,会在发送请求时出现两种情况,分别为简单请求和复杂请求。

简单请求

以 Ajax 为例,当满足以下条件时,会触发简单请求

使用下列方法之一:

  • GET
  • HEAD
  • POST

Content-Type 的值仅限于下列三者之一:

  • text/plain
  • multipart/form-data
  • application/x-www-form-urlencoded

请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器; XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。

复杂请求

那么很显然,不符合以上条件的请求就肯定是复杂请求了。

对于复杂请求来说,首先会发起一个预检请求,该请求是 option 方法的,通过该请求来知道服务端是否允许跨域请求。

数据列表分页

// 服务端使用sql的limit语法进行分页处理
string sql = "SELECT * FROM todoList.items ORDER BY id DESC LIMIT " + (page - 1) * size + "," + size;
// sql is => SELECT * FROM todoList.items ORDER BY id DESC LIMIT 0,20

api接口获取列表时传入page和pageSize

分页api

前端使用分页组件

服务端返回实例

{"sum": 3,"list": [{"id": 3,"title": "完成前端内容","isComplete": false,"createTime": "2019-12-24T16:31:39","overTime": null,"expectTime": "2019-12-24T14:31:30"},// ...]
}

四、实验感悟

经过两周的ASP.NET课程设计,学习了csharp编写服务端代码,更加深入理解了语言的想通性,ASP.NET和NodeJS中有很多相似的概念,比如中间件,控制器,模型等。经过学习C#,感受到了C#作为一门优秀的静态类型语言相比于JavaScript的强势优点,更完善的代码提示和函数跳转等,感受到了JS转typeScript的必要性,使用静态类型语言可以减少代码编写过程中由于粗心造成的BUG,减少拍错时间等。还有,这次课设和同学交流了一些,强烈建议学校课设能使用git工具进行项目管理,从大一到大四,课设皆通过github托管,到大四的时候,将收获颇多。计算机系的课设文档也建议由word转向markdown编写,能很快的提高效率,并且markdown是毕业工作之后的必备能力之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普通 html 项目引入 tailwindcss

项目根目录安装依赖 npm install -D tailwindcss3 postcss autoprefixer 初始化生成tailwind.config.js npx tailwindcss init 修改tailwind.config.js /** type {import(tailwindcss).Config} */ module.exports {content: ["./index.html"], //根据自己的项目…

汽车免拆诊断案例 | 2015款奔驰C200L车发动机起动延迟

故障现象  一辆2015款奔驰C200L车,搭载274发动机,累计行驶里程约为15.6万km。该车发动机起动延迟,且发动机故障灯异常点亮。 故障诊断  用故障检测仪检测,发动机控制单元中存储有故障代码“P001685 进气凸轮轴(气缸…

[蓝桥杯 2025 省 B] 水质检测(暴力 )

暴力暴力 菜鸟第一次写题解,多多包涵!!! 这个题目的数据量很小,所以没必要去使用bfs,直接分情况讨论即可 一共两排数据,我们使用贪心的思想,只需要实现从左往右的过程中每个检测器相互连接即…

网络接口返回类ResponseEntity

网络接口返回类ResponseEntity 简介方法获取工厂方法ResponseEntity.ok()返回BodyBuilder返回文字信息返回类对象(Spring自动转换为json格式)返回空内容‌ ResponseEntity.notFound()返回HeadersBuilder返回文字信息 status(HttpStatus)返回BodyBuildern…

Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡

Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡 一、Redis的本质与核心价值 1.1 Redis的技术定位 Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,由Salvatore Sanfilippo于2009年创建。它不同于传…

macOS上管理多个Node.js版本

管理工具 fnm 和 nvm nvm:作为最广泛使用的 Node.js 版本管理器,使用 Bash 编写,适用于类 UNIX 环境(如 macOS 和 Linux),也可以通过兼容的 shell(如 WSL)在 Windows 上使用。fnm:(Fast Node Manager)一种较新的、快速…

uDistil-Whisper:低数据场景下基于无标签数据过滤的知识蒸馏方法

uDistil-Whisper: Label-Free Data Filtering for Knowledge Distillation in Low-Data Regimes 会议:2025年NAACL 机构:卡内基梅降大学 Abstract 近期研究通过伪标签(pseudo-labels)将Whisper的知识蒸馏到小模型中&#xff0…

【MySQL】-- 数据库约束

文章目录 1. 什么是数据库约束2. 约束类型3. NOT NULL 非空约束4. DEFALUT 默认值约束5. UNIQUE 唯一约束6. PRIMARY KEY 主键约束6.1 自增主键6.1 一个自增主键包含多个列 7. FOREIGN KEY 外键约束8. CHECK 约束 1. 什么是数据库约束 数据库约束是指对数据库表中的数据所施加…

鸿蒙NEXT开发动画案例2

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件,代码如下: // 接口定义(必须放在使用前) /*** 关键帧动画整体配置参数*/ interface KeyframeAnimationConfig {iterations: number;delay: number; }/*** 单个关键帧动画项*/…

团队协作的润滑剂——GitHub与协作流程

各位代码界的社交恐惧症患者们,今天我们要聊的是如何假装自己很会团队协作——使用GitHub!这就像程序员版的"相亲平台",只不过在这里,你展示的不是自拍和收入,而是代码和commit记录(后者往往更令…

「Mac畅玩AIGC与多模态13」开发篇09 - 基于多插件协同开发智能体应用(天气+名言查询助手)

一、概述 本篇介绍如何在 macOS 环境下,同时接入多个自定义 OpenAPI 插件,实现智能体根据用户请求自动分析,调用天气查询或名言查询服务,完成多功能协同应用开发。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部…

react-12父子组件间的数据传递(子传父)(父传子)- props实现

1.子组件调用父组件的函数并传递数据(子传父) 1.1父组件 import React, { Component } from react; import ChildComponent from ./ChildComponent;class ParentComponent extends Component {constructor(props) {super(props);this.state {items: […

Spring Boot 单元测试使用教程(仅供参考)

单元测试是软件开发中至关重要的一环&#xff0c;Spring Boot 提供了强大的测试支持。以下是 Spring Boot 单元测试的详细教程。 1. 准备工作 1.1 添加测试依赖 在 pom.xml 中添加测试相关依赖&#xff1a; <dependency><groupId>org.springframework.boot</…

React Hooks速成

1、useReducer 适用情况为对一个状态多种复杂操作,通俗的讲就是比如对count这个变量加减乘除的各种情况 改造前 import { useState } from "react";function App() {//计数器const [count, setCount] useState(0);const handleIncrement () > {setCount(coun…

k8s node 内存碎片化如何优化?

在 Kubernetes 集群中&#xff0c;内存碎片化&#xff08;Memory Fragmentation&#xff09;会导致系统无法分配连续的内存块&#xff0c;即使总内存充足&#xff0c;也可能触发 OOM&#xff08;Out of Memory&#xff09;或影响性能。以下是针对 k8s Node 内存碎片化的优化策略…

目标检测(Object Detection)研究方向常用数据集简单介绍

目录 一、目标检测研究方向简介 二、目标检测常用数据集详解 通用目标检测数据集 领域专用数据集 三、数据集选择建议 一、目标检测研究方向简介 目标检测是计算机视觉的核心任务之一&#xff0c;旨在从图像或视频中定位并识别出所有感兴趣的物体&#xff0c;输出其类别和…

即开即用,封装 Flask 项目为 exe 文件实操步骤

见字如面&#xff0c;朋友们&#xff01; 嗨&#xff0c;这里是 AIGC 创意人_竹相左边&#xff01; 正如你们所知&#xff0c;我正在通过 AI 自学软硬件工程师&#xff0c;目标是手搓一台可回收火箭玩具&#xff01; 最近&#xff0c;我被《流浪地球 2》中马兆的那句“没有硬…

uniapp开发微信小程序时如何进行分包(新手图文)

我们在进行uniapp微信小程序开发的时候&#xff0c;每次上传都提示包太大&#xff0c;主包大小不能超过 2M&#xff0c; 这就很头疼&#xff0c;这个时候&#xff0c;唯一的解决方案就是分包了&#xff0c;那如何进行分包呢&#xff1f; 分包步骤如下&#xff1a; 一、配置man…

基于C++的IOT网关和平台2:github项目ctGateway技术说明书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…

从巴别塔到通天塔:Manus AI 如何重构多语言手写识别的智能版图

一、引言&#xff1a;当人类手写遇上 AI “巴别塔” 在幼发拉底河畔的古老传说中&#xff0c;巴别塔的崩塌象征着人类语言互通的终结。而在数字时代&#xff0c;全球 7000 余种语言的手写文字&#xff0c;正成为横亘在人机交互之间的新 “巴别塔”—— 阿拉伯文的连笔天书、中…