vue3+flask+sqlite前后端項目實戰

基礎環境安裝

pycharm

下載地址:
https://www.jetbrains.com/zh-cn/pycharm/download/?section=windows

在這里插入圖片描述

vscode

下載地址
https://code.visualstudio.com/docs/?dv=win64user

python

下載地址
https://www.python.org/downloads/windows/

在這里插入圖片描述

Node.js(含npm)

下載地址
https://nodejs.org (推薦LTS版本)

在這里插入圖片描述

后端項目

在這里插入圖片描述

項目結構

api/
├── models/
│   ├── __init__.py
│   └── user_model.py
├── dao/
│   ├── __init__.py
│   └── user_dao.py
├── instance/
│   └── app.db
├── routes/
│   ├── __init__.py
│   └── user_route.py
├── utils/
│   ├── __init__.py
│   └── sqlite3_util.py
├── config.py
├── run.py
└── requirements.txt

requirements.txt

blinker1.8.2
click
8.1.8
colorama0.4.6
Flask
3.0.0
Flask-Cors5.0.0
Flask-SQLAlchemy
3.1.1
greenlet3.1.1
importlib_metadata
8.5.0
itsdangerous2.2.0
Jinja2
3.1.6
MarkupSafe2.1.5
SQLAlchemy
2.0.40
typing_extensions4.13.2
Werkzeug
3.0.1
zipp==3.20.2

①生成 requirements.txt
pip freeze > requirements.txt
②基于 requirements.txt 安裝
pip install -r requirements.txt

daos/user_dao.py

import sqlite3
from werkzeug.security import generate_password_hashclass UserDAO:@staticmethoddef get_connection():return sqlite3.connect('instance/app.db')@staticmethoddef get_all_users():conn = UserDAO.get_connection()cursor = conn.cursor()cursor.execute("SELECT id, username FROM users")users = cursor.fetchall()conn.close()return [{'id': row[0], 'username': row[1]} for row in users]@staticmethoddef create_user(username, password):conn = UserDAO.get_connection()cursor = conn.cursor()cursor.execute("SELECT id FROM users WHERE username = ?", (username,))if cursor.fetchone():conn.close()return Nonepassword_hash = generate_password_hash(password)cursor.execute("INSERT INTO users (username, password_hash) VALUES (?, ?)", (username, password_hash))conn.commit()conn.close()return {'username': username}@staticmethoddef delete_user(user_id):conn = UserDAO.get_connection()cursor = conn.cursor()cursor.execute("DELETE FROM users WHERE id = ?", (user_id,))conn.commit()success = cursor.rowcount > 0conn.close()return success

models/user_model.py

import sqlite3def init_db():conn = sqlite3.connect('instance/app.db')cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT UNIQUE NOT NULL,password_hash TEXT NOT NULL)''')conn.commit()conn.close()

routes/user_route.py

from flask import Blueprint, request, jsonify
from api.daos.user_dao import UserDAObp = Blueprint('user', __name__)@bp.route('/users', methods=['GET'])
def get_users():users = UserDAO.get_all_users()return jsonify(users)@bp.route('/register', methods=['POST'])
def register():data = request.jsonusername = data.get('username')password = data.get('password')user = UserDAO.create_user(username, password)if user:return jsonify(user), 201else:return jsonify({'error': 'User already exists'}), 409@bp.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):success = UserDAO.delete_user(user_id)if success:return jsonify({'message': 'User deleted successfully'}), 200else:return jsonify({'error': 'User not found'}), 404

utils/sqlite3_util.py

import sqlite3def init_db():conn = sqlite3.connect('instance/app.db')cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT UNIQUE NOT NULL,password_hash TEXT NOT NULL)''')conn.commit()conn.close()

run.py

from flask import Flask
from flask_cors import CORS
from routes.user_route import bp as user_bp
from utils.sqlite3_util import init_dbapp = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})app.config.from_object('config.Config')app.register_blueprint(user_bp, url_prefix='/api')if __name__ == '__main__':init_db()app.run(debug=True, host='0.0.0.0')

啟動

python app.py // 或者直接右鍵該文件運行

在這里插入圖片描述

前端項目

新建vue項目

npm create vue@latest
uicd ui
npm installnpm install vue-router@4 axios element-plus @element-plus/icons-vue

在這里插入圖片描述

pycharm打開效果

在這里插入圖片描述

修改 src/assets/main.css

/* 導入基礎樣式文件 */
@import './base.css';/** 主應用容器樣式* 作用:包裹整個Vue應用的根容器*/
#app {margin: 0 auto;                   /* 水平居中 */padding: 2rem;                    /* 內邊距(會被下方規則覆蓋) */font-weight: normal;              /* 繼承基礎樣式字體粗細 */display: block !important;        /* 強制覆蓋可能的grid布局,使用塊級布局 */width: 100%;                      /* 撐滿可用寬度 */grid-template-columns: 1fr 1fr;   /* 網格列定義(實際被block覆蓋無效) */padding: 0 2rem;                  /* 重定義左右內邊距(覆蓋上方padding) */
}/** 鏈接及特殊文本樣式* 作用:統一超鏈接和.green類元素的視覺效果*/
a,
.green {text-decoration: none;            /* 去除下劃線 */color: hsla(160, 100%, 37%, 1);   /* Vue品牌綠色 (HSL格式) */transition: 0.4s;                 /* 顏色過渡動畫時長 */padding: 3px;                     /* 內邊距增強可點擊區域 */
}/** 懸停效果媒體查詢* 作用:只在支持hover的設備上應用懸停效果*/
@media (hover: hover) {a:hover {background-color: hsla(160, 100%, 37%, 0.2);  /* 半透明綠色背景 */}
}

修改 src/main.js

/** 樣式資源導入* 作用:引入全局基礎樣式文件*/
import './assets/main.css';/** Vue核心依賴導入* 作用:引入Vue框架核心功能*/
import { createApp } from 'vue';      // 引入應用構造器/** 應用組件導入* 作用:引入根組件作為應用入口*/
import App from './App.vue';          // 主應用組件/** 路由配置導入* 作用:引入路由管理系統*/
import router from './router';        // 路由實例/** UI組件庫導入* 作用:引入Element Plus及其樣式*/
import ElementPlus from 'element-plus';         // UI庫核心
import 'element-plus/dist/index.css';           // UI庫樣式/** 應用初始化* 作用:創建并配置Vue應用實例*/
const app = createApp(App);           // 創建應用實例/** 插件注冊* 作用:集成路由功能*/
app.use(router);                      // 安裝路由插件/** UI庫注冊* 作用:集成Element Plus組件庫*/
app.use(ElementPlus);                 // 安裝UI組件庫/** 應用掛載* 作用:將應用渲染到DOM*/
app.mount('#app');                    // 掛載到DOM節點

修改 src/App.vue

清空默認內容,改為空白模板

<template><!--* 路由視圖容器* 作用:渲染當前路由匹配的組件* 技術:Vue Router 核心組件--><router-view />
</template><script>
export default {/** 組件標識* 作用:用于開發者工具調試和遞歸組件引用* 命名規范:通常使用帕斯卡命名法(PascalCase)*/name: 'App'
};
</script><style>
/** 全局基礎樣式* 作用:影響整個應用的默認樣式重置*//** 主體樣式重置* 作用:清除瀏覽器默認樣式,設置基準字體*/
body {margin: 0;                  /* 清除默認外邊距 */font-family: Arial,         /* 首選字體 */sans-serif;               /* 通用字體族后備 */
}
</style>

src/views/Dashboard.vue

<template><div class="dashboard-container"><!-- 頂部導航菜單 --><el-menumode="horizontal":default-active="activeMenu":collapse="isCollapsed"class="el-menu-horizontal-demo"@select="handleMenuSelect"background-color="#ffffff"text-color="#606266"active-text-color="#409EFF"><!-- 1. 三維數據平臺 --><el-sub-menu index="1"><template #title><i class="el-icon-location"></i><span v-show="!isCollapsed">三維數據平臺</span></template><el-menu-item index="1-1" @click="goToModelRelease"><i class="el-icon-monitor"></i><span>模型發布對比</span></el-menu-item><el-menu-item index="1-2" @click="goToParseInfo"><i class="el-icon-connection"></i><span>獲取解析異常信息</span></el-menu-item></el-sub-menu><!-- 2. 測試管理 --><el-sub-menu index="2"><template #title><i class="el-icon-cpu"></i><span v-show="!isCollapsed">測試管理</span></template><el-menu-item index="2-1" @click="goToTestFlow"><i class="el-icon-guide"></i><span>測試流程</span></el-menu-item><el-menu-item index="2-2" @click="goToTaskReminder"><i class="el-icon-guide"></i><span>任務提醒</span></el-menu-item></el-sub-menu><!-- 3. 工具集 --><el-sub-menu index="3"><template #title><i class="el-icon-s-tools"></i><span v-show="!isCollapsed">實用工具</span></template><el-menu-item index="3-1" @click="goToJsonFormat"><i class="el-icon-document"></i><span>JSON格式化</span></el-menu-item><el-menu-item index="3-2" @click="goToKafkaManager"><i class="el-icon-document"></i><span>Kafka連接測試</span></el-menu-item></el-sub-menu><!-- 4. 學生管理 --><el-sub-menu index="4"><template #title><i class="el-icon-user"></i><span v-show="!isCollapsed">學生管理</span></template><el-menu-item index="4-1" @click="goToStudentList"><i class="el-icon-user-solid"></i><span>學生列表</span></el-menu-item><el-menu-item index="4-2" @click="goToStudentStats"><i class="el-icon-data-analysis"></i><span>學生統計</span></el-menu-item></el-sub-menu><!-- 5. 新增的系統管理菜單 --><el-sub-menu index="5"><template #title><i class="el-icon-setting"></i><span v-show="!isCollapsed">系統管理</span></template><el-menu-item index="5-1" @click="goToUserManage"><i class="el-icon-user"></i><span>用戶管理</span></el-menu-item><el-menu-item index="5-2" @click="goToRoleManage"><i class="el-icon-s-custom"></i><span>角色管理</span></el-menu-item><el-menu-item index="5-3" @click="goToSystemLog"><i class="el-icon-document"></i><span>系統日志</span></el-menu-item><el-menu-item index="5-4" @click="goToSystemConfig"><i class="el-icon-operation"></i><span>系統配置</span></el-menu-item></el-sub-menu></el-menu><!-- 主內容區域 --><div class="content"><el-card class="welcome-card"><h1>{{ welcomeTitle }}</h1><p>{{ welcomeMessage }}</p><!-- 快捷訪問區域 --><div v-if="showQuickAccess" class="quick-access"><h3>常用功能</h3><el-space wrap><el-tagv-for="(action, index) in quickActions":key="index"type="info"effect="plain"class="quick-tag"@click="action.handler"><i :class="action.icon"></i>{{ action.label }}</el-tag></el-space></div></el-card></div></div>
</template><script>
import { ref, onMounted, onUnmounted, computed } from 'vue'
import { useRouter } from 'vue-router'export default {setup() {const router = useRouter()// 響應式狀態const activeMenu = ref('1-1')const isCollapsed = ref(false)const showQuickAccess = ref(true)const welcomeTitle = ref('歡迎使用管理系統')const welcomeMessage = ref('請從上方菜單選擇您需要的功能')// 路由跳轉方法const goToModelRelease = () => router.push('/model_release')const goToParseInfo = () => router.push('/parse_info')const goToTestFlow = () => router.push('/TestFlow')const goToTaskReminder = () => router.push('/task_reminder')const goToStudentList = () => router.push('/StudentList')const goToStudentStats = () => router.push('/StudentStats')const goToDbCompare = () => router.push('/dbcompare')const goToJsonFormat = () => router.push('/json_format')const goToKafkaManager = () => router.push('/kafka_manager')// 新增的系統管理路由方法const goToUserManage = () => router.push('/user-manage')const goToRoleManage = () => router.push('/role-manage')const goToSystemLog = () => router.push('/system-log')const goToSystemConfig = () => router.push('/system-config')// 快捷操作列表(包含新增的系統管理快捷方式)const quickActions = computed(() => [{ icon: 'el-icon-monitor', label: '模型發布數據對比', handler: goToModelRelease },{ icon: 'el-icon-user-solid', label: '測試流程', handler: goToTestFlow },{ icon: 'el-icon-document', label: '待辦任務', handler: goToTaskReminder },{ icon: 'el-icon-setting', label: 'Json格式化', handler: goToJsonFormat }])// 響應式處理屏幕尺寸變化const checkScreen = () => {isCollapsed.value = window.innerWidth < 768showQuickAccess.value = window.innerWidth > 576}// 菜單選擇處理const handleMenuSelect = (index) => {activeMenu.value = index}// 生命周期鉤子onMounted(() => {window.addEventListener('resize', checkScreen)checkScreen() // 初始化檢查})onUnmounted(() => {window.removeEventListener('resize', checkScreen)})return {activeMenu,isCollapsed,showQuickAccess,welcomeTitle,welcomeMessage,quickActions,handleMenuSelect,// 三維數據平臺goToModelRelease,goToParseInfo,// 測試管理goToTestFlow,goToTaskReminder,// 實用工具goToJsonFormat,goToKafkaManager,// 學生管理goToStudentList,goToStudentStats,goToDbCompare,// 系統管理goToUserManage,goToRoleManage,goToSystemLog,goToSystemConfig}}
}
</script><style scoped>
/* 主容器樣式 */
.dashboard-container {padding: 10px;
}/* 導航菜單樣式 */
.el-menu-horizontal-demo {height: 36px;line-height: 36px;border-bottom: 1px solid #e6e6e6;margin-bottom: 20px;
}.el-menu-item.is-active {background-color: var(--el-color-primary-light-9) !important;border-bottom: 2px solid var(--el-color-primary) !important;
}/* 內容區域布局 */
.content {padding: 20px;display: flex;justify-content: center;min-height: calc(100vh - 160px);
}/* 歡迎卡片樣式 */
.welcome-card {width: 100%;max-width: 800px;text-align: center;padding: 40px;border-radius: 8px;
}/* 快捷訪問區域 */
.quick-access {margin-top: 30px;padding-top: 20px;border-top: 1px dashed #eee;
}.quick-tag {cursor: pointer;padding: 0 15px;height: 32px;line-height: 32px;transition: all 0.3s;
}.quick-tag:hover {color: #409EFF;border-color: #409EFF;transform: translateY(-2px);
}/* 響應式設計 */
@media (max-width: 768px) {.el-menu-item,.el-submenu__title {padding: 0 12px !important;}.welcome-card {padding: 20px;}
}@media (max-width: 576px) {.dashboard-container {padding: 10px;}.content {min-height: calc(100vh - 120px);}
}
</style>

src/views/User.vue

<template><div><h1>用戶注冊</h1><el-form @submit.prevent="handleSubmit" inline><el-form-item><el-input v-model="username" placeholder="用戶名"></el-input></el-form-item><el-form-item><el-input v-model="password" type="password" placeholder="密碼"></el-input></el-form-item><el-form-item><el-button type="primary" @click="handleSubmit">注冊</el-button></el-form-item></el-form><h2>已注冊用戶</h2><el-table :data="users" style="width: 100%"><el-table-column prop="id" label="ID" width="50"></el-table-column><el-table-column prop="username" label="用戶名" width="180"></el-table-column><el-table-column label="操作" width="120"><template #default="scope"><el-button type="text" @click="handleDelete(scope.row.id)">刪除</el-button></template></el-table-column></el-table></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import axios from 'axios'
import 'element-plus/dist/index.css'const username = ref('')
const password = ref('')
const users = ref([])const fetchUsers = async () => {const response = await axios.get('http://192.168.1.138:5000/api/users')users.value = response.data
}const handleSubmit = async () => {await axios.post('http://192.168.1.138:5000/api/register', {username: username.value,password: password.value})username.value = ''password.value = ''await fetchUsers()
}const handleDelete = async (id) => {await axios.delete(`http://192.168.1.138:5000/api/users/${id}`)await fetchUsers()
}onMounted(() => {fetchUsers()
})
</script>

src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import Dashboard from '../views/Dashboard.vue'
import User from '../views/User.vue'const routes = [{ path: '/', redirect: '/Dashboard' }, // 默認重定向{ path: '/dashboard', component: Dashboard },{ path: '/user', component: User },// 其他路由...
];const router = createRouter({history: createWebHistory(),routes,
});export default router;

前端運行測試

npm run dev

在這里插入圖片描述

用戶注冊

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

使用navicat連接查看數據庫

在這里插入圖片描述

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

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

相關文章

Java 內存模型(JMM)與內存屏障:原理、實踐與性能權衡

Java 內存模型&#xff08;JMM&#xff09;與內存屏障&#xff1a;原理、實踐與性能權衡 在多線程高并發時代&#xff0c;Java 內存模型&#xff08;JMM&#xff09; 及其背后的內存屏障機制&#xff0c;是保障并發程序正確性與性能的基石。本文將系統梳理 JMM 的核心原理、內…

動手學深度學習12.3.自動并行-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記&#xff0c;以及對課后練習的一些思考&#xff0c;自留回顧&#xff0c;也供同學之人交流參考。 本節課程地址&#xff1a;無 本節教材地址&#xff1a;12.3. 自動并行 — 動手學深度學習 2.0.0 documentation 本節開源代…

C++類和對象之初始化列表

初始化列表 C初始化列表詳解&#xff1a;性能優化與正確實踐什么是初始化列表&#xff1f;初始化列表的三大核心作用1. 性能優化&#xff1a;避免不必要的賦值操作2. 強制初始化&#xff1a;處理const和引用成員3. 基類初始化&#xff1a;正確調用父類構造函數4.必須使用初始化…

continue通過我們的開源 IDE 擴展和模型、規則、提示、文檔和其他構建塊中心,創建、共享和使用自定義 AI 代碼助手

?一、軟件介紹 文末提供程序和源碼下載 Continue 使開發人員能夠通過我們的開源 VS Code 和 JetBrains 擴展以及模型、規則、提示、文檔和其他構建塊的中心創建、共享和使用自定義 AI 代碼助手。 二、功能 Chat 聊天 Chat makes it easy to ask for help from an LLM without…

基于Spring Boot + Vue的母嬰商城系統( 前后端分離)

一、項目背景介紹 隨著母嬰行業在互聯網平臺的快速發展&#xff0c;越來越多的家庭傾向于在線選購母嬰產品。為了提高商品管理效率和用戶購物體驗&#xff0c;本項目開發了一個基于 Spring Boot Vue 技術棧的母嬰商城系統&#xff0c;實現了商品分類、商品瀏覽、資訊展示、評…

實戰演練:用 AWS Lambda 和 API Gateway 構建你的第一個 Serverless API

實戰演練:用 AWS Lambda 和 API Gateway 構建你的第一個 Serverless API 理論千遍,不如動手一遍!在前面幾篇文章中,我們了解了 Serverless 的概念、FaaS 的核心原理以及 BaaS 的重要作用。現在,是時候把這些知識運用起來,親手構建一個簡單但完整的 Serverless 應用了。 …

node.js 實戰——express圖片保存到本地或服務器(七牛云、騰訊云、阿里云)

本地 ? 使用formidable 讀取表單內容 npm i formidable ? 使用mime-types 獲取圖片后綴 npm install mime-types? js 中提交form表單 document.getElementById(uploadForm).addEventListener(submit, function(e){e.preventDefault();const blob preview._blob;if(!blob)…

2025最新:3分鐘使用Docker快速部署單節點Redis

&#x1f9d1;?&#x1f3eb; 詳細教程&#xff1a;通過 Docker 安裝單節點 Redis &#x1f6e0;? 前提條件&#xff1a; 你需要在 Ubuntu 系統上進行操作&#xff08;如果你在其他系統上操作&#xff0c;可以按相似步驟進行調整&#xff09;。已安裝 Docker 和 Docker Com…

CentOS 7 系統下安裝 OpenSSL 1.0.2k 依賴問題的處理

前面有提到過這個openssl的版本沖突問題&#xff0c;也是在這次恢復服務器時遇到的問題&#xff0c;我整理如下&#xff0c;供大家參考。小小一個軟件的安裝&#xff0c;挺坑的。 一、問題 項目運行環境需要&#xff0c;指定PHP7.0.9這個版本&#xff0c;但是?系統版本與軟件…

LoRA(Low-Rank Adaptation)原理詳解

LoRA(Low-Rank Adaptation)原理詳解 LoRA(低秩適應)是一種參數高效微調(Parameter-Efficient Fine-Tuning, PEFT)技術,旨在以極低的參數量實現大模型在特定任務上的高效適配。其核心思想基于低秩分解假設,即模型在適應新任務時,參數更新矩陣具有低秩特性,可用少量參…

Solana批量轉賬教程:提高代幣持有地址和生態用戶空投代幣

前言 Solana區塊鏈因其高吞吐量和低交易費用成為批量操作&#xff08;如空投&#xff09;的理想選擇。本教程將介紹幾種在Solana上進行批量轉賬的方法&#xff0c;幫助您高效地向多個地址空投代幣。 solana 賬戶模型 在Solana中有三類賬戶&#xff1a; 數據賬戶&#xff0c;…

基于LSTM與SHAP可解釋性分析的神經網絡回歸預測模型【MATLAB】

基于LSTM與SHAP可解釋性分析的神經網絡回歸預測模型【MATLAB】 一、引言 在數據驅動的智能時代&#xff0c;時間序列預測已成為許多領域&#xff08;如金融、氣象、工業監測等&#xff09;中的關鍵任務。長短期記憶網絡&#xff08;LSTM&#xff09;因其在捕捉時間序列長期依…

手機網頁提示ip被拉黑名單什么意思?怎么辦

?當您使用手機瀏覽網頁時&#xff0c;突然看到“您的IP地址已被列入黑名單”的提示&#xff0c;是否感到困惑和不安&#xff1f;這種情況在現代網絡生活中并不罕見&#xff0c;但確實會給用戶帶來諸多不便。本文將詳細解釋IP被拉黑的含義、常見原因&#xff0c;并提供一系列實…

Java消息隊列性能優化實踐:從理論到實戰

Java消息隊列性能優化實踐&#xff1a;從理論到實戰 1. 引言 在現代分布式系統架構中&#xff0c;消息隊列&#xff08;Message Queue&#xff0c;MQ&#xff09;已經成為不可或缺的中間件組件。它不僅能夠實現系統間的解耦&#xff0c;還能提供異步通信、流量削峰等重要功能…

BUUCTF——Cookie is so stable

BUUCTF——Cookie is so stable 進入靶場 頁面有點熟悉 跟之前做過的靶場有點像 先簡單看一看靶場信息 有幾個功能點 flag.php 隨便輸了個admin 根據題目提示 應該與cookie有關 抓包看看 構造payload Cookie: PHPSESSIDef0623af2c1a6d2012d57f3529427d52; user{{7*7}}有…

json格式不合法情況下,如何盡量保證數據可用性

背景 在工作流程中&#xff0c;并非所有數據都如人所愿&#xff0c;即使json版本也會由于csv、tsv、excel、text等不同文件格式轉化、獲取數據源不完整等問題&#xff0c;造成我們要處理的json文件存在不合法。 嘗試方案 除了人為修正外&#xff0c;有效的方法是使用json“修…

Python基礎總結(十)之函數

Python函數 函數是Python中也是非常重要的,函數是帶名字的代碼塊,用于完成具體的工作。要執行函數定義的特定任務,可調用該函數。 一、函數的定義 函數的定義要使用def關鍵字,def后面緊跟函數名,縮進的為函數的代碼塊。 def test():print("Hello,World")上述…

懶人美食幫SpringBoot訂餐系統開發實現

概述 快速構建一個訂餐系統&#xff0c;今天&#xff0c;我們將通過”懶人美食幫”這個基于SpringBoot的訂餐系統項目&#xff0c;為大家詳細解析從用戶登錄到多角色權限管理的完整實現方案。本教程特別適合想要學習企業級應用開發的初學者。 主要內容 1. 用戶系統設計與實現…

AI(學習筆記第三課) 使用langchain進行AI開發(2)

文章目錄 AI(學習筆記第三課) 使用langchain進行AI開發(2)學習內容:1. 返回結構化數據(structured_output pydantic)1.1 使用背景1.2 返回結構化數據示例代碼(pydantic)1.3 執行測試代碼2 返回結構化數據(json)2.1 示例代碼2.2 執行結果3 給提供一些例子(few shot pr…

unity 使用藍牙通訊(PC版,非安卓)

BlueTooth in pc with unity 最近接到的需求是在unity里面開發藍牙功能,其實一開始我并不慌,因為據我所知,unity有豐富的插件可以使用,但是問題隨之而來 1.unity里面無法直接與藍牙通訊(后來找到了開啟runtime一類的東西,但是我找了半天也沒找到在哪里可以打開) 2.引入dll通過d…