美文网首页
三. Service层

三. Service层

作者: stoneyang94 | 来源:发表于2018-08-14 19:30 被阅读0次
    结构

    8. service

    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四种方式

    相关文章

      网友评论

          本文标题:三. Service层

          本文链接:https://www.haomeiwen.com/subject/aofbbftx.html