'合并分支'

This commit is contained in:
2019-05-01 11:45:16 +08:00
parent 15ee570d7b
commit 1edf4abdf9
59 changed files with 90 additions and 111 deletions

View File

@@ -0,0 +1,66 @@
package com.lxyer.bbs.base;
import com.arangodb.ArangoCollection;
import com.arangodb.ArangoDB;
import com.arangodb.ArangoDatabase;
import com.lxyer.bbs.base.entity.VisLog;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
/**
* @author: liangxianyou at 2018/11/18 9:02.
*/
public class ArangoKit {
protected static final boolean winos = System.getProperty("os.name").contains("Window");
protected static Function<String, String> chDev = (s) -> s + (winos ? "_dev" : "");
//Arango
protected static ArangoDB arangoDb = new ArangoDB.Builder().host("120.24.230.60", 8529).user("root").password("abc123").build();
protected static ArangoDatabase dbDev = arangoDb.db(chDev.apply("redbbs"));
protected static ArangoCollection colVisLog = dbDev.collection(chDev.apply("vis_log"));
static {
if (!dbDev.exists()) {
dbDev.create();
}
if (!colVisLog.exists()) {
colVisLog.create();
}
//java.net.SocketTimeoutException: Read timed out 加入下面两行,观察是否正常
System.setProperty("sun.net.client.defaultConnectTimeout", String.valueOf(1000));
System.setProperty("sun.net.client.defaultReadTimeout", String.valueOf(1000));
}
public static <T> CompletableFuture<T> save(T t) {
return CompletableFuture.supplyAsync(() -> {
if (t instanceof VisLog) {
colVisLog.insertDocument(t);
}
return t;
});
}
public static long findInt(String aql) {
return dbDev.query(aql, long.class).first();
}
public static long findInt(String aql, Map para) {
return dbDev.query(aql, long.class).first();
}
public static <T> List<T> find(String aql, Class<T> clazz) {
return dbDev.query(aql, clazz).asListRemaining();
}
public static <T> List<T> find(String aql, Map para, Class<T> clazz) {
return dbDev.query(aql, para, clazz).asListRemaining();
}
}

View File

@@ -0,0 +1,95 @@
package com.lxyer.bbs.base;
import com.arangodb.ArangoCollection;
import com.arangodb.ArangoDB;
import com.arangodb.ArangoDatabase;
import com.lxyer.bbs.base.entity.VisLog;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestService;
import org.redkale.util.AnyValue;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
/**
* @author: liangxianyou at 2018/11/18 9:02.
*/
@RestService(automapping = true, comment = "Arango服务")
public class ArangoService extends BaseService {
protected static final boolean winos = System.getProperty("os.name").contains("Window");
protected Function<String, String> chDev = (s) -> s + (isDev ? "_dev" : "");
@Resource(name = "property.arango.host")
private String arangoHost = "127.0.0.1";
@Resource(name = "property.arango.port")
private int port = 8529;
@Resource(name = "property.arango.database")
private String database = "redbbs";
@Resource(name = "property.arango.user")
private String user = "root";
@Resource(name = "property.arango.password")
private String password = "root";
//日志存放doc名称
private static final String VIS_LOG = "vis_log";
//Arango
protected static ArangoDB arangoDb;
protected static ArangoDatabase db;
protected static ArangoCollection colVisLog;
@Override
public void init(AnyValue config) {
System.out.println("isDev :" + isDev);
arangoDb = new ArangoDB.Builder().host(arangoHost, port).user(user).password(password).build();
db = arangoDb.db(chDev.apply(database));
colVisLog = db.collection(chDev.apply(VIS_LOG));
if (!db.exists()) {
db.create();
}
if (!colVisLog.exists()) {
colVisLog.create();
}
}
@RestMapping(auth = false)
public List<Map> hi() {
System.out.println("colVisLog :" + colVisLog.exists());
String aql = String.format("for d in %s limit 10 return d", chDev.apply(VIS_LOG));
List<Map> visLogs = db.query(aql, Map.class).asListRemaining();
return visLogs;
}
public static <T> CompletableFuture<T> save(T t) {
return CompletableFuture.supplyAsync(() -> {
if (t instanceof VisLog) {
colVisLog.insertDocument(t);
}
return t;
});
}
public static long findInt(String aql) {
return db.query(aql, long.class).first();
}
public static long findInt(String aql, Map para) {
return db.query(aql, long.class).first();
}
public static <T> List<T> find(String aql, Class<T> clazz) {
return db.query(aql, clazz).asListRemaining();
}
public static <T> List<T> find(String aql, Map para, Class<T> clazz) {
return db.query(aql, para, clazz).asListRemaining();
}
}

View File

@@ -0,0 +1,72 @@
package com.lxyer.bbs.base;
import com.arangodb.Predicate;
import org.redkale.net.http.RestMapping;
import org.redkale.service.Service;
import org.redkale.source.CacheSource;
import org.redkale.source.DataSource;
import javax.annotation.Resource;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Created by Lxy at 2017/10/3 13:50.
*/
public class BaseService implements Service {
protected final int sessionExpireSeconds = 7 * 24 * 60 * 60;
@Resource(name = "property.isDev")
public boolean isDev = true;
@Resource(name = "SERVER_ROOT")
protected File webroot;
@Resource(name = "art123")
protected DataSource source;
/* 使用redis 代码中配置此处即可
@Resource(name = "redis")*/
@Resource(name = "cacheSource")
protected CacheSource<Long> sessions;
@Resource(name = "cacheSource")
protected CacheSource cacheSource;
protected static final boolean winos = System.getProperty("os.name").contains("Window");
public static Predicate isEmpty = (x) -> {
if (x == null)
return true;
if (x instanceof List)
return ((List) x).isEmpty();
if (x instanceof String)
return ((String) x).isEmpty();
if (x instanceof Map)
return ((Map) x).isEmpty();
if (x instanceof Collection)
return ((Collection) x).isEmpty();
return false;
};
@RestMapping(ignore = true)
public DataSource getSource() {
return source;
}
@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;
}
}

View File

@@ -0,0 +1,174 @@
package com.lxyer.bbs.base;
import com.jfinal.kit.Kv;
import com.lxyer.bbs.base.entity.VisLog;
import com.lxyer.bbs.base.kit.RetCodes;
import com.lxyer.bbs.base.user.UserInfo;
import com.lxyer.bbs.base.user.UserService;
import com.lxyer.bbs.comment.CommentService;
import com.lxyer.bbs.content.ContentService;
import org.redkale.net.http.*;
import org.redkale.source.FilterExpress;
import org.redkale.source.FilterNode;
import org.redkale.util.AnyValue;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
import static com.lxyer.bbs.base.kit.RetCodes.RET_USER_UNLOGIN;
/**
* Created by Lxy at 2017/10/3 13:39.
*/
public class BaseServlet extends HttpServlet {
protected static final boolean winos = System.getProperty("os.name").contains("Window");
@Resource(name = "SERVER_ROOT")
protected File webroot;
@Resource
protected UserService userService;
@Resource
protected ContentService contentService;
@Resource
protected CommentService commentService;
@Resource
protected TaskQueue<VisLog> logQueue;
@Override
public void init(HttpContext context, AnyValue config) {
}
@Override
protected void preExecute(HttpRequest request, HttpResponse response) throws IOException {
/*if (true){
response.finish(HttpScope.refer("404.html"));
return;
}*/
String sessionid = request.getSessionid(true);
int currentid = 0;
if (sessionid != null) {
request.setCurrentUser(userService.current(sessionid));
currentid = userService.currentUserid(sessionid);
}
String uri = request.getRequestURI();
if (uri.startsWith("/res")){
File file = new File(webroot + uri);
response.finish(file);
return;
}
if (uri.endsWith(".html")){
response.finish(HttpScope.refer(uri));
return;
}
//异步记录访问日志
final int userid = currentid;
CompletableFuture.runAsync(()->{
Kv para = Kv.create();
for (String key : request.getParameterNames()){
para.set(key, request.getParameter(key));
}
Kv headers = Kv.create();
request.getHeaders().forEach((k,v)->{
headers.set(k, request.getHeader(k));
});
VisLog visLog = new VisLog();
visLog.setIp(request.getRemoteAddr());
visLog.setUri(request.getRequestURI());
visLog.setHeaders(headers);
visLog.setUserid(userid);
visLog.setPara(para);
visLog.setTime(System.currentTimeMillis());
visLog.setFtime(String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", visLog.getTime()));
try {
logQueue.put(visLog);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
response.nextEvent();
}
@Override
protected void authenticate(HttpRequest request, HttpResponse response) throws IOException {
if (request.currentUser() == null) {
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
response.finish(RetCodes.retResult(RET_USER_UNLOGIN, "未登录,登录后重试").toString());
}else {
response.finish(HttpScope.refer("/user/login.html"));
}
return;
}
response.nextEvent();
}
public int getLimit(HttpRequest request){
return request.getIntParameter("limit", 1);
}
public int getOffset(HttpRequest request){
return request.getIntParameter("offset", 10);
}
public String getPara(HttpRequest request){
String requestURI = request.getRequestURI();
String subStr = requestURI.substring(requestURI.lastIndexOf("/") + 1);
return subStr.contains("-") ? subStr.substring(0, subStr.indexOf("-")) : subStr;
}
public String getPara(HttpRequest request,int index){
String requestURI = request.getRequestURI();
String subStr = requestURI.substring(requestURI.lastIndexOf("/") + 1);
String[] paraArr = subStr.split("-");
if (index < 0){
return paraArr.length < -index ? null : paraArr[paraArr.length+index];
}else {
return paraArr.length < index+1 ? null : paraArr[index];
}
}
public <T> T getPara(HttpRequest request, int index, T defaultValue){
T para = (T)getPara(request,index);
return para == null || "".equals(para) ? defaultValue : para;
}
public int getParaToInt(HttpRequest request,int index, int defaultValue){
String para = getPara(request,index);
return para == null || "".equals(para) ? defaultValue : Integer.parseInt(para);
}
public int getParaToInt(HttpRequest request,int index){
int n = 0;
String para = getPara(request,index);
if (para == null || "".equals(para)) n = 0;
try {
n = Integer.parseInt(para);
}catch (Exception e){
}
return n;
}
//设置私密帖子过滤
protected FilterNode setPrivate(HttpRequest request,FilterNode node){
UserInfo userInfo = request.currentUser();
if (userInfo == null){
node.and("status", FilterExpress.NOTEQUAL, 30);
}else if (!userService.isAdmin(userInfo.getUserid())){
//select * from content c where c.status != -1 and (c.status!=30 or (c.status=30 and c.userid=100001))
node.and(FilterNode.create("status", FilterExpress.NOTEQUAL, 30).or(FilterNode.create("status", 30).and("userid", userInfo.getUserid())));
}
return node;
}
}

View File

@@ -0,0 +1,52 @@
package com.lxyer.bbs.base;
import com.jfinal.kit.Kv;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import com.lxyer.bbs.base.kit.EJ;
import com.lxyer.bbs.base.user.UserInfo;
import org.redkale.convert.Convert;
import org.redkale.net.http.*;
import org.redkale.util.AnyValue;
import javax.annotation.Resource;
import java.io.File;
import java.util.Map;
/**
* Created by JUECHENG at 2018/1/30 0:18.
*/
public class EnjoyRender implements HttpRender<HttpScope> {
@Resource(name = "SERVER_ROOT")
protected File webroot;
private static final Engine engine = new Engine();
@Override
public void init(HttpContext context, AnyValue config) {
engine.setBaseTemplatePath(webroot.getPath());
engine.addSharedObject("EJ", new EJ());
engine.addSharedFunction("/_t/layout.html");
}
@Override
public void renderTo(HttpRequest request, HttpResponse response, Convert convert, HttpScope scope) {
UserInfo mine = request.currentUser();//当前登录人
Template template = engine.getTemplate(scope.getReferid());
Map attr = scope.getAttributes();
if (attr == null) attr = Kv.create();
attr.put("mine", mine);
attr.put("token", request.getSessionid(false));
String str = template.renderToString(attr);
response.setContentType("text/html; charset=UTF-8");
response.finish(str);
}
@Override
public Class getType() {
return HttpScope.class;
}
}

View File

@@ -0,0 +1,41 @@
package com.lxyer.bbs.base;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestService;
import org.redkale.net.http.RestUploadFile;
import org.redkale.service.RetResult;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
/**
* Created by Lxy at 2017/10/3 13:48.
*/
@RestService(automapping = true, comment = "文件服务")
public class FileService extends BaseService {
private static final String dir = "/var/www/upload/redbbs/";
private static final String view = "http://img.1216.top/redbbs/";
private static final String format = "%1$tY%1$tm%1$td%1$tH%1$tM%1$tS";
@RestMapping(name = "upload", comment = "文件上传")
public RetResult upload(@RestUploadFile File tmpFile) throws IOException {
String name = tmpFile.getName();
String suffix = name.substring(name.lastIndexOf("."));
String path = String.format(format, System.currentTimeMillis()) + suffix;
File destFile = new File((winos ? "D:/wk/_own/redbbs/root/tem/" : dir) + path);
destFile.getParentFile().mkdir();
if (!tmpFile.renameTo(destFile)){
try{
Files.copy(tmpFile.toPath(), destFile.toPath(), StandardCopyOption.ATOMIC_MOVE);
}finally {
tmpFile.delete();//删除临时文件
}
}
RetResult result = RetResult.success();
result.setRetinfo((winos ? "/tem/": view) + path);
return result;
}
}

View File

@@ -0,0 +1,90 @@
package net.tccn.base;
import java.util.HashMap;
import java.util.Map;
/**
* Created by liangxianyou
*/
public class JBean<T> /*extends RetResult*/ {
private int retcode;
private String retinfo = "";
private T result;
private Map<String, Object> attach;
public JBean(int retcode) {
this.retcode = retcode;
}
public JBean(int retcode, String retinfo) {
this.retcode = retcode;
this.retinfo = retinfo;
}
public static JBean by(int retcode, String retinfo){
JBean jBean = new JBean(retcode, retinfo);
return jBean;
}
public static JBean by(int retcode, String retinfo, Object t){
JBean jBean = new JBean(retcode, retinfo);
jBean.setResult(t);
return jBean;
}
public JBean(T result) {
this.result = result;
}
public int getRetcode() {
return retcode;
}
public void setRetcode(int retcode) {
this.retcode = retcode;
}
public String getRetinfo() {
return retinfo;
}
public void setRetinfo(String retinfo) {
this.retinfo = retinfo;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public Map<String, Object> getAttach() {
return attach;
}
public void setAttach(Map<String, Object> attach) {
this.attach = attach;
}
public JBean attach(String key, Object object){
if (attach == null)
attach = new HashMap<>();
attach.put(key, object);
return this;
}
private static final JBean ok = new JBean(0);
public static JBean ok(){
return ok;
}
public static JBean faild(String retinfo){
return new JBean(-1, retinfo);
}
public static JBean by(Object object) {
return new JBean(object);
}
}

View File

@@ -0,0 +1,184 @@
package com.lxyer.bbs.base;
import com.lxyer.bbs.base.entity.Count;
import com.lxyer.bbs.base.entity.VisLog;
import com.lxyer.bbs.base.user.UserInfo;
import com.lxyer.bbs.base.user.UserService;
import com.lxyer.bbs.content.Content;
import com.lxyer.bbs.content.ContentInfo;
import com.lxyer.bbs.content.ContentService;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestService;
import org.redkale.source.ColumnValue;
import org.redkale.source.FilterExpress;
import org.redkale.source.FilterNode;
import org.redkale.source.Flipper;
import org.redkale.util.Comment;
import org.redkale.util.Sheet;
import org.redkale.util.Utility;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.function.Function;
/**
* Created by liangxianyou at 2018/6/20 22:54.
*/
@RestService(name = "xxx",automapping = true, comment = "日志记录")
public class TaskQueue<T extends Object> extends BaseService implements Runnable {
@Resource
private ContentService contentService;
@Resource
private UserService userService;
protected static LinkedBlockingQueue queue = new LinkedBlockingQueue();
public TaskQueue() {
new Thread(this).start();
}
@RestMapping(ignore = true)
public T take() throws InterruptedException {
return (T) queue.take();
}
@RestMapping(ignore = true)
public void put(T t) throws InterruptedException {
queue.put(t);
}
@Override
@RestMapping(ignore = true, comment = "独立线程,用户访问行为记录到数据库")
public void run() {
do {
try {
T task = take();
//记录访问日志,如果是访问的文章详情:对文章访问数量更新
if (task instanceof VisLog) {
//System.out.println(task);
ArangoService.save(task).thenAcceptAsync((_task) -> {
VisLog visLog = (VisLog) _task;
//[访问量]
String uri = visLog.getUri();
if (uri != null && uri.startsWith("/jie/detail/")){
updateViewNum(visLog);
}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (true);
}
@Comment("帖子阅读数处理")
private void updateViewNum(VisLog visLog) {
String aql = String.format("for d in vis_log_dev\n" +
" filter d.uri == '%s' and d.ip == '%s' and (d.userid == %s or d.userid==0)\n" +
" collect WITH COUNT INTO total\n" +
" return total", visLog.getUri(), visLog.getIp(), visLog.getUserid());
long total = ArangoService.findInt(aql);
if (total <= 1) {
String uri = visLog.getUri();
int contentid = Integer.parseInt(uri.replace("/jie/detail/", ""));
source.updateColumn(Content.class, contentid, ColumnValue.inc("viewnum", 1));
}
}
@RestMapping(ignore = true, comment = "访问热帖数据")
public Sheet<ContentInfo> hotView(String sessionid){
int limit = 8;
String cacheKey = "hotView";
Object ids = cacheSource.get(cacheKey);
if (isEmpty.test(ids)){
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, -7);
Map para = new HashMap();
para.put("time", cal.getTimeInMillis());
//查询一周某热帖记录
List<Count> hotArticle = ArangoService.find(
"for d in " + (isDev ? "vis_log_dev" : "vis_log") + "\n" +
" filter d.uri =~ '^/jie/detail/[0-9]+$' and d.userid != 100001 and d.time > @time\n" +
" COLLECT uri=d.uri WITH COUNT INTO total\n" +
" sort total desc\n" +
" limit 10\n" +
" return {name: uri,total:total}",
Utility.ofMap("time", cal.getTimeInMillis()),
Count.class);
Function<List<Count>, List<Integer>> deal = (counts) -> {
List<Integer> _ids = new ArrayList<>();
counts.forEach(x -> {
_ids.add(Integer.parseInt(x.getName().replace("/jie/detail/", "")));
});
return _ids;
};
ids = deal.apply(hotArticle);
cacheSource.set(30 * 60, cacheKey, ids);
}
int[] contentids = new int[((List<Integer>) ids).size()];
for (int i = 0; i < ((List<Integer>) ids).size(); i++) {
contentids[i] = ((List<Integer>) ids).get(i);
}
Flipper flipper = new Flipper().limit(limit);
FilterNode node = FilterNode.create("contentid", FilterExpress.IN, contentids).and("status", FilterExpress.NOTEQUAL, -10);
//权限过滤
UserInfo userInfo = userService.current(sessionid);
if (userInfo == null){ //访客
node.and("status", FilterExpress.NOTEQUAL, 30);
}else if (!userService.isAdmin(userInfo.getUserid())){ //非管理员
node.and(FilterNode.create("status", FilterExpress.NOTEQUAL, 30).or(FilterNode.create("status", 30).and("userid", userInfo.getUserid())));
}
return contentService.contentQuery(flipper, node);
}
/**
* TODO:帖子访客记录 --待完成
*/
@RestMapping(ignore = true, comment = "帖子访客记录")
public Sheet<Map> readRecordAsync(Flipper flipper ,int contentid){
/*Bson filter = eq("uri", "/jie/detail/"+ contentid);
FindIterable<Document> documents = visLog.find(filter).limit(flipper.getLimit()).skip(flipper.getOffset());
long total = visLog.countDocuments(filter);
List<Map> rows = new ArrayList<>();
List<Integer> uids = new ArrayList<>();
documents.forEach((Consumer<? super Document>) x->{
Integer userid = x.getInteger("userid");
if (userid > 0) uids.add(userid);
Map row = new HashMap<String, Object>();
row.put("userid", userid);
row.put("ip", x.getString("ip"));
});
int[] userids = LxyKit.listToArray(uids, new int[uids.size()]);
List<UserRecord> records = source.queryList(UserRecord.class, FilterNode.create("userid", FilterExpress.IN, userids));
rows.forEach(x->{
UserRecord record = records.stream().filter(y -> (Integer) x.get("userid") == y.getUserid()).findFirst().orElse(new UserRecord());
x.put("nickname", record.getRealname());
x.put("avatar", record.getAvatar());
});
Sheet<Map> sheet = new Sheet<>();
sheet.setTotal(total);
sheet.setRows(rows);
return sheet;*/
return null;
}
}

View File

@@ -0,0 +1,12 @@
package com.lxyer.bbs.base;
import com.lxyer.bbs.base.iface.UI;
/**
* user foreign key (userId)
* Created by liangxianyou at 2018/6/9 14:50.
*/
public interface UF<I extends UI> {
int getUserid();
I createInfo();
}

View File

@@ -0,0 +1,96 @@
package com.lxyer.bbs.base.bean;
import org.redkale.convert.json.JsonConvert;
import org.redkale.source.FilterBean;
import javax.persistence.Column;
import java.io.Serializable;
/**
*
* @author lxyer
*/
public class ActLogBean implements Serializable, FilterBean {
@Column(comment = "[日志id]")
private int logid;
@Column(comment = "[日志类型]")
private int cate;
@Column(comment = "[目标数据id]")
private int tid;
@Column(comment = "[用户id]")
private int userId;
@Column(comment = "[创建时间]")
private long createTime;
@Column(length = 128, comment = "[说明]")
private String remark = "";
@Column(comment = "[状态]-1删除 1正常")
private int status = 1;
public void setLogid(int logid) {
this.logid = logid;
}
public int getLogid() {
return this.logid;
}
public void setCate(int cate) {
this.cate = cate;
}
public int getCate() {
return this.cate;
}
public void setTid(int tid) {
this.tid = tid;
}
public int getTid() {
return this.tid;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getCreateTime() {
return this.createTime;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getRemark() {
return this.remark;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,110 @@
package com.lxyer.bbs.base.entity;
import javax.persistence.*;
import org.redkale.convert.json.*;
import java.util.Date;
/**
*
* @author lxyer
*/
@Cacheable(interval = 5*60)
@Table(catalog = "redbbs", name = "sys_actlog")
public class ActLog implements java.io.Serializable {
@Id
@GeneratedValue
@Column(comment = "[日志id]")
private int logid;
@Column(comment = "[日志类型]10赞20收藏30阅读")
private short cate;
@Column(comment = "[目标数据id]")
private int tid;
@Column(comment = "[用户id]")
private int userid;
@Column(updatable = false, comment = "[创建时间]")
private long createtime;
@Column(length = 128, comment = "[说明]")
private String remark = "";
@Column(comment = "[状态]-1删除 1正常")
private short status = 10;
public void setLogid(int logid) {
this.logid = logid;
}
public int getLogid() {
return this.logid;
}
public void setCate(short cate) {
this.cate = cate;
}
public short getCate() {
return this.cate;
}
public void setTid(int tid) {
this.tid = tid;
}
public int getTid() {
return this.tid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public int getUserid() {
return this.userid;
}
public void setCreatetime(long createtime) {
this.createtime = createtime;
}
public long getCreatetime() {
return this.createtime;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getRemark() {
return this.remark;
}
public void setStatus(short status) {
this.status = status;
}
public short getStatus() {
return this.status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
//----
public ActLog() {
}
public ActLog(int cate, int tid, int userid) {
this.cate = (short) cate;
this.tid = tid;
this.userid = userid;
}
}

View File

@@ -0,0 +1,37 @@
package com.lxyer.bbs.base.entity;
/**
* 用来计数用
*
* @author: liangxianyou at 2018/11/18 20:42.
*/
public class Count {
private String name;
private long total;
//-------------------
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
@Override
public String toString() {
return "Count{" +
"name='" + name + '\'' +
", total=" + total +
'}';
}
}

View File

@@ -0,0 +1,67 @@
package com.lxyer.bbs.base.entity;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
* @author lxyer
*/
@Cacheable(interval = 5*60)
@Table(catalog = "redbbs", name = "sys_dynattr", comment = "[动态属性表]")
public class DynAttr implements java.io.Serializable {
@Id
@Column(comment = "[目标数据id]")
private int tid;
@Column(comment = "[类型]1文章, 2xx, 3...,")
private short cate;
@Column(length = 32, comment = "")
private String attr = "";
@Column(comment = "[属性值]")
private String value = "";
public void setTid(int tid) {
this.tid = tid;
}
public int getTid() {
return this.tid;
}
public void setCate(short cate) {
this.cate = cate;
}
public short getCate() {
return this.cate;
}
public void setAttr(String attr) {
this.attr = attr;
}
public String getAttr() {
return this.attr;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,81 @@
package com.lxyer.bbs.base.entity;
import org.redkale.convert.json.JsonConvert;
import java.util.Map;
/**
* 存贮数据到 非关系型数据库
*
* @author: liangxianyou at 2018/11/18 8:47.
*/
public class VisLog {
private String ip;
private int userid;
private String ftime;
private String uri;
private long time;
private Map para;
private Map headers;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getFtime() {
return ftime;
}
public void setFtime(String ftime) {
this.ftime = ftime;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public Map getPara() {
return para;
}
public void setPara(Map para) {
this.para = para;
}
public Map getHeaders() {
return headers;
}
public void setHeaders(Map headers) {
this.headers = headers;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,9 @@
package com.lxyer.bbs.base.iface;
/**
* 创建信息
* Created by liangxianyou at 2018/6/16 17:43.
*/
public interface C<I extends CI> {
I createInfo();
}

View File

@@ -0,0 +1,7 @@
package com.lxyer.bbs.base.iface;
/**
* Created by liangxianyou at 2018/6/16 18:39.
*/
public interface CI<I extends CI> {
}

View File

@@ -0,0 +1,32 @@
package com.lxyer.bbs.base.iface;
import org.redkale.net.http.RestMapping;
import org.redkale.util.Sheet;
import java.util.ArrayList;
import java.util.List;
/**
* Created by liangxianyou at 2018/6/16 17:56.
*/
public interface CService<I extends UI> {
@RestMapping(ignore = true)
default <A extends C> Sheet<I> createInfo(Sheet<A> fSheet){
Sheet<I> sheet = new Sheet<>();
if (fSheet == null || fSheet.getTotal() < 1){
sheet.setTotal(0);
sheet.setRows(new ArrayList<>());
}else {
int total = (int)fSheet.getTotal();
List<I> rows = new ArrayList<>(total);
fSheet.forEach(x->rows.add((I)x.createInfo()));
sheet.setTotal(total);
sheet.setRows(rows);
}
return sheet;
}
}

View File

@@ -0,0 +1,31 @@
package com.lxyer.bbs.base.iface;
import com.lxyer.bbs.base.user.UserRecord;
/**
* Created by liangxianyou at 2018/6/9 13:45.
*/
public interface UI<I extends UI> {
//抽象方法
int getUserid();
UserRecord getUser();
I setUser(UserRecord user);
//默认实现方法
default String getRealname(){
return getUser() == null ? null : getUser().getRealname();
}
default String getNickname(){
return getUser() == null ? null : getUser().getNickname();
}
default String getSite(){
return getUser() == null ? "" : getUser().getSite();
}
default String getGit(){
return getUser() == null ? "" : getUser().getGit();
}
default String getAvatar(){
return getUser() == null ? null : getUser().getAvatar();
}
}

View File

@@ -0,0 +1,38 @@
package com.lxyer.bbs.base.iface;
import com.lxyer.bbs.base.user.UserRecord;
import org.redkale.net.http.RestMapping;
import org.redkale.source.DataSource;
import org.redkale.source.FilterExpress;
import org.redkale.source.FilterNode;
import org.redkale.util.Sheet;
import java.util.List;
/**
* Created by liangxianyou at 2018/6/16 18:25.
*/
public interface UIService<I extends UI> extends CService<I> {
DataSource getSource();
@RestMapping(ignore = true)
default Sheet<I> setIUser(Sheet<I> sheet){
int[] userids = sheet.stream().mapToInt(I::getUserid).toArray();
List<UserRecord> users = getSource().queryList(UserRecord.class, FilterNode.create("userid", FilterExpress.IN, userids));
sheet.forEach(x->{
UserRecord user = users.stream().filter(u -> u.getUserid() == x.getUserid()).findAny().orElse(null);
x.setUser(user);
});
return sheet;
}
@RestMapping(ignore = true)
default I setIUser(I i){
UserRecord user = getSource().find(UserRecord.class, i.getUserid());
return (I) i.setUser(user);
}
}

View File

@@ -0,0 +1,22 @@
package com.lxyer.bbs.base.kit;
import org.redkale.net.http.RestService;
import java.text.SimpleDateFormat;
/**
* enjoy模板引擎使用共享方法类
* 更多关于enjoy的共享方法请查阅jfinal使用文档
* Created by Lxy at 2017/11/26 17:19.
*/
@RestService
public class EJ {
public String date(long time){
return date(time, "yyyy-MM-dd HH:mm:ss");
}
public String date(long time, String pattern){
return new SimpleDateFormat(pattern).format(time);
}
}

View File

@@ -0,0 +1,70 @@
package com.lxyer.bbs.base.kit;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by Lxy at 2017/11/29 15:17.
*/
public final class LxyKit {
public static String dateFmt(long time){
/**
* 刚刚 60秒内 60 * 1000
* x分钟前 1小时候内 60 * 60*1000
* x小时前 1天内 24 * 60*60*1000
* x天前 1周内 7 * 24*60*60*1000
* 年-月-日 1周前
*/
long now = System.currentTimeMillis();
long diff = now - time;
if (diff < 60 * 1000)
return "刚刚";
else if (diff < 60 * 60 *1000)
return Math.floorDiv(diff, 60 *1000) + "分钟前";
else if (diff < 24 * 60*60*1000)
return Math.floorDiv(diff, 60 *60*1000) + "小时前";
else if (diff > 24 * 60*60*1000 && diff < 7 * 24*60*60*1000)
return Math.floorDiv(diff, 24 * 60*60*1000) + "天前";
else
return new SimpleDateFormat("yyyy-MM-dd").format(time);
}
public static String delHTMLTag(String htmlStr){
String regEx_script="<script[^>]*?>[\\s\\S]*?<\\/script>"; //定义script的正则表达式
String regEx_style="<style[^>]*?>[\\s\\S]*?<\\/style>"; //定义style的正则表达式
String regEx_html="<[^>]+>"; //定义HTML标签的正则表达式
Pattern p_script=Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);
Matcher m_script=p_script.matcher(htmlStr);
htmlStr=m_script.replaceAll(""); //过滤script标签
Pattern p_style=Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE);
Matcher m_style=p_style.matcher(htmlStr);
htmlStr=m_style.replaceAll(""); //过滤style标签
Pattern p_html=Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE);
Matcher m_html=p_html.matcher(htmlStr);
htmlStr=m_html.replaceAll(""); //过滤html标签
return htmlStr.trim(); //返回文本字符串
}
public static <T> T[] listToArray(List list, T[] ts){
for (int i = 0; i < list.size(); i++) {
ts[0] = (T) list.get(i);
}
return ts;
}
public static int[] listToArray(List list, int[] ts){
for (int i = 0; i < list.size(); i++) {
ts[0] = (int) list.get(i);
}
return ts;
}
}

View File

@@ -0,0 +1,66 @@
package com.lxyer.bbs.base.kit;
import org.redkale.service.RetLabel;
import org.redkale.service.RetResult;
/**
* Created by Lxy at 2017/10/1 11:21.
*/
public abstract class RetCodes {
@RetLabel("参数无效")
public static final int RET_PARAMS_ILLEGAL = 3001_0001;
//------------------------------------- 用户模块 -----------------------------------------
@RetLabel("未登陆")
public static final int RET_USER_UNLOGIN = 3002_0001;
@RetLabel("用户或密码错误")
public static final int RET_USER_ACCOUNT_PWD_ILLEGAL = 3002_0002;
@RetLabel("用户权限不够")
public static final int RET_USER_AUTH_ILLEGAL = 3002_0003;
@RetLabel("密码设置无效")
public static final int RET_USER_PASSWORD_ILLEGAL = 3002_0004;
@RetLabel("用户不存在")
public static final int RET_USER_NOTEXISTS = 3002_0005;
@RetLabel("用户名已存在")
public static final int RET_USER_USERNAME_EXISTS = 3002_0006;
@RetLabel("用户名无效")
public static final int RET_USER_USERNAME_ILLEGAL = 3002_0007;
@RetLabel("邮箱已存在")
public static final int RET_USER_EMAIL_EXISTS = 3002_0008;
@RetLabel("邮箱无效")
public static final int RET_USER_EMAIL_ILLEGAL = 3002_0009;
@RetLabel("昵称无效")
public static final int RET_USER_NICKNAME_ILLEGAL = 3002_0010;
@RetLabel("昵称已存在")
public static final int RET_USER_NICKNAME_EXISTS = 3002_0011;
//------------------------------------- 内容模块 -----------------------------------------
//------------------------------------- 评论模块 -----------------------------------------
@RetLabel("评论内容无效")
public static final int RET_COMMENT_CONTENT_ILLEGAL = 3004_0001;
@RetLabel("评论参数无效")
public static final int RET_COMMENT_PARA_ILLEGAL = 3004_0002;
public static RetResult retResult(int retcode) {
return new RetResult(retcode);
}
public static RetResult retResult(int retcode, String retinfo) {
return new RetResult(retcode, retinfo);
}
}

View File

@@ -0,0 +1,48 @@
package com.lxyer.bbs.base.user;
import org.redkale.net.http.RestSessionid;
import org.redkale.source.FilterBean;
import org.redkale.util.Comment;
import javax.persistence.Transient;
/**
* Created by Lxy at 2017/10/1 10:40.
*/
public class LoginBean implements FilterBean {
private String username;
private String password;
@Transient
@Comment("会话SESSIONID")
@RestSessionid(create = true)
private String sessionid = "";
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return UserRecord.md5IfNeed(password);
}
public void setPassword(String password) {
this.password = password;
}
public String getSessionid() {
return sessionid;
}
public void setSessionid(String sessionid) {
this.sessionid = sessionid;
}
public boolean emptyUsername() {
return username == null || username.isEmpty();
}
}

View File

@@ -0,0 +1,67 @@
package com.lxyer.bbs.base.user;
import org.redkale.source.FilterBean;
import javax.persistence.Column;
/**
* Created by Lxy at 2017/10/10 8:30.
*/
public class UserBean implements FilterBean {
@Column(length = 32, comment = "[登录名]")
private String username;
@Column(length = 32, comment = "[电话号码]")
private String phone;
@Column(length = 64, comment = "[昵称]")
private String nickname;
@Column(length = 32, comment = "[真实姓名]")
private String realname;
@Column(length = 32, comment = "[邮箱]")
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

View File

@@ -0,0 +1,189 @@
package com.lxyer.bbs.base.user;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.ConvertType;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.Column;
import javax.persistence.Id;
/**
*
* @author lxyer
*/
public class UserInfo implements java.io.Serializable {
@Id
@Column(comment = "[用户id]")
private int userid;
private String username = "";
private int sex = 1;
private String password = "";
private String phone = "";
private String nickname = "";
private String avatar = "";
private String relaname = "";
private String email = "";
private int roleid = 0;
private String site = "";
private String git = "";
private long createtime;
private String sign = "";
private String city = "";
private int status = 1;
private String time = "";
public void setUserid(int userid) {
this.userid = userid;
}
public int getUserid() {
return this.userid;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return this.username;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@ConvertColumn(ignore = true,type = ConvertType.JSON)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone() {
return this.phone;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getNickname() {
return this.nickname;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getAvatar() {
return this.avatar;
}
public void setRelaname(String relaname) {
this.relaname = relaname;
}
public String getRelaname() {
return this.relaname;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return this.email == null || this.email.isEmpty() ? "" : this.email;
}
public int getRoleid() {
return roleid;
}
public void setRoleid(int roleid) {
this.roleid = roleid;
}
public String getSite() {
return site;
}
public void setSite(String site) {
this.site = site;
}
public String getGit() {
return git;
}
public void setGit(String git) {
this.git = git;
}
public void setCreatetime(long createtime) {
this.createtime = createtime;
}
public long getCreatetime() {
return this.createtime;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
/**
* 检查用户权限
* @param moduleid
* @param actionid
* @return
*/
public boolean checkAuth(int moduleid, int actionid) {
return !(moduleid == 2 && actionid == 1);
}
}

View File

@@ -0,0 +1,231 @@
package com.lxyer.bbs.base.user;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.Utility;
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
* @author lxyer
*/
@Cacheable(interval = 5*60)
@Table(catalog = "redbbs", name = "sys_userrecord")
public class UserRecord implements java.io.Serializable {
@Id
@Column(comment = "[用户id]")
private int userid;
@Column(length = 32, comment = "[登录名]")
private String username = "";
@Column(length = 64, comment = "[密码]")
private String password = "";
@Column(comment = "[性别]默认 10男20女")
private short sex;
@Column(length = 32, comment = "[电话号码]")
private String phone = "";
@Column(length = 64, comment = "[昵称]")
private String nickname = "";
@Column(length = 128, comment = "[头像地址]")
private String avatar = "";
@Column(length = 32, comment = "[真实姓名]")
private String realname = "";
@Column(length = 32, comment = "[邮箱]")
private String email = "";
@Column(comment = "")
private int roleid;
@Column(length = 128, comment = "[个人博客地址]")
private String site = "";
@Column(length = 128, comment = "[码云/GitHub]")
private String git = "";
@Column(updatable = false, comment = "[创建时间]")
private long createtime;
@Column(length = 256, comment = "[签名]")
private String sign = "";
@Column(length = 64, comment = "[所在城市]")
private String city = "";
@Column(comment = "[状态]-10删除 10正常")
private short status = 10;
public void setUserid(int userid) {
this.userid = userid;
}
public int getUserid() {
return this.userid;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return this.username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return this.password;
}
public void setSex(short sex) {
this.sex = sex;
}
public short getSex() {
return this.sex;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone() {
return this.phone;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getNickname() {
return this.nickname;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getAvatar() {
return this.avatar;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getRealname() {
return this.realname;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return this.email;
}
public void setRoleid(int roleid) {
this.roleid = roleid;
}
public int getRoleid() {
return this.roleid;
}
public void setSite(String site) {
this.site = site;
}
public String getSite() {
return this.site;
}
public void setGit(String git) {
this.git = git;
}
public String getGit() {
return this.git;
}
public void setCreatetime(long createtime) {
this.createtime = createtime;
}
public long getCreatetime() {
return this.createtime;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getSign() {
return this.sign;
}
public void setCity(String city) {
this.city = city;
}
public String getCity() {
return this.city;
}
public void setStatus(short status) {
this.status = status;
}
public short getStatus() {
return this.status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
//------
public UserInfo createUserInfo() {
UserInfo userInfo = new UserInfo();
userInfo.setUserid(userid);
userInfo.setUsername(username);
userInfo.setSex(sex);
userInfo.setPassword(password);
userInfo.setPhone(phone);
userInfo.setNickname(nickname);
userInfo.setAvatar(avatar);
userInfo.setRelaname(realname);
userInfo.setEmail(email);
userInfo.setRoleid(roleid);
userInfo.setSite(site);
userInfo.setGit(git);
userInfo.setCreatetime(createtime);
userInfo.setSign(sign);
userInfo.setCity(city);
userInfo.setStatus(getStatus());
return userInfo;
}
public String passwordForMd5(){
return md5IfNeed(password);
}
public static String md5IfNeed(String password){
return Utility.md5Hex(password);
}
}

View File

@@ -0,0 +1,179 @@
package com.lxyer.bbs.base.user;
import com.jfinal.kit.Kv;
import com.lxyer.bbs.base.BaseService;
import com.lxyer.bbs.base.kit.LxyKit;
import com.lxyer.bbs.base.kit.RetCodes;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestParam;
import org.redkale.net.http.RestService;
import org.redkale.net.http.RestSessionid;
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.SelectColumn;
import org.redkale.util.Sheet;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import static com.lxyer.bbs.base.kit.RetCodes.*;
/**
* Created by Lxy at 2017/10/3 14:02.
*/
@RestService(automapping = true, comment = "用户服务")
public class UserService extends BaseService {
@RestMapping(auth = false, comment = "登录校验")
public RetResult<UserInfo> login(@RestParam(name = "bean") LoginBean loginBean){
if (loginBean == null || loginBean.emptyUsername()) return RetCodes.retResult(RetCodes.RET_PARAMS_ILLEGAL, "参数错误");
final RetResult retResult = new RetResult();
UserRecord user = source.find(UserRecord.class, "username", loginBean.getUsername());
if (user == null || !Objects.equals(user.getPassword(), loginBean.getPassword())){
//log(null, 0, "用户或密码错误");
return RetCodes.retResult(RetCodes.RET_USER_ACCOUNT_PWD_ILLEGAL, "用户名或密码错误");
}
sessions.setAsync(sessionExpireSeconds, loginBean.getSessionid(), (long)user.getUserid());
retResult.setRetcode(0);
retResult.setResult(Kv.by("token", loginBean.getSessionid()));
retResult.setRetinfo("登录成功.");
return retResult;
}
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();
}
return userid == 0 ? null : findUserInfo((int)userid);
}
@RestMapping(name = "info", comment = "用户信息")
public UserInfo findUserInfo(int userid) {
UserRecord user = source.find(UserRecord.class, userid);
return user == null ? null : user.createUserInfo();
}
@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<UserRecord> queryUser(Flipper flipper, @RestParam(name = "bean", comment = "过滤条件") final UserBean userBean){
Sheet<UserRecord> users = source.querySheet(UserRecord.class, flipper, userBean);
return users;
}
@RestMapping(name = "changepwd", comment = "修改密码")
public RetResult updatePwd(@RestSessionid String sessionid, String pass, String nowpass){
UserInfo userInfo = current(sessionid);//不会为空
if (!Objects.equals(userInfo.getPassword(), UserRecord.md5IfNeed(nowpass)))
return RetCodes.retResult(RET_USER_ACCOUNT_PWD_ILLEGAL, "密码错误");
if (pass == null || pass.length() < 6 || Objects.equals(pass, nowpass))
return RetCodes.retResult(RET_USER_PASSWORD_ILLEGAL, "密码设置无效");
source.updateColumn(UserRecord.class, userInfo.getUserid(), "password", UserRecord.md5IfNeed(pass));
return RetResult.success();
}
@RestMapping(name = "register", auth = false, comment = "用户注册")
public RetResult register(@RestParam(name = "bean") UserRecord user){
/*用户名、密码、邮箱*/
if (user.getEmail() == null) return RetCodes.retResult(RET_USER_EMAIL_ILLEGAL, "邮件地址无效");
if (user.getPassword() == null || user.getPassword().length() < 6) return RetCodes.retResult(RET_USER_PASSWORD_ILLEGAL, "密码设置无效");
UserRecord _user = source.find(UserRecord.class, FilterNode.create("email", user.getEmail()));
if (_user != null) return RetCodes.retResult(RET_USER_USERNAME_EXISTS, "用户名已存在");
user.setCreatetime(System.currentTimeMillis());
user.setPassword(user.passwordForMd5());
user.setStatus((short) 10);
user.setUsername(user.getEmail());
user.setAvatar("/res/images/avatar/"+ new Random().nextInt(21) +".jpg");//默认头像
int maxId = source.getNumberResult(UserRecord.class, FilterFunc.MAX, 10_0000, "userid").intValue();
if (maxId < 10_0000) maxId = 10_0000;
user.setUserid(maxId+1);
source.insert(user);
//记录日志
return RetResult.success();
}
@RestMapping(name = "update", comment = "用户信息修改")
public RetResult userUpdate(@RestSessionid String sessionid, @RestParam(name = "bean") UserRecord user, String[] columns){
String nickname = user.getNickname();
if (nickname == null && nickname.isEmpty())
return RetCodes.retResult(RET_USER_NICKNAME_ILLEGAL, "昵称无效");
nickname = nickname.replace(" ", "");
UserRecord _user = source.find(UserRecord.class, FilterNode.create("nickname", nickname));
if (_user != null && _user.getUserid() != currentUserid(sessionid))
return RetCodes.retResult(RET_USER_NICKNAME_EXISTS, "昵称已存在");
user.setNickname(nickname);//去除昵称中的空格
source.updateColumn(user
,FilterNode.create("userid", currentUserid(sessionid))
,SelectColumn.includes(columns)
);
return RetResult.success();
}
//最新加入
public Sheet<UserInfo> lastReg(){
Sheet<UserRecord> users = source.querySheet(UserRecord.class
, SelectColumn.includes("userid", "nickname", "avatar", "createtime")
, new Flipper().sort("createtime DESC").limit(8)
, FilterNode.create("status", 10));
Sheet<UserInfo> infos = new Sheet<>();
ArrayList<UserInfo> list = new ArrayList<>();
users.forEach(x->{
UserInfo info = x.createUserInfo();
info.setTime(LxyKit.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 source.getNumberResult(UserRecord.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 = source.queryColumnList("userid", UserRecord.class, FilterNode.create("roleid", 1));
for (Integer x : userIds) {
if (userid == x) {
return true;
}
}
return false;
}
}