虛擬試衣間-云尚衣櫥小程序-衣櫥管理實現

衣櫥管理實現

目標 (Goal):

  • 用戶 (User): 能通過 UniApp 小程序上傳衣服圖片。

  • 后端 (Backend): 接收圖片,存到云存儲,并將圖片信息(URL、用戶ID等)存入數據庫。

  • 用戶 (User): 能在小程序里看到自己上傳的所有衣服圖片列表。

技術棧細化 (Refined Tech Stack for this Phase):

  • 前端 (Frontend): UniApp (Vue 語法)

  • 后端 (Backend): Node.js, Express.js

  • 數據庫 (Database): MongoDB (使用 Mongoose ODM 操作會更方便)

  • 圖片存儲 (Image Storage): 騰訊云 COS / 阿里云 OSS (必須使用云存儲)

  • HTTP 請求庫 (Frontend): UniApp 內置的 uni.request 或 uni.uploadFile

  • 文件上傳處理 (Backend): multer 中間件

  • 云存儲 SDK (Backend): tcb-admin-node (如果用騰訊云開發) 或 cos-nodejs-sdk-v5 (騰訊云 COS) 或 ali-oss (阿里云 OSS)

  • 認證 (Authentication): JWT (JSON Web Tokens)

1. 后端 (Node.js / Express) 實現

項目結構 (示例):

wardrobe-backend/
├── node_modules/
├── config/
│   ├── db.js         # 數據庫連接
│   └── cloudStorage.js # 云存儲配置 (密鑰等) - 不要硬編碼!用環境變量
├── controllers/
│   ├── authController.js
│   └── wardrobeController.js
├── middleware/
│   ├── authMiddleware.js  # JWT 驗證
│   └── uploadMiddleware.js # Multer 配置
├── models/
│   ├── User.js         # Mongoose User Schema
│   └── Clothes.js      # Mongoose Clothes Schema
├── routes/
│   ├── authRoutes.js
│   └── wardrobeRoutes.js
├── .env              # 環境變量 (數據庫URI, 云存儲密鑰, JWT Secret) - 加入 .gitignore
├── .gitignore
├── package.json
└── server.js         # Express 應用入口

關鍵代碼實現點:

(a) server.js (入口文件)

require('dotenv').config(); // Load environment variables
const express = require('express');
const cors = require('cors');
const connectDB = require('./config/db');
const authRoutes = require('./routes/authRoutes');
const wardrobeRoutes = require('./routes/wardrobeRoutes');// Connect to Database
connectDB();const app = express();// Middleware
app.use(cors()); // 允許跨域請求 (小程序需要)
app.use(express.json()); // 解析 JSON body
app.use(express.urlencoded({ extended: false })); // 解析 URL-encoded body// Routes
app.use('/api/auth', authRoutes);
app.use('/api/wardrobe', wardrobeRoutes); // 衣櫥相關路由// Basic Error Handling (can be improved)
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send({ message: 'Something broke!', error: err.message });
});const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

(b) models/User.js & models/Clothes.js (Mongoose Schemas)

// models/User.js
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({openid: { type: String, required: true, unique: true },// session_key: { type: String, required: true }, // 按需存儲,注意安全nickname: { type: String },avatarUrl: { type: String },// ... other fields
}, { timestamps: true });
module.exports = mongoose.model('User', UserSchema);// models/Clothes.js
const mongoose = require('mongoose');
const ClothesSchema = new mongoose.Schema({userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true, index: true },imageUrl: { type: String, required: true }, // 圖片在云存儲的URLtags: { type: [String], default: [] },      // AI識別標簽 (暫時為空或默認值)notes: { type: String, default: '' },      // 用戶備注// ... 其他未來可能添加的字段 (顏色、類型等)
}, { timestamps: true });
module.exports = mongoose.model('Clothes', ClothesSchema);

(c) middleware/authMiddleware.js (JWT 驗證)

const jwt = require('jsonwebtoken');
const User = require('../models/User');const protect = async (req, res, next) => {let token;if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {try {// Get token from headertoken = req.headers.authorization.split(' ')[1];// Verify tokenconst decoded = jwt.verify(token, process.env.JWT_SECRET); // 使用環境變量中的密鑰// Get user from the token (select -password if you store passwords)req.user = await User.findById(decoded.id).select('-session_key'); // 附加用戶信息到 reqif (!req.user) {return res.status(401).json({ message: 'Not authorized, user not found' });}next();} catch (error) {console.error(error);res.status(401).json({ message: 'Not authorized, token failed' });}}if (!token) {res.status(401).json({ message: 'Not authorized, no token' });}
};module.exports = { protect };

(d) routes/authRoutes.js & controllers/authController.js (登錄邏輯)

// routes/authRoutes.js
const express = require('express');
const { loginUser } = require('../controllers/authController');
const router = express.Router();
router.post('/login', loginUser);
module.exports = router;// controllers/authController.js
const axios = require('axios');
const jwt = require('jsonwebtoken');
const User = require('../models/User');const WX_APPID = process.env.WX_APPID;       // 小程序 AppID
const WX_SECRET = process.env.WX_SECRET;   // 小程序 Secret// Generate JWT
const generateToken = (id) => {return jwt.sign({ id }, process.env.JWT_SECRET, {expiresIn: '30d', // Token 有效期});
};const loginUser = async (req, res) => {const { code, userInfo } = req.body; // 前端發送 wx.login 的 code 和用戶信息if (!code) {return res.status(400).json({ message: 'Code is required' });}try {// 1. 用 code 換取 openid 和 session_keyconst url = `https://api.weixin.qq.com/sns/jscode2session?appid=${WX_APPID}&secret=${WX_SECRET}&js_code=${code}&grant_type=authorization_code`;const response = await axios.get(url);const { openid, session_key } = response.data;if (!openid) {return res.status(400).json({ message: 'Failed to get openid', error: response.data });}// 2. 查找或創建用戶let user = await User.findOne({ openid });if (!user) {// 如果需要用戶信息&

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

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

相關文章

HAL庫 通過USB Boot進行APP程序升級

硬件:stm32f407VET6芯片; 軟件:STM32CubeMx、Keil5 上位機:Dfuse DemoV3.06 這里給出通過在Bootlaoder中使用USB方式來更新APP程序的方法,首先我們編寫一個自己的bootloader,關于bootloader的大致原理可以…

數據庫權限獲取

1. into outfile(手寫) 1.1. 利用條件 ? web 目錄具有寫入權限,能夠使用單引號 ? 知道網站絕對路徑(根目錄,或則是根目錄往下的目錄都行) ? secure_file_priv 沒有具體值(在 mysql/my.ini…

關于ESP系列MCU的UART download原理

GPIO0,即BOOT,工作模式選擇: 懸空/拉高:正常MCU啟動工作狀態 下拉接地:UARTDownload下載模式 如何進入UARTDownload下載模式? 先按下boot按鍵不放,再按下rst按鍵 / en按鍵,隨后釋放…

無需安裝Office進行 Word、Excel操作的微軟開發庫

微軟的確有一些無需安裝完整 Office 就能進行 Word、Excel 操作的開發庫,以下為你介紹: 1. Microsoft Graph API 簡介:Microsoft Graph API 是一個強大的 RESTful API,能讓開發者通過調用接口訪問 Office 365 服務里的各種資源&…

【一起來學kubernetes】34、ReplicaSet使用詳解

Kubernetes ReplicaSet 使用詳解 ReplicaSet 是 Kubernetes 中用于確保指定數量的 Pod 副本持續運行的核心控制器。它通過動態調整 Pod 副本數,保障應用的高可用性和彈性。以下是其核心功能、配置方法及最佳實踐: 一、ReplicaSet 核心作用 維持 Pod 副本…

【力扣hot100題】(034)LRU緩存

做完這題已經沒有任何力氣寫鏈表題了。 思路很簡單,就是調試特別的痛苦。 老是頻頻報錯,唉。 class LRUCache { public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}L…

基于隨機森林算法的信用風險評估項目

引言 這是一個基于隨機森林算法的德國信用風險評估項目,主要目的是構建一個機器學習模型來評估德國客戶的信用風險,判斷客戶是否為高風險客戶。 # -*- coding: utf-8 -*- """ 德國信用風險評估隨機森林模型 """ # 基礎…

亞馬遜云科技攜手 DeepSeek:開啟企業級生成式 AI 新征程

文章目錄 一、DeepSeek-R1模型的技術突破(一)卓越的性能表現(二)獨特的訓練方法(三)豐富的模型生態 二、亞馬遜云科技平臺上的部署與優化(一)靈活的部署方式(二&#xff…

Windows 實戰-evtx 文件分析--筆記

Windows 取證之EVTX日志 - 蟻景網安實驗室 - 博客園 一.evtx日志文件是什么 從 Windows NT 6.0(也就是 Windows Vista 和 Windows Server 2008)開始,微軟引入了一種全新的日志文件格式,稱為 evtx。這種格式取代了之前 Windows 系…

LangChain/Eliza框架在使用場景上的異同,Eliza通過配置實現功能擴展的例子

LangChain與Eliza框架的異同分析 ?一、相同點? ?模塊化架構設計? 兩者均采用模塊化設計,支持靈活擴展和功能組合。LangChain通過Chains、Agents等組件實現多步驟任務編排?,Eliza通過插件系統和信任引擎實現智能體功能的動態擴展?。模塊化特性降低…

英語口語 -- 常用 1368 詞匯

英語口語 -- 常用 1368 詞匯 介紹常用單詞List1 (96 個)時間類氣候類自然類植物類動物類昆蟲類其他生物地點類 List2 (95 個)機構類聲音類食品類餐飲類蔬菜類水果類食材類飲料類營養類疾病類房屋類家具類服裝類首飾類化妝品類 Lis…

深挖 DeepSeek 隱藏玩法·智能煉金術2.0版本

前引:屏幕前的你還在AI智能搜索框這樣搜索嗎?“這道題怎么寫”“蘋果為什么紅”“怎么不被發現翹課” ,。看到此篇文章的小伙伴們!請準備好你的思維魔杖,開啟【霍格沃茨模式】,看我如何更新秘密的【知識煉金…

2025 年浙江危化品經營單位考試攻略分享?

浙江的考試由省應急管理部門主導。理論考試突出危化品在電商、物流等新興業態下的安全管理知識,這與浙江發達的電商產業緊密相關。對危險化學品的環境危害及防治知識考查細致。實際操作考核模擬杭州、寧波等地危化品倉儲物流中心的作業情況。? 報名材料準備齊全后…

【區塊鏈+ 房產建筑】山東省建筑產業互聯網平臺 | FISCO BCOS 應用案例

山東省建筑產業互聯網平臺(山東省弘商易盟平臺)是基于區塊鏈技術構建的分布式產業互聯網平臺, 旨在把各企業內部的供應鏈協同管理系統(包括采購或者SRM 系統, 以及銷售或CRM 系統)利用區塊鏈技術鏈接起來&a…

Bash 花括號擴展 {start..end} 進階使用指南——字典生成

Bash 的花括號擴展(brace expansion){start..end} 是一個強大而靈活的語法特性,用于生成特定序列或組合。它在腳本編寫、爆破字典生成、文件批量操作以及模式匹配中有著廣泛的應用。本文將從基礎用法到高級技巧,帶你全面掌握這一功…

23種設計模式-結構型模式-享元

文章目錄 簡介問題解決方案享元與不可變性享元工廠 代碼總結 簡介 亦稱:緩存、Cache、Flyweight。享元是一種結構型設計模式,它摒棄了在每個對象中保存所有數據的方式,通過共享多個對象所共有的相同狀態,讓你能在有限的內存容量中…

MFC BCGControlBar

BCGControlBar(也稱為 BCGSoft 或 BCGControlBar Library)是一個用于 MFC(Microsoft Foundation Classes) 的擴展庫,主要提供現代化的 UI 控件、Ribbon 界面、工具欄、屬性網格等組件,幫助開發者快速構建專…

【算法手記9】OR26 最長回文子串 NC369 [NOIP2002 普及組] 過河卒

🦄個人主頁:修修修也 🎏所屬專欄:刷題 ??操作環境:牛客網 一.OR26 最長回文子串 牛客網題目鏈接(點擊即可跳轉):OR26 最長回文子串 題目詳情: 本題詳情如下圖: 題目思路: 本題解題思路如下: 本題思路用中心擴展算法,遍歷所有字符,將每個字符作為回文串…

批量刪除或替換文本文件中指定的行,如刪除第一行、刪除最后一行

每一個文本文件中我們都可以插入非常多的行,我們可以對行的內容進行刪除、修改等各種操作。如果文本文件中的某些行的內容需要更新,那我們就需要對其進行修改操作。想要修改文本文件的內容其實是非常方便的,但是如果想要批量的對多個文本文件…

LLM架構解析:詞嵌入模型 Word Embeddings(第二部分)—— 從基礎原理到實踐應用的深度探索

本專欄深入探究從循環神經網絡(RNN)到Transformer等自然語言處理(NLP)模型的架構,以及基于這些模型構建的應用程序。 本系列文章內容: NLP自然語言處理基礎詞嵌入(Word Embeddings&#xff09…