项目主要模块
登录注册、首页介绍、公司介绍、职位介绍、个人中心、聊天、后台、发送邮件## 项目图片剪辑
精彩图片剪辑
首页:
聊天:
登录:
职位:
公司:
公司详情:
个人中心:
职位详情:
后台:
部分代码
bean 代码片
.
@Data
public class JobHunter {
// 信息id
private Integer jId;
// 用户id
private Integer userId;
// 用户姓名
private String jName;
// 用户邮箱
private String jEmail;
// 性别
private Integer jSex;
// 籍贯
private String jPlace;
// 学校
private String jSchool;
// 专业
private String jMajor;
// 入学时间
@DateTimeFormat(pattern="yyyy-MM-dd")
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
private Date entryTime;
// 毕业时间
@DateTimeFormat(pattern="yyyy-MM-dd")
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
private Date graduateTime;
// 个人技能
private String jSkill;
// 在校经历
private String jExperience;
// 求职意向
private String jJob;
// 薪资要求
private Double jSalary;
// base地
private String jBase;
// 头像
private String jImage;
// 出生日期
@DateTimeFormat(pattern="yyyy-MM-dd")
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
private Date jBirth;
//学历
private String jEducation;
}
controller 代码片
.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
@RequestMapping("/email")
public class EmailController {
@Resource
private JavaMailSender javaMailSender;
@Resource
private TemplateEngine templateEngine;
/**
* 显示发送邮件的页面
* @return
*/
@GetMapping("/email")
public String sendEmailPage() {
return "/email/interviewEmail";
}
/**
* 发送验证码邮件模板
* @param code
* @return
*/
@GetMapping("/code")
@ResponseBody
public Object send(String code) {
Context context = new Context();
Map<String, Object> variables = new HashMap<>();
variables.put("code", code);
context.setVariables(variables);
String html = templateEngine.process("email/TempCode", context);
sendHtml("1341992571@qq.com", "duanyuyan@jasonone.cn", html);
return "发送邮件成功";
}
/**
* 发送简单邮件
* @param addresser
* @param addressee
* @param content
* @return
*/
@ResponseBody
@PostMapping("/send")
public String send(String addresser,String addressee,String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(addressee);
message.setFrom(addresser);
message.setText(content);
javaMailSender.send(message);
return "发送给"+addressee+"成功";
}
/**
* 发送html邮件
* @param addresser
* @param addressee
* @param content
* @return
*/
@ResponseBody
@PostMapping(path = "/send",params = "type=html")
public String sendHtml(String addresser,String addressee,String content) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setTo(addressee);
helper.setFrom(addresser);
helper.setText(content, true);
addInline(helper,"girl","classpath:girl.jpg");
// addAttachment(helper,"女孩.jpg","classpath:girl.jpg");
javaMailSender.send(message);
} catch (MessagingException | FileNotFoundException e) {
e.printStackTrace();
}
return "发送"+addressee+"成功";
}
private void addInline(MimeMessageHelper helper,String cid,String imgPath) throws MessagingException, FileNotFoundException {
File file;
file = ResourceUtils.getFile(imgPath);
FileDataSource dataSource = new FileDataSource(file);
helper.addInline(cid, dataSource);
}
handler 代码片
.
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import cn.jasonone.him.model.HimStatus;
@MappedJdbcTypes(JdbcType.INTEGER)
public class StatusHandler extends BaseTypeHandler<HimStatus> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, HimStatus parameter, JdbcType jdbcType)
throws SQLException {
if(parameter.name().equals("HIDE")){
ps.setInt(i, 0);
}else {
ps.setInt(i, 1);
}
}
@Override
public HimStatus getNullableResult(ResultSet rs, String columnName) throws SQLException {
int id = rs.getInt(columnName);
if(id == 0){
return HimStatus.HIDE;
}else {
return HimStatus.ONLINE;
}
}
@Override
public HimStatus getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int id = rs.getInt(columnIndex);
if(id == 0){
return HimStatus.HIDE;
}else {
return HimStatus.ONLINE;
}
}
@Override
public HimStatus getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int id = cs.getInt(columnIndex);
if(id == 0){
return HimStatus.HIDE;
}else {
return HimStatus.ONLINE;
}
}
}
mapper 代码片
.
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.hongmao.bean.UserFriends;
import cn.jasonone.him.model.HimUserInfo;
public interface ChatMapper {
public HimUserInfo findInfoById(int userId);
public List<HimUserInfo> findFriendsById(int userId);
public int addFriend(@Param("userId")int userId, @Param("friendId")int friendId);
public UserFriends isHave(@Param("userId")int userId, @Param("friendId")int friendId);
}
sqlmap 代码片
.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.hongmao.mapper.ChatMapper">
<resultMap type="cn.jasonone.him.model.HimUserInfo" id="himMap">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="sign" property="sign"/>
<result column="avatar" property="avatar"/>
<result column="status" property="status" typeHandler="cn.hongmao.handler.StatusHandler"/>
</resultMap>
<select id="findInfoById" parameterType="int" resultMap="himMap">
select * from himuserinfo where id = #{userId}
</select>
<select id="findFriendsById" parameterType="int" resultMap="himMap">
select * from himuserinfo where id in (
select friend_id from himuserinfo inner join user_friend
on himuserinfo.id = user_friend.user_id where id = #{userId})
</select>
<insert id="addFriend">
insert into user_friend values(#{userId}, #{friendId})
</insert>
<select id="isHave" resultType="cn.hongmao.bean.UserFriends">
select * from user_friend where user_id = #{userId} and friend_id = #{friendId}
</select>
</mapper>
serviceImpl 代码片
.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.HandshakeData;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.annotation.OnEvent;
import cn.hongmao.mapper.ChatMapper;
import cn.jasonone.him.HimConst;
import cn.jasonone.him.model.HimFriend;
import cn.jasonone.him.model.HimGroup;
import cn.jasonone.him.model.HimStatus;
import cn.jasonone.him.model.HimUserInfo;
import cn.jasonone.him.model.Message;
import cn.jasonone.him.service.HimService;
import cn.jasonone.him.util.HimUtil;
import lombok.extern.slf4j.Slf4j;
@Service
@Slf4j
public class HimServiceImpl implements HimService {
private static Map<String, HimUserInfo> users = new HashMap<>();
private static Map<String, HimFriend> friends = new HashMap<>();
private static HimGroup group;
@Resource
private ChatMapper chatMapper;
static {
// 构建模拟数据
{
// 初始化群
group = new HimGroup().setId("1").setGroupname("My Home").setList(new ArrayList<>());
group.setAvatar("http://tp1.sinaimg.cn/1571889140/180/40030060651/1");
}
// {
// // 创建测试员
// for (int i = 1; i < 5; i++) {
// HimUserInfo userInfo = new HimUserInfo();
// userInfo.setId("" + i);
// userInfo.setAvatar("http://tp1.sinaimg.cn/1571889140/180/40030060651/1");
// userInfo.setUsername("测试员" + i);
// userInfo.setStatus(HimStatus.ONLINE);
// if (i == 1) {
// group.setOwner(userInfo);
// }
// group.getList().add(userInfo);
// users.put(userInfo.getId(), userInfo);
// }
// }
// {
// // 互相添加好友
// for (int i = 1; i < 5; i++) {
// HimUserInfo userInfo = users.get("" + i);
// HimFriend friend = new HimFriend();
// friend.setGroupname("我的消息");
// friend.setList(new ArrayList<>());
// friend.setId("" + i);
// for (int j = 1; j < 5; j++) {
// if (j != i) {
// friend.getList().add(users.get("" + j));
// }
// }
// friends.put(userInfo.getId(), friend);
// }
// }
}
@Override
public boolean isAuthorization(HandshakeData data) {
// 在此处可以获得前端传递的userId,从而进行权限鉴定
// 返回值代表是否允许建立连接
// String userId = data.getSingleUrlParam("userId");
return HimService.super.isAuthorization(data);
}
@Override
public void messageFriend(SocketIOClient client, AckRequest request, Message message) {
// HimUserInfo friend = users.get(message.getId());
HimUserInfo friend = users.get(message.getId());
// 获得当前客户端中的用户对象
// 注意: 此处获得的用户对象为,HimService.connect方法返回的用户对象
HimUserInfo user = HimUtil.getUserInfo(client);
if(friend.getStatus().name().equals("ONLINE")) {
// 发送消息给好友
HimUtil.sendFriend(user, friend, message.getMessage());
}
}
@Override
public void messageGroup(SocketIOClient client, AckRequest request, Message message) {
// 发送群消息
HimUtil.sendGroup(client, message.getId(), message.getMessage());
}
@Override
public void messageSystem(SocketIOClient client, AckRequest request, Message message) {
// 此处为系统消息监听
}
@Override
public HimUserInfo connection(SocketIOClient client) {
HandshakeData data = client.getHandshakeData();
String userId = data.getSingleUrlParam("userId");
String callToId = data.getSingleUrlParam("callTo");
if(callToId != null && !callToId.equals("null") && !callToId.equals("")) {
if(chatMapper.isHave(Integer.parseInt(userId), Integer.parseInt(callToId)) == null) {
chatMapper.addFriend(Integer.parseInt(userId), Integer.parseInt(callToId));
chatMapper.addFriend(Integer.parseInt(callToId), Integer.parseInt(userId));
}
}
HimUserInfo userInfo = chatMapper.findInfoById(Integer.parseInt(userId));
HimUtil.addGroup(client, group.getId());
HimUtil.sendSystem("用户上线", userInfo);
userInfo.setStatus(HimStatus.ONLINE);
users.put(userId, userInfo);
// 客户端成功建立连接时触发,该方法必须返回一个对象,
// 否则使用HimUtil.getUserInfo()方法将获取不到值
return userInfo;
}
@Override
public void disconnection(SocketIOClient client, HimUserInfo user) {
log.debug("用户离线:{}", user.getUsername());
}
@Override
public HimUserInfo findMine(String userId) {
//根据用户ID,查询用户信息
return users.get(userId);
// return chatMapper.findInfoById(Integer.parseInt(userId));
}
@Override
public List<HimFriend> findFriends(String userId) {
//根据用户ID,查询用户的好友信息
List<HimFriend> friends = new ArrayList<>();
//friends.add(HimServiceImpl.friends.get(userId));
List<HimUserInfo> friendsById = chatMapper.findFriendsById(Integer.parseInt(userId));
HimFriend friend = new HimFriend();
friend.setGroupname("我的消息");
friend.setList(friendsById);
friends.add(friend);
return friends;
}
@Override
public List<HimGroup> findGroups(String userId) {
//根据用户ID,查询用户所有的群组信息
List<HimGroup> groups = new ArrayList<>();
groups.add(group);
return groups;
}
@Override
public HimGroup findGroupById(String groupId) {
//根据群ID,查询群详细信息
return group;
}
@Override
public String uploadImage(MultipartFile file) throws Exception {
File file2 = ResourceUtils.getFile("classpath:");
file2 = new File(file2, "static/images");
if (!file2.exists()) {
file2.mkdirs();
}
file2 = new File(file2, file.getOriginalFilename());
file.transferTo(file2);
return "/images/" + file.getOriginalFilename();
}
@Override
public String uploadFile(MultipartFile file) throws Exception {
File file2 = ResourceUtils.getFile("classpath:");
file2 = new File(file2, "static/file");
if (!file2.exists()) {
file2.mkdirs();
}
file2 = new File(file2, file.getOriginalFilename());
file.transferTo(file2);
return "/file/" + file.getOriginalFilename();
}
}
html 代码片
.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Chat</title>
<link rel="stylesheet" type="text/css" data-th-href="@{/layui/css/layui.css}" />
<link rel="stylesheet" type="text/css" data-th-href="@{/zhangbin/css/chat.css}" />
<script type="text/javascript" data-th-src="@{/layui/layui.js}"></script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script type="text/javascript" data-th-src="@{/him.js}"></script>
</head>
<body>
<nav style="position: absolute; top:5vh;left:-70vw">
<a data-th-href="@{/index}" href="#">返回主页</a>
<div id="indicator"></div>
</nav>
<script type="text/javascript">
let him=new Him('http://localhost:8088?userId=[[${userId}]]&callTo=[[${callTo}]]');
him.onSystem(function(data){
console.log(data);
})
let userId="[[${userId}]]";
layui.use('layim',function(layim){
//基础配置
layim.config({
title:'Chat',
//获取主面板列表信息
init: {
url: '[[@{/him/list}]]' //接口地址(返回的数据格式见下文)
,type: 'get' //默认get,一般可不填
,data: {
userId:userId
} //额外参数
}
//获取群员接口
,members: {
url: '[[@{/him/members}]]' //接口地址(返回的数据格式见下文)
,type: 'get' //默认get,一般可不填
,data: {userId:userId} //额外参数
}
//上传图片接口(返回的数据格式见下文)
,uploadImage: {
url: '[[@{/him/uploadImage}]]' //接口地址(返回的数据格式见下文)
,type: 'post' //默认post
}
//上传文件接口(返回的数据格式见下文)
,uploadFile: {
url: '[[@{/him/uploadFile}]]' //接口地址(返回的数据格式见下文)
,type: 'post' //默认post
}
});
layim.on('sendMessage', function(res){
console.log("发送消息:",{
id:res.to.id,
message:res.mine.content
})
let data={
id:res.to.id,
message:res.mine.content
};
if(res.to.type==='group'){
him.sendGroup(data);
}else{
him.sendFriend(data);
}
});
him.onFriend(function(data){
layim.getMessage(data.data);
})
him.onGroup(function(data){
layim.getMessage(data.data);
})
});
</script>
</body>
</html>