refactor(backend): 重构动物相关 API 接口

- 更新了动物数据结构和相关类型定义
- 优化了动物列表、详情、创建、更新和删除接口
- 新增了更新动物状态接口
- 移除了与认领记录相关的接口
-调整了 API 响应结构
This commit is contained in:
ylweng
2025-08-31 00:45:46 +08:00
parent 0cad74b06f
commit 8e5295b572
111 changed files with 15290 additions and 1972 deletions

View File

@@ -4,30 +4,30 @@ class UserMySQL {
// 创建用户
static async create(userData) {
const {
openid,
nickname,
avatar = '',
gender = 'other',
birthday = null,
phone = null,
email = null
username,
password_hash,
user_type = 'farmer',
real_name = '',
avatar_url = '',
email = null,
phone = null
} = userData;
const sql = `
INSERT INTO users (
openid, nickname, avatar, gender, birthday, phone, email,
username, password_hash, user_type, real_name, avatar_url, email, phone,
created_at, updated_at
) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), NOW())
`;
const params = [
openid,
nickname,
avatar,
gender,
birthday,
phone,
email
username,
password_hash,
user_type,
real_name,
avatar_url,
email,
phone
];
const result = await query(sql, params);
@@ -41,10 +41,10 @@ class UserMySQL {
return rows[0] || null;
}
// 根据openid查找用户
static async findByOpenid(openid) {
const sql = 'SELECT * FROM users WHERE openid = ?';
const rows = await query(sql, [openid]);
// 根据用户名查找用户
static async findByUsername(username) {
const sql = 'SELECT * FROM users WHERE username = ?';
const rows = await query(sql, [username]);
return rows[0] || null;
}
@@ -101,10 +101,10 @@ class UserMySQL {
return result.affectedRows > 0;
}
// 检查openid是否已存在
static async isOpenidExists(openid, excludeId = null) {
let sql = 'SELECT COUNT(*) as count FROM users WHERE openid = ?';
const params = [openid];
// 检查用户名是否已存在
static async isUsernameExists(username, excludeId = null) {
let sql = 'SELECT COUNT(*) as count FROM users WHERE username = ?';
const params = [username];
if (excludeId) {
sql += ' AND id != ?';
@@ -115,6 +115,17 @@ class UserMySQL {
return rows[0].count > 0;
}
// 检查用户状态是否活跃
static isActive(user) {
return user.status === 'active';
}
// 执行原始查询(用于复杂查询)
static async query(sql, params = []) {
const { query } = require('../config/database');
return await query(sql, params);
}
// 检查邮箱是否已存在
static async isEmailExists(email, excludeId = null) {
let sql = 'SELECT COUNT(*) as count FROM users WHERE email = ?';
@@ -143,9 +154,18 @@ class UserMySQL {
return rows[0].count > 0;
}
// 检查用户名是否已存在 (根据openid检查)
// 检查用户名是否已存在
static async isUsernameExists(username, excludeId = null) {
return await this.isOpenidExists(username, excludeId);
let sql = 'SELECT COUNT(*) as count FROM users WHERE username = ?';
const params = [username];
if (excludeId) {
sql += ' AND id != ?';
params.push(excludeId);
}
const rows = await query(sql, params);
return rows[0].count > 0;
}
// 安全返回用户信息(去除敏感信息)

View File

@@ -0,0 +1,88 @@
// 管理员模型
const { adminDB } = require('../config/database');
const bcrypt = require('bcryptjs');
class Admin {
constructor(data) {
this.id = data.id;
this.username = data.username;
this.password = data.password;
this.email = data.email;
this.nickname = data.nickname;
this.avatar = data.avatar;
this.role = data.role;
this.status = data.status;
this.last_login = data.last_login;
this.created_at = data.created_at;
this.updated_at = data.updated_at;
}
// 根据用户名查找管理员
static async findByUsername(username) {
const adminData = await adminDB.findByUsername(username);
return adminData ? new Admin(adminData) : null;
}
// 根据ID查找管理员
static async findById(id) {
const adminData = await adminDB.findById(id);
return adminData ? new Admin(adminData) : null;
}
// 验证密码
async verifyPassword(password) {
return await bcrypt.compare(password, this.password);
}
// 更新最后登录时间
async updateLastLogin() {
await adminDB.updateLastLogin(this.id);
}
// 创建管理员
static async create(adminData) {
// 密码加密
if (adminData.password) {
adminData.password = await bcrypt.hash(adminData.password, 10);
}
const id = await adminDB.create(adminData);
return await this.findById(id);
}
// 更新管理员信息
async update(updateData) {
// 如果有密码更新,需要加密
if (updateData.password) {
updateData.password = await bcrypt.hash(updateData.password, 10);
}
await adminDB.update(this.id, updateData);
// 更新实例数据
Object.assign(this, updateData);
}
// 删除管理员
async delete() {
await adminDB.delete(this.id);
}
// 转换为安全对象(不包含密码等敏感信息)
toSafeObject() {
return {
id: this.id,
username: this.username,
email: this.email,
nickname: this.nickname,
avatar: this.avatar,
role: this.role,
status: this.status,
last_login: this.last_login,
created_at: this.created_at,
updated_at: this.updated_at
};
}
}
module.exports = Admin;