From 2c696f4cdd5ae3887e29ed8652152a1e80667484 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Sun, 23 Jul 2017 15:02:24 +0800
Subject: [PATCH 01/13] =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9B=B8=E5=85=B3API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/model/fairmessage/FairMessage.java |  4 ++-
 .../front/mobile/MobileRoutes.java            |  4 ++-
 .../front/web/feedback/FeedBackValidator.java |  1 +
 src/main/resources/ehcache.xml                | 28 +++++++++++++------
 4 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/tianpengtech/common/model/fairmessage/FairMessage.java b/src/main/java/com/tianpengtech/common/model/fairmessage/FairMessage.java
index 40d8989..7a97010 100644
--- a/src/main/java/com/tianpengtech/common/model/fairmessage/FairMessage.java
+++ b/src/main/java/com/tianpengtech/common/model/fairmessage/FairMessage.java
@@ -13,7 +13,7 @@ public class FairMessage extends AbstractBaseModel< FairMessage > {
 	 */
 	private static final long serialVersionUID = 1L;
 	public static final FairMessage dao = new FairMessage();
-
+	public static final String CACHE_NAME="fair_message_cache";
 
 		public static final String ID ="id"; //
 		public static final String WH_ID ="wh_id"; //网红ID
@@ -23,6 +23,8 @@ public class FairMessage extends AbstractBaseModel< FairMessage > {
 		public static final String CREATE_TIME ="create_time"; //
 
 
+	public static final String ISREAD_READ="1"; //消息已读
+	public static final String ISREAD_UNREAD="0"; //消息未读
 	@Override
 	public String tableName() {
 		return "fair_wh_message";
diff --git a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
index 0ed7a5c..6869067 100644
--- a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
+++ b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
@@ -4,6 +4,7 @@ import com.jfinal.config.Routes;
 import com.tianpengtech.front.mobile.common.intercepter.MobileRequestInterceptor;
 import com.tianpengtech.front.mobile.common.intercepter.TokenCheckInterceptor;
 import com.tianpengtech.front.mobile.login.MobileLoginController;
+import com.tianpengtech.front.mobile.message.MobileMessageController;
 
 /**
  * Created by ggd on 2017/7/15 0015.
@@ -16,6 +17,7 @@ public class MobileRoutes extends Routes {
 //        addInterceptor(new MobileRequestInterceptor()); //验证请求数据有效性
 //        addInterceptor(new TokenCheckInterceptor()); //验证登录用户token是否有效
 
-        add("/api/passport",MobileLoginController.class);
+        add("/api",MobileLoginController.class);
+        add("/api/msg",MobileMessageController.class);
     }
 }
diff --git a/src/main/java/com/tianpengtech/front/web/feedback/FeedBackValidator.java b/src/main/java/com/tianpengtech/front/web/feedback/FeedBackValidator.java
index 5d2cd5b..2dd7179 100644
--- a/src/main/java/com/tianpengtech/front/web/feedback/FeedBackValidator.java
+++ b/src/main/java/com/tianpengtech/front/web/feedback/FeedBackValidator.java
@@ -17,6 +17,7 @@ package com.tianpengtech.front.web.feedback;
 import com.jfinal.core.Controller;
 import com.jfinal.validate.Validator;
 import com.tianpengtech.common.util.IpKit;
+import com.tianpengtech.front.mobile.common.constant.Constant;
 import com.tianpengtech.front.web.passport.PassportService;
 
 /**
diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml
index c9e68e9..169fbe4 100644
--- a/src/main/resources/ehcache.xml
+++ b/src/main/resources/ehcache.xml
@@ -24,14 +24,14 @@
     
     <!-- 存放用户登录信息,过期时间 3600秒,用ehache替换session功能 -->
     <cache name="session"
-           maxElementsInMemory="10000"
-           maxElementsOnDisk="100000"
-           eternal="false"
-           timeToIdleSeconds="3600"
-           timeToLiveSeconds="0"
-           overflowToDisk="true"
-           diskPersistent="true"
-            />
+                     maxElementsInMemory="10000"
+                     maxElementsOnDisk="100000"
+                     eternal="false"
+                     timeToIdleSeconds="3600"
+                     timeToLiveSeconds="0"
+                     overflowToDisk="true"
+                     diskPersistent="true"
+/>
     <!--存放用户信息-->
     <cache name="user"
            maxElementsInMemory="10000"
@@ -222,4 +222,16 @@
            timeToLiveSeconds="1800"
            overflowToDisk="false">
     </cache>
+
+
+    <!--存放消息-->
+    <cache name="fair_message_cache"
+           maxElementsInMemory="10000"
+           maxElementsOnDisk="100000"
+           eternal="false"
+           timeToIdleSeconds="3600"
+           timeToLiveSeconds="0"
+           overflowToDisk="true"
+           diskPersistent="true"
+    />
 </ehcache>
\ No newline at end of file
-- 
Gitee


From 01bd4e52f0fb24717a7af507f4239f42aa6be8d7 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Mon, 24 Jul 2017 17:12:37 +0800
Subject: [PATCH 02/13] =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9B=B8=E5=85=B3API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../mobile/common/constant/Constant.java      |   2 +-
 .../front/mobile/common/util/UserUtil.java    |   4 +-
 .../mobile/login/MobileLoginService.java      |   7 +-
 .../front/mobile/message/MessageService.java  | 103 ++++++++++++++++++
 .../message/MobileMessageController.java      |  50 +++++++++
 .../front/web/passport/PassportService.java   |  56 ++++------
 .../web/passport/PassportWebController.java   |   1 +
 7 files changed, 187 insertions(+), 36 deletions(-)
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java

diff --git a/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java b/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java
index 8b2e34c..8949bde 100644
--- a/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java
+++ b/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java
@@ -8,5 +8,5 @@ public class Constant {
     public static final String DEFAULT_PASSWORD = "zxc@#@$6";
 
     public static final String REGEX_MOBILE = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$";
-    public static final String REGEX_INTERGER = "^\\d{6}$";
+    public static final String REGEX_INTERGER = "^\\d+$";
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/common/util/UserUtil.java b/src/main/java/com/tianpengtech/front/mobile/common/util/UserUtil.java
index 7d23cda..cf52b03 100644
--- a/src/main/java/com/tianpengtech/front/mobile/common/util/UserUtil.java
+++ b/src/main/java/com/tianpengtech/front/mobile/common/util/UserUtil.java
@@ -16,7 +16,7 @@ public class UserUtil {
      * @return
      */
     public static User getCurrentUser(String token, String source) {
-        User user = CacheKit.get(CACHE_NAME,"USER_CLIENT_" + token);
+        User user = CacheKit.get(CACHE_NAME,source.toUpperCase()+"_USER_CLIENT_" + token);
         if (user != null) {
             setCurrentUser( user, token, source);
         }else{
@@ -38,7 +38,7 @@ public class UserUtil {
          * 方式登陆
          * */
         //获取配置文件中的超时时间,并转换为秒
-        CacheKit.put(CACHE_NAME,"USER_CLIENT_"+token,user);
+        CacheKit.put(CACHE_NAME,source.toUpperCase()+"_USER_CLIENT_"+token,user);
     }
 
     /**
diff --git a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
index 083fc20..6b85e7d 100644
--- a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
@@ -2,6 +2,7 @@ package com.tianpengtech.front.mobile.login;
 
 
 import com.jfinal.kit.Ret;
+import com.tianpengtech.common.model.fair.Fair;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.constant.Constant;
 import com.tianpengtech.front.mobile.common.util.R;
@@ -41,6 +42,10 @@ public class MobileLoginService {
         if (user == null) {
             Ret r=passportService.reg(mobile, Constant.DEFAULT_PASSWORD,User.USER_TYPE_FAIR);
             if (r.isOk()){
+                long id= (long) r.get("id");
+                Fair fair = new Fair();
+                fair.set(Fair.ID,id);
+                fair.save();
                 user=loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
             }else{
                 return R.fail("注册失败");
@@ -53,7 +58,7 @@ public class MobileLoginService {
         String token = TokenUtil.getToken();
         UserUtil.setCurrentUser(user,token,source);
         loginService.createLoginLog(user.getLong(User.ID), loginIp,"mobile");
-        user.remove(User.DELETETAG).remove(User.USER_TYPE).remove(User.STATUS).remove(User.ID).remove(User.CREATE_TIME);
+        user.remove(User.DELETETAG).remove(User.USER_TYPE).remove(User.STATUS).remove(User.CREATE_TIME);
         R r=R.ok("登陆成功");
         r.p("user",user);
         r.p("token",token);
diff --git a/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java b/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
new file mode 100644
index 0000000..7bd06c4
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
@@ -0,0 +1,103 @@
+package com.tianpengtech.front.mobile.message;
+
+import com.jfinal.plugin.activerecord.Page;
+import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairmessage.FairMessage;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.web.fair.FairService;
+
+import java.util.List;
+
+/**
+ * Created by ggd on 2017/7/23 0023.
+ */
+public class MessageService {
+    public static MessageService me = new MessageService();
+    private static FairMessage fairMessage = new FairMessage();
+
+    /**
+     * 发送消息
+     * @param uid
+     * @param content
+     */
+    public R sendMessage(long uid,String content){
+        FairMessage fm = new FairMessage();
+        fm.set(FairMessage.WH_ID,uid);
+        fm.set(FairMessage.CONTENT,content);
+        fm.save();
+        return R.ok("发送成功");
+    }
+
+
+    /**
+     * 获取消息列表
+     * @param uid
+     */
+    public R messageList(int pageNum, int length, long uid){
+        String sql = String.format(" from %s where %s=? and %s=? order by %s desc,%s asc",fairMessage.tableName(),FairMessage.DELETETAG,FairMessage.WH_ID,FairMessage.CREATE_TIME,FairMessage.ISREAD);
+        Page<FairMessage> page=fairMessage.paginateByCache(FairMessage.CACHE_NAME,"fairMessage_"+pageNum+"_"+length,pageNum,length,"select *",sql,0,uid);
+        R r = R.ok("成功");
+        r.p("count",page.getTotalRow());
+        r.p("pageNum",page.getPageNumber());
+        List<FairMessage> list = page.getList();
+        list.forEach( f ->{
+            f.remove(FairMessage.WH_ID);
+            f.remove(FairMessage.DELETETAG);
+            String content=f.get(FairMessage.CONTENT);
+            f.remove(FairMessage.CONTENT);
+            f.put("content",handleContent(content));
+        });
+        r.p("list",list);
+        return r;
+    }
+
+    private String handleContent(String content){
+        int len = 30;
+        if (content.length()>len){
+            content=content.substring(0,30);
+            content+="...";
+            return content;
+        }else{
+            return content;
+        }
+    }
+
+    /**
+     * 获取消息详情
+     * @return
+     */
+    public R getMessage(String id,long uid){
+        String sql = String.format("select * from %s where %s=? and %s=? and %s=?",fairMessage.tableName(),FairMessage.DELETETAG,FairMessage.WH_ID,FairMessage.ID);
+        FairMessage fm=fairMessage.findFirst(sql,0,uid,id);
+        if (fm != null){
+            fm.remove(FairMessage.WH_ID);
+            fm.remove(FairMessage.DELETETAG);
+            fm.remove(FairMessage.ISREAD);
+            R r = R.ok("成功");
+            r.p("message",fm);
+            fm.set(FairMessage.ISREAD,FairMessage.ISREAD_READ);
+            fm.update();
+            return r;
+        }else{
+            return R.fail("消息不存在");
+        }
+    }
+
+    /**
+     * 某个用户是否有未读消息
+     * @param uid
+     * @return
+     */
+    public R isUnreadMsg(long uid){
+        String sql = String.format("select * from %s where %s = ? and %s = ? and %s = ?",fairMessage.tableName(),FairMessage.DELETETAG,FairMessage.ISREAD,FairMessage.WH_ID);
+        FairMessage fm=fairMessage.findFirst(sql,1,FairMessage.ISREAD_UNREAD,uid);
+        R r = R.ok("成功");
+        if (fm==null){
+            r.p("isread","false");
+        }else{
+            r.p("isread","true");
+        }
+        return r;
+    }
+
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java b/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java
new file mode 100644
index 0000000..7a1a5e8
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java
@@ -0,0 +1,50 @@
+package com.tianpengtech.front.mobile.message;
+
+import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.U;
+import com.tianpengtech.front.mobile.common.util.UserUtil;
+import com.tianpengtech.front.web.common.controller.BaseController;
+
+/**
+ * Created by ggd on 2017/7/23 0023.
+ */
+public class MobileMessageController extends BaseController {
+
+    private static MessageService messageService = new MessageService();
+    /**
+     * 获取消息列表
+     */
+    public void index(){
+        int pageNum = getParaToInt("pageNum",1);
+        int pageSize = getParaToInt("pageSize",5);
+        User user=UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=messageService.messageList(pageNum,pageSize,user.getLong(User.ID));
+        renderJson(r);
+    }
+
+    /**
+     * 获取消息详情
+     */
+    public void getMessage(){
+        String id=getPara("id");
+        if (!U.isInteger(id)){
+            renderJson(R.fail("数据格式不正确"));
+            return;
+        }
+        User user=UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=messageService.getMessage(id,user.getLong(User.ID));
+        renderJson(r);
+    }
+
+    /**
+     * 获取用户是否有未读消息
+     */
+    public void unRead(){
+        User user=UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=messageService.isUnreadMsg(user.getLong(User.ID));
+        renderJson(r);
+    }
+
+
+}
diff --git a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
index 3abb913..3b97b36 100644
--- a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
+++ b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
@@ -64,7 +64,7 @@ public class PassportService {
             user.set(User.USER_TYPE,User.USER_TYPE_FAIR);
         }
         if (user.save()) {
-            return Ret.ok();
+            return Ret.ok("id",user.get(User.ID));
         } else {
             return Ret.fail("msg", "注册失败,account 保存失败,请告知管理员");
         }
@@ -75,50 +75,42 @@ public class PassportService {
      */
     public Ret sendAuthCode(String mobile,String ip){
         boolean devModel = PropKit.getBoolean("devMode");
-        //如果是测试环境
-        if (devModel){
-            return Ret.ok("code","111111");
-        }else{
-            //防止恶意发送验证码
-            //缓存过期时间为5分钟, 5分钟内超过5次就不允许发送了
-            Integer count=CacheKit.get(User.AUTH_CODE_CACHENAME,ip+mobile+"_count");
-            if (null != count){
-                Integer errorCount = PropKit.getInt("authcode.error.count");
-                if (count>=errorCount){
-                    return Ret.fail("msg", "短信发送次数太频繁,请稍后再试");
-                }else{
-                    CacheKit.put(User.AUTH_CODE_CACHENAME,ip+mobile+"_count",++count);
-                }
+        //防止恶意发送验证码
+        //缓存过期时间为5分钟, 5分钟内超过5次就不允许发送了
+        Integer count=CacheKit.get(User.AUTH_CODE_CACHENAME,ip+mobile+"_count");
+        if (null != count){
+            Integer errorCount = PropKit.getInt("authcode.error.count");
+            if (count>=errorCount){
+                return Ret.fail("msg", "短信发送次数太频繁,请稍后再试");
+            }else{
+                CacheKit.put(User.AUTH_CODE_CACHENAME,ip+mobile+"_count",++count);
             }
-            //防止恶意发送验证码结束
-            int code=(int)((Math.random()*9+1)*100000);
-            CacheKit.put(User.AUTH_CODE_CACHENAME,ip+mobile,code);
+        }
+        //防止恶意发送验证码结束
+        int code=(int)((Math.random()*9+1)*100000);
+        CacheKit.put(User.AUTH_CODE_CACHENAME,ip+mobile,code);
+        if (!devModel){
             //发送短信验证码
+        }
 
+        return Ret.ok("code",code);
 
-            return Ret.ok("code",code);
-        }
     }
 
     /**
      * 验证手机验证码
      */
     public boolean authCode(String mobile,String ip,int code,boolean flag){
-        boolean devModel = PropKit.getBoolean("devMode");
-        //如果是测试环境
-        if (devModel){
+        int cacheCode=CacheKit.get(User.AUTH_CODE_CACHENAME,ip+mobile);
+        if (code==cacheCode){
+            if (flag){
+                CacheKit.remove(User.AUTH_CODE_CACHENAME,ip+mobile);
+            }
             return true;
         }else{
-            int cacheCode=CacheKit.get(User.AUTH_CODE_CACHENAME,ip+mobile);
-            if (code==cacheCode){
-                if (flag){
-                    CacheKit.remove(User.AUTH_CODE_CACHENAME,ip+mobile);
-                }
-                return true;
-            }else{
-                return false;
-            }
+            return false;
         }
+
     }
 
     /**
diff --git a/src/main/java/com/tianpengtech/front/web/passport/PassportWebController.java b/src/main/java/com/tianpengtech/front/web/passport/PassportWebController.java
index 2b00633..8f5b451 100644
--- a/src/main/java/com/tianpengtech/front/web/passport/PassportWebController.java
+++ b/src/main/java/com/tianpengtech/front/web/passport/PassportWebController.java
@@ -41,6 +41,7 @@ public class PassportWebController extends BaseController {
     @Before(PassportValidator.class)
     public void save() {
         Ret ret = srv.reg(getPara("mobile"), getPara("password"),User.USER_TYPE_PROV);
+        ret.remove("id");
         renderJson(ret);
     }
 
-- 
Gitee


From d8571a9a023ad9ffced1d19ccb52596acc55d0e4 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Tue, 25 Jul 2017 17:33:04 +0800
Subject: [PATCH 03/13] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AFAPI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/tianpengtech/common/MyConfig.java     |   4 +-
 .../common/generator/app/Generator.java       |   2 +-
 .../tianpengtech/common/model/fair/Fair.java  |   5 +
 .../common/model/fairext/FairExt.java         |  38 ++++
 .../front/mobile/MobileRoutes.java            |   6 +-
 .../passport/MobilePassportController.java    |  62 ++++++
 .../passport/MobilePassportService.java       | 195 ++++++++++++++++++
 .../passport/MobilePassportValidator.java     |  76 +++++++
 .../mobile/region/MobileRegionController.java |  32 +++
 .../front/mobile/region/RegionService.java    |  31 +++
 .../front/web/fair/FairService.java           |   1 +
 .../front/web/main/MainWebController.java     |   4 +-
 .../front/web/task/TaskService.java           |   2 +-
 src/main/resources/a_little_config.txt        |  16 +-
 src/main/resources/ehcache.xml                |  11 +
 15 files changed, 472 insertions(+), 13 deletions(-)
 create mode 100644 src/main/java/com/tianpengtech/common/model/fairext/FairExt.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/region/MobileRegionController.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/region/RegionService.java

diff --git a/src/main/java/com/tianpengtech/common/MyConfig.java b/src/main/java/com/tianpengtech/common/MyConfig.java
index 6a96af8..1da8050 100644
--- a/src/main/java/com/tianpengtech/common/MyConfig.java
+++ b/src/main/java/com/tianpengtech/common/MyConfig.java
@@ -18,6 +18,7 @@ import com.tianpengtech.common.model.account.Account;
 import com.tianpengtech.common.model.authenticate.Authenticate;
 import com.tianpengtech.common.model.dictionary.Dictionary;
 import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairext.FairExt;
 import com.tianpengtech.common.model.fairmessage.FairMessage;
 import com.tianpengtech.common.model.feedback.FeedBack;
 import com.tianpengtech.common.model.message.Message;
@@ -138,6 +139,7 @@ public class MyConfig extends JFinalConfig {
         arp.addMapping(Opertion.dao.tableName(),Opertion.class);
         arp.addMapping(Session.dao.tableName(),Session.class);
         arp.addMapping(FeedBack.dao.tableName(),FeedBack.class);
+        arp.addMapping(FairExt.dao.tableName(),FairExt.class);
         EhCachePlugin cachePlugin = new EhCachePlugin();
         me.add(cachePlugin);
     }
@@ -159,7 +161,7 @@ public class MyConfig extends JFinalConfig {
     }
 
     public static void main(String[] args) {
-        JFinal.start("src/main/webapp", 8081, "/",5);
+        JFinal.start("src/main/webapp", 8081, "/");
     }
 
     @Override
diff --git a/src/main/java/com/tianpengtech/common/generator/app/Generator.java b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
index 6006cdf..ffe5d91 100644
--- a/src/main/java/com/tianpengtech/common/generator/app/Generator.java
+++ b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
@@ -232,7 +232,7 @@ public class Generator {
         Engine engine = engineConfig();
 //        Generator.excute(engine,".user", "User", "fair_user", "用户表");
 //        Generator.excute(engine,".authenticate", "Authenticate", "fair_user_authenticate", "用户认证表");
-        Generator.excute(engine,".fair", "FairMessage", "fair_wh_message", "网红消息表");
+        Generator.excute(engine,".fair", "FairExt", "fair_wh_ext", "网红扩展属性表");
 //        Generator.excute(engine,".wh", "Fair", "fair_wh", "网红表");
 //        Generator.excute(engine,".feedback", "FeedBack", "fair_feedback", "反馈表");
 
diff --git a/src/main/java/com/tianpengtech/common/model/fair/Fair.java b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
index a0fb2f4..a79acc1 100644
--- a/src/main/java/com/tianpengtech/common/model/fair/Fair.java
+++ b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
@@ -32,6 +32,7 @@ public class Fair extends AbstractBaseModel<Fair> {
 	public static final String ID = "id"; //
 	public static final String NICK_NAME = "nick_name"; // 昵称
 	public static final String AGE = "age"; // 年龄
+	public static final String GENDER = "gender"; // 性别
 	public static final String HEIGHT = "height"; // 身高
 	public static final String PROVINCE = "province"; // 省
 	public static final String CITY = "city"; // 市
@@ -55,6 +56,10 @@ public class Fair extends AbstractBaseModel<Fair> {
 	public static final int DELETE_STATUS_NO=0;
 
 
+	public static final int GENDER_WOMEN=0;
+	public static final int GENDER_MEN=1;
+
+
 	//网红属性对照表相关属性
 	public static final String FAIR_ATTR_RLT_TABLENAME="fair_wh_attr_relation"; //对照表 表名
 	public static final String FAIR_ATTR_TABLENAME="fair_wh_attr"; //属性表表 表名
diff --git a/src/main/java/com/tianpengtech/common/model/fairext/FairExt.java b/src/main/java/com/tianpengtech/common/model/fairext/FairExt.java
new file mode 100644
index 0000000..c663155
--- /dev/null
+++ b/src/main/java/com/tianpengtech/common/model/fairext/FairExt.java
@@ -0,0 +1,38 @@
+package com.tianpengtech.common.model.fairext;
+import com.tianpengtech.common.model.AbstractBaseModel;
+/**
+ *实体类名-网红扩展属性表
+ * fair_wh_ext
+ *
+ * @since Mon Jul 24 21:48:27 CST 2017
+ */
+public class FairExt extends AbstractBaseModel< FairExt > {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final FairExt dao = new FairExt();
+	public static final String CACHE_NAME = "fair_ext_cache";
+
+
+		public static final String ID ="id"; //
+		public static final String NAME ="name"; //名称
+		public static final String TYPE ="type"; //类型(兴趣爱好,擅长领域)
+		public static final String ISSYSTEM ="isSystem"; //是否是系统类型
+
+
+		public static final Integer TYPE_XQAH=1; //兴趣爱好
+		public static final Integer TYPE_SCLY=2; //擅长领域
+		public static final Integer TYPE_HONNER=3; //荣誉
+
+		public static final Integer ISSYSTEM_YES = 1; //是系统属性
+		public static final Integer ISSYSTEM_NO = 0; //个人自定义属性
+
+
+	@Override
+	public String tableName() {
+		return "fair_wh_ext";
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
index 6869067..92fdd36 100644
--- a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
+++ b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
@@ -5,6 +5,8 @@ import com.tianpengtech.front.mobile.common.intercepter.MobileRequestInterceptor
 import com.tianpengtech.front.mobile.common.intercepter.TokenCheckInterceptor;
 import com.tianpengtech.front.mobile.login.MobileLoginController;
 import com.tianpengtech.front.mobile.message.MobileMessageController;
+import com.tianpengtech.front.mobile.passport.MobilePassportController;
+import com.tianpengtech.front.mobile.region.MobileRegionController;
 
 /**
  * Created by ggd on 2017/7/15 0015.
@@ -15,9 +17,11 @@ public class MobileRoutes extends Routes {
     @Override
     public void config() {
 //        addInterceptor(new MobileRequestInterceptor()); //验证请求数据有效性
-//        addInterceptor(new TokenCheckInterceptor()); //验证登录用户token是否有效
+        addInterceptor(new TokenCheckInterceptor()); //验证登录用户token是否有效
 
         add("/api",MobileLoginController.class);
         add("/api/msg",MobileMessageController.class);
+        add("/api/region", MobileRegionController.class);
+        add("/api/passport", MobilePassportController.class);
     }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
new file mode 100644
index 0000000..a92e991
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
@@ -0,0 +1,62 @@
+package com.tianpengtech.front.mobile.passport;
+
+import com.jfinal.aop.Before;
+import com.jfinal.plugin.activerecord.tx.Tx;
+import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.UserUtil;
+import com.tianpengtech.front.web.common.controller.BaseController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by ggd on 2017/7/25 0025.
+ */
+public class MobilePassportController extends BaseController{
+
+    private static MobilePassportService ps = MobilePassportService.me;
+
+    /**
+     * 保存或更新个人信息
+     */
+    @Before({MobilePassportValidator.class,Tx.class})
+    public void saveOrUpdate() throws Exception {
+        Map<String,String> param  = new HashMap<>();
+        param.put("honners",getPara("honners"));
+        param.put("xqah",getPara("xqah"));
+        param.put("scly",getPara("scly"));
+        param.put("photo",getPara("photo"));
+        param.put("nick_name",getPara("nick_name"));
+        param.put("gender",getPara("gender"));
+        param.put("age",getPara("age"));
+        param.put("province",getPara("province"));
+        param.put("city",getPara("city"));
+        param.put("id",getPara("id"));
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        param.put("uid",user.get(User.ID));
+        try {
+            R r=ps.saveOrUpdate(param);
+            renderJson(r);
+        }catch (Exception ex){
+            renderJson(R.fail("失败"));
+            throw ex;
+        }
+    }
+
+    /**
+     * 获取兴趣爱好列表
+     */
+    public void getXQAH(){
+        R r=ps.getXQAH();
+        renderJson(r);
+    }
+
+    /**
+     * 获取擅长领域列表
+     */
+    public void getSCLY(){
+        R r=ps.getSCLY();
+        renderJson(r);
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
new file mode 100644
index 0000000..39cab5d
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
@@ -0,0 +1,195 @@
+package com.tianpengtech.front.mobile.passport;
+
+
+import com.jfinal.kit.Ret;
+import com.jfinal.kit.StrKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairext.FairExt;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.U;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by ggd on 2017/7/24 0024.
+ */
+public class MobilePassportService {
+    public static MobilePassportService me = new MobilePassportService();
+    private static FairExt fairExtDao = FairExt.dao;
+    /**
+     * 保存网红信息
+     * @param param
+     * @return
+     */
+    public R saveOrUpdate(Map<String,String> param) throws Exception{
+        try{
+            //获取荣誉信息
+            String honner= param.get("honners");
+            //获取兴趣爱好
+            String xqah=  param.get("xqah");
+            //获取擅长领域
+            String scly=  param.get("scly");
+
+            String photo =  param.get("photo");
+            String nickName =  param.get("nick_name");
+            String gender =  param.get("gender");
+            String age =  param.get("age");
+            String province =  param.get("province");
+            String city =  param.get("city");
+            Set<String> ext_set = new HashSet<>();
+            //保存荣誉信息
+            if (StrKit.notBlank(honner)){
+                String[] honners=honner.split(",");
+                for (String h: honners) {
+                    Ret ret = isExtExist(h,FairExt.TYPE_HONNER);
+                    if (ret.isOk()){
+                        ext_set.add(ret.getInt(FairExt.ID)+"");
+                        continue;
+                    }
+                    FairExt ext=new FairExt();
+                    ext.set(FairExt.ISSYSTEM,FairExt.ISSYSTEM_NO);
+                    ext.set(FairExt.NAME,h);
+                    ext.set(FairExt.TYPE,FairExt.TYPE_HONNER);
+                    ext.save();
+                    ext_set.add(ext.getInt(FairExt.ID)+"");
+                }
+            }
+            //保存兴趣爱好
+            if (StrKit.notBlank(xqah)){
+                String[] xqahs=xqah.split(",");
+                for (String h: xqahs) {
+                    if (U.isInteger(h)){
+                        ext_set.add(h);
+                        continue;
+                    }
+                    Ret ret = isExtExist(h,FairExt.TYPE_XQAH);
+                    if (ret.isOk()){
+                        ext_set.add(ret.getInt(FairExt.ID)+"");
+                        continue;
+                    }
+                    FairExt ext=new FairExt();
+                    ext.set(FairExt.ISSYSTEM,FairExt.ISSYSTEM_NO);
+                    ext.set(FairExt.NAME,h);
+                    ext.set(FairExt.TYPE,FairExt.TYPE_XQAH);
+                    ext.save();
+                    ext_set.add(ext.getInt(FairExt.ID)+"");
+                }
+            }
+            //保存擅长领域
+            if (StrKit.notBlank(scly)){
+                String[] sclys=scly.split(",");
+                for (String h: sclys) {
+                    if (U.isInteger(h)){
+                        ext_set.add(h);
+                        continue;
+                    }
+                    Ret ret = isExtExist(h,FairExt.TYPE_SCLY);
+                    if (ret.isOk()){
+                        ext_set.add(ret.getInt(FairExt.ID)+"");
+                        continue;
+                    }
+                    FairExt ext=new FairExt();
+                    ext.set(FairExt.ISSYSTEM,FairExt.ISSYSTEM_NO);
+                    ext.set(FairExt.NAME,h);
+                    ext.set(FairExt.TYPE,FairExt.TYPE_SCLY);
+                    ext.save();
+                    ext_set.add(ext.getInt(FairExt.ID)+"");
+                }
+            }
+
+            Fair fair = new Fair();
+            if (StrKit.notBlank(photo)){
+                fair.set(Fair.PHOTO,photo);
+            }
+            if (StrKit.notBlank(nickName)){
+                fair.set(Fair.NICK_NAME,nickName);
+            }
+            if (StrKit.notBlank(gender)){
+                fair.set(Fair.GENDER,gender);
+            }
+            if (StrKit.notBlank(age)){
+                fair.set(Fair.AGE,age);
+            }
+            if (StrKit.notBlank(province)){
+                fair.set(Fair.PROVINCE,province);
+            }
+            if (StrKit.notBlank(city)){
+                fair.set(Fair.CITY,city);
+            }
+
+
+
+            String id = param.get("id");
+            if (StrKit.notBlank(id)){
+                fair.set(Fair.ID,id);
+                fair.update();
+            }else{
+                fair.set(Fair.ID,param.get("uid"));
+                fair.save();
+                id=fair.getLong(Fair.ID)+"";
+            }
+            if (ext_set.size()>0){
+                Db.update("delete from fair_wh_ext_join where wh_id=? ",id);
+            }
+            //保存关联属性
+            final String wh_id=id;
+            ext_set.forEach( ext ->{
+                Record record = new Record();
+                record.set("wh_id",wh_id);
+                record.set("ext_id",ext);
+                Db.save("fair_wh_ext_join",record);
+            });
+            return R.ok("成功");
+        }catch (Exception e){
+            throw e;
+        }
+
+    }
+
+    /**
+     * 获取系统兴趣爱好
+     * @return
+     */
+    public R getXQAH(){
+        String sql = String.format("select %s,%s from %s where %s=? and %s=?",FairExt.ID,FairExt.NAME,fairExtDao.tableName(),FairExt.ISSYSTEM,FairExt.TYPE);
+        List<FairExt> list=fairExtDao.findByCache(FairExt.CACHE_NAME,"static_xqah",sql,FairExt.ISSYSTEM_YES,FairExt.TYPE_XQAH);
+        R r = R.ok("成功");
+        r.p("list",list);
+        return r;
+    }
+
+    /**
+     * 获取系统擅长领域
+     * @return
+     */
+    public R getSCLY(){
+        String sql = String.format("select %s,%s from %s where %s=? and %s=?",FairExt.ID,FairExt.NAME,fairExtDao.tableName(),FairExt.ISSYSTEM,FairExt.TYPE);
+        List<FairExt> list=fairExtDao.findByCache(FairExt.CACHE_NAME,"static_scly",sql,FairExt.ISSYSTEM_YES,FairExt.TYPE_SCLY);
+        R r = R.ok("成功");
+        r.p("list",list);
+        return r;
+    }
+
+    /**
+     * 判断自定义属性是否存在
+     * @param name
+     * @param type
+     * @return
+     */
+    private Ret isExtExist(String name, int type){
+        String sql=String.format("select id from %s where %s=? and %s=? and %s=?",fairExtDao.tableName(),FairExt.TYPE,FairExt.ISSYSTEM,FairExt.NAME);
+        FairExt ext=fairExtDao.findFirstByCache(FairExt.CACHE_NAME,"static_"+type+"_"+name,sql,type,FairExt.ISSYSTEM_NO,name);
+        if (ext==null){
+            return Ret.fail();
+        }else{
+            Ret r=Ret.ok();
+            r.put("id",ext.getInt(FairExt.ID));
+            return r;
+        }
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java
new file mode 100644
index 0000000..8506bd6
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java
@@ -0,0 +1,76 @@
+/**
+ * 请勿将俱乐部专享资源复制给其他人,保护知识产权即是保护我们所在的行业,进而保护我们自己的利益
+ * 即便是公司的同事,也请尊重 JFinal 作者的努力与付出,不要复制给同事
+ * 
+ * 如果你尚未加入俱乐部,请立即删除该项目,或者现在加入俱乐部:http://jfinal.com/club
+ * 
+ * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群,以及作者在俱乐部定期的分享与答疑,
+ * 价值远比仅仅拥有 jfinal club 项目源代码要大得多
+ * 
+ * JFinal 俱乐部是五年以来首次寻求外部资源的尝试,以便于有资源创建更加
+ * 高品质的产品与服务,为大家带来更大的价值,所以请大家多多支持,不要将
+ * 首次的尝试扼杀在了摇篮之中
+ */
+
+package com.tianpengtech.front.mobile.passport;
+
+import com.jfinal.core.Controller;
+import com.jfinal.kit.StrKit;
+import com.jfinal.validate.Validator;
+import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.common.util.IpKit;
+import com.tianpengtech.front.mobile.common.constant.Constant;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.web.passport.PassportService;
+
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 验证网红信息
+ */
+public class MobilePassportValidator extends Validator {
+
+
+
+	protected void validate(Controller c) {
+
+		String nickName = c.getPara("nick_name");
+		String gender =  c.getPara("gender");
+		String age =  c.getPara("age");
+		String province =  c.getPara("province");
+		String city =  c.getPara("city");
+		if (StrKit.notBlank(nickName)){
+			validateString("nick_name",1,10,"nickNameError","昵称应在1-10位之间");
+		}
+		if (StrKit.notBlank(gender)){
+			validateInteger("gender",-1,2,"genderError","性别不正确");
+		}
+		if (StrKit.notBlank(age)){
+			validateInteger("age",0,100,"ageError","年龄不正确");
+		}
+		if (StrKit.notBlank(province)){
+			validateInteger("province",0,999999999,"provinceError","省份不正确");
+		}
+		if (StrKit.notBlank(city)){
+			validateInteger("province",0,999999999,"provinceError","市区不正确不正确");
+		}
+
+	}
+
+	protected void handleError(Controller c) {
+		R r = R.fail("失败");
+		Enumeration<String> s=c.getAttrNames();
+		while (s.hasMoreElements()){
+			String key=s.nextElement();
+			r.p(key,c.getAttr(key));
+		}
+		c.renderJson(r);
+	}
+
+
+
+}
+
diff --git a/src/main/java/com/tianpengtech/front/mobile/region/MobileRegionController.java b/src/main/java/com/tianpengtech/front/mobile/region/MobileRegionController.java
new file mode 100644
index 0000000..576761e
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/region/MobileRegionController.java
@@ -0,0 +1,32 @@
+package com.tianpengtech.front.mobile.region;
+
+import com.jfinal.kit.StrKit;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.web.common.controller.BaseController;
+
+/**
+ * Created by ggd on 2017/7/24 0024.
+ */
+public class MobileRegionController extends BaseController {
+
+    private static RegionService service = RegionService.me;
+    /**
+     *  省列表
+     */
+    public void index(){
+        renderJson(service.getProvince());
+    }
+
+
+    /**
+     * 获取省下的市
+     */
+    public void getCity(){
+        String id=getPara("id");
+        if (StrKit.isBlank(id)){
+            renderJson(R.fail("id不能为空"));
+            return;
+        }
+        renderJson(service.getCity(Long.parseLong(id)));
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/region/RegionService.java b/src/main/java/com/tianpengtech/front/mobile/region/RegionService.java
new file mode 100644
index 0000000..43cc284
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/region/RegionService.java
@@ -0,0 +1,31 @@
+package com.tianpengtech.front.mobile.region;
+
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.front.mobile.common.util.R;
+
+import java.util.List;
+
+/**
+ * Created by ggd on 2017/7/24 0024.
+ */
+public class RegionService {
+    public static RegionService me = new RegionService();
+
+
+    public R getProvince(){
+        List<Record> list=Db.findByCache(Fair.FAIR_CACHE_NAME,Fair.FAIR_CACHE_REGION,"select REGION_ID,REGION_NAME from region where PARENT_ID=1");
+        R r = R.ok("成功");
+        r.p("province",list);
+        return r;
+    }
+
+
+    public R getCity(long id){
+        List<Record> list=Db.findByCache(Fair.FAIR_CACHE_NAME,Fair.FAIR_CACHE_REGION+id,"select REGION_ID,REGION_NAME from region where PARENT_ID=?",id);
+        R r = R.ok("成功");
+        r.p("city",list);
+        return r;
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/web/fair/FairService.java b/src/main/java/com/tianpengtech/front/web/fair/FairService.java
index 74f7da0..e954a02 100644
--- a/src/main/java/com/tianpengtech/front/web/fair/FairService.java
+++ b/src/main/java/com/tianpengtech/front/web/fair/FairService.java
@@ -9,6 +9,7 @@ import com.tianpengtech.common.model.task.Task;
 import com.tianpengtech.common.model.task.TaskWh;
 import com.tianpengtech.common.search.EqualCondition;
 import com.tianpengtech.common.search.LikeCondition;
+import com.tianpengtech.common.search.NotEqualCondition;
 import com.tianpengtech.common.search.QueryConstructor;
 
 import java.util.ArrayList;
diff --git a/src/main/java/com/tianpengtech/front/web/main/MainWebController.java b/src/main/java/com/tianpengtech/front/web/main/MainWebController.java
index 09e00ef..10a4687 100644
--- a/src/main/java/com/tianpengtech/front/web/main/MainWebController.java
+++ b/src/main/java/com/tianpengtech/front/web/main/MainWebController.java
@@ -26,7 +26,9 @@ public class MainWebController extends BaseController {
     	
     	String sql="select * from fair_message order by id desc limit 1";
     	Record record = Db.findFirst(sql);
-    	record.set("create_time", DateUtils.formateData(record.getDate("create_time"), DateUtils.YYMMDDHHMMSS_FORMAT));
+        if (record!=null){
+            record.set("create_time", DateUtils.formateData(record.getDate("create_time"), DateUtils.YYMMDDHHMMSS_FORMAT));
+        }
     	setAttr("record",record);
         renderTemplate(Page.MAIN);
     }
diff --git a/src/main/java/com/tianpengtech/front/web/task/TaskService.java b/src/main/java/com/tianpengtech/front/web/task/TaskService.java
index 4056b89..7cdcead 100644
--- a/src/main/java/com/tianpengtech/front/web/task/TaskService.java
+++ b/src/main/java/com/tianpengtech/front/web/task/TaskService.java
@@ -288,7 +288,7 @@ public class TaskService {
         List<Object> param=new ArrayList<>();
         String s = "select *,task.status as status,task.id as id ";
         StringBuffer sql= new StringBuffer(" from " + taskDao.tableName() + " task left join " + TaskWh.dao.tableName() + " wh on task." + Task.ID + "=wh." + TaskWh.TASK_ID +" left join "+Fair.dao.tableName()+" fair on fair."+Fair.ID+"=wh."+TaskWh.WH_ID);
-        sql.append(" where task." + Task.DELETETAG+"=? and task."+Task.CREATE_USER+"=? " );
+        sql.append(" where task." + Task.DELETETAG+"=? and task."+Task.CREATE_USER+"=? and task."+Task.STATUS+"!="+Task.STATUS_WAIT );
         param.add(Task.DELETE_STATUS_NO);
         param.add(params.get("user"));
         if (params!=null) {
diff --git a/src/main/resources/a_little_config.txt b/src/main/resources/a_little_config.txt
index 591775f..356599d 100644
--- a/src/main/resources/a_little_config.txt
+++ b/src/main/resources/a_little_config.txt
@@ -1,13 +1,13 @@
-#jdbcUrl = jdbc:mysql://123.56.186.144:3306/bbt-test?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
-#user = bbt
-#password =bbt123
-#devMode = true
-
-jdbcUrl = jdbc:mysql://rm-bp12tm7y208td7cm9o.mysql.rds.aliyuncs.com:3306/yancolad?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
-user = adtest
-password =ad--Test
+jdbcUrl = jdbc:mysql://123.56.186.144:3306/bbt-test?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
+user = bbt
+password =bbt123
 devMode = true
 
+#jdbcUrl = jdbc:mysql://rm-bp12tm7y208td7cm9o.mysql.rds.aliyuncs.com:3306/yancolad?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
+#user = adtest
+#password =ad--Test
+#devMode = true
+
 ##这个路径请定位到项目中的view文件夹所在的文件夹的路径(WEB-INF/view)
 codeBaseTemplatePath=E:/project/fair/src/main/webapp/WEB-INF/view
 
diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml
index 169fbe4..188ce9a 100644
--- a/src/main/resources/ehcache.xml
+++ b/src/main/resources/ehcache.xml
@@ -234,4 +234,15 @@
            overflowToDisk="true"
            diskPersistent="true"
     />
+
+    <!--存放网红扩展属性-->
+    <cache name="fair_ext_cache"
+           maxElementsInMemory="10000"
+           maxElementsOnDisk="100000"
+           eternal="false"
+           timeToIdleSeconds="86400"
+           timeToLiveSeconds="0"
+           overflowToDisk="true"
+           diskPersistent="true"
+    />
 </ehcache>
\ No newline at end of file
-- 
Gitee


From 1d4d118e1fcbe99e545c4fb08c3935ad8010f0b2 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Wed, 26 Jul 2017 15:15:26 +0800
Subject: [PATCH 04/13] =?UTF-8?q?=E9=93=B6=E8=A1=8C=E5=8D=A1API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/tianpengtech/common/MyConfig.java     |  2 +
 .../common/generator/app/Generator.java       |  2 +-
 .../tianpengtech/common/model/fair/Fair.java  | 10 +++
 .../common/model/fairbankno/FairBankno.java   | 33 ++++++++++
 .../common/model/moneylog/MoneyLog.java       |  5 ++
 .../front/mobile/MobileRoutes.java            |  2 +
 .../mobile/bankno/MobileBanknoController.java | 47 ++++++++++++++
 .../mobile/bankno/MobileBanknoService.java    | 58 +++++++++++++++++
 .../mobile/bankno/MobileBanknoValidator.java  | 65 +++++++++++++++++++
 .../front/mobile/common/util/R.java           |  6 ++
 .../passport/MobilePassportController.java    | 10 +++
 .../passport/MobilePassportService.java       | 33 ++++++++++
 src/main/resources/ehcache.xml                | 10 +++
 13 files changed, 282 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/com/tianpengtech/common/model/fairbankno/FairBankno.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoController.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoValidator.java

diff --git a/src/main/java/com/tianpengtech/common/MyConfig.java b/src/main/java/com/tianpengtech/common/MyConfig.java
index 1da8050..23240c2 100644
--- a/src/main/java/com/tianpengtech/common/MyConfig.java
+++ b/src/main/java/com/tianpengtech/common/MyConfig.java
@@ -18,6 +18,7 @@ import com.tianpengtech.common.model.account.Account;
 import com.tianpengtech.common.model.authenticate.Authenticate;
 import com.tianpengtech.common.model.dictionary.Dictionary;
 import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairbankno.FairBankno;
 import com.tianpengtech.common.model.fairext.FairExt;
 import com.tianpengtech.common.model.fairmessage.FairMessage;
 import com.tianpengtech.common.model.feedback.FeedBack;
@@ -140,6 +141,7 @@ public class MyConfig extends JFinalConfig {
         arp.addMapping(Session.dao.tableName(),Session.class);
         arp.addMapping(FeedBack.dao.tableName(),FeedBack.class);
         arp.addMapping(FairExt.dao.tableName(),FairExt.class);
+        arp.addMapping(FairBankno.dao.tableName(),FairBankno.class);
         EhCachePlugin cachePlugin = new EhCachePlugin();
         me.add(cachePlugin);
     }
diff --git a/src/main/java/com/tianpengtech/common/generator/app/Generator.java b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
index ffe5d91..9aca556 100644
--- a/src/main/java/com/tianpengtech/common/generator/app/Generator.java
+++ b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
@@ -232,7 +232,7 @@ public class Generator {
         Engine engine = engineConfig();
 //        Generator.excute(engine,".user", "User", "fair_user", "用户表");
 //        Generator.excute(engine,".authenticate", "Authenticate", "fair_user_authenticate", "用户认证表");
-        Generator.excute(engine,".fair", "FairExt", "fair_wh_ext", "网红扩展属性表");
+        Generator.excute(engine,".fair", "FairBankno", "fair_wh_bankno", "网红银行卡表");
 //        Generator.excute(engine,".wh", "Fair", "fair_wh", "网红表");
 //        Generator.excute(engine,".feedback", "FeedBack", "fair_feedback", "反馈表");
 
diff --git a/src/main/java/com/tianpengtech/common/model/fair/Fair.java b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
index a79acc1..ebbf0f9 100644
--- a/src/main/java/com/tianpengtech/common/model/fair/Fair.java
+++ b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
@@ -3,6 +3,7 @@ package com.tianpengtech.common.model.fair;
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Record;
 import com.tianpengtech.common.model.AbstractBaseModel;
+import com.tianpengtech.common.model.fairext.FairExt;
 import com.tianpengtech.common.model.task.Task;
 import com.tianpengtech.common.model.task.TaskWh;
 
@@ -203,6 +204,15 @@ public class Fair extends AbstractBaseModel<Fair> {
 		}
 	}
 
+	/**
+	 * 获取荣耀信息
+	 * @return
+	 */
+	public List<FairExt> getExt(Integer type){
+		String sql=String.format("select ext.id,ext.name from %s ext INNER JOIN fair_wh_ext_join jo on ext.id=jo.ext_id where  jo.wh_id=? and %s=?",FairExt.dao.tableName(),FairExt.TYPE);
+		return FairExt.dao.findByCache(FairExt.CACHE_NAME,"static_"+type+"_"+get(ID),sql,get(ID),type);
+	}
+
 	/**
 	 * 获取最近的两条任务信息
 	 * @return
diff --git a/src/main/java/com/tianpengtech/common/model/fairbankno/FairBankno.java b/src/main/java/com/tianpengtech/common/model/fairbankno/FairBankno.java
new file mode 100644
index 0000000..c91da48
--- /dev/null
+++ b/src/main/java/com/tianpengtech/common/model/fairbankno/FairBankno.java
@@ -0,0 +1,33 @@
+package com.tianpengtech.common.model.fairbankno;
+import com.tianpengtech.common.model.AbstractBaseModel;
+/**
+ *实体类名-网红银行卡表
+ * fair_wh_bankno
+ *
+ * @since Wed Jul 26 14:33:52 CST 2017
+ */
+public class FairBankno extends AbstractBaseModel< FairBankno > {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final FairBankno dao = new FairBankno();
+	public static final String CACHE_NAME = "fair_bankno_cache";
+
+
+		public static final String ID ="id"; //
+		public static final String WH_ID ="wh_id"; //网红ID
+		public static final String BANK ="bank"; //银行名称
+		public static final String BANK_NO ="bank_no"; //银行卡号
+		public static final String DELETETAG ="deletetag"; //删除标识
+		public static final String CREATE_TIME ="create_time"; //创建时间
+		public static final String REAL_NAME ="real_name"; //真实姓名
+
+
+	@Override
+	public String tableName() {
+		return "fair_wh_bankno";
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java b/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java
index 087f27e..efa16d8 100644
--- a/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java
+++ b/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java
@@ -22,8 +22,13 @@ public class MoneyLog extends AbstractBaseModel< MoneyLog > {
 		public static final String DELETETAG ="deletetag"; //删除标识
 		public static final String DESCRIPTION ="description"; //描述
 		public static final String TYPE ="type"; //类型
+		public static final String OPERID ="operid"; //关联ID
 
 
+	public static final Integer TYPE_TIXIAN =1; //提现 operid=提现表ID
+	public static final Integer TYPE_YAOQING =2; //邀请 operid=被邀请用户ID
+	public static final Integer TYPE_RENWU =3;	//任务 operid=任务ID
+
 	@Override
 	public String tableName() {
 		return "fair_wh_moneylog";
diff --git a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
index 92fdd36..a581bdd 100644
--- a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
+++ b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
@@ -1,6 +1,7 @@
 package com.tianpengtech.front.mobile;
 
 import com.jfinal.config.Routes;
+import com.tianpengtech.front.mobile.bankno.MobileBanknoController;
 import com.tianpengtech.front.mobile.common.intercepter.MobileRequestInterceptor;
 import com.tianpengtech.front.mobile.common.intercepter.TokenCheckInterceptor;
 import com.tianpengtech.front.mobile.login.MobileLoginController;
@@ -23,5 +24,6 @@ public class MobileRoutes extends Routes {
         add("/api/msg",MobileMessageController.class);
         add("/api/region", MobileRegionController.class);
         add("/api/passport", MobilePassportController.class);
+        add("/api/bankno", MobileBanknoController.class);
     }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoController.java b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoController.java
new file mode 100644
index 0000000..68bdba3
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoController.java
@@ -0,0 +1,47 @@
+package com.tianpengtech.front.mobile.bankno;
+
+import com.jfinal.aop.Before;
+import com.jfinal.plugin.activerecord.tx.Tx;
+import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.UserUtil;
+import com.tianpengtech.front.web.common.controller.BaseController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by ggd on 2017/7/26 0026.
+ */
+public class MobileBanknoController extends BaseController {
+    private static MobileBanknoService service = MobileBanknoService.me;
+
+    /**
+     * 保存银行卡信息
+     */
+    @Before({MobileBanknoValidator.class,Tx.class})
+    public void save(){
+        Map<String,String> param  = new HashMap<>();
+        param.put("bank",getPara("bank"));
+        param.put("bank_no",getPara("bank_no"));
+        param.put("real_name",getPara("real_name"));
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        param.put("id",user.getLong(User.ID)+"");
+        try {
+            R r=service.save(param);
+            renderJson(r);
+        } catch (Exception e) {
+            renderJson(R.fail("保存失败"));
+        }
+    }
+
+    /**
+     * 获取某个人的银行卡列表
+     */
+    public void banknoList(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=service.findBankno(user.getLong(User.ID));
+        renderJson(r);
+    }
+
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java
new file mode 100644
index 0000000..6a96ea4
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java
@@ -0,0 +1,58 @@
+package com.tianpengtech.front.mobile.bankno;
+
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.ehcache.CacheKit;
+import com.tianpengtech.common.model.fairbankno.FairBankno;
+import com.tianpengtech.front.mobile.common.util.R;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by ggd on 2017/7/26 0026.
+ */
+public class MobileBanknoService {
+    public static MobileBanknoService me = new MobileBanknoService();
+    private static FairBankno dao = FairBankno.dao;
+
+    /**
+     * 保存银行卡信息
+     * @param param
+     * @return
+     */
+    public R save(Map<String,String> param) throws Exception{
+        try{
+            String wh_id=param.get("id");
+            String bank=param.get("bank");
+            String bank_no=param.get("bank_no");
+            String real_name=param.get("real_name");
+            FairBankno fb = new FairBankno();
+            fb.set(FairBankno.WH_ID,wh_id);
+            fb.set(FairBankno.BANK,bank);
+            fb.set(FairBankno.BANK_NO,bank_no);
+            fb.set(FairBankno.REAL_NAME,real_name);
+            fb.save();
+            R r=R.ok("成功");
+            r.p("bankno",fb);
+            CacheKit.remove(FairBankno.CACHE_NAME,"bankno_"+wh_id);
+            return r;
+        }catch (Exception e){
+            e.printStackTrace();
+            throw e;
+        }
+    }
+
+    /**
+     *  获取某个人得银行卡列表
+     * @param id
+     * @return
+     */
+    public R findBankno(long id){
+        String sql = String.format("select %s,%s,%s from %s where %s=? and %s=?",FairBankno.ID,FairBankno.BANK,FairBankno.BANK_NO,dao.tableName(),FairBankno.DELETETAG,FairBankno.WH_ID);
+        List<FairBankno> list=dao.findByCache(FairBankno.CACHE_NAME,"bankno_"+id,sql,0,id);
+        R r = R.ok();
+        r.p("banknos",list);
+        return r;
+    }
+
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoValidator.java b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoValidator.java
new file mode 100644
index 0000000..331b149
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoValidator.java
@@ -0,0 +1,65 @@
+/**
+ * 请勿将俱乐部专享资源复制给其他人,保护知识产权即是保护我们所在的行业,进而保护我们自己的利益
+ * 即便是公司的同事,也请尊重 JFinal 作者的努力与付出,不要复制给同事
+ * 
+ * 如果你尚未加入俱乐部,请立即删除该项目,或者现在加入俱乐部:http://jfinal.com/club
+ * 
+ * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群,以及作者在俱乐部定期的分享与答疑,
+ * 价值远比仅仅拥有 jfinal club 项目源代码要大得多
+ * 
+ * JFinal 俱乐部是五年以来首次寻求外部资源的尝试,以便于有资源创建更加
+ * 高品质的产品与服务,为大家带来更大的价值,所以请大家多多支持,不要将
+ * 首次的尝试扼杀在了摇篮之中
+ */
+
+package com.tianpengtech.front.mobile.bankno;
+
+import com.jfinal.core.Controller;
+import com.jfinal.kit.StrKit;
+import com.jfinal.validate.Validator;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.U;
+
+import java.util.Enumeration;
+
+/**
+ * 验证网红信息
+ */
+public class MobileBanknoValidator extends Validator {
+
+
+
+	protected void validate(Controller c) {
+
+		String bank = c.getPara("bank");
+		String bank_no =  c.getPara("bank_no");
+		String real_name =  c.getPara("real_name");
+		if (StrKit.notBlank(bank)){
+			validateString("bank",1,10,"bankError","银行名称不正确");
+		}
+		if (StrKit.notBlank(bank_no)){
+			validateString("bank_no",10,30,"banknoError","银行卡号不正确");
+			if (!U.isInteger(bank_no)){
+				this.addError("banknoError","银行卡号格式不正确");
+			}
+		}
+		if (StrKit.notBlank(real_name)){
+			validateString("real_name",1,10,"realnamerror","真实姓名不正确");
+		}
+
+	}
+
+	protected void handleError(Controller c) {
+		R r = R.fail("失败");
+		Enumeration<String> s=c.getAttrNames();
+		while (s.hasMoreElements()){
+			String key=s.nextElement();
+			r.p(key,c.getAttr(key));
+		}
+		c.renderJson(r);
+	}
+
+
+
+}
+
diff --git a/src/main/java/com/tianpengtech/front/mobile/common/util/R.java b/src/main/java/com/tianpengtech/front/mobile/common/util/R.java
index fae2766..712f47f 100644
--- a/src/main/java/com/tianpengtech/front/mobile/common/util/R.java
+++ b/src/main/java/com/tianpengtech/front/mobile/common/util/R.java
@@ -23,6 +23,12 @@ public class R extends HashMap {
         r.put(MSG,msg);
         return r;
     }
+    public static R ok() {
+        R r = new R();
+        r.put(CODE,SUCCESS);
+        r.put(MSG,"成功");
+        return r;
+    }
 
     public static R fail(String msg) {
         R r = new R();
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
index a92e991..bfc15c5 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
@@ -59,4 +59,14 @@ public class MobilePassportController extends BaseController{
         R r=ps.getSCLY();
         renderJson(r);
     }
+
+    public void getFairInfo(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        if (user==null){
+            renderJson(R.fail("用户不存在"));
+            return;
+        }
+        R r=ps.getFairInfo(user.getLong(User.ID)+"");
+        renderJson(r);
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
index 39cab5d..fe2d86c 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
@@ -5,10 +5,12 @@ import com.jfinal.kit.Ret;
 import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.plugin.ehcache.CacheKit;
 import com.tianpengtech.common.model.fair.Fair;
 import com.tianpengtech.common.model.fairext.FairExt;
 import com.tianpengtech.front.mobile.common.util.R;
 import com.tianpengtech.front.mobile.common.util.U;
+import com.tianpengtech.front.web.fair.FairService;
 
 import java.util.HashSet;
 import java.util.List;
@@ -21,6 +23,7 @@ import java.util.Set;
 public class MobilePassportService {
     public static MobilePassportService me = new MobilePassportService();
     private static FairExt fairExtDao = FairExt.dao;
+    private static FairService fairService = new FairService();
     /**
      * 保存网红信息
      * @param param
@@ -46,6 +49,7 @@ public class MobilePassportService {
             if (StrKit.notBlank(honner)){
                 String[] honners=honner.split(",");
                 for (String h: honners) {
+                    h=h.trim();
                     Ret ret = isExtExist(h,FairExt.TYPE_HONNER);
                     if (ret.isOk()){
                         ext_set.add(ret.getInt(FairExt.ID)+"");
@@ -63,6 +67,7 @@ public class MobilePassportService {
             if (StrKit.notBlank(xqah)){
                 String[] xqahs=xqah.split(",");
                 for (String h: xqahs) {
+                    h=h.trim();
                     if (U.isInteger(h)){
                         ext_set.add(h);
                         continue;
@@ -84,6 +89,7 @@ public class MobilePassportService {
             if (StrKit.notBlank(scly)){
                 String[] sclys=scly.split(",");
                 for (String h: sclys) {
+                    h=h.trim();
                     if (U.isInteger(h)){
                         ext_set.add(h);
                         continue;
@@ -144,13 +150,40 @@ public class MobilePassportService {
                 record.set("ext_id",ext);
                 Db.save("fair_wh_ext_join",record);
             });
+            CacheKit.remove(FairExt.CACHE_NAME,"static_"+FairExt.TYPE_HONNER+"_"+wh_id);
+            CacheKit.remove(FairExt.CACHE_NAME,"static_"+FairExt.TYPE_XQAH+"_"+wh_id);
+            CacheKit.remove(FairExt.CACHE_NAME,"static_"+FairExt.TYPE_SCLY+"_"+wh_id);
             return R.ok("成功");
         }catch (Exception e){
+            e.printStackTrace();
             throw e;
         }
 
     }
 
+    /**
+     * 获取详情
+     * @param fairId
+     * @return
+     */
+    public R getFairInfo(String fairId){
+        Fair fair = fairService.findById(Integer.parseInt(fairId));
+        if (fair==null){
+            R r=R.ok("用户不存在");
+            r.p("fair","");
+            return r;
+        }
+        fair.remove(Fair.DELETETAG);
+        fair.remove(Fair.ID_CARD);
+        fair.put("xqah",fair.getExt(FairExt.TYPE_XQAH));
+        fair.put("scly",fair.getExt(FairExt.TYPE_SCLY));
+        fair.put("honner",fair.getExt(FairExt.TYPE_HONNER));
+        R r = R.ok("成功");
+        r.p("fair",fair);
+        return r;
+    }
+
+
     /**
      * 获取系统兴趣爱好
      * @return
diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml
index 188ce9a..b1ea61e 100644
--- a/src/main/resources/ehcache.xml
+++ b/src/main/resources/ehcache.xml
@@ -234,6 +234,16 @@
            overflowToDisk="true"
            diskPersistent="true"
     />
+    <!--银行卡信息-->
+    <cache name="fair_bankno_cache"
+           maxElementsInMemory="10000"
+           maxElementsOnDisk="100000"
+           eternal="false"
+           timeToIdleSeconds="3600"
+           timeToLiveSeconds="0"
+           overflowToDisk="true"
+           diskPersistent="true"
+    />
 
     <!--存放网红扩展属性-->
     <cache name="fair_ext_cache"
-- 
Gitee


From f23df6fb3f004cafdea9fb72a550c50d715a8a9e Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Thu, 27 Jul 2017 11:17:53 +0800
Subject: [PATCH 05/13] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=BA=A4=E6=98=93?=
 =?UTF-8?q?=E5=AF=86=E7=A0=81API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../tianpengtech/common/model/fair/Fair.java  |  9 +++
 .../mobile/login/MobileLoginService.java      | 58 ++++++++++--------
 .../front/mobile/message/MessageService.java  | 19 ++++--
 .../passport/MobilePassportController.java    | 36 +++++++++++
 .../passport/MobilePassportService.java       | 61 +++++++++++++++++++
 .../front/web/passport/PassportService.java   |  6 +-
 6 files changed, 155 insertions(+), 34 deletions(-)

diff --git a/src/main/java/com/tianpengtech/common/model/fair/Fair.java b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
index ebbf0f9..2ff5cd0 100644
--- a/src/main/java/com/tianpengtech/common/model/fair/Fair.java
+++ b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
@@ -47,6 +47,8 @@ public class Fair extends AbstractBaseModel<Fair> {
 	public static final String MOIBILE="mobile"; //手机号码
 	public static final String PASS_WORD="password"; //密码
 	public static final String ID_CARD="id_card"; //身份证
+	public static final String REMIND_MSG="remind_msg"; //是否消息提醒
+	public static final String TRAN_PWD="tran_pwd"; //交易密码
 
 	
 	public static final int STATUS_APPROVING=1;
@@ -61,6 +63,13 @@ public class Fair extends AbstractBaseModel<Fair> {
 	public static final int GENDER_MEN=1;
 
 
+	public static final int REMIND_MSG_ON=1; //消息提醒
+	public static final int REMIND_MSG_OFF=0; //消息不提醒
+
+
+
+
+
 	//网红属性对照表相关属性
 	public static final String FAIR_ATTR_RLT_TABLENAME="fair_wh_attr_relation"; //对照表 表名
 	public static final String FAIR_ATTR_TABLENAME="fair_wh_attr"; //属性表表 表名
diff --git a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
index 6b85e7d..e76dd71 100644
--- a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
@@ -35,34 +35,40 @@ public class MobileLoginService {
      * 登录
      */
     public R login(String mobile, int code, String loginIp,String source) {
-        if(!passportService.authCode(mobile,loginIp,code,true)){
-            return R.fail("验证码不正确");
-        }
-        User user = loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
-        if (user == null) {
-            Ret r=passportService.reg(mobile, Constant.DEFAULT_PASSWORD,User.USER_TYPE_FAIR);
-            if (r.isOk()){
-                long id= (long) r.get("id");
-                Fair fair = new Fair();
-                fair.set(Fair.ID,id);
-                fair.save();
-                user=loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
-            }else{
-                return R.fail("注册失败");
+        try{
+            if(!passportService.authCode(mobile,loginIp,code,true)){
+                return R.fail("验证码不正确");
             }
+            User user = loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
+            if (user == null) {
+                Ret r=passportService.reg(mobile, Constant.DEFAULT_PASSWORD,User.USER_TYPE_FAIR);
+                if (r.isOk()){
+                    long id= (long) r.get("id");
+                    Fair fair = new Fair();
+                    fair.set(Fair.ID,id);
+                    fair.save();
+                    user=loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
+                }else{
+                    return R.fail("注册失败");
+                }
+            }
+            if (user.isStatusLockId()) {
+                return R.fail("账号已被锁定");
+            }
+            user.removeSensitiveInfo();  // 移除 password 与 salt 属性值
+            String token = TokenUtil.getToken();
+            UserUtil.setCurrentUser(user,token,source);
+            loginService.createLoginLog(user.getLong(User.ID), loginIp,"mobile");
+            user.remove(User.DELETETAG).remove(User.USER_TYPE).remove(User.STATUS).remove(User.CREATE_TIME);
+            R r=R.ok("登陆成功");
+            r.p("user",user);
+            r.p("token",token);
+            return r;
+        }catch (Exception e){
+            e.printStackTrace();
+            return R.fail("登陆失败");
         }
-        if (user.isStatusLockId()) {
-            return R.fail("账号已被锁定");
-        }
-        user.removeSensitiveInfo();  // 移除 password 与 salt 属性值
-        String token = TokenUtil.getToken();
-        UserUtil.setCurrentUser(user,token,source);
-        loginService.createLoginLog(user.getLong(User.ID), loginIp,"mobile");
-        user.remove(User.DELETETAG).remove(User.USER_TYPE).remove(User.STATUS).remove(User.CREATE_TIME);
-        R r=R.ok("登陆成功");
-        r.p("user",user);
-        r.p("token",token);
-        return r;
+
     }
 
     /**
diff --git a/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java b/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
index 7bd06c4..970b2d5 100644
--- a/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
@@ -14,7 +14,7 @@ import java.util.List;
 public class MessageService {
     public static MessageService me = new MessageService();
     private static FairMessage fairMessage = new FairMessage();
-
+    private static FairService fs = new FairService();
     /**
      * 发送消息
      * @param uid
@@ -89,13 +89,22 @@ public class MessageService {
      * @return
      */
     public R isUnreadMsg(long uid){
-        String sql = String.format("select * from %s where %s = ? and %s = ? and %s = ?",fairMessage.tableName(),FairMessage.DELETETAG,FairMessage.ISREAD,FairMessage.WH_ID);
-        FairMessage fm=fairMessage.findFirst(sql,1,FairMessage.ISREAD_UNREAD,uid);
         R r = R.ok("成功");
-        if (fm==null){
+        Fair fair=fs.findById(Integer.parseInt(uid+""));
+        int remind=1;
+        if (fair!=null){
+            remind=fair.getInt(Fair.REMIND_MSG);
+        }
+        if (remind==Fair.REMIND_MSG_OFF){
             r.p("isread","false");
         }else{
-            r.p("isread","true");
+            String sql = String.format("select * from %s where %s = ? and %s = ? and %s = ?",fairMessage.tableName(),FairMessage.DELETETAG,FairMessage.ISREAD,FairMessage.WH_ID);
+            FairMessage fm=fairMessage.findFirst(sql,1,FairMessage.ISREAD_UNREAD,uid);
+            if (fm==null){
+                r.p("isread","false");
+            }else{
+                r.p("isread","true");
+            }
         }
         return r;
     }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
index bfc15c5..684a486 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
@@ -1,6 +1,7 @@
 package com.tianpengtech.front.mobile.passport;
 
 import com.jfinal.aop.Before;
+import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.tx.Tx;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.util.R;
@@ -60,6 +61,9 @@ public class MobilePassportController extends BaseController{
         renderJson(r);
     }
 
+    /**
+     * 获取网红详情
+     */
     public void getFairInfo(){
         User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
         if (user==null){
@@ -69,4 +73,36 @@ public class MobilePassportController extends BaseController{
         R r=ps.getFairInfo(user.getLong(User.ID)+"");
         renderJson(r);
     }
+
+    /**
+     * 设置或修改交易密码
+     */
+    public void setTranPwd(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        String old_pwd=getPara("old_pwd");
+        String new_pwd=getPara("new_pwd");
+        if (StrKit.isBlank(old_pwd) && StrKit.isBlank(new_pwd)){
+            renderJson(R.fail("密码不能为空"));
+            return;
+        }
+        long id = user.getLong(User.ID);
+        R r=ps.setTranPwd(id,old_pwd,new_pwd);
+        renderJson(r);
+    }
+
+    /**
+     * 验证旧交易密码
+     */
+    public void checkTranPwd(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        String old_pwd=getPara("old_pwd");
+        if (StrKit.isBlank(old_pwd)){
+            renderJson(R.fail("密码不能为空"));
+            return;
+        }
+        long id = user.getLong(User.ID);
+        R r=ps.checkTranPwd(id,old_pwd);
+        renderJson(r);
+    }
+
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
index fe2d86c..82ea916 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
@@ -1,6 +1,7 @@
 package com.tianpengtech.front.mobile.passport;
 
 
+import com.jfinal.kit.HashKit;
 import com.jfinal.kit.Ret;
 import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.Db;
@@ -8,6 +9,7 @@ import com.jfinal.plugin.activerecord.Record;
 import com.jfinal.plugin.ehcache.CacheKit;
 import com.tianpengtech.common.model.fair.Fair;
 import com.tianpengtech.common.model.fairext.FairExt;
+import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.util.R;
 import com.tianpengtech.front.mobile.common.util.U;
 import com.tianpengtech.front.web.fair.FairService;
@@ -24,6 +26,7 @@ public class MobilePassportService {
     public static MobilePassportService me = new MobilePassportService();
     private static FairExt fairExtDao = FairExt.dao;
     private static FairService fairService = new FairService();
+    private static FairService fs = new FairService();
     /**
      * 保存网红信息
      * @param param
@@ -175,6 +178,9 @@ public class MobilePassportService {
         }
         fair.remove(Fair.DELETETAG);
         fair.remove(Fair.ID_CARD);
+        String tran=fair.get(Fair.TRAN_PWD);
+        fair.remove(Fair.TRAN_PWD);
+        fair.put(Fair.TRAN_PWD,tran==null?"0":"1"); //交易密码 0 未设置 1已设置
         fair.put("xqah",fair.getExt(FairExt.TYPE_XQAH));
         fair.put("scly",fair.getExt(FairExt.TYPE_SCLY));
         fair.put("honner",fair.getExt(FairExt.TYPE_HONNER));
@@ -225,4 +231,59 @@ public class MobilePassportService {
             return r;
         }
     }
+
+    /**
+     * 设置交易密码
+     * @return
+     */
+    public R setTranPwd(long uid,String old_pwd,String new_pwd){
+        Fair fair=fs.findById(Integer.parseInt(uid+""));
+        User user = User.dao.findById(uid);
+        //如果旧密码为空则是设置交易密码
+        String tranPwd=fair.get(Fair.TRAN_PWD);
+        if (StrKit.isBlank(tranPwd)){
+            String salt = user.get(User.SALT);
+            String hashedPass = HashKit.sha256(salt + new_pwd);
+            fair.set(Fair.TRAN_PWD,hashedPass);
+            fair.update();
+            CacheKit.remove(Fair.FAIR_CACHE_NAME,"fair_info_"+uid);
+            return R.ok();
+        }else{
+            if (StrKit.isBlank(old_pwd)){
+                return R.fail("旧密码不能为空");
+            }else{
+                String salt = user.get(User.SALT);
+                String hashedPass = HashKit.sha256(salt + old_pwd);
+                if (tranPwd.toUpperCase().equals(hashedPass.toUpperCase())){
+                    String hashedPass_new = HashKit.sha256(salt + new_pwd);
+                    fair.set(Fair.TRAN_PWD,hashedPass_new);
+                    fair.update();
+                    CacheKit.remove(Fair.FAIR_CACHE_NAME,"fair_info_"+uid);
+                    return R.ok();
+                }else{
+                    return R.fail("旧密码不正确");
+                }
+            }
+        }
+    }
+
+    /**
+     * 验证旧交易密码是否正确
+     * @param uid
+     * @param old_pwd
+     * @return
+     */
+    public R checkTranPwd(long uid,String old_pwd){
+        Fair fair=fs.findById(Integer.parseInt(uid+""));
+        User user = User.dao.findById(uid);
+        String tranPwd=fair.get(Fair.TRAN_PWD);
+        String salt = user.get(User.SALT);
+        String hashedPass = HashKit.sha256(salt + old_pwd);
+        if (tranPwd.toUpperCase().equals(hashedPass.toUpperCase())){
+            return R.ok("密码正确");
+        }else{
+            return R.fail("密码错误");
+        }
+    }
+
 }
diff --git a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
index 503d3b6..432a91e 100644
--- a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
+++ b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
@@ -56,12 +56,12 @@ public class PassportService {
         // 创建账户
         User user = new User();
         user.set(User.MOBILE,mobile);
+        // 密码加盐 hash
+        String salt = HashKit.generateSaltForSha256();
+        user.set(User.SALT,salt);
         if (user_type==User.USER_TYPE_PROV){
-            // 密码加盐 hash
-            String salt = HashKit.generateSaltForSha256();
             password = HashKit.sha256(salt + password);
             user.set(User.PASSWORD,password);
-            user.set(User.SALT,salt);
         }
         user.set(User.STATUS, User.USER_STATUS_NORMAL);
         user.set(User.PHOTO,User.DEFAULT_PHOTO);
-- 
Gitee


From be948385690c5e5642ce3f69911e54b356abb3e9 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Thu, 27 Jul 2017 16:50:35 +0800
Subject: [PATCH 06/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=A4=E8=AF=81?=
 =?UTF-8?q?=E4=BF=A1=E6=81=AFAPI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/tianpengtech/common/MyConfig.java     |  2 +
 .../common/generator/app/Generator.java       |  2 +-
 .../common/model/fairauth/FairAuth.java       | 43 ++++++++++++
 .../passport/MobileFairAuthValidator.java     | 68 +++++++++++++++++++
 .../passport/MobilePassportController.java    | 26 +++++++
 .../passport/MobilePassportService.java       | 42 ++++++++++++
 .../passport/MobilePassportValidator.java     |  2 +-
 7 files changed, 183 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/com/tianpengtech/common/model/fairauth/FairAuth.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/passport/MobileFairAuthValidator.java

diff --git a/src/main/java/com/tianpengtech/common/MyConfig.java b/src/main/java/com/tianpengtech/common/MyConfig.java
index 23240c2..8116981 100644
--- a/src/main/java/com/tianpengtech/common/MyConfig.java
+++ b/src/main/java/com/tianpengtech/common/MyConfig.java
@@ -18,6 +18,7 @@ import com.tianpengtech.common.model.account.Account;
 import com.tianpengtech.common.model.authenticate.Authenticate;
 import com.tianpengtech.common.model.dictionary.Dictionary;
 import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairauth.FairAuth;
 import com.tianpengtech.common.model.fairbankno.FairBankno;
 import com.tianpengtech.common.model.fairext.FairExt;
 import com.tianpengtech.common.model.fairmessage.FairMessage;
@@ -142,6 +143,7 @@ public class MyConfig extends JFinalConfig {
         arp.addMapping(FeedBack.dao.tableName(),FeedBack.class);
         arp.addMapping(FairExt.dao.tableName(),FairExt.class);
         arp.addMapping(FairBankno.dao.tableName(),FairBankno.class);
+        arp.addMapping(FairAuth.dao.tableName(),FairAuth.class);
         EhCachePlugin cachePlugin = new EhCachePlugin();
         me.add(cachePlugin);
     }
diff --git a/src/main/java/com/tianpengtech/common/generator/app/Generator.java b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
index 9aca556..55c802a 100644
--- a/src/main/java/com/tianpengtech/common/generator/app/Generator.java
+++ b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
@@ -232,7 +232,7 @@ public class Generator {
         Engine engine = engineConfig();
 //        Generator.excute(engine,".user", "User", "fair_user", "用户表");
 //        Generator.excute(engine,".authenticate", "Authenticate", "fair_user_authenticate", "用户认证表");
-        Generator.excute(engine,".fair", "FairBankno", "fair_wh_bankno", "网红银行卡表");
+        Generator.excute(engine,".fair", "FairAuth", "fair_wh_auth", "网红认证表");
 //        Generator.excute(engine,".wh", "Fair", "fair_wh", "网红表");
 //        Generator.excute(engine,".feedback", "FeedBack", "fair_feedback", "反馈表");
 
diff --git a/src/main/java/com/tianpengtech/common/model/fairauth/FairAuth.java b/src/main/java/com/tianpengtech/common/model/fairauth/FairAuth.java
new file mode 100644
index 0000000..1c717f2
--- /dev/null
+++ b/src/main/java/com/tianpengtech/common/model/fairauth/FairAuth.java
@@ -0,0 +1,43 @@
+package com.tianpengtech.common.model.fairauth;
+import com.tianpengtech.common.model.AbstractBaseModel;
+/**
+ *实体类名-网红认证表
+ * fair_wh_auth
+ *
+ * @since Thu Jul 27 16:13:18 CST 2017
+ */
+public class FairAuth extends AbstractBaseModel< FairAuth > {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final FairAuth dao = new FairAuth();
+
+
+		public static final String ID ="id"; //
+		public static final String WH_ID ="wh_id"; //网红ID
+		public static final String USER_NAME ="user_name"; //账号
+		public static final String NICK_NAME ="nick_name"; //昵称
+		public static final String FANS ="fans"; //粉丝数量
+		public static final String SCREENSHOT ="screenshot"; //截图
+		public static final String TYPE ="type"; //类型
+		public static final String DELETETAG ="deletetag"; //删除标识
+		public static final String STATUS ="status"; //状态
+
+	public static final int STATUS_APPROVING=1; //提交待审核
+	public static final int STATUS_SUCCESS=2; //审核通过
+	public static final int STATUS_FAILURE=3;	//审核不通过
+
+
+	public static final int TYPE_WEIBO=1;	//微博
+	public static final int TYPE_WEIXIN=2;	//微信
+	public static final int TYPE_QQ=3;	//QQ
+
+
+	@Override
+	public String tableName() {
+		return "fair_wh_auth";
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobileFairAuthValidator.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobileFairAuthValidator.java
new file mode 100644
index 0000000..483aabc
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobileFairAuthValidator.java
@@ -0,0 +1,68 @@
+/**
+ * 请勿将俱乐部专享资源复制给其他人,保护知识产权即是保护我们所在的行业,进而保护我们自己的利益
+ * 即便是公司的同事,也请尊重 JFinal 作者的努力与付出,不要复制给同事
+ * 
+ * 如果你尚未加入俱乐部,请立即删除该项目,或者现在加入俱乐部:http://jfinal.com/club
+ * 
+ * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群,以及作者在俱乐部定期的分享与答疑,
+ * 价值远比仅仅拥有 jfinal club 项目源代码要大得多
+ * 
+ * JFinal 俱乐部是五年以来首次寻求外部资源的尝试,以便于有资源创建更加
+ * 高品质的产品与服务,为大家带来更大的价值,所以请大家多多支持,不要将
+ * 首次的尝试扼杀在了摇篮之中
+ */
+
+package com.tianpengtech.front.mobile.passport;
+
+import com.jfinal.core.Controller;
+import com.jfinal.kit.StrKit;
+import com.jfinal.validate.Validator;
+import com.tianpengtech.front.mobile.common.util.R;
+
+import java.util.Enumeration;
+
+/**
+ * 验证网红认证信息
+ */
+public class MobileFairAuthValidator extends Validator {
+
+
+
+	protected void validate(Controller c) {
+		String nickName = c.getPara("nick_name");
+		String userName =  c.getPara("user_name");
+		String fans =  c.getPara("fans");
+		String screenshot =  c.getPara("screenshot");
+		String type =  c.getPara("type");
+		if (StrKit.notBlank(nickName)){
+			validateString("nick_name",1,10,"nickNameError","昵称应在1-10位之间");
+		}
+		if (StrKit.notBlank(userName)){
+			validateString("user_name",1,30,"userNameError","用户名格式不正确");
+		}
+		if (StrKit.notBlank(fans)){
+			validateInteger("fans",0,99999999,"fansError","粉丝数量不正确");
+		}
+		if (StrKit.notBlank(screenshot)){
+			validateRequired("screenshot","screenshotError","请上传截图");
+		}
+		if (StrKit.notBlank(type)){
+			validateInteger("type",0,4,"typeError","类型不正确");
+		}
+
+	}
+
+	protected void handleError(Controller c) {
+		R r = R.fail("失败");
+		Enumeration<String> s=c.getAttrNames();
+		while (s.hasMoreElements()){
+			String key=s.nextElement();
+			r.p(key,c.getAttr(key));
+		}
+		c.renderJson(r);
+	}
+
+
+
+}
+
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
index 684a486..c80fc09 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
@@ -105,4 +105,30 @@ public class MobilePassportController extends BaseController{
         renderJson(r);
     }
 
+    /**
+     * 保存认证信息
+     */
+    @Before(MobileFairAuthValidator.class)
+    public void saveAuth(){
+        Map<String,String> param  = new HashMap<>();
+        param.put("user_name",getPara("user_name"));
+        param.put("nick_name",getPara("nick_name"));
+        param.put("fans",getPara("fans"));
+        param.put("screenshot",getPara("screenshot"));
+        param.put("type",getPara("type"));
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        param.put("uid",user.getLong(User.ID)+"");
+        R r=ps.saveAuth(param);
+        renderJson(r);
+    }
+
+    /**
+     * 查找认证信息
+     */
+    public void findAuth(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=ps.findAuth(user.getLong(User.ID));
+        renderJson(r);
+    }
+
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
index 82ea916..8fd2511 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
@@ -8,6 +8,7 @@ import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Record;
 import com.jfinal.plugin.ehcache.CacheKit;
 import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairauth.FairAuth;
 import com.tianpengtech.common.model.fairext.FairExt;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.util.R;
@@ -27,6 +28,7 @@ public class MobilePassportService {
     private static FairExt fairExtDao = FairExt.dao;
     private static FairService fairService = new FairService();
     private static FairService fs = new FairService();
+    private static FairAuth authDao= FairAuth.dao;
     /**
      * 保存网红信息
      * @param param
@@ -286,4 +288,44 @@ public class MobilePassportService {
         }
     }
 
+    /**
+     * 保存认证信息
+     * @param param
+     * @return
+     */
+    public R saveAuth(Map<String,String> param){
+        String username=param.get("user_name");
+        String nickName=param.get("nick_name");
+        String fans=param.get("fans");
+        String screen=param.get("screenshot");
+        String type=param.get("type");
+        String uid=param.get("uid");
+        FairAuth fa = new FairAuth();
+        fa.set(FairAuth.USER_NAME,username);
+        fa.set(FairAuth.NICK_NAME,nickName);
+        fa.set(FairAuth.FANS,fans);
+        fa.set(FairAuth.SCREENSHOT,screen);
+        fa.set(FairAuth.TYPE,type);
+        fa.set(FairAuth.STATUS,FairAuth.STATUS_APPROVING);
+        fa.set(FairAuth.WH_ID,uid);
+        fa.save();
+        return R.ok();
+    }
+
+    /**
+     * 获取认证信息列表
+     * @param uid
+     * @return
+     */
+    public R findAuth(long uid){
+        String sql = String.format("select * from %s where %s=? and %s=?",authDao.tableName(),FairAuth.DELETETAG,FairAuth.WH_ID);
+        List<FairAuth> list=authDao.find(sql,0,uid);
+        list.forEach( fa ->{
+            fa.remove(FairAuth.DELETETAG);
+            fa.remove(FairAuth.WH_ID);
+        });
+        R r=R.ok();
+        r.p("auths",list);
+        return r;
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java
index 8506bd6..966d71d 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportValidator.java
@@ -55,7 +55,7 @@ public class MobilePassportValidator extends Validator {
 			validateInteger("province",0,999999999,"provinceError","省份不正确");
 		}
 		if (StrKit.notBlank(city)){
-			validateInteger("province",0,999999999,"provinceError","市区不正确不正确");
+			validateInteger("province",0,999999999,"provinceError","市区不正确");
 		}
 
 	}
-- 
Gitee


From 6ced37eff850c9652926e5f75a3426dbf82a48aa Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Mon, 31 Jul 2017 11:52:37 +0800
Subject: [PATCH 07/13] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=88=97=E8=A1=A8API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../front/mobile/MobileRoutes.java            |   2 +
 .../message/MobileMessageController.java      |   2 +-
 ...Service.java => MobileMessageService.java} |   4 +-
 .../mobile/task/MobileTaskController.java     |  58 +++++++
 .../front/mobile/task/MobileTaskService.java  | 128 ++++++++++++++
 .../front/web/task/TaskService.java           | 159 +++++++++---------
 6 files changed, 275 insertions(+), 78 deletions(-)
 rename src/main/java/com/tianpengtech/front/mobile/message/{MessageService.java => MobileMessageService.java} (97%)
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java

diff --git a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
index a581bdd..f546ff2 100644
--- a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
+++ b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
@@ -8,6 +8,7 @@ import com.tianpengtech.front.mobile.login.MobileLoginController;
 import com.tianpengtech.front.mobile.message.MobileMessageController;
 import com.tianpengtech.front.mobile.passport.MobilePassportController;
 import com.tianpengtech.front.mobile.region.MobileRegionController;
+import com.tianpengtech.front.mobile.task.MobileTaskController;
 
 /**
  * Created by ggd on 2017/7/15 0015.
@@ -25,5 +26,6 @@ public class MobileRoutes extends Routes {
         add("/api/region", MobileRegionController.class);
         add("/api/passport", MobilePassportController.class);
         add("/api/bankno", MobileBanknoController.class);
+        add("/api/task", MobileTaskController.class);
     }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java b/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java
index 7a1a5e8..fe34293 100644
--- a/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageController.java
@@ -11,7 +11,7 @@ import com.tianpengtech.front.web.common.controller.BaseController;
  */
 public class MobileMessageController extends BaseController {
 
-    private static MessageService messageService = new MessageService();
+    private static MobileMessageService messageService = new MobileMessageService();
     /**
      * 获取消息列表
      */
diff --git a/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java b/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageService.java
similarity index 97%
rename from src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
rename to src/main/java/com/tianpengtech/front/mobile/message/MobileMessageService.java
index 970b2d5..577586d 100644
--- a/src/main/java/com/tianpengtech/front/mobile/message/MessageService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/message/MobileMessageService.java
@@ -11,8 +11,8 @@ import java.util.List;
 /**
  * Created by ggd on 2017/7/23 0023.
  */
-public class MessageService {
-    public static MessageService me = new MessageService();
+public class MobileMessageService {
+    public static MobileMessageService me = new MobileMessageService();
     private static FairMessage fairMessage = new FairMessage();
     private static FairService fs = new FairService();
     /**
diff --git a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java
new file mode 100644
index 0000000..65c2d32
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java
@@ -0,0 +1,58 @@
+package com.tianpengtech.front.mobile.task;
+
+import com.tianpengtech.common.GlobalConfigConstant;
+import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.U;
+import com.tianpengtech.front.mobile.common.util.UserUtil;
+import com.tianpengtech.front.web.common.controller.BaseController;
+import com.tianpengtech.front.web.login.LoginService;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by ggd on 2017/7/28 0028.
+ */
+public class MobileTaskController extends BaseController {
+    private static MobileTaskService service = MobileTaskService.me;
+    /**
+     * 获取任务广场任务列表
+     */
+    public void index(){
+        int pageNum = getParaToInt("pageNum",1);
+        int pageSize = getParaToInt("pageSize",5);
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=service.taskIndex(pageNum,pageSize,user.getLong(User.ID));
+        renderJson(r);
+    }
+
+    /**
+     * 进行中和已完成任务查询
+     */
+    public void findTask(){
+        int pageNum = getParaToInt("pageNum", 1);
+        int pageSize = getParaToInt("pageSize",5);
+        Map<String, Object> params = new HashMap<>();
+        params.put("taskName", getPara("taskName"));
+        params.put("taskStatus", getPara("status"));
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        params.put("user", user.get(User.ID));
+        R r=service.findTask(pageNum,pageSize,params);
+        renderJson(r);
+    }
+
+    /**
+     * 获取任务详情
+     */
+    public void getTask(){
+        String id = getPara("id");//任务ID
+        if (!U.isInteger(id)){
+            renderJson(R.fail("id格式不正确"));
+            return;
+        }
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=service.getTask(Long.parseLong(id),user.getLong(User.ID));
+        renderJson(r);
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
new file mode 100644
index 0000000..67aaaa9
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
@@ -0,0 +1,128 @@
+package com.tianpengtech.front.mobile.task;
+
+import com.jfinal.kit.StrKit;
+import com.jfinal.plugin.activerecord.Page;
+import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
+import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.task.Task;
+import com.tianpengtech.common.model.task.TaskWh;
+import com.tianpengtech.common.search.EqualCondition;
+import com.tianpengtech.common.search.QueryConstructor;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.web.task.TaskService;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by ggd on 2017/7/28 0028.
+ */
+public class MobileTaskService {
+    public static MobileTaskService me = new MobileTaskService();
+    public static TaskService taskService = new TaskService();
+    private static Task taskDao = Task.dao;
+    private static Fair fairDao = Fair.dao;
+
+    public static String PARAM_TASK_NAME="taskName";
+    public static String PARAM_TASK_STATUS="taskStatus";
+
+    private static String PARAM_TASK_STATUS_AFTER="1";  //进行中
+    private static String PARAM_TASK_STATUS_END="2";    //已完成
+
+    /**
+     * 待接任务列表
+     * @return
+     */
+    public R taskIndex(int pageNum, int length,long uid){
+        String s=String.format("select %s,%s,%s,%s,%s,%s,%s ",Task.ID,Task.TASK_TITLE,Task.TASK_START_TIME,Task.TASK_END_TIME,Task.TASK_DESCRIPTION,Task.TASK_PRICE,Task.WH_NUMBER);
+        String sql=String.format(" from %s task where (task.%s=? and task.%s>?) and task.%s=? and task.%s=? and task.%s not in(select %s from %s tw where tw.%s=?)",
+                taskDao.tableName(),Task.STATUS,Task.TASK_START_TIME,Task.DELETETAG,Task.EXTENSION_TYPE,Task.ID,TaskWh.TASK_ID,TaskWh.dao.tableName(),TaskWh.WH_ID);
+        Page<Task> page=taskDao.paginate(pageNum,length,s,sql,new Object[]{Task.STATUS_SUCCESS,new Date(),Task.DELETE_STATUS_NO,Task.EXT_TYPE_RL,uid});
+        page.getList().forEach( t ->{
+            t.put("rece",t.getRece());
+            t.put("dateString",t.getDateString());
+        });
+        R r = R.ok();
+        r.p("task",page);
+        return r;
+    }
+
+
+
+
+
+
+    /**
+     * 任务列表分页
+     * @param
+     * @return
+     */
+    public R findTask(int pageNum, int length,Map<String,Object> params){
+        List<Object> param=new ArrayList<>();
+        String s = "select task.task_title,task.task_description,task.task_price,task.status as status,task.id as id,task.task_start_time,task.task_end_time ";
+        StringBuffer sql= new StringBuffer(" from " + taskDao.tableName() + " task left join " + TaskWh.dao.tableName() + " wh on task." + Task.ID + "=wh." + TaskWh.TASK_ID +" left join "+ Fair.dao.tableName()+" fair on fair."+Fair.ID+"=wh."+TaskWh.WH_ID);
+        sql.append(" where task." + Task.DELETETAG+"=? and wh."+TaskWh.WH_ID+"=? and task."+Task.STATUS+"!="+Task.STATUS_WAIT );
+        param.add(Task.DELETE_STATUS_NO);
+        param.add(params.get("user"));
+        if (params!=null) {
+            Object taskName = params.get(PARAM_TASK_NAME);
+            Object taskStatus = params.get(PARAM_TASK_STATUS);
+            if (taskName!=null && StrKit.notBlank(taskName.toString())) {
+                sql.append(" and (");
+                sql.append("task." + Task.TASK_TITLE+" like ? or ");
+                param.add("%" + taskName.toString() + "%");
+                sql.append("fair." + Fair.NICK_NAME+" like ?)");
+                param.add("%" + taskName.toString() + "%");
+            }
+            if(taskStatus!=null && StrKit.notBlank(taskStatus.toString())){
+                sql.append(" and (");
+                if(taskStatus.toString().equals(PARAM_TASK_STATUS_AFTER)){
+                    sql.append("task." + Task.STATUS+"=? and task."+Task.TASK_START_TIME+"<?)");
+                    param.add(Task.STATUS_SUCCESS);
+                    param.add(new Date());
+                }else if(taskStatus.toString().equals(PARAM_TASK_STATUS_END)){
+                    sql.append("task." + Task.STATUS+"=?)");
+                    param.add(Task.STATUS_COMPLETED);
+                }
+            }
+            sql.append(" group by task."+Task.ID+" order by task."+Task.ID+" DESC");
+        }
+        Page<Task> page=taskDao.paginate(pageNum,length,s,sql.toString(),param.toArray());
+        List<Task> tasks = page.getList();
+        for (Task t:tasks) {
+            t.put("dateString",t.getDateString());
+        }
+        R r = R.ok();
+        r.p("task",page);
+        return r;
+    }
+
+    public R getTask(long id,long uid) {
+        StringBuffer sql = new StringBuffer("select task.task_title,task.task_description,task.task_price,task.status as status,task.id as id,task.task_start_time,task.task_end_time,wh.click_num,wh.cvs_num,wh.id as whid,task.task_url from " +
+                taskDao.tableName() + " task left join " + TaskWh.dao.tableName() + " wh on task." + Task.ID + "=wh." + TaskWh.TASK_ID + " where wh." + TaskWh.TASK_ID + "=? and wh." + TaskWh.WH_ID + "=?");
+        Task task = taskDao.findFirst(sql.toString(), id, uid);
+        if(task==null){
+            sql = new StringBuffer("select task.task_title,task.task_description,task.task_price,task.status as status,task.id as id,task.task_start_time,task.task_end_time,wh.click_num,wh.cvs_num,wh.id as whid,task.task_url from " +
+                    taskDao.tableName() + " task left join " + TaskWh.dao.tableName() + " wh on task." + Task.ID + "=wh." + TaskWh.TASK_ID + " where task." + Task.ID + "=?");
+            task = taskDao.findFirst(sql.toString(), id);
+        }else{
+            task.put("sumClick", task.getClick());
+            task.put("sumCvs", task.getCvs());
+        }
+        task.put("dateString", task.getDateString());
+        R r = R.ok();
+        r.p("task", task);
+        if (task.getInt("status")!=Task.STATUS_SUCCESS) {
+            String fairs = String.format("select wh.photo,wh.nick_name,wh.id as id,task.task_price,wt.cvs_num,wt.click_num from %s wt left join %s wh on wt.%s=wh.%s left join %s task on wt.%s=task.%s where wt.%s=? order by wt.%s desc", TaskWh.dao.tableName(), Fair.dao.tableName(), TaskWh.WH_ID, Fair.ID, Task.dao.tableName(), TaskWh.TASK_ID, Task.ID, TaskWh.TASK_ID, TaskWh.CVS_NUM);
+            List<Fair> fairses = fairDao.find(fairs, id);
+            for (int i = 0; i < fairses.size(); i++) {
+                Fair f = fairses.get(i);
+                f.put("no", i + 1);
+            }
+            r.p("fairs", fairses);
+        }
+        return r;
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/web/task/TaskService.java b/src/main/java/com/tianpengtech/front/web/task/TaskService.java
index f154954..4572d68 100644
--- a/src/main/java/com/tianpengtech/front/web/task/TaskService.java
+++ b/src/main/java/com/tianpengtech/front/web/task/TaskService.java
@@ -124,9 +124,14 @@ public class TaskService {
             if (isExistFairTask(id,taskId)){
                 continue;
             }
-            Record record = new Record();
-            record.set(Task.WL_FAIR_ID,id).set(Task.WL_TASK_ID,taskId);
-            Db.save(Task.TASK_WHITELIST,record);
+//            Record record = new Record();
+//            record.set(Task.WL_FAIR_ID,id).set(Task.WL_TASK_ID,taskId);
+//            Db.save(Task.TASK_WHITELIST,record);
+            TaskWh tw= new TaskWh();
+            tw.set(TaskWh.WH_ID,id);
+            tw.set(TaskWh.TASK_ID,taskId);
+            tw.set(TaskWh.CODE,getTaskCode());
+            tw.save();
         }
         Task task=taskDao.findById(taskId);
         task.set(Task.STATUS,Task.STATUS_APPROVING);
@@ -162,44 +167,46 @@ public class TaskService {
      * @param ip
      */
     public void saveTaskClick(String ref, String ua ,String ip,String code){
-        TaskWh  taskWh=getByCode(code);
-        boolean devModel = PropKit.getBoolean("devMode");
-        //如果是测试环境
-        if (!devModel){
-            Object i=CacheKit.get(TASK_CACHE_CLICK_NAME,ip+taskWh.get(TaskWh.ID));
-            //判断在缓存有效期内是否点击过
-            if (i!=null){
-                return;
+        synchronized (code) {
+            TaskWh taskWh = getByCode(code);
+            boolean devModel = PropKit.getBoolean("devMode");
+            //如果是测试环境
+            if (!devModel) {
+                Object i = CacheKit.get(TASK_CACHE_CLICK_NAME, ip + taskWh.get(TaskWh.ID));
+                //判断在缓存有效期内是否点击过
+                if (i != null) {
+                    return;
+                }
             }
+            UserAgentInfo userAgentInfo = UAUtil.get(ua);
+            IpInfo info = IpUtil.getIpInfo(ip);
+            TaskCount taskCount = new TaskCount();
+            taskCount.set(TaskCount.TASK_ID, taskWh.get(TaskWh.TASK_ID));
+            taskCount.set(TaskCount.WH_ID, taskWh.get(TaskWh.WH_ID));
+            taskCount.set(TaskCount.URL, ref);
+            taskCount.set(TaskCount.IP, ip);
+            taskCount.set(TaskCount.TASK_CODE, code);
+            taskCount.set(TaskCount.USER_AGENT, ua);
+            if (userAgentInfo != null) {
+                taskCount.set(TaskCount.OS_NAME, userAgentInfo.getOsName());
+                taskCount.set(TaskCount.UA_NAME, userAgentInfo.getUaName());
+                taskCount.set(TaskCount.DEVICE_TYPE, userAgentInfo.getDeviceType());
+                taskCount.set(TaskCount.REQ_TYPE, userAgentInfo.getType());
+            }
+            if (info != null) {
+                taskCount.set(TaskCount.COUNTRY, info.getCountry());
+                taskCount.set(TaskCount.PART, info.getPart());
+                taskCount.set(TaskCount.PROVINCE, info.getProvince());
+                taskCount.set(TaskCount.CITY, info.getCity());
+            }
+            taskCount.save();
+            //缓存内写入数据防止此IP在限制时间内再次点击
+            CacheKit.put(TASK_CACHE_CLICK_NAME, ip + taskWh.get(TaskWh.ID), 1);
+            //点击次数加一
+            int num = taskWh.get(TaskWh.CLICK_NUM);
+            taskWh.set(TaskWh.CLICK_NUM, ++num);
+            taskWh.update();
         }
-        UserAgentInfo userAgentInfo = UAUtil.get(ua);
-        IpInfo info=IpUtil.getIpInfo(ip);
-        TaskCount taskCount = new TaskCount();
-        taskCount.set(TaskCount.TASK_ID,taskWh.get(TaskWh.TASK_ID));
-        taskCount.set(TaskCount.WH_ID,taskWh.get(TaskWh.WH_ID));
-        taskCount.set(TaskCount.URL,ref);
-        taskCount.set(TaskCount.IP,ip);
-        taskCount.set(TaskCount.TASK_CODE,code);
-        taskCount.set(TaskCount.USER_AGENT,ua);
-        if (userAgentInfo!=null){
-            taskCount.set(TaskCount.OS_NAME,userAgentInfo.getOsName());
-            taskCount.set(TaskCount.UA_NAME,userAgentInfo.getUaName());
-            taskCount.set(TaskCount.DEVICE_TYPE,userAgentInfo.getDeviceType());
-            taskCount.set(TaskCount.REQ_TYPE,userAgentInfo.getType());
-        }
-        if (info!=null){
-            taskCount.set(TaskCount.COUNTRY,info.getCountry());
-            taskCount.set(TaskCount.PART,info.getPart());
-            taskCount.set(TaskCount.PROVINCE,info.getProvince());
-            taskCount.set(TaskCount.CITY,info.getCity());
-        }
-        taskCount.save();
-        //缓存内写入数据防止此IP在限制时间内再次点击
-        CacheKit.put(TASK_CACHE_CLICK_NAME,ip+taskWh.get(TaskWh.ID),1);
-        //点击次数加一
-        int num=taskWh.get(TaskWh.CLICK_NUM);
-        taskWh.set(TaskWh.CLICK_NUM,++num);
-        taskWh.update();
     }
 
 
@@ -210,44 +217,46 @@ public class TaskService {
      * @param ip
      */
     public void saveTaskCvs(String ref, String ua ,String ip,String code){
-        TaskWh  taskWh=getByCode(code);
-        boolean devModel = PropKit.getBoolean("devMode");
-        //如果是测试环境
-        if (!devModel){
-            Object i=CacheKit.get(TASK_CACHE_CLICK_NAME,ip+taskWh.get(TaskWh.ID));
-            //判断在缓存有效期内是否点击过
-            if (i!=null){
-                return;
+        synchronized (code) {
+            TaskWh taskWh = getByCode(code);
+            boolean devModel = PropKit.getBoolean("devMode");
+            //如果是测试环境
+            if (!devModel) {
+                Object i = CacheKit.get(TASK_CACHE_CLICK_NAME, ip + taskWh.get(TaskWh.ID));
+                //判断在缓存有效期内是否点击过
+                if (i != null) {
+                    return;
+                }
             }
+            UserAgentInfo userAgentInfo = UAUtil.get(ua);
+            IpInfo info = IpUtil.getIpInfo(ip);
+            TaskCVS taskCvs = new TaskCVS();
+            taskCvs.set(TaskCount.TASK_ID, taskWh.get(TaskWh.TASK_ID));
+            taskCvs.set(TaskCount.WH_ID, taskWh.get(TaskWh.WH_ID));
+            taskCvs.set(TaskCount.URL, ref);
+            taskCvs.set(TaskCount.IP, ip);
+            taskCvs.set(TaskCount.TASK_CODE, code);
+            taskCvs.set(TaskCount.USER_AGENT, ua);
+            if (userAgentInfo != null) {
+                taskCvs.set(TaskCount.OS_NAME, userAgentInfo.getOsName());
+                taskCvs.set(TaskCount.UA_NAME, userAgentInfo.getUaName());
+                taskCvs.set(TaskCount.DEVICE_TYPE, userAgentInfo.getDeviceType());
+                taskCvs.set(TaskCount.REQ_TYPE, userAgentInfo.getType());
+            }
+            if (info != null) {
+                taskCvs.set(TaskCount.COUNTRY, info.getCountry());
+                taskCvs.set(TaskCount.PART, info.getPart());
+                taskCvs.set(TaskCount.PROVINCE, info.getProvince());
+                taskCvs.set(TaskCount.CITY, info.getCity());
+            }
+            taskCvs.save();
+            //缓存内写入数据防止此IP在限制时间内再次点击
+            CacheKit.put(TASK_CACHE_CLICK_NAME, ip + taskWh.get(TaskWh.ID), 1);
+            //点击次数加一
+            int num = taskWh.get(TaskWh.CVS_NUM);
+            taskWh.set(TaskWh.CVS_NUM, ++num);
+            taskWh.update();
         }
-        UserAgentInfo userAgentInfo = UAUtil.get(ua);
-        IpInfo info=IpUtil.getIpInfo(ip);
-        TaskCVS taskCvs = new TaskCVS();
-        taskCvs.set(TaskCount.TASK_ID,taskWh.get(TaskWh.TASK_ID));
-        taskCvs.set(TaskCount.WH_ID,taskWh.get(TaskWh.WH_ID));
-        taskCvs.set(TaskCount.URL,ref);
-        taskCvs.set(TaskCount.IP,ip);
-        taskCvs.set(TaskCount.TASK_CODE,code);
-        taskCvs.set(TaskCount.USER_AGENT,ua);
-        if (userAgentInfo!=null){
-            taskCvs.set(TaskCount.OS_NAME,userAgentInfo.getOsName());
-            taskCvs.set(TaskCount.UA_NAME,userAgentInfo.getUaName());
-            taskCvs.set(TaskCount.DEVICE_TYPE,userAgentInfo.getDeviceType());
-            taskCvs.set(TaskCount.REQ_TYPE,userAgentInfo.getType());
-        }
-        if (info!=null){
-            taskCvs.set(TaskCount.COUNTRY,info.getCountry());
-            taskCvs.set(TaskCount.PART,info.getPart());
-            taskCvs.set(TaskCount.PROVINCE,info.getProvince());
-            taskCvs.set(TaskCount.CITY,info.getCity());
-        }
-        taskCvs.save();
-        //缓存内写入数据防止此IP在限制时间内再次点击
-        CacheKit.put(TASK_CACHE_CLICK_NAME,ip+taskWh.get(TaskWh.ID),1);
-        //点击次数加一
-        int num=taskWh.get(TaskWh.CVS_NUM);
-        taskWh.set(TaskWh.CVS_NUM,++num);
-        taskWh.update();
     }
 
 
-- 
Gitee


From 471df59590810a5e24d2f12075a06f0c2e80d49a Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Fri, 4 Aug 2017 15:41:30 +0800
Subject: [PATCH 08/13] =?UTF-8?q?=E9=87=91=E9=A2=9DAPI=E7=AD=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../tianpengtech/common/model/fair/Fair.java  |   1 +
 .../common/model/moneylog/MoneyLog.java       |   6 +
 .../common/model/task/TaskWh.java             |   2 +-
 .../tianpengtech/common/util/SendSmsMsg.java  |  92 ++++++++++++++
 .../front/mobile/MobileRoutes.java            |   2 +
 .../passport/MobilePassportController.java    |  38 ++++++
 .../passport/MobilePassportService.java       | 119 +++++++++++++++++-
 .../publisher/MobilePublishController.java    |  59 +++++++++
 .../publisher/MobilePublishService.java       |  91 ++++++++++++++
 .../mobile/task/MobileTaskController.java     |  14 +++
 .../front/mobile/task/MobileTaskService.java  |  16 +++
 .../front/web/passport/PassportService.java   |  14 ++-
 src/main/resources/ehcache.xml                |  11 ++
 src/main/resources/sms.properties             |   5 +
 14 files changed, 460 insertions(+), 10 deletions(-)
 create mode 100644 src/main/java/com/tianpengtech/common/util/SendSmsMsg.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java
 create mode 100644 src/main/resources/sms.properties

diff --git a/src/main/java/com/tianpengtech/common/model/fair/Fair.java b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
index 2ff5cd0..529fc28 100644
--- a/src/main/java/com/tianpengtech/common/model/fair/Fair.java
+++ b/src/main/java/com/tianpengtech/common/model/fair/Fair.java
@@ -49,6 +49,7 @@ public class Fair extends AbstractBaseModel<Fair> {
 	public static final String ID_CARD="id_card"; //身份证
 	public static final String REMIND_MSG="remind_msg"; //是否消息提醒
 	public static final String TRAN_PWD="tran_pwd"; //交易密码
+	public static final String MONEY="money"; //可用余额
 
 	
 	public static final int STATUS_APPROVING=1;
diff --git a/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java b/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java
index efa16d8..799de19 100644
--- a/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java
+++ b/src/main/java/com/tianpengtech/common/model/moneylog/MoneyLog.java
@@ -23,12 +23,18 @@ public class MoneyLog extends AbstractBaseModel< MoneyLog > {
 		public static final String DESCRIPTION ="description"; //描述
 		public static final String TYPE ="type"; //类型
 		public static final String OPERID ="operid"; //关联ID
+		public static final String STATE ="state"; //金额增加还是减少
 
 
 	public static final Integer TYPE_TIXIAN =1; //提现 operid=提现表ID
 	public static final Integer TYPE_YAOQING =2; //邀请 operid=被邀请用户ID
 	public static final Integer TYPE_RENWU =3;	//任务 operid=任务ID
 
+	public static final Integer STATE_ADD =1;	//金额增加
+	public static final Integer STATE_REDUCE =2;	//金额减少
+
+
+
 	@Override
 	public String tableName() {
 		return "fair_wh_moneylog";
diff --git a/src/main/java/com/tianpengtech/common/model/task/TaskWh.java b/src/main/java/com/tianpengtech/common/model/task/TaskWh.java
index 2333ddd..4cea1af 100644
--- a/src/main/java/com/tianpengtech/common/model/task/TaskWh.java
+++ b/src/main/java/com/tianpengtech/common/model/task/TaskWh.java
@@ -15,7 +15,7 @@ public class TaskWh extends AbstractBaseModel< TaskWh > {
 	private static final long serialVersionUID = 1L;
 	public static final TaskWh dao = new TaskWh();
 	public static final String TASKWH_CACHE_NAME ="blockIp"; //
-
+	public static final String CACHE_NAME_NO = "taskwh_no";
 		public static final String ID ="id"; //
 		public static final String WH_ID ="wh_id"; //网红ID
 		public static final String TASK_ID ="task_id"; //任务ID
diff --git a/src/main/java/com/tianpengtech/common/util/SendSmsMsg.java b/src/main/java/com/tianpengtech/common/util/SendSmsMsg.java
new file mode 100644
index 0000000..b4a3f35
--- /dev/null
+++ b/src/main/java/com/tianpengtech/common/util/SendSmsMsg.java
@@ -0,0 +1,92 @@
+package com.tianpengtech.common.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jfinal.kit.Prop;
+import com.tianpengtech.front.mobile.common.util.ToolMD5;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * Created by ggd on 2017/8/1 0001.
+ */
+public class SendSmsMsg {
+
+    private static Prop prop = new Prop("sms.properties");
+    public static final String URL=prop.get("url");
+    public static final String USERID=prop.get("userid");
+    public static final String APIKEY=prop.get("apikey");
+    public static final String TEMPLATEID=prop.get("templateid");
+    public static final boolean isSend=prop.getBoolean("isSend");
+
+    public static boolean send(String mobile,String code) {
+
+        try {
+            //创建连接
+            java.net.URL url = new URL(URL);
+            HttpURLConnection connection = (HttpURLConnection) url
+                    .openConnection();
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setRequestMethod("POST");
+            connection.setUseCaches(false);
+            connection.setInstanceFollowRedirects(true);
+            connection.setRequestProperty("Content-Type",
+                    "application/x-www-form-urlencoded");
+
+            connection.connect();
+
+            //POST请求
+            DataOutputStream out = new DataOutputStream(
+                    connection.getOutputStream());
+            JSONObject obj = new JSONObject();
+            obj.put("userid",USERID);
+            long time=System.currentTimeMillis();
+            obj.put("ts", time);
+            obj.put("sign", ToolMD5.encodeMD5Hex(USERID+time+APIKEY) );
+            obj.put("mobile",mobile);
+            obj.put("templateid",TEMPLATEID);
+            JSONArray arr = new JSONArray();
+            arr.add(code);
+            obj.put("templateparam",arr);
+            out.writeBytes(obj.toJSONString());
+            out.flush();
+            out.close();
+            //读取响应
+            BufferedReader reader = new BufferedReader(new InputStreamReader(
+                    connection.getInputStream()));
+            String lines;
+            StringBuffer sb = new StringBuffer("");
+            while ((lines = reader.readLine()) != null) {
+                lines = new String(lines.getBytes(), "utf-8");
+                sb.append(lines);
+            }
+            reader.close();
+            // 断开连接
+            connection.disconnect();
+            JSONObject obj1=JSON.parseObject(sb.toString());
+            if (obj1.getIntValue("code")==0){
+                return true;
+            }else{
+                return false;
+            }
+        } catch (MalformedURLException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            return false;
+        } catch (UnsupportedEncodingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            return false;
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
index f546ff2..bbcd3ce 100644
--- a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
+++ b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
@@ -7,6 +7,7 @@ import com.tianpengtech.front.mobile.common.intercepter.TokenCheckInterceptor;
 import com.tianpengtech.front.mobile.login.MobileLoginController;
 import com.tianpengtech.front.mobile.message.MobileMessageController;
 import com.tianpengtech.front.mobile.passport.MobilePassportController;
+import com.tianpengtech.front.mobile.publisher.MobilePublishController;
 import com.tianpengtech.front.mobile.region.MobileRegionController;
 import com.tianpengtech.front.mobile.task.MobileTaskController;
 
@@ -27,5 +28,6 @@ public class MobileRoutes extends Routes {
         add("/api/passport", MobilePassportController.class);
         add("/api/bankno", MobileBanknoController.class);
         add("/api/task", MobileTaskController.class);
+        add("/api/publish", MobilePublishController.class);
     }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
index c80fc09..2209664 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
@@ -131,4 +131,42 @@ public class MobilePassportController extends BaseController{
         renderJson(r);
     }
 
+    /**
+     * 获取点击数详情
+     * @return
+     */
+    public void getClickInfo(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=ps.getClickInfo(user.getLong(User.ID));
+        renderJson(r);
+    }
+
+    /**
+     * 获取转化数详情
+     * @return
+     */
+    public void getCvsInfo(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=ps.getCvsInfo(user.getLong(User.ID));
+        renderJson(r);
+    }
+
+    /**
+     * 个人中心数据
+     * @return
+     */
+    public void center(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=ps.center(user.getLong(User.ID));
+        renderJson(r);
+    }
+
+    /**
+     * 获取收益数据
+     */
+    public void getWallet(){
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=ps.getWallet(user.getLong(User.ID));
+        renderJson(r);
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
index 8fd2511..d6938c8 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
@@ -10,15 +10,15 @@ import com.jfinal.plugin.ehcache.CacheKit;
 import com.tianpengtech.common.model.fair.Fair;
 import com.tianpengtech.common.model.fairauth.FairAuth;
 import com.tianpengtech.common.model.fairext.FairExt;
+import com.tianpengtech.common.model.moneylog.MoneyLog;
+import com.tianpengtech.common.model.task.Task;
+import com.tianpengtech.common.model.task.TaskWh;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.util.R;
 import com.tianpengtech.front.mobile.common.util.U;
 import com.tianpengtech.front.web.fair.FairService;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
  * Created by ggd on 2017/7/24 0024.
@@ -328,4 +328,115 @@ public class MobilePassportService {
         r.p("auths",list);
         return r;
     }
+
+
+    /**
+     * 获取点击数详情
+     * @return
+     */
+    public R getClickInfo(long id){
+        List<TaskWh> order=TaskWh.dao.findByCache(TaskWh.CACHE_NAME_NO,"cache_taskwh_click_no","SELECT wh_id, sum(click_num) FROM "+TaskWh.dao.tableName()+" GROUP BY wh_id ORDER BY sum(click_num) desc");
+        int no=0;
+        for (int i = 0; i <order.size() ; i++) {
+            TaskWh tw=order.get(i);
+            if (tw.getInt(TaskWh.WH_ID).intValue()==id){
+                no=(i+1);
+                break;
+            }
+        }
+        R r = R.ok();
+        r.p("no",no);
+        //获取点击详情
+        List<TaskWh> taskwhs=TaskWh.dao.find("select task.`status`,task.id,task.task_title,tw.click_num from "+TaskWh.dao.tableName()+" tw LEFT JOIN "+ Task.dao.tableName()+" task  on tw.task_id=task.id where tw.deletetag=0 and tw.wh_id=?",id);
+        long sum=0;
+        for (TaskWh taskWh:taskwhs) {
+            sum+=(taskWh.getInt("click_num"));
+        }
+        r.p("list",taskwhs);
+        r.p("sum",sum);
+        return r;
+    }
+
+
+    /**
+     * 获取转化数详情
+     * @return
+     */
+    public R getCvsInfo(long id){
+        List<TaskWh> order=TaskWh.dao.findByCache(TaskWh.CACHE_NAME_NO,"cache_taskwh_click_no","SELECT wh_id, sum(cvs_num) FROM "+TaskWh.dao.tableName()+" GROUP BY wh_id ORDER BY sum(cvs_num) desc");
+        int no=0;
+        for (int i = 0; i <order.size() ; i++) {
+            TaskWh tw=order.get(i);
+            if (tw.getInt(TaskWh.WH_ID).intValue()==id){
+                no=(i+1);
+                break;
+            }
+        }
+        R r = R.ok();
+        r.p("no",no);
+        //获取转化详情
+        List<TaskWh> taskwhs=TaskWh.dao.find("select task.`status`,task.id,task.task_title,tw.cvs_num from "+TaskWh.dao.tableName()+" tw LEFT JOIN "+ Task.dao.tableName()+" task  on tw.task_id=task.id where tw.deletetag=0 and tw.wh_id=?",id);
+        long sum=0;
+        for (TaskWh taskWh:taskwhs) {
+            sum+=(taskWh.getInt("cvs_num"));
+        }
+        r.p("list",taskwhs);
+        r.p("sum",sum);
+        return r;
+    }
+
+    /**
+     * 个人中心
+     * @param id
+     * @return
+     */
+    public R center(long id){
+        Fair fair=Fair.dao.findFirst("select * from "+Fair.dao.tableName()+" where " +Fair.DELETETAG + "=? and "+Fair.ID+"=?",0,id);
+        if (fair==null){
+            return R.fail("用户不存在");
+        }
+        R r=R.ok();
+        r.p("status",fair.get(Fair.STATUS));
+        r.p("click",fair.getClick());
+        r.p("cvs",fair.getCvs());
+        return r;
+    }
+
+    /**
+     * 我的钱包
+     * @return
+     */
+    public R getWallet(long id){
+        //获取可用余额    昨日收益 总收益
+        Fair fair=Fair.dao.findFirst("select * from "+Fair.dao.tableName()+" where " +Fair.DELETETAG + "=? and "+Fair.ID+"=?",0,id);
+        if (fair==null){
+            return R.fail("用户不存在");
+        }
+        R r=R.ok();
+        r.p("money",fair.get(Fair.MONEY));
+        MoneyLog log=MoneyLog.dao.findFirst("select SUM(money) as money from "+MoneyLog.dao.tableName()+" where DATE_FORMAT(create_time, '%Y%m%d')=DATE_FORMAT(?, '%Y%m%d') and wh_id=?",getYesterDay(),id);
+        if (log==null){
+            r.p("yesterday",0);
+        }else{
+            r.p("yesterday",log.get("money"));
+        }
+        MoneyLog sumlog=MoneyLog.dao.findFirst("select SUM(money) as money from "+MoneyLog.dao.tableName()+" where wh_id=?",id);
+        if (log==null){
+            r.p("all",0);
+        }else{
+            r.p("all",sumlog.get("money"));
+        }
+        return r;
+    }
+
+    /**
+     * 获取昨天
+     * @return
+     */
+    private Date getYesterDay(){
+        Calendar cal=Calendar.getInstance();
+        cal.add(Calendar.DATE,-1);
+        Date time=cal.getTime();
+        return time;
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java
new file mode 100644
index 0000000..fda2367
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java
@@ -0,0 +1,59 @@
+package com.tianpengtech.front.mobile.publisher;
+
+import com.jfinal.kit.StrKit;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.web.common.controller.BaseController;
+
+/**
+ * Created by ggd on 2017/8/3 0003.
+ */
+public class MobilePublishController extends BaseController {
+
+    private static MobilePublishService service = MobilePublishService.me;
+
+    /**
+     * 获取商家信息
+     */
+    public void getPublish(){
+        String id=getPara("id");
+        if (StrKit.isBlank(id)){
+            renderJson(R.fail("id不能为空"));
+            return;
+        }
+        R r=service.getPublish(id);
+        renderJson(r);
+    }
+
+
+    /**
+     * 获取商家任务信息
+     */
+    public void getPublishTask(){
+        String id=getPara("id");
+        if (StrKit.isBlank(id)){
+            renderJson(R.fail("id不能为空"));
+            return;
+        }
+        int pageNum = getParaToInt("pageNum",1);
+        int pageSize = getParaToInt("pageSize",5);
+        R r=service.getPublishTask(pageNum,pageSize,id);
+        renderJson(r);
+    }
+
+
+    /**
+     * 获取商家评论信息
+     */
+    public void getPublishComment(){
+        String id=getPara("id");
+        if (StrKit.isBlank(id)){
+            renderJson(R.fail("id不能为空"));
+            return;
+        }
+        int pageNum = getParaToInt("pageNum",1);
+        int pageSize = getParaToInt("pageSize",5);
+        R r=service.getPublishComment(pageNum,pageSize,id);
+        renderJson(r);
+    }
+
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java
new file mode 100644
index 0000000..20a46e6
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java
@@ -0,0 +1,91 @@
+package com.tianpengtech.front.mobile.publisher;
+
+import com.jfinal.plugin.activerecord.Page;
+import com.tianpengtech.common.model.authenticate.Authenticate;
+import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairmessage.FairMessage;
+import com.tianpengtech.common.model.task.Task;
+import com.tianpengtech.common.model.task.TaskWh;
+import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.front.mobile.common.util.R;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.List;
+
+/**
+ * Created by ggd on 2017/8/3 0003.
+ */
+public class MobilePublishService {
+    public static MobilePublishService me = new MobilePublishService();
+    private static Authenticate authDao =  Authenticate.dao;
+    private static Task taskDao =  Task.dao;
+    /**
+     * 获取商家详情信息
+     * @param id
+     * @return
+     */
+    public R getPublish(String id){
+        String sql = String.format("select id,company_name,user_id,status,company_info from %s where %s=? and %s=? and %s=?",authDao.tableName(),Authenticate.DELETETAG,Authenticate.STATUS,Authenticate.USER_ID);
+        Authenticate auth=authDao.findFirst(sql,Authenticate.DELETE_STATUS_NO,Authenticate.STATUS_SUCCESS,id);
+        if (auth==null){
+            return R.fail("用户不存在");
+        }
+        R r=R.ok();
+        r.p("auth",auth);
+        String taskSql=String.format("select sum(wh.click_num) as click,SUM(wh.cvs_num) as cvs from %s wh left join %s task on task.id=wh.task_id where task.%s=?", TaskWh.dao.tableName(),taskDao.tableName(),Task.CREATE_USER);
+        Task task=taskDao.findFirst(taskSql,id);
+        if (task==null){
+            r.p("click",0);
+            r.p("cvs","0.00%");
+        }
+        BigDecimal click=task.get("click");
+        BigDecimal cvs=task.get("cvs");
+        r.p("click",click.intValue());
+        double d=0;
+        if(cvs!=null){
+            d=cvs.doubleValue()/click.doubleValue();
+        }
+        DecimalFormat df=(DecimalFormat) DecimalFormat.getInstance();
+        df.applyPattern("##.##%");
+        r.p("cvs",df.format(d));
+        return r;
+    }
+
+    /**
+     * 获取商家发布的任务
+     * @param id
+     * @return
+     */
+    public R getPublishTask(int pageNum, int length,String id){
+        String select="select id,task_title,status";
+        String sql = String.format(" from %s where %s=? and %s=? and %s>=? order by %s desc",taskDao.tableName(),Task.DELETETAG,Task.CREATE_USER,Task.STATUS,Task.CREATE_TIME);
+        Page<Task> page=taskDao.paginate(pageNum,length,select,sql,Task.DELETE_STATUS_NO,id,Task.STATUS_SUCCESS);
+        R r = R.ok("成功");
+        r.p("count",page.getTotalRow());
+        r.p("pageNum",page.getPageNumber());
+        r.p("list",page.getList());
+        return r;
+    }
+
+
+    /**
+     * 获取商家的评论
+     * @param pageNum
+     * @param length
+     * @param id
+     * @return
+     */
+    public R getPublishComment(int pageNum, int length,String id){
+        String select="select wh.evaluate_whom,wh.whom_date,fwh.nick_name,fwh.photo,fwh.id";
+        String sql = String.format("from %s wh left join %s task on task.id=wh.task_id  LEFT JOIN %s fwh on wh.wh_id = fwh.id where task.create_user=? and wh.evaluate_whom is not null order by wh.%s desc",TaskWh.dao.tableName(),taskDao.tableName(), Fair.dao.tableName(), TaskWh.WHOM_DATE);
+        Page<Task> page=taskDao.paginate(pageNum,length,select,sql,id);
+        R r = R.ok("成功");
+        r.p("count",page.getTotalRow());
+        r.p("pageNum",page.getPageNumber());
+        r.p("list",page.getList());
+        return r;
+    }
+
+
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java
index 65c2d32..b5497d9 100644
--- a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskController.java
@@ -55,4 +55,18 @@ public class MobileTaskController extends BaseController {
         R r=service.getTask(Long.parseLong(id),user.getLong(User.ID));
         renderJson(r);
     }
+
+    /**
+     * 接受任务
+     */
+    public void acceptTask(){
+        String id = getPara("id");//任务ID
+        if (!U.isInteger(id)){
+            renderJson(R.fail("id格式不正确"));
+            return;
+        }
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=service.acceptTask(id,user.getLong(User.ID));
+        renderJson(r);
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
index 67aaaa9..635e7e2 100644
--- a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
@@ -1,5 +1,6 @@
 package com.tianpengtech.front.mobile.task;
 
+import com.jfinal.kit.Ret;
 import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.Page;
 import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
@@ -125,4 +126,19 @@ public class MobileTaskService {
         }
         return r;
     }
+
+    /**
+     * 接受任务
+     * @param taskId
+     * @param uid
+     * @return
+     */
+    public R acceptTask(String taskId,long uid){
+        Ret ret=taskService.saveTaskWait(new String[]{uid+""},taskId);
+        if (ret.isOk()){
+            return R.ok();
+        }else{
+            return R.fail(ret.getStr("msg"));
+        }
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
index 432a91e..65a1d2f 100644
--- a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
+++ b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
@@ -8,6 +8,7 @@ import com.jfinal.plugin.ehcache.CacheKit;
 import com.tianpengtech.common.exception.ValidateException;
 import com.tianpengtech.common.model.authenticate.Authenticate;
 import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.common.util.SendSmsMsg;
 import com.tianpengtech.common.validator.Validator;
 import com.tianpengtech.common.validator.rules.string.StringLengthBetween;
 import com.tianpengtech.common.validator.rules.string.StringMustBeMobile;
@@ -79,7 +80,6 @@ public class PassportService {
      * 发送手机验证码
      */
     public Ret sendAuthCode(String mobile,String ip){
-        boolean devModel = PropKit.getBoolean("devMode");
         //防止恶意发送验证码
         //缓存过期时间为5分钟, 5分钟内超过5次就不允许发送了
         Integer count=CacheKit.get(User.AUTH_CODE_CACHENAME,ip+mobile+"_count");
@@ -94,12 +94,16 @@ public class PassportService {
         //防止恶意发送验证码结束
         int code=(int)((Math.random()*9+1)*100000);
         CacheKit.put(User.AUTH_CODE_CACHENAME,ip+mobile,code);
-        if (!devModel){
+        if (SendSmsMsg.isSend){
             //发送短信验证码
+            if (SendSmsMsg.send(mobile,code+"")){
+                return Ret.ok();
+            }else{
+                return Ret.fail();
+            }
+        }else {
+            return Ret.ok("code",code);
         }
-
-        return Ret.ok("code",code);
-
     }
 
     /**
diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml
index b1ea61e..e28a1b3 100644
--- a/src/main/resources/ehcache.xml
+++ b/src/main/resources/ehcache.xml
@@ -255,4 +255,15 @@
            overflowToDisk="true"
            diskPersistent="true"
     />
+
+    <!--存放网红点击数排名-->
+    <cache name="taskwh_no"
+           maxElementsInMemory="10000"
+           maxElementsOnDisk="100000"
+           eternal="false"
+           timeToIdleSeconds="86400"
+           timeToLiveSeconds="0"
+           overflowToDisk="true"
+           diskPersistent="true"
+    />
 </ehcache>
\ No newline at end of file
diff --git a/src/main/resources/sms.properties b/src/main/resources/sms.properties
new file mode 100644
index 0000000..593b0a2
--- /dev/null
+++ b/src/main/resources/sms.properties
@@ -0,0 +1,5 @@
+url = http://183.129.129.134:8081/api/template/sms/send
+userid = 10003
+apikey = d73376b0b813442a91c0337556e8d8b1
+templateid = 16
+isSend = false
\ No newline at end of file
-- 
Gitee


From 10ebe9ebf5453b27c4fe3c0a889ecce38bac7529 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Fri, 4 Aug 2017 15:43:14 +0800
Subject: [PATCH 09/13] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E9=98=BF=E9=87=8C?=
 =?UTF-8?q?=E4=BA=91SMS?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/pom.xml b/pom.xml
index 589aa61..4c946f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -245,6 +245,14 @@
 			<artifactId>uasparser</artifactId>
 			<version>0.6.2</version>
 		</dependency>
+
+
+		<!--发送阿里云短信-->
+		<dependency>
+			<groupId>com.aliyun</groupId>
+			<artifactId>aliyun-java-sdk-core</artifactId>
+			<version>3.2.6</version>
+		</dependency>
 	</dependencies>
 	<build>
 		<finalName>fair</finalName>
-- 
Gitee


From 25a09ba8b2f33da2e0288009d10e5c4ede001374 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Sat, 5 Aug 2017 19:56:03 +0800
Subject: [PATCH 10/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=89=A9=E4=BD=99API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/tianpengtech/common/MyConfig.java     |   6 +
 .../common/generator/app/Generator.java       |   2 +-
 .../fairadvertisement/FairAdvertisement.java  |  30 +++
 .../common/model/fairreport/FairReport.java   |  32 +++
 .../model/fairwithdraw/FairWithdraw.java      |  34 +++
 .../tianpengtech/common/util/SendSmsMsg.java  | 211 +++++++++++++-----
 .../front/mobile/MobileRoutes.java            |   4 +
 .../MobileAdvertisementController.java        |  19 ++
 .../MobileAdvertisementService.java           |  26 +++
 .../mobile/bankno/MobileBanknoService.java    |  34 +++
 .../mobile/common/constant/Constant.java      |   1 +
 .../front/mobile/common/util/U.java           |  15 +-
 .../moneylog/MobileMoenyLogService.java       |  27 +++
 .../moneylog/MobileMoneyLogController.java    |  26 +++
 .../passport/MobilePassportController.java    |  44 ++++
 .../passport/MobilePassportService.java       |  74 ++++++
 .../publisher/MobilePublishController.java    |  37 ++-
 .../publisher/MobilePublishService.java       |  32 +++
 .../front/mobile/task/MobileTaskService.java  |   4 +-
 .../front/web/fair/FairService.java           |  10 +
 .../tianpengtech/front/web/job/TaskJob.java   |  12 +-
 .../front/web/passport/PassportService.java   |  14 ++
 .../front/web/task/TaskService.java           |  35 ++-
 src/main/resources/sms.properties             |  14 +-
 ...liyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar | Bin 0 -> 17951 bytes
 25 files changed, 664 insertions(+), 79 deletions(-)
 create mode 100644 src/main/java/com/tianpengtech/common/model/fairadvertisement/FairAdvertisement.java
 create mode 100644 src/main/java/com/tianpengtech/common/model/fairreport/FairReport.java
 create mode 100644 src/main/java/com/tianpengtech/common/model/fairwithdraw/FairWithdraw.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementController.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementService.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoenyLogService.java
 create mode 100644 src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoneyLogController.java
 create mode 100644 src/main/webapp/WEB-INF/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar

diff --git a/src/main/java/com/tianpengtech/common/MyConfig.java b/src/main/java/com/tianpengtech/common/MyConfig.java
index 74f1512..86da728 100644
--- a/src/main/java/com/tianpengtech/common/MyConfig.java
+++ b/src/main/java/com/tianpengtech/common/MyConfig.java
@@ -19,10 +19,13 @@ import com.tianpengtech.common.model.account.Account;
 import com.tianpengtech.common.model.authenticate.Authenticate;
 import com.tianpengtech.common.model.dictionary.Dictionary;
 import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.fairadvertisement.FairAdvertisement;
 import com.tianpengtech.common.model.fairauth.FairAuth;
 import com.tianpengtech.common.model.fairbankno.FairBankno;
 import com.tianpengtech.common.model.fairext.FairExt;
 import com.tianpengtech.common.model.fairmessage.FairMessage;
+import com.tianpengtech.common.model.fairreport.FairReport;
+import com.tianpengtech.common.model.fairwithdraw.FairWithdraw;
 import com.tianpengtech.common.model.feedback.FeedBack;
 import com.tianpengtech.common.model.message.Message;
 import com.tianpengtech.common.model.moneylog.MoneyLog;
@@ -145,6 +148,9 @@ public class MyConfig extends JFinalConfig {
         arp.addMapping(FairExt.dao.tableName(),FairExt.class);
         arp.addMapping(FairBankno.dao.tableName(),FairBankno.class);
         arp.addMapping(FairAuth.dao.tableName(),FairAuth.class);
+        arp.addMapping(FairWithdraw.dao.tableName(),FairWithdraw.class);
+        arp.addMapping(FairReport.dao.tableName(),FairReport.class);
+        arp.addMapping(FairAdvertisement.dao.tableName(),FairAdvertisement.class);
         EhCachePlugin cachePlugin = new EhCachePlugin();
         me.add(cachePlugin);
     }
diff --git a/src/main/java/com/tianpengtech/common/generator/app/Generator.java b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
index 55c802a..0587616 100644
--- a/src/main/java/com/tianpengtech/common/generator/app/Generator.java
+++ b/src/main/java/com/tianpengtech/common/generator/app/Generator.java
@@ -232,7 +232,7 @@ public class Generator {
         Engine engine = engineConfig();
 //        Generator.excute(engine,".user", "User", "fair_user", "用户表");
 //        Generator.excute(engine,".authenticate", "Authenticate", "fair_user_authenticate", "用户认证表");
-        Generator.excute(engine,".fair", "FairAuth", "fair_wh_auth", "网红认证表");
+        Generator.excute(engine,".fair", "FairAdvertisement", "fair_advertisement", "广告信息表");
 //        Generator.excute(engine,".wh", "Fair", "fair_wh", "网红表");
 //        Generator.excute(engine,".feedback", "FeedBack", "fair_feedback", "反馈表");
 
diff --git a/src/main/java/com/tianpengtech/common/model/fairadvertisement/FairAdvertisement.java b/src/main/java/com/tianpengtech/common/model/fairadvertisement/FairAdvertisement.java
new file mode 100644
index 0000000..3dfe7a5
--- /dev/null
+++ b/src/main/java/com/tianpengtech/common/model/fairadvertisement/FairAdvertisement.java
@@ -0,0 +1,30 @@
+package com.tianpengtech.common.model.fairadvertisement;
+import com.tianpengtech.common.model.AbstractBaseModel;
+/**
+ *实体类名-广告信息表
+ * fair_advertisement
+ *
+ * @since Sat Aug 05 13:55:45 CST 2017
+ */
+public class FairAdvertisement extends AbstractBaseModel< FairAdvertisement > {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final FairAdvertisement dao = new FairAdvertisement();
+
+
+		public static final String ID ="id"; //
+		public static final String PICTURE ="picture"; //广告图片
+		public static final String URL ="url"; //点击url
+		public static final String DELETETAG ="deletetag"; //
+		public static final String CREATE_TIME ="create_time"; //添加时间
+
+
+	@Override
+	public String tableName() {
+		return "fair_advertisement";
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/tianpengtech/common/model/fairreport/FairReport.java b/src/main/java/com/tianpengtech/common/model/fairreport/FairReport.java
new file mode 100644
index 0000000..a41e1c1
--- /dev/null
+++ b/src/main/java/com/tianpengtech/common/model/fairreport/FairReport.java
@@ -0,0 +1,32 @@
+package com.tianpengtech.common.model.fairreport;
+import com.tianpengtech.common.model.AbstractBaseModel;
+/**
+ *实体类名-举报信息表
+ * fair_report
+ *
+ * @since Sat Aug 05 13:55:06 CST 2017
+ */
+public class FairReport extends AbstractBaseModel< FairReport > {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final FairReport dao = new FairReport();
+
+
+		public static final String ID ="id"; //
+		public static final String CONTENT ="content"; //举报内容
+		public static final String CREATE_TIME ="create_time"; //
+		public static final String STATUS ="status"; //状态
+		public static final String USER_ID ="user_id"; //被举报人ID
+		public static final String FAIR_ID ="fair_id"; //举报人ID
+		public static final String CONTENT_ID ="content_id"; //数据字典表ID,如果该字段为空则填入content字段
+
+
+	@Override
+	public String tableName() {
+		return "fair_report";
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/tianpengtech/common/model/fairwithdraw/FairWithdraw.java b/src/main/java/com/tianpengtech/common/model/fairwithdraw/FairWithdraw.java
new file mode 100644
index 0000000..168888b
--- /dev/null
+++ b/src/main/java/com/tianpengtech/common/model/fairwithdraw/FairWithdraw.java
@@ -0,0 +1,34 @@
+package com.tianpengtech.common.model.fairwithdraw;
+import com.tianpengtech.common.model.AbstractBaseModel;
+/**
+ *实体类名-网红提现表
+ * fair_wh_withdraw
+ *
+ * @since Sat Aug 05 13:53:05 CST 2017
+ */
+public class FairWithdraw extends AbstractBaseModel< FairWithdraw > {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final FairWithdraw dao = new FairWithdraw();
+
+
+		public static final String ID ="id"; //
+		public static final String WH_ID ="wh_id"; //网红id
+		public static final String MONEY ="money"; //提现金额
+		public static final String CREATE_TIME ="create_time"; //提交时间
+		public static final String HANDLE_TIME ="handle_time"; //
+		public static final String BANK_ID ="bank_id"; //银行卡表ID
+		public static final String STATUS ="status"; //状态
+
+	public static final int STATUS_APPROVING=1; //等待审核
+
+
+	@Override
+	public String tableName() {
+		return "fair_wh_withdraw";
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/tianpengtech/common/util/SendSmsMsg.java b/src/main/java/com/tianpengtech/common/util/SendSmsMsg.java
index b4a3f35..3fe46d7 100644
--- a/src/main/java/com/tianpengtech/common/util/SendSmsMsg.java
+++ b/src/main/java/com/tianpengtech/common/util/SendSmsMsg.java
@@ -3,6 +3,13 @@ package com.tianpengtech.common.util;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
 import com.jfinal.kit.Prop;
 import com.tianpengtech.front.mobile.common.util.ToolMD5;
 
@@ -11,82 +18,162 @@ import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 
+
+
 /**
  * Created by ggd on 2017/8/1 0001.
  */
 public class SendSmsMsg {
-
     private static Prop prop = new Prop("sms.properties");
-    public static final String URL=prop.get("url");
-    public static final String USERID=prop.get("userid");
-    public static final String APIKEY=prop.get("apikey");
-    public static final String TEMPLATEID=prop.get("templateid");
     public static final boolean isSend=prop.getBoolean("isSend");
 
+    //产品名称:云通信短信API产品,开发者无需替换
+    private static final String product = "Dysmsapi";
+    //产品域名,开发者无需替换
+    private static final String domain = "dysmsapi.aliyuncs.com";
+    //    static final String accessKeyId = "LTAIvQPdztlGanRB";
+//    static final String accessKeySecret = "KSxwLrQR7BdijGWYzGv21T3HTwTvMO";
+    private static final String accessKeyId = prop.get("accessKeyId");
+    private static final String accessKeySecret = prop.get("accessKeySecret");
     public static boolean send(String mobile,String code) {
-
+        IClientProfile profile = DefaultProfile.getProfile("cn-beijing", accessKeyId, accessKeySecret);
         try {
-            //创建连接
-            java.net.URL url = new URL(URL);
-            HttpURLConnection connection = (HttpURLConnection) url
-                    .openConnection();
-            connection.setDoOutput(true);
-            connection.setDoInput(true);
-            connection.setRequestMethod("POST");
-            connection.setUseCaches(false);
-            connection.setInstanceFollowRedirects(true);
-            connection.setRequestProperty("Content-Type",
-                    "application/x-www-form-urlencoded");
-
-            connection.connect();
-
-            //POST请求
-            DataOutputStream out = new DataOutputStream(
-                    connection.getOutputStream());
-            JSONObject obj = new JSONObject();
-            obj.put("userid",USERID);
-            long time=System.currentTimeMillis();
-            obj.put("ts", time);
-            obj.put("sign", ToolMD5.encodeMD5Hex(USERID+time+APIKEY) );
-            obj.put("mobile",mobile);
-            obj.put("templateid",TEMPLATEID);
-            JSONArray arr = new JSONArray();
-            arr.add(code);
-            obj.put("templateparam",arr);
-            out.writeBytes(obj.toJSONString());
-            out.flush();
-            out.close();
-            //读取响应
-            BufferedReader reader = new BufferedReader(new InputStreamReader(
-                    connection.getInputStream()));
-            String lines;
-            StringBuffer sb = new StringBuffer("");
-            while ((lines = reader.readLine()) != null) {
-                lines = new String(lines.getBytes(), "utf-8");
-                sb.append(lines);
-            }
-            reader.close();
-            // 断开连接
-            connection.disconnect();
-            JSONObject obj1=JSON.parseObject(sb.toString());
-            if (obj1.getIntValue("code")==0){
-                return true;
-            }else{
-                return false;
-            }
-        } catch (MalformedURLException e) {
-            // TODO Auto-generated catch block
+            DefaultProfile.addEndpoint("cn-beijing", "cn-beijing", product, domain);
+        } catch (ClientException e) {
             e.printStackTrace();
             return false;
-        } catch (UnsupportedEncodingException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            return false;
-        } catch (IOException e) {
-            // TODO Auto-generated catch block
+        }
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+        SendSmsRequest request = new SendSmsRequest();
+        request.setPhoneNumbers(mobile);
+//        request.setSignName("铂数网络");
+//        request.setTemplateCode("SMS_76595520");
+        request.setSignName(prop.get("signName"));
+        request.setTemplateCode(prop.get("templateCode"));
+        request.setTemplateParam("{\"code\":\""+code+"\"}");
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = acsClient.getAcsResponse(request);
+        } catch (ClientException e) {
             e.printStackTrace();
             return false;
         }
+        if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
+            return true;
+        }
+        return false;
     }
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//    private static Prop prop = new Prop("sms.properties");
+//    public static final String URL=prop.get("url");
+//    public static final String USERID=prop.get("userid");
+//    public static final String APIKEY=prop.get("apikey");
+//    public static final String TEMPLATEID=prop.get("templateid");
+//    public static final boolean isSend=prop.getBoolean("isSend");
+//
+//    public static boolean send(String mobile,String code) {
+//
+//        try {
+//            //创建连接
+//            java.net.URL url = new URL(URL);
+//            HttpURLConnection connection = (HttpURLConnection) url
+//                    .openConnection();
+//            connection.setDoOutput(true);
+//            connection.setDoInput(true);
+//            connection.setRequestMethod("POST");
+//            connection.setUseCaches(false);
+//            connection.setInstanceFollowRedirects(true);
+//            connection.setRequestProperty("Content-Type",
+//                    "application/x-www-form-urlencoded");
+//
+//            connection.connect();
+//
+//            //POST请求
+//            DataOutputStream out = new DataOutputStream(
+//                    connection.getOutputStream());
+//            JSONObject obj = new JSONObject();
+//            obj.put("userid",USERID);
+//            long time=System.currentTimeMillis();
+//            obj.put("ts", time);
+//            obj.put("sign", ToolMD5.encodeMD5Hex(USERID+time+APIKEY) );
+//            obj.put("mobile",mobile);
+//            obj.put("templateid",TEMPLATEID);
+//            JSONArray arr = new JSONArray();
+//            arr.add(code);
+//            obj.put("templateparam",arr);
+//            out.writeBytes(obj.toJSONString());
+//            out.flush();
+//            out.close();
+//            //读取响应
+//            BufferedReader reader = new BufferedReader(new InputStreamReader(
+//                    connection.getInputStream()));
+//            String lines;
+//            StringBuffer sb = new StringBuffer("");
+//            while ((lines = reader.readLine()) != null) {
+//                lines = new String(lines.getBytes(), "utf-8");
+//                sb.append(lines);
+//            }
+//            reader.close();
+//            // 断开连接
+//            connection.disconnect();
+//            JSONObject obj1=JSON.parseObject(sb.toString());
+//            if (obj1.getIntValue("code")==0){
+//                return true;
+//            }else{
+//                return false;
+//            }
+//        } catch (MalformedURLException e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//            return false;
+//        } catch (UnsupportedEncodingException e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//            return false;
+//        } catch (IOException e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//            return false;
+//        }
+//    }
+
+
+
+
+
+
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
index bbcd3ce..062a35c 100644
--- a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
+++ b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
@@ -1,11 +1,13 @@
 package com.tianpengtech.front.mobile;
 
 import com.jfinal.config.Routes;
+import com.tianpengtech.front.mobile.advertisement.MobileAdvertisementController;
 import com.tianpengtech.front.mobile.bankno.MobileBanknoController;
 import com.tianpengtech.front.mobile.common.intercepter.MobileRequestInterceptor;
 import com.tianpengtech.front.mobile.common.intercepter.TokenCheckInterceptor;
 import com.tianpengtech.front.mobile.login.MobileLoginController;
 import com.tianpengtech.front.mobile.message.MobileMessageController;
+import com.tianpengtech.front.mobile.moneylog.MobileMoneyLogController;
 import com.tianpengtech.front.mobile.passport.MobilePassportController;
 import com.tianpengtech.front.mobile.publisher.MobilePublishController;
 import com.tianpengtech.front.mobile.region.MobileRegionController;
@@ -29,5 +31,7 @@ public class MobileRoutes extends Routes {
         add("/api/bankno", MobileBanknoController.class);
         add("/api/task", MobileTaskController.class);
         add("/api/publish", MobilePublishController.class);
+        add("/api/mas",MobileAdvertisementController.class);
+        add("/api/moneylog",MobileMoneyLogController.class);
     }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementController.java b/src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementController.java
new file mode 100644
index 0000000..3023867
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementController.java
@@ -0,0 +1,19 @@
+package com.tianpengtech.front.mobile.advertisement;
+
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.web.common.controller.BaseController;
+
+/**
+ * Created by ggd on 2017/8/5 0005.
+ */
+public class MobileAdvertisementController extends BaseController {
+    private static MobileAdvertisementService mas = MobileAdvertisementService.me;
+
+    /**
+     * 获取首页展示的广告信息
+     */
+    public void index(){
+        R r = mas.index();
+        renderJson(r);
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementService.java b/src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementService.java
new file mode 100644
index 0000000..444a99e
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/advertisement/MobileAdvertisementService.java
@@ -0,0 +1,26 @@
+package com.tianpengtech.front.mobile.advertisement;
+
+import com.tianpengtech.common.model.fairadvertisement.FairAdvertisement;
+import com.tianpengtech.common.model.fairreport.FairReport;
+import com.tianpengtech.front.mobile.common.util.R;
+
+import java.util.List;
+
+/**
+ * Created by ggd on 2017/8/5 0005.
+ */
+public class MobileAdvertisementService {
+    public static MobileAdvertisementService me = new MobileAdvertisementService();
+
+    /**
+     * 获取首页显示的广告信息
+     * @return
+     */
+    public R index(){
+        String sql =  String.format("select %s,%s,%s from %s where %s=? order by %s desc",FairAdvertisement.ID,FairAdvertisement.PICTURE,FairAdvertisement.URL,FairAdvertisement.dao.tableName(),FairAdvertisement.DELETETAG,FairAdvertisement.CREATE_TIME);
+        List<FairAdvertisement> advs=FairAdvertisement.dao.find(sql,0);
+        R r= R.ok();
+        r.p("list",advs);
+        return r;
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java
index 6a96ea4..aa29369 100644
--- a/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/bankno/MobileBanknoService.java
@@ -26,6 +26,9 @@ public class MobileBanknoService {
             String bank=param.get("bank");
             String bank_no=param.get("bank_no");
             String real_name=param.get("real_name");
+            if (isBankNoExists(bank_no,Long.parseLong(wh_id))){
+                return R.fail("此银行卡已添加过");
+            }
             FairBankno fb = new FairBankno();
             fb.set(FairBankno.WH_ID,wh_id);
             fb.set(FairBankno.BANK,bank);
@@ -55,4 +58,35 @@ public class MobileBanknoService {
         return r;
     }
 
+    /**
+     * 判断用的银行卡是否添加过
+     * @param bankNo
+     * @param uid
+     * @return
+     */
+    public boolean isBankNoExists(String bankNo,long uid){
+        String sql = String.format("select %s from %s where %s=? and %s=? and %s=?",FairBankno.ID,dao.tableName(),FairBankno.DELETETAG,FairBankno.WH_ID,FairBankno.BANK_NO);
+        FairBankno no=dao.findFirst(sql,0,uid,bankNo);
+        if (no==null){
+            return false;
+        }else{
+            return true;
+        }
+    }
+
+
+    /**
+     * 判断用的银行卡是否添加过
+     * @return
+     */
+    public boolean isBankNoExists(String bankId){
+        String sql = String.format("select %s from %s where %s=? and %s=?",FairBankno.ID,dao.tableName(),FairBankno.DELETETAG,FairBankno.ID);
+        FairBankno no=dao.findFirst(sql,0,bankId);
+        if (no==null){
+            return false;
+        }else{
+            return true;
+        }
+    }
+
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java b/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java
index 8949bde..d3fbabe 100644
--- a/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java
+++ b/src/main/java/com/tianpengtech/front/mobile/common/constant/Constant.java
@@ -9,4 +9,5 @@ public class Constant {
 
     public static final String REGEX_MOBILE = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$";
     public static final String REGEX_INTERGER = "^\\d+$";
+    public static final String REGEX_MONEY = "(^[1-9]([0-9]+)?(\\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\\.[0-9]([0-9])?$)";
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/common/util/U.java b/src/main/java/com/tianpengtech/front/mobile/common/util/U.java
index 3454a9e..4af4aa5 100644
--- a/src/main/java/com/tianpengtech/front/mobile/common/util/U.java
+++ b/src/main/java/com/tianpengtech/front/mobile/common/util/U.java
@@ -37,9 +37,22 @@ public class U {
         }
     }
 
+    public static boolean isMoney(String val){
+        if (StrKit.isBlank(val)){
+            return false;
+        }
+        Pattern pattern = Pattern.compile(Constant.REGEX_MONEY);
+        Matcher matcher = pattern.matcher(val);
+        if(matcher.matches()) {
+            return true;
+        }else{
+            return false;
+        }
+    }
+
 
     public static void main(String[] args) {
-        System.out.println(isInteger("111111"));
+        System.out.println(isMoney("015.15"));
     }
 
 
diff --git a/src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoenyLogService.java b/src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoenyLogService.java
new file mode 100644
index 0000000..cd02bb2
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoenyLogService.java
@@ -0,0 +1,27 @@
+package com.tianpengtech.front.mobile.moneylog;
+
+import com.jfinal.plugin.activerecord.Page;
+import com.tianpengtech.common.model.moneylog.MoneyLog;
+import com.tianpengtech.front.mobile.common.util.R;
+
+/**
+ * Created by ggd on 2017/8/5 0005.
+ */
+public class MobileMoenyLogService {
+    public static MobileMoenyLogService me = new MobileMoenyLogService();
+
+    /**
+     * 分页获取金钱日志
+     * @return
+     */
+    public R list(int pageNum, int length,long uid){
+        String select = "select * ";
+        String sql = String.format(" from %s where %s=? and %s=? order by %s desc", MoneyLog.dao.tableName(),MoneyLog.DELETETAG,MoneyLog.WH_ID,MoneyLog.CREATE_TIME);
+        Page<MoneyLog> page=MoneyLog.dao.paginate(pageNum,length,select,sql.toString(),0,uid);
+        R r= R.ok();
+        r.p("count",page.getTotalRow());
+        r.p("pageNum",page.getPageNumber());
+        r.p("list",page.getList());
+        return r;
+    }
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoneyLogController.java b/src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoneyLogController.java
new file mode 100644
index 0000000..11aff69
--- /dev/null
+++ b/src/main/java/com/tianpengtech/front/mobile/moneylog/MobileMoneyLogController.java
@@ -0,0 +1,26 @@
+package com.tianpengtech.front.mobile.moneylog;
+
+import com.jfinal.kit.StrKit;
+import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.UserUtil;
+import com.tianpengtech.front.web.common.controller.BaseController;
+
+/**
+ * Created by ggd on 2017/8/5 0005.
+ */
+public class MobileMoneyLogController extends BaseController {
+    private static MobileMoenyLogService service = MobileMoenyLogService.me;
+    /**
+     * 获取金钱日志
+     */
+    public void index(){
+        int pageNum = getParaToInt("pageNum",1);
+        int pageSize = getParaToInt("pageSize",5);
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        long uid=user.getLong(User.ID);
+        R r=service.list(pageNum,pageSize,uid);
+        renderJson(r);
+    }
+
+}
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
index 2209664..fee7fee 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportController.java
@@ -5,6 +5,7 @@ import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.tx.Tx;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.U;
 import com.tianpengtech.front.mobile.common.util.UserUtil;
 import com.tianpengtech.front.web.common.controller.BaseController;
 
@@ -169,4 +170,47 @@ public class MobilePassportController extends BaseController{
         R r=ps.getWallet(user.getLong(User.ID));
         renderJson(r);
     }
+
+    /**
+     * 验证交易密码是否正确
+     */
+    public void checkNowTranPwd(){
+        String tranPwd = getPara("tranPwd");
+        if (StrKit.isBlank(tranPwd)){
+            renderJson(R.fail("交易密码不能为空"));
+            return;
+        }
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        R r=ps.checkTranPwd(tranPwd,user.getLong(User.ID));
+        renderJson(r);
+    }
+
+    /**
+     * 提现
+     */
+    @Before(Tx.class)
+    public void withdraw(){
+        String money = getPara("money");
+        String bankId = getPara("bankId");
+        String wdToken = getPara("wdToken");
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        if (StrKit.isBlank(wdToken)){
+            renderJson(R.fail("wdToken不能为空"));
+            return;
+        }
+        if (StrKit.isBlank(bankId)){
+            renderJson(R.fail("bankId不能为空"));
+            return;
+        }
+        if (StrKit.isBlank(money)){
+            renderJson(R.fail("money不能为空"));
+            return;
+        }
+        if (!U.isMoney(money)){
+            renderJson(R.fail("提现金额格式不正确"));
+            return;
+        }
+        R r=ps.withdraw(money,user.getLong(User.ID),wdToken,bankId);
+        renderJson(r);
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
index d6938c8..9a04f66 100644
--- a/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/passport/MobilePassportService.java
@@ -10,11 +10,14 @@ import com.jfinal.plugin.ehcache.CacheKit;
 import com.tianpengtech.common.model.fair.Fair;
 import com.tianpengtech.common.model.fairauth.FairAuth;
 import com.tianpengtech.common.model.fairext.FairExt;
+import com.tianpengtech.common.model.fairwithdraw.FairWithdraw;
 import com.tianpengtech.common.model.moneylog.MoneyLog;
 import com.tianpengtech.common.model.task.Task;
 import com.tianpengtech.common.model.task.TaskWh;
 import com.tianpengtech.common.model.user.User;
+import com.tianpengtech.front.mobile.bankno.MobileBanknoService;
 import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.TokenUtil;
 import com.tianpengtech.front.mobile.common.util.U;
 import com.tianpengtech.front.web.fair.FairService;
 
@@ -29,6 +32,8 @@ public class MobilePassportService {
     private static FairService fairService = new FairService();
     private static FairService fs = new FairService();
     private static FairAuth authDao= FairAuth.dao;
+    private static final String TRAN_PWD_CACHE_KEY="tranPwd_";
+    private static MobileBanknoService mbs = MobileBanknoService.me;
     /**
      * 保存网红信息
      * @param param
@@ -439,4 +444,73 @@ public class MobilePassportService {
         Date time=cal.getTime();
         return time;
     }
+
+    /**
+     * 验证交易密码
+     * @param tranPwd
+     * @param uid
+     * @return
+     */
+    public R checkTranPwd(String tranPwd,long uid){
+        Fair fair=fs.findById(Integer.parseInt(uid+""));
+        User user = User.dao.findById(uid);
+        String nowtranPwd=fair.get(Fair.TRAN_PWD); //数据库中的交易密码
+        String salt = user.get(User.SALT);
+        String hashedPass = HashKit.sha256(salt + tranPwd); //传入的交易密码加密
+        if (nowtranPwd.toUpperCase().equals(hashedPass.toUpperCase())){
+            R r=R.ok("密码验证成功");
+            String token = TokenUtil.getToken(); //在提交提现请求时 需携带此token
+            CacheKit.put(User.AUTH_CODE_CACHENAME,TRAN_PWD_CACHE_KEY+uid,token); //缓存时间5分钟
+            r.p("token", token);
+            return r;
+        }else{
+            return R.fail("交易密码不正确");
+        }
+    }
+
+    /**
+     * 提现请求
+     * @return
+     */
+    public R withdraw(String money,long uid,String token,String bankId){
+        if (!mbs.isBankNoExists(bankId)){
+            return R.fail("银行卡不存在");
+        }
+        Fair fair=fs.findById(Integer.parseInt(uid+""));
+        Double yue=fair.getDouble(Fair.MONEY); //余额
+        double tixian=Double.parseDouble(money); //提现金额
+        if (yue ==null || tixian>yue.doubleValue()){
+            return R.fail("提现金额超出可用余额");
+        }
+        String cacheToken=CacheKit.get(User.AUTH_CODE_CACHENAME,TRAN_PWD_CACHE_KEY+uid);
+        if (token.equals(cacheToken)){
+            CacheKit.remove(User.AUTH_CODE_CACHENAME,TRAN_PWD_CACHE_KEY+uid);
+            fair.set(Fair.MONEY,yue.doubleValue()-tixian);
+            if(fair.update()){
+                FairWithdraw fw = new FairWithdraw();
+                fw.set(FairWithdraw.BANK_ID,bankId);
+                fw.set(FairWithdraw.MONEY,tixian);
+                fw.set(FairWithdraw.WH_ID,uid);
+                if (fw.save()){
+                    MoneyLog ml = new MoneyLog();
+                    ml.set(MoneyLog.WH_ID,uid);
+                    ml.set(MoneyLog.OPERID,fw.get(FairWithdraw.ID));
+                    ml.set(MoneyLog.STATE, MoneyLog.STATE_REDUCE);
+                    ml.set(MoneyLog.TYPE,MoneyLog.TYPE_TIXIAN);
+                    ml.set(MoneyLog.MONEY,tixian);
+                    ml.set(MoneyLog.DESCRIPTION,"用户提现,金额:"+tixian);
+                    ml.save();
+                    return R.ok();
+                }else {
+                    return R.fail("提现失败");
+                }
+            }else{
+                return R.fail("提现失败");
+            }
+
+        }else {
+            return R.fail("token不正确");
+        }
+
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java
index fda2367..e8c7886 100644
--- a/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishController.java
@@ -1,7 +1,10 @@
 package com.tianpengtech.front.mobile.publisher;
 
 import com.jfinal.kit.StrKit;
+import com.tianpengtech.admin.dictionary.DictionaryDao;
+import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.mobile.common.util.UserUtil;
 import com.tianpengtech.front.web.common.controller.BaseController;
 
 /**
@@ -10,7 +13,7 @@ import com.tianpengtech.front.web.common.controller.BaseController;
 public class MobilePublishController extends BaseController {
 
     private static MobilePublishService service = MobilePublishService.me;
-
+    private DictionaryDao dictionaryDao = new DictionaryDao();
     /**
      * 获取商家信息
      */
@@ -56,4 +59,36 @@ public class MobilePublishController extends BaseController {
         renderJson(r);
     }
 
+    /**
+     * 获取举报信息
+     */
+    public void getReportInfo(){
+        R r = R.ok();
+        r.p("reports",dictionaryDao.readParents(200100));
+        renderJson(r);
+    }
+
+    /**
+     * 保存举报信息
+     */
+    public void saveReport(){
+        String content = getPara("content");
+        String contentId = getPara("contentId");
+        String userId = getPara("userId");
+        User user= UserUtil.getCurrentUser(getPara("token"),getHeader("source"));
+        long uid=user.getLong(User.ID);
+        if (StrKit.isBlank(content) && StrKit.isBlank(contentId)){
+            renderJson(R.fail("请输入举报原因"));
+            return;
+        }
+        if (StrKit.isBlank(userId)){
+            renderJson(R.fail("请输入被举报人信息"));
+            return;
+        }
+        R r=service.saveReport(contentId,content,uid,userId);
+        renderJson(r);
+    }
+
+
+
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java
index 20a46e6..ffe8b72 100644
--- a/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/publisher/MobilePublishService.java
@@ -1,13 +1,16 @@
 package com.tianpengtech.front.mobile.publisher;
 
+import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.Page;
 import com.tianpengtech.common.model.authenticate.Authenticate;
 import com.tianpengtech.common.model.fair.Fair;
 import com.tianpengtech.common.model.fairmessage.FairMessage;
+import com.tianpengtech.common.model.fairreport.FairReport;
 import com.tianpengtech.common.model.task.Task;
 import com.tianpengtech.common.model.task.TaskWh;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.util.R;
+import com.tianpengtech.front.web.passport.PassportService;
 
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
@@ -20,6 +23,7 @@ public class MobilePublishService {
     public static MobilePublishService me = new MobilePublishService();
     private static Authenticate authDao =  Authenticate.dao;
     private static Task taskDao =  Task.dao;
+    private static PassportService ps = PassportService.me;
     /**
      * 获取商家详情信息
      * @param id
@@ -88,4 +92,32 @@ public class MobilePublishService {
     }
 
 
+    /**
+     * 保存举报信息
+     * @param contentId 数据字典code
+     * @param content 其他:举报信息
+     * @param uid 举报人ID
+     * @param userId 被举报人ID
+     * @return
+     */
+    public R saveReport(String contentId,String content,long uid,String userId){
+        if (!ps.isUserIdExists(userId,User.USER_TYPE_PROV)){
+            return R.fail("被举报人不存在");
+        }
+        FairReport fr = new FairReport();
+        fr.set(FairReport.FAIR_ID,uid);
+        fr.set(FairReport.USER_ID,userId);
+        if (StrKit.isBlank(contentId)){
+            fr.set(FairReport.CONTENT,content);
+        }else{
+            fr.set(FairReport.CONTENT_ID,contentId);
+        }
+        if (fr.save()){
+            return R.ok();
+        }else{
+            return R.fail("保存失败");
+        }
+    }
+
+
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
index 635e7e2..9b3ad1b 100644
--- a/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/task/MobileTaskService.java
@@ -96,7 +96,9 @@ public class MobileTaskService {
             t.put("dateString",t.getDateString());
         }
         R r = R.ok();
-        r.p("task",page);
+        r.p("count",page.getTotalRow());
+        r.p("pageNum",page.getPageNumber());
+        r.p("list",page.getList());
         return r;
     }
 
diff --git a/src/main/java/com/tianpengtech/front/web/fair/FairService.java b/src/main/java/com/tianpengtech/front/web/fair/FairService.java
index 279b59d..1894f9f 100644
--- a/src/main/java/com/tianpengtech/front/web/fair/FairService.java
+++ b/src/main/java/com/tianpengtech/front/web/fair/FairService.java
@@ -115,6 +115,16 @@ public class FairService {
         return fairs;
     }
 
+    /**
+     * 根据任务ID获取相关所有网红信息
+     * @param taskId
+     * @return
+     */
+    public List<Fair> findByTaskJob(String taskId){
+        List<Fair> fairs=fairDao.find("select fair.* from "+ TaskWh.dao.tableName()+" tw left join "+Fair.dao.tableName()+" fair on fair."+Fair.ID+"=tw."+TaskWh.WH_ID+" where tw."+TaskWh.DELETETAG+"=0 and "+TaskWh.TASK_ID +"=?",taskId);
+        return fairs;
+    }
+
     /**
      * 根据任务ID获取白名单的网红信息
      * @param taskId
diff --git a/src/main/java/com/tianpengtech/front/web/job/TaskJob.java b/src/main/java/com/tianpengtech/front/web/job/TaskJob.java
index b9b38ba..a0c3533 100644
--- a/src/main/java/com/tianpengtech/front/web/job/TaskJob.java
+++ b/src/main/java/com/tianpengtech/front/web/job/TaskJob.java
@@ -1,6 +1,8 @@
 package com.tianpengtech.front.web.job;
 
+import com.jfinal.aop.Duang;
 import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.tx.Tx;
 import com.tianpengtech.common.model.task.Task;
 import com.tianpengtech.front.web.task.TaskService;
 import org.quartz.Job;
@@ -10,17 +12,13 @@ import org.quartz.JobExecutionException;
 import java.util.List;
 
 /**
- * Created by Administrator on 2017/6/21 0021.
+ * Created by ggd on 2017/6/21 0021.
  */
 public class TaskJob implements Job {
 
-    private static TaskService taskService = new TaskService();
+    private static TaskService taskService = Duang.duang(TaskService.class,Tx.class);
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        List<Task> tasks = taskService.findStopTask();
-        for (Task task: tasks) {
-            task.set(Task.STATUS,Task.STATUS_COMPLETED);
-            task.update();
-        }
+        taskService.taskJob();
     }
 }
diff --git a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
index 65a1d2f..85968f7 100644
--- a/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
+++ b/src/main/java/com/tianpengtech/front/web/passport/PassportService.java
@@ -37,6 +37,20 @@ public class PassportService {
     }
 
 
+    /**
+     * 验证用户ID是否存在
+     */
+    public boolean isUserIdExists(String id,Integer user_type){
+        String sql =String.format("select * from %s where %s = ? and %s = ? and %s=?",new User().tableName(),User.ID,User.DELETETAG,User.USER_TYPE);
+        User user=userDao.findFirst(sql,id,User.DELETE_STATUS_NO,user_type);
+        if (null == user){
+            return false;
+        }else{
+            return true;
+        }
+    }
+
+
     /**
      * 账户注册,hashedPass = sha256(32字符salt + pass)
      */
diff --git a/src/main/java/com/tianpengtech/front/web/task/TaskService.java b/src/main/java/com/tianpengtech/front/web/task/TaskService.java
index 4572d68..dcfda6c 100644
--- a/src/main/java/com/tianpengtech/front/web/task/TaskService.java
+++ b/src/main/java/com/tianpengtech/front/web/task/TaskService.java
@@ -7,6 +7,7 @@ import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Page;
 import com.jfinal.plugin.activerecord.Record;
 import com.jfinal.plugin.ehcache.CacheKit;
+import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
 import com.tianpengtech.admin.dictionary.DictionaryDao;
 import com.tianpengtech.common.exception.ValidateException;
 import com.tianpengtech.common.im.kit.PushKit;
@@ -15,6 +16,7 @@ import com.tianpengtech.common.ip.IpUtil;
 import com.tianpengtech.common.model.authenticate.Authenticate;
 import com.tianpengtech.common.model.dictionary.Dictionary;
 import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.moneylog.MoneyLog;
 import com.tianpengtech.common.model.task.*;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.common.search.EqualCondition;
@@ -368,7 +370,7 @@ public class TaskService {
      * @return
      */
     public List<Task> findStopTask(){
-        String sql = "select "+Task.ID+" from "+taskDao.tableName() + " where to_days("+Task.TASK_END_TIME+")<=to_days(now())-1 and "+Task.STATUS +"!="+Task.STATUS_COMPLETED;
+        String sql = "select "+Task.ID+","+Task.TASK_PRICE+","+Task.TASK_TITLE+" from "+taskDao.tableName() + " where to_days("+Task.TASK_END_TIME+")<=to_days(now())-1 and "+Task.STATUS +"!="+Task.STATUS_COMPLETED;
         return taskDao.find(sql);
     }
 
@@ -418,4 +420,35 @@ public class TaskService {
             ts.update();
         });
     }
+
+
+    /**
+     * 定时任务,定时关闭任务
+     */
+    public void taskJob(){
+        List<Task> tasks = findStopTask();
+        for (Task task: tasks) {
+            task.set(Task.STATUS,Task.STATUS_COMPLETED);
+            final Float price=task.getFloat(Task.TASK_PRICE);
+            List<Fair> fairs=fairService.findByTaskJob(task.getLong(Task.ID)+"");
+            for (Fair f:fairs) {
+                Double d = f.get(Fair.MONEY);
+                if (d==null){
+                    d=0D;
+                }
+                double sum=d.doubleValue()+price.doubleValue();
+                f.set(Fair.MONEY,sum);
+                f.update();
+                MoneyLog ml = new MoneyLog();
+                ml.set(MoneyLog.WH_ID,f.get(Fair.ID));
+                ml.set(MoneyLog.OPERID,task.getLong(Task.ID));
+                ml.set(MoneyLog.STATE, MoneyLog.STATE_ADD);
+                ml.set(MoneyLog.TYPE,MoneyLog.TYPE_RENWU);
+                ml.set(MoneyLog.MONEY,price.doubleValue());
+                ml.set(MoneyLog.DESCRIPTION,"任务完成:"+task.getStr(Task.TASK_TITLE));
+                ml.save();
+            }
+            task.update();
+        }
+    }
 }
diff --git a/src/main/resources/sms.properties b/src/main/resources/sms.properties
index 593b0a2..3ba27d5 100644
--- a/src/main/resources/sms.properties
+++ b/src/main/resources/sms.properties
@@ -1,5 +1,9 @@
-url = http://183.129.129.134:8081/api/template/sms/send
-userid = 10003
-apikey = d73376b0b813442a91c0337556e8d8b1
-templateid = 16
-isSend = false
\ No newline at end of file
+#url = http://183.129.129.134:8081/api/template/sms/send
+#userid = 10003
+#apikey = d73376b0b813442a91c0337556e8d8b1
+#templateid = 16
+isSend = false
+accessKeyId = LTAIYOrnhcUCJnPJ
+accessKeySecret = GcOxh9LGvb44StevmhPKV7I6elKV0d
+signName = \u516c\u56fd\u680b
+templateCode = SMS_82105038
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar b/src/main/webapp/WEB-INF/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar
new file mode 100644
index 0000000000000000000000000000000000000000..de67807096cb8526e74b155889e20c9e8773c588
GIT binary patch
literal 17951
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
DHylw<

literal 0
HcmV?d00001

-- 
Gitee


From 193d8cf24add0898fb009c78dba3cb641ee530a1 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Sat, 5 Aug 2017 19:56:31 +0800
Subject: [PATCH 11/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=91=E7=9F=AD?=
 =?UTF-8?q?=E4=BF=A1=20jar?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/pom.xml b/pom.xml
index 4c946f3..243d70a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -253,6 +253,14 @@
 			<artifactId>aliyun-java-sdk-core</artifactId>
 			<version>3.2.6</version>
 		</dependency>
+		<dependency>
+			<groupId>com.aliyun</groupId>
+			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+			<version>1.0.0-SANPSHOT</version>
+			<scope>system</scope>
+			<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar</systemPath>
+		</dependency>
+
 	</dependencies>
 	<build>
 		<finalName>fair</finalName>
-- 
Gitee


From 654d94dd58fae1f5b10b522156c444cd4fd27672 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Sun, 6 Aug 2017 16:10:43 +0800
Subject: [PATCH 12/13] =?UTF-8?q?=E9=82=80=E8=AF=B7=E6=B3=A8=E5=86=8CAPI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../tianpengtech/common/model/user/User.java  |   2 +
 .../mobile/login/MobileLoginController.java   |  59 +++++++++-
 .../mobile/login/MobileLoginService.java      | 106 +++++++++++++++++-
 .../front/web/login/LoginService.java         |  13 +++
 .../assets/front/web/script/register.js       |   4 +-
 5 files changed, 178 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/tianpengtech/common/model/user/User.java b/src/main/java/com/tianpengtech/common/model/user/User.java
index b1cd3e1..910882e 100644
--- a/src/main/java/com/tianpengtech/common/model/user/User.java
+++ b/src/main/java/com/tianpengtech/common/model/user/User.java
@@ -27,6 +27,8 @@ public class User extends AbstractBaseModel< User > {
 	public static final String PHOTO ="photo"; //用户头像
 	public static final String CREATE_TIME ="create_time"; //创建时间
 	public static final String USER_TYPE ="user_type"; //用户类型
+	public static final String CODE ="code"; //邀请码
+	public static final String REF_ID ="ref_id"; //邀请人
 
 	public static final int DELETE_STATUS_YES=1;
 	public static final int DELETE_STATUS_NO=0;
diff --git a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginController.java b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginController.java
index f7ca2c4..4ac62cd 100644
--- a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginController.java
+++ b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginController.java
@@ -1,9 +1,12 @@
 package com.tianpengtech.front.mobile.login;
 
+import com.jfinal.aop.Before;
 import com.jfinal.aop.Clear;
 import com.jfinal.kit.Ret;
 import com.jfinal.kit.StrKit;
+import com.jfinal.plugin.activerecord.tx.Tx;
 import com.tianpengtech.common.util.IpKit;
+import com.tianpengtech.front.mobile.common.intercepter.MobileRequestInterceptor;
 import com.tianpengtech.front.mobile.common.intercepter.TokenCheckInterceptor;
 import com.tianpengtech.front.mobile.common.util.R;
 import com.tianpengtech.front.mobile.common.util.U;
@@ -22,6 +25,7 @@ public class MobileLoginController extends BaseController {
      * 登录
      */
     @Clear(TokenCheckInterceptor.class)
+    @Before(Tx.class)
     public void login(){
         String mobile=getPara("mobile");
         String code= getPara("authCode");
@@ -34,7 +38,14 @@ public class MobileLoginController extends BaseController {
             return;
         }
         String loginIp = IpKit.getRealIp(getRequest());
-        R r = service.login(mobile,Integer.parseInt(code),loginIp,getHeader("source"));
+        R r = null;
+        try {
+            r = service.login(mobile,Integer.parseInt(code),loginIp,getHeader("source"));
+        } catch (Exception e) {
+            e.printStackTrace();
+            renderJson(R.fail("注册失败"));
+            return;
+        }
         renderJson(r);
     }
 
@@ -71,4 +82,50 @@ public class MobileLoginController extends BaseController {
         R r=service.logout(token);
         renderJson(r);
     }
+
+
+    /**
+     * 邀请注册链接 跳转页面
+     */
+    @Clear({TokenCheckInterceptor.class,MobileRequestInterceptor.class})
+    public void invite(){
+        String code=getPara("code");
+        setAttr("code",code);
+        render("/WEB-INF/view/web/index/invite.html");
+    }
+
+    /**
+     * 邀请注册 同所有api接口
+     */
+    @Clear({TokenCheckInterceptor.class})
+    public void inviteReg(){
+        String code=getPara("code");
+        String mobile=getPara("mobile");
+        String authCode=getPara("authCode");
+        if (StrKit.isBlank(code)){
+            renderJson(R.fail("邀请码不能为空"));
+            return;
+        }
+        if (StrKit.isBlank(mobile)){
+            renderJson(R.fail("手机号码不能为空"));
+            return;
+        }
+        if (StrKit.isBlank(authCode)){
+            renderJson(R.fail("验证码不能为空"));
+            return;
+        }
+        if (!U.isInteger(authCode)){
+            renderJson(R.fail("验证码格式不正确"));
+            return;
+        }
+        String regIp = IpKit.getRealIp(getRequest());
+        try {
+            R r=service.inviteReg(code,mobile,Integer.parseInt(authCode),regIp);
+            renderJson(r);
+        } catch (Exception e) {
+            e.printStackTrace();
+            renderJson(R.fail("注册失败"));
+            return;
+        }
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
index e76dd71..069eec1 100644
--- a/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
+++ b/src/main/java/com/tianpengtech/front/mobile/login/MobileLoginService.java
@@ -2,7 +2,11 @@ package com.tianpengtech.front.mobile.login;
 
 
 import com.jfinal.kit.Ret;
+import com.tianpengtech.admin.dictionary.DictionaryDao;
+import com.tianpengtech.common.model.dictionary.Dictionary;
 import com.tianpengtech.common.model.fair.Fair;
+import com.tianpengtech.common.model.moneylog.MoneyLog;
+import com.tianpengtech.common.model.task.Task;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.front.mobile.common.constant.Constant;
 import com.tianpengtech.front.mobile.common.util.R;
@@ -11,6 +15,8 @@ import com.tianpengtech.front.mobile.common.util.UserUtil;
 import com.tianpengtech.front.web.login.LoginService;
 import com.tianpengtech.front.web.passport.PassportService;
 
+import java.util.UUID;
+
 
 /**
  * Created by ggd on 2017/7/17 0017.
@@ -21,6 +27,7 @@ public class MobileLoginService {
     private final LoginService loginService = LoginService.me;
     private final PassportService passportService = PassportService.me;
     private final User userDao = new User().dao();
+    private DictionaryDao dictionaryDao = new DictionaryDao();
     //用户密码错误次数 缓存key
     public static final String ERRORCOUNT_KEY = "error_count_";
 
@@ -34,9 +41,14 @@ public class MobileLoginService {
     /**
      * 登录
      */
-    public R login(String mobile, int code, String loginIp,String source) {
+    public R login(String mobile, int code, String loginIp,String source) throws Exception {
         try{
-            if(!passportService.authCode(mobile,loginIp,code,true)){
+            try {
+                if(!passportService.authCode(mobile,loginIp,code,true)){
+                    return R.fail("验证码不正确");
+                }
+            }catch (Exception e){
+                e.printStackTrace();
                 return R.fail("验证码不正确");
             }
             User user = loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
@@ -48,6 +60,8 @@ public class MobileLoginService {
                     fair.set(Fair.ID,id);
                     fair.save();
                     user=loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
+                    user.set(User.CODE,getCode());
+                    user.update();
                 }else{
                     return R.fail("注册失败");
                 }
@@ -65,8 +79,7 @@ public class MobileLoginService {
             r.p("token",token);
             return r;
         }catch (Exception e){
-            e.printStackTrace();
-            return R.fail("登陆失败");
+            throw e;
         }
 
     }
@@ -81,4 +94,89 @@ public class MobileLoginService {
         return R.ok("退出成功");
     }
 
+
+    /**
+     * 邀请注册
+     * @return
+     */
+    public R inviteReg(String code,String mobile,int authCode,String regIp) throws Exception{
+        try{
+            try {
+                if(!passportService.authCode(mobile,regIp,authCode,true)){
+                    return R.fail("验证码不正确");
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+                return R.fail("验证码不正确");
+            }
+            User user = loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
+            if (user == null) {
+                Ret r=passportService.reg(mobile, Constant.DEFAULT_PASSWORD,User.USER_TYPE_FAIR);
+                if (r.isOk()){
+                    long id= (long) r.get("id");
+                    Fair fair = new Fair();
+                    fair.set(Fair.ID,id);
+                    fair.save();
+                    user=loginService.findByMobile(mobile,User.USER_TYPE_FAIR);
+                    User ref=loginService.findByCode(code,User.USER_TYPE_FAIR);
+                    if (ref==null){
+                        return R.fail("邀请码不存在");
+                    }
+                    user.set(User.REF_ID,ref.get(User.ID));
+                    user.set(User.CODE,getCode());
+                    user.update();
+                    Dictionary dict = dictionaryDao.readDirecotryByCode(300100);
+                    String val=null;
+                    if (dict==null){
+                        val="5";
+                    }else{
+                        val = dict.get(Dictionary.NAME,5);
+                    }
+                    MoneyLog ml = new MoneyLog();
+                    ml.set(MoneyLog.WH_ID,ref.get(User.ID));
+                    ml.set(MoneyLog.OPERID,user.get(User.ID));
+                    ml.set(MoneyLog.STATE, MoneyLog.STATE_ADD);
+                    ml.set(MoneyLog.TYPE,MoneyLog.TYPE_RENWU);
+                    ml.set(MoneyLog.MONEY,val);
+                    ml.set(MoneyLog.DESCRIPTION,"邀请好友获得奖励");
+                    ml.save();
+                }else{
+                    return R.fail("注册失败");
+                }
+            }else{
+                return R.fail("账号已存在");
+            }
+            return R.ok();
+        }catch (Exception e){
+            throw e;
+        }
+    }
+
+
+    /**
+     * 生成邀请码
+     * @return
+     */
+    private String getCode(){
+        return generateShortUuid();
+    }
+
+    private  String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
+            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
+            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
+            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
+            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
+            "W", "X", "Y", "Z" };
+
+
+    private  String generateShortUuid() {
+        StringBuffer shortBuffer = new StringBuffer();
+        String uuid = UUID.randomUUID().toString().replace("-", "");
+        for (int i = 0; i < 8; i++) {
+            String str = uuid.substring(i * 4, i * 4 + 4);
+            int x = Integer.parseInt(str, 16);
+            shortBuffer.append(chars[x % 0x3E]);
+        }
+        return shortBuffer.toString();
+    }
 }
diff --git a/src/main/java/com/tianpengtech/front/web/login/LoginService.java b/src/main/java/com/tianpengtech/front/web/login/LoginService.java
index a05237c..e405e9f 100644
--- a/src/main/java/com/tianpengtech/front/web/login/LoginService.java
+++ b/src/main/java/com/tianpengtech/front/web/login/LoginService.java
@@ -208,4 +208,17 @@ public class LoginService {
 		}
 	}
 
+	/**
+	 * 根据邀请码查询 用户信息
+	 */
+	public User findByCode(String code,Integer user_type){
+		String sql =String.format("select * from %s where %s = ? and %s = ? and %s=?",new User().tableName(),User.CODE,User.DELETETAG,User.USER_TYPE);
+		User user=userDao.findFirst(sql,code,User.DELETE_STATUS_NO,user_type);
+		if (null == user){
+			return null;
+		}else{
+			return user;
+		}
+	}
+
 }
diff --git a/src/main/webapp/assets/front/web/script/register.js b/src/main/webapp/assets/front/web/script/register.js
index 1de4216..9e885ad 100644
--- a/src/main/webapp/assets/front/web/script/register.js
+++ b/src/main/webapp/assets/front/web/script/register.js
@@ -70,7 +70,9 @@ var sendSms=function(){
         dataType:"json",
         success:function(data){
             if (data.isOk){
-                $("input[name='authCode']").val(data.code);
+                if (data.code){
+                    $("input[name='authCode']").val(data.code);
+                }
             }else{
                 layer.msg(data.msg);
             }
-- 
Gitee


From 4883c2a4a9cabfafd0991fd90e016af660d2d8e7 Mon Sep 17 00:00:00 2001
From: "994856170@qq.com" <ggd1994>
Date: Sun, 6 Aug 2017 16:16:07 +0800
Subject: [PATCH 13/13] =?UTF-8?q?=E5=90=AF=E7=94=A8=E6=95=B0=E6=8D=AE?=
 =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=8B=A6=E6=88=AA=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/tianpengtech/front/mobile/MobileRoutes.java   |  2 +-
 .../common/intercepter/MobileRequestInterceptor.java  | 11 +++--------
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
index 062a35c..9923a1f 100644
--- a/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
+++ b/src/main/java/com/tianpengtech/front/mobile/MobileRoutes.java
@@ -21,7 +21,7 @@ public class MobileRoutes extends Routes {
 
     @Override
     public void config() {
-//        addInterceptor(new MobileRequestInterceptor()); //验证请求数据有效性
+        addInterceptor(new MobileRequestInterceptor()); //验证请求数据有效性
         addInterceptor(new TokenCheckInterceptor()); //验证登录用户token是否有效
 
         add("/api",MobileLoginController.class);
diff --git a/src/main/java/com/tianpengtech/front/mobile/common/intercepter/MobileRequestInterceptor.java b/src/main/java/com/tianpengtech/front/mobile/common/intercepter/MobileRequestInterceptor.java
index a2b8af9..1074723 100644
--- a/src/main/java/com/tianpengtech/front/mobile/common/intercepter/MobileRequestInterceptor.java
+++ b/src/main/java/com/tianpengtech/front/mobile/common/intercepter/MobileRequestInterceptor.java
@@ -9,6 +9,7 @@ import com.jfinal.kit.StrKit;
 import com.tianpengtech.common.model.user.User;
 import com.tianpengtech.common.util.IpKit;
 import com.tianpengtech.front.mobile.common.constant.ConstantApi;
+import com.tianpengtech.front.mobile.common.util.R;
 import com.tianpengtech.front.mobile.common.util.ToolMD5;
 import com.tianpengtech.front.web.login.LoginService;
 
@@ -39,16 +40,10 @@ public class MobileRequestInterceptor implements Interceptor {
             if (sct.equals(encode)){
                 inv.invoke();
             }else{
-                Map<String,String> result = new HashMap<>();
-                result.put("code", ConstantApi.RESULT_ERROR);
-                result.put("message","数据无效");
-                c.renderText(JSON.toJSONString(result));
+                c.renderJson(R.fail("数据无效"));
             }
         }else{
-            Map<String,String> result = new HashMap<>();
-            result.put("code", ConstantApi.RESULT_ERROR);
-            result.put("message","数据无效");
-            c.renderText(JSON.toJSONString(result));
+            c.renderJson(R.fail("数据无效"));
         }
     }
 }
-- 
Gitee