diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4bb0477 --- /dev/null +++ b/pom.xml @@ -0,0 +1,83 @@ + + + + 4.0.0 + war + + jfly + com.lxyer + jfly + 1.0-SNAPSHOT + + + + com.jfinal + jfinal + 3.3 + + + + mysql + mysql-connector-java + 6.0.6 + + + + com.zaxxer + HikariCP + 2.7.4 + + + + + net.sf.ehcache + ehcache-core + 2.6.11 + + + + + redis.clients + jedis + 2.9.0 + + + de.ruedigermoeller + fst + 2.48 + + + org.javassist + javassist + + + com.cedarsoftware + java-util + + + + + + javax.servlet + servlet-api + 3.0-alpha-1 + provided + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + diff --git a/src/main/java/com/lxyer/config/DbMap.java b/src/main/java/com/lxyer/config/DbMap.java new file mode 100644 index 0000000..0e457a4 --- /dev/null +++ b/src/main/java/com/lxyer/config/DbMap.java @@ -0,0 +1,45 @@ +package com.lxyer.config; + +import com.jfinal.kit.PathKit; +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +import com.lxyer.model.*; + +import java.io.File; + +/** + * Generated by JFinal, do not modify this file. + *
+ * Example:
+ * public void configPlugin(Plugins me) {
+ *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
+ *     DbMap.mapping(arp);
+ *     me.add(arp);
+ * }
+ * 
+ */ +public class DbMap { + + public static void mapping(ActiveRecordPlugin arp) { + arp.addMapping("act_log", "logid", ActLog.class); + arp.addMapping("comment", "commentId", Comment.class); + arp.addMapping("content", "contentId", Content.class); + arp.addMapping("content_item", "itemId", ContentItem.class); + // Composite Primary Key order: tid,cate,attr + arp.addMapping("dyna_attr", "tid,cate,attr", DynaAttr.class); + arp.addMapping("user", "userId", User.class); + } + + public static void addSqlTemplate(ActiveRecordPlugin arp) { + String baseSqlTemplatePath = PathKit.getWebRootPath() + "/WEB-INF/classes/sql/"; + arp.setBaseSqlTemplatePath(baseSqlTemplatePath); + + File sqlFiles = new File(baseSqlTemplatePath); + File[] files = sqlFiles.listFiles(); + for (File f : files){ + if (f.isFile() || f.getName().endsWith(".sql")){ + arp.addSqlTemplate(f.getName()); + } + } + } +} + diff --git a/src/main/java/com/lxyer/config/E.java b/src/main/java/com/lxyer/config/E.java new file mode 100644 index 0000000..34ee4fe --- /dev/null +++ b/src/main/java/com/lxyer/config/E.java @@ -0,0 +1,37 @@ +package com.lxyer.config; + +/** + * Created by Lxyer at 2017/9/10 15:35. + */ +public class E { + + public enum DynamicAttr { + //table,id_k,gk, cate + NEWS("dyna_attr", "contentId", "tid", 1), + PRODUCTION("dyna_attr", "contentId", "tid", 2), + USER("dyna_attr", "userId", "tid", 3) + ; + private String table; + private String id_k; + private String gk; + private int cate; + DynamicAttr(String table, String id_k, String gk, int cate) { + this.table = table; + this.id_k = id_k; + this.gk = gk; + this.cate = cate; + } + public String table(){ + return this.table; + } + public String id_k(){ + return this.id_k; + } + public String gk(){ + return this.gk; + } + public int getCate() { + return cate; + } + } +} diff --git a/src/main/java/com/lxyer/config/F.java b/src/main/java/com/lxyer/config/F.java new file mode 100644 index 0000000..c2f0df5 --- /dev/null +++ b/src/main/java/com/lxyer/config/F.java @@ -0,0 +1,35 @@ +package com.lxyer.config; + +/** + * Created by JUECHENG at 2018/1/7 14:35. + */ +public class F { + public enum DynamicAttr { + //table,id_k,gk, cate + NEWS("dyna_attr", "contentId", "tid", 1), + USER("dyna_attr", "userId", "tid", 2) + ; + private String table; + private String id_k; + private String gk; + private int cate; + DynamicAttr(String table, String id_k, String gk, int cate) { + this.table = table; + this.id_k = id_k; + this.gk = gk; + this.cate = cate; + } + public String table(){ + return this.table; + } + public String id_k(){ + return this.id_k; + } + public String gk(){ + return this.gk; + } + public int getCate() { + return cate; + } + } +} diff --git a/src/main/java/com/lxyer/config/FlyConfig.java b/src/main/java/com/lxyer/config/FlyConfig.java new file mode 100644 index 0000000..9b43e6b --- /dev/null +++ b/src/main/java/com/lxyer/config/FlyConfig.java @@ -0,0 +1,66 @@ +package com.lxyer.config; + +import com.jfinal.config.*; +import com.jfinal.kit.PathKit; +import com.jfinal.kit.PropKit; +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +import com.jfinal.plugin.ehcache.EhCachePlugin; +import com.jfinal.plugin.hikaricp.HikariCpPlugin; +import com.jfinal.plugin.redis.RedisPlugin; +import com.jfinal.template.Engine; +import com.lxyer.config.handler.UrlHandler; +import com.lxyer.config.interceptor.LoginInterceptor; +import com.lxyer.config.route.AdminRoute; +import com.lxyer.config.route.SiteRoute; + +/** + * Created by Lxyer at 2018/01/07 + */ +public class FlyConfig extends JFinalConfig { + + @Override + public void configConstant(Constants me) { + me.setDevMode(true); + PropKit.use("config.properties"); + } + + @Override + public void configRoute(Routes me) { + me.add(new AdminRoute()); + me.add(new SiteRoute()); + } + + @Override + public void configEngine(Engine me) { + Engine.setMainEngine(me); + me.setBaseTemplatePath(PathKit.getWebRootPath()); + + me.addSharedFunction("/WEB-INF/_t/layout.html"); + } + + @Override + public void configPlugin(Plugins me) { + loadPropertyFile("config.properties"); + + HikariCpPlugin hikariPlguin = new HikariCpPlugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"), "com.mysql.cj.jdbc.Driver"); + ActiveRecordPlugin arp = new ActiveRecordPlugin(hikariPlguin); + me.add(hikariPlguin); + me.add(arp); + + DbMap.mapping(arp); + DbMap.addSqlTemplate(arp); + + me.add(new RedisPlugin(getProperty("redis.cache_name"), getProperty("redis.host"), getPropertyToInt("redis.port"), getPropertyToInt("redis.timeout"))); + me.add(new EhCachePlugin()); + } + + @Override + public void configInterceptor(Interceptors me) { + me.add(new LoginInterceptor()); + } + + @Override + public void configHandler(Handlers me) { + me.add(new UrlHandler()); + } +} diff --git a/src/main/java/com/lxyer/config/handler/UrlHandler.java b/src/main/java/com/lxyer/config/handler/UrlHandler.java new file mode 100644 index 0000000..0521175 --- /dev/null +++ b/src/main/java/com/lxyer/config/handler/UrlHandler.java @@ -0,0 +1,17 @@ +package com.lxyer.config.handler; + +import com.jfinal.handler.Handler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created by JUECHENG at 2018/1/7 11:20. + */ +public class UrlHandler extends Handler { + @Override + public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { + + next.handle(target, request, response, isHandled); + } +} diff --git a/src/main/java/com/lxyer/config/interceptor/LoginInterceptor.java b/src/main/java/com/lxyer/config/interceptor/LoginInterceptor.java new file mode 100644 index 0000000..1948119 --- /dev/null +++ b/src/main/java/com/lxyer/config/interceptor/LoginInterceptor.java @@ -0,0 +1,14 @@ +package com.lxyer.config.interceptor; + +import com.jfinal.aop.Interceptor; +import com.jfinal.aop.Invocation; + +/** + * Created by JUECHENG at 2018/1/7 11:22. + */ +public class LoginInterceptor implements Interceptor { + @Override + public void intercept(Invocation inv) { + inv.invoke(); + } +} diff --git a/src/main/java/com/lxyer/config/route/AdminRoute.java b/src/main/java/com/lxyer/config/route/AdminRoute.java new file mode 100644 index 0000000..5e25fc4 --- /dev/null +++ b/src/main/java/com/lxyer/config/route/AdminRoute.java @@ -0,0 +1,13 @@ +package com.lxyer.config.route; + +import com.jfinal.config.Routes; + +/** + * Created by JUECHENG at 2018/1/7 11:19. + */ +public class AdminRoute extends Routes { + @Override + public void config() { + + } +} diff --git a/src/main/java/com/lxyer/config/route/SiteRoute.java b/src/main/java/com/lxyer/config/route/SiteRoute.java new file mode 100644 index 0000000..3bff4d1 --- /dev/null +++ b/src/main/java/com/lxyer/config/route/SiteRoute.java @@ -0,0 +1,16 @@ +package com.lxyer.config.route; + +import com.jfinal.config.Routes; +import com.lxyer.controller.HomeController; + +/** + * Created by JUECHENG at 2018/1/7 11:16. + */ +public class SiteRoute extends Routes { + @Override + public void config() { + setBaseViewPath("/WEB-INF/fly"); + + add("/", HomeController.class); + } +} diff --git a/src/main/java/com/lxyer/controller/HomeController.java b/src/main/java/com/lxyer/controller/HomeController.java new file mode 100644 index 0000000..e5069de --- /dev/null +++ b/src/main/java/com/lxyer/controller/HomeController.java @@ -0,0 +1,49 @@ +package com.lxyer.controller; + +import com.jfinal.aop.Before; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.SqlPara; +import com.jfinal.plugin.ehcache.CacheInterceptor; +import com.jfinal.plugin.redis.Cache; +import com.jfinal.plugin.redis.Redis; +import com.lxyer.model.User; + +import java.util.List; + +/** + * Created by JUECHENG at 2018/1/7 14:40. + */ +public class HomeController extends IController { + + public void index(){ + String para = getPara(); + + Cache cache = Redis.use(); + String cacheKey = "user-" + para; + + User user = cache.get(cacheKey); + if (user == null) + cache.setex(cacheKey, 10, user = User.dao.findById(para+"")); + + if (user != null) + System.out.println(user.toJson()); + + renderText("hello fly"); + } + + /** + * 查询用户 + */ + @Before(CacheInterceptor.class) + public void query_user(){ + + //User.dao.find("select * from user") + + SqlPara sqlPara = Db.getSqlPara("user.list"); + + + List users = User.dao.find(sqlPara); + + renderJson(users); + } +} diff --git a/src/main/java/com/lxyer/controller/IController.java b/src/main/java/com/lxyer/controller/IController.java new file mode 100644 index 0000000..bb4fb57 --- /dev/null +++ b/src/main/java/com/lxyer/controller/IController.java @@ -0,0 +1,103 @@ +package com.lxyer.controller; + +import com.jfinal.core.Controller; +import com.jfinal.kit.Kv; +import com.jfinal.plugin.activerecord.*; +import com.lxyer.config.E; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Lxyer at 2017/9/10 13:55. + */ +public class IController extends Controller { + + public Kv getParams(String... key) { + Kv kv = Kv.create(); + for (String k : key) { + if (k.contains("=")) { //如果没有值使用默认值 + kv.put(k.split("=")[0], getPara(k.split("=")[0], k.split("=")[1])); + continue; + } else if (k.contains("<")) { //强制使用"<"右侧的值 + kv.put(k.split("<")[0], k.split("<")[1]); + continue; + } + kv.put(k, getPara(k)); + } + return kv; + } + + public int getPn(){ + return getParaToInt("pn", 1); + } + public int getPs(){ + return getParaToInt("ps", 15); + } + public int getPn(int pn){ + return getParaToInt("pn", pn); + } + public int getPs(int ps){ + return getParaToInt("ps", ps); + } + + /** + * 设置动态属性 + * @param page + * @param dynAttr + */ + public void setDynAttr(Page page, E.DynamicAttr dynAttr, String ... s){ + if (page == null || page.getList().size() == 0 || dynAttr == null) return; + List ids = new ArrayList<>(); + page.getList().forEach(x->ids.add(x.getInt(dynAttr.id_k()))); + if (!ids.isEmpty()) { + String ids_ = ids.toString(); + ids_ = ids_.substring(1, ids_.length() - 1); + + //查询动态属性 + Kv kv = Kv.by("table", dynAttr.table()).set("id_k", dynAttr.gk()).set("id_v", ids_).set("cate", dynAttr.getCate()); + if (s.length > 0) + kv.set("attr", arrToStr(s)); + + SqlPara sqlPara = Db.getSqlPara("m.dyn_attr", kv); + List attrs = Db.find(sqlPara); + + Map attrMap = new HashMap(); + attrs.forEach(x->{ + Kv nAttr = attrMap.getOrDefault(x.getInt(dynAttr.gk()), Kv.create()); + nAttr.set(x.get("attr"), x.get("value")); + attrMap.put(x.getInt(dynAttr.gk()), nAttr); + }); + page.getList().forEach(x->{ + attrMap.getOrDefault(x.getInt(dynAttr.id_k()), Kv.create()).forEach((k, v)->x.put(k+"", v)); + }); + } + } + + /** + * 设置动态属性 + * @param model + * @param dynAttr + */ + public void setDynAttr(Model model, E.DynamicAttr dynAttr, String ... ss){ + Kv kv = Kv.by("table", dynAttr.table()).set("id_k", dynAttr.gk()).set("id_v", model.getInt(dynAttr.id_k())).set("cate", dynAttr.getCate()); + if (ss.length > 0) kv.set("attr", arrToStr(ss)); + + SqlPara sqlPara = Db.getSqlPara("m.dyn_attr", kv); + List attrs = Db.find(sqlPara); + attrs.forEach(x-> model.put(x.get("attr"), x.get("value"))); + } + + private String arrToStr(String ... ss){ + String str = ""; + for (String x : ss){ + str += "'"+x+"',"; + } + if (str.length() > 0) + str = str.substring(0, str.length()-1); + return str; + } + +} diff --git a/src/main/java/com/lxyer/model/ActLog.java b/src/main/java/com/lxyer/model/ActLog.java new file mode 100644 index 0000000..591a44b --- /dev/null +++ b/src/main/java/com/lxyer/model/ActLog.java @@ -0,0 +1,11 @@ +package com.lxyer.model; + +import com.lxyer.model.base.BaseActLog; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class ActLog extends BaseActLog { + +} diff --git a/src/main/java/com/lxyer/model/Comment.java b/src/main/java/com/lxyer/model/Comment.java new file mode 100644 index 0000000..9ffcdbf --- /dev/null +++ b/src/main/java/com/lxyer/model/Comment.java @@ -0,0 +1,11 @@ +package com.lxyer.model; + +import com.lxyer.model.base.BaseComment; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class Comment extends BaseComment { + +} diff --git a/src/main/java/com/lxyer/model/Content.java b/src/main/java/com/lxyer/model/Content.java new file mode 100644 index 0000000..f09d419 --- /dev/null +++ b/src/main/java/com/lxyer/model/Content.java @@ -0,0 +1,11 @@ +package com.lxyer.model; + +import com.lxyer.model.base.BaseContent; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class Content extends BaseContent { + +} diff --git a/src/main/java/com/lxyer/model/ContentItem.java b/src/main/java/com/lxyer/model/ContentItem.java new file mode 100644 index 0000000..04f16f2 --- /dev/null +++ b/src/main/java/com/lxyer/model/ContentItem.java @@ -0,0 +1,11 @@ +package com.lxyer.model; + +import com.lxyer.model.base.BaseContentItem; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class ContentItem extends BaseContentItem { + +} diff --git a/src/main/java/com/lxyer/model/DynaAttr.java b/src/main/java/com/lxyer/model/DynaAttr.java new file mode 100644 index 0000000..7f7d188 --- /dev/null +++ b/src/main/java/com/lxyer/model/DynaAttr.java @@ -0,0 +1,11 @@ +package com.lxyer.model; + +import com.lxyer.model.base.BaseDynaAttr; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class DynaAttr extends BaseDynaAttr { + +} diff --git a/src/main/java/com/lxyer/model/User.java b/src/main/java/com/lxyer/model/User.java new file mode 100644 index 0000000..36c1ee2 --- /dev/null +++ b/src/main/java/com/lxyer/model/User.java @@ -0,0 +1,12 @@ +package com.lxyer.model; + +import com.lxyer.model.base.BaseUser; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class User extends BaseUser { + public static final User dao = new User().dao(); + +} diff --git a/src/main/java/com/lxyer/model/_Generator.java b/src/main/java/com/lxyer/model/_Generator.java new file mode 100644 index 0000000..c9f1cff --- /dev/null +++ b/src/main/java/com/lxyer/model/_Generator.java @@ -0,0 +1,85 @@ +/** + * 请勿将俱乐部专享资源复制给其他人,保护知识产权即是保护我们所在的行业,进而保护我们自己的利益 + * 即便是公司的同事,也请尊重 JFinal 作者的努力与付出,不要复制给同事 + * + * 如果你尚未加入俱乐部,请立即删除该项目,或者现在加入俱乐部:http://jfinal.com/club + * + * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群,以及作者在俱乐部定期的分享与答疑, + * 价值远比仅仅拥有 jfinal club 项目源代码要大得多 + * + * JFinal 俱乐部是五年以来首次寻求外部资源的尝试,以便于有资源创建更加 + * 高品质的产品与服务,为大家带来更大的价值,所以请大家多多支持,不要将 + * 首次的尝试扼杀在了摇篮之中 + */ + +package com.lxyer.model; + + +import com.jfinal.kit.PathKit; +import com.jfinal.plugin.activerecord.dialect.MysqlDialect; +import com.jfinal.plugin.activerecord.generator.Generator; +import com.jfinal.plugin.hikaricp.HikariCpPlugin; + +import javax.sql.DataSource; + +/** + * Model、BaseModel、_MappingKit 生成器 + */ +@SuppressWarnings("ALL") +public class _Generator { + + /** + * 部分功能使用 Db + Record 模式实现,无需生成 model 的 table 在此配置 + */ + private static String[] excludedTable = { + /*"comment", + "content", + "content_item", + "dyna_attr", + "tree", + "user"*/ + }; + + /** + * 重用 JFinalClubConfig 中的数据源配置,避免冗余配置 + */ + public static DataSource getDataSource() { + //HikariCpPlugin hikariCpPlugin = new HikariCpPlugin("jdbc:mysql://558cfc37a10ef.sh.cdb.myqcloud.com:3817/db_toutiao?nullNamePatternMatchesAll=true", "cdb_outerroot", "l237809796", "com.mysql.cj.jdbc.Driver"); + HikariCpPlugin hikariCpPlugin = new HikariCpPlugin("jdbc:mysql://dbserver:3306/jfly?nullNamePatternMatchesAll=true", "guest", "hello", "com.mysql.cj.jdbc.Driver"); + hikariCpPlugin.start(); + return hikariCpPlugin.getDataSource(); + } + + public static void main(String[] args) { + // base model 所使用的包名 + String baseModelPackageName = "com.lxyer.model.base"; + // base model 文件保存路径 + String baseModelOutputDir = PathKit.getWebRootPath() + + "/src/main/java/com/lxyer/model/dev/base"; + + System.out.println("输出路径:"+ baseModelOutputDir); + + // model 所使用的包名 (MappingKit 默认使用的包名) + String modelPackageName = "com.lxyer.dev"; + // model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径) + String modelOutputDir = baseModelOutputDir + "/.."; + + // 创建生成器 + Generator gen = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir); + // 设置数据库方言 + gen.setDialect(new MysqlDialect()); + // 添加不需要生成的表名 + for (String table : excludedTable) { + gen.addExcludedTable(table); + } + // 设置是否在 Model 中生成 getDao 对象 + gen.setGenerateDaoInModel(false); + // 设置是否生成字典文件 + gen.setGenerateDataDictionary(false); + gen.setMappingKitClassName("DbMap"); + // 设置需要被移除的表名前缀用于生成modelName。例如表名 "osc_user",移除前缀 "osc_"后生成的model名为 "User"而非 OscUser + // gernerator.setRemovedTableNamePrefixes("t_"); + // 生成 + gen.generate(); + } +} diff --git a/src/main/java/com/lxyer/model/base/BaseActLog.java b/src/main/java/com/lxyer/model/base/BaseActLog.java new file mode 100644 index 0000000..6931a6b --- /dev/null +++ b/src/main/java/com/lxyer/model/base/BaseActLog.java @@ -0,0 +1,68 @@ +package com.lxyer.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseActLog> extends Model implements IBean { + + public void setLogid(java.lang.Integer logid) { + set("logid", logid); + } + + public java.lang.Integer getLogid() { + return getInt("logid"); + } + + public void setCate(java.lang.Integer cate) { + set("cate", cate); + } + + public java.lang.Integer getCate() { + return getInt("cate"); + } + + public void setTid(java.lang.Integer tid) { + set("tid", tid); + } + + public java.lang.Integer getTid() { + return getInt("tid"); + } + + public void setUserId(java.lang.Integer userId) { + set("userId", userId); + } + + public java.lang.Integer getUserId() { + return getInt("userId"); + } + + public void setCreateTime(java.lang.Long createTime) { + set("createTime", createTime); + } + + public java.lang.Long getCreateTime() { + return getLong("createTime"); + } + + public void setRemark(java.lang.String remark) { + set("remark", remark); + } + + public java.lang.String getRemark() { + return getStr("remark"); + } + + public void setStatus(java.lang.Integer status) { + set("status", status); + } + + public java.lang.Integer getStatus() { + return getInt("status"); + } + +} diff --git a/src/main/java/com/lxyer/model/base/BaseComment.java b/src/main/java/com/lxyer/model/base/BaseComment.java new file mode 100644 index 0000000..11b0e3f --- /dev/null +++ b/src/main/java/com/lxyer/model/base/BaseComment.java @@ -0,0 +1,84 @@ +package com.lxyer.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseComment> extends Model implements IBean { + + public void setCommentId(java.lang.Integer commentId) { + set("commentId", commentId); + } + + public java.lang.Integer getCommentId() { + return getInt("commentId"); + } + + public void setUserId(java.lang.Integer userId) { + set("userId", userId); + } + + public java.lang.Integer getUserId() { + return getInt("userId"); + } + + public void setPid(java.lang.Integer pid) { + set("pid", pid); + } + + public java.lang.Integer getPid() { + return getInt("pid"); + } + + public void setCate(java.lang.Integer cate) { + set("cate", cate); + } + + public java.lang.Integer getCate() { + return getInt("cate"); + } + + public void setContentId(java.lang.Integer contentId) { + set("contentId", contentId); + } + + public java.lang.Integer getContentId() { + return getInt("contentId"); + } + + public void setContent(java.lang.String content) { + set("content", content); + } + + public java.lang.String getContent() { + return getStr("content"); + } + + public void setCreateTime(java.lang.Long createTime) { + set("createTime", createTime); + } + + public java.lang.Long getCreateTime() { + return getLong("createTime"); + } + + public void setSupportNum(java.lang.Integer supportNum) { + set("supportNum", supportNum); + } + + public java.lang.Integer getSupportNum() { + return getInt("supportNum"); + } + + public void setStatus(java.lang.Integer status) { + set("status", status); + } + + public java.lang.Integer getStatus() { + return getInt("status"); + } + +} diff --git a/src/main/java/com/lxyer/model/base/BaseContent.java b/src/main/java/com/lxyer/model/base/BaseContent.java new file mode 100644 index 0000000..8afde00 --- /dev/null +++ b/src/main/java/com/lxyer/model/base/BaseContent.java @@ -0,0 +1,124 @@ +package com.lxyer.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseContent> extends Model implements IBean { + + public void setContentId(java.lang.Integer contentId) { + set("contentId", contentId); + } + + public java.lang.Integer getContentId() { + return getInt("contentId"); + } + + public void setUserId(java.lang.Integer userId) { + set("userId", userId); + } + + public java.lang.Integer getUserId() { + return getInt("userId"); + } + + public void setTitle(java.lang.String title) { + set("title", title); + } + + public java.lang.String getTitle() { + return getStr("title"); + } + + public void setDigest(java.lang.String digest) { + set("digest", digest); + } + + public java.lang.String getDigest() { + return getStr("digest"); + } + + public void setContent(java.lang.String content) { + set("content", content); + } + + public java.lang.String getContent() { + return getStr("content"); + } + + public void setCreateTime(java.lang.Long createTime) { + set("createTime", createTime); + } + + public java.lang.Long getCreateTime() { + return getLong("createTime"); + } + + public void setCate(java.lang.Integer cate) { + set("cate", cate); + } + + public java.lang.Integer getCate() { + return getInt("cate"); + } + + public void setType(java.lang.Integer type) { + set("type", type); + } + + public java.lang.Integer getType() { + return getInt("type"); + } + + public void setReplyNum(java.lang.Integer replyNum) { + set("replyNum", replyNum); + } + + public java.lang.Integer getReplyNum() { + return getInt("replyNum"); + } + + public void setViewNum(java.lang.Integer viewNum) { + set("viewNum", viewNum); + } + + public java.lang.Integer getViewNum() { + return getInt("viewNum"); + } + + public void setWonderful(java.lang.Integer wonderful) { + set("wonderful", wonderful); + } + + public java.lang.Integer getWonderful() { + return getInt("wonderful"); + } + + public void setTop(java.lang.Integer top) { + set("top", top); + } + + public java.lang.Integer getTop() { + return getInt("top"); + } + + public void setSolved(java.lang.Integer solved) { + set("solved", solved); + } + + public java.lang.Integer getSolved() { + return getInt("solved"); + } + + public void setStatus(java.lang.Integer status) { + set("status", status); + } + + public java.lang.Integer getStatus() { + return getInt("status"); + } + +} diff --git a/src/main/java/com/lxyer/model/base/BaseContentItem.java b/src/main/java/com/lxyer/model/base/BaseContentItem.java new file mode 100644 index 0000000..6357bbf --- /dev/null +++ b/src/main/java/com/lxyer/model/base/BaseContentItem.java @@ -0,0 +1,44 @@ +package com.lxyer.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseContentItem> extends Model implements IBean { + + public void setItemId(java.lang.Integer itemId) { + set("itemId", itemId); + } + + public java.lang.Integer getItemId() { + return getInt("itemId"); + } + + public void setContentId(java.lang.Integer contentId) { + set("contentId", contentId); + } + + public java.lang.Integer getContentId() { + return getInt("contentId"); + } + + public void setCreateTime(java.util.Date createTime) { + set("createTime", createTime); + } + + public java.util.Date getCreateTime() { + return get("createTime"); + } + + public void setStatus(java.lang.Integer status) { + set("status", status); + } + + public java.lang.Integer getStatus() { + return getInt("status"); + } + +} diff --git a/src/main/java/com/lxyer/model/base/BaseDynaAttr.java b/src/main/java/com/lxyer/model/base/BaseDynaAttr.java new file mode 100644 index 0000000..8e1a392 --- /dev/null +++ b/src/main/java/com/lxyer/model/base/BaseDynaAttr.java @@ -0,0 +1,44 @@ +package com.lxyer.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseDynaAttr> extends Model implements IBean { + + public void setTid(java.lang.Integer tid) { + set("tid", tid); + } + + public java.lang.Integer getTid() { + return getInt("tid"); + } + + public void setCate(java.lang.Integer cate) { + set("cate", cate); + } + + public java.lang.Integer getCate() { + return getInt("cate"); + } + + public void setAttr(java.lang.String attr) { + set("attr", attr); + } + + public java.lang.String getAttr() { + return getStr("attr"); + } + + public void setValue(java.lang.String value) { + set("value", value); + } + + public java.lang.String getValue() { + return getStr("value"); + } + +} diff --git a/src/main/java/com/lxyer/model/base/BaseUser.java b/src/main/java/com/lxyer/model/base/BaseUser.java new file mode 100644 index 0000000..daf0f9e --- /dev/null +++ b/src/main/java/com/lxyer/model/base/BaseUser.java @@ -0,0 +1,116 @@ +package com.lxyer.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseUser> extends Model implements IBean { + + public void setUserId(java.lang.Integer userId) { + set("userId", userId); + } + + public java.lang.Integer getUserId() { + return getInt("userId"); + } + + public void setUsername(java.lang.String username) { + set("username", username); + } + + public java.lang.String getUsername() { + return getStr("username"); + } + + public void setPassword(java.lang.String password) { + set("password", password); + } + + public java.lang.String getPassword() { + return getStr("password"); + } + + public void setSex(java.lang.Integer sex) { + set("sex", sex); + } + + public java.lang.Integer getSex() { + return getInt("sex"); + } + + public void setPhone(java.lang.String phone) { + set("phone", phone); + } + + public java.lang.String getPhone() { + return getStr("phone"); + } + + public void setNickname(java.lang.String nickname) { + set("nickname", nickname); + } + + public java.lang.String getNickname() { + return getStr("nickname"); + } + + public void setAvatar(java.lang.String avatar) { + set("avatar", avatar); + } + + public java.lang.String getAvatar() { + return getStr("avatar"); + } + + public void setRealname(java.lang.String realname) { + set("realname", realname); + } + + public java.lang.String getRealname() { + return getStr("realname"); + } + + public void setEmail(java.lang.String email) { + set("email", email); + } + + public java.lang.String getEmail() { + return getStr("email"); + } + + public void setCreateTime(java.lang.Long createTime) { + set("createTime", createTime); + } + + public java.lang.Long getCreateTime() { + return getLong("createTime"); + } + + public void setSign(java.lang.String sign) { + set("sign", sign); + } + + public java.lang.String getSign() { + return getStr("sign"); + } + + public void setCity(java.lang.String city) { + set("city", city); + } + + public java.lang.String getCity() { + return getStr("city"); + } + + public void setStatus(java.lang.Integer status) { + set("status", status); + } + + public java.lang.Integer getStatus() { + return getInt("status"); + } + +} diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties new file mode 100644 index 0000000..a314c0d --- /dev/null +++ b/src/main/resources/config.properties @@ -0,0 +1,10 @@ +#------------------------------------------------# +jdbcUrl=jdbc\:mysql\://dbserver\:3306/jfly?useUnicode\=true&characterEncoding\=utf8&useSSL\=false +user=root +password=*hello9796! + +redis.cache_name=jfly +redis.database=1 +redis.host=dbserver +redis.port=6379 +redis.timeout=5000 \ No newline at end of file diff --git a/src/main/resources/db/jfly.sql b/src/main/resources/db/jfly.sql new file mode 100644 index 0000000..0fb7306 --- /dev/null +++ b/src/main/resources/db/jfly.sql @@ -0,0 +1,209 @@ +-- MySQL dump 10.13 Distrib 5.7.20, for Linux (x86_64) +-- +-- Host: localhost Database: jfly +-- ------------------------------------------------------ +-- Server version 5.7.20 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `act_log` +-- + +DROP TABLE IF EXISTS `act_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `act_log` ( + `logid` int(11) NOT NULL AUTO_INCREMENT COMMENT '[日志id]', + `cate` int(1) NOT NULL COMMENT '[日志类型]', + `tid` int(11) DEFAULT NULL COMMENT '[目标数据id]', + `userId` int(11) NOT NULL DEFAULT '0' COMMENT '[用户id]', + `createTime` bigint(20) DEFAULT NULL COMMENT '[创建时间]', + `remark` varchar(128) DEFAULT NULL COMMENT '[说明]', + `status` int(1) DEFAULT '1' COMMENT '[状态]-1删除 1正常', + PRIMARY KEY (`logid`) +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `act_log` +-- + +LOCK TABLES `act_log` WRITE; +/*!40000 ALTER TABLE `act_log` DISABLE KEYS */; +INSERT INTO `act_log` VALUES (1,1,13,100003,1512025122957,'',1),(2,1,13,100003,1512025740325,'',1),(3,1,13,100003,1512025795043,'',1),(4,1,13,100003,1512025901312,'',1),(5,1,13,100003,1512025965326,'',1),(6,1,13,100003,1512026040433,'',1),(7,1,2,100003,1512028418702,'',1),(8,1,8,100003,1512028432175,'',1),(9,1,4,100003,1512028464602,'',1),(10,2,3,100003,1512034501549,'',-1),(11,2,2,100003,1512032642934,'',-1),(12,2,1,100003,1512032796896,'',1),(13,1,11,100003,1512032884321,'',1),(14,1,10,100003,1512032895493,'',1),(15,2,8,100003,1512034565868,'',1),(16,1,12,100002,1512045337969,'',1),(17,2,9,100001,1512101602962,'',1),(18,1,111,100001,1512914577786,'',1),(19,1,18,100001,1512915224895,'',1); +/*!40000 ALTER TABLE `act_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `comment` +-- + +DROP TABLE IF EXISTS `comment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `comment` ( + `commentId` int(11) NOT NULL AUTO_INCREMENT COMMENT '[评论id]', + `userId` int(11) NOT NULL COMMENT '[评论用户id]', + `pid` int(11) NOT NULL DEFAULT '0' COMMENT '[评论父id]', + `cate` int(2) NOT NULL DEFAULT '1' COMMENT '[评论的类型]', + `contentId` int(11) NOT NULL COMMENT '[被评论内容的id]', + `content` text COMMENT '[评论内容]', + `createTime` bigint(20) DEFAULT NULL COMMENT '[创建时间]', + `supportNum` int(11) DEFAULT '0' COMMENT '[支持数]', + `status` int(1) NOT NULL DEFAULT '1' COMMENT '[状态]1正常,-1删除', + PRIMARY KEY (`commentId`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='[评论表]'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `comment` +-- + +LOCK TABLES `comment` WRITE; +/*!40000 ALTER TABLE `comment` DISABLE KEYS */; +INSERT INTO `comment` VALUES (1,100003,0,0,1,'face[围观] face[围观] ',1511939728047,0,1),(2,100003,0,0,2,'face[嘻嘻] face[可怜] ',1511940602654,1,1),(3,100003,13,0,1,'@nick face[哈哈] ',1511940625623,0,1),(4,100003,13,0,1,'@nickface[白眼] ',1511940683270,1,1),(5,100003,13,0,1,'@nick1111',1511940700471,0,1),(6,100003,0,0,1,'img[/tem/20171129162348.jpg] ',1511943836477,0,1),(7,100003,0,0,2,'img[/tem/20171129163431.jpg] ',1511944482613,0,1),(8,100003,0,0,2,'face[生病] ',1511944517640,1,1),(9,100003,0,0,1,'face[太开心] ',1511944551078,0,1),(10,100003,0,0,1,'face[哈哈] face[哈哈] face[哈哈] ',1511944648519,1,1),(11,100003,0,0,1,'face[哈哈] ',1511944795212,1,1),(12,100002,0,0,1,'gfd d',1512045330899,1,1),(13,100002,12,0,1,'@荣培晓fg hr',1512045347046,0,1),(14,100002,3,0,1,'@nick htr yt',1512045359531,0,1),(15,100003,7,0,2,'@nick ',1512098913721,0,1),(16,100003,0,0,8,'img[http://img.1216.top/bbs/20171201120132.gif] ',1512100903683,0,1),(17,100003,0,0,2,'face[哈哈] img[/tem/20171203113715.png] ',1512272244158,0,1),(18,100001,0,0,8,'123',1512914569848,1,1); +/*!40000 ALTER TABLE `comment` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `content` +-- + +DROP TABLE IF EXISTS `content`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `content` ( + `contentId` int(11) NOT NULL AUTO_INCREMENT COMMENT '[内容id]', + `userId` int(11) NOT NULL COMMENT '[用户id]', + `title` varchar(64) NOT NULL COMMENT '[标题]', + `digest` varchar(256) DEFAULT '' COMMENT '[摘要]', + `content` text COMMENT '[内容]', + `createTime` bigint(20) NOT NULL COMMENT '[创建时间]', + `cate` int(11) DEFAULT NULL COMMENT '[类别]', + `type` int(11) NOT NULL COMMENT '[内容栏目]10求助,20分享,30建议,40公告,50动态', + `replyNum` int(11) NOT NULL DEFAULT '0' COMMENT '[评论数]', + `viewNum` int(11) NOT NULL DEFAULT '0' COMMENT '[阅读量]', + `wonderful` int(1) NOT NULL DEFAULT '0' COMMENT '[精] 0否,1是', + `top` int(1) NOT NULL DEFAULT '0' COMMENT '[置顶]0否,1是', + `solved` int(11) NOT NULL DEFAULT '0' COMMENT '[结帖]大于0结帖', + `status` int(1) NOT NULL DEFAULT '1' COMMENT '[状态]1结帖 2未结帖 -1删除', + PRIMARY KEY (`contentId`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='[内容表]'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `content` +-- + +LOCK TABLES `content` WRITE; +/*!40000 ALTER TABLE `content` DISABLE KEYS */; +INSERT INTO `content` VALUES (1,100001,'被历史误判!时间还其公道','',' face[嘻嘻] face[亲亲] face[晕]\r\n[pre]\r\nimg[http://img.1216.top/bbs/20171201120729.jpg]\r\n[/pre]',1505031204000,9,50,11,472,0,0,0,1),(2,100001,'故宫武英殿举行赵孟頫书画特展','','img[/tem/20171203231840.jpg]\r\n',1505042514000,2,0,5,137,0,0,0,-1),(3,100001,'Redkale 技术详解 01 -- 双亲委托模型','',' Redkale 里大量使用了双亲委托模型,序列化的ConvertFactory、依赖注入的ResourceFactory、服务管理的WatchFactory均采用双亲委托模型。用于优先加载自定义的处理类,同时也保证两个同级的子Factory不会相互干扰。
\r\n',1511682960591,1,0,0,92,1,0,0,-1),(4,100003,'回收木头打造彩色鸟屋 让鸟儿找到栖息之地','','\r\nimg[http://www.shouyihuo.com/uploads/allimg/171128/4_171128095818_1.jpg]\r\n\r\nface[浮云]\r\nimg[http://www.shouyihuo.com/uploads/allimg/171128/4_171128095832_2.jpg]',1511858330764,9,20,0,170,0,0,0,-1),(5,100003,'2017-11-29','','img[/tem/20171129232304.png] ',1511968992737,1,0,0,30,0,0,0,-1),(6,100003,'儿童画','','img[/tem/20171130173239.jpg] ',1512034378751,3,0,0,1,0,0,0,-1),(7,100003,'儿童画','','img[/tem/20171130173239.jpg] ',1512034389038,3,0,0,2,0,0,0,-1),(8,100003,'儿童画-九岁','','img[http://img.1216.top/bbs/20171201120301.jpg] ',1512034430071,9,20,2,115,0,0,0,-1),(9,100001,'全家福-培晓作','','img[http://img.1216.top/bbs/20171201120447.jpg] ',1512054964558,9,0,0,116,1,0,0,-1),(10,100002,'培晓艺术','','\r\nimg[http://img.1216.top/bbs/20171204184735.png] ',1512384522858,9,0,0,36,1,1,0,-1),(11,100001,'社区功能进一步完善,已可以投入使用','','进一步完善,加入 求助/分享/...各个栏目\r\n[pre]\r\n社区基本功能已完成,可以简单的投入使用了\r\n欢迎围观、欢迎注册体验,face[围观]\r\n[/pre]\r\n ',1512921121862,0,50,0,140,0,2,0,1),(12,100002,'阿狸日常','','img/[http://img.1216.top/bbs/20171211003708.jpg]\r\n\r\nimg/[http://img.1216.top/bbs/20171211003725.jpg]\r\n\r\nimg/[http://img.1216.top/bbs/20171211003738.jpg]\r\n\r\nimg/[http://img.1216.top/bbs/20171211003746.jpg] ',1512923899949,0,20,0,129,1,1,0,1),(13,100003,'现在版本nginx支不支持TCP的SSL','','[pre]\n不知道现在版本nginx支不支持TCP的SSL, 如果支持的话那就不考虑实现SSL了\n[/pre]\nimg[http://img.1216.top/redbbs/20180103021052.png] ',1514916271430,0,30,0,10,0,0,0,1),(14,100003,'http协议基本认证 Authorization','','阅读目录\n什么是HTTP基本认证\nHTTP基本认证的过程\nHTTP基本认证的优点\n每次都要进行认证\nHTTP基本认证和HTTPS一起使用就很安全\nHTTP OAuth认证\n其他认证\n客户端的使用\n a(http://blog.csdn.net/u011181633/article/details/43229387)[http协议基本认证 Authorization] \n\n ',1514917144371,0,20,0,8,0,0,0,1),(15,100003,'redkale1.8.9 内存进一步优化','','[pre]\n同样的请求,50线程请求2000次, 1.8.8占内存最高值750M, 1.8.9降到500M\n[/pre]\nimg[http://img.1216.top/redbbs/20180103022314.png] \nimg[http://img.1216.top/redbbs/20180103022323.png] \n【1.8.8】\n\nimg[http://img.1216.top/redbbs/20180103022427.png] \nimg[http://img.1216.top/redbbs/20180103022435.png] \n【1.8.9】',1514917498015,0,50,0,29,1,2,0,1); +/*!40000 ALTER TABLE `content` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `content_item` +-- + +DROP TABLE IF EXISTS `content_item`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `content_item` ( + `itemId` int(11) NOT NULL AUTO_INCREMENT COMMENT '[章节id]', + `contentId` int(11) NOT NULL COMMENT '[内容id]', + `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` int(1) NOT NULL DEFAULT '1' COMMENT '[状态]', + PRIMARY KEY (`itemId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `content_item` +-- + +LOCK TABLES `content_item` WRITE; +/*!40000 ALTER TABLE `content_item` DISABLE KEYS */; +/*!40000 ALTER TABLE `content_item` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `dyna_attr` +-- + +DROP TABLE IF EXISTS `dyna_attr`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `dyna_attr` ( + `tid` int(11) NOT NULL COMMENT '[目标数据id]', + `cate` int(11) NOT NULL COMMENT '[类型]1文章, 2xx, 3...,', + `attr` varchar(32) NOT NULL, + `value` text COMMENT '[属性值]', + PRIMARY KEY (`tid`,`cate`,`attr`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='[动态属性表]'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `dyna_attr` +-- + +LOCK TABLES `dyna_attr` WRITE; +/*!40000 ALTER TABLE `dyna_attr` DISABLE KEYS */; +INSERT INTO `dyna_attr` VALUES (1,1,'content','格列柯作品\r\n“矫饰”一词源于意大利语Maniera,意为“风格”,在中文翻译上很容易让人与“矫情”等负面词汇联系到一起,因此很多人对这个画派产生了误解。\r\n事实上,这个画派也的确很长一段时间内在西方美术史上饱受非议,它曾被认为是文艺复兴渐趋衰落后出现的一种故意追求造作形式的画派。直至后来经过很长一段时间的研究,矫饰主义才被客观地界定为是一个全新、独立且有着很大影响力的流派。'),(1,1,'cover','http://upload.art.ifeng.com/2017/0908/thumb_320_200_1504838478153.png'),(2,1,'content','

在文艺复兴和巴洛克风格之间,有一个容易被忽视的流派,他们追求变化和夸张,突破了作品一定要“完美、优雅”的限制,它被称为矫饰主义。

何为矫饰主义

14-17世纪的文艺复兴时期,在一般大众心目中,它几乎一度成为了西方艺术的代名词,《蒙娜丽莎》《最后的晚餐》《大卫》……这些名作都出自这个时期,它崇尚的是一种均衡稳定、优雅和谐之美。

达·芬奇《最后的晚餐》

在文艺复兴晚期,画家们对这种理性美感到了“审美疲劳”,且觉得在这种画法上很难再超越文艺复兴的那些大师们,根本无法施展自己的拳脚、展现自己的才华。于是,他们便有意识地创造新风格,组成了一个新的画派,创作那些惊人的、富有幻想的作品——“矫饰主义”就由此出现了。

格列柯作品

“矫饰”一词源于意大利语Maniera,意为“风格”,在中文翻译上很容易让人与“矫情”等负面词汇联系到一起,因此很多人对这个画派产生了误解。

事实上,这个画派也的确很长一段时间内在西方美术史上饱受非议,它曾被认为是文艺复兴渐趋衰落后出现的一种故意追求造作形式的画派。直至后来经过很长一段时间的研究,矫饰主义才被客观地界定为是一个全新、独立且有着很大影响力的流派。

布龙齐诺《托雷多的肖像》,1560年

矫饰主义的特征十分明显,主要表现为拉长的人体比例、不平衡的姿势、丰富夸张的表情,以及缺乏清晰的透视。在绘画的色彩上,矫饰主义一改文艺复兴时期的沉闷色调,色彩更加丰富、艳丽,还常常有一些怪异的光影效果。除此之外,在绘画题材上也多是偷窥、阴谋等相对晦涩的话题。

总的来说,矫饰主义就是毫无章法地去创造和追求一种“视觉的惊奇”。

帕米贾尼诺《圣保罗的皈依》

布龙齐诺作品

画家帕米贾尼诺的这幅《长颈圣母》可以说是矫饰主义画作的典范之一。在这幅画中,我们依旧可以感受到拉斐尔式圣母的优美,却又有着截然不同的艺术处理。

帕米贾尼诺《长颈圣母》

画面中人物的肢体都被拉长,即使是圣母手中的婴儿,也被拉到了4、5岁儿童身高的长度。艺术史家贡布里希认为,帕米贾尼诺故意加长了圣母的脖子,以形成优雅的姿态。画家似乎有意阻止我们用日常经验的标准去衡量画中的一切。

帕米贾尼诺《长颈圣母》局部

其实,在拉斐尔和米开朗基罗的中后期作品中,我们也可以看到矫饰主义的影子。他们在绘画、雕塑中追求更多的肢体动作上的变化和夸大的情绪反应,这些都与早期的矫饰主义艺术家的作品有着很高的相似之处。

米开朗基罗《昼》

说到矫饰主义,就不得不提到艺术家蓬托尔莫。他于1494年出生在意大利,是一位虔诚的宗教画家,他曾前往佛罗伦萨学画。起初,在他的早期作品中还可以看到达·芬奇、米开朗基罗等大师的影子。在他遗留下来的日记中人们发现,他对自己的工作充满着热情,但是内心呈现的状态却是十分孤独、敏感的。

蓬托尔莫《Madonna and Child with the Young St John the Baptist》

1512年,蓬托尔莫在画家沙托的门下工作时,遇到了画家罗索,由于年龄和兴趣爱好都相仿,二人很快便成为了朋友。

蓬托尔莫作品

罗索也曾在佛罗伦萨等城市工作,且艺术上受到米开朗基罗很大的影响。但是后来,罗索和蓬托尔莫二人都背离了文艺复兴兴盛时期的艺术原则,共同转向了对矫饰主义作品的创作。

罗索作品

蓬托尔莫的作品《基督被接下十字架》被誉为矫饰主义发展的核心之作。在这幅作品中,虽然表达的主题十分神圣,但是人物塞满了整个画面,人物的比例被明显拉长,且蓬托尔莫刻意压缩了画面的透视深度。画中人物的神情,每个人的脸上都带有一种焦虑感和紧张感。可以说,整幅作品与古典主义那种稳重、理性的风格完全迥异。

蓬托尔莫《基督下十字架》

但不可否认的是,蓬托尔莫的画作在色彩和设计上总能给人留下深刻的印象,比如下面这幅著名的油画《在埃及的约瑟夫》。

《在埃及的约瑟夫(Joseph in Egypt)》,1515-1518年

另外一位被称作现代绘画之父——格列柯,也同样是矫饰主义的代表人物。他的画作以弯曲瘦长的身形为特色,用色怪诞而变幻无常。在作品《天使报喜》中,人物同样遵循了矫饰主义一贯的风格——即身体被拉长。除此之外,人物背后的光影表现也一反传统绘画,明暗对比强烈,使画面充满了神秘的光芒。

埃尔·格列柯《天使报喜》,布面油画,66.5×91cm,1595年

风格影响

矫饰主义风格不仅仅体现在绘画上,作为一种风潮,它在建筑和雕塑中也同样有所体现。文艺复兴时期的建筑讲究秩序和比例,拥有严谨的立面和平面构图以及从古典建筑中继承下来的柱式系统。当时的建筑师们认为,古典柱式构图体现着和谐与理性,并同人体美有着相通之处。

维琴察圆厅别墅

矫饰主义建筑中最典型的一个例子就是位于罗马郊区的法尔尼斯别墅。

我们可以明显地看出,矫饰主义建筑追求的是一种怪诞的效果,不求整体的宏伟和雄壮,且有意地与建筑周围简陋的环境形成鲜明的对比。

法尔尼斯别墅

矫饰主义从16世纪下半叶至17世纪初,总共持续了仅仅半个世纪,无论是与前面的文艺复兴相比,还是与后面的巴洛克风格相比,都好像“差点意思”。但正是因为有矫饰主义艺术家们对突破和超越的追求,才为巴洛克风格搭建了一个稳固的阶梯。这世界上,没有绝对的稳定优雅之美,那些“矫揉造作”或许更能带来新的灵感。

有盐APP给大家送福利啦,现在加入“有盐1001种生活”微信群,就可以:

随时抢到DIY、插花、陶艺、音乐、戏剧、亲子等活动优惠券和大红包哦!!

第一时间Get各种好玩又不贵的活动!!

'),(2,1,'cover','http://upload.art.ifeng.com/2017/0908/1504837717810.jpg'),(100001,1,'abc','def'); +/*!40000 ALTER TABLE `dyna_attr` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user` +-- + +DROP TABLE IF EXISTS `user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `user` ( + `userId` int(11) NOT NULL COMMENT '[用户id]', + `username` varchar(32) NOT NULL COMMENT '[登录名]', + `password` varchar(64) NOT NULL COMMENT '[密码]', + `sex` int(2) DEFAULT '1' COMMENT '[性别]默认1 1男,2女', + `phone` varchar(32) NOT NULL COMMENT '[电话号码]', + `nickname` varchar(64) DEFAULT '' COMMENT '[昵称]', + `avatar` varchar(128) DEFAULT '' COMMENT '[头像地址]', + `realname` varchar(32) DEFAULT '' COMMENT '[真实姓名]', + `email` varchar(32) DEFAULT '' COMMENT '[邮箱]', + `createTime` bigint(20) NOT NULL COMMENT '[创建时间]', + `sign` varchar(256) NOT NULL DEFAULT '' COMMENT '[签名]', + `city` varchar(64) NOT NULL DEFAULT '' COMMENT '[所在城市]', + `status` int(1) NOT NULL DEFAULT '1' COMMENT '[状态]', + PRIMARY KEY (`userId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user` +-- + +LOCK TABLES `user` WRITE; +/*!40000 ALTER TABLE `user` DISABLE KEYS */; +INSERT INTO `user` VALUES (100001,'lxy208@126.com','fcea920f7412b5da7be0cf42b8c93759',1,'18515190967','绝尘','http://img.1216.top/art/u93.png','','lxy208@126.com',1507677533071,'','',1),(100002,'237809797@qq.com','fcea920f7412b5da7be0cf42b8c93759',2,'13121880915','晓','http://img.1216.top/art/u36.png','','237809797@qq.com',1509196823551,'','',1),(100003,'237809796@qq.com','fcea920f7412b5da7be0cf42b8c93759',2,'','nick','http://img.1216.top/bbs/20171203103651.gif','','237809796@qq.com',1511851218332,'态度决定高度。','北京',1),(100004,'vip@qq.com','25d55ad283aa400af464c76d713c07ad',1,'','qq','/res/images/avatar/3.jpg','','vip@qq.com',1512954927558,'','',1),(100005,'12@qq.com','e10adc3949ba59abbe56e057f20f883e',1,'','123','/res/images/avatar/13.jpg','','12@qq.com',1512957064362,'','',1),(100006,'10000@qq.com','0d124d13699173f26a6519631cfe6e52',1,'','na','/res/images/avatar/9.jpg','','10000@qq.com',1512987234013,'','',1),(100007,'syy@qq.com','6fb327cfe8bd8268d7e1a8468d88e8d2',1,'','syy','/res/images/avatar/13.jpg','','syy@qq.com',1513305537321,'','',1),(100008,'555@qq.com','5b1b68a9abf4d2cd155c81a9225fd158',1,'','555','/res/images/avatar/19.jpg','','555@qq.com',1513355350396,'','',1),(100009,'2442669938@qq.com','25f9e794323b453885f5181f1b624d0b',1,'','iLvc','/res/images/avatar/10.jpg','','2442669938@qq.com',1513512637440,'','',1),(100010,'316034712@qq.com','af73fabc0e20d29ce37ad7bb66e7a4ff',1,'','OoxiaobinoO','/res/images/avatar/4.jpg','','316034712@qq.com',1513840912828,'','',1); +/*!40000 ALTER TABLE `user` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2018-01-07 16:06:47 diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml new file mode 100644 index 0000000..a4a7899 --- /dev/null +++ b/src/main/resources/ehcache.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/sql/user.sql b/src/main/resources/sql/user.sql new file mode 100644 index 0000000..230d0c5 --- /dev/null +++ b/src/main/resources/sql/user.sql @@ -0,0 +1,3 @@ +#sql("user.list") + SELECT * FROM `user` +#end \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/_t/layout.html b/src/main/webapp/WEB-INF/_t/layout.html new file mode 100644 index 0000000..0489095 --- /dev/null +++ b/src/main/webapp/WEB-INF/_t/layout.html @@ -0,0 +1,11 @@ + + + + + + Title + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..932dcd0 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + + + jfly + com.jfinal.core.JFinalFilter + + configClass + com.lxyer.config.FlyConfig + + + + + jfly + /* + + \ No newline at end of file