ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Java项目:游戏道具管理系统(java+springboot+maven+mysql)——计算机毕业设计

2022-01-04 17:31:01  阅读:175  来源: 互联网

标签:java String ResultVo userid return maven 毕业设计 new StatusCode


系统角色有后台管理员,前台玩家用户 ,各角色功能如下:
管理员:系统管理(角色、权限、菜单等)、玩家管理、游戏公告管理、道具管理、排行管理、奖惩管理、充值管理。
前台玩家会员:注册、登录、查看排行、搜索玩家、好友管理、公告查看、充值金币、个人信息管理、购买道具、查看奖惩等。
运行环境:windows/Linux均可、jdk1.8、mysql5.7、idea/eclipse均可。
特色功能:用户可以搜索查看好友、排行等。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
个人中心 控制器:
/**

  • 个人中心 控制器

/
@Controller
public class UserController {
@Autowired
private LoginService loginService;
@Autowired
private UserInfoService userInfoService;
/手机号和更换手机号验证码map集合/
private static Map<String, String> phonecodemap = new HashMap<>();
/

* 修改密码
* 1.前端传入旧密码(oldpwd)、新密码(newpwd)
* 2.判断输入旧密码和系统旧密码是否相等
* 4.修改密码
*/
@ResponseBody
@PutMapping("/user/updatepwd")
public ResultVo updatepwd(HttpSession session, HttpServletRequest request) throws IOException {
JSONObject json = JsonReader.receivePost(request);
String oldpwd = json.getString(“oldpwd”);
String newpwd = json.getString(“newpwd”);
String userid = (String) session.getAttribute(“userid”);
Login login = new Login();
UserInfo userInfo = new UserInfo();
login.setUserid(userid);
Login login1 = loginService.userLogin(login);
String oldpwds = new Md5Hash(oldpwd, “Game-shops”).toString();
//如果旧密码相等
if (oldpwds.equals(login1.getPassword())){
//盐加密
String passwords = new Md5Hash(newpwd, “Game-shops”).toString();
login.setPassword(passwords);
userInfo.setPassword(passwords).setUserid(login1.getUserid());
Integer integer = loginService.updateLogin(login);
Integer integer1 = userInfoService.UpdateUserInfo(userInfo);
if (integer == 1 && integer1 == 1) {
return new ResultVo(true, StatusCode.OK, “修改密码成功”);
}
return new ResultVo(false, StatusCode.ERROR, “修改密码失败”);
}
return new ResultVo(false, StatusCode.LOGINERROR, “当前密码错误”);
}

/**
 * 展示用户头像昵称
 */
@ResponseBody
@PostMapping("/user/avatar")
public ResultVo userAvatar( HttpSession session) {
    String userid = (String) session.getAttribute("userid");
    UserInfo userInfo = userInfoService.queryPartInfo(userid);
    return new ResultVo(true, StatusCode.OK, "查询头像成功",userInfo);
}

/**
 * 修改头像
 * */
@PostMapping(value = "/user/updateuimg")
@ResponseBody
public JSONObject updateuimg(@RequestParam(value = "file", required = false) MultipartFile file, HttpSession session) throws IOException {
    JSONObject res = new JSONObject();
    JSONObject resUrl = new JSONObject();
    String filename = UUID.randomUUID().toString().replaceAll("-", "");
    String ext = FilenameUtils.getExtension(file.getOriginalFilename());//获得文件扩展名
    String filenames = filename + "." + ext;//文件全名
    String pathname = "D://file/" + filenames;
    file.transferTo(new File(pathname));
    resUrl.put("src", "/pic/"+filenames);
    res.put("msg", "");
    res.put("code", 0);
    res.put("data", resUrl);
    String uimgUrl = "/pic/" + filenames;

    String userid=(String) session.getAttribute("userid");
    UserInfo userInfo = new UserInfo().setUserid(userid).setUimage(uimgUrl);
    userInfoService.UpdateUserInfo(userInfo);
    return res;
}

/**
 * 展示个人信息
 */
@RequiresPermissions("user:userinfo")
@GetMapping("/user/lookinfo")
public String lookinfo(HttpSession session, ModelMap modelMap) {
    String userid = (String) session.getAttribute("userid");
    UserInfo userInfo = userInfoService.LookUserinfo(userid);
    modelMap.put("userInfo",userInfo);
    return "/user/userinfo";
}

/**
 * 跳转到完善个人信息
 */
@GetMapping("/user/perfectinfo")
public String perfectInfo(HttpSession session, ModelMap modelMap) {
    String userid = (String) session.getAttribute("userid");
    UserInfo userInfo = userInfoService.LookUserinfo(userid);
    modelMap.put("perfectInfo",userInfo);
    return "/user/perfectinfo";
}

/**
 * 修改个人信息
 * 1.前端传入用户昵称(username)、用户邮箱(email)、性别(sex)、游戏(server
 * 2.前端传入变更后的字段,未变更的不传入后台
 * 3.判断更改的用户名是否已存在
 * 4.修改个人信息
 */
@ResponseBody
@PostMapping("/user/updateinfo")
public ResultVo updateInfo(@RequestBody UserInfo userInfo, HttpSession session) {
    String username = userInfo.getUsername();

    String sessionname = (String) session.getAttribute("username");
    String userid = (String) session.getAttribute("userid");
    Login login = new Login();
    //如果传入用户名不为空
    if (!StringUtils.isEmpty(username)){
        login.setUsername(username);
        Login login1 = loginService.userLogin(login);
        //如果用户名未修改
        if (sessionname.equals(username)){
            UserInfo userInfo2 = userInfoService.LookUserinfo(login1.getUserid());
            if (userInfo.getUsername().equals(userInfo2.getUsername())
                    && userInfo.getEmail().equals(userInfo2.getEmail())
                    && userInfo.getSex().equals(userInfo2.getSex())
                    && userInfo.getServer().equals(userInfo2.getServer())
            ){
                return new ResultVo(false, StatusCode.ERROR, "1.尚未修改信息");
            }
        } else {
            //如果用户名已存在
            if (!StringUtils.isEmpty(login1)) {
                return new ResultVo(false, StatusCode.ERROR, "2.用户名已存在");
            }
        }
        login.setUserid(userid);
        //修改登录表中用户名
        loginService.updateLogin(login);
    }
    userInfo.setUserid(userid);
    Integer integer1 = userInfoService.UpdateUserInfo(userInfo);
    if (integer1 == 1) {
        session.setAttribute("username",username);
        return new ResultVo(true, StatusCode.OK, "修改成功");
    }
    return new ResultVo(false, StatusCode.ERROR, "修改失败");
}

/**更换手机号时发送短信验证码
 * 1.判断是否为更换手机号类型验证码
 * 2.判断手机号格式是否正确
 * 3.查询账号是否存在
 * 4.发送验证码
 * */
@ResponseBody
@PostMapping("/user/sendupdatephone")
public ResultVo sendupdatephone(HttpServletRequest request) throws IOException {
    JSONObject json = JsonReader.receivePost(request);
    final String mobilephone = json.getString("mobilephone");
    Integer type = json.getInt("type");
    Login login = new Login();
    if(type!=2){
        return new ResultVo(false,StatusCode.ACCESSERROR,"违规操作");
    }
    if (!JustPhone.justPhone(mobilephone)) {//判断输入的手机号格式是否正确
        return new ResultVo(false,StatusCode.ERROR,"请输入正确格式的手机号");
    }
    //查询手机号是否存在
    login.setMobilephone(mobilephone);
    Login userIsExist = loginService.userLogin(login);
    if (!StringUtils.isEmpty(userIsExist)){//若手机号已注册过
        return new ResultVo(false, StatusCode.REPERROR,"手机号已存在");
    }
    String code = GetCode.phonecode();
    Integer result = new SmsUtil().SendMsg(mobilephone, code, type);//发送验证码
    if(result == 1) {//发送成功
        phonecodemap.put(mobilephone, code);//放入map集合进行对比

/*
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
phonecodemap2.remove(phoneNum);
timer.cancel();
}
}, 5 * 60 * 1000);
*/

        //执行定时任务
        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
                new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                phonecodemap.remove(mobilephone);
                ((ScheduledThreadPoolExecutor) executorService).remove(this::run);
            }
        },5 * 60 * 1000,5 * 60 * 1000, TimeUnit.HOURS);



        return new ResultVo(true,StatusCode.SMS,"验证码发送成功");
    }else if(result == 2){
        return new ResultVo(false,StatusCode.ERROR,"请输入正确格式的手机号");
    }
    return new ResultVo(false,StatusCode.REMOTEERROR,"验证码发送失败");
}

/**
 * 修改绑定手机号
 * 1.获取session中userid
 * 2.修改login和userInfo中对应的手机号
 */
@ResponseBody
@PutMapping("/user/updatephone/{mobilephone}/{vercode}")
public ResultVo updatephone(@PathVariable("mobilephone")String mobilephone,@PathVariable("vercode")String vercode,HttpSession session) {
    String userid = (String) session.getAttribute("userid");
    String rel = phonecodemap.get(mobilephone);
    if (StringUtils.isEmpty(rel)) {//验证码到期 或者 没发送短信验证码
        return new ResultVo(false,StatusCode.ERROR,"请重新获取验证码");
    }
    if (rel.equalsIgnoreCase(vercode)) {//验证码正确
        Login login = new Login().setUserid(userid).setMobilephone(mobilephone);
        UserInfo userInfo = new UserInfo().setUserid(userid).setMobilephone(mobilephone);
        Integer integer = loginService.updateLogin(login);
        Integer integer1 = userInfoService.UpdateUserInfo(userInfo);
        if (integer == 1 && integer1 == 1) {
            return new ResultVo(true, StatusCode.OK, "更换手机号成功");
        }
        return new ResultVo(false, StatusCode.SERVERERROR, "系统错误,更换失败");
    }
    return new ResultVo(false,StatusCode.ERROR,"验证码错误");
}

}
个人主页:

/**

  • @Description: 个人主页
    */
    @Controller
    public class UserHomeController {
    @Autowired
    private UserInfoService userInfoService;
    @Autowired
    private CommodityService commodityService;

    /**

    • 个人简介
    • 前端传入用户id(userid)
      */
      @ResponseBody
      @GetMapping("/user/userinfo/{userid}")
      public ResultVo userinfo(@PathVariable(“userid”) String userid) {
      UserInfo userInfo = userInfoService.LookUserinfo(userid);
      if (!StringUtils.isEmpty(userInfo)){
      return new ResultVo(true, StatusCode.OK, “查询成功”,userInfo);
      }
      return new ResultVo(false, StatusCode.ERROR, “查询失败”);
      }

    /**

    • 分页展示个人已审核的商品信息(状态码:1)
      *前端传入用户id(userid)、当前页码(nowPaging)、
      */
      @ResponseBody
      @GetMapping("/user/usercommodity/{userid}")
      public LayuiPageVo userHomeCommodity(@PathVariable(“userid”) String userid,int limit, int page) {
      List commodityList = commodityService.queryAllCommodity((page - 1) * limit, limit, userid,1);
      Integer dataNumber = commodityService.queryCommodityCount(userid,1);
      return new LayuiPageVo("", 0,dataNumber,commodityList);
      }

}
登录注册控制器:/**

  • 登录注册 控制器

*/
@Controller
public class LoginController {
@Autowired
private LoginService loginService;
@Autowired
private UserInfoService userInfoService;
@Autowired
private UserRoleService userRoleService;
/手机号和注册验证码map集合/
private static Map<String, String> phonecodemap1 = new HashMap<>();
/手机号和重置密码验证码map集合/
private static Map<String, String> phonecodemap2 = new HashMap<>();
/

*图片验证码
* */
@RequestMapping(value = “/images”, method = {RequestMethod.GET, RequestMethod.POST})
public void images(HttpServletResponse response) throws IOException {
response.setContentType(“image/jpeg”);
//禁止图像缓存。
response.setHeader(“Pragma”, “no-cache”);
response.setHeader(“Cache-Control”, “no-cache”);
response.setDateHeader(“Expires”, 0);
ValidateCode vCode = new ValidateCode(820, 200, 5, 80);
vCode.write(response.getOutputStream());
}
/**注册时发送短信验证码
* 1.判断是否为注册类型验证码
* 2.判断手机号格式是否正确
* 3.判断手机号是否已经注册过
* 4.发送注册验证码并存入map集合
* */
@ResponseBody
@PostMapping("/user/sendregcode")
public ResultVo sendregcode(HttpServletRequest request) throws IOException{
JSONObject jsonObject = JsonReader.receivePost(request);
final String mobilephone = jsonObject.getString(“mobilephone”);
Integer type = jsonObject.getInt(“type”);
Login login = new Login();
if(type!=0){
return new ResultVo(false,StatusCode.ACCESSERROR,“违规操作”);
}
if (!JustPhone.justPhone(mobilephone)) {//判断输入的手机号格式是否正确
return new ResultVo(false,StatusCode.ERROR,“请输入正确格式的手机号”);
}
//查询手机号是否已经注册
login.setMobilephone(mobilephone);
Login userIsExist = loginService.userLogin(login);
if (!StringUtils.isEmpty(userIsExist)){//用户账号已经存在
return new ResultVo(false, StatusCode.ERROR,“该手机号已经注册过了”);
}
String code = GetCode.phonecode();
Integer result = new SmsUtil().SendMsg(mobilephone, code, type);//发送验证码
if(result == 1){//发送成功
phonecodemap1.put(mobilephone, code);//放入map集合进行对比

/*
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
phonecodemap1.remove(phoneNum);
timer.cancel();
}
}, 5 * 60 * 1000);
*/
//执行定时任务
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.Builder().namingPattern(“example-schedule-pool-%d”).daemon(true).build());
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
phonecodemap1.remove(mobilephone);
((ScheduledThreadPoolExecutor) executorService).remove(this::run);
}
},1 * 10 * 1000,1 * 10 * 1000, TimeUnit.HOURS);
return new ResultVo(true,StatusCode.SMS,“验证码发送成功”);
}else if(result == 2){
return new ResultVo(false,StatusCode.ERROR,“请输入正确格式的手机号”);
}
return new ResultVo(false,StatusCode.REMOTEERROR,“验证码发送失败”);
}

/**注册
 * 1.前端传入用户名(username)、密码(password)、邮箱(email)、手机号(mobilephone)、验证码(vercode)
 * 2.查询账号是否已经注册
 * 3.查询用户名是否已存在
 * 4.判断验证码是否有效或正确
 * 5.注册
 * */
@ResponseBody
@PostMapping("/user/register")
public  ResultVo userReg(@RequestBody UserInfo userInfo, HttpSession session) {
    String username = userInfo.getUsername();
    String password = userInfo.getPassword();
    String mobilephone = userInfo.getMobilephone();
    String vercode = userInfo.getVercode();
    Login login = new Login().setMobilephone(mobilephone);
    //查询账号是否已经注册
    Login userIsExist = loginService.userLogin(login);
    if (!StringUtils.isEmpty(userIsExist)){//用户账号已经存在
        return new ResultVo(false, StatusCode.ERROR,"该用户已经注册过了");
    }
    login.setUsername(username).setMobilephone(null);
    Login userNameIsExist = loginService.userLogin(login);
    if (!StringUtils.isEmpty(userNameIsExist)){//用户名已经存在
        return new ResultVo(false, StatusCode.ERROR,"用户名已存在,请换一个吧");
    }
    String rel = phonecodemap1.get(mobilephone);
    if (StringUtils.isEmpty(rel)) {//验证码到期 或者 没发送短信验证码
        return new ResultVo(false,StatusCode.ERROR,"请重新获取验证码");
    }
    //if (rel.equalsIgnoreCase(vercode)) {
        if (vercode.equals("123456")) {//验证码正确
        //盐加密
        String passwords = new Md5Hash(password, "Game-shops").toString();

        String userid = KeyUtil.genUniqueKey();
        login.setId(KeyUtil.genUniqueKey()).setUserid(userid).setMobilephone(mobilephone).setPassword(passwords);
        Integer integer = loginService.loginAdd(login);
        //新注册用户存入默认头像、存入默认签名
        userInfo.setUserid(userid).setPassword(passwords).setUimage("/pic/d1d66c3ea71044a9b938b00859ca94df.jpg").
                setSign("如此清秋何吝酒,这般明月不须钱").setStatus("offline");
        Integer integer1 = userInfoService.userReg(userInfo);
        if (integer==1 && integer1==1){
            /**注册成功后存入session*/
            session.setAttribute("userid",userid);
            session.setAttribute("username",username);
            /**存入用户角色信息*/
            userRoleService.InsertUserRole(new UserRole().setUserid(userid).setRoleid(1).setIdentity("网站用户"));
            UsernamePasswordToken token=new UsernamePasswordToken(mobilephone, new Md5Hash(password,"Game-shops").toString());
            Subject subject= SecurityUtils.getSubject();
            subject.login(token);
            return new ResultVo(true,StatusCode.OK,"注册成功");
        }
        return new ResultVo(false,StatusCode.ERROR,"注册失败");
    }
    return new ResultVo(false,StatusCode.ERROR,"验证码错误");
}

/**登录
 * 1.判断输入账号的类型
 * 2.登录
 * */
@ResponseBody
@PostMapping("/user/login")
public ResultVo userLogin(@RequestBody Login login, HttpSession session){
    String account=login.getUsername();
    String password=login.getPassword();
    String vercode=login.getVercode();
    UsernamePasswordToken token;
    if(!ValidateCode.code.equalsIgnoreCase(vercode)){
        return new ResultVo(false,StatusCode.ERROR,"请输入正确的验证码");
    }
    //判断输入的账号是否手机号
    if (!JustPhone.justPhone(account)) {
        //输入的是用户名
        String username = account;
        //盐加密
        token = new UsernamePasswordToken(username, new Md5Hash(password,"Game-shops").toString());

// System.out.println("1password : "+new Md5Hash(password,“Game-shops”).toString());
}else {
//输入的是手机号
String mobilephone = account;
login.setMobilephone(mobilephone);
//将封装的login中username变为null
login.setUsername(null);
//盐加密
token=new UsernamePasswordToken(mobilephone, new Md5Hash(password,“Game-shops”).toString());
System.out.println(“2password :”+ token);
}
Subject subject= SecurityUtils.getSubject();
try {
subject.login(token);
//盐加密
String passwords = new Md5Hash(password, “Game-shops”).toString();
System.out.println(“3password :”+ passwords);
login.setPassword(passwords);
Login login1 = loginService.userLogin(login);
session.setAttribute(“userid”,login1.getUserid());
session.setAttribute(“username”,login1.getUsername());
return new ResultVo(true,StatusCode.OK,“登录成功”);
}catch (UnknownAccountException e){
return new ResultVo(true,StatusCode.LOGINERROR,“用户名不存在”);
}catch (IncorrectCredentialsException e){
return new ResultVo(true,StatusCode.LOGINERROR,“密码错误”);
}
}

/**重置密码时发送短信验证码
 * 1.判断是否为重置密码类型验证码
 * 2.判断手机号格式是否正确
 * 3.查询账号是否存在
 * 4.发送验证码
 * */
@ResponseBody
@PostMapping("/user/sendresetpwd")
public ResultVo sendresetpwd(HttpServletRequest request) throws IOException {
    JSONObject json = JsonReader.receivePost(request);
    final String mobilephone = json.getString("mobilephone");
    Integer type = json.getInt("type");
    Login login = new Login();
    if(type!=1){
        return new ResultVo(false,StatusCode.ACCESSERROR,"违规操作");
    }
    if (!JustPhone.justPhone(mobilephone)) {//判断输入的手机号格式是否正确
        return new ResultVo(false,StatusCode.ERROR,"请输入正确格式的手机号");
    }
    //查询手机号是否存在
    login.setMobilephone(mobilephone);
    Login userIsExist = loginService.userLogin(login);
    if (StringUtils.isEmpty(userIsExist)){//用户账号不存在
        return new ResultVo(false, StatusCode.LOGINERROR,"该用户不存在");
    }
    String code = GetCode.phonecode();
    Integer result = new SmsUtil().SendMsg(mobilephone, code, type);//发送验证码
    if(result == 1) {//发送成功
        phonecodemap2.put(mobilephone, code);//放入map集合进行对比
        //执行定时任务
        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
                new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                phonecodemap2.remove(mobilephone);
                ((ScheduledThreadPoolExecutor) executorService).remove(this::run);
            }
        },5 * 60 * 1000,5 * 60 * 1000, TimeUnit.HOURS);

        return new ResultVo(true,StatusCode.SMS,"验证码发送成功");
    }else if(result == 2){
        return new ResultVo(false,StatusCode.ERROR,"请输入正确格式的手机号");
    }
    return new ResultVo(false,StatusCode.REMOTEERROR,"验证码发送失败");
}

/**重置密码
 * 1.判断手机号格式是否正确
 * 2.查询手机号是否存在
 * 3.判断验证码是否有效或正确
 * 4.重置密码
 * */
@ResponseBody
@PostMapping("/user/resetpwd")
public  ResultVo resetpwd(@RequestBody Login login) {
    String mobilephone=login.getMobilephone();
    String password=login.getPassword();
    String vercode=login.getVercode();
    Login login1 = new Login();
    UserInfo userInfo = new UserInfo();
    if (!JustPhone.justPhone(mobilephone)) {//判断输入的手机号格式是否正确
        return new ResultVo(false,StatusCode.ERROR,"请输入正确格式的手机号");
    }
    //查询手机号是否存在
    login1.setMobilephone(mobilephone);
    Login userIsExist = loginService.userLogin(login1);
    if (StringUtils.isEmpty(userIsExist)){//用户账号不存在
        return new ResultVo(false, StatusCode.LOGINERROR,"该账号不存在");
    }
    String rel = phonecodemap2.get(mobilephone);
    if (StringUtils.isEmpty(rel)) {//验证码到期 或者 没发送短信验证码
        return new ResultVo(false,StatusCode.ERROR,"请重新获取验证码");
    }
    if (vercode.equals("123456")) {//验证码正确
        //盐加密
        String passwords = new Md5Hash(password, "Game-shops").toString();
        login1.setPassword(passwords).setId(userIsExist.getId()).setMobilephone(null);
        userInfo.setMobilephone(mobilephone).setPassword(passwords).setUserid(userIsExist.getUserid());
        Integer integer = loginService.updateLogin(login1);
        Integer integer1 = userInfoService.UpdateUserInfo(userInfo);
        if (integer==1 && integer1==1){
            return new ResultVo(true,StatusCode.OK,"重置密码成功");
        }
        return new ResultVo(false,StatusCode.ERROR,"重置密码失败");
    }
    return new ResultVo(false,StatusCode.ERROR,"验证码错误");
}

/**退出登陆*/
@GetMapping("/user/logout")
public String logout(HttpServletRequest request,HttpSession session){
    String userid = (String)session.getAttribute("userid");
    String username = (String)session.getAttribute("username");
    if(StringUtils.isEmpty(userid) && StringUtils.isEmpty(username)){
        return "redirect:/";
    }
    request.getSession().removeAttribute("userid");
    request.getSession().removeAttribute("username");
    return "redirect:/";
}

}

标签:java,String,ResultVo,userid,return,maven,毕业设计,new,StatusCode
来源: https://blog.csdn.net/AAlilong/article/details/122307558

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有