redbbs-pro/src/net/tccn/bbs/user/UserService.java

226 lines
7.8 KiB
Java

package net.tccn.bbs.user;
import com.jfinal.kit.Kv;
import net.tccn.bbs.base.BaseService;
import net.tccn.bbs.base.Utils;
import net.tccn.bbs.base.util.RetCodes;
import org.redkale.net.http.*;
import org.redkale.service.RetResult;
import org.redkale.source.FilterExpress;
import org.redkale.source.FilterFunc;
import org.redkale.source.FilterNode;
import org.redkale.source.Flipper;
import org.redkale.util.Comment;
import org.redkale.util.SelectColumn;
import org.redkale.util.Sheet;
import java.io.Serializable;
import java.util.*;
import static net.tccn.bbs.base.util.RetCodes.RET_USER_ACCOUNT_PWD_ILLEGAL;
/**
* Created by Lxy at 2017/10/3 14:02.
*/
@RestService(comment = "用户服务")
public class UserService extends BaseService {
@RestMapping(name = "login", auth = false, comment = "登录校验")
public RetResult<UserInfo> login(LoginBean bean) {
if (bean == null || bean.emptyUsername()) {
return retError("参数错误");
}
RetResult retResult = new RetResult();
UserDetail user = dataSource.find(UserDetail.class, "username", bean.getUsername());
if (user == null || !Objects.equals(user.getPassword(), Utils.genMd5(bean.getPassword()))) {
//log(null, 0, "用户或密码错误");
return RetCodes.retResult(RET_USER_ACCOUNT_PWD_ILLEGAL, "用户名或密码错误");
}
sessions.setAsync(sessionExpireSeconds, bean.getSessionid(), (long) user.getUserid());
retResult.setRetcode(0);
retResult.setResult(Kv.by("token", bean.getSessionid()));
retResult.setRetinfo("登录成功.");
return retResult;
}
@RestMapping(ignore = true)
public int currentUserid(String sessionid) {
if (sessionid == null) return 0;
long userid = 0;
try {
userid = sessions.getLong(sessionid, 0);
} catch (Exception e) {
e.printStackTrace();
}
return (int) userid;
}
public UserInfo current(String sessionid) {
if (sessionid == null) {
return null;
}
long userid = 0;
try {
userid = sessions.getLong(sessionid, 0);
sessions.getAndRefresh(sessionid, sessionExpireSeconds);
} catch (Exception e) {
e.printStackTrace();
}
if (userid == 0) {
return null;
}
UserInfo user = find((int) userid);
return user;
}
@RestMapping(name = "info", comment = "用户信息")
public UserInfo find(int userid) {
if (userid == 0) {
return null;
}
UserDetail user = dataSource.find(UserDetail.class, userid);
UserInfo bean = user.createUserInfo();
return bean;
}
@Comment("根据用户ID, 批量查询一批用户信息")
public Map<Integer, UserInfo> queryUserMap(Collection<Integer> userids) {
if (Utils.isEmpty(userids)) {
return Map.of();
}
FilterNode node = FilterNode.create("userid", (Serializable) userids);
List<UserDetail> records = dataSource.queryList(UserDetail.class, node);
Map<Integer, UserInfo> map = Utils.toMap(records, x -> x.getUserid(), x -> x.createUserInfo());
return map;
}
@RestMapping(name = "logout", auth = false, comment = "退出登录")
public RetResult logout(@RestSessionid String sessionid) {
sessions.remove(sessionid);
return RetResult.success();
//return new HttpResult().header("Location", "/").status(302);
}
@RestMapping(name = "query", auth = false, comment = "用户数据查询")
public Sheet<UserDetail> query(Flipper flipper, @RestParam(name = "bean", comment = "过滤条件") final UserBean userBean) {
Sheet<UserDetail> users = dataSource.querySheet(UserDetail.class, flipper, userBean);
return users;
}
@RestMapping(name = "changepwd", comment = "修改密码")
public RetResult updatePwd(@RestUserid int userid, String pass, String nowpass) {
UserInfo user = find(userid);
if (!Objects.equals(user.getPassword(), UserDetail.md5IfNeed(nowpass))) {
return retError("密码错误");
}
if (pass == null || pass.length() < 6 || Objects.equals(pass, nowpass)) {
return retError("密码设置无效");
}
dataSource.updateColumn(UserDetail.class, user.getUserid(), "password", UserDetail.md5IfNeed(pass));
return RetResult.success();
}
@RestMapping(name = "register", auth = false, comment = "用户注册")
public RetResult register(UserDetail bean) {
/*用户名、密码、邮箱*/
if (bean.getEmail() == null) {
return retError("邮件地址无效");
}
if (bean.getPassword() == null || bean.getPassword().length() < 6) {
return retError("密码设置无效");
}
if (dataSource.exists(UserDetail.class, FilterNode.create("email", bean.getEmail()))) {
return retError("用户名已存在");
}
bean.setCreatetime(System.currentTimeMillis());
bean.setPassword(bean.passwordForMd5());
bean.setStatus((short) 10);
bean.setUsername(bean.getEmail());
bean.setAvatar("/res/images/avatar/" + new Random().nextInt(21) + ".jpg");//默认头像
synchronized (this) {
int maxid = dataSource.getNumberResult(UserDetail.class, FilterFunc.MAX, 10_0000, "userid").intValue();
if (maxid < 10_0000) {
maxid = 10_0000;
}
bean.setUserid(maxid + 1);
}
dataSource.insert(bean);
//记录日志
return RetResult.success();
}
@RestMapping(name = "update", comment = "用户信息修改")
public RetResult userUpdate(@RestUserid int userid, UserDetail bean, String[] columns) {
String nickname = bean.getNickname();
if (nickname == null && nickname.isEmpty()) {
return retError("昵称无效");
}
nickname = nickname.replace(" ", "");
FilterNode node = FilterNode.create("nickname", nickname).and("userid", FilterExpress.NOTEQUAL, userid);
if (dataSource.exists(UserDetail.class, node)) {
return retError("昵称已存在");
}
bean.setNickname(nickname);//去除昵称中的空格
dataSource.updateColumn(bean
, FilterNode.create("userid", userid)
, SelectColumn.includes(columns)
);
return RetResult.success();
}
//最新加入
public Sheet<UserInfo> lastReg() {
Sheet<UserDetail> users = dataSource.querySheet(UserDetail.class
, SelectColumn.includes("userid", "nickname", "avatar", "createtime")
, new Flipper(8, "createtime DESC")
, FilterNode.create("status", 10));
Sheet<UserInfo> infos = new Sheet<>();
ArrayList<UserInfo> list = new ArrayList<>();
users.forEach(x -> {
UserInfo info = x.createUserInfo();
info.setTime(Utils.dateFmt(x.getCreatetime()));
list.add(info);
});
infos.setRows(list);
infos.setTotal(users.getTotal());
return infos;
}
@RestMapping(name = "usercount", auth = false, comment = "用户数据统计")
public Number userCount() {
return dataSource.getNumberResult(UserDetail.class, FilterFunc.COUNT, "userid", FilterNode.create("status", FilterExpress.NOTEQUAL, -10));
}
@RestMapping(ignore = true, comment = "判断用户是否是管理员")
public boolean isAdmin(int userid) {
if (userid <= 0) {
return false;
}
List<Integer> userIds = dataSource.queryColumnList("userid", UserDetail.class, FilterNode.create("roleid", 1));
for (Integer x : userIds) {
if (userid == x) {
return true;
}
}
return false;
}
}