
8. service

8.1 CommentService
@Service
public class CommentService {
@Autowired
private CommentDAO commentDAO;
public List<Comment> getCommentsByEntity(int entityId, int entityType) {
return commentDAO.selectByEntity(entityId, entityType);
}
public int addComment(Comment comment) {
return commentDAO.addComment(comment);
}
public int getCommentCount(int entityId, int entityType) {
return commentDAO.getCommentCount(entityId, entityType);
}
public void deleteComment(int entityId, int entityType) {
commentDAO.updateStatus(entityId, entityType, 1);
}
}
8.2 LikeService
@Service
public class LikeService {
@Autowired
JedisAdapter jedisAdapter;
public int getLikeStatus(int userId, int entityType, int entityId) {
String likeKey = RedisKeyUtil.getLikeKey(entityId, entityType);
if(jedisAdapter.sismember(likeKey, String.valueOf(userId))) {
return 1;
}
String disLikeKey = RedisKeyUtil.getDisLikeKey(entityId, entityType);
return jedisAdapter.sismember(disLikeKey, String.valueOf(userId)) ? -1 : 0;
}
// 点赞:即当前用户点赞后,被点赞用户的like集合中就会加上一个该点赞的用户信息
public long like(int userId, int entityType, int entityId) {
// 在喜欢集合里增加
String likeKey = RedisKeyUtil.getLikeKey(entityId, entityType);
jedisAdapter.sadd(likeKey, String.valueOf(userId));
// 从反对里删除
String disLikeKey = RedisKeyUtil.getDisLikeKey(entityId, entityType);
jedisAdapter.srem(disLikeKey, String.valueOf(userId));
return jedisAdapter.scard(likeKey);
}
public long disLike(int userId, int entityType, int entityId) {
// 在反对集合里增加
String disLikeKey = RedisKeyUtil.getDisLikeKey(entityId, entityType);
jedisAdapter.sadd(disLikeKey, String.valueOf(userId));
// 从喜欢里删除
String likeKey = RedisKeyUtil.getLikeKey(entityId, entityType);
jedisAdapter.srem(likeKey, String.valueOf(userId));
return jedisAdapter.scard(likeKey);
}
}
1)getLikeStatus
根据当前用户的userid分别生成一个likeKey 和 disLikeKey,再分别判断这两个值是否在对应的Like集合中和disLikeKey集合中
如果在likeKey集合中,就返回一个1,否则返回-1
8.3 MessageService
public class MessageService {
@Autowired
MessageDAO messageDAO;
public int addMessage(Message message) {
return messageDAO.addMessage(message);
}
public List<Message> getConversationDetail(String conversationId, int offset, int limit) {
return messageDAO.getConversationDetail(conversationId, offset, limit);
}
public List<Message> getConversationList(int userId, int offset, int limit) {
return messageDAO.getConversationList(userId, offset, limit);
}
public int getConvesationUnreadCount(int userId, String conversationId) {
return messageDAO.getConvesationUnreadCount(userId, conversationId);
}
}
8.4 NewsService
资讯
@Service
public class NewsService {
@Autowired
private NewsDAO newsDAO;
public List<News> getLatestNews(int userId, int offset, int limit) {
return newsDAO.selectByUserIdAndOffset(userId, offset, limit);
}
public int addNews(News news) {//资讯入库
newsDAO.addNews(news);
return news.getId();
}
public News getById(int newsId) {
return newsDAO.getById(newsId);
}
public String saveImage(MultipartFile file) throws IOException {
int dotPos = file.getOriginalFilename().lastIndexOf(".");//简单判断一下后缀名是不是图片
if (dotPos < 0) {
return null;
}
String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();//后缀名
if (!ToutiaoUtil.isFileAllowed(fileExt)) {//把这部分功能卸载ToutiaoUtil这个工具里
return null;
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
Files.copy(file.getInputStream(), new File(ToutiaoUtil.IMAGE_DIR + fileName).toPath(),
StandardCopyOption.REPLACE_EXISTING);
return ToutiaoUtil.TOUTIAO_DOMAIN + "image?name=" + fileName;
}
public int updateCommentCount(int id, int count) {
return newsDAO.updateCommentCount(id, count);
}
public int updateLikeCount(int id, int count) {
return newsDAO.updateLikeCount(id, count);
}
}
1)MultipartFile 文件上传
SpringMVC:用MultipartFile上传单个文件,多个文件
获取,转存
1>使用SpringMVC注解@RequestParam来获取表单中的file参数内容;
2>通过MultipartFile的transferTo(File dest)这个方法来直接转存文件到指定的路径。
MultipartFile常用方法
作用 | 方法 | 例子 |
---|---|---|
文件类型值 | MultipartFile.getContentType() | image/jpeg |
表单中文件组件对应name值 | MultipartFile.getName() | file |
文件原始名称包括后缀名 | MultipartFile.getOriginalFilename() | IMEI_20171204.jpg |
文件大小单位为k | MultipartFile.getSize() | 27128 |
文件是否为空 | MultipartFile.isEmpty() | false |
2)判断格式
简单判断一下后缀名,判断上传来的是不是图片
int dotPos = file.getOriginalFilename().lastIndexOf(".");
lastIndexOf()
返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
8.5 QiniuService
@Service
public class QiniuService {
private static final Logger logger = LoggerFactory.getLogger(QiniuService.class);
//设置好账号的ACCESS_KEY和SECRET_KEY
String ACCESS_KEY = "abNXnXBIlI6viRaOeRY6Hk-zc3V-NpjLcGfYz5kD";
String SECRET_KEY = "QP7Xja3FmP1Zyl-oxwQDCb7T6wCoEFKoO-0vht_5";
//要上传的空间
String bucketname = "nowcoder";
//密钥配置
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
//创建上传对象
UploadManager uploadManager = new UploadManager();
private static String QINIU_IMAGE_DOMAIN = "http://7xsetu.com1.z0.glb.clouddn.com/";
//简单上传,使用默认策略,只需要设置上传的空间名就可以了
public String getUpToken() {
return auth.uploadToken(bucketname);
}
public String saveImage(MultipartFile file) throws IOException {
try {//从newsservice拷贝的格式的判断
int dotPos = file.getOriginalFilename().lastIndexOf(".");
if (dotPos < 0) {
return null;
}
String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();
if (!ToutiaoUtil.isFileAllowed(fileExt)) {
return null;
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
//调用put方法上传
Response res = uploadManager.put(file.getBytes(), fileName, getUpToken());
//打印返回的信息
//System.out.println(res.bodyString());
if (res.isOK() && res.isJson()) {
return QINIU_IMAGE_DOMAIN + JSONObject.parseObject(res.bodyString()).get("key");
} else {
logger.error("七牛异常:" + res.bodyString());
return null;
}
} catch (QiniuException e) {
// 请求失败时打印的异常的信息
logger.error("七牛异常:" + e.getMessage());
return null;
}
}
}
1) 返回
return QINIU_IMAGE_DOMAIN + JSONObject.parseObject(res.bodyString()).get("key");
前缀+key(图片的名字)
七牛云 实时缩图
8.6 ToutiaoService
@Service
public class ToutiaoService {
public String say() {
return "This is from ToutiaoService";
}
}
8.7 UserService
@Service
public class UserService {
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
@Autowired
private UserDAO userDAO;
@Autowired
private LoginTicketDAO loginTicketDAO;
public Map<String, Object> register(String username, String password) {
Map<String, Object> map = new HashMap<String, Object>();
if (StringUtils.isBlank(username)) {
map.put("msgname", "用户名不能为空");
return map;
}
if (StringUtils.isBlank(password)) {
map.put("msgpwd", "密码不能为空");
return map;
}
User user = userDAO.selectByName(username);
if (user != null) {
map.put("msgname", "用户名已经被注册");
return map;
}
// 密码强度
//不能直接保存; 加密也不够,还要加salt
user = new User();
user.setName(username);
user.setSalt(UUID.randomUUID().toString().substring(0, 5));// salt
String head = String.format("http://images.nowcoder.com/head/%dt.png", new Random().nextInt(1000));
user.setHeadUrl(head);
user.setPassword(ToutiaoUtil.MD5(password+user.getSalt()));// 密码+盐
userDAO.addUser(user);
// 登陆
String ticket = addLoginTicket(user.getId());
map.put("ticket", ticket);
return map;
}
public Map<String, Object> login(String username, String password) {
Map<String, Object> map = new HashMap<String, Object>();
if (StringUtils.isBlank(username)) {
map.put("msgname", "用户名不能为空");
return map;
}
if (StringUtils.isBlank(password)) {
map.put("msgpwd", "密码不能为空");
return map;
}
User user = userDAO.selectByName(username);
if (user == null) {
map.put("msgname", "用户名不存在");
return map;
}
if (!ToutiaoUtil.MD5(password+user.getSalt()).equals(user.getPassword())) {
map.put("msgpwd", "密码不正确");
return map;
}
map.put("userId", user.getId());
String ticket = addLoginTicket(user.getId());
map.put("ticket", ticket);
return map;
}
private String addLoginTicket(int userId) {
LoginTicket ticket = new LoginTicket();
ticket.setUserId(userId);
Date date = new Date();
date.setTime(date.getTime() + 1000*3600*24);
ticket.setExpired(date);
ticket.setStatus(0);
ticket.setTicket(UUID.randomUUID().toString().replaceAll("-", ""));
loginTicketDAO.addTicket(ticket);
return ticket.getTicket();
}
public User getUser(int id) {
return userDAO.selectById(id);
}
public void logout(String ticket) {
loginTicketDAO.updateStatus(ticket, 1);
}
}
1)UUID
UUID(Universally Unique Identifier)
通用唯一识别码 ,这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,是由一个十六位的数字组成,表现出来的形式。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。
UUID.randomUUID().toString().
一个UUID例子:
8cee5b6b-c6c0-402e-ac04-454e866cba95
2) 遍历map
遍历map四种方式
网友评论