ProjectThy-4
QQZone项目记录
数据库设计

create database qqzonedb char set utf8;
use qqzonedb;
create table `t_user_basic`(
`id` int(11) not null auto_increment,
`loginId` varchar(20) not null ,
`nickName` varchar(50) not null ,
`pwd` varchar(20) not null ,
`headImg` varchar(20) default null ,
PRIMARY KEY (`id`),
UNIQUE key `loginId` (`loginId`)
)engine = INNODB AUTO_INCREMENT=6 DEFAULT CHARSET =utf8;
insert into `t_user_basic` (id, loginId, nickName, pwd, headImg) values
(1,'u0001','Aqua','123456','Aqua.png'),
(2,'u0002','marin','123456','marin.png'),
(3,'u0003','fbk','123456','fbk.png'),
(4,'u0004','mio','123456','mio.png')
-- 定义外键约束(foreign key constraint)
-- PRIMARY KEY ('id') 定义主键
-- CONSTRAINT 'FK_detail_basic' 定义了一个外键约束的名字,叫做 FK_detail_basic
-- 这个名字是随便取的,用于区分和管理外键(方便以后修改或删除)
-- FOREIGN KEY ('id') REFERENCES 't_user_basic' ('id')
-- 当前表(比如 t_user_detail)的 id 列是一个外键
-- 它引用(对应)的是 t_user_basic 表里的 id 列
-- 外键约束的作用
-- 保证数据一致性(不能插入“孤立”的 detail 记录)
-- 防 止误删(删除 t_user_basic 中的用户时,如果对应的 t_user_detail 还存在,会报错)
create table `t_user_detail`(
`id` int(11) not null ,
`realName` varchar(20) default null,
`tel` varchar(11) default null,
`email` varchar(30) default null,
`birth` datetime default null,
`star` varchar(10) default null,
primary key (`id`),
constraint `FK_detail_basic` foreign key (`id`) REFERENCES `t_user_basic` (`id`)
)engine = INNODB DEFAULT CHARSET =utf8;
-- KEY 'FK_friend_basic_uid' ('uid')
-- 这是在 uid 字段上建立一个普通索引(或辅助索引)它的作用是:
-- 提高根据 uid 查询的效率;
-- 为后面的外键约束提供索引支持(MySQL 要求外键列必须有索引)
-- CONSTRAINT 'FK_friend_basic_fid' FOREIGN KEY ('fid') REFERENCES 't_user_basic' ('id')
-- 定义了一个外键约束:当前表的 fid 字段,引用 t_user_basic 表的 id 字段。
-- fid 必须是 t_user_basic 表中已经存在的用户 ID,否则不能插入
-- FK_friend_basic_uid 这个确实是外键约束的名字(别名):用于区分不同的外键约束;用于管理或修改外键
--
create table `t_friend` (
`id` int(11) not null auto_increment,
`uid` int(11) default null,
`fid` int(11) default null,
primary key (`id`),
key `FK_friend_basic_uid` (`uid`),
key `FK_friend_basic_fid` (`fid`),
constraint `FK_friend_basic_fid` foreign key (`fid`) references `t_user_basic` (`id`),
constraint `FK_friend_basic_uid` foreign key (`uid`) references `t_user_basic` (`id`)
) engine = INNODB AUTO_INCREMENT=11 DEFAULT CHARSET =utf8;
insert into `t_friend`(`id`,`uid`,`fid`) values
(1,1,2),
(2,1,3),
(3,1,4),
(4,2,3),
(5,2,4),
(6,3,4);
create table `t_topic`(
`id` int(11) not null auto_increment,
`title` varchar(100) not null ,
`content` varchar(500) not null ,
`topicDate` datetime not null ,
`author` int(11) not null ,
primary key (`id`),
key `FK_topic_basic` (`author`),
constraint `FK_topic_basic` foreign key (`author`) references `t_user_basic` (`id`)
)engine = INNODB AUTO_INCREMENT=4 DEFAULT CHARSET =utf8;
insert into `t_topic` (`id`,`title`,`content`,`topicDate`,`author`) values
(1,'我的空间已开通','Hello 我是 Aqua','2025-10-14 14:29:50',1);
create table `t_reply`(
`id` int(11) not null auto_increment,
`content` varchar(500) not null ,
`replyDate` DATETIME not null ,
`author` int(11) not null ,
`topic` int(11) not null ,
primary key (`id`),
key `FK_reply_basic` (`author`),
key `FK_reply_topic` (`topic`),
constraint `FK_reply_basic` foreign key (`author`) references `t_user_basic` (`id`),
constraint `FK_reply_topic` foreign key (`topic`) references `t_topic` (`id`)
)engine = INNODB AUTO_INCREMENT = 17 DEFAULT CHARSET utf8;
insert into `t_reply` (`id`,`content`,`replyDate`,`author`,`topic`) values
(1,'这里是回复2','2025-10-14 14:36:00',1,1),
(2,'这里是回复3','2025-10-14 14:37:00',1,2);
create table `t_host_reply`(
`id` int(11) not null auto_increment,
`content` varchar(500) not null ,
`hostReplyDate` DATETIME not null ,
`author` int(11) not null ,
`reply` int(11) not null ,
primary key (`id`),
key `FK_host_basic` (`author`),
key `FK_host_reply` (`reply`),
constraint `FK_host_basic` foreign key (`author`) references `t_user_basic` (`id`),
constraint `FK_host_reply` foreign key (`reply`) references `t_reply` (`id`)
)engine = INNODB AUTO_INCREMENT = 4 DEFAULT CHARSET utf8;
insert into `t_host_reply` (`id`,`content`,`hostReplyDate`,`author`,`reply`)
values(1,'这里是主人回复','2025-10-14 14:46:30',1,1);
资源目录
applicationContext.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE beans [
<!--定义元素根节点 * 一个或多个 -->
<!ELEMENT beans (bean*)>
<!--定义元素bean子节点 * 一个或多个 -->
<!ELEMENT bean (property*)>
<!--定义元素property节点 类型为字符串 -->
<!ELEMENT property (#PCDATA)>
<!--定义节点上的属性-->
<!ATTLIST bean id ID #REQUIRED>
<!ATTLIST bean class CDATA #REQUIRED>
<!ATTLIST property name CDATA #REQUIRED>
<!ATTLIST property ref IDREF #REQUIRED>
]>
<beans>
<!--1. DAO配置 -->
<bean id="userBasicDao" class="com.muxia.qqzone.dao.impl.UserBasicDaoImpl"/>
<!--2. Service配置 -->
<bean id="userBasicService" class="com.muxia.qqzone.service.impl.UserBasicServiceImpl">
<property name="userBasicDao" ref="userBasicDao"/>
</bean>
<!--3. Controller配置 -->
<bean id="user" class="com.muxia.qqzone.controller.UserController">
<property name="userBasicService" ref="userBasicService"/>
</bean>
</beans>
jdbc.properties
DRIVER=com.mysql.cj.jdbc.Driver
URL=jdbc:mysql://39.106.41.164:3306/qqzonedb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
USER=mysql
PWD=Yxecg123
封装Pojo
UserBasic
package com.muxia.qqzone.pojo;
import java.util.List;
/*
* 基本用户信息
* */
public class UserBasic {
private Integer id;
private String loginId;
private String pwd;
private String nickName;
private String headImg;
// 与 用户详情表 1 对 1 关系 1:1 PK
private UserDetail userDetail;
// 与 日志表 1对多关系
private List<Topic> topicList;
// 与 好友表 多对多关系
private List<UserBasic> friendList;
public UserBasic(){};
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getHeadImg() {
return headImg;
}
public void setHeadImg(String headImg) {
this.headImg = headImg;
}
public UserDetail getUserDetail() {
return userDetail;
}
public void setUserDetail(UserDetail userDetail) {
this.userDetail = userDetail;
}
public List<Topic> getTopicList() {
return topicList;
}
public void setTopicList(List<Topic> topicList) {
this.topicList = topicList;
}
public List<UserBasic> getFriendList() {
return friendList;
}
public void setFriendList(List<UserBasic> friendList) {
this.friendList = friendList;
}
}
UserDetail
package com.muxia.qqzone.pojo;
import java.sql.Date;
/*
* 用户-详情
* */
public class UserDetail {
private Integer id ;
private String realName ;
private String tel ;
private String email ;
private Date birth ; // 这里使用sql包中的Date,只有年月日即可
private String star ;
public UserDetail(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getStar() {
return star;
}
public void setStar(String star) {
this.star = star;
}
}
Topic
package com.muxia.qqzone.pojo;
import java.util.Date;
import java.util.List;
/*
* 日志-帖子
* */
public class Topic {
private Integer id;
private String title ;
private String content ;
private Date topicDate ;
// 与 基本信息表 多对1关系
private UserBasic author ;
// 与 回复表 1对多关系
private List<Reply> replyList;
public Topic(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getTopicDate() {
return topicDate;
}
public void setTopicDate(Date topicDate) {
this.topicDate = topicDate;
}
public UserBasic getAuthor() {
return author;
}
public void setAuthor(UserBasic author) {
this.author = author;
}
public List<Reply> getReplyList() {
return replyList;
}
public void setReplyList(List<Reply> replyList) {
this.replyList = replyList;
}
}
Reply
package com.muxia.qqzone.pojo;
import java.util.Date;
/*
* 别人回复铁子表
* */
public class Reply {
private Integer id ;
private String content ;
private Date replyDate ;
// 与 基本信息表 多 对 1 关系
private UserBasic author ; //M:1
// 与 话题表 多 对 1 关系
private Topic topic ; //M:1
// 与 主人回复表 1 对 1 关系
private HostReply hostReply ;
public Reply() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getReplyDate() {
return replyDate;
}
public void setReplyDate(Date replyDate) {
this.replyDate = replyDate;
}
public UserBasic getAuthor() {
return author;
}
public void setAuthor(UserBasic author) {
this.author = author;
}
public Topic getTopic() {
return topic;
}
public void setTopic(Topic topic) {
this.topic = topic;
}
public HostReply getHostReply() {
return hostReply;
}
public void setHostReply(HostReply hostReply) {
this.hostReply = hostReply;
}
}
HostReply
package com.muxia.qqzone.pojo;
import java.util.Date;
public class HostReply {
private Integer id ;
private String content ;
private Date hostReplyDate ;
private UserBasic author ;
// 与 回复表 1 对 1 关系
private Reply reply ;
public HostReply() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getHostReplyDate() {
return hostReplyDate;
}
public void setHostReplyDate(Date hostReplyDate) {
this.hostReplyDate = hostReplyDate;
}
public UserBasic getAuthor() {
return author;
}
public void setAuthor(UserBasic author) {
this.author = author;
}
public Reply getReply() {
return reply;
}
public void setReply(Reply reply) {
this.reply = reply;
}
}
登陆功能
控制层
UserController
package com.muxia.qqzone.controller;
import com.muxia.qqzone.pojo.UserBasic;
import com.muxia.qqzone.service.UserBasicService;
import javax.servlet.http.HttpSession;
public class UserController {
private static final String PAGE_INDEX = "index";
private static final String LOGIN_SUCC = "redirect:user.do";
private static final String LOGIN_FAIL = "redirect:page?page=login";
// 声明 用户 service
private UserBasicService userBasicService ;
public String login(String loginId, String pwd, HttpSession session){
UserBasic userBasic = userBasicService.login(loginId,pwd);
if (userBasic != null){
// userBasic这个key用来代表登陆者
session.setAttribute("userBasic",userBasic);
return PAGE_INDEX;
}else{
System.out.println("登陆失败"+userBasic);
return LOGIN_FAIL;
}
}
}
服务层
UserBasicService
package com.muxia.qqzone.service;
import com.muxia.qqzone.pojo.UserBasic;
public interface UserBasicService {
UserBasic login(String loginId,String pwd);
}
UserBasicServiceImpl
package com.muxia.qqzone.service.impl;
import com.muxia.qqzone.dao.UserBasicDao;
import com.muxia.qqzone.pojo.UserBasic;
import com.muxia.qqzone.service.UserBasicService;
public class UserBasicServiceImpl implements UserBasicService {
private UserBasicDao userBasicDao;
@Override
public UserBasic login(String loginId, String pwd) {
return userBasicDao.getUserBasicByLoginIdAndPwd(loginId,pwd);
}
}
Dao层
UserBasicDao
package com.muxia.qqzone.dao;
import com.muxia.qqzone.pojo.UserBasic;
public interface UserBasicDao {
// 登陆
UserBasic getUserBasicByLoginIdAndPwd(String loginId,String pwd);
}
UserBasicDaoImpl
package com.muxia.qqzone.dao.impl;
import com.muxia.qqzone.dao.UserBasicDao;
import com.muxia.qqzone.pojo.UserBasic;
import com.fruit.yuluo.myssm.dao.BaseDao;
public class UserBasicDaoImpl extends BaseDao<UserBasic> implements UserBasicDao {
@Override
public UserBasic getUserBasicByLoginIdAndPwd(String loginId, String pwd) {
return load("select * from t_user_basic where loginId = ? and pwd = ? ",loginId,pwd);
}
}