招聘网站项目

项目主要模块

登录注册、首页介绍、公司介绍、职位介绍、个人中心、聊天、后台、发送邮件## 项目图片剪辑

精彩图片剪辑

首页:
在这里插入图片描述
聊天
在这里插入图片描述
登录:
在这里插入图片描述

职位:
在这里插入图片描述
公司:
在这里插入图片描述
公司详情:
在这里插入图片描述
个人中心:
在这里插入图片描述
职位详情:
在这里插入图片描述
后台:
在这里插入图片描述

部分代码

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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值