2021SC@SDUSC-SDUDOC-blog16

在这里插入图片描述
本项目结构中,多个controller类进行后端事务的控制。
服务器和编辑器的通讯目前已经改成类protobuf接口,云端打开
有加入云端协作编辑的功能,暂时不表。

@RestController
@RequestMapping("/article")
public class DmsArticleController {

    @Resource
    private DmsArticleService dmsArticleService;

    @RequestMapping("/findAll")
    @ResponseBody
    List<DmsArticle> findAll() {
        return dmsArticleService.findAll();
    }

}

使用@RestController:
是Spring4之后新加入的注解,原来返回json需要@ResponseBody和@Controller配合。

即@RestController是@ResponseBody和@Controller的组合注解。



@RestController
public class HelloController {

    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(){
        return "hello";
    }
}

与下面的代码作用一样

@Controller
@ResponseBody
public class HelloController {

    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(){
        return "hello";
    }
}

@RequestMapping 配置url映射

@RequestMapping此注解即可以作用在控制器的某个方法上,也可以作用在此控制器类上。

当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。

本项目中article和character的控制类都比较简单,基本采用原生的注解结构即可。

简单提一下DmsArticle

它包含文章基本信息,也就是:

唯一标识 String
文章作者 String
书名 String
内容 String
图片链接 String
页码 List<Map<String, String>>
xml文档 String
文章注解 String
朝代 String
详细注解 JSONArray

DmsArticleService实现DmsArticleRepository的接口:

@Resource
private DmsArticleRepository dmsArticleRepository;

@Override
public DmsArticle save(DmsArticle dmsArticle) {
    return dmsArticleRepository.save(dmsArticle);
}

而DmsArticleRepository继承MongoRepository:

@Repository(value = "ds1DmsArticleRepository")
public interface DmsArticleRepository extends MongoRepository<DmsArticle,String> {
}

查看源码:

@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> 
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    ...
    
    // ...
    Optional<T> findById(ID id);
}

发现一直在层层继承。

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    ...
    
    // ...
    Optional<T> findById(ID id);
}

追溯到最高层,果然有ID作为文章唯一标识。

登陆控制需要的点稍微多一些。下一篇拆开来分析。

@RestController
@RequestMapping("/user")
public class LoginController {

    @Autowired
    UmsUserRepository service;
    @Autowired
    TokenService tokenService;

    @PostMapping("/login")
    public JSONObject login(String username, String password) {
        JSONObject jsonObject = new JSONObject();
        UmsUser user = new UmsUser();
        user.setUsername(username);
        user.setPassword(password);

        Optional<UmsUser> userForBase = service.findOne(Example.of(user));

        if (userForBase.isPresent()) {
            if (!userForBase.get().getPassword().equals(user.getPassword())) {
                jsonObject.put("message", "登录失败,密码错误");
            } else {
                String token = tokenService.getToken(userForBase.get());
                jsonObject.put("token", token);
                jsonObject.put("user", userForBase);
            }
        }else{
            jsonObject.put("message", "登录失败,用户不存在或密码错误");
        }

        return jsonObject;
    }

    @PostMapping("/register")
    public Object register(String username, String password, String nickname) {
        JSONObject jsonObject = new JSONObject();
        UmsUser fuser = new UmsUser();
        fuser.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(fuser));

        if (one.isPresent()) {
            jsonObject.put("message", "用户已存在");
        } else {
            fuser.setPassword(password);
            fuser.setNickname(nickname);
            fuser.setStatus(1);
            fuser.setCount(1);

            service.save(fuser);
            jsonObject = login(username, password);
        }

        return jsonObject;
    }

    @UserLoginToken
    @GetMapping("/get_message")
    public String getMessage() {
        return "通过验证";
    }

    @PostMapping("/set_password")
    public String setPassword(String username, String password, String confirmPassword) {
        if (password == null || password.equals("") || confirmPassword == null || confirmPassword.equals("")) {
            return "密码不能为空";
        }
        if (!password.equals(confirmPassword)) {
            return "两次输入密码不同";
        }
        UmsUser user = new UmsUser();
        user.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(user));
        if (one.isPresent()) {
            if (one.get().getPassword().equals(password)) {
                return "密码重复";
            } else {
                user = one.get();
                user.setPassword(password);
                service.save(user);
                return password;
            }
        } else {
            return "用户不存在";
        }
    }

    @PostMapping("/set_nickname")
    public String setNickname(String username, String nickname) {
        if (nickname == null || nickname.equals("")) {
            return "昵称不能为空";
        }
        UmsUser user = new UmsUser();
        user.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(user));
        if (one.isPresent()) {
            user = one.get();
            user.setNickname(nickname);
            service.save(user);
            return nickname;
        } else {
            return "用户不存在";
        }
    }

    @PostMapping("/set_email")
    public String setEmail(String username, String email) {
        if (email == null || email.equals("")) {
            return "邮箱不能为空";
        }
        if (email.indexOf('@') == -1) {
            return "邮箱地址格式错误";
        }
        UmsUser user = new UmsUser();
        user.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(user));
        if (one.isPresent()) {
            user = one.get();
            user.setEmail(email);
            service.save(user);
            return email;
        } else {
            return "用户不存在";
        }
    }

    @PostMapping("/set_phone")
    public String setPhone(String username, String phone) {
        if (phone == null || phone.equals("")) {
            return "手机号码不能为空";
        }
        if (phone.trim().length() != 11) {
            return "号码格式不正确";
        }
        if (phone.charAt(0) != '1' || (phone.charAt(0) == '1' && "358".indexOf(phone.charAt(1)) == -1)) {
            return "号码格式不正确";
        }
        UmsUser user = new UmsUser();
        user.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(user));
        if (one.isPresent()) {
            user = one.get();
            user.setPhone(new BigInteger(phone));
            service.save(user);
            return phone;
        } else {
            return "用户不存在";
        }
    }

    @PostMapping("/set_sex")
    public Integer setSex(String username, Integer sex) {
        if (sex == null) {
            return -1;  // 参数为空
        }
        if (sex != 0 && sex != 1) {
            return -2;  // 参数不合法
        }
        UmsUser user = new UmsUser();
        user.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(user));
        if (one.isPresent()) {
            user = one.get();
            user.setSex(sex);
            service.save(user);
            return sex;
        } else {
            return -3;  // 用户不存在
        }
    }

    @PostMapping("/set_birthday")
    public String setBirthday(String username, String birthday) {
        if (birthday == null || birthday.equals("")) {
            return "生日不能为空";
        }
        if (birthday.length() != 10
                || birthday.indexOf('-') == -1
                || !birthday.substring(0, 4).matches("[0-9]*")
                || !birthday.substring(5, 7).matches("[0-9]*")
                || !birthday.substring(8).matches("[0-9]*")) {
            return "生日格式应为 yyyy-MM-dd";
        }
        UmsUser user = new UmsUser();
        user.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(user));
        if (one.isPresent()) {
            user = one.get();
            user.setBirthday(birthday);
            service.save(user);
            return birthday;
        } else {
            return "用户不存在";
        }
    }

    @PostMapping(value = "/set_avatar", produces = "application/json")
    public String setAvatar(@RequestBody JSONObject data) {
        String username = data.getString("username");
        String img = data.getString("img").replaceAll(" ", "+");

        String[] d = img.split("base64,");

        if (d.length == 2) {
            String b = d[1];

            byte[] bs = Base64Util.base64Decode2Bytes(b);
            for(int i = 0 ; i < bs.length; ++i) {
                if(bs[i] < 0) {
                    //调整异常数据
                    bs[i] += 256;
                }
            }

            try {
                String imgFilePath = System.getProperty("user.dir");
                File dir = new File(imgFilePath + "/userimg/picture/");
                if (!dir.exists() && !dir.mkdirs()) {
                    return "生成图片存储路径失败";
                }

                UmsUser user = new UmsUser();
                user.setUsername(username);
                Optional<UmsUser> one = service.findOne(Example.of(user));
                if (!one.isPresent()) {
                    return "用户不存在";
                } else {
                    user = one.get();
                    imgFilePath += "/userimg/picture/" + one.get().getUsername() + ".jpg";
                    user.setImgurl(imgFilePath);

                    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(imgFilePath));
                    out.write(bs);
                    out.flush();
                    out.close();

                    service.save(user);

                    return "图片写入成功";
                }
            } catch (IOException e) {
                e.printStackTrace();
                return "图片写入失败";
            }
        }
        return "base64格式错误";
    }

    @GetMapping("/get_avatar")
    public void getAvatar(HttpServletResponse response, String username) {
        UmsUser user = new UmsUser();
        user.setUsername(username);
        Optional<UmsUser> one = service.findOne(Example.of(user));

        if (one.isPresent()) {
            try {
                ServletOutputStream out = response.getOutputStream();

                InputStream in = new FileInputStream(System.getProperty("user.dir") + "/userimg/picture/" + username + ".jpg");
                byte[] data = new byte[in.available()];

                while (in.read(data) == -1) break;

                in.close();

                out.write(data);
                out.flush();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chi Z犬里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值