万网icp网站备案专题,湘潭注册公司,北京住房与建设部网站首页,如何免费建立一个自己的网站完整笔记和项目代码#xff1a; https://pan.baidu.com/s/1PZBO0mfpwDPic4Ezsk8orA?pwdwwp5 提取码: wwp5 JavaWeb-微头条项目开发
1 项目简介
1.1 业务介绍 微头条新闻发布和浏览平台,主要包含业务如下 用户功能 注册功能登录功能 头条新闻 新闻的分页浏览通过标题关键字搜… 完整笔记和项目代码 https://pan.baidu.com/s/1PZBO0mfpwDPic4Ezsk8orA?pwdwwp5 提取码: wwp5 JavaWeb-微头条项目开发
1 项目简介
1.1 业务介绍 微头条新闻发布和浏览平台,主要包含业务如下 用户功能 注册功能登录功能 头条新闻 新闻的分页浏览通过标题关键字搜索新闻查看新闻详情新闻的修改和删除 权限控制 用户只能修改和自己发布的头条新闻
1.2 技术栈介绍 前端技术栈 ES6作为基础JS语法nodejs用于运行环境npm用于项目依赖管理工具vite用于项目的构建架工具Vue3用于项目数据的渲染框架Axios用于前后端数据的交互Router用于页面的跳转Pinia用于存储用户的数据LocalStorage作为用户校验token的存储手段Element-Plus提供组件 后端技术栈 JAVA作为开发语言,版本为JDK17Tomcat作为服务容器,版本为10.1.7Mysql8用于项目存储数据Servlet用于控制层实现前后端数据交互JDBC用于实现数据的CURDDruid用于提供数据源的连接池MD5用于用户密码的加密Jwt用于token的生成和校验Jackson用于转换JSONFilter用于用户登录校验和跨域处理Lombok用于处理实体类
1.3 后端项目结构
创建Web项目 导入依赖 准备包结构 controller 控制层代码,主要由Servlet组成service 服务层代码,主要用于处理业务逻辑dao 数据访问层,主要用户定义对于各个表格的CURD的方法pojo 实体类层,主要用于存放和数据库对应的实体类以及一些VO对象util 工具类包,主要用存放一些工具类common 公共包,主要用户存放一些其他公共代码filters 过滤器包,专门用于存放一些过滤器test 测试代码包,专门用于定义一些测试的功能代码,上线前应该删掉,后期用maven可以自动处理掉
2 项目框架源码和注解
2.1 工具类
2.1.1 异步响应规范格式类
Result类
package com.atguigu.headline.common;/*** 全局统一返回结果类**/
public class ResultT {// 返回码private Integer code;// 返回消息private String message;// 返回数据private T data;public Result(){}// 返回数据protected static T ResultT build(T data) {ResultT result new ResultT();if (data ! null)result.setData(data);return result;}public static T ResultT build(T body, Integer code, String message) {ResultT result build(body);result.setCode(code);result.setMessage(message);return result;}public static T ResultT build(T body, ResultCodeEnum resultCodeEnum) {ResultT result build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}/*** 操作成功* param data baseCategory1List* param T* return*/public staticT ResultT ok(T data){ResultT result build(data);return build(data, ResultCodeEnum.SUCCESS);}public ResultT message(String msg){this.setMessage(msg);return this;}public ResultT code(Integer code){this.setCode(code);return this;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code code;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}public T getData() {return data;}public void setData(T data) {this.data data;}
}ResultCodeEnum 枚举类
package com.atguigu.headline.common;
/*** 统一返回结果状态信息类**/
public enum ResultCodeEnum {SUCCESS(200,success),USERNAME_ERROR(501,usernameError),PASSWORD_ERROR(503,passwordError),NOTLOGIN(504,notLogin),USERNAME_USED(505,userNameUsed);private Integer code;private String message;private ResultCodeEnum(Integer code, String message) {this.code code;this.message message;}public Integer getCode() {return code;}public String getMessage() {return message;}
}2.1.2 MD5加密工具类
package com.atguigu.headline.util;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public final class MD5Util {public static String encrypt(String strSrc) {try {char hexChars[] { 0, 1, 2, 3, 4, 5, 6, 7, 8,9, a, b, c, d, e, f };byte[] bytes strSrc.getBytes();MessageDigest md MessageDigest.getInstance(MD5);md.update(bytes);bytes md.digest();int j bytes.length;char[] chars new char[j * 2];int k 0;for (int i 0; i bytes.length; i) {byte b bytes[i];chars[k] hexChars[b 4 0xf];chars[k] hexChars[b 0xf];}return new String(chars);} catch (NoSuchAlgorithmException e) {e.printStackTrace();throw new RuntimeException(MD5加密出错 e);}}
}2.1.3 JDBCUtil连接池工具类
package com.atguigu.headline.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;public class JDBCUtil {private static ThreadLocalConnection threadLocal new ThreadLocal();private static DataSource dataSource;// 初始化连接池static{// 可以帮助我们读取.properties配置文件Properties properties new Properties();InputStream resourceAsStream JDBCUtil.class.getClassLoader().getResourceAsStream(jdbc.properties);try {properties.load(resourceAsStream);} catch (IOException e) {throw new RuntimeException(e);}try {dataSource DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {throw new RuntimeException(e);}}/*1 向外提供连接池的方法*/public static DataSource getDataSource(){return dataSource;}/*2 向外提供连接的方法*/public static Connection getConnection(){Connection connection threadLocal.get();if (null connection) {try {connection dataSource.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}threadLocal.set(connection);}return connection;}/*定义一个归还连接的方法 (解除和ThreadLocal之间的关联关系) */public static void releaseConnection(){Connection connection threadLocal.get();if (null ! connection) {threadLocal.remove();// 把连接设置回自动提交的连接try {connection.setAutoCommit(true);// 自动归还到连接池connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}}
}添加jdbc.properties配置文件
driverClassNamecom.mysql.cj.jdbc.Driver
urljdbc:mysql://localhost:3306/top_news
usernameroot
passwordroot
initialSize5
maxActive10
maxWait10002.1.4 JwtHelper工具类
package com.atguigu.headline.util;import com.alibaba.druid.util.StringUtils;
import io.jsonwebtoken.*;import java.util.Date;public class JwtHelper {private static long tokenExpiration 24*60*60*1000;private static String tokenSignKey 123456;//生成token字符串public static String createToken(Long userId) {String token Jwts.builder().setSubject(YYGH-USER).setExpiration(new Date(System.currentTimeMillis() tokenExpiration)).claim(userId, userId).signWith(SignatureAlgorithm.HS512, tokenSignKey).compressWith(CompressionCodecs.GZIP).compact();return token;}//从token字符串获取useridpublic static Long getUserId(String token) {if(StringUtils.isEmpty(token)) return null;JwsClaims claimsJws Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);Claims claims claimsJws.getBody();Integer userId (Integer)claims.get(userId);return userId.longValue();}//判断token是否有效public static boolean isExpiration(String token){try {boolean isExpire Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token).getBody().getExpiration().before(new Date());//没有过期有效返回falsereturn isExpire;}catch(Exception e) {//过期出现异常返回truereturn true;}}
}2.1.5 JSON转换的WEBUtil工具类
package com.atguigu.headline.util;import com.atguigu.headline.common.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.BufferedReader;
import java.io.IOException;
import java.text.SimpleDateFormat;public class WebUtil {private static ObjectMapper objectMapper;// 初始化objectMapperstatic{objectMappernew ObjectMapper();// 设置JSON和Object转换时的时间日期格式objectMapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss));}// 从请求中获取JSON串并转换为Objectpublic static T T readJson(HttpServletRequest request,ClassT clazz){T t null;BufferedReader reader null;try {reader request.getReader();StringBuffer buffer new StringBuffer();String line null;while((line reader.readLine())! null){buffer.append(line);}t objectMapper.readValue(buffer.toString(),clazz);} catch (IOException e) {throw new RuntimeException(e);}return t;}// 将Result对象转换成JSON串并放入响应对象public static void writeJson(HttpServletResponse response, Result result){response.setContentType(application/json;charsetUTF-8);try {String json objectMapper.writeValueAsString(result);response.getWriter().write(json);} catch (IOException e) {throw new RuntimeException(e);}}
}2.2 实体类和VO对象
2.2.1 NewsUser
package com.atguigu.headline.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;AllArgsConstructor
NoArgsConstructor
Data
public class NewsUser implements Serializable {private Integer uid;private String username;private String userPwd;private String nickName;
}2.2.2 NewsType
package com.atguigu.headline.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;AllArgsConstructor
NoArgsConstructor
Data
public class NewsType implements Serializable {private Integer tid;private String tname;
}2.2.3 NewsHeadline
package com.atguigu.headline.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;AllArgsConstructor
NoArgsConstructor
Data
public class NewsHeadline implements Serializable {private Integer hid;private String title;private String article;private Integer type;private Integer publisher;private Integer pageViews;private Date createTime;private Date updateTime;private Integer isDeleted;}2.2.4 HeadlineQueryVo
package com.atguigu.headline.pojo.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;AllArgsConstructor
NoArgsConstructor
Data
public class HeadlineQueryVo implements Serializable {private String keyWords;private Integer type ;private Integer pageNum;private Integer pageSize;
}2.2.5 HeadlinePageVo
package com.atguigu.headline.pojo.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;AllArgsConstructor
NoArgsConstructor
Data
public class HeadlinePageVo implements Serializable {private Integer hid;private String title;private Integer type;private Integer pageViews;private Long pastHours;private Integer publisher;
}2.2.6 HeadlineDetailVo
package com.atguigu.headline.pojo.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;AllArgsConstructor
NoArgsConstructor
Data
public class HeadlineDetailVo implements Serializable {private Integer hid;private String title;private String article;private Integer type;private String typeName;private Integer pageViews;private Long pastHours;private Integer publisher;private String author;
}2.3 Dao层 BaseDao基础类,封装了公共的查询方法和公共的增删改方法 注意,所有的Dao接口的实现类都要继承BaseDao 2.3.1 BaseDao
package com.atguigu.headline.dao;import com.atguigu.headline.util.JDBCUtil;
import java.lang.reflect.Field;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;public class BaseDao {// 公共的查询方法 返回的是单个对象public T T baseQueryObject(ClassT clazz, String sql, Object ... args) {T t null;Connection connection JDBCUtil.getConnection();PreparedStatement preparedStatement null;ResultSet resultSet null;int rows 0;try {// 准备语句对象preparedStatement connection.prepareStatement(sql);// 设置语句上的参数for (int i 0; i args.length; i) {preparedStatement.setObject(i 1, args[i]);}// 执行 查询resultSet preparedStatement.executeQuery();if (resultSet.next()) {t (T) resultSet.getObject(1);}} catch (Exception e) {throw new RuntimeException(e);} finally {if (null ! resultSet) {try {resultSet.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (null ! preparedStatement) {try {preparedStatement.close();} catch (SQLException e) {throw new RuntimeException(e);}}JDBCUtil.releaseConnection();}return t;}// 公共的查询方法 返回的是对象的集合public T ListT baseQuery(Class clazz, String sql, Object ... args){ListT list new ArrayList();Connection connection JDBCUtil.getConnection();PreparedStatement preparedStatementnull;ResultSet resultSet null;int rows 0;try {// 准备语句对象preparedStatement connection.prepareStatement(sql);// 设置语句上的参数for (int i 0; i args.length; i) {preparedStatement.setObject(i1,args[i]);}// 执行 查询resultSet preparedStatement.executeQuery();ResultSetMetaData metaData resultSet.getMetaData();int columnCount metaData.getColumnCount();// 将结果集通过反射封装成实体类对象while (resultSet.next()) {// 使用反射实例化对象Object obj clazz.getDeclaredConstructor().newInstance();for (int i 1; i columnCount; i) {String columnName metaData.getColumnLabel(i);Object value resultSet.getObject(columnName);// 处理datetime类型字段和java.util.Data转换问题if(value.getClass().equals(LocalDateTime.class)){value Timestamp.valueOf((LocalDateTime) value);}Field field clazz.getDeclaredField(columnName);field.setAccessible(true);field.set(obj,value);}list.add((T)obj);}} catch (Exception e) {throw new RuntimeException(e);} finally {if (null !resultSet) {try {resultSet.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (null ! preparedStatement) {try {preparedStatement.close();} catch (SQLException e) {throw new RuntimeException(e);}}JDBCUtil.releaseConnection();}return list;}// 通用的增删改方法public int baseUpdate(String sql,Object ... args) {// 获取连接Connection connection JDBCUtil.getConnection();PreparedStatement preparedStatementnull;int rows 0;try {// 准备语句对象preparedStatement connection.prepareStatement(sql);// 设置语句上的参数for (int i 0; i args.length; i) {preparedStatement.setObject(i1,args[i]);}// 执行 增删改 executeUpdaterows preparedStatement.executeUpdate();// 释放资源(可选)} catch (SQLException e) {throw new RuntimeException(e);} finally {if (null ! preparedStatement) {try {preparedStatement.close();} catch (SQLException e) {throw new RuntimeException(e);}}JDBCUtil.releaseConnection();}// 返回的是影响数据库记录数return rows;}
}2.3.2 Dao层所有接口
package com.atguigu.headline.dao;
public interface NewsHeadLineDao {}package com.atguigu.headline.dao;
public interface NewsTypeDao {}package com.atguigu.headline.dao;
public interface NewsUserDao {}2.3.3 dao层所有实现类
package com.atguigu.headline.dao.impl;
import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{}package com.atguigu.headline.dao.impl;
import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsTypeDao;
public class NewsTypeDaoImpl extends BaseDao implements NewsTypeDao{}package com.atguigu.headline.dao.impl;
import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsUserDao;
public class NewsUserDaoImpl extends BaseDao implements NewsUserDao{}2.4 Service层 2.4.1 service层所有接口
package com.atguigu.headline.service;
public interface NewsHeadlineService {}package com.atguigu.headline.service;
public interface NewsTypeService {ListNewsType findAll();
}package com.atguigu.headline.service;
public interface NewsUserService {}2.4.2 service层所有实现类
package com.atguigu.headline.service.impl;
import com.atguigu.headline.service.NewsHeadlineService;
public class NewsHeadlineServiceImpl implements NewsHeadlineService {
}package com.atguigu.headline.service.impl;
import com.atguigu.headline.service.NewsTypeService;
public class NewsTypeServiceImpl implements NewsTypeService {}package com.atguigu.headline.service.impl;
import com.atguigu.headline.service.NewsUserService;
public class NewsUserServiceImpl implements NewsUserService {}2.5 Controller层 BaseController 用于将路径关联到处理方法的基础控制器所有的Controller都要继承该类 2.5.1 BaseController
package com.atguigu.headline.controller;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.lang.reflect.Method;public class BaseController extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 响应的MIME类型和乱码问题resp.setContentType(application/json;charsetUTF-8);String requestURI req.getRequestURI();String[] split requestURI.split(/);String methodName split[split.length-1];// 通过反射获取要执行的方法Class clazz this.getClass();try {Method methodclazz.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);// 设置方法可以访问method.setAccessible(true);// 通过反射执行代码method.invoke(this,req,resp);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}}
}2.5.2 所有的Controller类
package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
WebServlet(/headline/*)
public class NewsHeadlineController extends BaseController {}package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
WebServlet(/type/*)
public class NewsTypeController {}package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
WebServlet(/user/*)
public class NewsUserController extends BaseController{}package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
WebServlet(/portal/*)
public class PortalController extends BaseController{}2.6 过滤器
2.6.1 跨域过滤器
package com.atguigu.headline.filters;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;WebFilter(/*)
public class CrosFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletResponse response (HttpServletResponse) servletResponse;HttpServletRequest request (HttpServletRequest) servletRequest;response.setHeader(Access-Control-Allow-Origin, *);response.setHeader(Access-Control-Allow-Methods, POST, GET, OPTIONS, DELETE, HEAD);response.setHeader(Access-Control-Max-Age, 3600);response.setHeader(Access-Control-Allow-Headers, access-control-allow-origin, authority, content-type, version-info, X-Requested-With);// 非预检请求,放行即可,预检请求,则到此结束,不需要放行if(!request.getMethod().equalsIgnoreCase(OPTIONS)){filterChain.doFilter(servletRequest, servletResponse);}}
}3 项目具体实现
3.1 登录注册功能
3.1.1 登录表单提交 需求描述 用户在客户端输入用户名密码并向后端提交,后端根据用户名和密码判断登录是否成功,用户有误或者密码有误响应不同的提示信息 uri: user/login请求方式: POST请求参数 {username:zhangsan, //用户名userPwd:123456 //明文密码
}响应示例 登录成功
{code:200, // 成功状态码 message:success // 成功状态描述data:{token:... ... // 用户id的token}
}用户名有误
{code:501,message:用户名有误data:{}
}密码有误
{code:503,message:密码有误data:{}
}后端代码 NewsUserController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.common.ResultCodeEnum;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.service.impl.NewsUserServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.MD5Util;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/user/*)
public class NewsUserController extends BaseController{private NewsUserService newsUserService new NewsUserServiceImpl();/*** 登录验证* param req* param resp* throws ServletException* throws IOException*/protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {NewsUser newsUser WebUtil.readJson(req, NewsUser.class);Result result null;NewsUser loginNewsUser newsUserService.findByUserName(newsUser.getUsername());// 判断用户名if (null ! loginNewsUser) {// 判断密码if(loginNewsUser.getUserPwd().equals(MD5Util.encrypt(newsUser.getUserPwd()))){// 密码正确MapString,Object data new HashMap();// 生成token口令String token JwtHelper.createToken(loginNewsUser.getUid().longValue());// 封装数据mapdata.put(token,token);// 封装结果resultResult.ok(data);}else{// 封装密码错误结果resultResult.build(null, ResultCodeEnum.PASSWORD_ERROR);}}else{// 封装用户名错误结果resultResult.build(null, ResultCodeEnum.USERNAME_ERROR);}// 响应结果WebUtil.writeJson(resp,result);}
}NewsUserService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsUser;public interface NewsUserService {/*** 根据用户名,获得查询用户的方法* param username 要查询的用户名* return 如果找到返回NewsUser对象,找不到返回null*/NewsUser findByUserName(String username);
}NewsUserServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsUserDao;
import com.atguigu.headline.dao.impl.NewsUserDaoImpl;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsTypeService;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.util.MD5Util;public class NewsUserServiceImpl implements NewsUserService {private NewsUserDao newsUserDao new NewsUserDaoImpl();Overridepublic NewsUser findByUserName(String username) {return newsUserDao.findByUserName(username);}
}NewUserDao
package com.atguigu.headline.dao;
import com.atguigu.headline.pojo.NewsUser;public interface NewsUserDao {/*** 根据用户名查询用户信息* param username 要查询的用户名* return 找到返回NewsUser对象,找不到返回null*/NewsUser findByUserName(String username);
}NewsUserDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsUserDao;
import com.atguigu.headline.pojo.NewsUser;
import java.util.List;public class NewsUserDaoImpl extends BaseDao implements NewsUserDao {Overridepublic NewsUser findByUserName(String username) {// 准备SQLString sql select uid,username,user_pwd userPwd ,nick_name nickName from news_user where username ?;// 调用BaseDao公共查询方法ListNewsUser newsUserList baseQuery(NewsUser.class, sql, username);// 如果找到,返回集合中的第一个数据(其实就一个)if (null ! newsUserList newsUserList.size()0){return newsUserList.get(0);}return null;}
}3.1.2 根据token获取完整用户信息 需求描述 客户端发送请求,提交token请求头,后端根据token请求头获取登录用户的详细信息并响应给客户端进行存储 uri user/getUserInfo请求方式 GET请求头 token: ... ...响应示例 成功获取
{code: 200,message: success,data: {loginUser: {uid: 1,username: zhangsan,userPwd: ,nickName: 张三}}
}获取失败
{code: 504,message: notLogin,data: null
}后端代码 NewsUserController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.common.ResultCodeEnum;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.service.impl.NewsUserServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.MD5Util;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/user/*)
public class NewsUserController extends BaseController{private NewsUserService newsUserService new NewsUserServiceImpl();/*** 接收token,根据token查询完整用户信息* param req* param resp* throws ServletException* throws IOException*/protected void getUserInfo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String token req.getHeader(token);Result result Result.build(null,ResultCodeEnum.NOTLOGIN);if(null! token){if (!JwtHelper.isExpiration(token)) {Integer uid JwtHelper.getUserId(token).intValue();NewsUser newsUser newsUserService.findByUid(uid);newsUser.setUserPwd();MapString,Object data new HashMap();data.put(loginUser,newsUser);resultResult.ok(data);}}WebUtil.writeJson(resp,result);}
}NewsUserService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsUser;public interface NewsUserService {/*** 根据用户id查询用户信息* param uid 要查询的用户id* return 找到返回NewsUser对象,找不到返回null*/NewsUser findByUid(Integer uid);
}NewsUserServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsUserDao;
import com.atguigu.headline.dao.impl.NewsUserDaoImpl;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsTypeService;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.util.MD5Util;public class NewsUserServiceImpl implements NewsUserService {private NewsUserDao newsUserDao new NewsUserDaoImpl();Overridepublic NewsUser findByUid(Integer uid) {return newsUserDao.findByUid(uid);}
}NewUserDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsUser;public interface NewsUserDao {/*** 根据用户id连接数据库查询用户信息* param uid 要查询的用户id* return 找到返回NewsUser对象,找不到返回null*/NewsUser findByUid(Integer uid);
}NewUserDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsUserDao;
import com.atguigu.headline.pojo.NewsUser;
import java.util.List;public class NewsUserDaoImpl extends BaseDao implements NewsUserDao {Overridepublic NewsUser findByUid(Integer uid) {String sql select uid,username,user_pwd userPwd ,nick_name nickName from news_user where uid ?;ListNewsUser newsUserList baseQuery(NewsUser.class, sql, uid);if (null ! newsUserList newsUserList.size()0){return newsUserList.get(0);}return null;}
}3.1.3 注册时用户名占用校验 需求说明 用户在注册时输入用户名时,立刻将用户名发送给后端,后端根据用户名查询用户名是否可用并做出响应 uri: user/checkUserName请求方式: POST请求参数 usernamezhangsan响应示例 用户名校验通过
{code:200,message:successdata:{}
}用户名占用
{code:505,message:用户名占用data:{}
}后端代码 NewsUserController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.common.ResultCodeEnum;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.service.impl.NewsUserServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.MD5Util;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/user/*)
public class NewsUserController extends BaseController{private NewsUserService newsUserService new NewsUserServiceImpl();/*** 注册时校验用户名是否被占用* param req* param resp* throws ServletException* throws IOException*/protected void checkUserName(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username req.getParameter(username);NewsUser newsUser newsUserService.findByUserName(username);Result resultnull;if (null newsUser){resultResult.ok(null);}else{resultResult.build(null,ResultCodeEnum.USERNAME_USED);}WebUtil.writeJson(resp,result);}
}3.1.4 注册表单提交 需求说明 客户端将新用户信息发送给服务端,服务端将新用户存入数据库,存入之前做用户名是否被占用校验,校验通过响应成功提示,否则响应失败提示 uri: user/regist请求方式: POST请求参数 {username:zhangsan,userPwd:123456,nickName:张三
}响应示例 注册成功
{code:200,message:successdata:{}
}用户名占用
{code:505,message:用户名占用data:{}
}后端代码 NewsUserController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.common.ResultCodeEnum;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.service.impl.NewsUserServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.MD5Util;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/user/*)
public class NewsUserController extends BaseController{private NewsUserService newsUserService new NewsUserServiceImpl();/*** 注册功能接口* param req* param resp* throws ServletException* throws IOException*/protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {NewsUser newsUser WebUtil.readJson(req, NewsUser.class);NewsUser usedUser newsUserService.findByUserName(newsUser.getUsername());Result resultnull;if (null usedUser){newsUserService.registUser(newsUser);resultResult.ok(null);}else{resultResult.build(null,ResultCodeEnum.USERNAME_USED);}WebUtil.writeJson(resp,result);}
}NewsUserService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsUser;public interface NewsUserService {/*** 注册用户信息,注册成功返回大于0的整数,失败返回0* param newsUser* return*/int registUser(NewsUser newsUser);
}NewsUserServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsUserDao;
import com.atguigu.headline.dao.impl.NewsUserDaoImpl;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsTypeService;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.util.MD5Util;public class NewsUserServiceImpl implements NewsUserService {Overridepublic int registUser(NewsUser newsUser) {// 密码明文转密文newsUser.setUserPwd(MD5Util.encrypt(newsUser.getUserPwd()));// 存入数据库return newsUserDao.insertNewsUser(newsUser);}
}NewUserDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsUser;public interface NewsUserDao {/*** 将用户信息存入数据库* param newsUser * return*/int insertNewsUser(NewsUser newsUser);
}NewUserDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsUserDao;
import com.atguigu.headline.pojo.NewsUser;
import java.util.List;public class NewsUserDaoImpl extends BaseDao implements NewsUserDao {Overridepublic int insertNewsUser(NewsUser newsUser) {String sql insert into news_user values(DEFAULT,?,?,?);return baseUpdate(sql,newsUser.getUsername(),newsUser.getUserPwd(),newsUser.getNickName());}
}3.2 头条首页功能
3.2.1 查询所有头条分类 需求说明 进入新闻首页,查询所有分类并动态展示新闻类别栏位 uri: portal/findAllTypes请求方式 GET请求参数 无响应示例 {code:200,message:OKdata:[{tid:1,tname:新闻},{tid:2,tname:体育},{tid:3,tname:娱乐},{tid:4,tname:科技},{tid:5,tname:其他}]} 后端代码 PortalController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.pojo.NewsType;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;
import com.atguigu.headline.service.NewsTypeService;
import com.atguigu.headline.service.impl.NewsHeadlineServiceImpl;
import com.atguigu.headline.service.impl.NewsTypeServiceImpl;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;WebServlet(/portal/*)
public class PortalController extends BaseController{private NewsHeadlineService headlineServicenew NewsHeadlineServiceImpl();private NewsTypeService newsTypeServicenew NewsTypeServiceImpl();/*** 查询所有新闻类型* param req* param resp* throws ServletException* throws IOException*/protected void findAllTypes(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ListNewsType newsTypeList newsTypeService.findAll();WebUtil.writeJson(resp,Result.ok(newsTypeList));}
}NewsTypeService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsType;import java.util.List;public interface NewsTypeService {/*** 查询全部新闻类型* return*/ListNewsType findAll();
}
NewsTypeServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsTypeDao;
import com.atguigu.headline.dao.impl.NewsTypeDaoImpl;
import com.atguigu.headline.pojo.NewsType;
import com.atguigu.headline.service.NewsTypeService;import java.util.List;public class NewsTypeServiceImpl implements NewsTypeService {private NewsTypeDao newsTypeDao new NewsTypeDaoImpl();Overridepublic ListNewsType findAll() {return newsTypeDao.findAll();}
}NewUserDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsType;import java.util.List;public interface NewsTypeDao {/*** 从数据库中查询全部新闻类型* return*/ListNewsType findAll();
}
NewsTypeDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsTypeDao;
import com.atguigu.headline.pojo.NewsType;import java.util.List;public class NewsTypeDaoImpl extends BaseDao implements NewsTypeDao {Overridepublic ListNewsType findAll() {String sql select tid,tname from news_type;return baseQuery(NewsType.class, sql);}
}3.2.2 分页带条件查询所有头条 需求说明 客户端向服务端发送查询关键字,新闻类别,页码数,页大小服务端根据条件搜索分页信息,返回含页码数,页大小,总页数,总记录数,当前页数据等信息,并根据时间降序,浏览量降序排序 uri: portal/findNewsPage请求方式: POST请求参数: {keyWords:马斯克, // 搜索标题关键字type:0, // 新闻类型pageNum:1, // 页码数pageSize:10 // 页大小
}响应示例: {code:200,message:successdata:{pageInfo:{pageData:[ // 本页的数据{hid:1, // 新闻id title:尚硅谷宣布 ... ..., // 新闻标题type:1, // 新闻所属类别编号pageViews:40, // 新闻浏览量pastHours:3 , // 发布时间已过小时数publisher:1 // 发布用户ID},{hid:1, // 新闻id title:尚硅谷宣布 ... ..., // 新闻标题type:1, // 新闻所属类别编号pageViews:40, // 新闻浏览量pastHours:3, // 发布时间已过小时数publisher:1 // 发布用户ID},{hid:1, // 新闻id title:尚硅谷宣布 ... ..., // 新闻标题type:1, // 新闻所属类别编号pageViews:40, // 新闻浏览量pastHours:3, // 发布时间已过小时数publisher:1 // 发布用户ID}],pageNum:1, //页码数pageSize:10, // 页大小totalPage:20, // 总页数totalSize:200 // 总记录数}}
}后端代码 PortalController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.pojo.NewsType;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;
import com.atguigu.headline.service.NewsTypeService;
import com.atguigu.headline.service.impl.NewsHeadlineServiceImpl;
import com.atguigu.headline.service.impl.NewsTypeServiceImpl;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;WebServlet(/portal/*)
public class PortalController extends BaseController{private NewsHeadlineService headlineServicenew NewsHeadlineServiceImpl();private NewsTypeService newsTypeServicenew NewsTypeServiceImpl();/*** 分页带条件查询新闻* param req* param resp* throws ServletException* throws IOException*/protected void findNewsPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HeadlineQueryVo headLineQueryVo WebUtil.readJson(req, HeadlineQueryVo.class);// 查询分页五项数据MapString,Object pageInfo headlineService.findPage(headLineQueryVo);// 将分页五项数据放入PageInfoMapMapString,Object pageInfoMapnew HashMap();pageInfoMap.put(pageInfo,pageInfo);// 响应JSONWebUtil.writeJson(resp, Result.ok(pageInfoMap));}
}NewsHeadlineService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;
import java.util.Map;public interface NewsHeadlineService {/*** 分页查询头条新闻方法* param headLineQueryVo* return*/MapString, Object findPage(HeadlineQueryVo headLineQueryVo);
}NewsHeadlineServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.dao.impl.NewsHeadlineDaoImpl;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class NewsHeadlineServiceImpl implements NewsHeadlineService {private NewsHeadLineDao newsHeadLineDao new NewsHeadlineDaoImpl();Overridepublic MapString, Object findPage(HeadlineQueryVo headLineQueryVo) {// 准备一个map,用于装分页的五项数据MapString,Object pageInfo new HashMap();// 分页查询本页数据ListHeadlinePageVo pageData newsHeadLineDao.findPageList(headLineQueryVo);// 分页查询满足记录的总数据量int totalSize newsHeadLineDao.findPageCount(headLineQueryVo);// 页大小int pageSize headLineQueryVo.getPageSize();// 总页码数int totalPagetotalSize%pageSize 0 ? totalSize/pageSize : totalSize/pageSize1;// 当前页码数int pageNum headLineQueryVo.getPageNum();pageInfo.put(pageData,pageData);pageInfo.put(pageNum,pageNum);pageInfo.put(pageSize,pageSize);pageInfo.put(totalPage,totalPage);pageInfo.put(totalSize,totalSize);return pageInfo;}
}NewsHeadLineDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;public interface NewsHeadLineDao {/*** 根据查询条件,查询满足条件的记录数* param headLineQueryVo* return*/int findPageCount(HeadlineQueryVo headLineQueryVo);/*** 根据查询条件,查询当前页数据* param headLineQueryVo* return*/ListHeadlinePageVo findPageList(HeadlineQueryVo headLineQueryVo);
}NewsHeadlineDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.LinkedList;
import java.util.List;public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{Overridepublic int findPageCount(HeadlineQueryVo headLineQueryVo) {// 拼接动态 SQL,拼接参数ListObject args new LinkedList();String sqlselect count(1) from news_headline where is_deleted0 ;StringBuilder sqlBuffer new StringBuilder(sql) ;String keyWords headLineQueryVo.getKeyWords();//判断并动态拼接条件if (null ! keyWords keyWords.length()0){sqlBuffer.append(and title like ? );args.add(%keyWords%);}// 判断并动态拼接条件Integer type headLineQueryVo.getType();if(null ! type type ! 0){sqlBuffer.append(and type ? );args.add(type);}// 参数转数组Object[] argsArr args.toArray();System.out.println(sqlBuffer.toString());Long totalSize baseQueryObject(Long.class, sqlBuffer.toString(), argsArr);// 返回数据return totalSize.intValue();}Overridepublic ListHeadlinePageVo findPageList(HeadlineQueryVo headLineQueryVo) {// 拼接动态 SQL,拼接参数ListObject args new LinkedList();String sqlselect hid,title,type,page_views pageViews,TIMESTAMPDIFF(HOUR,create_time,NOW()) pastHours,publisher from news_headline where is_deleted0 ;StringBuilder sqlBuffer new StringBuilder(sql) ;String keyWords headLineQueryVo.getKeyWords();if (null ! keyWords keyWords.length()0){sqlBuffer.append(and title like ? );args.add(%keyWords%);}Integer type headLineQueryVo.getType();if(null ! type type ! 0){sqlBuffer.append(and type ? );args.add(type);}sqlBuffer.append(order by pastHours , page_views desc );sqlBuffer.append(limit ? , ?);args.add((headLineQueryVo.getPageNum()-1)*headLineQueryVo.getPageSize());args.add(headLineQueryVo.getPageSize());// 参数转数组Object[] argsArr args.toArray();System.out.println(sqlBuffer.toString());ListHeadlinePageVo pageData baseQuery(HeadlinePageVo.class, sqlBuffer.toString(), argsArr);return pageData;}
}3.2.3 查看头条详情 需求说明 用户点击查看全文时,向服务端发送新闻id后端根据新闻id查询完整新闻文章信息并返回后端要同时让新闻的浏览量1 uri portal/showHeadlineDetail请求方式 POST请求参数 hid1响应示例 {code:200,message:success,data:{headline:{hid:1, // 新闻id title:马斯克宣布 ... ..., // 新闻标题article:... ... // 新闻正文type:1, // 新闻所属类别编号typeName:科技, // 新闻所属类别pageViews:40, // 新闻浏览量pastHours:3 , // 发布时间已过小时数publisher:1 , // 发布用户IDauthor:张三 // 新闻作者}}
}后端代码 PortalController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.pojo.NewsType;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;
import com.atguigu.headline.service.NewsTypeService;
import com.atguigu.headline.service.impl.NewsHeadlineServiceImpl;
import com.atguigu.headline.service.impl.NewsTypeServiceImpl;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;WebServlet(/portal/*)
public class PortalController extends BaseController{private NewsHeadlineService headlineServicenew NewsHeadlineServiceImpl();private NewsTypeService newsTypeServicenew NewsTypeServiceImpl();/*** 查询单个新闻详情* param req* param resp* throws ServletException* throws IOException*/protected void showHeadlineDetail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取要查询的详情新闻idInteger hid Integer.parseInt(req.getParameter(hid));// 查询新闻详情voHeadlineDetailVo headlineDetailVo headlineService.findHeadlineDetail(hid);// 封装data内容MapString ,Object data new HashMap();data.put(headline,headlineDetailVo);// 响应JSONWebUtil.writeJson(resp,Result.ok(data));}
}NewsHeadlineService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;
import java.util.Map;public interface NewsHeadlineService {/*** 根据头条id,显示头条详情* param hid* return*/HeadlineDetailVo findHeadlineDetail(Integer hid);
}NewsHeadlineServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.dao.impl.NewsHeadlineDaoImpl;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class NewsHeadlineServiceImpl implements NewsHeadlineService {private NewsHeadLineDao newsHeadLineDao new NewsHeadlineDaoImpl();Overridepublic HeadlineDetailVo findHeadlineDetail(Integer hid) {// 修改新闻信息浏览量1newsHeadLineDao.increasePageViews(hid);// 查询新闻详情return newsHeadLineDao.findHeadlineDetail(hid);}
}NewsHeadLineDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;public interface NewsHeadLineDao {/*** 多表查询新闻详情* param hid* return*/HeadlineDetailVo findHeadlineDetail(Integer hid);int increasePageViews(Integer hid);
}NewsHeadlineDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.LinkedList;
import java.util.List;public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{Overridepublic HeadlineDetailVo findHeadlineDetail(Integer hid) {String sql select hid,title,article,type, tname typeName ,page_views pageViews,TIMESTAMPDIFF(HOUR,create_time,NOW()) pastHours,publisher,nick_name author from news_headline h left join news_type t on h.type t.tid left join news_user u on h.publisher u.uid where hid ?;ListHeadlineDetailVo headlineDetailVoList baseQuery(HeadlineDetailVo.class, sql, hid);if(null ! headlineDetailVoList headlineDetailVoList.size()0)return headlineDetailVoList.get(0);return null;}Overridepublic int increasePageViews(Integer hid) {String sql update news_headline set page_views page_views 1 where hid ?;return baseUpdate(sql,hid);}
}3.3 头条发布修改和删除
3.3.1 登录校验 需求说明 客户端在进入发布页前、发布新闻前、进入修改页前、修改前、删除新闻前先向服务端发送请求携带token请求头后端接收token请求头后,校验用户登录是否过期并做响应前端根据响应信息提示用户进入登录页还是进入正常业务页面 uri user/checkLogin请求方式 GET请求参数 无请求头 token: ... ...响应示例 登录未过期
{code:200,message:success,data:{}
}登录已过期
{code:504,message:loginExpired,data:{}
}后端代码 NewsUserController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.common.ResultCodeEnum;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.NewsUser;
import com.atguigu.headline.service.NewsUserService;
import com.atguigu.headline.service.impl.NewsUserServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.MD5Util;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/user/*)
public class NewsUserController extends BaseController{private NewsUserService newsUserService new NewsUserServiceImpl();/*** 通过token检验用户登录是否过期* param req* param resp* throws ServletException* throws IOException*/protected void checkLogin(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String token req.getHeader(token);Result result Result.build(null,ResultCodeEnum.NOTLOGIN);if(null! token){if (!JwtHelper.isExpiration(token)) {resultResult.ok(null);}}WebUtil.writeJson(resp,result);}
}登录校验过滤器
package com.atguigu.headline.filters;import com.atguigu.headline.common.Result;
import com.atguigu.headline.common.ResultCodeEnum;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;public class LoginFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request (HttpServletRequest) servletRequest;String token request.getHeader(token);boolean flag false;// token不为空并且没过期if (null ! token ){boolean expiration JwtHelper.isExpiration(token);if (!expiration ){flagtrue;}}if (flag){filterChain.doFilter(servletRequest,servletResponse);}else{WebUtil.writeJson((HttpServletResponse) servletResponse, Result.build(null, ResultCodeEnum.NOTLOGIN));}}
}web.xml中配置登录校验过滤器 !--登录校验过滤器--filterfilter-nameloginFilter/filter-namefilter-classcom.atguigu.headline.filters.LoginFilter/filter-class/filterfilter-mappingfilter-nameloginFilter/filter-nameurl-pattern/headline/*/url-pattern/filter-mapping3.3.2 提交发布头条 需求说明 用户在客户端输入发布的新闻信息完毕后发布前先请求后端的登录校验接口验证登录登录通过则提交新闻信息后端将新闻信息存入数据库 uri headline/publish请求方式 POST请求头 token: ... ...请求参数 {title:尚硅谷宣布 ... ..., // 文章标题article:... ..., // 文章内容type:1 // 文章类别
}响应示例 发布成功
{code:200,message:success,data:{}
}失去登录状态发布失败
{code:504,message:loginExpired,data:{}
}后端代码 NewsHeadlineController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.service.NewsHeadlineService;
import com.atguigu.headline.service.impl.NewsHeadlineServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/headline/*)
public class NewsHeadlineController extends BaseController {private NewsHeadlineService newsHeadlineService new NewsHeadlineServiceImpl();/*** 发布新闻* param req* param resp* throws ServletException* throws IOException*/protected void publish(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 读取新闻信息NewsHeadline newsHeadline WebUtil.readJson(req, NewsHeadline.class);// 通过token获取发布者IDString token req.getHeader(token);Long userId JwtHelper.getUserId(token);newsHeadline.setPublisher(userId.intValue());// 将新闻存入数据库newsHeadlineService.addNewsHeadline(newsHeadline);WebUtil.writeJson(resp,Result.ok(null));}
}NewsHeadlineService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;
import java.util.Map;public interface NewsHeadlineService {/*** 新增头条* param newsHeadline* return*/int addNewsHeadline(NewsHeadline newsHeadline);
}NewsHeadlineServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.dao.impl.NewsHeadlineDaoImpl;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class NewsHeadlineServiceImpl implements NewsHeadlineService {private NewsHeadLineDao newsHeadLineDao new NewsHeadlineDaoImpl();public int addNewsHeadline(NewsHeadline newsHeadline) {return newsHeadLineDao.addNewsHeadline(newsHeadline);}
}NewsHeadLineDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;public interface NewsHeadLineDao {/*** 头条存入数据库* param newsHeadline* return*/int addNewsHeadline(NewsHeadline newsHeadline);
}NewsHeadlineDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.LinkedList;
import java.util.List;public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{Overridepublic int addNewsHeadline(NewsHeadline newsHeadline) {String sql insert into news_headline values(DEFAULT,?,?,?,?,0,NOW(),NOW(),0);return baseUpdate(sql,newsHeadline.getTitle(),newsHeadline.getArticle(),newsHeadline.getType(),newsHeadline.getPublisher());}
}3.3.3 修改头条回显 需求说明 前端先调用登录校验接口,校验登录是否过期登录校验通过后 ,则根据新闻id查询新闻的完整信息并响应给前端 uri headline/findHeadlineByHid请求方式 POST请求参数 hid1响应示例 查询成功
{code:200,message:success,data:{headline:{hid:1,title:马斯克宣布,article:... ... ,type:2}}
}后端代码 NewsHeadlineController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.service.NewsHeadlineService;
import com.atguigu.headline.service.impl.NewsHeadlineServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/headline/*)
public class NewsHeadlineController extends BaseController {private NewsHeadlineService newsHeadlineService new NewsHeadlineServiceImpl();/*** 修改新闻回显* param req* param resp* throws ServletException* throws IOException*/protected void findHeadlineByHid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Integer hid Integer.parseInt(req.getParameter(hid));NewsHeadline newsHeadline newsHeadlineService.findHeadlineByHid(hid);MapString ,Object data new HashMap();data.put(headline,newsHeadline);WebUtil.writeJson(resp,Result.ok(data));}
}NewsHeadlineService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;
import java.util.Map;public interface NewsHeadlineService {/*** 根据新闻id查询单个新闻* param hid* return*/NewsHeadline findHeadlineByHid(Integer hid);
}NewsHeadlineServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.dao.impl.NewsHeadlineDaoImpl;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class NewsHeadlineServiceImpl implements NewsHeadlineService {private NewsHeadLineDao newsHeadLineDao new NewsHeadlineDaoImpl();Overridepublic NewsHeadline findHeadlineByHid(Integer hid) {return newsHeadLineDao.findHeadlineByHid(hid);}
}NewsHeadLineDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;public interface NewsHeadLineDao {NewsHeadline findHeadlineByHid(Integer hid);
}NewUserDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.LinkedList;
import java.util.List;public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{Overridepublic NewsHeadline findHeadlineByHid(Integer hid) {String sql select hid,title,article,type,publisher,page_views pageViews from news_headline where hid ?;ListNewsHeadline newsHeadlineList baseQuery(NewsHeadline.class, sql, hid);if(null ! newsHeadlineList newsHeadlineList.size()0)return newsHeadlineList.get(0);return null;}
}3.3.4 保存修改 需求描述 客户端将新闻信息修改后,提交前先请求登录校验接口校验登录状态登录校验通过则提交修改后的新闻信息,后端接收并更新进入数据库 uri headline/update请求方式 POST请求参数 {hid:1,title:尚硅谷宣布 ... ...,article:... ...,type:2
}响应示例 修改成功
{code:200,message:success,data:{}
}修改失败
{code:504,message:loginExpired,data:{}
}后端代码 NewsHeadlineController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.service.NewsHeadlineService;
import com.atguigu.headline.service.impl.NewsHeadlineServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/headline/*)
public class NewsHeadlineController extends BaseController {private NewsHeadlineService newsHeadlineService new NewsHeadlineServiceImpl();/*** 更新新闻信息* param req* param resp* throws ServletException* throws IOException*/protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {NewsHeadline newsHeadline WebUtil.readJson(req, NewsHeadline.class);newsHeadlineService.updateNewsHeadline(newsHeadline);WebUtil.writeJson(resp,Result.ok(null));}
}NewsHeadlineService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;
import java.util.Map;public interface NewsHeadlineService {int updateNewsHeadline(NewsHeadline newsHeadline);
}NewsHeadlineServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.dao.impl.NewsHeadlineDaoImpl;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class NewsHeadlineServiceImpl implements NewsHeadlineService {private NewsHeadLineDao newsHeadLineDao new NewsHeadlineDaoImpl();Overridepublic int updateNewsHeadline(NewsHeadline newsHeadline) {return newsHeadLineDao.updateNewsHeadline(newsHeadline);}
}NewsHeadLineDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;public interface NewsHeadLineDao {int updateNewsHeadline(NewsHeadline newsHeadline);
}NewUserDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.LinkedList;
import java.util.List;public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{Overridepublic int updateNewsHeadline(NewsHeadline newsHeadline) {String sql update news_headline set title ?, article ? , type ? , update_time NOW() where hid ? ;return baseUpdate(sql,newsHeadline.getTitle(),newsHeadline.getArticle(),newsHeadline.getType(),newsHeadline.getHid());}
}3.3.5 删除头条 需求说明 将要删除的新闻id发送给服务端服务端校验登录是否过期,未过期则直接删除,过期则响应登录过期信息 uri headline/removeByHid请求方式 POST请求参数 hid1响应示例 删除成功
{code:200,message:success,data:{}
}删除失败
{code:504,message:loginExpired,data:{}}后端代码 NewsHeadlineController
package com.atguigu.headline.controller;import com.atguigu.headline.common.Result;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.service.NewsHeadlineService;
import com.atguigu.headline.service.impl.NewsHeadlineServiceImpl;
import com.atguigu.headline.util.JwtHelper;
import com.atguigu.headline.util.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;WebServlet(/headline/*)
public class NewsHeadlineController extends BaseController {private NewsHeadlineService newsHeadlineService new NewsHeadlineServiceImpl();/*** 删除新闻* param req* param resp* throws ServletException* throws IOException*/protected void removeByHid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Integer hid Integer.parseInt(req.getParameter(hid));newsHeadlineService.removeByHid(hid);WebUtil.writeJson(resp,Result.ok(null));}
}NewsHeadlineService
package com.atguigu.headline.service;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;
import java.util.Map;public interface NewsHeadlineService {int removeByHid(Integer hid);
}NewsHeadlineServiceImpl
package com.atguigu.headline.service.impl;import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.dao.impl.NewsHeadlineDaoImpl;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;
import com.atguigu.headline.service.NewsHeadlineService;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class NewsHeadlineServiceImpl implements NewsHeadlineService {private NewsHeadLineDao newsHeadLineDao new NewsHeadlineDaoImpl();Overridepublic int removeByHid(Integer hid) {return newsHeadLineDao.removeByHid(hid);}
}NewsHeadLineDao
package com.atguigu.headline.dao;import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.List;public interface NewsHeadLineDao {int removeByHid(Integer hid);
}NewsHeadlineDaoImpl
package com.atguigu.headline.dao.impl;import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;import java.util.LinkedList;
import java.util.List;public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{Overridepublic int removeByHid(Integer hid) {String sql update news_headline set is_deleted 1 , update_time NOW() where hid ? ;return baseUpdate(sql,hid);}
文章转载自: http://www.morning.ctpfq.cn.gov.cn.ctpfq.cn http://www.morning.qqhfc.cn.gov.cn.qqhfc.cn http://www.morning.prmbb.cn.gov.cn.prmbb.cn http://www.morning.bpmnc.cn.gov.cn.bpmnc.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.brxzt.cn.gov.cn.brxzt.cn http://www.morning.lsmnn.cn.gov.cn.lsmnn.cn http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn http://www.morning.smdnl.cn.gov.cn.smdnl.cn http://www.morning.srcth.cn.gov.cn.srcth.cn http://www.morning.gkktj.cn.gov.cn.gkktj.cn http://www.morning.llthz.cn.gov.cn.llthz.cn http://www.morning.tbknh.cn.gov.cn.tbknh.cn http://www.morning.pylpd.cn.gov.cn.pylpd.cn http://www.morning.srbbh.cn.gov.cn.srbbh.cn http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.fmrrr.cn.gov.cn.fmrrr.cn http://www.morning.rnpt.cn.gov.cn.rnpt.cn http://www.morning.jfwbr.cn.gov.cn.jfwbr.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.pzcqz.cn.gov.cn.pzcqz.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.krxzl.cn.gov.cn.krxzl.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.mkyxp.cn.gov.cn.mkyxp.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.sqhlx.cn.gov.cn.sqhlx.cn http://www.morning.dxhdn.cn.gov.cn.dxhdn.cn http://www.morning.swzpx.cn.gov.cn.swzpx.cn http://www.morning.trmpj.cn.gov.cn.trmpj.cn http://www.morning.qzqfq.cn.gov.cn.qzqfq.cn http://www.morning.hmtft.cn.gov.cn.hmtft.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.rnfn.cn.gov.cn.rnfn.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.zxfr.cn.gov.cn.zxfr.cn http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.lmrjn.cn.gov.cn.lmrjn.cn http://www.morning.skrcn.cn.gov.cn.skrcn.cn http://www.morning.mwpcp.cn.gov.cn.mwpcp.cn http://www.morning.msgnx.cn.gov.cn.msgnx.cn http://www.morning.zylrk.cn.gov.cn.zylrk.cn http://www.morning.dbqg.cn.gov.cn.dbqg.cn http://www.morning.pdbgm.cn.gov.cn.pdbgm.cn http://www.morning.snkry.cn.gov.cn.snkry.cn http://www.morning.hptbp.cn.gov.cn.hptbp.cn http://www.morning.rrxnz.cn.gov.cn.rrxnz.cn http://www.morning.krdmn.cn.gov.cn.krdmn.cn http://www.morning.hhnhb.cn.gov.cn.hhnhb.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.wfcqr.cn.gov.cn.wfcqr.cn http://www.morning.lkgqb.cn.gov.cn.lkgqb.cn http://www.morning.bmpjp.cn.gov.cn.bmpjp.cn http://www.morning.cplym.cn.gov.cn.cplym.cn http://www.morning.bwkhp.cn.gov.cn.bwkhp.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.txkrc.cn.gov.cn.txkrc.cn http://www.morning.mfcbk.cn.gov.cn.mfcbk.cn http://www.morning.qtfss.cn.gov.cn.qtfss.cn http://www.morning.pcqdf.cn.gov.cn.pcqdf.cn http://www.morning.yppln.cn.gov.cn.yppln.cn http://www.morning.hdqqr.cn.gov.cn.hdqqr.cn http://www.morning.c7491.cn.gov.cn.c7491.cn http://www.morning.mkfr.cn.gov.cn.mkfr.cn http://www.morning.hrzymy.com.gov.cn.hrzymy.com http://www.morning.qfbzj.cn.gov.cn.qfbzj.cn http://www.morning.ntzbr.cn.gov.cn.ntzbr.cn http://www.morning.jzklb.cn.gov.cn.jzklb.cn http://www.morning.cthrb.cn.gov.cn.cthrb.cn http://www.morning.txtgy.cn.gov.cn.txtgy.cn http://www.morning.zfyfy.cn.gov.cn.zfyfy.cn http://www.morning.lxbml.cn.gov.cn.lxbml.cn http://www.morning.wqfzx.cn.gov.cn.wqfzx.cn http://www.morning.qrdkk.cn.gov.cn.qrdkk.cn http://www.morning.ghccq.cn.gov.cn.ghccq.cn http://www.morning.gbfck.cn.gov.cn.gbfck.cn http://www.morning.27asw.cn.gov.cn.27asw.cn http://www.morning.txmlg.cn.gov.cn.txmlg.cn http://www.morning.lflnb.cn.gov.cn.lflnb.cn