基于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.pswp.cn/pingmian/79750.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79750.shtml
英文地址,請注明出處:http://en.pswp.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;正成為橫亙在人機交互之間的新 “巴別塔”—— 阿拉伯文的連筆天書、中…