refactor(backend): 重构动物相关 API 接口
- 更新了动物数据结构和相关类型定义 - 优化了动物列表、详情、创建、更新和删除接口 - 新增了更新动物状态接口 - 移除了与认领记录相关的接口 -调整了 API 响应结构
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
// 安全返回用户信息(去除敏感信息)
|
||||
|
||||
88
backend/src/models/admin.js
Normal file
88
backend/src/models/admin.js
Normal 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;
|
||||
Reference in New Issue
Block a user