【项目】小帽空间

13 篇文章 0 订阅

小帽空间

一、需求介绍和数据库设计

1.熟悉小帽空间业务需求
  1) 用户登录
  2) 登录成功,显示主界面。左侧显示好友列表;上端显示欢迎词。如果不是自己的空间,显示超链接:返回自己的空间;下端显示日志列表
  3) 查看日志详情:
        - 日志本身的信息(作者头像、昵称、日志标题、日志内容、日志的日期)
        - 回复列表(回复者的头像、昵称、回复内容、回复日期)
        - 主人回复信息
  4) 删除日志
  5) 删除特定回复
  6) 删除特定主人回复
  7) 添加日志、添加回复、添加主人回复
  8) 点击左侧好友链接,进入好友的空间
2.数据库设计
  1) 抽取实体 : 用户登录信息、用户详情信息 、 日志 、 回贴  、 主人回复
  2) 分析其中的属性:
    - 用户登录信息:账号、密码、头像、昵称
    - 用户详情信息:真实姓名、星座、血型、邮箱、手机号.....
    - 日志:标题、内容、日期、作者
    - 回复:内容、日期、作者、日志
    - 主人回复:内容、日期、作者、回复
  3) 分析实体之间的关系
    - 用户登录信息 : 用户详情信息      1:1 PK
    - 用户 : 日志                   1:N
    - 日志 : 回复                   1:N
    - 回复 : 主人回复                1:1 UK
    - 用户 : 好友                   M : N
3.数据库的范式:
  1) 第一范式:列不可再分
  2) 第二范式:一张表只表达一层含义(只描述一件事情)
  3) 第三范式:表中的每一列和主键都是直接依赖关系,而不是间接依赖
4.数据库设计的范式和数据库的查询性能很多时候是相悖的,我们需要根据实际的业务情况做一个选择:
 - 查询频次不高的情况下,我们更倾向于提高数据库的设计范式,从而提高存储效率
 - 查询频次较高的情形,我们更倾向于牺牲数据库的规范度,降低数据库设计的范式,允许特定的冗余,从而提高查询的性能
5.小帽空间登录功能实现出现的四个错误:
 1) URL没修改,用的还是fruitdb
 2)
 3)rsmd.getColumnName() 和 rsmd.getColumnLabel()
 4)Can not set com.alex.qqzone.pojo.UserBasic field com.atguigu.qqzone.pojo.Topic.author to java.lang.Integer
 5) left.html页面没有样式,同时数据也不展示,原因是:我们是直接去请求的静态页面资源,那么并没有执行super.processTemplate(),也就是thymeleaf没有起作用
    (之前的表单也是这个原因)
    解决方法:
    - 新增PageController,添加page方法:
    public String page(String page){
        return page ;       // frames/left
    }
    目的是执行super.processTemplate()方法,让thymeleaf生效

在这里插入图片描述

二、POJO、DAO、Service

1. POJO

package com.alex.zone.pojo;

import java.util.Date;

public class HostReply {
    private Integer id ;
    private String content ;
    private Date hostReplyDate ;
    private UserBasic author ; //M:1
    private Reply reply ;   //1:1

    public HostReply(){}
	// ... get set方法
}
package com.alex.zone.pojo;

import java.util.Date;

public class Reply {
    private Integer id ;
    private String content ;
    private Date replyDate ;
    private UserBasic author ;  //M:1
    private Topic topic ;       //M:1

    private HostReply hostReply ;   //1:1

    public Reply(){}
    // ... get set方法
}
package com.alex.zone.pojo;

import java.util.Date;
import java.util.List;

public class Topic {
    private Integer id ;
    private String title ;
    private String content ;
    private Date topicDate ;
    private UserBasic author ;          //M:1

    private List<Reply> replyList ;     //1:N

    public Topic(){}
    // ... get set方法
}
package com.alex.zone.pojo;

import java.util.List;

public class UserBasic {
    private Integer id ;
    private String loginId ;
    private String nickName ;
    private String pwd ;
    private String headImg ;

    private UserDetail userDetail ;     //1:1
    private List<Topic> topicList ;     //1:N
    private List<UserBasic> friendList ;//M:N


    public UserBasic(){}
    // ... get set方法
}
package com.alex.zone.pojo;

import java.sql.Date;

public class UserDetail {
    private Integer id ;
    private String realName ;
    private String tel ;
    private String email ;
    private Date birth ;
    private String star ;

    public UserDetail(){}
    // ... get set方法
}

//父类:java.util.Date 年月日时分秒毫秒
//子类:java.sql.Date 年月日
//子类:java.sql.Time 时分秒

2. DAO

package com.alex.zone.dao;

import com.alex.zone.pojo.UserBasic;

import java.util.List;

public interface UserBasicDAO {
    //根据账号和密码获取特定用户信息
    public UserBasic getUserBasic(String loginId , String pwd ) ;
    //获取指定用户的所有好友列表
    public List<UserBasic> getUserBasicList(UserBasic userBasic);
    //根据id查询UserBasic的信息
    UserBasic getUserBasicById(Integer id);
}
package com.alex.zone.dao.impl;

import com.alex.myssm.basedao.BaseDAO;
import com.alex.zone.dao.UserBasicDAO;
import com.alex.zone.pojo.UserBasic;

import java.util.List;

public class UserBasicDAOImpl extends BaseDAO<UserBasic> implements UserBasicDAO {
    @Override
    public UserBasic getUserBasic(String loginId, String pwd) {
        return super.load("select * from t_user_basic where loginId = ? and pwd = ? " , loginId , pwd);
    }

    @Override
    public List<UserBasic> getUserBasicList(UserBasic userBasic) {
        String sql = "SELECT fid as 'id' FROM t_friend WHERE uid = ?";
        return super.executeQuery(sql,userBasic.getId());
    }

    @Override
    public UserBasic getUserBasicById(Integer id) {
        return load("select * from t_user_basic where id = ? " , id);
    }
}
package com.alex.zone.dao.impl;

import com.alex.myssm.basedao.BaseDAO;
import com.alex.zone.dao.TopicDAO;
import com.alex.zone.pojo.Topic;
import com.alex.zone.pojo.UserBasic;

import java.util.List;

public class TopicDAOImpl extends BaseDAO<Topic> implements TopicDAO {
    @Override
    public List<Topic> getTopicList(UserBasic userBasic) {
        return super.executeQuery("select * from t_topic where author = ? " , userBasic.getId());
    }

    @Override
    public void addTopic(Topic topic) {

    }

    @Override
    public void delTopic(Topic topic) {

    }

    @Override
    public Topic getTopic(Integer id) {
        return null;
    }
}

3. Service

package com.alex.zone.service;

import com.alex.zone.dao.UserBasicDAO;
import com.alex.zone.pojo.UserBasic;

import java.util.List;

public interface UserBasicService {
    UserBasic login(String loginId , String pwd );
    List<UserBasic> getFriendList(UserBasic userBasic);
}
package com.alex.zone.service.impl;

import com.alex.zone.dao.UserBasicDAO;
import com.alex.zone.pojo.UserBasic;
import com.alex.zone.service.UserBasicService;

import java.util.ArrayList;
import java.util.List;

public class UserBasicServiceImpl implements UserBasicService {

    private UserBasicDAO userBasicDAO = null ;

    @Override
    public UserBasic login(String loginId, String pwd) {
        UserBasic userBasic = userBasicDAO.getUserBasic(loginId,pwd);
        return userBasic;
    }

    @Override
    public List<UserBasic> getFriendList(UserBasic userBasic) {
        List<UserBasic> userBasicList = userBasicDAO.getUserBasicList(userBasic);
        List<UserBasic> friendList = new ArrayList<>(userBasicList.size());
        for (int i = 0; i < userBasicList.size(); i++) {
            UserBasic friend = userBasicList.get(i);
            friend = userBasicDAO.getUserBasicById(friend.getId());
            friendList.add(friend);
        }
        return friendList;
    }
}
package com.alex.zone.service;

import com.alex.zone.pojo.Topic;
import com.alex.zone.pojo.UserBasic;

import java.util.List;

public interface TopicService {
    //查询特定用户的日志列表
    List<Topic> getTopicList(UserBasic userBasic) ;
}
package com.alex.zone.service.impl;

import com.alex.zone.dao.TopicDAO;
import com.alex.zone.pojo.Topic;
import com.alex.zone.pojo.UserBasic;
import com.alex.zone.service.TopicService;

import java.util.List;

public class TopicServiceImpl implements TopicService {

    private TopicDAO topicDAO = null ;

    @Override
    public List<Topic> getTopicList(UserBasic userBasic) {
        return topicDAO.getTopicList(userBasic);
    }
}
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE beans [
    <!ELEMENT beans (bean*)>
    <!ELEMENT bean (property*)>
    <!ELEMENT property (#PCDATA)>

    <!ATTLIST bean id ID #REQUIRED>
    <!ATTLIST bean class CDATA #IMPLIED>
    <!ATTLIST property name CDATA #IMPLIED>
    <!ATTLIST property ref IDREF #IMPLIED>
]>

<beans>
    <bean id="userBasicDAO" class="com.alex.zone.dao.impl.UserBasicDAOImpl"/>
    <bean id="topicDAO" class="com.alex.zone.dao.impl.TopicDAOImpl"/>

    <bean id="userBasicService" class="com.alex.zone.service.impl.UserBasicServiceImpl">
        <property name="userBasicDAO" ref="userBasicDAO"/>
    </bean>

    <bean id="topicService" class="com.alex.zone.service.impl.TopicServiceImpl">
        <property name="topicDAO" ref="topicDAO"/>
    </bean>

    <bean id="user" class="com.alex.zone.controller.UserController">
        <property name="userBasicService" ref="userBasicService"/>
        <property name="topicService" ref="topicService"/>
    </bean>
    <bean id="page" class="com.alex.myssm.myspringmvc.PageController"/>
</beans>

三、Controller 实现

package com.alex.zone.controller;

import com.alex.zone.pojo.Topic;
import com.alex.zone.pojo.UserBasic;
import com.alex.zone.service.TopicService;
import com.alex.zone.service.UserBasicService;

import javax.servlet.http.HttpSession;
import java.util.List;

public class UserController {

    private UserBasicService userBasicService ;
    private TopicService topicService ;

    public String login(String loginId , String pwd , HttpSession session){
        //1.登录验证
        UserBasic userBasic = userBasicService.login(loginId, pwd);
        if(userBasic!=null){
            //1-1 获取相关的好友信息
            List<UserBasic> friendList = userBasicService.getFriendList(userBasic);
            //1-2 获取相关的日志列表信息(但是,日志只有id,没有其他信息)
            List<Topic> topicList = topicService.getTopicList(userBasic);

            userBasic.setFriendList(friendList);
            userBasic.setTopicList(topicList);

            session.setAttribute("userBasic",userBasic);
            return "index";
        }else{
            return "login";
        }
    }
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/common.css">
    <link rel="stylesheet" href="css/login.css">
</head>
<body>
    <div id="div0">
        <div id="div_container">
            <p class="center">用户登录1</p>
            <form th:action="@{/user.do}" method="get">
                <input type="hidden" name="operate" value="login"/>
                <table>
                    <tr>
                        <th>用户名:</th>
                        <td><input type="text" name="loginId" value="u001"/></td>
                    </tr>
                    <tr>
                        <th>密码:</th>
                        <td><input type="password" name="pwd" value="ok"/></td>
                    </tr>
                    <tr>
                        <th colspan="2">
                            <input type="submit" value="登录"/>
                            <input type="button" value="还没有账号?"/>
                        </th>
                    </tr>
                </table>
            </form>
        </div>
    </div>
</body>
</html>

四、登录验证展示好友列表

<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" th:href="@{/css/common.css}">
    <link rel="stylesheet" th:href="@{/css/left.css}">
</head>
<body>
    <div id="div_friendList" >
        我的好友2<br/>
        <ul>
            <li th:if="${#lists.isEmpty(session.userBasic.friendList)}">一个好友也没有</li>
            <li th:unless="${#lists.isEmpty(session.userBasic.friendList)}" th:each="friend : ${session.userBasic.friendList}" th:text="${friend.nickName}"></li>
        </ul>
    </div>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬小帽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值