hanphone-blog

🖼️ 寒枫的照片墙服务端 | Hanphone’s Photo Wall Server

📌 项目简介

仓库中同时保留了同一套业务的两种后端实现:

项目聚焦于 图片上传、可视化展示、标签检索、后台管理 等核心能力,适合作为个人照片墙、轻量图库系统、前后端分离练手项目,以及双语言后端实现对照参考。

🏗️ 项目架构

🎯 核心定位

🚀 技术架构栈

🔹 前端配套项目 | Frontend

Vue3 Vite ElementPlus PWA

🔹 服务端架构一 | Node.js Backend

Node.js Express PostgreSQL JWT

🔹 服务端架构二 | PHP Backend

PHP MySQL JWT Nginx

✨ 核心功能

  1. 📤 图片管理:支持图片上传、展示、删除与分类处理
  2. 🔍 标签与搜索:支持标签获取、检索与后台标签管理
  3. ❤️ 互动能力:支持点赞与访问统计
  4. 🔐 身份认证:基于 JWT 的登录鉴权与接口拦截
  5. 🛠️ 后台管理:支持图片、标签、用户等后台管理功能
  6. 📚 学习参考:保留 PHP 实现供对照学习(功能较 Node.js 版本滞后)

📂 仓库结构

photo-wall-server/
├── app.js                     # 应用入口
├── config/                    # 数据库和业务配置
│   ├── config.js              # 通用配置(密钥、端口等)
│   └── db.js                  # PostgreSQL 数据库连接配置
├── controller/                # 业务控制器
│   ├── admin/                 # 后台管理控制器
│   │   ├── addTag.js
│   │   ├── adminShow.js
│   │   ├── adminUpdate.js
│   │   ├── changePhotoType.js
│   │   ├── changeUser.js
│   │   ├── createTag.js
│   │   ├── deletePhoto.js
│   │   ├── deletePhotoTag.js
│   │   ├── deleteTag.js
│   │   ├── deleteUser.js
│   │   ├── getAdminTag.js
│   │   └── getUser.js
│   ├── getTag.js
│   ├── likes.js
│   ├── search.js
│   ├── show.js
│   ├── upload.js
│   └── visitCount.js
├── middleware/                # 中间件
│   └── interceptor.js         # JWT 鉴权拦截器
├── routes/                    # 路由定义
│   ├── admin.js               # 后台管理路由
│   └── index.js               # 公开接口路由
├── utils/                     # 通用工具函数
│   ├── password.js            # 密码哈希工具
│   └── token.js               # JWT 生成与校验
├── archive-php/               # PHP + MySQL 实现(归档)
│   ├── README.md
│   ├── .env.example           # PHP 环境变量示例
│   ├── application.php        # PHP 应用入口
│   ├── 404.html               # 错误页面
│   ├── atlas.sql              # MySQL 初始化脚本
│   ├── nginx.conf             # Nginx 配置示例
│   ├── config/                # PHP 配置目录
│   │   ├── config.php
│   │   ├── db_connect.php
│   │   ├── email_connect.php
│   │   └── env.php
│   ├── controller/            # PHP 控制器
│   │   ├── admin/             # PHP 后台管理
│   │   │   ├── addTag.php
│   │   │   ├── adminShow.php
│   │   │   ├── adminUpdate.php
│   │   │   ├── changePhotoType.php
│   │   │   ├── changeUser.php
│   │   │   ├── createTag.php
│   │   │   ├── deletePhoto.php
│   │   │   ├── deletePhotoTag.php
│   │   │   ├── deleteTag.php
│   │   │   ├── deleteUser.php
│   │   │   ├── getAdminTag.php
│   │   │   └── getUser.php
│   │   ├── forgotPassword.php
│   │   ├── getTag.php
│   │   ├── likes.php
│   │   ├── login.php
│   │   ├── register.php
│   │   ├── search.php
│   │   ├── sendVerificationCode.php
│   │   ├── show.php
│   │   ├── upload.php
│   │   └── visitCount.php
│   └── interceptor/           # PHP 拦截器
│       ├── interceptor.php
│       └── token.php
├── ecosystem.config.cjs       # PM2 部署配置
├── init.sql                   # PostgreSQL 初始化脚本
├── package.json
├── package-lock.json
├── README.md
└── .gitignore

🚀 快速开始

两个实现任选其一启动即可,不需要同时运行。

方式一:启动 Node.js 后端

pnpm install
pnpm start

方式二:启动 PHP 后端

cd archive-php
cp .env.example .env
php -S 127.0.0.1:3003 application.php

部署

pm2 start ecosystem.config.cjs
pm2 save
pm2 startup