Quellcode durchsuchen

为正式开发做准备

Luxnk vor 7 Jahren
Ursprung
Commit
59f5a202cc

+ 24 - 0
conf/custom/db.properties

@@ -0,0 +1,24 @@
+#mysql
+db.url=jdbc:mysql://127.0.0.1:3306/luxnktask
+db.username=root
+db.password=sa123456
+#db.validationQuery=select 1
+db.maxActive=100
+db.testWhileIdle=true
+db.filters=mergeStat
+db.connectionProperties=druid.stat.slowSqlMillis=2000
+#db.defaultAutoCommit=true
+
+#oracle
+#db.url=jdbc:oracle:thin:@//192.168.72.101:1521/xe
+#db.username=system
+#db.password=oracle
+#db.validationQuery=select 1 from dual
+#db.maxActive=100
+
+#postgresql
+#db.url=jdbc:postgresql://127.0.0.1:5432/nutzbook
+#db.username=postgres
+#db.password=root
+#db.validationQuery=select 1
+#db.maxActive=100

+ 8 - 8
conf/ioc/dao.js

@@ -1,17 +1,17 @@
 var ioc = {
+    conf: {
+        type: "org.nutz.ioc.impl.PropertiesProxy",
+        fields: {
+            paths: ["custom/"]
+        }
+    },
     dataSource: {
+        factory: "$conf#make",
+        args: ["com.alibaba.druid.pool.DruidDataSource", "db."],
         type: "com.alibaba.druid.pool.DruidDataSource",
         events: {
             create: "init",
             depose: "close"
-        },
-        fields: {
-            url: "jdbc:mysql://127.0.0.1:3306/luxnktask",
-            username: "root",
-            password: "",
-            testWhileIdle: true,
-            maxActive: 100,
-            maxWait: 15000
         }
     },
     dao: {

+ 16 - 0
conf/mvc/luxnkproject-mvc-chain.js

@@ -0,0 +1,16 @@
+var chain = {
+    "default": {
+        "ps": [
+            "xyz.luxnk.lproject.mvc.LogTimeProcessor",
+            "org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor",
+            "org.nutz.mvc.impl.processor.EncodingProcessor",
+            "org.nutz.mvc.impl.processor.ModuleProcessor",
+            "!org.nutz.integration.shiro.NutShiroProcessor",
+            "org.nutz.mvc.impl.processor.ActionFiltersProcessor",
+            "org.nutz.mvc.impl.processor.AdaptorProcessor",
+            "org.nutz.mvc.impl.processor.MethodInvokeProcessor",
+            "org.nutz.mvc.impl.processor.ViewProcessor"
+        ],
+        "error": 'org.nutz.mvc.impl.processor.FailProcessor'
+    }
+}

+ 4 - 0
conf/quartz.properties

@@ -0,0 +1,4 @@
+org.quartz.scheduler.instanceName = LProjectScheduler
+org.quartz.threadPool.threadCount = 3
+org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
+org.quartz.scheduler.skipUpdateCheck=true

+ 4 - 0
conf/shiro.ini

@@ -0,0 +1,4 @@
+[main]
+
+[urls]
+/* = anon

+ 6 - 2
src/xyz/luxnk/lproject/MainModule.java

@@ -3,12 +3,16 @@ package xyz.luxnk.lproject;
 import org.nutz.mvc.annotation.*;
 import org.nutz.mvc.ioc.provider.ComboIocProvider;
 
-@SetupBy(value = MainSetup.class)
-@IocBy(type = ComboIocProvider.class, args = {"*js", "ioc/", "*anno", "xyz.luxnk.lproject", "*tx", "*async"})
+@SetupBy(value = MainSetup.class)   // 应用启动时要执行的的工作
+@IocBy(type = ComboIocProvider.class, args = {"*js", "ioc/", "*anno", "xyz.luxnk.lproject", // 加载Ioc容器
+                                                "*tx",  // 事务拦截aop
+                                                "*async", // 异步执行aop
+                                                "*quartz"}) // 定时任务aop
 @Modules(scanPackage = true)
 @Ok("json:full")
 @Fail("jsp:jsp.500")
 @Localization(value = "msg/", defaultLocalizationKey = "zh-CN")
+@ChainBy(args = "mvc/luxnkproject-mvc-chain.js")
 public class MainModule {
 
 }

+ 9 - 0
src/xyz/luxnk/lproject/MainSetup.java

@@ -3,6 +3,7 @@ package xyz.luxnk.lproject;
 import org.nutz.dao.Dao;
 import org.nutz.dao.util.Daos;
 import org.nutz.el.opt.custom.CustomMake;
+import org.nutz.integration.quartz.NutQuartzCronJobFactory;
 import org.nutz.ioc.Ioc;
 import org.nutz.mvc.NutConfig;
 import org.nutz.mvc.Setup;
@@ -11,6 +12,9 @@ import xyz.luxnk.lproject.util.SnowflakeIdWorker;
 
 import java.util.Date;
 
+/**
+ * 应用初始化时执行
+ */
 public class MainSetup implements Setup {
 
     @Override
@@ -20,6 +24,7 @@ public class MainSetup implements Setup {
         Daos.createTablesInPackage(dao, "xyz.luxnk.lproject", false);
         CustomMake.me().register("snowflake", ioc.get(SnowflakeIdWorker.class));
 
+        // 如果用户表中没有数据,插入一条默认数据
         if (dao.count(UserInfo.class) == 0) {
             UserInfo userInfo = new UserInfo();
             userInfo.setUsername("Luxnk");
@@ -29,10 +34,14 @@ public class MainSetup implements Setup {
             userInfo.setUpdateTime(new Date());
             dao.insert(userInfo);
         }
+
+        // 获取NutQuartzCronJobFactory从而触发计划任务的初始化与启动
+        ioc.get(NutQuartzCronJobFactory.class);
     }
 
     @Override
     public void destroy(NutConfig nc) {
+        // 应用销毁之前要执行的东西可以写在这里
 
     }
 }

+ 42 - 0
src/xyz/luxnk/lproject/bean/BasePojo.java

@@ -0,0 +1,42 @@
+package xyz.luxnk.lproject.bean;
+
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.json.Json;
+import org.nutz.json.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * 基本Pojo类,定义了Bean包里类共有的属性和方法
+ */
+public abstract class BasePojo {
+
+    @Column("create_time")
+    protected Date createTime;
+
+    @Column("update_time")
+    protected Date updateTime;
+
+    @Override
+    public String toString() {
+
+        // 这不是必须的,只是为了debug的时候方便看
+        return Json.toJson(this, JsonFormat.compact());
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 5 - 23
src/xyz/luxnk/lproject/bean/UserInfo.java

@@ -4,8 +4,12 @@ import org.nutz.dao.entity.annotation.*;
 
 import java.util.Date;
 
+/**
+ * 用户Pojo
+ * 对应user_info表
+ */
 @Table("user_info")
-public class UserInfo {
+public class UserInfo extends BasePojo {
 
     @Name
     @Prev(els = @EL("snowflake()"))
@@ -23,12 +27,6 @@ public class UserInfo {
     @Column
     private String email;
 
-    @Column("create_time")
-    private Date createTime;
-
-    @Column("update_time")
-    private Date updateTime;
-
     public String getId() {
         return id;
     }
@@ -68,20 +66,4 @@ public class UserInfo {
     public void setEmail(String email) {
         this.email = email;
     }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
 }

+ 11 - 0
src/xyz/luxnk/lproject/module/BaseModule.java

@@ -0,0 +1,11 @@
+package xyz.luxnk.lproject.module;
+
+import org.nutz.dao.Dao;
+import org.nutz.ioc.loader.annotation.Inject;
+
+public abstract class BaseModule {
+
+    @Inject // 注入同名的一个ioc对象
+    protected Dao dao;
+
+}

+ 1 - 4
src/xyz/luxnk/lproject/module/UserModule.java

@@ -20,10 +20,7 @@ import java.util.Date;
 @Ok("json:{locked: 'password|salt', ignoreNull:true}")  // 忽略password和salt属性,忽略空属性的json输出
 @Fail("http:500")   // 抛出异常的话,就走500页面
 @Filters(@By(type = CheckSession.class, args = {"me", "/"}))    // 检查当前Session是否带me这个属性
-public class UserModule {
-
-    @Inject // 注入同名的一个ioc对象
-    protected Dao dao;
+public class UserModule extends BaseModule {
 
     @At("/")
     @Ok("jsp:jsp.user.list")    // 真实路径是 /WEB-INF/jsp/user/list.jsp

+ 28 - 0
src/xyz/luxnk/lproject/mvc/LogTimeProcessor.java

@@ -0,0 +1,28 @@
+package xyz.luxnk.lproject.mvc;
+
+import org.nutz.lang.Stopwatch;
+import org.nutz.log.Log;
+import org.nutz.log.Logs;
+import org.nutz.mvc.ActionContext;
+import org.nutz.mvc.impl.processor.AbstractProcessor;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class LogTimeProcessor extends AbstractProcessor {
+
+    private static final Log log = Logs.get();
+
+    @Override
+    public void process(ActionContext ac) throws Throwable {
+        Stopwatch sw = Stopwatch.begin();
+        try {
+            doNext(ac);
+        } finally {
+            sw.stop();
+            if (log.isDebugEnabled()) {
+                HttpServletRequest req = ac.getRequest();
+                log.debugf("[%4s]URI=%s %sms", req.getMethod(), req.getRequestURI(), sw.getDuration());
+            }
+        }
+    }
+}

+ 127 - 0
src/xyz/luxnk/lproject/util/Toolkit.java

@@ -0,0 +1,127 @@
+package xyz.luxnk.lproject.util;
+
+import org.nutz.lang.Lang;
+import org.nutz.lang.random.R;
+import org.nutz.lang.util.NutMap;
+import org.nutz.log.Log;
+import org.nutz.log.Logs;
+import xyz.luxnk.lproject.bean.UserInfo;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * 小小的工具类
+ */
+public class Toolkit {
+
+    public static final Log log = Logs.get();
+
+    public static String captcha_attr = "nutz_captcha";
+
+    /**
+     * 检查验证码是否正确
+     * @param expected
+     * @param actual
+     * @return
+     */
+    public static boolean checkCaptcha(String expected, String actual) {
+        if (expected == null || actual == null || actual.length() == 0 || actual.length() > 24)
+            return false;
+        return actual.equalsIgnoreCase(expected);
+    }
+
+    /**
+     * 加密用户密码
+     * @param password
+     * @param slat
+     * @return
+     */
+    public static String passwordEncode(String password, String slat) {
+        String str = slat + password + slat + password.substring(4);
+        return Lang.digest("SHA-512", str);
+    }
+
+    private static final String Iv = "\0\0\0\0\0\0\0\0";
+    private static final String Transformation = "DESede/CBC/PKCS5Padding";
+
+    /**
+     * 3DES加密
+     * @param key
+     * @param data
+     * @return
+     */
+    public static String _3DES_encode(byte[] key, byte[] data) {
+        SecretKey deskey = new SecretKeySpec(key, "DESede");
+        IvParameterSpec iv = new IvParameterSpec(Iv.getBytes());
+        try {
+            Cipher c1 = Cipher.getInstance(Transformation);
+            c1.init(Cipher.ENCRYPT_MODE, deskey, iv);
+            byte[] re = c1.doFinal(data);
+            return Lang.fixedHexString(re);
+        } catch (Exception e) {
+            log.info("3DES FAIL?", e);
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 3DES解密
+     * @param key
+     * @param data
+     * @return
+     */
+    public static String _3DES_decode(byte[] key, byte[] data) {
+        SecretKey deskey = new SecretKeySpec(key, "DESede");
+        IvParameterSpec iv = new IvParameterSpec(Iv.getBytes());
+        try {
+            Cipher c1 = Cipher.getInstance(Transformation);
+            c1.init(Cipher.DECRYPT_MODE, deskey, iv);
+            byte[] re = c1.doFinal(data);
+            return new String(re);
+        } catch (Exception e) {
+            log.info("BAD 3DES decode", e);
+        }
+        return null;
+    }
+
+    /**
+     * kv字符串转换
+     * @param kv
+     * @return
+     */
+    public static NutMap kv2map(String kv) {
+        NutMap re = new NutMap();
+        if (kv == null || kv.length() == 0 || !kv.contains("="))
+            return re;
+        String[] tmps = kv.split(",");
+        for (String tmp : tmps) {
+            if (!tmp.contains("="))
+                continue;
+            String[] tmps2 = tmp.split("=", 2);
+            re.put(tmps2[0], tmps2[1]);
+        }
+        return re;
+    }
+
+    public static String randomPasswd(UserInfo usr) {
+        String passwd = R.sg(10).next();
+        String slat = R.sg(48).next();
+        usr.setSalt(slat);
+        usr.setPassword(passwordEncode(passwd, slat));
+        return passwd;
+    }
+
+    public static byte[] hexstr2bytearray(String str) {
+        byte[] re = new byte[str.length() / 2];
+        for (int i = 0; i < re.length; i++) {
+            int r = Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);
+            re[i] = (byte)r;
+        }
+        return re;
+    }
+
+}

BIN
web/WEB-INF/lib/commons-beanutils-1.9.3.jar


BIN
web/WEB-INF/lib/commons-logging-1.2.jar


BIN
web/WEB-INF/lib/nutz-integration-quartz-1.r.60.r2.jar


BIN
web/WEB-INF/lib/nutz-integration-shiro-1.r.60.r2.jar


BIN
web/WEB-INF/lib/quartz-2.2.3.jar


BIN
web/WEB-INF/lib/shiro-all-1.3.2.jar


BIN
web/WEB-INF/lib/slf4j-api-1.7.25.jar


BIN
web/WEB-INF/lib/slf4j-log4j12-1.7.25.jar


+ 45 - 0
web/WEB-INF/web.xml

@@ -5,6 +5,15 @@
 		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
            version="2.5">
 
+    <servlet>
+        <servlet-name>DruidStatView</servlet-name>
+        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>DruidStatView</servlet-name>
+        <url-pattern>/druid/*</url-pattern>
+    </servlet-mapping>
+    
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>
         <welcome-file>index.jsp</welcome-file>
@@ -13,7 +22,39 @@
         <error-code>500</error-code>
         <location>/WEB-INF/jsp/500.jsp</location>
     </error-page>
+    
+    <!--shiro过滤器-->
+    <listener>
+        <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
+    </listener>
+    <filter>
+        <filter-name>ShiroFilter</filter-name>
+        <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>ShiroFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+        <dispatcher>REQUEST</dispatcher>
+        <dispatcher>FORWARD</dispatcher>
+        <dispatcher>INCLUDE</dispatcher>
+        <dispatcher>ERROR</dispatcher>
+    </filter-mapping>
+
+    <!--druid过滤器-->
+    <filter>
+        <filter-name>DruidWebStatFilter</filter-name>
+        <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
+        <init-param>
+            <param-name>exclusions</param-name>
+            <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/rs/*</param-value>
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <filter-name>DruidWebStatFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
 
+    <!--nutz过滤器-->
     <filter>
         <filter-name>nutz</filter-name>
         <filter-class>org.nutz.mvc.NutFilter</filter-class>
@@ -21,6 +62,10 @@
             <param-name>modules</param-name>
             <param-value>xyz.luxnk.lproject.MainModule</param-value>
         </init-param>
+        <init-param>
+            <param-name>exclusions</param-name>
+            <param-value>/rs/*,/druid/*</param-value>
+        </init-param>
     </filter>
     <filter-mapping>
         <filter-name>nutz</filter-name>