Asp.Net Web API| React.js| EF框架 | SQLite|

asp.net web api + EF + SQLite+React前端框架

設計一個首頁面,包含三個按鈕分別對應三類用戶(數據查看,設計人員,管理員),當點擊管理員的時候彈出一個前端頁面可以輸入信息(以學生數據為例),提交之后后端存儲數據庫。當點擊數據查看的時候,能夠看到管理員錄入的所有的學生數據。


1. 后端部分 (ASP.NET Web API + EF + SQLite)

1.1 創建 ASP.NET Web API 項目
  1. 使用 Visual Studio 或 .NET CLI 創建一個新的 ASP.NET Web API 項目:

    dotnet new webapi -n StudentManagementApi
    cd StudentManagementApi
    
  2. 安裝必要的 NuGet 包:

    dotnet add package Microsoft.EntityFrameworkCore
    dotnet add package Microsoft.EntityFrameworkCore.Sqlite
    dotnet add package Microsoft.EntityFrameworkCore.Tools
    
1.2 配置 SQLite 數據庫和 EF Core
  1. appsettings.json 中配置 SQLite 連接字符串:

    {"ConnectionStrings": {"DefaultConnection": "Data Source=students.db"}
    }
    
  2. 創建 Student 實體類:

    public class Student
    {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Major { get; set; }
    }
    
  3. 創建 ApplicationDbContext

   // 定義數據庫上下文類,用于與數據庫交互
public class ApplicationDbContext : DbContext
{public DbSet<Student> Students { get; set; } // 表示 Students 表// 添加一個接受 DbContextOptions 的構造函數public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options) // 將選項傳遞給基類{}// 如果需要,可以保留無參構造函數(僅用于手動配置)public ApplicationDbContext(){}
}
  1. 添加遷移并更新數據庫:
    dotnet ef migrations add InitialCreate
    dotnet ef database update
    
1.3 創建 API 控制器
  1. 創建 StudentsController
// 定義一個 API 控制器,處理學生數據的增刪改查
[Route("api/[controller]")] // 定義路由前綴為 api/students
[ApiController]
public class StudentsController : ControllerBase
{private readonly ApplicationDbContext _context; // 注入數據庫上下文// 構造函數注入public StudentsController(ApplicationDbContext context){_context = context;}// GET: api/students - 獲取所有學生數據[HttpGet]public async Task<ActionResult<IEnumerable<Student>>> GetStudents(){return await _context.Students.ToListAsync(); // 查詢并返回所有學生數據}// POST: api/students - 添加新學生數據[HttpPost]public async Task<ActionResult<Student>> PostStudent(Student student){_context.Students.Add(student); // 將新學生數據添加到數據庫await _context.SaveChangesAsync(); // 保存更改return CreatedAtAction(nameof(GetStudents), new { id = student.Id }, student); // 返回創建的資源}}

2. 前端部分 (React)

2.1 創建 React 應用
  1. 使用 Create React App 創建前端項目:

    npx create-react-app student-management-frontend
    cd student-management-frontend
    
  2. 安裝 Axios 用于 HTTP 請求:

    npm install axios
    
2.2 設計首頁
  1. 編輯 App.js 文件:
import logo from './logo.svg';
import './App.css';
import React, { useState } from 'react';
import axios from 'axios';function App() {// 定義狀態變量,控制是否顯示管理員表單const [showAdminForm, setShowAdminForm] = useState(false);// 定義狀態變量,存儲從后端獲取的學生數據const [students, setStudents] = useState([]);// 點擊 "Admin" 按鈕時,顯示管理員表單const handleAdminClick = () => {setShowAdminForm(true);};// 點擊 "Data Viewer" 按鈕時,從后端獲取所有學生數據const handleViewDataClick = async () => {try {// 發送 GET 請求到后端 API 獲取學生數據(要注意一致和后端的api一致)const response = await axios.get('https://localhost:5000/api/students');// 更新狀態變量,存儲獲取到的學生數據setStudents(response.data);} catch (error) {console.error('Error fetching students:', error);}};// 提交管理員表單時,將學生數據發送到后端const handleSubmit = async (event) => {event.preventDefault(); // 阻止表單默認提交行為// 獲取表單輸入值const name = event.target.name.value;const age = event.target.age.value;const major = event.target.major.value;try {// 發送 POST 請求到后端 API 添加學生數據await axios.post('https://localhost:5000/api/students', { name, age, major });alert('Student added successfully!'); // 提示用戶操作成功setShowAdminForm(false); // 隱藏表單} catch (error) {console.error('Error adding student:', error);}};return (<div>{/* 頁面標題 */}<h1>Welcome to Student Management System</h1>{/* 功能按鈕 */}<button onClick={handleAdminClick}>Admin</button><button onClick={handleViewDataClick}>Data Viewer</button><button>Designer</button>{/* 管理員表單 */}{showAdminForm && (<form onSubmit={handleSubmit}><h2>Add Student</h2>{/* 輸入學生姓名 */}<input type="text" name="name" placeholder="Name" required />{/* 輸入學生年齡 */}<input type="number" name="age" placeholder="Age" required />{/* 輸入學生專業 */}<input type="text" name="major" placeholder="Major" required />{/* 提交按鈕 */}<button type="submit">Submit</button></form>)}{/* 顯示學生數據 */}{students.length > 0 && (<div><h2>Student List</h2><ul>{/* 遍歷學生數據并顯示 */}{students.map((student) => (<li key={student.id}>{student.name} - {student.age} years old - {student.major}</li>))}</ul></div>)}</div>);
}export default App;

3. 運行項目

3.1 啟動后端

在后端項目目錄下運行:

dotnet run

API 將在 http://localhost:5000 上運行。
運行成功后,彈出swagger UI頁面,測試API接口是否正常;
在這里插入圖片描述

3.2 啟動前端

在前端項目目錄下運行:

npm start

React 應用將在 http://localhost:3000 上運行。


4. 功能測試

  1. 點擊“管理員”按鈕,填寫學生信息并提交。
  2. 點擊“數據查看”按鈕,查看管理員錄入的學生數據。
  3. 確保數據能夠正確存儲到 SQLite 數據庫中,并從前端顯示出來。

5. 結果展示

前端頁面:

在這里插入圖片描述
在這里插入圖片描述

美化頁面

過程中又遇到前端頁面亂碼的問題,這是因為使用visual stdio 創建的js文本中的中文字符存儲的格式問題導致的,具體解決方法是使用記事本打開有中文字符的文檔,然后另存為,把其中的編碼改成UTF-8即可。
在這里插入圖片描述

1. 在src目錄下創建style.css 樣式文件
/* styles.css */
body {font-family: Arial, sans-serif; /* 設置字體 */background-color: #f4f4f4; /* 設置背景顏色 */display: flex; /* 使用 Flexbox 布局 */justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 100vh; /* 設置高度為視口高度 */margin: 0; /* 移除默認外邊距 */
}.app-container {text-align: center; /* 文本居中 */background-color: white; /* 設置容器背景顏色 */padding: 20px; /* 設置內邊距 */border-radius: 8px; /* 設置圓角 */box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* 添加陰影效果 */
}.btn {display: block; /* 將按鈕設置為塊級元素 */width: 200px; /* 設置按鈕寬度 */margin: 10px auto; /* 設置外邊距并水平居中 */padding: 10px; /* 設置內邊距 */color: white; /* 設置文本顏色 */border: none; /* 移除邊框 */border-radius: 4px; /* 設置圓角 */cursor: pointer; /* 設置鼠標指針樣式 */font-size: 16px; /* 設置字體大小 */transition: background-color 0.3s ease; /* 添加過渡效果 */
}.btn-green {background-color: #4CAF50; /* 設置綠色按鈕背景顏色 */
}.btn-green:hover {background-color: #45a049; /* 設置鼠標懸停時的背景顏色 */
}.btn-gray {background-color: #808080; /* 設置灰色按鈕背景顏色 */
}.btn-gray:hover {background-color: #666666; /* 設置鼠標懸停時的背景顏色 */
}.admin-form {margin-top: 20px; /* 設置表單頂部外邊距 */text-align: left; /* 表單內容左對齊 */
}.form-input {display: block; /* 將輸入框設置為塊級元素 */width: 100%; /* 設置輸入框寬度為父元素寬度 */margin-bottom: 10px; /* 設置底部外邊距 */padding: 8px; /* 設置內邊距 */border: 1px solid #ccc; /* 設置邊框 */border-radius: 4px; /* 設置圓角 */
}.student-list ul {list-style-type: none; /* 移除列表樣式 */padding: 0; /* 移除默認內邊距 */
}.student-item {background-color: #f9f9f9; /* 設置列表項背景顏色 */margin: 5px 0; /* 設置上下外邊距 */padding: 10px; /* 設置內邊距 */border-radius: 4px; /* 設置圓角 */box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 添加陰影效果 */
}
2. 修改 App.js

在 App.js 中引入 CSS 樣式文件,并對按鈕進行一些基本的樣式設置:

import React, { useState } from 'react'; // 導入 React 和 useState 鉤子
import axios from 'axios'; // 導入 Axios 用于發送 HTTP 請求
import './styles.css'; // 引入 CSS 樣式文件function App() {const [showAdminForm, setShowAdminForm] = useState(false); // 控制管理員表單的顯示狀態const [students, setStudents] = useState([]); // 存儲學生數據const [formData, setFormData] = useState({name: '', // 學生姓名age: '', // 學生年齡major: '' // 學生專業});// 獲取所有學生數據const fetchStudents = async () => {try {const response = await axios.get('http://localhost:5000/api/students'); // 發送 GET 請求獲取學生數據setStudents(response.data); // 更新學生數據狀態} catch (error) {console.error('獲取學生數據失敗:', error); // 捕獲并打印錯誤信息}};// 提交學生數據const handleSubmit = async (e) => {e.preventDefault(); // 阻止表單默認提交行為try {await axios.post('http://localhost:5000/api/students', formData); // 發送 POST 請求添加新學生數據setShowAdminForm(false); // 關閉管理員表單fetchStudents(); // 刷新學生數據} catch (error) {console.error('提交學生數據失敗:', error); // 捕獲并打印錯誤信息}};return (<div className="app-container">{/* 頁面標題 */}<h1>學生管理系統</h1>{/* 操作按鈕 */}<button className="btn btn-green" onClick={fetchStudents}>數據查看</button> {/* 點擊后獲取學生數據 */}<button className="btn btn-green" onClick={() => setShowAdminForm(true)}>設計人員</button> {/* 顯示設計人員表單 */}<button className="btn btn-gray" onClick={() => setShowAdminForm(true)}>管理員</button> {/* 顯示管理員表單 */}{/* 管理員表單 */}{showAdminForm && (<form onSubmit={handleSubmit} className="admin-form"><h2>錄入學生信息</h2>{/* 姓名輸入框 */}<inputtype="text"placeholder="姓名"value={formData.name}onChange={(e) => setFormData({ ...formData, name: e.target.value })} // 更新表單數據className="form-input"/>{/* 年齡輸入框 */}<inputtype="number"placeholder="年齡"value={formData.age}onChange={(e) => setFormData({ ...formData, age: e.target.value })}className="form-input"/>{/* 專業輸入框 */}<inputtype="text"placeholder="專業"value={formData.major}onChange={(e) => setFormData({ ...formData, major: e.target.value })}className="form-input"/>{/* 提交按鈕 */}<button type="submit" className="btn btn-green">提交</button></form>)}{/* 數據展示 */}<div className="student-list"><h2>學生列表</h2><ul>{students.map((student) => (<li key={student.id} className="student-item">{/* 顯示學生信息 */}{student.name} - {student.age}- {student.major}</li>))}</ul></div></div>);
}export default App;

效果如下圖所示:
在這里插入圖片描述
控制臺報錯:獲取數據失敗,404,大概率是因為App.js中的api路徑寫錯了。注意要和后端一致。
在這里插入圖片描述
可以在Swagger UI中查看確認Request URL;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896730.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[SWPUCTF 2022 新生賽]1z_unserialize

題目描述&#xff1a;是很簡單的反序列化噢 代碼審計看注釋 <?phpclass lyh{ //定義一個類為lyhpublic $url NSSCTF.com;//公共屬性&#xff0c;初始值為NSSCTF.compublic $lt; //公共屬性&#xff0c;沒有初始值public $lly; //公共屬性&…

【數據庫】Update兩階段提交

為什么要兩階段提交 事務提交之后&#xff0c;redo log和bin log 都是需要1持久化到磁盤中&#xff0c;但是這兩個是獨立的邏輯&#xff0c;可能出現半成功的狀態&#xff0c;這樣就造成兩份日志之間的邏輯不一致。如&#xff1a; 以id1&#xff0c;name ‘小明’執行 updat…

【藍橋】排序

1、sort簡介 sort函數包含在頭文件<algorithm>中sort函數使用之前&#xff0c;需要通過#include <algorithm>引入sort函數使用的是快速排列或類似快速排列的改進算法&#xff0c;時間復雜度一般為O(nlog(n)) 2、sort用法 2.1 基礎用法 #include <iostream>…

2024年中國城市統計年鑒(PDF+excel)

2024年中國城市統計年鑒&#xff08;PDFexcel&#xff09; 說明&#xff1a;包括地級縣級市 格式&#xff1a;PDFEXCEL 《中國城市統計年鑒》是一部全面反映中國城市發展狀況的官方統計出版物&#xff0c;包括各級城市的詳細統計數據。這部年鑒自1985年開始出版&#xff0c;…

android 資源selector寫法注意

1、res文件夾下面color文件夾,放的xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/color_brand1" android:s…

藍橋杯 燈籠大亂斗【算法賽】

問題描述 元宵佳節&#xff0c;一場別開生面的燈籠大賽熱鬧非凡。NN 位技藝精湛的燈籠師依次落座&#xff0c;每位師傅都有相應的資歷值&#xff0c;其中第 ii 位師傅的資歷值為 AiAi?。從左到右&#xff0c;師傅們的資歷值逐級遞增&#xff08;即 A1<A2<?<ANA1?&l…

商城源碼的框架

商城源碼的框架通常是基于某種Web開發框架或者電子商務平臺來構建的。以下是一些常見的商城源碼框架&#xff1a; WooCommerce&#xff1a;基于WordPress的電子商務插件&#xff0c;適用于小型到中型的在線商店。 Magento&#xff1a;一個功能強大和靈活的開源電子商務平臺&am…

HarmonyOS 5.0應用開發——多線程Worker和@Sendable的使用方法

【高心星出品】 文章目錄 多線程Worker和Sendable的使用方法開發步驟運行結果 多線程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一種多線程的實現方式&#xff0c;它允許開發者在后臺線程中執行長耗時任務&#xff0c;從而避免阻塞主線程并提高應用的響應性。 S…

避坑!用Docker搞定PHP開發環境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是對環境版本進行了更新&#xff0c;例如php 7.3.7升級到了7.3.8&#xff0c;另外之前的版本有同學踩了坑&#xff0c;主要是官方docker鏡像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian&#xff0c;后面會提到&#xff0c;請各位同學留意。 因為最近換電腦…

自動化測試開發

4、Servlet模型&#xff08;一&#xff09; Servlet的編寫、訪問過程 Servlet簡介 Servlet是Java Servlet的簡稱&#xff0c;是小服務程序或服務連接器&#xff0c;是用Java編寫的服務器端程序&#xff0c;主要功能在于獲取請求&#xff0c;返回響應廣義&#xff1a;一個Ser…

24、Java 集合

十一章&#xff1a;Java 集合 一、集合框架的概述 1、集合&#xff1a;就像一個容器&#xff0c;可以動態的把多個對象的引用放入容器中。簡稱 Java 容器 ? 說明&#xff1a;此時的存儲&#xff0c;主要指的是內存層面的存儲&#xff0c;不涉及到持續化的存儲&#xff08;.t…

1114棋盤問題acwing(深度優先搜索)

題目描述 在一個給定形狀的棋盤&#xff08;形狀可能是不規則的&#xff09;上面擺放棋子&#xff0c;棋子沒有區別。 要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列&#xff0c;請編程求解對于給定形狀和大小的棋盤&#xff0c;擺放 kk 個棋子的所有可行的擺放…

logback日志輸出配置范例

logback日志輸出配置范例 在wutool中&#xff0c;提供了logback日志輸出配置范例&#xff0c;實現日志文件大小限制、滾動覆蓋策略、定時清理等功能。 關于wutool wutool是一個java代碼片段收集庫&#xff0c;針對特定場景提供輕量解決方案&#xff0c;只要按需選擇代碼片段…

測試人員如何驅動開發?

軟件開發中測試人員的作用正在從傳統的缺陷發現者演變為開發過程的主動推動者。特別是在敏捷和 DevSecOps 環境中&#xff0c;測試人員如何通過參與需求、提供反饋和推動自動化來驅動開發&#xff0c;成為一個值得探討的話題。本文將詳細分析測試人員驅動開發的具體方式&#x…

大模型語料庫的構建過程 包括知識圖譜構建 垂直知識圖譜構建 輸入到sql構建 輸入到cypher構建 通過智能體管理數據生產組件

以下是大模型語料庫的構建過程&#xff1a; 一、文檔切分語料庫構建 數據來源確定&#xff1a; 首先&#xff0c;需要確定語料庫的數據來源。這些來源可以是多種多樣的&#xff0c;包括但不限于&#xff1a; 網絡資源&#xff1a;利用網絡爬蟲技術從各種網站&#xff08;如新聞…

oracle游標為什么沒有共享,統計一下原因

-- Script Code為什么沒共享 define sql_id bs391f0yq5tpw;set serveroutput onDECLAREv_count number;v_sql varchar2(500);v_sql_id varchar2(30) : &sql_id; BEGINv_sql_id : lower(v_sql_id);dbms_output.put_line(chr(13)||chr(10));dbms_output.put_line(sql_id: ||…

哈希碰撞攻防戰——深入淺出Map/Set的底層實現

各位看官早安午安晚安呀 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習Map/Set的底層實現 目錄 問題一&#xff1a;hash會出現負數&#xff1f;數組越界 一&#xff1a;什么是二叉搜索樹&#xff1f…

win10使用haneWIN NFS Server掛載NFS v2服務,u-boot通過NFS下載zImage

1. haneWIN NFS Server掛載NFS v2服務 https://www.hanewin.net/nfs-e.htm netstat -ano | findstr ":2049"TCP 0.0.0.0:2049 0.0.0.0:0 LISTENING 3824UDP 0.0.0.0:2049 *:* 38…

Linux文件系統與目錄結構

Linux系統中一切皆文件 bin 是Binary 的縮寫, 這個目錄存放著最經常使用的命令 boot 這里存放的是啟動Linux時使用的一些核心文件&#xff0c;包括一些連接文件以及鏡像文件&#xff0c;自 己的安裝別放這里。 cdrom 這個目錄通常專門用來掛載光盤。當系統剛安裝時&#x…

一文詳解基于NarrotoAI的短劇短視頻自動解說、混剪AI平臺搭建

背景 前陣給孩子做電子相冊學了點剪輯技術&#xff0c;就想湊個熱鬧剪剪短劇玩玩&#xff0c;一是學以 致用&#xff0c;再者也好奇短劇創作為啥這么火&#xff0c;跟個風。 初步了解情況后&#xff0c;發現我的剪輯技術已經落后了&#xff0c;行家們玩的主要是解說 &#xf…